diff -Nrc3pad gcc-3.0.4/gcc/cp/ChangeLog gcc-3.1/gcc/cp/ChangeLog *** gcc-3.0.4/gcc/cp/ChangeLog Wed Feb 20 18:41:15 2002 --- gcc-3.1/gcc/cp/ChangeLog Wed May 15 02:19:33 2002 *************** *** 1,155 **** ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2002-02-17 Kaveh R. Ghazi ! * decl.c (start_method): Fix error in 2002-01-10 change. ! 2002-02-13 Richard Smith ! * decl.c (maybe_build_cleanup): Do not destroy thunk parameters. 2002-01-31 Jason Merrill PR c++/3395 ! * semantics.c (finish_class_definition): Clear out TREE_TYPE for ! all variants. 2002-01-23 Jason Merrill PR c++/3331 * init.c (resolve_offset_ref): Use build_indirect_ref. 2002-01-10 Ira Ruben PR c++/907 * decl.c (start_method): Handle attrlist. 2002-01-07 Jason Merrill PR c++/3536 * method.c (make_thunk): If !flag_weak, give the thunk the function's linkage. (use_thunk): Here, too. ! 2001-12-21 Jason Merrill PR c++/4122 * class.c (update_vtable_entry_for_fn): Set delta to zero for a lost primary. 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. ! * optimize.c (maybe_clone_body): Fix parameter updating. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. 2001-12-12 Jason Merrill * semantics.c (setup_vtbl_ptr): Always build a CTOR_INITIALIZER if we're in a template. 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-05 Jason Merrill * pt.c (push_tinst_level): No longer static. ! * cp-tree.h: Declare it. ! * optimize.c (expand_call_inline): Record template instantiation ! context. * rtti.c (create_pseudo_type_info): Set CLASSTYPE_INTERFACE_ONLY on the __*_type_info type if we haven't seen a definition. 2001-12-03 Hans-Peter Nilsson * decl.c (xref_basetypes): Don't use C99 construct in tag_code declaration and initialization. ! 2001-12-03 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-12-03 Mumit Khan PR c++/3394 ! * decl.c (xref_basetypes): Handle attributes between 'class' and name. 2001-12-03 Jason Merrill * class.c (finish_vtbls): Fill in BINFO_VPTR_FIELD in the immediate binfos for our virtual bases. 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. 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. PR c++/3471 * call.c (convert_like_real): Do not build additional temporaries for rvalues of class type. ! 2001-11-20 Mark Mitchell PR c++/3637 * 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 Mark Mitchell ! * cp/decl2.c (grok_alignof): Make sure that expression created while processing a template do not have a type. ! * cp/typeck.c (c_sizeof): Likewise. (expr_sizeof): Likewise. ! (c_alignof): Likewise. 2001-11-14 Joseph S. Myers * Make-lang.in: Change all uses of $(manext) to $(man1ext). ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. 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-09-28 Craig Rodrigues ! PR c++/4095 ! * rtti.c (create_pseudo_type_info): Fix parameter. 2001-09-21 Richard Henderson --- 1,2156 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-03 Jason Merrill ! * decl.c (BOOL_TYPE_SIZE): Move default to defaults.h. ! 2002-05-02 Mark Mitchell ! * init.c (perform_base_cleanups): Correct order of base class ! cleanups. ! ! 2002-05-01 Mark Mitchell ! ! PR c++/6527 ! * init.c (perform_base_cleanups): Emit cleanups in reverse order ! of construction. ! ! 2002-05-01 Gabriel Dos Reis ! ! * error.c (dump_type): Be careful about implicit typenames. ! ! 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 ! ! * 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 Mark Mitchell ! ! PR c++/6479 ! * method.c (do_build_assign_ref): Pass a derivation to ! build_method_call when calling base class assignment operators. ! ! 2002-04-24 Mark Mitchell ! ! * mangle.c (write_type): Don't use TYPE_MAIN_VARIANT when writing ! out an array type. ! (write_CV_qualifiers_for_type): Use TYPE_QUALS, not cp_type_quals, ! to determine qualifiers. ! ! * cvt.c (convert_to_void): Don't unconditionally make COND_EXPRs ! void. ! ! 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 Jason Merrill ! ! PR c++/5504 - but re-breaks c++/411 ! * init.c (push_base_cleanups): Rename to perform_base_cleanups. ! Expand base cleanups now rather than pushing them. ! * decl.c (begin_destructor_body): Don't call push_base_cleanups. ! (finish_destructor_body): Call perform_base_cleanups. ! * cp-tree.h: Adjust prototype. ! ! 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-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-14 Jakub Jelinek ! ! * class.c (layout_virtual_bases): Do all dsize computation on trees. ! ! 2002-04-12 Mark Mitchell ! ! PR c++/5373. ! * semantics.c (finish_expr_stmt): Remember the type of the ! expression before any conversions are performed. ! ! PR c++/5189. ! * call.c (add_template_candidate_real): Do not treat member ! templates as copy constructors. ! ! * 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-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-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-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. ! ! 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++/6179 ! * method.c (implicitly_declare_fn): Pass unqualified type to ! synthesize_exception_spec. ! ! 2002-04-03 Jason Merrill ! ! PR c++/525 ! * init.c (build_member_call): Convert to intermediate base even ! with -pedantic. ! ! 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 Roger Sayle ! ! PR c++/5998: ! * decl.c (duplicate_decls): Don't mess with assembler names when ! redeclaring builtin functions as static. ! ! 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-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 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 Mark Mitchell ! ! PR c++/4884 ! * call.c (build_op_delete_call): Allow for the fact the placement ! 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 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-25 Jakub Jelinek ! ! PR c++/6037 ! * decl.c (start_enum): Don't set TREE_ADDRESSABLE on TREE_LIST node. ! ! 2002-03-22 Jeff Knaggs ! ! * typeck.c (expand_ptrmemfunc_cst): 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-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-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 Ashif Harji ! ! * lang-specs.h (compiler default_compilers): Add ! -no-integrated-cpp flag to invoke an external cpp. ! ! 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. ! ! PR c++/5757 ! * init.c (build_new_1): Pass the right pointer to op delete. ! ! 2002-03-15 Richard Henderson ! ! * init.c (build_new_1): Use size_binop instead of cp_build_binary_op. ! ! 2002-03-15 Richard Henderson ! ! * decl.c (finish_function): Reapply accidentally reverted ! 2002-02-28 patch. ! ! 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 Richard Henderson ! ! * decl.c: Include c-pragma.h. ! (start_decl, start_function): Invoke maybe_apply_pragma_weak. ! * Make-lang.in: Update dependencies. ! ! 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 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 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-08 Craig Rodrigues ! ! * cp-tree.h (CLEAR_BINFO_MARKED): Make both parts of ! conditional return void. ! ! 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 (build_init): Remove prototype. ! ! 2002-03-01 Phil Edwards ! ! * cp-tree.h: Require __GNUC__ to be #defined. ! (build_init): Add missing prototype. ! ! 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-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 alowing bad qualifications ! on template type parms. ! (instantiate_decl): Recheck substitutions to give warnings on bad ! qualifications. ! * tree.c (cp_build_qualified_type_real): Use tf_allow_bad_quals. ! ! 2002-02-21 Aldy Hernandez ! ! * cp/decl.c (duplicate_decls): Merge always_inline attribute. ! ! * cp/tree.c (cp_cannot_inline_tree_fn): Do not inline at -O0 ! unless DECL_ALWAYS_INLINE. ! ! 2002-02-20 Jakub Jelinek ! ! * typeck.c (cp_pointer_int_sum): Renamed from ! pointer_int_sum, call pointer_int_sum. ! ! 2002-02-20 Jakub Jelinek ! ! * decl.c (duplicate_decls): Return 0 if issued error about ! redeclaration. ! ! 2002-02-19 Jason Merrill ! ! ABI change: Mangle `void (A::*)() const' as ! M1AKFvvE, not MK1AFvvE. ! * mangle.c (write_function_type): Write cv-quals for member ! function type here. ! (write_pointer_to_member_type): Not here. ! ! 2002-02-18 Jason Merrill ! ! * pt.c (do_type_instantiation): Don't pedwarn if in_system_header. ! (do_decl_instantiation): Likewise. ! ! 2002-02-17 Craig Rodrigues ! ! PR c++/5685 ! * decl.c (duplicate_decls): Make warning unconditional ! if duplicate default argument declarations are present. ! ! 2002-02-17 Jakub Jelinek ! ! * typeck.c (build_binary_op) [BIT_XOR_EXPR]: Remove explicit ! shortening. ! ! 2002-02-15 Nathan Sidwell ! ! * decl.c (grokdeclarator): Set typedef_decl for all TYPE_DECLs, ! remove incorrect comment. Move #if 0'd code to common path. Use ! IMPLICIT_TYPENAME_P. Simplify & reformat ARRAY_TYPE duplication. ! ! 2002-02-13 Jason Merrill ! ! * decl.c (builtin_function): Set TREE_THIS_VOLATILE on return fns. ! (finish_function): Don't warn if current_function_returns_null. ! ! * typeck2.c (digest_init): Do handle values of vector type. ! ! * typeck2.c (digest_init, process_init_constructor): Treat vectors ! like arrays. ! ! 2002-02-11 Jason Merrill ! ! * parse.y (reserved_declspecs): Don't handle attributes. ! (reserved_typespecquals): Handle them here. ! * Make-lang.in (parse.c): Adjust expected conflicts. ! ! 2002-02-08 Jakub Jelinek ! ! * parse.y (primary, primary_no_id): Use compstmt_or_stmtexpr ! instead of compstmt. ! (compstmt_or_stmtexpr): Renamed from compstmt. ! (compstmt): In addition to compstmt_or_stmtexpr clear last_expr_type. ! ! 2002-02-07 Nathan Sidwell ! ! Rename instantiate_type_flags to tsubst_flags_t & expand use. ! * cp-tree.h (instantiate_type_flags): Rename to ... ! (tsubst_flags_t): ... here. Rename itf_complain to tf_error, ! add tf_warning flag. ! (instantiate_type): Adjust prototype. ! (tsubst, tsubst_expr, tsubst_copy, lookup_template_class, ! do_type_instantiation, cp_build_qualified_type_real): Likewise. ! cp_build_qualified_type: Adjust. ! * class.c (instantiate_type): Adjust parameter. Rename itf_* to ! tf_*. ! * call.c (standard_conversion): Rename itf_* to tf_*. ! (reference_binding): Likewise. ! (convert_like_real): Likewise. ! * cvt.c (cp_convert_to_pointer): Likewise. ! (convert_to_reference): Likewise. ! * decl.c (lookup_namespace_name): Use tf_* flags. ! (make_typename_type): Likewise. ! (grokdeclarator): Likewise. ! * pt.c (convert_nontype_argument): Adjust COMPLAIN usage. ! (coerce_template_template_parms, convert_template_argument, ! coerce_template_parms, maybe_get_template_decl_from_type_decl, ! lookup_template_class, tsubst_friend_function, tsubst_friend_class, ! instantiate_class_template, tsubst_template_arg_vector, ! tsubst_template_parms, tsubst_aggr_type, tsubst_default_argument, ! tsubst_decl, tsubst_arg_types, tsubst_function_type, ! tsubst_call_declarator_parms, tsubst, tsubst_copy, tsubst_expr, ! instantiate_template, fn_type_unification, ! resolve_overloaded_unification, verify_class_unification, ! unify, get_bindings_real, do_type_instantiation, ! regenerate_decl_from_template, instantiate_decl, ! tsubst_initializer_list, tsubst_enum, ! get_mostly_instantiated_function_type, ! invalid_nontype_parm_type_p): Likewise. ! * tree.c (cp_build_qualified_type_real): Likewise. ! * typeck.c (build_binary_op): Rename itf_* to tf_*. ! (build_ptrmemfunc): Likewise. ! (convert_for_assignment): Likewise. ! ! 2002-02-07 Nathan Sidwell ! ! PR c++/109 ! * decl.c (grokdeclarator): Allow friend declarations from ! dependent types. ! * decl2.c (handle_class_head): Don't push into template parm contexts. ! * pt.c (push_template_decl_real): Template parm contexts are never ! being defined. ! ! 2002-02-05 Alexandre Oliva ! ! * class.c: Include target.h. ! (check_bitfield_decl): Disregard EMPTY_FIELD_BOUNDARY, ! BITFIELDS_NBYTES_LIMITED and PCC_BITFIELD_TYPE_MATTERS for MS ! bit-field layout. ! * Make-lang.in: Adjust deps. ! ! 2002-02-05 Jason Merrill ! ! * error.c (dump_type): Be more helpful about VECTOR_TYPE. ! ! 2002-02-04 Jakub Jelinek ! ! * semantics.c (begin_switch_stmt): Clear SWITCH_TYPE. ! (finish_switch_cond): Set SWITCH_TYPE. ! ! 2002-02-04 Richard Henderson ! ! * method.c (use_thunk): Always initialize the block tree. Reindent. ! * semantics.c (expand_body): Emit thunks after function, not before. ! ! 2002-02-04 Jason Merrill ! ! * decl.c (start_function): Call cplus_decl_attributes immediately ! after grokdeclarator. ! ! * decl.c (start_function): Combine DECL_RESULT handling code. ! ! 2002-02-03 Jason Merrill ! ! * xref.c: Remove. ! * Make-lang.in (CXX_OBJS): Remove cp/xref.o ! (cp/xref.o): Remove dependencies. ! * class.c (finish_struct_1, check_methods): Don't call xref fns. ! (finish_struct_1): Likewise. ! * friend.c (make_friend_class): Likewise. ! * lex.c (cxx_init, cxx_finish, extract_interface_info): Likewise. ! * spew.c (read_process_identifier): Likewise. ! ! 2002-02-01 Jason Merrill ! ! PR c++/4872 ! * decl.c (finish_function): Warn about a non-void function with ! no return statement and no abnormal exit. ! * cp-tree.h (struct cp_language_function): Add returns_abnormally. ! (current_function_returns_abnormally): New macro. ! * call.c (build_call): Set it. ! ! * typeck.c (build_component_ref): Always complain about offsetof ! constructs on non-PODs. Only make it an error for members of ! virtual bases. ! ! * error.c (dump_scope): Don't add TFF_DECL_SPECIFIERS. ! (dump_function_decl): Always dump parms. ! ! * decl2.c (finish_static_data_member_decl): Complain about a local ! class with a static data member. ! ! PR c++/4286 ! * search.c (lookup_field_1): Don't xref a static data member ! just because we looked it up. 2002-01-31 Jason Merrill + * Make-lang.in (parse.c): Handle .output file. + PR c++/3395 ! * decl.c (xref_tag): Remember early attributes in TYPE_ATTRIBUTES, ! not TREE_TYPE. ! * semantics.c (finish_class_definition): Adjust. ! ! Allow attributes in parms and casts. ! * parse.y (named_parm): Don't strip attrs. ! (declmods): Remove 'attributes' production. ! (nonempty_cv_qualifiers): Accept attributes. ! (ATTRIBUTE): Give precedence. ! * decl.c (groktypename): Handle attributes. ! (grokparms): Likewise. ! ! 2002-01-29 Jakub Jelinek ! ! * decl2.c (cxx_decode_option): Pass 0 as last argument to ! cpp_handle_option. ! * lang-specs.h: Use cpp_unique_options instead of cpp_options ! when used together with cc1_options. ! ! 2002-01-29 Nathan Sidwell ! ! PR c++/5132 ! * typeck2.c (digest_init): Make sure non-array core type is ! instantiated. ! * decl2.c (reparse_absdcl_as_casts): Just store the type in the ! constructor, rather than build a new one. ! (build_expr_from_tree, CONSTRUCTOR case): Be careful with the ! PURPOSE of constructor elts. ! ! 2002-01-23 Zack Weinberg ! ! * Make-lang.in (parse.c): Adjust expected number of ! shift-reduce conflicts. ! (decl.o): Depend on diagnostic.h. ! * decl.c: Include diagnostic.h. ! (grokdeclarator): Check for null pointer. ! (finish_function): Don't abort when ! current_binding_level->parm_flag != 1, if errors have ! occurred; throw away the statement tree and extra binding ! levels, and continue. ! * lex.c (note_list_got_semicolon): Check for null pointer. ! * method.c (hack_identifier): Just return error_mark_node if ! value is error_mark_node. ! * parse.y (primary: TYPEID(type_id)): No need to use ! TYPE_MAIN_VARIANT here. ! (handler_seq): Accept an empty list of catch clauses and ! generate a fake handler block to avoid later crashes. ! (ansi_raise_identifier): Accept the error token too. ! * semantics.c (begin_class_definition, ! finish_class_definition): Check for error_mark_node. ! ! 2002-01-23 Zack Weinberg ! ! * typeck2.c (friendly_abort): Delete definition. ! * cp-tree.h (friendly_abort): Don't prototype. ! (my_friendly_assert): Use fancy_abort. ! ! 2002-01-23 Craig Rodrigues ! ! * cp-tree.h (my_friendly_abort): Remove. ! ! 2002-01-23 Jakub Jelinek ! ! * spew.c (pending_inlines, pending_inlines_tail, ! processing_these_inlines): Make static. ! (mark_pending_inlines): Remove static. ! (begin_parsing_inclass_inline): If in function, save pi ! for GC to cp_function_chain->unparsed_inlines instead. ! (process_next_inline): Likewise. ! * cp-tree.h (struct cp_language_function): Add unparsed_inlines. ! (mark_pending_inlines): Add prototype. ! * decl.c (spew_debug): Remove unused extern. ! (mark_lang_function): Call mark_pending_inlines. ! ! 2002-01-23 Craig Rodrigues ! ! * call.c, class.c, decl.c, decl2.c, error.c, expr.c, friend.c, ! init.c, lex.c, mangle.c, method.c, pt.c, repo.c, rtti.c, search.c, ! semantics.c, spew.c, tree.c, typeck.c, typeck2.c, xref.c: ! Change my_fancy_abort() to abort(). 2002-01-23 Jason Merrill + PR c++/5453 + * class.c (fixed_type_or_null): Fix thinko. + PR c++/3331 * init.c (resolve_offset_ref): Use build_indirect_ref. + * decl2.c (grokclassfn): Don't set DECL_REGISTER on 'this'. + + 2002-01-22 Jason Merrill + + * parse.y (function_body): Suppress the block for the outermost + curly braces. + * decl.c (pushdecl): Don't try to skip it. + (begin_function_body): Keep the block we create, not the next one. + * init.c (emit_base_init): Don't mess with keep_next_level. + + * class.c (build_base_path): Tweak formatting. + + 2002-01-19 Nathan Sidwell + + Fix regression introduced with patch for c++/775 + * parse.y (class_head_defn): Check for template specializations + with a different class-key. + + 2002-01-17 Jason Merrill + + * decl.c (begin_constructor_body, begin_destructor_body): New fns. + (begin_function_body): Call them and keep_next_level. + * init.c (emit_base_init): Call keep_next_level. + * semantics.c (setup_vtbl_ptr): Lose. + * cp-tree.h (struct cp_language_function): Remove vtbls_set_up_p. + (vtbls_set_up_p): Lose. + * pt.c (tsubst_expr, CTOR_INITIALIZER): Call emit_base_init. + * method.c (do_build_copy_constructor): Likewise. + (synthesize_method): Call finish_mem_initializers. + * parse.y (nodecls): Likewise. + + * error.c (dump_type_suffix): Print the exception specs before + recursing. + (dump_function_decl): Here, too. + + * cp-tree.h (TMPL_PARMS_DEPTH): Cast to signed HOST_WIDE_INT. + 2002-01-10 Ira Ruben PR c++/907 * decl.c (start_method): Handle attrlist. + 2002-01-10 Jakub Jelinek + + * decl2.c (max_tinst_depth): Increase default limit to 500. + + 2002-01-10 Graham Stott + + * spew.c (YYCHAR): Uppercase macro parameter and add + parenthesis. + (YYCODE): Likewise. + (NAME): Uppercase macro parameter. + + 2002-01-09 Graham Stott + + * decl.h (grokdeclarator): Wrap long line. + + * semantics.c (FINISH_COND): Uppercase macro paramaters and + add parenthesis. + + 2002-01-08 Graham Stott + + * xref.c (FILE_NAME_ABSOLUTE_P): Add parenthesis. + (PALLOC): Uppercase macro parameter and whitespace. + (SALLOC): Uppercase macro parameter. + (SFREE): Uppercase macros parameter, add parenthese and + whitespace. + (STREQL): Uppercase macro parameter and whitespace. + (STRNEQ): Likewise. + (STRLSS): Likewise. + (STRLEQ): Likewise. + (STRGTR): Likewise. + (STRGEQ): Likewise. + + * call.c (convert_like): Add parenthesis and wrap. + (convert_like_with_context): Likewise. + (ICS_RANK): Whitespace. + (NEED_TEMPORARY_P): Remove parenthesis. + + * class.c (VTT_TOP_LEVEL_P): Uppercase macro parameter and + whitespace. + (VTT_MARKED_BINFO_P): Likewise. + + * decl.c (BINDING_LEVEL): Add parenthesis. + (DEF_OPERATOR): Likewise. + + * mangle.c (MANGLE_TRACE): Add parenthesis. + (MANGLE_TRACE_TREE): Likewise. + (write_signed_number): Likewise. + (write_unsigned_number): Likewise. + + * pt.c (ccat): Uppercase macro parameter. + (cat): Likewise + + * search.c (SET_BINFO_ACCESS): Add parenthesis. + 2002-01-07 Jason Merrill + * decl2.c (coerce_new_type): Downgrade error for size_t mismatch + to pedwarn. + PR c++/3536 * method.c (make_thunk): If !flag_weak, give the thunk the function's linkage. (use_thunk): Here, too. ! 2002-01-07 Graham Stott ! ! * error.c: Update copyright date. ! (print_scope_operator): Add parenthesis. ! (print_left_paren): Likewise. ! (print_right_paren): Likewise. ! (print_left_bracket): Likewise. ! (print_right_bracket): Likewise. ! (print_template_argument_list_start): Likewise. ! (print_template_argument_list_end): Likewise. ! (print_non_consecutive_character): Likewise. ! (print_tree_identifier): Likewise. ! (print_identifier): Likewise. ! (NEXT_CODE): Uppercase macro parameter. ! (ident_fndecl): Delete unused. ! (GLOBAL_THING): Likewise. ! ! 2002-01-06 Graham Stott ! ! * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK): Add parenthesis. ! (VAR_FUNCTION_OR_PARM_DECL_CHECK): Likewise. ! (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK) Likewise. ! (RECORD_OR_UNION_TYPE_CHECK): Likewise. ! (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Likewise. ! (C_IS_RESERVED_WORD): Uppercase macro parameter. ! (C_RID_YYCODE) Likewise. ! (ptrmem_cst): Use rtx. ! (LOCAL_BINDING_P): Add whitespace. ! (INHERITED_VALUE_BINDING_P): Likewise. ! (BINDING_SCOPE): Wrap long line. ! (BINDING_HAS_LEVEL_P): Remove parenthesis. ! (BINDING_VALUE): Wrap long line. ! (BINDING_TYPE): Whitespace. ! (IDENTIFIER_GLOBAL_VALUE): Add parenthesis. ! (SET_IDENTIFIER_GLOBAL_VALUE): Likewise. ! (IDENTIFIER_NAMESPACE_VALUE): Likewise. ! (SET_IDENTIFIER_NAMESPACE_VALUE: Likewise. ! (same_type_p): Uppercase macro parameters. ! (same_type_ignoring_top_level_qualifiers_p): Likewise. ! (OVL_FUNCTION): Wrap long line. ! (OVL_CHAIN): Whitespace. ! (OVL_CURRENT): Add parenthesis and whitespace. ! (OVL_NEXT): Whitespace. ! (OVL_USED): Likewise. ! (IDENTIFIER_TYPE_VALUE): Likewise. ! (REAL_IDENTIFIER_TYPE_VALUE): Remove parenthesis. ! (SET_IDENTIFIER_TYPE_VALUE): Add parenthesis and whitespace. ! (LANG_ID_FIELD): Whitespace. ! (SET_LANG_ID(NODE,VALUE,NAME): Likewise. ! (IDENTIFIER_LABEL_VALUE): Whitespace and wrap. ! (SET_IDENTIFIER_LABEL_VALUE): Whitespace. ! (IDENTIFIER_IMPLICIT_DECL): Whitespace and wrap. ! (SET_IDENTIFIER_IMPLICIT_DECL); Whitespace. ! (IDENTIFIER_ERROR_LOCUS): Whitespace and wrap. ! (SET_IDENTIFIER_ERROR_LOCUS); Whitespace. ! (IDENTIFIER_VIRTUAL_P): Likewise. ! (IDENTIFIER_OPNAME_P): Likewise. ! (IDENTIFIER_TYPENAME_P): Remove parenthesis. ! (C_TYPE_FIELDS_READONLY): Uppercase macro parameters. ! (C_SET_EXP_ORIGINAL_CODE): Likewise. ! (TYPE_ASSEMBLER_NAME_STRING): Wrap long line. ! (TYPE_ASSEMBLER_NAME_LENGTH): Likewise. ! (IS_AGGR_TYPE): Uppercase macro parameter. ! (CLASS_TYPE_P): Likewise. ! (IS_AGGR_TYPE_CODE): Uppercase macro parameter and parenthesis. ! (IS_AGGR_TYPE_2): Whitespace. ! (TAGGED_TYPE_P): Uppercase macro parameter. ! (TYPE_BUILT_IN): Whitespace. ! (TYPE_FOR_JAVA): Likewise. ! (FUNCTION_ARG_CHAIN): Remove parenthesis. ! (FUNCTION_FIRST_USER_PARMTYPE): Add parenthesis. ! (FUNCTION_FIRST_USER_PARAM): Likewise. ! (PROMOTES_TO_AGGR_TYPE): Whitespace. ! (DERIVED_FROM_P): Add parenthesis and wrap. ! (UNIQUELY_DERIVED_FROM_P): Likewise. ! (ACCESSIBLY_UNIQUELY_DERIVED_P): Likewise. ! (PUBLICLY_UNIQUELY_DERIVED_P): Likewise. ! (CLASSTYPE_USE_TEMPLATE): Whitespace. ! (CLASSTYPE_INLINE_FRIENDS): Remove parenthesis. ! (TYPE_GETS_DELETE): Add parenthesis. ! (TYPE_HAS_CONVERSION): Add parenthesis and wrap. ! (TYPE_HAS_ASSIGN_REF): Likewise, ! (TYPE_HAS_CONST_ASSIGN_REF): Likewise. ! (TYPE_HAS_INIT_REF): Likewise. ! (TYPE_HAS_CONST_INIT_REF): Likewise. ! (TYPE_BEING_DEFINED): Likewise. ! (TYPE_LANG_SPECIFIC): Likewise. ! (CLASSTYPE_RTTI): Likewise. ! (TYPE_OVERLOADS_CALL_EXPR): Likewise. ! (TYPE_OVERLOADS_ARRAY_REF): Likewise. ! (TYPE_OVERLOADS_ARROW): Likewise. ! (TYPE_USES_MULTIPLE_INHERITANCE): Likewise. ! (TYPE_USES_VIRTUAL_BASECLASSES): Add parenthesis. ! (CLASSTYPE_METHOD_VEC): Likewise. ! (CLASSTYPE_MARKED_N): Likewise. ! (CLASSTYPE_MARKED): Likewise. ! (CLASSTYPE_MARKED2): Likewise. ! (CLASSTYPE_MARKED3): Likewise. ! (CLASSTYPE_MARKED4): Likewise. ! (CLASSTYPE_MARKED5): Likewise. ! (CLASSTYPE_MARKED6): Likewise. ! (SET_CLASSTYPE_MARKED): Whitespace. ! (CLEAR_CLASSTYPE_MARKED): Likewise. ! (SET_CLASSTYPE_MARKED2): Likewise. ! (CLEAR_CLASSTYPE_MARKED2): Likewise. ! (SET_CLASSTYPE_MARKED3): Likewise. ! (CLEAR_CLASSTYPE_MARKED3): Likewise. ! (SET_CLASSTYPE_MARKED4): Likewise. ! (CLEAR_CLASSTYPE_MARKED4): Likewise. ! (SET_CLASSTYPE_MARKED5): Likewise. ! (CLEAR_CLASSTYPE_MARKED5): Likewise. ! (SET_CLASSTYPE_MARKED6): Likewise. ! (CLEAR_CLASSTYPE_MARKED6): Likewise. ! (CLASSTYPE_TAGS): Likewise. ! (CLASSTYPE_VSIZE): Likewise. ! (CLASSTYPE_VBASECLASSES): Likewise. ! (CANONICAL_BINFO): Add parenthesis. ! (CLASSTYPE_SIZE(NODE): Likewise. ! (CLASSTYPE_SIZE_UNIT): Likewise. ! (CLASSTYPE_ALIGN(NODE): Likewise. ! (CLASSTYPE_USER_ALIGN): Likewise. ! (TYPE_JAVA_INTERFACE): Likewise. ! (CLASSTYPE_PURE_VIRTUALS): Likewise. ! (CLASSTYPE_NEEDS_VIRTUAL_REINIT): Whitespace and wrap. ! (TYPE_HAS_DEFAULT_CONSTRUCTOR): Likewise. ! (CLASSTYPE_HAS_MUTABLE): Likewise. ! (CLASSTYPE_FRIEND_CLASSES): Likewise. Likewise. ! (CLASSTYPE_DECLARED_CLASS): Whitespace and wrap. ! (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Likewise. ! (CLASSTYPE_REF_FIELDS_NEED_INIT): Likewise. ! (CLASSTYPE_INTERFACE_ONLY): Likewise. ! (CLASSTYPE_INTERFACE_KNOWN): Likewise. ! (CLASSTYPE_INTERFACE_UNKNOWN): Likewise. ! (SET_CLASSTYPE_INTERFACE_UNKNOWN_X): Likewise. ! (SET_CLASSTYPE_INTERFACE_UNKNOWN): Likewise. ! (SET_CLASSTYPE_INTERFACE_KNOWN): Likewise. ! (CLASSTYPE_DEBUG_REQUESTED): Whitespace and wrap. ! (BINFO_UNSHARED_MARKED): Whitespace. ! (BINFO_MARKED): Whitespace and wrap. ! (SET_BINFO_MARKED): Likewise. ! (CLEAR_BINFO_MARKED): Likewise. ! (BINFO_VTABLE_PATH_MARKED): Likewise. ! (SET_BINFO_VTABLE_PATH_MARKED): Likewise. ! (CLEAR_BINFO_VTABLE_PATH_MARKED): Likewise. ! (BINFO_SUBVTT_INDEX): Remove parenthesis. ! (BINFO_VPTR_INDEX): Likewise. ! (BINFO_PRIMARY_BASE_OF): Likewise, ! (CLASSTYPE_VFIELDS): Whitespace. ! (VF_DERIVED_VALUE): Wrap long line. ! (NAMESPACE_LEVEL): Whitespace. ! (CAN_HAVE_FULL_LANG_DECL_P): Remove parenthesis. ! (DEFARG_POINTER): Whitespace. ! (DECL_NEEDED_P): Remove parenthesis. ! (DECL_LANGUAGE): Whitespace. ! (SET_DECL_LANGUAGE): Add parenthesis. ! (DECL_CONSTRUCTOR_P): Whitespace and wrap. ! (DECL_OVERLOADED_OPERATOR_P): Remove parenthesis. ! (DECL_IN_AGGR_P): Whitespace. ! (DECL_FRIEND_P): Likewise. ! (DECL_BEFRIENDING_CLASSES): Likewise. ! (DECL_STATIC_FUNCTION_P): Whitespace and wrap. ! (DECL_NONCONVERTING_P): Whitespace. ! (DECL_PURE_VIRTUAL_P): Likewise. ! (DECL_NEEDS_FINAL_OVERRIDER_P): Likewise. ! (DECL_PENDING_INLINE_INFO): Whitespace. ! (DECL_SORTED_FIELDS): Likewise. ! (DECL_DEFERRED_FN): Likewise. ! (DECL_TEMPLATE_INFO): Likewise. ! (CLASSTYPE_TEMPLATE_INFO): Whitespace and wrap. ! (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO); Likewise. ! (SET_TYPE_TEMPLATE_INFO): Add parenthesis. ! (TMPL_ARGS_LEVEL): Likewise. ! (SET_TMPL_ARGS_LEVEL): Likewise. ! (INNERMOST_TEMPLATE_PARMS): Whitespace. ! (C_TYPEDEF_EXPLICITLY_SIGNED): Uppercase macro parameter. ! (INTEGRAL_CODE_P(CODE): Add parenthesis. ! (CP_INTEGRAL_TYPE_P): Remove parenthesis. ! (TYPE_HAS_CONSTRUCTOR): Whitespace. ! (TREE_HAS_CONSTRUCTOR): Likewise. ! (TYPE_HAS_DESTRUCTOR): Likewise. ! (TYPE_HAS_REAL_ASSIGN_REF): Likewise. ! (TYPE_HAS_COMPLEX_ASSIGN_REF): Likewise. ! (TYPE_HAS_ABSTRACT_ASSIGN_REF): Likewise. ! (TYPE_HAS_COMPLEX_INIT_REF): Likewise. ! (TYPE_HAS_NONTRIVIAL_DESTRUCTOR): Likewise. ! (TYPE_PTRMEMFUNC_P): Likewise. ! (TYPE_PTRMEMFUNC_FLAG): Likewise. ! (TYPE_GET_PTRMEMFUNC_TYPE): Likewise. ! (TYPE_SET_PTRMEMFUNC_TYPE): Likewise. ! (TYPE_PTRMEM_CLASS_TYPE): Remove parenthesis. ! (TYPE_PTRMEM_POINTED_TO_TYPE): Likewise. ! (DECL_ACCESS): Whitespace. ! (DECL_GLOBAL_CTOR_P): Remove parenthesis. ! (DECL_GLOBAL_DTOR_P): Likewise. ! (GLOBAL_INIT_PRIORITY): Likewise. ! (DECL_TEMPLATE_PARMS): Likewise. ! (DECL_TEMPLATE_RESULT): Likewise. ! (DECL_TEMPLATE_INSTANTIATIONS): Likewise. ! (DECL_TEMPLATE_SPECIALIZATIONS): Likewise. ! (DECL_IMPLICIT_TYPEDEF_P): Remove parenthesis. ! (SET_DECL_IMPLICIT_TYPEDEF_P): Likewise. ! (PRIMARY_TEMPLATE_P): Add parenthesis. ! (DECL_USE_TEMPLATE): Whitespace. ! (CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. ! (SET_CLASSTYPE_IMPLICIT_INSTANTIATION): Likewise. ! (CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. ! (SET_CLASSTYPE_EXPLICIT_INSTANTIATION): Likewise. ! (CALL_DECLARATOR_PARMS): Remove parenthesis. ! (CALL_DECLARATOR_QUALS): Likewise. ! (CALL_DECLARATOR_EXCEPTION_SPEC): Likewise. ! (TEMP_NAME_P): Wrap. ! (VFIELD_NAME_P): Likewise. ! (B_SET): Uppercase macro parameters and add parenthesis. ! (B_CLR): Likewise. ! (B_TST): Likewise. ! (LOOKUP_NAMESPACES_ONLY): Uppercase macro parameters. ! (LOOKUP_TYPES_ONLY): Uppercase macro parameters. ! (LOOKUP_QUALIFIERS_ONLY): Uppercase macro parameters. ! (same_or_base_type_p): Likewise. ! (cp_deprecated): Likewise. ! ! 2002-01-05 Richard Henderson ! ! * semantics.c (expand_body): Revert last change. ! ! 2002-01-04 Jason Merrill PR c++/4122 * class.c (update_vtable_entry_for_fn): Set delta to zero for a lost primary. + * class.c (build_vtbl_initializer): Check for a lost primary + before calculating the vtable entry to throw away. + + 2002-01-02 Jason Merrill + + * semantics.c (expand_body): Call outlining_inline_function when + emitting an inline function out of line. + + 2002-01-02 Nathan Sidwell + + PR c++/5116, c++/764 reversion + * call.c (build_new_op): Revert the instantiations. They are + incorrect. + + 2002-01-02 Nathan Sidwell + + PR c++/5089 + * decl2.c (reparse_absdcl_as_casts): Don't warn about casts to void. + + 2002-01-02 Nathan Sidwell + + PR c++/3716 + * pt.c (tsubst_aggr_type): Move pmf handling into tsubst. + (tsubst, case POINTER_TYPE): Handle pmfs here. + (tsubst, case OFFSET_TYPE): Check it is not an offset to + reference. If it is offset to FUNCTION_TYPE, create a METHOD_TYPE. + + 2002-01-02 Nathan Sidwell + + PR c++/35 + * cp-tree.h (DECL_LANG_FLAG_0): Used for PARM_DECL too. + (DECL_TEMPLATE_PARM_P): A PARM_DECL might be one too. + * pt.c (process_template_parm): SET_DECL_TEMPLATE_PARM_P on the + PARM_DECL. + (tsubst_template_parms): Break up loop statements. + (tsubst_decl, case PARM_DECL): Copy DECL_TEMPLATE_PARM_P. Template + parm PARM_DECLs don't get promoted. + + 2002-01-02 Nathan Sidwell + + PR c++/5123 + * typeck.c (build_component_ref): Cope with a TEMPLATE_ID_EXPR. + (build_x_function_call): Cope with a COMPONENT_REF containing a + TEMPLATE_ID_EXPR. + + 2002-01-02 Nathan Sidwell + + PR c++/5213 + * pt.c (convert_template_argument): Be more careful determining + when RECORD_TYPE templates are or are not templates. + + 2002-01-02 Nathan Sidwell + + PR c++/775 + * cp-tree.h (handle_class_head): Adjust prototype. + * decl2.c (handle_class_head): Add DEFN_P and NEW_TYPE_P + parameters. Use for all class heads. + * parse.y (named_class_head_sans_basetype, named_class_head, + named_complex_class_head_sans_basetype, + named_class_head_sans_basetype_defn, + unnamed_class_head): Remove. + (class_head, class_head_apparent_template): Recognize class heads + (class_head_decl, class_head_defn): New reductions. Process class + heads. + (structsp): Adjust class definition and class declaration + reductions. + (maybe_base_class_list): Give diagnostic on empty list. + + 2002-01-02 Nathan Sidwell + + PR c++/4379 + * typeck.c (build_x_unary_op): Don't destroy the OFFSET_REF on a + single non-static member. + (unary_complex_lvalue): If it cannot be a pointer to member, don't + make it so. Check it is not pointer to reference. + + 2002-01-02 Nathan Sidwell + + PR c++/5132 + * decl2.c (reparse_absdcl_as_casts): Don't digest_init if we + are processing a template decl. + + 2002-01-02 Nathan Sidwell + + PR c++/5116, c++/764 + * call.c (build_new_op): Make sure template class operands are + instantiated. Simplify arglist construction. + + 2001-12-29 Nathan Sidwell + + * call.c (build_user_type_conversion_1): Use my_friendly_assert + rather than if ... abort. + * cvt.c (convert_to_reference): Likewise. + * semantics.c (setup_vtbl_ptr): Likewise. + * pt.c (lookup_template_class): Comment typo. + + 2001-12-29 Nathan Sidwell + + PR c++/5125 + * pt.c (push_template_decl_real): Make sure DECL has + DECL_LANG_SPECIFIC. + + 2001-12-29 Nathan Sidwell + + PR c++/335 + * init.c (resolve_offset_ref): Copy cv qualifiers of this pointer + for non-reference fields. + * typeck.c (require_complete_type): Use resolve_offset_ref). + + 2001-12-26 Nathan Sidwell + + PR c++/196 + * parse.y (bad_parm): Better diagnostic when given a SCOPE_REF. + + 2001-12-24 Nathan Sidwell + + PR c++/160 + * typeck.c (build_modify_expr): Remove old unreachable code & tidy + up. Don't stabilize_references when initializing a reference. + + 2001-12-23 Kaveh R. Ghazi + + * decl2.c (lang_f_options): Const-ify. + + 2001-12-20 Joseph S. Myers + + * config-lang.in (diff_excludes): Remove. + + 2001-12-19 Nathan Sidwell + + PR c++/90 + * typeck.c (build_function_call_real): Use original function + expression for errors. + 2001-12-18 Jason Merrill PR c++/3242 * class.c (add_method): Do compare 'this' quals when trying to match a used function. Don't defer to another used function. ! 2001-12-18 Nathan Sidwell ! * pt.c (instantiate_clone): Remove, fold into ... ! (instantiate_template): ... here. Simplify by removing mutual ! recursion. ! * typeck2.c (build_m_component_ref): Don't cv qualify the function ! pointed to by a pointer to function. ! * class.c (delete_duplicate_fields_1): Typo. ! 2001-12-18 Jason Merrill ! ! C++ ABI change: destroy value arguments in caller. ! * semantics.c (genrtl_start_function, genrtl_finish_function): Don't ! create an extra binding level for the parameters. ! * decl.c (store_parm_decls): Don't do parameter cleanups. ! ! 2001-12-18 Nathan Sidwell ! ! * call.c (build_new_method_call): Use '%#V'. ! * error.c (cv_to_string): Use V parameter to determine padding. ! ! 2001-12-18 Joseph S. Myers ! ! * call.c, decl2.c, init.c: Use "built-in" and "bit-field" ! spellings in messages. ! ! 2001-12-17 Zack Weinberg ! ! * cp-tree.h: Delete #defines for cp_error, cp_warning, ! cp_pedwarn, and cp_compiler_error. ! * call.c, class.c, cp-tree.h, cvt.c, decl.c, decl2.c, error.c, ! except.c, friend.c, init.c, lex.c, method.c, parse.y, pt.c, ! rtti.c, search.c, semantics.c, spew.c, tree.c, typeck.c, ! typeck2.c: Change calls to the above macros to use their ! language-independent equivalents: error, warning, pedwarn, and ! internal_error respectively. ! ! 2001-12-16 Neil Booth ! ! * decl2.c (finish_file): Remove back_end_hook. ! ! 2001-12-16 Joseph S. Myers ! ! * ChangeLog.1, ChangeLog.2, ChangeLog, NEWS, call.c, class.c, ! cp-tree.h, decl.c, decl2.c, except.c, operators.def, optimize.c, ! pt.c, rtti.c, semantics.c, typeck.c: Fix spelling errors. ! ! 2001-12-15 Joseph S. Myers ! ! * lang-options.h: Use American spelling in messages. ! ! 2001-12-13 Jason Merrill ! ! * Make-lang.in (parse.h): Separate rule, just depend on parse.c. ! ! Use cleanups to run base and member destructors. ! * init.c (push_base_cleanups): New function, split out from... ! (build_delete): ...here. Lose !TYPE_HAS_DESTRUCTOR code. ! * decl.c (finish_destructor_body): Move vbase destruction code to ! push_base_cleanups. ! (begin_function_body, finish_function_body): New fns. ! (finish_function): Move [cd]tor handling and call_poplevel to ! finish_function_body. ! (pushdecl): Skip the new level. ! * semantics.c (genrtl_try_block): Don't call end_protect_partials. ! (setup_vtbl_ptr): Call push_base_cleanups. ! * method.c (synthesize_method): Call {begin,end}_function_body. ! * pt.c (tsubst_expr): Handle COMPOUND_STMT_BODY_BLOCK. ! * cp-tree.h: Declare new fns. ! * parse.y (function_body, .begin_function_body): New nonterminals. ! (fndef, pending_inline, function_try_block): Use function_body. ! (ctor_initializer_opt, function_try_block): No longer has a value. ! (base_init): Remove .set_base_init token. ! (.set_base_init, compstmt_or_error): Remove. ! * Make-lang.in (parse.c): Expect two fewer s/r conflicts. ! ! * optimize.c (maybe_clone_body): Fix parameter updating. 2001-12-12 Jason Merrill + * decl.c (store_parm_decls): Remove parms_have_cleanups cruft. + * semantics.c (genrtl_start_function): Don't pass + parms_have_cleanups or push an extra binding level. + (genrtl_finish_function): Lose cleanup_label cruft. + + * cp-tree.h (struct cp_language_function): Remove x_ctor_label. + (ctor_label): Remove. + * semantics.c (finish_return_stmt): Lose ctor_label support. + * decl.c (finish_constructor_body, mark_lang_function): Likewise. + * typeck.c (check_return_expr): Check DECL_DESTRUCTOR_P, not + dtor_label. + + * call.c (build_new_method_call): Let resolves_to_fixed_type_p + check for [cd]tors. + * class.c (fixed_type_or_null, case INDIRECT_REF): Fix. + + * decl.c (finish_function): Check VMS_TARGET, not VMS. + + * decl.c (start_cleanup_fn): Remove redundant pushlevel. + (end_cleanup_fn): And poplevel. + * semantics.c (setup_vtbl_ptr): Always build a CTOR_INITIALIZER if we're in a template. + 2001-12-12 Jakub Jelinek + + * cp-tree.h (DESTRUCTOR_DECL_PREFIX, DESTRUCTOR_NAME_P, + ANON_PARMNAME_FORMAT, ANON_PARMNAME_P, DESTRUCTOR_NAME_FORMAT, + THIS_NAME_P): Delete. + * spew.c (read_process_identifier): Remove DESTRUCTOR_NAME_P, + THIS_NAME_P and ANON_PARMNAME_P tests from warning about clash + with internal naming scheme. + * error.c (dump_decl): Remove DESTRUCTOR_NAME_P use. + + 2001-12-12 Nathan Sidwell + + * decl.c (grokdeclarator): Deprecated implicit typename use. + + 2001-12-11 Nathan Sidwell + + PR g++/51 + * parse.y (frob_specs): Indicate it is a language linkage which + contained the extern. + * decl.c (grokdeclarator): Allow extern language linkage with + other specifiers. + + 2001-12-10 Nathan Sidwell + + PR g++/72 + * decl.c (add_binding): Don't reject duplicate typedefs involving + template parameters. + + 2001-12-10 Neil Booth + + * parse.y, semantics.c: Similarly. + + 2001-12-09 Nathan Sidwell + + PR g++/87 + * cp-tree.h (DECL_COPY_CONSTRUCTOR_P): Use copy_fn_p. + (copy_args_p): Rename to ... + (copy_fn_p): ... here. + (grok_special_member_properties): New function. + (grok_op_properties): Lose VIRTUALP parameter. + (copy_assignment_arg_p): Remove. + * call.c (build_over_call): Use copy_fn_p. + * decl.c (grokfndecl): Reformat. Adjust call to + grok_op_properties. + (copy_args_p): Rename to ... + (copy_fn_p): ... here. Reject template functions. Check for pass + by value. + (grok_special_member_properties): Remember special functions. + (grok_ctor_properties): Don't remember them here, just check. + (grok_op_properties): Likewise. + (start_method): Call grok_special_member_properties. + * decl2.c (grokfield): Likewise. + (copy_assignment_arg_p): Remove. + (grok_function_init): Don't remember abstract assignment here. + * pt.c (instantiate_class_template): Call + grok_special_member_properties. + (tsubst_decl): Adjust grok_op_properties call. + + 2001-12-08 Aldy Hernandez + + * lex.c (rid_to_yy): Add RID_CHOOSE_EXPR and + RID_TYPES_COMPATIBLE_P. + 2001-12-08 John David Anglin * semantics.c (simplify_aggr_init_exprs_r): Add DIRECT_BIND flag in call to build_aggr_init. * cp-tree.h (DIRECT_BIND): Document new use of DIRECT_BIND. + 2001-12-08 Neil Booth + + * parse.y: Replace uses of the string non-terminal with STRING. + Don't perform string concatentaion here. + (string): Remove non-terminal. + * semantics.c (finish_asm_stmt): Don't concatenate strings here. + 2001-12-05 Jason Merrill + * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Define. + (LANG_HOOKS_TREE_INLINING_END_INLINING): Define. + * tree.c (cp_start_inlining, cp_end_inlining): New fns. * pt.c (push_tinst_level): No longer static. ! * cp-tree.h: Declare them. ! ! * init.c (resolve_offset_ref): Don't check access for the base ! conversion to access a FIELD_DECL. ! ! * cp-tree.h (TYPE_REFFN_P): New macro. ! * decl.c (bad_specifiers): Check it, too. * rtti.c (create_pseudo_type_info): Set CLASSTYPE_INTERFACE_ONLY on the __*_type_info type if we haven't seen a definition. + 2001-12-05 Neil Booth + + * decl.c: Include c-common.h. + (shadow_warning): Move to c-common.c. + + Wed Dec 5 17:00:49 2001 Richard Kenner + + * decl.c (duplicate_decls): Don't copy DECL_NO_CHECK_MEMORY_USAGE. + + 2001-12-04 Nathan Sidwell + + * pt.c (end_template_parm_list): Clear TREE_CHAIN of each parm. + + 2001-12-04 Nathan Sidwell + + PR g++/164 + * init.c (sort_base_init): Allow binfos to be directly specified. + * method.c (do_build_copy_constructor): Explicitly convert to the + base instance. + (do_build_assign_ref): Likewise. + 2001-12-03 Hans-Peter Nilsson * decl.c (xref_basetypes): Don't use C99 construct in tag_code declaration and initialization. ! 2001-12-03 Neil Booth ! * typeck2.c: Remove leading capital from diagnostic messages, as ! per GNU coding standards. 2001-12-03 Mumit Khan PR c++/3394 ! * decl.c (xref_basetypes): Handle attributes between 'class' and name. + 2001-12-03 Nathan Sidwell + + PR g++/3381 + * parse.y (named_complex_class_head_sans_basetype): Add new + reduction. + * Make-lang.in (parse.c): Adjust expected conflict count. + 2001-12-03 Jason Merrill * class.c (finish_vtbls): Fill in BINFO_VPTR_FIELD in the immediate binfos for our virtual bases. + 2001-12-02 Neil Booth + + * call.c (build_java_interface_fn_ref): Similarly. + * except.c (is_admissible_throw_operand): Similarly. + * init.c (build_java_class_ref): Similarly. + * xref.c (open_xref_file): Similarly. + + 2001-12-01 Neil Booth + + * class.c (finish_struct): Remove trailing periods from messages. + * decl.c (check_tag_decl): Similarly. + * lex.c (cxx_set_yydebug): Similarly. + * typeck2.c (friendly_abort): Similarly. + 2001-11-29 Mark Mitchell PR c++/3048 * cp-tree.h (ovl_member): Remove. ! * decl2.c (merge_functions): Handle extern "C" functions specially. * tree.c (ovl_member): Remove. + 2001-11-29 Mark Mitchell + PR c++/4842 * class.c (get_basefndecls): Take an IDENTIFIER_NODE, not a FUNCTION_DECL, as input. (mark_overriders): Remove. (warn_hidden): Rework for the new ABI. + 2001-11-29 Mark Mitchell + PR c++/3471 * call.c (convert_like_real): Do not build additional temporaries for rvalues of class type. ! 2001-11-28 Nathan Sidwell ! ! * cp-tree.h (UNIQUELY_DERIVED_FROM_P): Use lookup base. ! (ACCESSIBLY_UNIQUELY_DERIVED_FROM_P): Likewise. ! (PUBLICLY_UNIQUELY_DERIVED_FROM_P: Likewise. ! (DERIVED_FROM_P): Likewise. ! (enum base_access): Renumber, add ba_quiet bit mask. ! (get_binfo): Remove. ! (get_base_distance): Remove. ! (binfo_value): Remove. ! (ACCESSIBLY_DERIVED_FROM_P): Remove. ! * call.c (standard_conversion): Use lookup_base. ! * class.c (strictly_overrides): Likewise. ! (layout_virtual_bases): Likewise. ! (warn_about_ambiguous_direct_bases): Likewise. ! (is_base_of_enclosing_class): Likewise. ! (add_vcall_offset_vtbl_entries_1): Likewise. ! * cvt.c (build_up_reference): Adjust comment. ! * init.c (build_member_call): Reformat. ! * search.c (get_binfo): Remove. ! (get_base_distance_recursive): Remove. ! (get_base_distance): Remove. ! (lookup_base_r): Tweak. ! (lookup_base): Add ba_quiet control. Complete the types here. ! (covariant_return_p): Use lookup_base. ! * tree.c (binfo_value): Remove. ! (maybe_dummy_object): Use lookup_base. ! * typeck.c (build_static_cast): Use lookup_base. ! (get_delta_difference): Likewise. ! * typeck2.c (binfo_or_else): Use lookup_base. ! (build_scoped_ref): Add back error_mark_check. ! (build_m_component_ref): Use lookup_base. ! ! 2001-11-29 Joseph S. Myers ! ! * Make-lang.in (c++.generated-manpages): New dummy target. ! ! Tue Nov 27 09:03:47 2001 Richard Kenner ! ! * Make-lang.in (cp-lang.o): Depends on c-common.h. ! * cp-lang.c (c-common.h): Include. ! (LANG_HOOKS_EXPAND_CONSTANT, LANG_HOOKS_SAFE_FROM_P): New hooks. ! * decl.c (cxx_init_decl_processing): Don't set lang_safe_from_p. ! * expr.c (init_cplus_expand): Don't set lang_expand_constant. ! ! 2001-11-26 Neil Booth ! ! * decl2.c (c_language): Move to c-common.c. ! * lex.c (cxx_post_options, cxx_init_options): Use c-common.c ! functions. ! (cxx_init): Update. ! ! 2001-11-26 Jason Merrill ! ! * call.c (joust): Remove COND_EXPR hack. ! ! 2001-11-25 Aldy Hernandez ! ! * search.c (lookup_base_r): Declare bk in variable declaration ! space. ! ! 2001-11-25 Nathan Sidwell ! ! PR g++/3145 ! * class.c (build_vbase_pointer): Remove. ! (build_vbase_path): Remove. ! (build_base_path): New function. ! * cp-tree.h (base_access, base_kind): New enumerations. ! (build_base_path): Declare. ! (convert_pointer_to_real): Remove. ! (convert_pointer_to): Remove. ! (lookup_base): Declare. ! (convert_pointer_to_vbase): Remove. ! * call.c (build_scoped_method_call): Use lookup_base & ! build_base_path instead of convert_pointer_to_real, ! get_base_distance & get_binfo. ! (build_over_call): Likewise. ! * cvt.c (cp_convert_to_pointer): Likewise. ! (convert_to_pointer_force): Likewise. ! (build_up_reference): Likewise. ! (convert_pointer_to_real): Remove. ! (convert_pointer_to): Remove. ! * init.c (dfs_initialize_vtbl_ptrs): Use build_base_path ! instead of convert_pointer_to_vbase & build_vbase_path. ! (emit_base_init): Use build_base_path instead of ! convert_pointer_to_real. ! (expand_virtual_init): Lose unrequired conversions. ! (resolve_offset_ref): Use lookup_base and build_base_path ! instead of convert_pointer_to. ! * rtti.c (build_dynamic_cast_1): Use lookup_base & ! build_base_path instead of get_base_distance & build_vbase_path. ! * search.c (get_vbase_1): Remove. ! (get_vbase): Remove. ! (convert_pointer_to_vbase): Remove. ! (lookup_base_recursive): New function. ! (lookup_base): New function. ! * typeck.c (require_complete_type): Use lookup_base & ! build_base_path instead of convert_pointer_to. ! (build_component_ref): Likewise. ! (build_x_function_call): Likewise. ! (get_member_function_from_ptrfunc): Likewise. ! (build_component_addr): Likewise. ! * typeck2.c (build_scoped_ref): Likewise. ! ! 2001-11-22 Bryce McKinlay ! ! * cp-tree.h (CP_TYPE_QUALS): Removed. ! * decl.c (cxx_init_decl_processing): Don't set lang_dump_tree. ! * cp-lang.c: Set LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN and ! LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN. ! * dump.c (cp_dump_tree): Use void* dump_info argument to match ! lang-hooks prototype. ! * call.c, cp-tree.h, cvt.c, decl.c, init.c, mangle.c, method.c, pt.c, ! rtti.c, semantics.c, tree.c, typeck.c, typeck2.c: All references to ! CP_TYPE_QUALS changed to cp_type_quals. ! * Make-lang.in: References to c-dump.h changed to tree-dump.h. ! (CXX_C_OBJS): Remove c-dump.o. ! ! 2001-11-21 Mark Mitchell PR c++/3637 + * pt.c (lookup_template_class): Ensure that all specializations + are registered on the list corresponding to the most general + template. + + 2001-11-20 Mark Mitchell + * call.c (non_reference): Add documentation. ! (convert_class_to_reference): Do not strip reference types from conversion operators. (maybe_handle_ref_bind): Simplify. (compare_ics): Correct handling of references. + 2001-11-19 John Wilkinson + + * dump.c (dump_op): New function. + (cp_dump_tree): Dump CLASSTYPE_TEMPLATE_SPECIALIZATION. Use + dump_op. Dump DECL_MUTABLE, access and staticness for VAR_DECLs. + DECL_PURE_VIRTUAL_P, DECL_VIRTUAL_P, + 2001-11-19 Mark Mitchell ! PR4629 ! * semantics.c (finish_sizeof): Make sure that expression created while processing a template do not have a type. ! (finish_alignof): Likewise. ! * typeck.c (c_sizeof): Likewise. (expr_sizeof): Likewise. ! ! 2001-11-18 Neil Booth ! ! * lex.c (cxx_finish): Call c_common_finish. ! (finish_parse): Remove. ! ! 2001-11-17 Kriang Lerdsuwanakij ! ! * decl.c (create_array_type_for_decl): Check if NAME is NULL_TREE ! when displaying error message about missing array bounds. ! ! 2001-11-17 Kriang Lerdsuwanakij ! ! * mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, ! CONST_CAST_EXPR. ! * operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR. ! ! 2001-11-16 Neil Booth ! ! * cp-tree.h (print_class_statistics): Restore. ! ! 2001-11-15 Jason Merrill ! ! * method.c (use_thunk): Don't emit debugging information for thunks. ! ! * parse.y: Add ... IDENTIFIER SCOPE and ... PTYPENAME SCOPE expansions. ! * decl.c (make_typename_type): Handle getting a class template. ! * search.c (lookup_field_r): A class template is good enough for ! want_type. ! ! * call.c (convert_like_real): Only use cp_convert for the bad part. ! (standard_conversion): Also allow bad int->enum. ! * typeck.c (ptr_reasonably_similar): Also allow functions to ! interconvert. Pointers to same-size integers are reasonably ! similar. ! ! * cvt.c (convert_to_void): If we build a new COND_EXPR, always ! give it void type. ! ! 2001-11-15 Nathan Sidwell ! ! PR g++/3154 ! * init.c (sort_base_init): Remove unreachable code. ! (expand_member_init): Adjust comment to reflect reality. Simplify ! and remove unreachable code. ! ! 2001-11-15 Neil Booth ! ! * cp-tree.h (init_reswords, cxx_init_decl_processing): New. ! (cxx_init): Update prototype. ! * decl.c (init_decl_processing): Rename. Move null node init ! to its creation time. ! * lex.c (cxx_init_options): Update. ! (cxx_init): Combine with old init_parse; also call ! cxx_init_decl_processing. ! ! 2001-11-14 Richard Sandiford ! ! * decl.c (check_initializer): Try to complete the type of an ! array element before checking whether it's complete. Don't ! complain about arrays with complete element types but an ! unknown size. ! (cp_finish_decl): Build the hierarchical constructor before ! calling maybe_deduce_size_from_array_init. 2001-11-14 Joseph S. Myers * Make-lang.in: Change all uses of $(manext) to $(man1ext). ! 2001-11-13 Nathan Sidwell ! PR g++/4206 ! * parse.y (already_scoped_stmt): Remove. ! (simple_stmt, WHILE & FOR): Use implicitly_scoped_stmt. ! ! 2001-11-12 H.J. Lu ! ! * cvt.c (ocp_convert): Don't warn the address of a weak ! function is always `true'. ! ! 2001-11-09 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_PRINT_DECL, LANG_HOOKS_PRINT_TYPE, ! LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_PRINT_XNODE, ! LANG_HOOKS_PRINT_IDENTIFIER, LANG_HOOKS_SET_YYDEBUG): Override. ! * cp-tree.h (print_class_statistics): Remove. ! (cxx_print_statistics, cxx_print_xnode, cxx_print_decl, cxx_print_type, ! cxx_print_identifier, cxx_set_yydebug): New. ! * lex.c (set_yydebug): Rename c_set_yydebug. ! * ptree.c (print_lang_decl, print_lang_type, print_lang_identifier, ! lang_print_xnode): Rename. ! * tree.c (print_lang_statistics): Rename. ! ! 2001-11-09 Kaveh R. Ghazi ! ! * class.c (dump_array): Fix format specifier warning. ! ! 2001-11-09 Neil Booth ! ! * cp-lang.c (LANG_HOOKS_NAME): Override. ! (struct lang_hooks): Constify. ! * lex.c (cxx_init_options): Update. ! (lang_identify): Remove. ! * parse.y (language_string): Remove. ! ! 2001-11-08 Andreas Franck ! ! * Make-lang.in (CXX_INSTALL_NAME, GXX_CROSS_NAME, ! DEMANGLER_CROSS_NAME): Handle program_transform_name the way ! suggested by autoconf. ! (GXX_TARGET_INSTALL_NAME, CXX_TARGET_INSTALL_NAME): Define. ! (c++.install-common): Use the transformed target alias names. ! ! 2001-11-06 Neil Booth ! ! * Make-lang.in: Update. ! * cp-lang.c: Include langhooks-def.h. ! ! 2001-11-04 Kriang Lerdsuwanakij ! ! * pt.c (tsubst_copy): Call tsubst for TYPEOF_EXPR. ! ! 2001-11-03 Kaveh R. Ghazi ! ! * lex.c (copy_lang_type): Add static prototype. ! ! 2001-11-02 Kriang Lerdsuwanakij ! ! * pt.c (unify): Handle SCOPE_REF. ! ! 2001-11-01 Jakub Jelinek ! ! * tree.c (cp_copy_res_decl_for_inlining): Adjust ! DECL_ABSTRACT_ORIGIN for the return variable. ! ! 2001-10-31 Zack Weinberg ! ! * Make-lang.in: Replace $(INTL_TARGETS) with po-generated. ! ! 2001-10-28 Joseph S. Myers ! ! * ChangeLog.1, ChangeLog.2, ChangeLog, class.c, decl2.c, search.c, ! semantics.c, spew.c: Fix spelling errors. ! ! 2001-10-27 Kriang Lerdsuwanakij ! ! * decl2.c (validate_nonmember_using_decl): Handle NAMESPACE_DECL. ! ! 2001-10-25 Zack Weinberg ! ! * cp-lang.c: Redefine LANG_HOOKS_CLEAR_BINDING_STACK to ! pop_everything. ! ! Tue Oct 23 14:00:20 2001 Richard Kenner ! ! * cp-lang.c (cxx_get_alias_set): New function. ! Point LANG_HOOKS_GET_ALIAS_SET to it. ! ! 2001-10-23 Kriang Lerdsuwanakij ! ! * cp-tree.def (UNBOUND_CLASS_TEMPLATE): New tree node. ! * cp-tree.h (make_unbound_class_template): Prototype new function. ! * decl.c (make_unbound_class_template): New function. ! * decl2.c (arg_assoc_template_arg): Handle UNBOUND_CLASS_TEMPLATE. ! * error.c (dump_type): Likewise. ! * mangle.c (write_type): Likewise. ! * parse.y (template_parm): Likewise. ! (template_argument): Use make_unbound_class_template. ! * pt.c (convert_template_argument): Handle UNBOUND_CLASS_TEMPLATE. ! (tsubst): Likewise. ! (tsubst_copy): Likewise. ! (unify): Likewise. ! * tree.c (walk_tree): Likewise. ! * typeck.c (comptypes): Likewise. ! ! 2001-10-21 Kaveh R. Ghazi ! ! * xref.c (GNU_xref_member): Use safe-ctype macros and/or fold ! extra calls into fewer ones. ! ! 2001-10-18 Alexandre Oliva ! ! * decl.c (duplicate_decls): Propagate DECL_UNINLINABLE. ! Warn when merging inline with attribute noinline. ! (start_decl, start_function): Warn if inline and attribute ! noinline appear in the same declaration. ! ! 2001-10-16 H.J. Lu ! ! * cp-tree.h (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Defined ! for tree checking disabled. ! ! 2001-10-16 Hans-Peter Nilsson ! ! * cp-tree.h (VFIELD_NAME_FORMAT) [NO_DOLLAR_IN_LABEL && ! NO_DOT_IN_LABEL]: Adjust to match VFIELD_NAME. ! ! 2001-10-15 Richard Sandiford ! ! * pt.c (UNIFY_ALLOW_MAX_CORRECTION): Define. ! (unify): Only handle MINUS_EXPR specially if the above flag is set ! and the subtracted constant is 1. Clear the flag on recursive calls. ! Set it when unifying the maximum value in an INTEGER_TYPE's range. ! ! 2001-10-15 Richard Sandiford ! ! * decl.c (bad_specifiers): Don't allow exception specifications ! on any typedefs. ! ! 2001-10-14 Neil Booth ! ! * cp/lex.c (init_cp_pragma): Similarly. ! ! 2001-10-13 Kriang Lerdsuwanakij ! ! * pt.c (lookup_template_class): Build complete template arguments ! for BOUND_TEMPLATE_TEMPLATE_PARM. ! ! 2001-10-12 Kriang Lerdsuwanakij ! ! * cp-tree.h (TYPE_BINFO): Update comment. ! (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): New macro. ! (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Use template_info. ! (TYPENAME_TYPE_FULLNAME): Use TYPE_FIELDS. ! (copy_type): Prototype new function. ! * lex.c (copy_lang_decl): Gather tree node statistics. ! (copy_lang_type): New function. ! (copy_type): Likewise. ! (cp_make_lang_type): Create lang_type for ! BOUND_TEMPLATE_TEMPLATE_PARM. Set TYPE_BINFO for TYPENAME_TYPE ! and BOUND_TEMPLATE_TEMPLATE_PARM. ! * pt.c (tsubst): Use copy_type instead of copy_node. ! * search.c (lookup_field_1): Ignore TYPENAME_TYPE. ! ! 2001-10-12 Kriang Lerdsuwanakij ! ! * pt.c (determine_specialization): Ignore functions without ! DECL_TEMPLATE_INFO. ! ! 2001-10-12 Nathan Sidwell ! ! PR g++/4476 ! * typeck2.c (abstract_virtuals_error): Ignore incomplete classes. ! ! 2001-10-11 Jason Merrill ! ! * typeck2.c (store_init_value): Don't re-digest a bracketed ! initializer. ! ! * class.c (finish_struct_anon): Use TYPE_ANONYMOUS_P instead of ! ANON_AGGR_TYPE_P. ! ! 2001-10-11 Richard Henderson ! ! * class.c (build_vtable_entry_ref): Create a VTABLE_REF instead ! of an asm statement. ! (build_vtbl_ref_1): Split out from build_vtbl_ref. ! (build_vfn_ref): Use it to handle vtable descriptors before ! calling build_vtable_entry_ref. ! * decl2.c (output_vtable_inherit): Use assemble_vtable_inherit. ! ! 2001-10-10 Richard Henderson ! ! * parse.y (asm_operand): Allow named operands. ! * semantics.c (finish_asm_stmt): Tweek for changed location ! of the operand constrant. ! ! 2001-10-09 Jason Merrill ! ! * call.c (standard_conversion): Add bad conversion between ! integers and pointers. ! (convert_like_real): Don't use convert_for_initialization for bad ! conversions; complain here and use cp_convert. ! (build_over_call): Don't handle bad conversions specially. ! (perform_implicit_conversion): Allow bad conversions. ! (can_convert_arg_bad): New fn. ! * cp-tree.h: Declare it. ! * typeck.c (convert_for_assignment): Use it. ! (ptr_reasonably_similar): Any target type is similar to void. ! ! 2001-10-08 Alexandre Oliva ! ! * Make-lang.in (CXX_OBJS): Added cp-lang.o. ! (cp/cp-lang.o): New rule. ! * cp-tree.h: Declare hooks. ! * tree.c: Make hooks non-static. ! (init_tree): Don't initialize hooks here. ! * lex.c: Likewise. Move definition of lang_hooks to... ! * cp-lang.c: ... new file. ! ! 2001-10-08 Richard Henderson ! ! * cp-tree.h (struct lang_decl_flags): Remove declared_inline. ! (DECL_DECLARED_INLINE_P): Use the bit in struct c_lang_decl. ! ! 2001-10-07 Kaveh R. Ghazi ! ! * class.c (build_vtable_entry_ref): Const-ify. ! * decl.c (predefined_identifier, ! initialize_predefined_identifiers): Likewise. ! * init.c (build_new_1): Likewise. ! * lex.c (cplus_tree_code_type, cplus_tree_code_length, resword): ! Likewise. ! ! 2001-10-05 Alexandre Oliva ! ! * optimize.c (struct inline_data): Moved to ../tree-inline.c. ! (INSNS_PER_STMT): Likewise. ! (remap_decl, remap_block, copy_scopy_stmt, copy_body_r): Likewise. ! (copy_body, initialize_inlined_parameters): Likewise. ! (declare_return_variable, inlinable_function_p): Likewise. ! (expand_call_inline, expand_calls_inline): Likewise. ! (optimize_inline_calls, clone_body): Likewise. ! * tree.c (walk_tree): Moved to ../tree-inline.c. ! (walk_tree_without_duplicates): Likewise. ! (copy_tree_r, remap_save_expr): Likewise. ! ! 2001-10-04 Alexandre Oliva ! ! * Make-lang.in (cp/decl.o, cp/tree.o): Depend on tree-inline.h. ! (cp/pt.o, cp/semantics.o, cp/optimize.o): Likewise. ! * cp-tree.h (lang_decl): Moved inlined_fns to tree_decl. ! (TREE_READONLY_DECL_P, DECL_INLINED_FNS): Moved to ../tree.h. ! (flag_inline_trees): Moved declaration to ../tree-inline.h. ! (walk_tree): Moved declaration to ../tree-inline.h. ! (walk_tree_without_duplicates, copy_tree_r): Likewise. ! (remap_save_expr): Likewise. ! * decl.c: Include tree-inline.h. ! (lang_mark_tree): Don't mark inlined_fns. ! * decl2.c (flag_inline_trees): Moved defn to ../tree-inline.c. ! * optimize.c: Include tree-inline.h. ! (optimize_inline_calls): Move declaration to ../tree.h, as ! non-static. ! (remap_decl): Use language-independent constructs and hooks. ! (remap_block, copy_body_r, declare_return_variable): Likewise. ! (inlinable_function_p): Likewise. Don't test for ! DECL_LANG_SPECIFIC before DECL_INLINED_FNS as inlined_fns is ! no longer language-specific. ! (optimize_inline_calls): Likewise. Make it non-static. Moved ! call of dump_function to... ! (optimize_function): Here... ! (clone_body): New function, extracted from... ! (maybe_clone_body): ... here. Build decl_map locally and pass ! it on to clone_body. ! * pt.c, semantics.c: Include tree-inline.h. ! * tree.c: Likewise. ! (cp_walk_subtrees): New language-specific hook for tree inlining. ! (cp_cannot_inline_tree_fn, cp_add_pending_fn_decls, ! cp_is_overload_p, cp_auto_var_in_fn_p, ! cp_copy_res_decl_for_inlining): Likewise. ! (walk_tree): Move language-specific constructs into... ! (cp_walk_subtrees): this new function. ! (copy_tree_r): Use language-independent constructs and hooks. ! (init_tree): Initialize tree inlining hooks. ! (remap_save_expr): Adjust prototype so that the declaration ! does not require the definition of splay_tree. 2001-10-03 John David Anglin * rtti.c (get_tinfo_decl): Call typeinfo_in_lib_p with the type used to build the declaration instead of the declaration itself. ! 2001-10-02 Jason Merrill ! * decl2.c (cxx_decode_option): Add 'else'. ! ! * spew.c (end_input): No longer static. ! * cp-tree.h: Declare it. ! * parse.y (datadef): Add "error END_OF_SAVED_INPUT" expansion. ! ! 2001-10-02 Joseph S. Myers ! ! * call.c (build_over_call), typeck.c (build_function_call_real): ! Pass type attributes to check_function_format rather than name or ! assembler name. Don't require there to be a name or assembler ! name to check formats. ! ! 2001-10-02 Joseph S. Myers ! ! * decl.c (init_decl_processing): Don't call ! init_function_format_info. Initialize lang_attribute_table ! earlier. ! (builtin_function): Call decl_attributes. ! (insert_default_attributes): New. ! ! 2001-10-01 Jason Merrill ! ! * decl.c (grokdeclarator): Copy array typedef handling from C ! frontend. ! ! * decl.c (grokdeclarator): Copy too-large array handling from C ! frontend. ! ! 2001-09-29 Alexandre Oliva ! ! * config-lang.in (target_libs): Added target-gperf, so that we ! don't try to build it if C++ is disabled. ! ! 2001-09-23 Zack Weinberg ! ! * Make-lang.in (CXX_OBJS): Take out cp/errfn.o. ! (cp/errfn.o): Delete rule. ! (cp/error.o): Depend on flags.h. ! * errfn.c: Delete file. ! * cp-tree.h: Declare warn_deprecated. Remove definitions of ! TFF_NAMESPACE_SCOPE, TFF_CLASS_SCOPE, TFF_CHASE_NAMESPACE_ALIAS, ! and TFF_TEMPLATE_DEFAULT_ARGUMENTS. #define cp_error, cp_warning, ! cp_pedwarn, and cp_compiler_error to error, warning, pedwarn, and ! internal_error respectively. Make cp_deprecated into a macro. ! Don't define cp_printer typedef or declare cp_printers. ! * error.c: Include flags.h. ! Delete: struct tree_formatting_info, print_function_argument_list, ! print_declaration, print_expression, print_function_declaration, ! print_function_parameter, print_type_id, print_cv_qualifier_seq, ! print_type_specifier_seq, print_simple_type_specifier, ! print_elaborated_type_specifier, print_rest_of_abstract_declarator, ! print_parameter_declaration_clause, print_exception_specification, ! print_nested_name_specifier, and definition of cp_printers. ! (locate_error): New function. ! (cp_error_at, cp_warning_at, cp_pedwarn_at): Moved here and ! rewritten in terms of locate_error and diagnostic.c. ! (cp_tree_printer): Rename cp_printer; wire up to *_to_string ! instead of deleted print_* routines. Handle %C, %L, %O, %Q also. ! (init_error): Adjust to match. ! ! Sat Sep 22 09:15:31 2001 Richard Kenner ! ! * Make-lang.in (CXX_C_OBJS): Add attribs.o. 2001-09-21 Richard Henderson *************** *** 160,173 **** * call.c (build_over_call): Use it. * decl2.c (mark_vtable_entries): Mark FDESC_EXPR. * typeck.c (get_member_function_from_ptrfunc): Mind descriptors. ! * rtti.c (get_tinfo_decl_dynamic): Use build_vtbl_ref instead ! of build_vfn_ref. 2001-09-15 Gabriel Dos Reis * Make-lang.in (cp/error.o): Depend on real.h * error.c: #include "real.h" 2001-09-06 Nathan Sidwell PR c++/3986 --- 2161,2233 ---- * call.c (build_over_call): Use it. * decl2.c (mark_vtable_entries): Mark FDESC_EXPR. * typeck.c (get_member_function_from_ptrfunc): Mind descriptors. ! ! Fri Sep 21 08:16:19 2001 J"orn Rennecke ! ! * decl.c (grokdeclarator): Use C syntax for attr_flags declaration. ! ! 2001-09-21 Joseph S. Myers ! ! Table-driven attributes. ! * decl.c: Rename DECL_MACHINE_ATTRIBUTES to DECL_ATTRIBUTES. ! * decl2.c (cplus_decl_attributes): Only take one attributes ! parameter. ! * cp-tree.c (cplus_decl_attributes): Update prototype. ! * class.c (finish_struct), decl.c (start_decl, start_function), ! decl2.c (grokfield), friend.c (do_friend), parse.y ! (parse_bitfield): Update calls to cplus_decl_attributes. ! * decl.c (grokdeclarator): Take a pointer to a single ordinary ! attribute list. ! * decl.h (grokdeclarator): Update prototype. ! * decl2.c (grokfield): Take a single ordinary attribute list. ! * friend.c (do_friend): Likewise. ! * decl.c (shadow_tag, groktypename, start_decl, ! start_handler_parms, grokdeclarator, grokparms, start_function, ! start_method), decl2.c (grokfield, grokbitfield, grokoptypename), ! parse.y (parse_field, parse_bitfield, component_decl_1), pt.c ! (process_template_parm, do_decl_instantiation): Pass single ! ordinary attribute lists around. ! * decl.c (grokdeclarator): Correct handling of nested attributes. ! Revert the patch ! 1998-10-18 Jason Merrill ! * decl.c (grokdeclarator): Embedded attrs bind to the right, ! not the left. ! . ! * cp-tree.h (cp_valid_lang_attribute): Remove declaration ! (cp_attribute_table): Declare. ! * decl.c (valid_lang_attribute): Don't define. ! (lang_attribute_table): Define. ! (init_decl_processing): Initialize lang_attribute_table instead of ! valid_lang_attribute. ! * tree.c (cp_valid_lang_attribute): Remove. ! (handle_java_interface_attribute, handle_com_interface_attribute, ! handle_init_priority_attribute): New functions. ! (cp_attribute_table): New array. ! * decl2.c (import_export_class): Don't use ! targetm.valid_type_attribute. 2001-09-15 Gabriel Dos Reis * Make-lang.in (cp/error.o): Depend on real.h * error.c: #include "real.h" + 2001-09-15 Kaveh R. Ghazi + + * mangle.c (mangle_conv_op_name_for_type): Use concat in lieu of + xmalloc/strcpy/strcat. + + 2001-09-13 Kaveh R. Ghazi + + * decl.c (warn_extern_redeclared_static, cp_make_fname_decl): + Const-ification. + * pt.c (tsubst_decl): Likewise. + + 2001-09-12 Kaveh R. Ghazi + + * decl2.c (lang_f_options): Const-ification. + * lex.c (cplus_tree_code_name): Likewise. + * spew.c (yyerror): Likewise. + 2001-09-06 Nathan Sidwell PR c++/3986 *************** *** 178,185 **** (mark_primary_virtual_base): Remove BINFO parameter. (mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here. ! (binfo_ctor_vtable): Add prototype. ! (get_primary_binfo): Initialize RESULT. 2001-09-04 Nathan Sidwell --- 2238,2265 ---- (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 *************** *** 187,222 **** * call.c (build_over_call): Do not optimize any empty base construction. 2001-08-30 Kurt Garloff ! * optimize.c (inlinable_function_p): Allow only smaller single functions. Halve inline limit after reaching recursive limit. - - 2001-08-23 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-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-08-16 Mark Mitchell * cvt.c (convert_to_void): Preserve TREE_SIDE_EFFECTS on COMPOUND_EXPRs. 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-07 Nathan Sidwell PR c++/3820 --- 2267,2380 ---- * 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 *************** *** 231,243 **** * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): Mention _copy_ initialization. 2001-08-02 Nathan Sidwell ! Remove -fhonor-std. * NEWS: Document. ! * decl2.c (lang_f_options): Remove honor-std. (unsupported_options): Add honor-std. * lang-options.h: Remove -fhonor-std, -fno-honor-std. 2001-07-31 Nathan Sidwell --- 2389,2476 ---- * 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 *************** *** 250,255 **** --- 2483,2496 ---- * 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 *************** *** 262,267 **** --- 2503,2513 ---- * 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 *************** *** 278,287 **** --- 2524,2555 ---- 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 *************** *** 294,309 **** conversions on overloaded functions. (build_static_cast): Don't do a decay conversion here. - 2001-07-25 Jason Merrill - - PR c++/3529 - Copied from mainline. - * 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. - 2001-07-25 Nathan Sidwell PR c++/3543 --- 2562,2567 ---- *************** *** 312,330 **** --- 2570,2745 ---- 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 uninitialised + 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 + behaviour. 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 *************** *** 335,345 **** --- 2750,2870 ---- * 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 *************** *** 347,373 **** 2001-06-18 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. - * class.c (dfs_find_final_overrider): Fix logic. - - * 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. - - 20010617 Release Manager - - * GCC 3.0 Released. - 2001-06-14 Jason Merrill * class.c (update_vtable_entry_for_fn): Uncomment optimization to use virtual thunk instead of non-virtual. (get_matching_virtual): Uncomment. 2001-06-14 Nathan Sidwell * class.c (dfs_accumulate_vtbl_inits): For case 2 & 3, make sure --- 2872,2908 ---- 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 *************** *** 429,438 **** Don't clobber delta. (expand_ptrmemfunc_cst) [ptrmemfunc_vbit_in_delta]: Adjust pfn. ! 2001-06-08 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-06-08 Nathan Sidwell --- 2964,2986 ---- 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 *************** *** 480,488 **** * 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. --- 3028,3036 ---- * 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. *************** *** 495,500 **** --- 3043,3050 ---- * 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. *************** *** 520,525 **** --- 3070,3080 ---- 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. *************** *** 563,568 **** --- 3118,3131 ---- 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. *************** *** 580,585 **** --- 3143,3154 ---- 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 *************** *** 595,611 **** 2001-05-21 Jason Merrill * decl2.c (lang_f_options): Remove huge-objects, vtable-thunks. (unsupported_options): Correspondingly. ! 2001-05-19 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-20 Nathan Sidwell --- 3164,3200 ---- 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 *************** *** 613,712 **** * optimize.c (update_cloned_parm): Copy addressability and other flags. ! 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-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-12 Richard Henderson ! ! EH merge from mainline: ! 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. ! * 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. ! * 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. ! * except.c: Use USING_SJLJ_EXCEPTIONS instead of ! exceptions_via_longjmp. 2001-05-12 Alexandre Oliva --- 3202,3262 ---- * 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 *************** *** 715,726 **** build_ptrmemfunc, expand_ptrmemfunc_cst): Take TARGET_PTRMEMFUNC_VBIT_LOCATION into account. 2001-05-07 Mark Mitchell ! * class.c (walk_subobject_offsets): Add max_offset parameter. ! (record_subobject_offsets): Adjust call. ! (layout_conflict_p): Stop walking when we get past the last empty ! subobject. 2001-05-03 Mark Mitchell --- 3265,3307 ---- 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 *************** *** 746,752 **** * decl.c (compute_array_index_type): Don't try to do anything with the indices when processing a template. ! 2001-05-01 Mark Mitchell * decl2.c (do_using_directive): Revert previous patch. --- 3327,3348 ---- * 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 815,831 **** * method.c (use_thunk): Make sure that thunks really are emitted when requested. - Remove support for -Wextern-inline, -flabels-ok, -fvtable-gc, -fxref - * cp-tree.h (warn_extern_inline): Remove. - (flag_labels_ok): Likewise. - * decl2.c (warn_extern_inline): Remove. - (flag_labels_ok): Likewise. - (lang_f_options): Remove labels-ok, vtable-gc, xref. - (unsupported_options): Add them. - (cxx_decode_option): Don't accept -Wextern-inline. - * method.c (hack_identifier): Remove -flabels-ok support. - * spew.c (see_typename): Likewise. - 2001-04-26 Nathan Sidwell * mangle.c (write_chars): New macro. --- 3411,3416 ---- *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 851,862 **** walk_tree. (optimize_function): Initialize and free tree_pruner. 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 --- 3436,3498 ---- 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 875,880 **** --- 3511,3526 ---- 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 891,897 **** * 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 --- 3537,3543 ---- * 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 919,925 **** (expand_ptrmemfunc_cst): Remove idx and delta2 parameters. (delta2_from_ptrmemfunc): Remove. (pfn_from_ptrmemfunc): Adjust call to expand_ptrmemfunc_cst. ! 2001-04-11 Jason Merrill * cp-tree.h (TYPE_LINKAGE_IDENTIFIER): New macro. --- 3565,3600 ---- (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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 948,967 **** * optimize.c (maybe_clone_body): Copy DECL_NUM_STMTS from the cloned function to the clone. ! 2001-04-11 Jason Merrill ! * error.c (GLOBAL_THING): Always use '__'. 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 Richard Henderson - - * typeck.c (build_array_ref): Push the array reference inside - COMPOUND_EXPR and COND_EXPR. - 2001-04-10 Mark Mitchell * class.c (find_final_overrider_data): Add `candidates'. --- 3623,3639 ---- * 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'. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 972,977 **** --- 3644,3654 ---- (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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 984,994 **** (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-04 Jakub Jelinek * optimize.c (expand_call_inline): Only add newly inlined statements --- 3661,3676 ---- (import_export_decl): Likewise. * method.c (implicitly_declare_fn): Likewise. * optimize.c (maybe_clone_body): Likewise. ! 2001-04-05 Benjamin Kosnik * lang-specs.h: Add __DEPRECATED. ! ! Thu Apr 5 16:54:29 2001 J"orn Rennecke ! ! * search.c (get_dynamic_cast_base_type): When building a new ! constant, set its type to ssizetype. ! 2001-04-04 Jakub Jelinek * optimize.c (expand_call_inline): Only add newly inlined statements *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1005,1023 **** * rtti.c (get_tinfo_decl): Issue error messages about types that have variable size. - 2001-04-03 Gabriel Dos Reis - - Correct semantics restrictions checking in throw-expression. - * except.c (is_admissible_throw_operand): New function. - (build_throw): Use it. - 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-26 Mike Yang Mark Mitchell --- 3687,3789 ---- * 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1046,1058 **** rest_of_compilation. Clear DECL_RTL for local variables afterwards. (clear_decl_rtl): New function. ! ! 2001-03-26 Jakub Jelinek * mangle.c (write_discriminator): Use `_0' for discriminator 1, not `_'. ! 2001-03-26 Jakub Jelinek * decl.c (local_names): Define. (push_local_name): New. --- 3812,3847 ---- 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1087,1112 **** 2001-03-22 Bryce McKinlay - * call.c (build_java_interface_fn_ref): Fix local declarations. - - 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 Zack Weinberg ! * lang-specs.h: Add zero initializer for cpp_spec field to ! all array elements. Don't put an #ifdef inside the initializer ! list; set a default for CPLUSPLUS_CPP_SPEC and use it. 2001-03-22 Jakub Jelinek --- 3876,3903 ---- 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1120,1139 **** * pt.c (instantiate_decl): Abort if we see a member constant instantiation that doesn't already have its initializer. ! 2001-03-21 Mark Mitchell ! * class.c (build_clone): Clear DECL_ASSEMBLER_NAME. ! 2001-03-21 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-21 Mark Mitchell * mangle.c (mangle_decl_string): Mangle the names of overloaded operators, even when they have `extern "C"' linkage. --- 3911,3956 ---- * 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1198,1215 **** * 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 Neil Booth - - * lex.c: Delete duplicate pending_lang_change. - - 2001-03-15 Zack Weinberg - - * decl.c: Replace all uses of 'boolean' with 'bool'. - - 2001-03-15 Gabriel Dos Reis - - * except.c: Revert previous patch. 2001-03-15 Gabriel Dos Reis --- 4015,4020 ---- *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1222,1227 **** --- 4027,4034 ---- * 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1243,1259 **** (expand_body): Likewise. (genrtl_finish_function): Likewise. * tree.c (cp_tree_equal): Likewise. - - 2001-03-06 Zack Weinberg - - * spew.c: Remove references to CPP_OSTRING. - - 2001-03-06 Jeffrey Oldham ! * call.c (joust): Ensure more_specialized()'s argument length ! parameter has correct value for constructors. ! ! 2001-03-03 Nathan Sidwell * call.c (convert_like_real): Add extra semantics to INNER parameter. Don't convert to temporary if a user conversion --- 4050,4057 ---- (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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1261,1266 **** --- 4059,4101 ---- 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1271,1276 **** --- 4106,4122 ---- * 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1289,1296 **** 2001-02-28 Nathan Sidwell ! * pt.c (invalid_nontype_parm_type_p): Deprecate float and ! complex types. 2001-02-27 Nathan Sidwell --- 4135,4148 ---- 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1299,1305 **** (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 --- 4151,4157 ---- (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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1307,1316 **** --- 4159,4181 ---- 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1333,1349 **** (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 neccessary. (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-19 Mark Mitchell - - * decl2.c (set_decl_namespace): Allow explicit instantiations in - any namespace. - 2001-02-21 Jason Merrill * cp-tree.h (struct lang_decl_flags): Remove uninlinable flag. --- 4198,4209 ---- (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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1358,1363 **** --- 4218,4228 ---- * 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1368,1403 **** * class.c (add_vcall_offset_vtbl_entries_1): Only add one entry for a destructor. - 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-18 Jason Merrill Do put the VTT parameter in DECL_ARGUMENTS. --- 4233,4238 ---- *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1432,1448 **** * cp-tree.h: Declare it. * search.c (look_for_overrides_r): Use it. ! 2001-02-17 Anthony Green ! * lang-specs.h: Add more -D__EXCEPTIONS. 2001-02-17 Jason Merrill * 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-16 Jason Merrill * cp-tree.h (DECL_USE_VTT_PARM): Remove. --- 4267,4315 ---- * 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. *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1451,1485 **** * call.c (build_new_method_call): Check in_chrg instead. * init.c (expand_virtual_init): Likewise. 2001-02-16 Jakub Jelinek * call.c (convert_like_real): Create a temporary for non-lvalue. ! 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 Jason Merrill * optimize.c (remap_block): If we're compiling a clone, pass the new block to insert_block. ! 2001-02-14 Jakub Jelinek ! * typeck.c (build_unary_op): Clarify error message. 2001-02-15 Mark Mitchell * pt.c (push_template_decl_real): Don't remangle the name of a class template. 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 Nathan Sidwell * cp-tree.h (setup_vtbl_ptr): Move prototype to semantics.c --- 4318,4375 ---- * 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 *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1509,1531 **** * tree.c (cp_build_qualified_type_real): Use CP_TYPE_QUALS to check whether we already have the type. - 2001-02-14 Nathan Sidwell - - * typeck2.c (process_init_constructor): Check - TREE_HAS_CONSTRUCTOR before issuing missing init warning. - - 2001-02-14 Nathan Sidwell - - * errfn.c (cp_deprecated): Tweak diagnostic text. - * parse.y (new_initializer): Deprecate initializer lists - extension. - - 2001-02-14 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-13 Mark Mitchell * cp-tree.h (CLASSTYPE_DESTRUCTORS): Fix typo in comment. --- 4399,4404 ---- *************** Mon Apr 30 16:14:10 2001 Mark P Mitchel *** 1542,1547 **** --- 4415,4437 ---- * 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. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 2104,2110 **** * decl.c (struct binding_level): Adjust class_shadowed comments to reflect reality. ! (push_class_level_binding): Ajust comments to reflect reality. Set IDENTIFIER_CLASS_VALUE when replacing an existing binding. Don't set TREE_VALUE on the class_shadowed list. --- 4994,5000 ---- * 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. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 2405,2412 **** * class.c (check_field_decls): Don't special case anonymous fields in error messages. ! (note_name_declared_inpwdpwd ! _class): Use %D on diagnostic. * tree.c (pod_type_p): Use strip_array_types. (cp_valid_lang_attribute): Likewise. --- 5295,5301 ---- * 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. *************** Wed Jul 26 15:05:51 CEST 2000 Marc Espie *** 4859,4865 **** 2000-06-23 Kriang Lerdsuwanakij * parse.y (template_arg): Convert TEMPLATE_DECL ! that is a template template paramter to TEMPLATE_TEMPLATE_PARM here. * cp-tree.def (TEMPLATE_TEMPLATE_PARM): Adjust comment. --- 7748,7754 ---- 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. *************** Sat May 27 11:25:46 2000 Richard Kenner *** 5869,5875 **** (DECL_USE_VTT_PARM): Likewise. (DECL_NEEDS_VTT_PARM_P): Likewise. (get_vtt_name): Declare. ! (build_artifical_parm): Likewise. (fixup_all_virtual_upcast_offsets): Likewise. (expand_indirect_vtbls_init): Remove. * call.c (build_new_method_call): Pass the vtt to subobject --- 8758,8764 ---- (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 *************** Sat May 27 11:25:46 2000 Richard Kenner *** 5924,5933 **** * tinfo.h (__user_type_info::contained_virtual_p): New predicate. * tinfo.cc (__user_type_info::do_upcast): Fix bug with diamond ! shaped heirarchy. (__vmi_class_type_info::__do_upcast): Fix bug with NULL pointer to ! diamond shaped heirarchy. Add early out for mixed diamond and ! duplicate shaped heirarchy. 2000-05-24 Mark Mitchell --- 8813,8822 ---- * 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 *************** Mon May 15 11:46:29 2000 Donald Lindsay *** 5972,5978 **** (__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 heirarchy bug. 2000-05-23 Mark Mitchell --- 8861,8867 ---- (__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 *************** Sat Apr 15 16:00:01 2000 Richard Kenner *** 7087,7093 **** 2000-04-05 Benjamin Kosnik ! * decl2.c: Make flag_honor_std dependant on ENABLE_STD_NAMESPACE. 2000-04-05 Mark Mitchell --- 9976,9982 ---- 2000-04-05 Benjamin Kosnik ! * decl2.c: Make flag_honor_std dependent on ENABLE_STD_NAMESPACE. 2000-04-05 Mark Mitchell *************** Mon Mar 6 08:46:47 2000 Richard Kenner *** 7914,7920 **** (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 throught 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. --- 10803,10809 ---- (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. *************** Wed Jan 26 22:19:14 2000 J"orn Rennecke *** 8943,8950 **** (expand_attr_desc): Likewise. (expand_generic_desc): Likewise. ! * tinfo.cc (__GXX_ABI_VERSION): Test value and existance. ! * tinfo.h (__GXX_ABI_VERSION): Test value and existance. 2000-01-23 Mark Mitchell --- 11832,11839 ---- (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 *************** Wed Jan 26 22:19:14 2000 J"orn Rennecke *** 9012,9018 **** 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 diagnotic message routines into a single one. * typeck2.c (readonly_error, abstract_virtuals_error, process_init_constructor, check_for_new_type): Likewise. --- 11901,11907 ---- 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. diff -Nrc3pad gcc-3.0.4/gcc/cp/ChangeLog.1 gcc-3.1/gcc/cp/ChangeLog.1 *** gcc-3.0.4/gcc/cp/ChangeLog.1 Tue Apr 13 22:45:34 1999 --- gcc-3.1/gcc/cp/ChangeLog.1 Sun Dec 16 16:06:57 2001 *************** Wed Jul 19 13:23:12 1995 Gerald Baumgar *** 753,759 **** (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_identifer and vt_off, respecitively. * sig.c (build_signature_table_constructor): Renamed offset to vt_off. * decl.c (init_decl_processing): Add vb_off field to --- 753,759 ---- (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 *************** Mon Mar 6 15:07:02 1995 Jason Merrill *** 2309,2315 **** function. Make base initialization more re-entrant so that synthesis on the ! fly will work (and, eventually, template instantation 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 --- 2309,2315 ---- 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 diff -Nrc3pad gcc-3.0.4/gcc/cp/ChangeLog.2 gcc-3.1/gcc/cp/ChangeLog.2 *** gcc-3.0.4/gcc/cp/ChangeLog.2 Sun Jul 2 03:01:47 2000 --- gcc-3.1/gcc/cp/ChangeLog.2 Sun Dec 16 16:06:57 2001 *************** Wed Oct 13 22:01:35 1999 J"orn Rennecke *** 1216,1222 **** 1999-10-07 Mark Mitchell * pt.c (tsubst_expr): Set DECL_TEMPLATE_INSTANTIATED for a catch ! paramter. * semantics.c (expand_stmt): Don't pretend to have asmspecs for local statics if we don't really have them. --- 1216,1222 ---- 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. *************** Wed Oct 13 22:01:35 1999 J"orn Rennecke *** 1357,1363 **** (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 intializer. * pt.c (begin_tree): Remove. (end_tree): Likewise. * semantics.c (SET_LAST_STMT): New macro. Use it throughout. --- 1357,1363 ---- (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. *************** Thu Sep 30 00:13:27 1999 Dirk Zoller < *** 1463,1469 **** (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 intialize 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. --- 1463,1469 ---- (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. *************** Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi *** 2255,2261 **** if appropriate. (finish_decl_cleanup): New function. (expand_stmt): Use emit_local_var to output variables. ! (expand_body): Set current_funtion_name_declared. 1999-09-10 Mark Mitchell --- 2255,2261 ---- 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 *************** Mon Aug 23 22:17:20 1999 Mumit Khan * class.c (finish_vtbls): Copy BINFO_VIRTUALs before using it to ! intialize a vtable. * cp-tree.h (NAMESPACE_LEVEL): Reformat. (lang_decl_flags): Document MEMFUNC_POINTER_TO. Save four bytes --- 4670,4676 ---- 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 *************** Thu Feb 18 23:40:01 1999 Kaveh R. Ghazi *** 6427,6433 **** 1999-02-10 Jason Merrill ! * decl.c (grokdeclarator): Catch wierd declarators. * decl2.c (finish_file): Don't abort because of namespace parsing failure. (check_decl_namespace): Remove. --- 6427,6433 ---- 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. *************** Fri Aug 14 16:42:27 1998 Nick Clifton *** 9673,9679 **** push_template_decl_real instead of push_template_decl. * method.c (build_decl_overload_real): Remove prototype. Give it external linkage. ! (build_overload_identififer): 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. --- 9673,9679 ---- 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. diff -Nrc3pad gcc-3.0.4/gcc/cp/Make-lang.in gcc-3.1/gcc/cp/Make-lang.in *** gcc-3.0.4/gcc/cp/Make-lang.in Wed Nov 14 22:33:42 2001 --- gcc-3.1/gcc/cp/Make-lang.in Sat Mar 16 00:59:04 2002 *************** *** 38,51 **** # - define the names for selecting the language in LANGUAGES. # Actual names to use when installing a native compiler. ! CXX_INSTALL_NAME = `t='$(program_transform_name)'; echo c++ | sed $$t` ! GXX_INSTALL_NAME = `t='$(program_transform_name)'; echo g++ | sed $$t` ! DEMANGLER_INSTALL_NAME = `t='$(program_transform_name)'; echo c++filt | sed $$t` # Actual names to use when installing a cross-compiler. ! CXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++ | sed $$t` ! GXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo g++ | sed $$t` ! DEMANGLER_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++filt | sed $$t` # The name to use for the demangler program. DEMANGLER_PROG = c++filt$(exeext) --- 38,53 ---- # - define the names for selecting the language in LANGUAGES. # Actual names to use when installing a native compiler. ! CXX_INSTALL_NAME = `echo c++|sed '$(program_transform_name)'` ! GXX_INSTALL_NAME = `echo g++|sed '$(program_transform_name)'` ! DEMANGLER_INSTALL_NAME = `echo c++filt|sed '$(program_transform_name)'` ! CXX_TARGET_INSTALL_NAME = $(target_alias)-`echo c++|sed '$(program_transform_name)'` ! GXX_TARGET_INSTALL_NAME = $(target_alias)-`echo g++|sed '$(program_transform_name)'` # Actual names to use when installing a cross-compiler. ! CXX_CROSS_NAME = `echo c++|sed '$(program_transform_cross_name)'` ! GXX_CROSS_NAME = `echo g++|sed '$(program_transform_cross_name)'` ! DEMANGLER_CROSS_NAME = `echo c++filt|sed '$(program_transform_cross_name)'` # The name to use for the demangler program. DEMANGLER_PROG = c++filt$(exeext) *************** C++ c++: cc1plus$(exeext) *** 60,72 **** # Tell GNU make to ignore these if they exist. .PHONY: C++ c++ ! g++spec.o: $(srcdir)/cp/g++spec.c system.h $(GCC_H) $(CONFIG_H) (SHLIB_LINK='$(SHLIB_LINK)' \ SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \ $(INCLUDES) $(srcdir)/cp/g++spec.c) ! $(INTL_TARGETS): $(srcdir)/cp/parse.c # Create the compiler driver for g++. GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o --- 62,74 ---- # Tell GNU make to ignore these if they exist. .PHONY: C++ c++ ! g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) $(GCC_H) $(CONFIG_H) (SHLIB_LINK='$(SHLIB_LINK)' \ SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \ $(INCLUDES) $(srcdir)/cp/g++spec.c) ! po-generated: $(srcdir)/cp/parse.c # Create the compiler driver for g++. GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o *************** $(DEMANGLER_PROG): cxxmain.o underscore. *** 93,106 **** # The compiler itself. # Shared with C front end: ! CXX_C_OBJS = c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o c-dump.o $(CXX_TARGET_OBJS) # Language-specific object files. ! CXX_OBJS = cp/call.o cp/decl.o cp/errfn.o cp/expr.o cp/pt.o cp/typeck2.o \ cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parse.o cp/ptree.o cp/rtti.o \ cp/spew.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/xref.o cp/repo.o cp/dump.o \ ! cp/optimize.o cp/mangle.o # Use loose warnings for this front end. cp-warn = --- 95,109 ---- # The compiler itself. # Shared with C front end: ! CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \ ! $(CXX_TARGET_OBJS) # Language-specific object files. ! CXX_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/parse.o cp/ptree.o cp/rtti.o \ cp/spew.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-lang.o # Use loose warnings for this front end. cp-warn = *************** $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.g *** 115,125 **** gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' \ $(srcdir)/cp/cfns.gperf > $(srcdir)/cp/cfns.h ! $(srcdir)/cp/parse.h $(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y @echo "Expect 33 shift/reduce conflicts and 58 reduce/reduce conflicts." ! cd $(srcdir)/cp; $(BISON) $(BISONFLAGS) -d -o p$$$$.c parse.y ; \ ! grep '^#define[ ]*YYEMPTY' p$$$$.c >> p$$$$.h ; \ ! mv -f p$$$$.c parse.c ; mv -f p$$$$.h parse.h # # Build hooks: --- 118,135 ---- gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' \ $(srcdir)/cp/cfns.gperf > $(srcdir)/cp/cfns.h ! $(srcdir)/cp/parse.h: $(srcdir)/cp/parse.c ! $(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y @echo "Expect 33 shift/reduce conflicts and 58 reduce/reduce conflicts." ! cd $(srcdir)/cp && \ ! if $(BISON) $(BISONFLAGS) -d -o p$$$$.c parse.y; then \ ! grep '^#define[ ]*YYEMPTY' p$$$$.c >> p$$$$.h ; \ ! test -f p$$$$.output && mv -f p$$$$.output parse.output ; \ ! mv -f p$$$$.c parse.c ; mv -f p$$$$.h parse.h ; \ ! else \ ! rm -f p$$$$.* ; \ ! false ; \ ! fi # # Build hooks: *************** c++.rest.encap: $(DEMANGLER_PROG) *** 131,136 **** --- 141,147 ---- c++.info: c++.dvi: + c++.generated-manpages: # # Install hooks: *************** c++.install-normal: *** 141,147 **** # Install the driver program as $(target)-g++ # and also as either g++ (if native) or $(tooldir)/bin/g++. ! c++.install-common: -if [ -f cc1plus$(exeext) ] ; then \ if [ -f g++-cross$(exeext) ] ; then \ rm -f $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ --- 152,158 ---- # Install the driver program as $(target)-g++ # and also as either g++ (if native) or $(tooldir)/bin/g++. ! c++.install-common: installdirs -if [ -f cc1plus$(exeext) ] ; then \ if [ -f g++-cross$(exeext) ] ; then \ rm -f $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ *************** c++.install-common: *** 161,170 **** chmod a+x $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ rm -f $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ ! rm -f $(bindir)/$(target_alias)-g++$(exeext); \ ! $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-g++$(exeext); \ ! rm -f $(bindir)/$(target_alias)-c++$(exeext); \ ! $(LN) $(bindir)/$(CXX_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-c++$(exeext); \ fi ; \ if [ x$(DEMANGLER_PROG) != x ] && [ -x "$(DEMANGLER_PROG)" ]; then \ if [ -f g++-cross$(exeext) ] ; then \ --- 172,181 ---- chmod a+x $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ rm -f $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ ! rm -f $(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \ ! $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \ ! rm -f $(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \ ! $(LN) $(bindir)/$(CXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \ fi ; \ if [ x$(DEMANGLER_PROG) != x ] && [ -x "$(DEMANGLER_PROG)" ]; then \ if [ -f g++-cross$(exeext) ] ; then \ *************** c++.install-common: *** 179,187 **** fi ; \ fi ! c++.install-info: ! c++.install-man: $(srcdir)/cp/g++.1 -if [ -f cc1plus$(exeext) ] ; then \ if [ -f g++-cross$(exeext) ] ; then \ rm -f $(man1dir)/$(GXX_CROSS_NAME)$(man1ext); \ --- 190,198 ---- fi ; \ fi ! c++.install-info: ! c++.install-man: installdirs $(srcdir)/cp/g++.1 -if [ -f cc1plus$(exeext) ] ; then \ if [ -f g++-cross$(exeext) ] ; then \ rm -f $(man1dir)/$(GXX_CROSS_NAME)$(man1ext); \ *************** c++.stage4: stage4-start *** 233,254 **** # # .o: .h dependencies. CXX_TREE_H = $(TREE_H) cp/cp-tree.h c-common.h cp/cp-tree.def c-common.def \ ! function.h varray.h system.h $(CONFIG_H) \ $(srcdir)/../include/hashtab.h $(srcdir)/../include/splay-tree.h cp/spew.o: cp/spew.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h toplev.h cp/lex.o: cp/lex.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h c-pragma.h \ toplev.h output.h mbchar.h $(GGC_H) input.h diagnostic.h cp/operators.def \ $(TM_P_H) cp/decl.o: cp/decl.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h stack.h \ output.h $(EXPR_H) except.h toplev.h hash.h $(GGC_H) $(RTL_H) \ ! $(TM_P_H) cp/operators.def cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \ ! output.h except.h toplev.h dwarf2out.h dwarfout.h $(GGC_H) $(RTL_H) ! cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H) ! cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h ! cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) ! cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) $(GGC_H) cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H) cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \ $(GGC_H) except.h --- 244,270 ---- # # .o: .h dependencies. CXX_TREE_H = $(TREE_H) cp/cp-tree.h c-common.h cp/cp-tree.def c-common.def \ ! function.h varray.h $(SYSTEM_H) $(CONFIG_H) $(TARGET_H) \ $(srcdir)/../include/hashtab.h $(srcdir)/../include/splay-tree.h cp/spew.o: cp/spew.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h toplev.h cp/lex.o: cp/lex.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h c-pragma.h \ toplev.h output.h mbchar.h $(GGC_H) input.h diagnostic.h cp/operators.def \ $(TM_P_H) + cp/cp-lang.o: cp/cp-lang.c $(CXX_TREE_H) toplev.h langhooks.h langhooks-def.h \ + c-common.h cp/decl.o: cp/decl.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h stack.h \ output.h $(EXPR_H) except.h toplev.h hash.h $(GGC_H) $(RTL_H) \ ! cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h c-pragma.h cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \ ! output.h except.h toplev.h $(GGC_H) $(RTL_H) ! cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H) \ ! diagnostic.h ! cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \ ! diagnostic.h ! cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(TARGET_H) ! cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) \ ! $(GGC_H) diagnostic.h cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H) cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \ $(GGC_H) except.h *************** cp/method.o: cp/method.c $(CXX_TREE_H) t *** 257,284 **** cp/cvt.o: cp/cvt.c $(CXX_TREE_H) cp/decl.h flags.h toplev.h convert.h cp/search.o: cp/search.c $(CXX_TREE_H) stack.h flags.h toplev.h $(RTL_H) cp/tree.o: cp/tree.c $(CXX_TREE_H) flags.h toplev.h $(GGC_H) $(RTL_H) \ ! insn-config.h integrate.h ! cp/ptree.o: cp/ptree.c $(CXX_TREE_H) system.h cp/rtti.o: cp/rtti.c $(CXX_TREE_H) flags.h toplev.h cp/except.o: cp/except.c $(CXX_TREE_H) flags.h $(RTL_H) except.h toplev.h \ ! cp/cfns.h $(EXPR_H) cp/decl.h $(OBSTACK_H) cp/expr.o: cp/expr.c $(CXX_TREE_H) $(RTL_H) flags.h $(EXPR_H) toplev.h \ except.h $(TM_P_H) - cp/xref.o: cp/xref.c $(CXX_TREE_H) input.h toplev.h cp/pt.o: cp/pt.c $(CXX_TREE_H) cp/decl.h cp/parse.h cp/lex.h toplev.h \ ! $(GGC_H) $(RTL_H) except.h ! cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h real.h ! cp/errfn.o: cp/errfn.c $(CXX_TREE_H) toplev.h ! cp/repo.o: cp/repo.c $(CXX_TREE_H) toplev.h $(GGC_H) cp/semantics.o: cp/semantics.c $(CXX_TREE_H) cp/lex.h except.h toplev.h \ ! flags.h $(GGC_H) output.h $(RTL_H) $(TIMEVAR_H) ! cp/dump.o: cp/dump.c $(CXX_TREE_H) c-dump.h cp/optimize.o: cp/optimize.c $(CXX_TREE_H) rtl.h integrate.h insn-config.h \ ! input.h $(PARAMS_H) cp/mangle.o: cp/mangle.c $(CXX_TREE_H) toplev.h cp/parse.o: cp/parse.c $(CXX_TREE_H) flags.h cp/lex.h except.h output.h \ ! system.h toplev.h $(GGC_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(BIG_SWITCHFLAG) \ $(srcdir)/cp/parse.c $(OUTPUT_OPTION) # --- 273,299 ---- cp/cvt.o: cp/cvt.c $(CXX_TREE_H) cp/decl.h flags.h toplev.h convert.h cp/search.o: cp/search.c $(CXX_TREE_H) stack.h flags.h toplev.h $(RTL_H) cp/tree.o: cp/tree.c $(CXX_TREE_H) flags.h toplev.h $(GGC_H) $(RTL_H) \ ! insn-config.h integrate.h tree-inline.h ! cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(SYSTEM_H) cp/rtti.o: cp/rtti.c $(CXX_TREE_H) flags.h toplev.h cp/except.o: cp/except.c $(CXX_TREE_H) flags.h $(RTL_H) except.h toplev.h \ ! cp/cfns.h $(EXPR_H) libfuncs.h cp/decl.h $(OBSTACK_H) cp/expr.o: cp/expr.c $(CXX_TREE_H) $(RTL_H) flags.h $(EXPR_H) toplev.h \ except.h $(TM_P_H) cp/pt.o: cp/pt.c $(CXX_TREE_H) cp/decl.h cp/parse.h cp/lex.h toplev.h \ ! $(GGC_H) $(RTL_H) except.h tree-inline.h ! cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h flags.h real.h ! cp/repo.o: cp/repo.c $(CXX_TREE_H) toplev.h $(GGC_H) diagnostic.h cp/semantics.o: cp/semantics.c $(CXX_TREE_H) cp/lex.h except.h toplev.h \ ! flags.h $(GGC_H) debug.h output.h $(RTL_H) $(TIMEVAR_H) $(EXPR_H) \ ! tree-inline.h ! cp/dump.o: cp/dump.c $(CXX_TREE_H) tree-dump.h cp/optimize.o: cp/optimize.c $(CXX_TREE_H) rtl.h integrate.h insn-config.h \ ! input.h $(PARAMS_H) debug.h tree-inline.h cp/mangle.o: cp/mangle.c $(CXX_TREE_H) toplev.h cp/parse.o: cp/parse.c $(CXX_TREE_H) flags.h cp/lex.h except.h output.h \ ! $(SYSTEM_H) toplev.h $(GGC_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(BIG_SWITCHFLAG) \ $(srcdir)/cp/parse.c $(OUTPUT_OPTION) # diff -Nrc3pad gcc-3.0.4/gcc/cp/NEWS gcc-3.1/gcc/cp/NEWS *** gcc-3.0.4/gcc/cp/NEWS Thu Aug 2 14:23:11 2001 --- gcc-3.1/gcc/cp/NEWS Tue Mar 19 00:21:55 2002 *************** *** 1,9 **** ! *** Changes in GCC 3.0.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. *** Changes in GCC 3.0: * Support for guiding declarations has been removed. --- 1,68 ---- ! *** 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. diff -Nrc3pad gcc-3.0.4/gcc/cp/call.c gcc-3.1/gcc/cp/call.c *** gcc-3.0.4/gcc/cp/call.c Thu Nov 29 20:16:18 2001 --- gcc-3.1/gcc/cp/call.c Sat Apr 13 01:31:06 2002 *************** *** 1,6 **** /* Functions related to invoking methods and overloaded functions. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) and modified by Brendan Kehoe (brendan@cygnus.com). --- 1,6 ---- /* Functions related to invoking methods and overloaded functions. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) and modified by Brendan Kehoe (brendan@cygnus.com). *************** Boston, MA 02111-1307, USA. */ *** 34,39 **** --- 34,40 ---- #include "toplev.h" #include "expr.h" #include "ggc.h" + #include "diagnostic.h" extern int inhibit_warnings; *************** static int joust PARAMS ((struct z_candi *** 46,53 **** static int compare_ics PARAMS ((tree, tree)); static tree build_over_call PARAMS ((struct z_candidate *, tree, int)); static tree build_java_interface_fn_ref PARAMS ((tree, tree)); ! #define convert_like(CONV, EXPR) convert_like_real (CONV, EXPR, NULL_TREE, 0, 0) ! #define convert_like_with_context(CONV, EXPR, FN, ARGNO) convert_like_real (CONV, EXPR, FN, ARGNO, 0) static tree convert_like_real PARAMS ((tree, tree, tree, int, int)); static void op_error PARAMS ((enum tree_code, enum tree_code, tree, tree, tree, const char *)); --- 47,56 ---- static int compare_ics PARAMS ((tree, tree)); static tree build_over_call PARAMS ((struct z_candidate *, tree, int)); static tree build_java_interface_fn_ref PARAMS ((tree, tree)); ! #define convert_like(CONV, EXPR) \ ! convert_like_real ((CONV), (EXPR), NULL_TREE, 0, 0) ! #define convert_like_with_context(CONV, EXPR, FN, ARGNO) \ ! convert_like_real ((CONV), (EXPR), (FN), (ARGNO), 0) static tree convert_like_real PARAMS ((tree, tree, tree, int, int)); static void op_error PARAMS ((enum tree_code, enum tree_code, tree, tree, tree, const char *)); *************** build_field_call (basetype_path, instanc *** 147,153 **** { /* If it's a field, try overloading operator (), or calling if the field is a pointer-to-function. */ ! instance = build_indirect_ref (instance_ptr, NULL_PTR); instance = build_component_ref_1 (instance, field, 0); if (instance == error_mark_node) --- 150,156 ---- { /* If it's a field, try overloading operator (), or calling if the field is a pointer-to-function. */ ! instance = build_indirect_ref (instance_ptr, NULL); instance = build_component_ref_1 (instance, field, 0); if (instance == error_mark_node) *************** check_dtor_name (basetype, name) *** 193,200 **** else name = get_type_value (name); } else ! my_friendly_abort (980605); if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) return 1; --- 196,212 ---- else name = get_type_value (name); } + /* In the case of: + + template struct S { ~S(); }; + int i; + i.~S(); + + NAME will be a class template. */ + else if (DECL_CLASS_TEMPLATE_P (name)) + return 0; else ! abort (); if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) return 1; *************** build_scoped_method_call (exp, basetype, *** 255,261 **** return build_method_call (exp, name, parms, NULL_TREE, LOOKUP_NORMAL); if (! check_dtor_name (basetype, name)) ! cp_error ("qualified type `%T' does not match destructor name `~%T'", basetype, TREE_OPERAND (name, 0)); /* Destructors can be "called" for simple types; see 5.2.4 and 12.4 Note --- 267,273 ---- return build_method_call (exp, name, parms, NULL_TREE, LOOKUP_NORMAL); if (! check_dtor_name (basetype, name)) ! error ("qualified type `%T' does not match destructor name `~%T'", basetype, TREE_OPERAND (name, 0)); /* Destructors can be "called" for simple types; see 5.2.4 and 12.4 Note *************** build_scoped_method_call (exp, basetype, *** 264,270 **** if (! IS_AGGR_TYPE (basetype)) { if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype)) ! cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')", exp, basetype, type); return cp_convert (void_type_node, exp); --- 276,282 ---- if (! IS_AGGR_TYPE (basetype)) { if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype)) ! error ("type of `%E' does not match destructor type `%T' (type was `%T')", exp, basetype, type); return cp_convert (void_type_node, exp); *************** build_scoped_method_call (exp, basetype, *** 273,279 **** if (TREE_CODE (basetype) == NAMESPACE_DECL) { ! cp_error ("`%D' is a namespace", basetype); return error_mark_node; } if (! is_aggr_type (basetype, 1)) --- 285,291 ---- if (TREE_CODE (basetype) == NAMESPACE_DECL) { ! error ("`%D' is a namespace", basetype); return error_mark_node; } if (! is_aggr_type (basetype, 1)) *************** build_scoped_method_call (exp, basetype, *** 281,294 **** if (! IS_AGGR_TYPE (type)) { ! cp_error ("base object `%E' of scoped method call is of non-aggregate type `%T'", exp, type); return error_mark_node; } if (! binfo) { ! binfo = get_binfo (basetype, type, 1); if (binfo == error_mark_node) return error_mark_node; if (! binfo) --- 293,306 ---- if (! IS_AGGR_TYPE (type)) { ! error ("base object `%E' of scoped method call is of non-aggregate type `%T'", exp, type); return error_mark_node; } if (! binfo) { ! binfo = lookup_base (type, basetype, ba_check, NULL); if (binfo == error_mark_node) return error_mark_node; if (! binfo) *************** build_scoped_method_call (exp, basetype, *** 298,306 **** if (binfo) { if (TREE_CODE (exp) == INDIRECT_REF) ! decl = build_indirect_ref ! (convert_pointer_to_real ! (binfo, build_unary_op (ADDR_EXPR, exp, 0)), NULL_PTR); else decl = build_scoped_ref (exp, basetype); --- 310,321 ---- if (binfo) { if (TREE_CODE (exp) == INDIRECT_REF) ! { ! decl = build_base_path (PLUS_EXPR, ! build_unary_op (ADDR_EXPR, exp, 0), ! binfo, 1); ! decl = build_indirect_ref (decl, NULL); ! } else decl = build_scoped_ref (exp, basetype); *************** build_call (function, parms) *** 392,398 **** throw without being declared throw(). */ nothrow = ((decl && TREE_NOTHROW (decl)) || TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function)))); ! if (decl && DECL_CONSTRUCTOR_P (decl)) is_constructor = 1; --- 407,419 ---- throw without being declared throw(). */ nothrow = ((decl && TREE_NOTHROW (decl)) || TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function)))); ! ! if (decl && TREE_THIS_VOLATILE (decl)) ! current_function_returns_abnormally = 1; ! ! if (decl && TREE_DEPRECATED (decl)) ! warn_deprecated_use (decl); ! if (decl && DECL_CONSTRUCTOR_P (decl)) is_constructor = 1; *************** build_call (function, parms) *** 405,411 **** || !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "__", 2)) mark_used (decl); else ! my_friendly_abort (990125); } /* Don't pass empty class objects by value. This is useful --- 426,432 ---- || !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "__", 2)) mark_used (decl); else ! abort (); } /* Don't pass empty class objects by value. This is useful *************** build_method_call (instance, name, parms *** 512,518 **** basetype = TREE_TYPE (basetype); if (! check_dtor_name (basetype, name)) ! cp_error ("destructor name `~%T' does not match type `%T' of expression", TREE_OPERAND (name, 0), basetype); --- 533,539 ---- basetype = TREE_TYPE (basetype); if (! check_dtor_name (basetype, name)) ! error ("destructor name `~%T' does not match type `%T' of expression", TREE_OPERAND (name, 0), basetype); *************** struct z_candidate { *** 551,557 **** #define BAD_RANK 7 #define ICS_RANK(NODE) \ ! (ICS_BAD_FLAG (NODE) ? BAD_RANK \ : ICS_ELLIPSIS_FLAG (NODE) ? ELLIPSIS_RANK \ : ICS_USER_FLAG (NODE) ? USER_RANK \ : ICS_STD_RANK (NODE)) --- 572,578 ---- #define BAD_RANK 7 #define ICS_RANK(NODE) \ ! (ICS_BAD_FLAG (NODE) ? BAD_RANK \ : ICS_ELLIPSIS_FLAG (NODE) ? ELLIPSIS_RANK \ : ICS_USER_FLAG (NODE) ? USER_RANK \ : ICS_STD_RANK (NODE)) *************** struct z_candidate { *** 565,571 **** /* In a REF_BIND or a BASE_CONV, this indicates that a temporary should be created to hold the result of the conversion. */ ! #define NEED_TEMPORARY_P(NODE) (TREE_LANG_FLAG_4 ((NODE))) #define USER_CONV_CAND(NODE) \ ((struct z_candidate *)WRAPPER_PTR (TREE_OPERAND (NODE, 1))) --- 586,592 ---- /* In a REF_BIND or a BASE_CONV, this indicates that a temporary should be created to hold the result of the conversion. */ ! #define NEED_TEMPORARY_P(NODE) TREE_LANG_FLAG_4 (NODE) #define USER_CONV_CAND(NODE) \ ((struct z_candidate *)WRAPPER_PTR (TREE_OPERAND (NODE, 1))) *************** standard_conversion (to, from, expr) *** 684,690 **** if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) && expr && type_unknown_p (expr)) { ! expr = instantiate_type (to, expr, itf_none); if (expr == error_mark_node) return NULL_TREE; from = TREE_TYPE (expr); --- 705,711 ---- if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) && expr && type_unknown_p (expr)) { ! expr = instantiate_type (to, expr, tf_none); if (expr == error_mark_node) return NULL_TREE; from = TREE_TYPE (expr); *************** standard_conversion (to, from, expr) *** 738,743 **** --- 759,780 ---- { conv = build_conv (STD_CONV, 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 (STD_CONV, to, conv); + ICS_BAD_FLAG (conv) = 1; + } + else if (tcode == ENUMERAL_TYPE && fcode == INTEGER_TYPE + && TYPE_PRECISION (to) == TYPE_PRECISION (from)) + { + /* For backwards brain damage compatibility, allow interconversion of + enums and integers with a pedwarn. */ + conv = build_conv (STD_CONV, to, conv); + ICS_BAD_FLAG (conv) = 1; + } else if (tcode == POINTER_TYPE && fcode == POINTER_TYPE) { enum tree_code ufcode = TREE_CODE (TREE_TYPE (from)); *************** standard_conversion (to, from, expr) *** 751,766 **** { from = build_pointer_type (cp_build_qualified_type (void_type_node, ! CP_TYPE_QUALS (TREE_TYPE (from)))); conv = build_conv (PTR_CONV, from, conv); } else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE) { tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from)); tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to)); - tree binfo = get_binfo (fbase, tbase, 1); ! if (binfo && !binfo_from_vbase (binfo) && (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (TREE_TYPE (from)), TREE_TYPE (TREE_TYPE (to))))) --- 788,802 ---- { from = build_pointer_type (cp_build_qualified_type (void_type_node, ! cp_type_quals (TREE_TYPE (from)))); conv = build_conv (PTR_CONV, from, conv); } else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE) { tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from)); tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to)); ! if (DERIVED_FROM_P (fbase, tbase) && (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (TREE_TYPE (from)), TREE_TYPE (TREE_TYPE (to))))) *************** standard_conversion (to, from, expr) *** 777,783 **** { from = cp_build_qualified_type (TREE_TYPE (to), ! CP_TYPE_QUALS (TREE_TYPE (from))); from = build_pointer_type (from); conv = build_conv (PTR_CONV, from, conv); } --- 813,819 ---- { from = cp_build_qualified_type (TREE_TYPE (to), ! cp_type_quals (TREE_TYPE (from))); from = build_pointer_type (from); conv = build_conv (PTR_CONV, from, conv); } *************** standard_conversion (to, from, expr) *** 806,821 **** 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))); - tree binfo = get_binfo (fbase, tbase, 1); ! if (!binfo || binfo_from_vbase (binfo) || !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 0; ! from = cp_build_qualified_type (tbase, CP_TYPE_QUALS (fbase)); from = build_cplus_method_type (from, TREE_TYPE (fromfn), TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); from = build_ptrmemfunc_type (build_pointer_type (from)); --- 842,856 ---- 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 0; ! from = cp_build_qualified_type (tbase, cp_type_quals (fbase)); from = build_cplus_method_type (from, TREE_TYPE (fromfn), TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); from = build_ptrmemfunc_type (build_pointer_type (from)); *************** reference_binding (rto, rfrom, expr, fla *** 1071,1077 **** if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr)) { ! expr = instantiate_type (to, expr, itf_none); if (expr == error_mark_node) return NULL_TREE; from = TREE_TYPE (expr); --- 1106,1112 ---- 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_TREE; from = TREE_TYPE (expr); *************** reference_binding (rto, rfrom, expr, fla *** 1096,1102 **** { /* [dcl.init.ref] ! If the intializer expression -- is an lvalue (but not an lvalue for a bit-field), and "cv1 T1" is reference-compatible with "cv2 T2," --- 1131,1137 ---- { /* [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," *************** add_builtin_candidate (candidates, code, *** 1898,1910 **** return candidates; default: ! my_friendly_abort (367); } type1 = build_reference_type (type1); break; case COND_EXPR: ! /* [over.builtin] For every pair of promoted arithmetic types L and R, there exist candidate operator functions of the form --- 1933,1945 ---- return candidates; default: ! abort (); } 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 *************** add_builtin_candidate (candidates, code, *** 1942,1948 **** return candidates; default: ! my_friendly_abort (367); } /* If we're dealing with two pointer types or two enumeral types, --- 1977,1983 ---- return candidates; default: ! abort (); } /* If we're dealing with two pointer types or two enumeral types, *************** add_template_candidate_real (candidates, *** 2203,2208 **** --- 2238,2273 ---- if (fn == error_mark_node) return candidates; + /* 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) && list_length (arglist) == 2) + { + tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (fn); + if (arg_types && same_type_p (TYPE_MAIN_VARIANT (TREE_VALUE (arg_types)), + ctype)) + return candidates; + } + if (obj != NULL_TREE) /* Aha, this is a conversion function. */ cand = add_conv_candidate (candidates, fn, obj, arglist); *************** print_z_candidates (candidates) *** 2306,2325 **** if (TREE_CODE (candidates->fn) == IDENTIFIER_NODE) { if (TREE_VEC_LENGTH (candidates->convs) == 3) ! cp_error ("%s %D(%T, %T, %T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 2))); else if (TREE_VEC_LENGTH (candidates->convs) == 2) ! cp_error ("%s %D(%T, %T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1))); else ! cp_error ("%s %D(%T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0))); } else if (TYPE_P (candidates->fn)) ! cp_error ("%s %T ", str, candidates->fn); else cp_error_at ("%s %+#D%s", str, candidates->fn, candidates->viable == -1 ? " " : ""); --- 2371,2390 ---- if (TREE_CODE (candidates->fn) == IDENTIFIER_NODE) { if (TREE_VEC_LENGTH (candidates->convs) == 3) ! error ("%s %D(%T, %T, %T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 2))); else if (TREE_VEC_LENGTH (candidates->convs) == 2) ! error ("%s %D(%T, %T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1))); else ! error ("%s %D(%T) ", str, candidates->fn, TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0))); } else if (TYPE_P (candidates->fn)) ! error ("%s %T ", str, candidates->fn); else cp_error_at ("%s %+#D%s", str, candidates->fn, candidates->viable == -1 ? " " : ""); *************** build_user_type_conversion_1 (totype, ex *** 2347,2355 **** /* 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]. */ ! if (IS_AGGR_TYPE (fromtype) && IS_AGGR_TYPE (totype) ! && DERIVED_FROM_P (totype, fromtype)) ! abort (); if (IS_AGGR_TYPE (totype)) ctors = lookup_fnfields (TYPE_BINFO (totype), --- 2412,2419 ---- /* 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]. */ ! my_friendly_assert (!IS_AGGR_TYPE (fromtype) || !IS_AGGR_TYPE (totype) ! || !DERIVED_FROM_P (totype, fromtype), 20011226); if (IS_AGGR_TYPE (totype)) ctors = lookup_fnfields (TYPE_BINFO (totype), *************** build_user_type_conversion_1 (totype, ex *** 2371,2381 **** t = build_int_2 (0, 0); TREE_TYPE (t) = build_pointer_type (totype); args = build_tree_list (NULL_TREE, expr); ! if (DECL_HAS_IN_CHARGE_PARM_P (OVL_CURRENT (ctors)) ! || DECL_HAS_VTT_PARM_P (OVL_CURRENT (ctors))) ! /* We should never try to call the abstract or base constructor ! from here. */ ! abort (); args = tree_cons (NULL_TREE, t, args); } for (; ctors; ctors = OVL_NEXT (ctors)) --- 2435,2445 ---- t = build_int_2 (0, 0); TREE_TYPE (t) = build_pointer_type (totype); args = build_tree_list (NULL_TREE, expr); ! /* We should never try to call the abstract or base constructor ! from here. */ ! my_friendly_assert (!DECL_HAS_IN_CHARGE_PARM_P (OVL_CURRENT (ctors)) ! && !DECL_HAS_VTT_PARM_P (OVL_CURRENT (ctors)), ! 20011226); args = tree_cons (NULL_TREE, t, args); } for (; ctors; ctors = OVL_NEXT (ctors)) *************** build_user_type_conversion_1 (totype, ex *** 2479,2485 **** if (candidates && ! candidates->next) /* say why this one won't work or try to be loose */; else ! cp_error ("no viable candidates"); } #endif --- 2543,2549 ---- if (candidates && ! candidates->next) /* say why this one won't work or try to be loose */; else ! error ("no viable candidates"); } #endif *************** build_user_type_conversion_1 (totype, ex *** 2493,2499 **** { if (flags & LOOKUP_COMPLAIN) { ! cp_error ("conversion from `%T' to `%T' is ambiguous", fromtype, totype); print_z_candidates (candidates); } --- 2557,2563 ---- { if (flags & LOOKUP_COMPLAIN) { ! error ("conversion from `%T' to `%T' is ambiguous", fromtype, totype); print_z_candidates (candidates); } *************** build_new_function_call (fn, args) *** 2610,2616 **** { if (candidates && ! candidates->next) return build_function_call (candidates->fn, args); ! cp_error ("no matching function for call to `%D(%A)'", DECL_NAME (OVL_FUNCTION (fn)), args); if (candidates) print_z_candidates (candidates); --- 2674,2680 ---- { if (candidates && ! candidates->next) return build_function_call (candidates->fn, args); ! error ("no matching function for call to `%D(%A)'", DECL_NAME (OVL_FUNCTION (fn)), args); if (candidates) print_z_candidates (candidates); *************** build_new_function_call (fn, args) *** 2621,2627 **** if (cand == 0) { ! cp_error ("call of overloaded `%D(%A)' is ambiguous", DECL_NAME (OVL_FUNCTION (fn)), args); print_z_candidates (candidates); return error_mark_node; --- 2685,2691 ---- if (cand == 0) { ! error ("call of overloaded `%D(%A)' is ambiguous", DECL_NAME (OVL_FUNCTION (fn)), args); print_z_candidates (candidates); return error_mark_node; *************** build_object_call (obj, args) *** 2648,2654 **** { /* It's no good looking for an overloaded operator() on a pointer-to-member-function. */ ! cp_error ("pointer-to-member function %E cannot be called without an object; consider using .* or ->*", obj); return error_mark_node; } --- 2712,2718 ---- { /* 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; } *************** build_object_call (obj, args) *** 2717,2723 **** if (! any_viable (candidates)) { ! cp_error ("no match for call to `(%T) (%A)'", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } --- 2781,2787 ---- if (! any_viable (candidates)) { ! error ("no match for call to `(%T) (%A)'", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } *************** build_object_call (obj, args) *** 2727,2733 **** if (cand == 0) { ! cp_error ("call of `(%T) (%A)' is ambiguous", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } --- 2791,2797 ---- if (cand == 0) { ! error ("call of `(%T) (%A)' is ambiguous", TREE_TYPE (obj), args); print_z_candidates (candidates); return error_mark_node; } *************** op_error (code, code2, arg1, arg2, arg3, *** 2762,2784 **** switch (code) { case COND_EXPR: ! cp_error ("%s for `%T ? %T : %T' operator", problem, error_type (arg1), error_type (arg2), error_type (arg3)); break; case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: ! cp_error ("%s for `%T %s' operator", problem, error_type (arg1), opname); break; case ARRAY_REF: ! cp_error ("%s for `%T [%T]' operator", problem, error_type (arg1), error_type (arg2)); break; default: if (arg2) ! cp_error ("%s for `%T %s %T' operator", problem, error_type (arg1), opname, error_type (arg2)); else ! cp_error ("%s for `%s %T' operator", problem, opname, error_type (arg1)); } } --- 2826,2848 ---- switch (code) { case COND_EXPR: ! error ("%s for `%T ? %T : %T' operator", problem, error_type (arg1), error_type (arg2), error_type (arg3)); break; case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: ! error ("%s for `%T %s' operator", problem, error_type (arg1), opname); break; case ARRAY_REF: ! error ("%s for `%T [%T]' operator", problem, error_type (arg1), error_type (arg2)); break; default: if (arg2) ! error ("%s for `%T %s %T' operator", problem, error_type (arg1), opname, error_type (arg2)); else ! error ("%s for `%s %T' operator", problem, opname, error_type (arg1)); } } *************** build_conditional_expr (arg1, arg2, arg3 *** 2929,2935 **** result_type = void_type_node; else { ! cp_error ("`%E' has type `void' and is not a throw-expression", VOID_TYPE_P (arg2_type) ? arg2 : arg3); return error_mark_node; } --- 2993,2999 ---- result_type = void_type_node; else { ! error ("`%E' has type `void' and is not a throw-expression", VOID_TYPE_P (arg2_type) ? arg2 : arg3); return error_mark_node; } *************** build_conditional_expr (arg1, arg2, arg3 *** 2962,2968 **** || (conv2 && TREE_CODE (conv2) == AMBIG_CONV) || (conv3 && TREE_CODE (conv3) == AMBIG_CONV)) { ! cp_error ("operands to ?: have different types"); return error_mark_node; } else if (conv2 && !ICS_BAD_FLAG (conv2)) --- 3026,3032 ---- || (conv2 && TREE_CODE (conv2) == AMBIG_CONV) || (conv3 && TREE_CODE (conv3) == AMBIG_CONV)) { ! error ("operands to ?: have different types"); return error_mark_node; } else if (conv2 && !ICS_BAD_FLAG (conv2)) *************** build_conditional_expr (arg1, arg2, arg3 *** 3115,3128 **** if (TREE_CODE (arg2_type) == ENUMERAL_TYPE && TREE_CODE (arg3_type) == ENUMERAL_TYPE) ! cp_warning ("enumeral mismatch in conditional expression: `%T' vs `%T'", 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))))) ! cp_warning ("enumeral and non-enumeral type in conditional expression"); arg2 = perform_implicit_conversion (result_type, arg2); arg3 = perform_implicit_conversion (result_type, arg3); --- 3179,3192 ---- if (TREE_CODE (arg2_type) == ENUMERAL_TYPE && TREE_CODE (arg3_type) == ENUMERAL_TYPE) ! warning ("enumeral mismatch in conditional expression: `%T' vs `%T'", 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))))) ! warning ("enumeral and non-enumeral type in conditional expression"); arg2 = perform_implicit_conversion (result_type, arg2); arg3 = perform_implicit_conversion (result_type, arg3); *************** build_conditional_expr (arg1, arg2, arg3 *** 3162,3168 **** if (!result_type) { ! cp_error ("operands to ?: have different types"); return error_mark_node; } --- 3226,3232 ---- if (!result_type) { ! error ("operands to ?: have different types"); return error_mark_node; } *************** build_new_op (code, flags, arg1, arg2, a *** 3203,3209 **** undeclared_template<1, 5, 72>a; */ if (code == LT_EXPR && TREE_CODE (arg1) == TEMPLATE_DECL) { ! cp_error ("`%D' must be declared before use", arg1); return error_mark_node; } --- 3267,3273 ---- undeclared_template<1, 5, 72>a; */ if (code == LT_EXPR && TREE_CODE (arg1) == TEMPLATE_DECL) { ! error ("`%D' must be declared before use", arg1); return error_mark_node; } *************** build_new_op (code, flags, arg1, arg2, a *** 3227,3233 **** case VEC_DELETE_EXPR: case DELETE_EXPR: /* Use build_op_new_call and build_op_delete_call instead. */ ! my_friendly_abort (981018); case CALL_EXPR: return build_object_call (arg1, arg2); --- 3291,3297 ---- case VEC_DELETE_EXPR: case DELETE_EXPR: /* Use build_op_new_call and build_op_delete_call instead. */ ! abort (); case CALL_EXPR: return build_object_call (arg1, arg2); *************** build_new_op (code, flags, arg1, arg2, a *** 3265,3277 **** if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) arg2 = integer_zero_node; ! if (arg2 && arg3) ! arglist = tree_cons (NULL_TREE, arg1, tree_cons ! (NULL_TREE, arg2, build_tree_list (NULL_TREE, arg3))); ! else if (arg2) ! arglist = tree_cons (NULL_TREE, arg1, build_tree_list (NULL_TREE, arg2)); ! else ! arglist = build_tree_list (NULL_TREE, arg1); fns = lookup_function_nonclass (fnname, arglist); --- 3329,3340 ---- if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) arg2 = integer_zero_node; ! arglist = NULL_TREE; ! if (arg3) ! arglist = tree_cons (NULL_TREE, arg3, arglist); ! if (arg2) ! arglist = tree_cons (NULL_TREE, arg2, arglist); ! arglist = tree_cons (NULL_TREE, arg1, arglist); fns = lookup_function_nonclass (fnname, arglist); *************** build_new_op (code, flags, arg1, arg2, a *** 3367,3373 **** /* Look for an `operator++ (int)'. If they didn't have one, then we fall back to the old way of doing things. */ if (flags & LOOKUP_COMPLAIN) ! cp_pedwarn ("no `%D(int)' declared for postfix `%s', trying prefix operator instead", fnname, operator_name_info[code].name); if (code == POSTINCREMENT_EXPR) --- 3430,3436 ---- /* Look for an `operator++ (int)'. If they didn't have one, then we fall back to the old way of doing things. */ if (flags & LOOKUP_COMPLAIN) ! pedwarn ("no `%D(int)' declared for postfix `%s', trying prefix operator instead", fnname, operator_name_info[code].name); if (code == POSTINCREMENT_EXPR) *************** build_new_op (code, flags, arg1, arg2, a *** 3414,3420 **** && candidates->next && ! candidates->next->next) { ! cp_warning ("using synthesized `%#D' for copy assignment", cand->fn); cp_warning_at (" where cfront would use `%#D'", cand == candidates --- 3477,3483 ---- && candidates->next && ! candidates->next->next) { ! warning ("using synthesized `%#D' for copy assignment", cand->fn); cp_warning_at (" where cfront would use `%#D'", cand == candidates *************** build_new_op (code, flags, arg1, arg2, a *** 3443,3449 **** && (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) != TYPE_MAIN_VARIANT (TREE_TYPE (arg2)))) { ! cp_warning ("comparison between `%#T' and `%#T'", TREE_TYPE (arg1), TREE_TYPE (arg2)); } break; --- 3506,3512 ---- && (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) != TYPE_MAIN_VARIANT (TREE_TYPE (arg2)))) { ! warning ("comparison between `%#T' and `%#T'", TREE_TYPE (arg1), TREE_TYPE (arg2)); } break; *************** builtin: *** 3524,3530 **** case MEMBER_REF: return build_m_component_ref ! (build_indirect_ref (arg1, NULL_PTR), arg2); /* The caller will deal with these. */ case ADDR_EXPR: --- 3587,3593 ---- case MEMBER_REF: return build_m_component_ref ! (build_indirect_ref (arg1, NULL), arg2); /* The caller will deal with these. */ case ADDR_EXPR: *************** builtin: *** 3533,3539 **** return NULL_TREE; default: ! my_friendly_abort (367); return NULL_TREE; } } --- 3596,3602 ---- return NULL_TREE; default: ! abort (); return NULL_TREE; } } *************** builtin: *** 3545,3552 **** match with the placement new is accepted. CODE is either DELETE_EXPR or VEC_DELETE_EXPR. ! ADDR is the pointer to be deleted. For placement delete, it is also ! used to determine what the corresponding new looked like. SIZE is the size of the memory block to be deleted. FLAGS are the usual overloading flags. PLACEMENT is the corresponding placement new call, or NULL_TREE. */ --- 3608,3614 ---- 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. FLAGS are the usual overloading flags. PLACEMENT is the corresponding placement new call, or NULL_TREE. */ *************** build_op_delete_call (code, addr, size, *** 3557,3563 **** tree addr, size, placement; int flags; { ! tree fn, fns, fnname, fntype, argtypes, args, type; int pass; if (addr == error_mark_node) --- 3619,3626 ---- tree addr, size, placement; int flags; { ! tree fn = NULL_TREE; ! tree fns, fnname, fntype, argtypes, args, type; int pass; if (addr == error_mark_node) *************** build_op_delete_call (code, addr, size, *** 3590,3604 **** if (placement) { ! /* placement is a CALL_EXPR around an ADDR_EXPR around a function. */ /* Extract the function. */ ! argtypes = TREE_OPERAND (TREE_OPERAND (placement, 0), 0); /* Then the second parm type. */ ! argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (argtypes))); ! /* Also the second argument. */ ! args = TREE_CHAIN (TREE_OPERAND (placement, 1)); } else { --- 3653,3674 ---- if (placement) { ! tree alloc_fn; ! tree call_expr; + /* Find the allocation function that is being called. */ + call_expr = placement; + /* Sometimes we have a COMPOUND_EXPR, rather than a simple + CALL_EXPR. */ + while (TREE_CODE (call_expr) == COMPOUND_EXPR) + call_expr = TREE_OPERAND (call_expr, 1); /* Extract the function. */ ! alloc_fn = get_callee_fndecl (call_expr); ! my_friendly_assert (alloc_fn != NULL_TREE, 20020327); /* Then the second parm type. */ ! argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn))); /* Also the second argument. */ ! args = TREE_CHAIN (TREE_OPERAND (call_expr, 1)); } else { *************** build_op_delete_call (code, addr, size, *** 3675,3681 **** if (placement) return NULL_TREE; ! cp_error ("no suitable `operator delete' for `%T'", type); return error_mark_node; } --- 3745,3751 ---- if (placement) return NULL_TREE; ! error ("no suitable `operator delete' for `%T'", type); return error_mark_node; } *************** enforce_access (basetype_path, decl) *** 3699,3705 **** cp_error_at ("`%+#D' is protected", decl); else cp_error_at ("`%+#D' is inaccessible", decl); ! cp_error ("within this context"); return 0; } --- 3769,3775 ---- cp_error_at ("`%+#D' is protected", decl); else cp_error_at ("`%+#D' is inaccessible", decl); ! error ("within this context"); return 0; } *************** convert_like_real (convs, expr, fn, argn *** 3719,3725 **** int argnum; int inner; { - extern int warningcount, errorcount; int savew, savee; tree totype = TREE_TYPE (convs); --- 3789,3794 ---- *************** convert_like_real (convs, expr, fn, argn *** 3732,3738 **** tree t = convs; for (; t; t = TREE_OPERAND (t, 0)) { ! if (TREE_CODE (t) == USER_CONV) { expr = convert_like_real (t, expr, fn, argnum, 1); break; --- 3801,3807 ---- tree t = convs; for (; t; t = TREE_OPERAND (t, 0)) { ! if (TREE_CODE (t) == USER_CONV || !ICS_BAD_FLAG (t)) { expr = convert_like_real (t, expr, fn, argnum, 1); break; *************** convert_like_real (convs, expr, fn, argn *** 3742,3750 **** else if (TREE_CODE (t) == IDENTITY_CONV) break; } ! return convert_for_initialization ! (NULL_TREE, totype, expr, LOOKUP_NORMAL, ! "conversion", fn, argnum); } if (!inner) --- 3811,3820 ---- else if (TREE_CODE (t) == IDENTITY_CONV) break; } ! pedwarn ("invalid conversion from `%T' to `%T'", TREE_TYPE (expr), totype); ! if (fn) ! pedwarn (" initializing argument %P of `%D'", argnum, fn); ! return cp_convert (totype, expr); } if (!inner) *************** convert_like_real (convs, expr, fn, argn *** 3805,3825 **** if (fn) { if (warningcount > savew) ! cp_warning (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); else if (errorcount > savee) ! cp_error (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); } else { if (warningcount > savew) ! cp_warning (" initializing temporary from result of `%D'", convfn); else if (errorcount > savee) ! cp_error (" initializing temporary from result of `%D'", convfn); } expr = build_cplus_new (totype, expr); --- 3875,3895 ---- if (fn) { if (warningcount > savew) ! warning (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); else if (errorcount > savee) ! error (" initializing argument %P of `%D' from result of `%D'", argnum, fn, convfn); } else { if (warningcount > savew) ! warning (" initializing temporary from result of `%D'", convfn); else if (errorcount > savee) ! error (" initializing temporary from result of `%D'", convfn); } expr = build_cplus_new (totype, expr); *************** convert_like_real (convs, expr, fn, argn *** 3828,3834 **** } case IDENTITY_CONV: if (type_unknown_p (expr)) ! expr = instantiate_type (totype, expr, itf_complain); return expr; case AMBIG_CONV: /* Call build_user_type_conversion again for the error. */ --- 3898,3904 ---- } case IDENTITY_CONV: if (type_unknown_p (expr)) ! expr = instantiate_type (totype, expr, tf_error | tf_warning); return expr; case AMBIG_CONV: /* Call build_user_type_conversion again for the error. */ *************** convert_like_real (convs, expr, fn, argn *** 3874,3881 **** /* 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] */ ! if (fn) ! savew = warningcount, savee = errorcount; expr = build_new_method_call (NULL_TREE, complete_ctor_identifier, build_tree_list (NULL_TREE, expr), TYPE_BINFO (totype), --- 3944,3950 ---- /* Copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination [is treated as direct-initialization]. [dcl.init] */ ! savew = warningcount, savee = errorcount; expr = build_new_method_call (NULL_TREE, complete_ctor_identifier, build_tree_list (NULL_TREE, expr), TYPE_BINFO (totype), *************** convert_like_real (convs, expr, fn, argn *** 3883,3891 **** if (fn) { if (warningcount > savew) ! cp_warning (" initializing argument %P of `%D'", argnum, fn); else if (errorcount > savee) ! cp_error (" initializing argument %P of `%D'", argnum, fn); } return build_cplus_new (totype, expr); --- 3952,3960 ---- if (fn) { if (warningcount > savew) ! warning (" initializing argument %P of `%D'", argnum, fn); else if (errorcount > savee) ! error (" initializing argument %P of `%D'", argnum, fn); } return build_cplus_new (totype, expr); *************** convert_arg_to_ellipsis (arg) *** 3954,3960 **** if (arg != error_mark_node && ! pod_type_p (TREE_TYPE (arg))) { /* Undefined behaviour [expr.call] 5.2.2/7. */ ! cp_warning ("cannot pass objects of non-POD type `%#T' through `...'", TREE_TYPE (arg)); } --- 4023,4029 ---- if (arg != error_mark_node && ! pod_type_p (TREE_TYPE (arg))) { /* Undefined behaviour [expr.call] 5.2.2/7. */ ! warning ("cannot pass objects of non-POD type `%#T' through `...'", TREE_TYPE (arg)); } *************** build_x_va_arg (expr, type) *** 3979,3985 **** if (! pod_type_p (type)) { /* Undefined behaviour [expr.call] 5.2.2/7. */ ! cp_warning ("cannot receive objects of non-POD type `%#T' through `...'", type); } --- 4048,4054 ---- if (! pod_type_p (type)) { /* Undefined behaviour [expr.call] 5.2.2/7. */ ! warning ("cannot receive objects of non-POD type `%#T' through `...'", type); } *************** convert_default_arg (type, arg, fn, parm *** 4065,4070 **** --- 4134,4144 ---- return arg; } + /* Subroutine of the various build_*_call functions. Overload resolution + has chosen a winning candidate CAND; build up a CALL_EXPR accordingly. + ARGS is a TREE_LIST of the unconverted arguments to the call. FLAGS is a + bitmask of various LOOKUP_* flags which apply to the call itself. */ + static tree build_over_call (cand, args, flags) struct z_candidate *cand; *************** build_over_call (cand, args, flags) *** 4116,4122 **** tree argtype = TREE_TYPE (TREE_VALUE (arg)); tree t; if (ICS_BAD_FLAG (TREE_VEC_ELT (convs, i))) ! cp_pedwarn ("passing `%T' as `this' argument of `%#D' discards qualifiers", TREE_TYPE (argtype), fn); /* [class.mfct.nonstatic]: If a nonstatic member function of a class --- 4190,4196 ---- tree argtype = TREE_TYPE (TREE_VALUE (arg)); tree t; if (ICS_BAD_FLAG (TREE_VEC_ELT (convs, i))) ! pedwarn ("passing `%T' as `this' argument of `%#D' discards qualifiers", TREE_TYPE (argtype), fn); /* [class.mfct.nonstatic]: If a nonstatic member function of a class *************** build_over_call (cand, args, flags) *** 4126,4132 **** So we can assume that anything passed as 'this' is non-null, and optimize accordingly. */ my_friendly_assert (TREE_CODE (parmtype) == POINTER_TYPE, 19990811); ! t = convert_pointer_to_real (TREE_TYPE (parmtype), TREE_VALUE (arg)); converted_args = tree_cons (NULL_TREE, t, converted_args); parm = TREE_CHAIN (parm); arg = TREE_CHAIN (arg); --- 4200,4208 ---- So we can assume that anything passed as 'this' is non-null, and optimize accordingly. */ my_friendly_assert (TREE_CODE (parmtype) == POINTER_TYPE, 19990811); ! t = lookup_base (TREE_TYPE (TREE_TYPE (TREE_VALUE (arg))), ! TREE_TYPE (parmtype), ba_ignore, NULL); ! t = build_base_path (PLUS_EXPR, TREE_VALUE (arg), t, 1); converted_args = tree_cons (NULL_TREE, t, converted_args); parm = TREE_CHAIN (parm); arg = TREE_CHAIN (arg); *************** build_over_call (cand, args, flags) *** 4140,4171 **** tree type = TREE_VALUE (parm); conv = TREE_VEC_ELT (convs, i); ! if (ICS_BAD_FLAG (conv)) ! { ! tree t = conv; ! val = TREE_VALUE (arg); ! ! for (; t; t = TREE_OPERAND (t, 0)) ! { ! if (TREE_CODE (t) == USER_CONV ! || TREE_CODE (t) == AMBIG_CONV) ! { ! val = convert_like_with_context (t, val, fn, i - is_method); ! break; ! } ! else if (TREE_CODE (t) == IDENTITY_CONV) ! break; ! } ! val = convert_for_initialization ! (NULL_TREE, type, val, LOOKUP_NORMAL, ! "argument", fn, i - is_method); ! } ! else ! { ! val = TREE_VALUE (arg); ! val = convert_like_with_context ! (conv, TREE_VALUE (arg), fn, i - is_method); ! } if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) --- 4216,4223 ---- tree type = TREE_VALUE (parm); conv = TREE_VEC_ELT (convs, i); ! val = convert_like_with_context ! (conv, TREE_VALUE (arg), fn, i - is_method); if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) *************** build_over_call (cand, args, flags) *** 4192,4200 **** converted_args = nreverse (converted_args); ! if (warn_format && (DECL_NAME (fn) || DECL_ASSEMBLER_NAME (fn))) ! check_function_format (NULL, DECL_NAME (fn), DECL_ASSEMBLER_NAME (fn), ! converted_args); /* Avoid actually calling copy constructors and copy assignment operators, if possible. */ --- 4244,4252 ---- converted_args = nreverse (converted_args); ! if (warn_format) ! check_function_format (NULL, TYPE_ATTRIBUTES (TREE_TYPE (fn)), ! converted_args); /* Avoid actually calling copy constructors and copy assignment operators, if possible. */ *************** build_over_call (cand, args, flags) *** 4253,4259 **** be touched as it might overlay things. When the gcc core learns about empty classes, we can treat it like other classes. */ ! && !is_empty_class (DECL_CONTEXT (fn))) { tree address; tree to = stabilize_reference --- 4305,4312 ---- be touched as it might overlay things. When the gcc core learns about empty classes, we can treat it like other classes. */ ! && !(is_empty_class (DECL_CONTEXT (fn)) ! && TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)))) { tree address; tree to = stabilize_reference *************** build_over_call (cand, args, flags) *** 4268,4274 **** } } else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR ! && copy_args_p (fn) && TYPE_HAS_TRIVIAL_ASSIGN_REF (DECL_CONTEXT (fn))) { tree to = stabilize_reference --- 4321,4327 ---- } } else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR ! && copy_fn_p (fn) && TYPE_HAS_TRIVIAL_ASSIGN_REF (DECL_CONTEXT (fn))) { tree to = stabilize_reference *************** build_over_call (cand, args, flags) *** 4289,4294 **** --- 4342,4348 ---- Ideally, the notions of having side-effects and of being useless would be orthogonal. */ TREE_SIDE_EFFECTS (val) = 1; + TREE_NO_UNUSED_WARNING (val) = 1; } else val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg); *************** build_over_call (cand, args, flags) *** 4300,4315 **** if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0) { tree t, *p = &TREE_VALUE (converted_args); ! tree binfo = get_binfo ! (DECL_VIRTUAL_CONTEXT (fn), TREE_TYPE (TREE_TYPE (*p)), 0); ! *p = convert_pointer_to_real (binfo, *p); if (TREE_SIDE_EFFECTS (*p)) *p = save_expr (*p); t = build_pointer_type (TREE_TYPE (fn)); if (DECL_CONTEXT (fn) && TYPE_JAVA_INTERFACE (DECL_CONTEXT (fn))) fn = build_java_interface_fn_ref (fn, *p); else ! fn = build_vfn_ref (p, build_indirect_ref (*p, 0), DECL_VINDEX (fn)); TREE_TYPE (fn) = t; } else if (DECL_INLINE (fn)) --- 4354,4372 ---- if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0) { tree t, *p = &TREE_VALUE (converted_args); ! tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (*p)), ! DECL_VIRTUAL_CONTEXT (fn), ! ba_any, NULL); ! my_friendly_assert (binfo && binfo != error_mark_node, 20010730); ! ! *p = build_base_path (PLUS_EXPR, *p, binfo, 1); if (TREE_SIDE_EFFECTS (*p)) *p = save_expr (*p); t = build_pointer_type (TREE_TYPE (fn)); if (DECL_CONTEXT (fn) && TYPE_JAVA_INTERFACE (DECL_CONTEXT (fn))) fn = build_java_interface_fn_ref (fn, *p); else ! fn = build_vfn_ref (build_indirect_ref (*p, 0), DECL_VINDEX (fn)); TREE_TYPE (fn) = t; } else if (DECL_INLINE (fn)) *************** build_java_interface_fn_ref (fn, instanc *** 4368,4374 **** java_iface_lookup_fn = builtin_function ("_Jv_LookupInterfaceMethodIdx", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); ggc_add_tree_root (&java_iface_lookup_fn, 1); } --- 4425,4431 ---- java_iface_lookup_fn = builtin_function ("_Jv_LookupInterfaceMethodIdx", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); ggc_add_tree_root (&java_iface_lookup_fn, 1); } *************** build_java_interface_fn_ref (fn, instanc *** 4383,4389 **** if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL || DECL_CONTEXT (iface_ref) != iface) { ! cp_error ("Could not find class$ field in java interface type `%T'", iface); return error_mark_node; } --- 4440,4446 ---- if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL || DECL_CONTEXT (iface_ref) != iface) { ! error ("could not find class$ field in java interface type `%T'", iface); return error_mark_node; } *************** in_charge_arg_for_name (name) *** 4429,4435 **** /* This function should only be called with one of the names listed above. */ ! my_friendly_abort (20000411); return NULL_TREE; } --- 4486,4492 ---- /* This function should only be called with one of the names listed above. */ ! abort (); return NULL_TREE; } *************** build_new_method_call (instance, name, a *** 4484,4490 **** if (! IS_AGGR_TYPE (basetype)) { if ((flags & LOOKUP_COMPLAIN) && basetype != error_mark_node) ! cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", name, instance, basetype); return error_mark_node; --- 4541,4547 ---- if (! IS_AGGR_TYPE (basetype)) { if ((flags & LOOKUP_COMPLAIN) && basetype != error_mark_node) ! error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", name, instance, basetype); return error_mark_node; *************** build_new_method_call (instance, name, a *** 4610,4618 **** if (!COMPLETE_TYPE_P (basetype)) incomplete_type_error (instance_ptr, basetype); else ! cp_error ("no matching function for call to `%T::%D(%A)%V'", ! basetype, pretty_name, user_args, ! TREE_TYPE (TREE_TYPE (instance_ptr))); print_z_candidates (candidates); return error_mark_node; } --- 4667,4675 ---- if (!COMPLETE_TYPE_P (basetype)) incomplete_type_error (instance_ptr, basetype); else ! error ("no matching function for call to `%T::%D(%A)%#V'", ! basetype, pretty_name, user_args, ! TREE_TYPE (TREE_TYPE (instance_ptr))); print_z_candidates (candidates); return error_mark_node; } *************** build_new_method_call (instance, name, a *** 4621,4627 **** if (cand == 0) { ! cp_error ("call of overloaded `%D(%A)' is ambiguous", pretty_name, user_args); print_z_candidates (candidates); return error_mark_node; --- 4678,4684 ---- if (cand == 0) { ! error ("call of overloaded `%D(%A)' is ambiguous", pretty_name, user_args); print_z_candidates (candidates); return error_mark_node; *************** build_new_method_call (instance, name, a *** 4633,4652 **** || DECL_DESTRUCTOR_P (current_function_decl)) && ! (flags & LOOKUP_NONVIRTUAL) && value_member (cand->fn, CLASSTYPE_PURE_VIRTUALS (basetype))) ! cp_error ((DECL_CONSTRUCTOR_P (current_function_decl) ? "abstract virtual `%#D' called from constructor" : "abstract virtual `%#D' called from destructor"), cand->fn); if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE && is_dummy_object (instance_ptr)) { ! cp_error ("cannot call member function `%D' without object", cand->fn); return error_mark_node; } if (DECL_VINDEX (cand->fn) && ! (flags & LOOKUP_NONVIRTUAL) ! && ((instance == current_class_ref && (dtor_label || ctor_label)) ! || resolves_to_fixed_type_p (instance, 0))) flags |= LOOKUP_NONVIRTUAL; if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE) --- 4690,4708 ---- || DECL_DESTRUCTOR_P (current_function_decl)) && ! (flags & LOOKUP_NONVIRTUAL) && value_member (cand->fn, CLASSTYPE_PURE_VIRTUALS (basetype))) ! error ((DECL_CONSTRUCTOR_P (current_function_decl) ? "abstract virtual `%#D' called from constructor" : "abstract virtual `%#D' called from destructor"), cand->fn); if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE && is_dummy_object (instance_ptr)) { ! error ("cannot call member function `%D' without object", cand->fn); return error_mark_node; } if (DECL_VINDEX (cand->fn) && ! (flags & LOOKUP_NONVIRTUAL) ! && resolves_to_fixed_type_p (instance, 0)) flags |= LOOKUP_NONVIRTUAL; if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE) *************** maybe_handle_ref_bind (ics) *** 4769,4776 **** { if (TREE_CODE (*ics) == REF_BIND) { ! tree type = TREE_TYPE (TREE_TYPE (*ics)); ! *ics = TREE_OPERAND (*ics, 0); return type; } --- 4825,4835 ---- { if (TREE_CODE (*ics) == REF_BIND) { ! tree old_ics = *ics; ! tree type = TREE_TYPE (TREE_TYPE (old_ics)); ! *ics = TREE_OPERAND (old_ics, 0); ! ICS_USER_FLAG (*ics) = ICS_USER_FLAG (old_ics); ! ICS_BAD_FLAG (*ics) = ICS_BAD_FLAG (old_ics); return type; } *************** source_type (t) *** 5132,5138 **** || TREE_CODE (t) == IDENTITY_CONV) return TREE_TYPE (t); } ! my_friendly_abort (1823); } /* Note a warning about preferring WINNER to LOSER. We do this by storing --- 5191,5197 ---- || TREE_CODE (t) == IDENTITY_CONV) return TREE_TYPE (t); } ! abort (); } /* Note a warning about preferring WINNER to LOSER. We do this by storing *************** static void *** 5143,5149 **** add_warning (winner, loser) struct z_candidate *winner, *loser; { ! winner->warnings = tree_cons (NULL_PTR, build_ptr_wrapper (loser), winner->warnings); } --- 5202,5208 ---- add_warning (winner, loser) struct z_candidate *winner, *loser; { ! winner->warnings = tree_cons (NULL_TREE, build_ptr_wrapper (loser), winner->warnings); } *************** joust (cand1, cand2, warn) *** 5216,5222 **** --len; } else ! my_friendly_abort (42); } for (i = 0; i < len; ++i) --- 5275,5281 ---- --len; } else ! abort (); } for (i = 0; i < len; ++i) *************** joust (cand1, cand2, warn) *** 5251,5259 **** if (warn) { ! cp_warning ("passing `%T' chooses `%T' over `%T'", type, type1, type2); ! cp_warning (" in call to `%D'", w->fn); } else add_warning (w, l); --- 5310,5318 ---- if (warn) { ! warning ("passing `%T' chooses `%T' over `%T'", type, type1, type2); ! warning (" in call to `%D'", w->fn); } else add_warning (w, l); *************** joust (cand1, cand2, warn) *** 5302,5311 **** tree source = source_type (TREE_VEC_ELT (w->convs, 0)); if (! DECL_CONSTRUCTOR_P (w->fn)) source = TREE_TYPE (source); ! cp_warning ("choosing `%D' over `%D'", w->fn, l->fn); ! cp_warning (" for conversion from `%T' to `%T'", source, TREE_TYPE (w->second_conv)); ! cp_warning (" because conversion sequence for the argument is better"); } else add_warning (w, l); --- 5361,5370 ---- tree source = source_type (TREE_VEC_ELT (w->convs, 0)); if (! DECL_CONSTRUCTOR_P (w->fn)) source = TREE_TYPE (source); ! warning ("choosing `%D' over `%D'", w->fn, l->fn); ! warning (" for conversion from `%T' to `%T'", source, TREE_TYPE (w->second_conv)); ! warning (" because conversion sequence for the argument is better"); } else add_warning (w, l); *************** joust (cand1, cand2, warn) *** 5334,5370 **** winner = more_specialized (TI_TEMPLATE (cand1->template), TI_TEMPLATE (cand2->template), DEDUCE_ORDER, ! /* Tell the deduction code how many real function arguments ! we saw, not counting the implicit 'this' argument. But, ! add_function_candidate() suppresses the "this" argument ! for constructors. ! ! [temp.func.order]: The presence of unused ellipsis and default ! arguments has no effect on the partial ordering of function ! templates. */ TREE_VEC_LENGTH (cand1->convs) ! - (DECL_NONSTATIC_MEMBER_FUNCTION_P (cand1->fn) ! -DECL_CONSTRUCTOR_P (cand1->fn))); if (winner) return winner; } - /* a non-template user function is better than a builtin. (Pedantically - 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) - return 1; - else if (TREE_CODE (cand1->fn) == IDENTIFIER_NODE - && TREE_CODE (cand2->fn) != IDENTIFIER_NODE) - return -1; - /* or, if not that, the context is an initialization by user-defined conversion (see _dcl.init_ and _over.match.user_) and the standard conversion --- 5393,5414 ---- winner = more_specialized (TI_TEMPLATE (cand1->template), TI_TEMPLATE (cand2->template), DEDUCE_ORDER, ! /* Tell the deduction code how many real function arguments ! we saw, not counting the implicit 'this' argument. But, ! add_function_candidate() suppresses the "this" argument ! for constructors. ! ! [temp.func.order]: The presence of unused ellipsis and default ! arguments has no effect on the partial ordering of function ! templates. */ TREE_VEC_LENGTH (cand1->convs) ! - (DECL_NONSTATIC_MEMBER_FUNCTION_P (cand1->fn) ! - DECL_CONSTRUCTOR_P (cand1->fn))); ! /* HERE */ 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 *************** joust (cand1, cand2, warn) *** 5380,5413 **** return winner; } ! /* If the built-in candidates are the same, arbitrarily pick one. */ ! if (cand1->fn == cand2->fn ! && TREE_CODE (cand1->fn) == IDENTIFIER_NODE) { for (i = 0; i < len; ++i) if (!same_type_p (TREE_TYPE (TREE_VEC_ELT (cand1->convs, i)), TREE_TYPE (TREE_VEC_ELT (cand2->convs, i)))) break; if (i == TREE_VEC_LENGTH (cand1->convs)) - return 1; - - /* Kludge around broken overloading rules whereby - Integer a, b; test ? a : b; is ambiguous, since there's a builtin - that takes references and another that takes values. */ - if (cand1->fn == ansi_opname (COND_EXPR)) { ! tree c1 = TREE_VEC_ELT (cand1->convs, 1); ! tree c2 = TREE_VEC_ELT (cand2->convs, 1); ! tree t1 = strip_top_quals (non_reference (TREE_TYPE (c1))); ! tree t2 = strip_top_quals (non_reference (TREE_TYPE (c2))); ! ! if (same_type_p (t1, t2)) ! { ! if (TREE_CODE (c1) == REF_BIND && TREE_CODE (c2) != REF_BIND) ! return 1; ! if (TREE_CODE (c1) != REF_BIND && TREE_CODE (c2) == REF_BIND) ! return -1; ! } } } --- 5424,5458 ---- 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 (TREE_TYPE (TREE_VEC_ELT (cand1->convs, i)), TREE_TYPE (TREE_VEC_ELT (cand2->convs, i)))) break; if (i == TREE_VEC_LENGTH (cand1->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; } } *************** tweak: *** 5424,5430 **** if (!pedantic) { int rank1 = IDENTITY_RANK, rank2 = IDENTITY_RANK; ! struct z_candidate *w, *l; for (i = 0; i < len; ++i) { --- 5469,5475 ---- if (!pedantic) { int rank1 = IDENTITY_RANK, rank2 = IDENTITY_RANK; ! struct z_candidate *w = 0, *l = 0; for (i = 0; i < len; ++i) { *************** tweak: *** 5441,5448 **** { if (warn) { ! cp_pedwarn ("choosing `%D' over `%D'", w->fn, l->fn); ! cp_pedwarn ( " because worst conversion for the former is better than worst conversion for the latter"); } else --- 5486,5493 ---- { if (warn) { ! pedwarn ("choosing `%D' over `%D'", w->fn, l->fn); ! pedwarn ( " because worst conversion for the former is better than worst conversion for the latter"); } else *************** can_convert_arg (to, from, arg) *** 5530,5536 **** return (t && ! ICS_BAD_FLAG (t)); } ! /* Convert EXPR to TYPE. Return the converted expression. */ tree perform_implicit_conversion (type, expr) --- 5575,5595 ---- return (t && ! ICS_BAD_FLAG (t)); } ! /* Like can_convert_arg, but allows dubious conversions as well. */ ! ! int ! can_convert_arg_bad (to, from, arg) ! tree to, from, arg; ! { ! tree t = implicit_conversion (to, from, arg, LOOKUP_NORMAL); ! return !!t; ! } ! ! /* Convert EXPR to TYPE. Return the converted expression. ! ! 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 (type, expr) *************** perform_implicit_conversion (type, expr) *** 5543,5551 **** return error_mark_node; conv = implicit_conversion (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); ! if (!conv || ICS_BAD_FLAG (conv)) { ! cp_error ("could not convert `%E' to `%T'", expr, type); return error_mark_node; } --- 5602,5610 ---- return error_mark_node; conv = implicit_conversion (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); ! if (!conv) { ! error ("could not convert `%E' to `%T'", expr, type); return error_mark_node; } *************** initialize_reference (type, expr) *** 5566,5572 **** conv = reference_binding (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); if (!conv || ICS_BAD_FLAG (conv)) { ! cp_error ("could not convert `%E' to `%T'", expr, type); return error_mark_node; } --- 5625,5631 ---- conv = reference_binding (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL); if (!conv || ICS_BAD_FLAG (conv)) { ! error ("could not convert `%E' to `%T'", expr, type); return error_mark_node; } diff -Nrc3pad gcc-3.0.4/gcc/cp/class.c gcc-3.1/gcc/cp/class.c *** gcc-3.0.4/gcc/cp/class.c Thu Jan 3 11:39:44 2002 --- gcc-3.1/gcc/cp/class.c Tue Apr 30 21:53:02 2002 *************** *** 1,6 **** /* Functions related to building classes and their related objects. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Functions related to building classes and their related objects. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 33,38 **** --- 33,39 ---- #include "toplev.h" #include "ggc.h" #include "lex.h" + #include "target.h" #include "obstack.h" #define obstack_chunk_alloc xmalloc *************** varray_type local_classes; *** 106,118 **** static tree get_vfield_name PARAMS ((tree)); static void finish_struct_anon PARAMS ((tree)); - static tree build_vbase_pointer PARAMS ((tree, tree)); static tree build_vtable_entry PARAMS ((tree, tree, tree)); static tree get_vtable_name PARAMS ((tree)); static tree get_basefndecls PARAMS ((tree, tree)); static int build_primary_vtable PARAMS ((tree, tree)); static int build_secondary_vtable PARAMS ((tree, tree)); - static tree dfs_finish_vtbls PARAMS ((tree, void *)); static void finish_vtbls PARAMS ((tree)); static void modify_vtable_entry PARAMS ((tree, tree, tree, tree, tree *)); static void add_virtual_function PARAMS ((tree *, tree *, int *, tree, tree)); --- 107,117 ---- *************** static tree add_implicitly_declared_memb *** 134,140 **** static tree fixed_type_or_null PARAMS ((tree, int *, int *)); static tree resolve_address_of_overloaded_function PARAMS ((tree, tree, int, int, int, tree)); ! static void build_vtable_entry_ref PARAMS ((tree, tree, tree)); static tree build_vtbl_initializer PARAMS ((tree, tree, tree, tree, int *)); static int count_fields PARAMS ((tree)); static int add_fields_to_vec PARAMS ((tree, tree, int)); --- 133,140 ---- static tree fixed_type_or_null PARAMS ((tree, int *, int *)); static tree resolve_address_of_overloaded_function PARAMS ((tree, tree, int, int, int, tree)); ! static tree build_vtable_entry_ref PARAMS ((tree, tree, tree)); ! static tree build_vtbl_ref_1 PARAMS ((tree, tree)); static tree build_vtbl_initializer PARAMS ((tree, tree, tree, tree, int *)); static int count_fields PARAMS ((tree)); static int add_fields_to_vec PARAMS ((tree, tree, int)); *************** static bool build_base_field PARAMS ((re *** 146,154 **** splay_tree, tree)); static bool build_base_fields PARAMS ((record_layout_info, int *, splay_tree, tree)); - static tree build_vbase_pointer_fields PARAMS ((record_layout_info, int *)); - static tree build_vtbl_or_vbase_field PARAMS ((tree, tree, tree, tree, tree, - int *)); static void check_methods PARAMS ((tree)); static void remove_zero_width_bit_fields PARAMS ((tree)); static void check_bases PARAMS ((tree, int *, int *, int *)); --- 146,151 ---- *************** static int layout_conflict_p PARAMS ((tr *** 217,228 **** static int splay_tree_compare_integer_csts PARAMS ((splay_tree_key k1, splay_tree_key k2)); static void warn_about_ambiguous_direct_bases PARAMS ((tree)); /* Macros for dfs walking during vtt construction. See dfs_ctor_vtable_bases_queue_p, dfs_build_secondary_vptr_vtt_inits and dfs_fixup_binfo_vtbls. */ ! #define VTT_TOP_LEVEL_P(node) TREE_UNSIGNED(node) ! #define VTT_MARKED_BINFO_P(node) TREE_USED(node) /* Variables shared between class.c and call.c. */ --- 214,226 ---- static int splay_tree_compare_integer_csts PARAMS ((splay_tree_key k1, splay_tree_key k2)); static void warn_about_ambiguous_direct_bases PARAMS ((tree)); + static bool type_requires_array_cookie PARAMS ((tree)); /* Macros for dfs walking during vtt construction. See dfs_ctor_vtable_bases_queue_p, dfs_build_secondary_vptr_vtt_inits and dfs_fixup_binfo_vtbls. */ ! #define VTT_TOP_LEVEL_P(NODE) TREE_UNSIGNED (NODE) ! #define VTT_MARKED_BINFO_P(NODE) TREE_USED (NODE) /* Variables shared between class.c and call.c. */ *************** int n_build_method_call = 0; *** 237,549 **** int n_inner_fields_searched = 0; #endif ! /* Virtual base class layout. */ ! ! /* Returns a list of virtual base class pointers as a chain of ! FIELD_DECLS. */ ! static tree ! build_vbase_pointer_fields (rli, empty_p) ! record_layout_info rli; ! int *empty_p; { ! /* Chain to hold all the new FIELD_DECLs which point at virtual ! base classes. */ ! tree rec = rli->t; ! tree vbase_decls = NULL_TREE; ! tree binfos = TYPE_BINFO_BASETYPES (rec); ! int n_baseclasses = CLASSTYPE_N_BASECLASSES (rec); ! tree decl; ! int i; ! /* Under the new ABI, there are no vbase pointers in the object. ! Instead, the offsets are stored in the vtable. */ ! if (vbase_offsets_in_vtable_p ()) ! return NULL_TREE; ! /* Loop over the baseclasses, adding vbase pointers as needed. */ ! for (i = 0; i < n_baseclasses; i++) { ! register tree base_binfo = TREE_VEC_ELT (binfos, i); ! register tree basetype = BINFO_TYPE (base_binfo); ! ! if (!COMPLETE_TYPE_P (basetype)) ! /* This error is now reported in xref_tag, thus giving better ! location information. */ ! continue; ! ! /* All basetypes are recorded in the association list of the ! derived type. */ ! ! if (TREE_VIA_VIRTUAL (base_binfo)) ! { ! int j; ! const char *name; ! ! /* The offset for a virtual base class is only used in computing ! virtual function tables and for initializing virtual base ! pointers. It is built once `get_vbase_types' is called. */ ! ! /* If this basetype can come from another vbase pointer ! without an additional indirection, we will share ! that pointer. If an indirection is involved, we ! make our own pointer. */ ! for (j = 0; j < n_baseclasses; j++) ! { ! tree other_base_binfo = TREE_VEC_ELT (binfos, j); ! if (! TREE_VIA_VIRTUAL (other_base_binfo) ! && binfo_for_vbase (basetype, BINFO_TYPE (other_base_binfo))) ! goto got_it; ! } ! FORMAT_VBASE_NAME (name, basetype); ! decl = build_vtbl_or_vbase_field (get_identifier (name), ! get_identifier (VTABLE_BASE), ! build_pointer_type (basetype), ! rec, ! basetype, ! empty_p); ! BINFO_VPTR_FIELD (base_binfo) = decl; ! TREE_CHAIN (decl) = vbase_decls; ! place_field (rli, decl); ! vbase_decls = decl; ! *empty_p = 0; ! ! got_it: ! /* The space this decl occupies has already been accounted for. */ ! ; ! } } ! return vbase_decls; ! } ! ! /* Returns a pointer to the virtual base class of EXP that has the ! indicated TYPE. EXP is of class type, not a pointer type. */ ! ! static tree ! build_vbase_pointer (exp, type) ! tree exp, type; ! { ! if (vbase_offsets_in_vtable_p ()) ! { ! tree vbase; ! tree vbase_ptr; ! ! /* Find the shared copy of TYPE; that's where the vtable offset ! is recorded. */ ! vbase = binfo_for_vbase (type, TREE_TYPE (exp)); ! /* Find the virtual function table pointer. */ ! vbase_ptr = build_vfield_ref (exp, TREE_TYPE (exp)); ! /* Compute the location where the offset will lie. */ ! vbase_ptr = build (PLUS_EXPR, ! TREE_TYPE (vbase_ptr), ! vbase_ptr, ! BINFO_VPTR_FIELD (vbase)); ! vbase_ptr = build1 (NOP_EXPR, ! build_pointer_type (ptrdiff_type_node), ! vbase_ptr); ! /* Add the contents of this location to EXP. */ ! return build (PLUS_EXPR, ! build_pointer_type (type), ! build_unary_op (ADDR_EXPR, exp, /*noconvert=*/0), ! build1 (INDIRECT_REF, ptrdiff_type_node, vbase_ptr)); ! } ! else { ! char *name; ! FORMAT_VBASE_NAME (name, type); ! return build_component_ref (exp, get_identifier (name), NULL_TREE, 0); } - } - - /* Build multi-level access to EXPR using hierarchy path PATH. - CODE is PLUS_EXPR if we are going with the grain, - and MINUS_EXPR if we are not (in which case, we cannot traverse - virtual baseclass links). - - TYPE is the type we want this path to have on exit. - NONNULL is non-zero if we know (for any reason) that EXPR is - not, in fact, zero. */ - - tree - build_vbase_path (code, type, expr, path, nonnull) - enum tree_code code; - tree type, expr, path; - int nonnull; - { - register int changed = 0; - tree last = NULL_TREE, last_virtual = NULL_TREE; - int fixed_type_p; - tree null_expr = 0, nonnull_expr; - tree basetype; - tree offset = integer_zero_node; - - if (BINFO_INHERITANCE_CHAIN (path) == NULL_TREE) - return build1 (NOP_EXPR, type, expr); - - /* We could do better if we had additional logic to convert back to the - unconverted type (the static type of the complete object), and then - convert back to the type we want. Until that is done, we only optimize - if the complete type is the same type as expr has. */ fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull); ! if (fixed_type_p < 0) ! /* Virtual base layout is not fixed, even in ctors and dtors. */ ! fixed_type_p = 0; ! ! if (!fixed_type_p && TREE_SIDE_EFFECTS (expr)) expr = save_expr (expr); - nonnull_expr = expr; ! path = reverse_path (path); ! ! basetype = BINFO_TYPE (path); ! ! while (path) { ! if (TREE_VIA_VIRTUAL (TREE_VALUE (path))) ! { ! last_virtual = BINFO_TYPE (TREE_VALUE (path)); ! if (code == PLUS_EXPR) ! { ! changed = ! fixed_type_p; ! ! if (changed) ! { ! tree ind; ! ! /* We already check for ambiguous things in the caller, just ! find a path. */ ! if (last) ! { ! tree binfo = get_binfo (last, TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (nonnull_expr))), 0); ! nonnull_expr = convert_pointer_to_real (binfo, nonnull_expr); ! } ! ind = build_indirect_ref (nonnull_expr, NULL_PTR); ! nonnull_expr = build_vbase_pointer (ind, last_virtual); ! if (nonnull == 0 ! && TREE_CODE (type) == POINTER_TYPE ! && null_expr == NULL_TREE) ! { ! null_expr = build1 (NOP_EXPR, build_pointer_type (last_virtual), integer_zero_node); ! expr = build (COND_EXPR, build_pointer_type (last_virtual), ! build (EQ_EXPR, boolean_type_node, expr, ! integer_zero_node), ! null_expr, nonnull_expr); ! } ! } ! /* else we'll figure out the offset below. */ ! /* Happens in the case of parse errors. */ ! if (nonnull_expr == error_mark_node) ! return error_mark_node; ! } ! else ! { ! cp_error ("cannot cast up from virtual baseclass `%T'", ! last_virtual); ! return error_mark_node; ! } ! } ! last = TREE_VALUE (path); ! path = TREE_CHAIN (path); ! } ! /* LAST is now the last basetype assoc on the path. */ ! /* A pointer to a virtual base member of a non-null object ! is non-null. Therefore, we only need to test for zeroness once. ! Make EXPR the canonical expression to deal with here. */ ! if (null_expr) ! { ! TREE_OPERAND (expr, 2) = nonnull_expr; ! TREE_TYPE (expr) = TREE_TYPE (TREE_OPERAND (expr, 1)) ! = TREE_TYPE (nonnull_expr); } - else - expr = nonnull_expr; ! /* If we go through any virtual base pointers, make sure that ! casts to BASETYPE from the last virtual base class use ! the right value for BASETYPE. */ ! if (changed) ! { ! tree intype = TREE_TYPE (TREE_TYPE (expr)); ! if (TYPE_MAIN_VARIANT (intype) != BINFO_TYPE (last)) ! offset ! = BINFO_OFFSET (get_binfo (last, TYPE_MAIN_VARIANT (intype), 0)); ! } else ! offset = BINFO_OFFSET (last); ! ! if (! integer_zerop (offset)) ! { ! /* Bash types to make the backend happy. */ ! offset = cp_convert (type, offset); ! ! /* If expr might be 0, we need to preserve that zeroness. */ ! if (nonnull == 0) ! { ! if (null_expr) ! TREE_TYPE (null_expr) = type; ! else ! null_expr = build1 (NOP_EXPR, type, integer_zero_node); ! if (TREE_SIDE_EFFECTS (expr)) ! expr = save_expr (expr); ! return build (COND_EXPR, type, ! build (EQ_EXPR, boolean_type_node, expr, integer_zero_node), ! null_expr, ! build (code, type, expr, offset)); ! } ! else return build (code, type, expr, offset); ! } ! /* Cannot change the TREE_TYPE of a NOP_EXPR here, since it may ! be used multiple times in initialization of multiple inheritance. */ ! if (null_expr) ! { ! TREE_TYPE (expr) = type; ! return expr; ! } ! else ! return build1 (NOP_EXPR, type, expr); } /* Virtual function things. */ ! /* We want to give the assembler the vtable identifier as well as ! the offset to the function pointer. So we generate ! __asm__ __volatile__ (".vtable_entry %c0, %c1" ! : : "s"(&class_vtable), ! "i"((long)&vtbl[idx].pfn - (long)&vtbl[0])); */ ! static void ! build_vtable_entry_ref (basetype, vtbl, idx) ! tree basetype, vtbl, idx; ! { ! static char asm_stmt[] = ".vtable_entry %c0, %c1"; ! tree s, i, i2; ! s = build_unary_op (ADDR_EXPR, ! get_vtbl_decl_for_binfo (TYPE_BINFO (basetype)), ! 0); ! s = build_tree_list (build_string (1, "s"), s); ! i = build_array_ref (vtbl, idx); ! if (!flag_vtable_thunks) ! i = build_component_ref (i, pfn_identifier, vtable_entry_type, 0); ! i = build_c_cast (ptrdiff_type_node, build_unary_op (ADDR_EXPR, i, 0)); ! i2 = build_array_ref (vtbl, build_int_2(0,0)); ! i2 = build_c_cast (ptrdiff_type_node, build_unary_op (ADDR_EXPR, i2, 0)); ! i = cp_build_binary_op (MINUS_EXPR, i, i2); ! i = build_tree_list (build_string (1, "i"), i); ! finish_asm_stmt (ridpointers[RID_VOLATILE], ! build_string (sizeof(asm_stmt)-1, asm_stmt), ! NULL_TREE, chainon (s, i), NULL_TREE); } /* Given an object INSTANCE, return an expression which yields the --- 235,395 ---- 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 (code, expr, binfo, nonnull) ! 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; ! 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 (!v_binfo && TREE_VIA_VIRTUAL (probe)) ! v_binfo = probe; } ! probe = TYPE_MAIN_VARIANT (TREE_TYPE (expr)); ! if (want_pointer) ! probe = TYPE_MAIN_VARIANT (TREE_TYPE (probe)); ! ! my_friendly_assert (code == MINUS_EXPR ! ? same_type_p (BINFO_TYPE (binfo), probe) ! : code == PLUS_EXPR ! ? same_type_p (BINFO_TYPE (d_binfo), probe) ! : false, 20010723); ! ! if (code == MINUS_EXPR && v_binfo) { ! error ("cannot convert from base `%T' to derived type `%T' via virtual base `%T'", ! BINFO_TYPE (binfo), BINFO_TYPE (d_binfo), BINFO_TYPE (v_binfo)); ! return error_mark_node; } fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull); ! if (fixed_type_p <= 0 && TREE_SIDE_EFFECTS (expr)) expr = save_expr (expr); ! if (!want_pointer) ! expr = build_unary_op (ADDR_EXPR, expr, 0); ! else if (!nonnull) ! null_test = build (EQ_EXPR, boolean_type_node, expr, integer_zero_node); ! ! offset = BINFO_OFFSET (binfo); ! ! if (v_binfo && fixed_type_p <= 0) { ! /* 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 = build_vfield_ref (build_indirect_ref (expr, NULL), ! TREE_TYPE (TREE_TYPE (expr))); ! ! v_binfo = binfo_for_vbase (BINFO_TYPE (v_binfo), BINFO_TYPE (d_binfo)); ! ! v_offset = build (PLUS_EXPR, TREE_TYPE (v_offset), ! v_offset, BINFO_VPTR_FIELD (v_binfo)); ! v_offset = build1 (NOP_EXPR, ! build_pointer_type (ptrdiff_type_node), ! v_offset); ! v_offset = build_indirect_ref (v_offset, NULL); ! ! offset = cp_convert (ptrdiff_type_node, ! size_diffop (offset, BINFO_OFFSET (v_binfo))); ! if (!integer_zerop (offset)) ! v_offset = build (code, ptrdiff_type_node, v_offset, offset); ! 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 = build (COND_EXPR, ptrdiff_type_node, ! build (EQ_EXPR, boolean_type_node, ! current_in_charge_parm, integer_zero_node), ! v_offset, ! BINFO_OFFSET (binfo)); ! else ! offset = v_offset; } ! target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo); ! ! target_type = cp_build_qualified_type ! (target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr)))); ! ptr_target_type = build_pointer_type (target_type); ! if (want_pointer) ! target_type = ptr_target_type; ! ! expr = build1 (NOP_EXPR, ptr_target_type, expr); ! if (!integer_zerop (offset)) ! expr = build (code, ptr_target_type, expr, offset); else ! null_test = NULL; ! ! if (!want_pointer) ! expr = build_indirect_ref (expr, NULL); ! if (null_test) ! expr = build (COND_EXPR, target_type, null_test, ! build1 (NOP_EXPR, target_type, integer_zero_node), ! expr); ! return expr; } /* Virtual function things. */ ! static tree ! build_vtable_entry_ref (array_ref, instance, idx) ! tree array_ref, instance, idx; ! { ! tree i, i2, vtable, first_fn, basetype; ! basetype = TREE_TYPE (instance); ! if (TREE_CODE (basetype) == REFERENCE_TYPE) ! basetype = TREE_TYPE (basetype); ! vtable = get_vtbl_decl_for_binfo (TYPE_BINFO (basetype)); ! first_fn = TYPE_BINFO_VTABLE (basetype); ! i = fold (build_array_ref (first_fn, idx)); ! i = fold (build_c_cast (ptrdiff_type_node, ! build_unary_op (ADDR_EXPR, i, 0))); ! i2 = fold (build_array_ref (vtable, build_int_2 (0,0))); ! i2 = fold (build_c_cast (ptrdiff_type_node, ! build_unary_op (ADDR_EXPR, i2, 0))); ! i = fold (cp_build_binary_op (MINUS_EXPR, i, i2)); ! if (TREE_CODE (i) != INTEGER_CST) ! abort (); ! return build (VTABLE_REF, TREE_TYPE (array_ref), array_ref, vtable, i); } /* Given an object INSTANCE, return an expression which yields the *************** build_vtable_entry_ref (basetype, vtbl, *** 551,558 **** cases for INSTANCE which we take care of here, mainly to avoid creating extra tree nodes when we don't have to. */ ! tree ! build_vtbl_ref (instance, idx) tree instance, idx; { tree vtbl, aref; --- 397,404 ---- cases for INSTANCE which we take care of here, mainly to avoid creating extra tree nodes when we don't have to. */ ! static tree ! build_vtbl_ref_1 (instance, idx) tree instance, idx; { tree vtbl, aref; *************** build_vtbl_ref (instance, idx) *** 603,610 **** { vtbl = TYPE_BINFO_VTABLE (basetype); /* Knowing the dynamic type of INSTANCE we can easily obtain ! the correct vtable entry. In the new ABI, we resolve ! this back to be in terms of the primary vtable. */ if (TREE_CODE (vtbl) == PLUS_EXPR) { idx = fold (build (PLUS_EXPR, --- 449,456 ---- { vtbl = TYPE_BINFO_VTABLE (basetype); /* Knowing the dynamic type of INSTANCE we can easily obtain ! the correct vtable entry. We resolve this back to be in ! terms of the primary vtable. */ if (TREE_CODE (vtbl) == PLUS_EXPR) { idx = fold (build (PLUS_EXPR, *************** build_vtbl_ref (instance, idx) *** 623,676 **** assemble_external (vtbl); - if (flag_vtable_gc) - build_vtable_entry_ref (basetype, vtbl, idx); - aref = build_array_ref (vtbl, idx); return aref; } - /* Given an object INSTANCE, return an expression which yields the - virtual function 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. */ - tree ! build_vfn_ref (ptr_to_instptr, instance, idx) ! tree *ptr_to_instptr, instance; ! tree idx; { ! tree aref = build_vtbl_ref (instance, idx); ! /* When using thunks, there is no extra delta, and we get the pfn ! directly. */ ! if (flag_vtable_thunks) ! { ! /* When using function descriptors, the address of the ! vtable entry is treated as a function pointer. */ ! if (TARGET_VTABLE_USES_DESCRIPTORS) ! return build1 (NOP_EXPR, TREE_TYPE (aref), ! build_unary_op (ADDR_EXPR, aref, /*noconvert=*/1)); ! return aref; ! } ! if (ptr_to_instptr) ! { ! /* Save the intermediate result in a SAVE_EXPR so we don't have to ! compute each component of the virtual function pointer twice. */ ! if (TREE_CODE (aref) == INDIRECT_REF) ! TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0)); ! *ptr_to_instptr ! = build (PLUS_EXPR, TREE_TYPE (*ptr_to_instptr), ! *ptr_to_instptr, ! cp_convert (ptrdiff_type_node, ! build_component_ref (aref, delta_identifier, NULL_TREE, 0))); ! } ! return build_component_ref (aref, pfn_identifier, NULL_TREE, 0); } /* Return the name of the virtual function table (as an IDENTIFIER_NODE) --- 469,510 ---- assemble_external (vtbl); aref = build_array_ref (vtbl, idx); return aref; } tree ! build_vtbl_ref (instance, idx) ! tree instance, idx; { ! tree aref = build_vtbl_ref_1 (instance, idx); ! if (flag_vtable_gc) ! aref = build_vtable_entry_ref (aref, instance, idx); ! return aref; ! } ! /* Given an object INSTANCE, return an expression which yields a ! function pointer corresponding to vtable element INDEX. */ ! tree ! build_vfn_ref (instance, idx) ! tree instance, idx; ! { ! tree aref = build_vtbl_ref_1 (instance, 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), ! build_unary_op (ADDR_EXPR, aref, /*noconvert=*/1)); ! ! if (flag_vtable_gc) ! aref = build_vtable_entry_ref (aref, instance, idx); ! ! return aref; } /* Return the name of the virtual function table (as an IDENTIFIER_NODE) *************** build_primary_vtable (binfo, type) *** 826,840 **** return 1; } ! /* Give TYPE 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 derived type which caused this table to be needed. ! BINFO is the type association which provided TYPE for FOR_TYPE. The order in which vtables are built (by calling this function) for an object must remain the same, otherwise a binary incompatibility --- 660,674 ---- 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 non-zero 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 *************** static int *** 844,986 **** build_secondary_vtable (binfo, for_type) tree binfo, for_type; { ! tree basetype; ! tree orig_decl = BINFO_VTABLE (binfo); ! tree name; ! tree new_decl; ! tree offset; ! tree path = binfo; ! char *buf; ! const char *buf2; ! char joiner = '_'; ! int i; ! ! #ifdef JOINER ! joiner = JOINER; ! #endif ! ! if (TREE_VIA_VIRTUAL (binfo)) ! my_friendly_assert (binfo == binfo_for_vbase (BINFO_TYPE (binfo), ! current_class_type), ! 170); ! if (BINFO_NEW_VTABLE_MARKED (binfo, current_class_type)) /* We already created a vtable for this base. There's no need to do it again. */ return 0; /* Remember that we've created a vtable for this BINFO, so that we don't try to do so again. */ ! SET_BINFO_NEW_VTABLE_MARKED (binfo, current_class_type); /* Make fresh virtual list, so we can smash it later. */ BINFO_VIRTUALS (binfo) = copy_virtuals (binfo); ! my_friendly_assert (binfo == CANONICAL_BINFO (binfo, for_type), 20010605); ! offset = BINFO_OFFSET (binfo); ! ! /* In the new ABI, secondary vtables are laid out as part of the ! same structure as the primary vtable. */ ! if (merge_primary_and_secondary_vtables_p ()) ! { ! BINFO_VTABLE (binfo) = NULL_TREE; ! return 1; ! } ! ! /* Create the declaration for the secondary vtable. */ ! basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (binfo)); ! buf2 = TYPE_ASSEMBLER_NAME_STRING (basetype); ! i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1; ! ! /* We know that the vtable that we are going to create doesn't exist ! yet in the global namespace, and when we finish, it will be ! pushed into the global namespace. In complex MI hierarchies, we ! have to loop while the name we are thinking of adding is globally ! defined, adding more name components to the vtable name as we ! loop, until the name is unique. This is because in complex MI ! cases, we might have the same base more than once. This means ! that the order in which this function is called for vtables must ! remain the same, otherwise binary compatibility can be ! compromised. */ ! ! while (1) ! { ! char *buf1 = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (for_type) ! + 1 + i); ! char *new_buf2; ! ! sprintf (buf1, "%s%c%s", TYPE_ASSEMBLER_NAME_STRING (for_type), joiner, ! buf2); ! buf = (char *) alloca (strlen (VTABLE_NAME_PREFIX) + strlen (buf1) + 1); ! sprintf (buf, "%s%s", VTABLE_NAME_PREFIX, buf1); ! name = get_identifier (buf); ! ! /* If this name doesn't clash, then we can use it, otherwise ! we add more to the name until it is unique. */ ! ! if (! IDENTIFIER_GLOBAL_VALUE (name)) ! break; ! ! /* Set values for next loop through, if the name isn't unique. */ ! ! path = BINFO_INHERITANCE_CHAIN (path); ! ! /* We better not run out of stuff to make it unique. */ ! my_friendly_assert (path != NULL_TREE, 368); ! ! basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (path)); ! ! if (for_type == basetype) ! { ! /* If we run out of basetypes in the path, we have already ! found created a vtable with that name before, we now ! resort to tacking on _%d to distinguish them. */ ! int j = 2; ! i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i + 1 + 3; ! buf1 = (char *) alloca (i); ! do { ! sprintf (buf1, "%s%c%s%c%d", ! TYPE_ASSEMBLER_NAME_STRING (basetype), joiner, ! buf2, joiner, j); ! buf = (char *) alloca (strlen (VTABLE_NAME_PREFIX) ! + strlen (buf1) + 1); ! sprintf (buf, "%s%s", VTABLE_NAME_PREFIX, buf1); ! name = get_identifier (buf); ! ! /* If this name doesn't clash, then we can use it, ! otherwise we add something different to the name until ! it is unique. */ ! } while (++j <= 999 && IDENTIFIER_GLOBAL_VALUE (name)); ! ! /* Hey, they really like MI don't they? Increase the 3 ! above to 6, and the 999 to 999999. :-) */ ! my_friendly_assert (j <= 999, 369); ! ! break; ! } ! ! i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i; ! new_buf2 = (char *) alloca (i); ! sprintf (new_buf2, "%s%c%s", ! TYPE_ASSEMBLER_NAME_STRING (basetype), joiner, buf2); ! buf2 = new_buf2; ! } ! ! new_decl = build_vtable (for_type, name, TREE_TYPE (orig_decl)); ! DECL_ALIGN (new_decl) = DECL_ALIGN (orig_decl); ! DECL_USER_ALIGN (new_decl) = DECL_USER_ALIGN (orig_decl); ! BINFO_VTABLE (binfo) = pushdecl_top_level (new_decl); ! ! #ifdef GATHER_STATISTICS ! n_vtables += 1; ! n_vtable_elems += list_length (BINFO_VIRTUALS (binfo)); ! #endif ! return 1; } /* Create a new vtable for BINFO which is the hierarchy dominated by ! T. */ static int make_new_vtable (t, binfo) --- 678,705 ---- build_secondary_vtable (binfo, for_type) tree binfo, for_type; { ! my_friendly_assert (binfo == CANONICAL_BINFO (binfo, for_type), 20010605); ! if (BINFO_NEW_VTABLE_MARKED (binfo, for_type)) /* We already created a vtable for this base. There's no need to do it again. */ return 0; /* Remember that we've created a vtable for this BINFO, so that we don't try to do so again. */ ! SET_BINFO_NEW_VTABLE_MARKED (binfo, for_type); /* Make fresh virtual list, so we can smash it later. */ BINFO_VIRTUALS (binfo) = copy_virtuals (binfo); ! /* 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 non-zero if we actually created a new vtable. */ static int make_new_vtable (t, binfo) *************** add_method (type, method, error_p) *** 1194,1202 **** new_len = len + 1; new_vec = make_tree_vec (new_len); ! bcopy ((PTR) &TREE_VEC_ELT (method_vec, 0), ! (PTR) &TREE_VEC_ELT (new_vec, 0), ! len * sizeof (tree)); len = new_len; method_vec = CLASSTYPE_METHOD_VEC (type) = new_vec; } --- 913,920 ---- new_len = len + 1; new_vec = make_tree_vec (new_len); ! memcpy (&TREE_VEC_ELT (new_vec, 0), &TREE_VEC_ELT (method_vec, 0), ! len * sizeof (tree)); len = new_len; method_vec = CLASSTYPE_METHOD_VEC (type) = new_vec; } *************** add_method (type, method, error_p) *** 1233,1241 **** /* We know the last slot in the vector is empty because we know that at this point there's room for a new function. */ ! bcopy ((PTR) &TREE_VEC_ELT (method_vec, slot), ! (PTR) &TREE_VEC_ELT (method_vec, slot + 1), ! (len - slot - 1) * sizeof (tree)); TREE_VEC_ELT (method_vec, slot) = NULL_TREE; } } --- 951,959 ---- /* We know the last slot in the vector is empty because we know that at this point there's room for a new function. */ ! memmove (&TREE_VEC_ELT (method_vec, slot + 1), ! &TREE_VEC_ELT (method_vec, slot), ! (len - slot - 1) * sizeof (tree)); TREE_VEC_ELT (method_vec, slot) = NULL_TREE; } } *************** add_method (type, method, error_p) *** 1299,1305 **** /* Defer to the local function. */ return; else ! cp_error ("`%#D' and `%#D' cannot be overloaded", fn, method); } } --- 1017,1023 ---- /* Defer to the local function. */ return; else ! error ("`%#D' and `%#D' cannot be overloaded", fn, method); } } *************** delete_duplicate_fields_1 (field, fields *** 1382,1388 **** } } else if (TREE_CODE (field) == USING_DECL) ! /* A using declaration may is allowed to appear more than once. We'll prune these from the field list later, and handle_using_decl will complain about invalid multiple uses. */ --- 1100,1106 ---- } } else if (TREE_CODE (field) == USING_DECL) ! /* A using declaration is allowed to appear more than once. We'll prune these from the field list later, and handle_using_decl will complain about invalid multiple uses. */ *************** check_bases (t, cant_have_default_ctor_p *** 1631,1637 **** dtor is handled in finish_struct_1. */ if (warn_ecpp && ! TYPE_POLYMORPHIC_P (basetype) && TYPE_HAS_DESTRUCTOR (basetype)) ! cp_warning ("base class `%#T' has a non-virtual destructor", basetype); /* If the base class doesn't have copy constructors or --- 1349,1355 ---- dtor is handled in finish_struct_1. */ if (warn_ecpp && ! TYPE_POLYMORPHIC_P (basetype) && TYPE_HAS_DESTRUCTOR (basetype)) ! warning ("base class `%#T' has a non-virtual destructor", basetype); /* If the base class doesn't have copy constructors or *************** check_bases (t, cant_have_default_ctor_p *** 1651,1657 **** { *cant_have_default_ctor_p = 1; if (! TYPE_HAS_CONSTRUCTOR (t)) ! cp_pedwarn ("base `%T' with only non-default constructor in class without a constructor", basetype); } --- 1369,1375 ---- { *cant_have_default_ctor_p = 1; if (! TYPE_HAS_CONSTRUCTOR (t)) ! pedwarn ("base `%T' with only non-default constructor in class without a constructor", basetype); } *************** check_bases (t, cant_have_default_ctor_p *** 1685,1708 **** TYPE_OVERLOADS_ARRAY_REF (t) |= TYPE_OVERLOADS_ARRAY_REF (basetype); TYPE_OVERLOADS_ARROW (t) |= TYPE_OVERLOADS_ARROW (basetype); TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype); - - /* Derived classes can implicitly become COMified if their bases - are COM. */ - if (CLASSTYPE_COM_INTERFACE (basetype)) - CLASSTYPE_COM_INTERFACE (t) = 1; - else if (i == 0 && CLASSTYPE_COM_INTERFACE (t)) - { - cp_error - ("COM interface type `%T' with non-COM leftmost base class `%T'", - t, basetype); - CLASSTYPE_COM_INTERFACE (t) = 0; - } } } ! /* Binfo FROM is within a virtual heirarchy which is being reseated to TO. Move primary information from FROM to TO, and recursively traverse ! into FROM's bases. The heirarchy is dominated by TYPE. MAPPINGS is an assoc list of binfos that have already been reseated. */ static void --- 1403,1414 ---- TYPE_OVERLOADS_ARRAY_REF (t) |= TYPE_OVERLOADS_ARRAY_REF (basetype); TYPE_OVERLOADS_ARROW (t) |= TYPE_OVERLOADS_ARROW (basetype); TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype); } } ! /* Binfo FROM is within a virtual hierarchy which is being reseated to TO. Move primary information from FROM to TO, and recursively traverse ! into FROM's bases. The hierarchy is dominated by TYPE. MAPPINGS is an assoc list of binfos that have already been reseated. */ static void *************** force_canonical_binfo_r (to, from, type, *** 1768,1774 **** } /* FROM is the canonical binfo for a virtual base. It is being reseated to ! make TO the canonical binfo, within the heirarchy dominated by TYPE. MAPPINGS is an assoc list of binfos that have already been reseated. Adjust any non-virtual bases within FROM, and also move any virtual bases which are canonical. This complication arises because selecting primary --- 1474,1480 ---- } /* FROM is the canonical binfo for a virtual base. It is being reseated to ! make TO the canonical binfo, within the hierarchy dominated by TYPE. MAPPINGS is an assoc list of binfos that have already been reseated. Adjust any non-virtual bases within FROM, and also move any virtual bases which are canonical. This complication arises because selecting primary *************** mark_primary_virtual_base (base_binfo, t *** 1807,1813 **** if (BINFO_PRIMARY_P (shared_binfo)) { /* It's already allocated in the hierarchy. BINFO won't have a ! primary base in this hierachy, even though the complete object BINFO is for, would do. */ return NULL_TREE; } --- 1513,1519 ---- if (BINFO_PRIMARY_P (shared_binfo)) { /* It's already allocated in the hierarchy. BINFO won't have a ! primary base in this hierarchy, even though the complete object BINFO is for, would do. */ return NULL_TREE; } *************** determine_primary_base (t, vfuns_p) *** 1965,1973 **** if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) CLASSTYPE_RTTI (t) = CLASSTYPE_RTTI (basetype); ! /* A virtual baseclass can't be the primary base under the ! old ABI. And under the new ABI we still prefer a ! non-virtual base. */ if (TREE_VIA_VIRTUAL (base_binfo)) continue; --- 1671,1678 ---- if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) CLASSTYPE_RTTI (t) = CLASSTYPE_RTTI (basetype); ! /* We prefer a non-virtual base, although a virtual one will ! do. */ if (TREE_VIA_VIRTUAL (base_binfo)) continue; *************** determine_primary_base (t, vfuns_p) *** 2036,2044 **** } } ! /* The new ABI allows for the use of a "nearly-empty" virtual base ! class as the primary base class if no non-virtual polymorphic ! base can be found. */ if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) { /* If not NULL, this is the best primary base candidate we have --- 1741,1748 ---- } } ! /* A "nearly-empty" virtual base class can be the primary base ! class, if no non-virtual polymorphic base can be found. */ if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) { /* If not NULL, this is the best primary base candidate we have *************** finish_struct_bits (t) *** 2146,2162 **** } } ! /* If this type has a copy constructor, 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. ! ! Also do this if the class has BLKmode but can still be returned in ! registers, since function_cannot_inline_p won't let us inline ! functions returning such a type. This affects the HP-PA. */ ! if (! TYPE_HAS_TRIVIAL_INIT_REF (t) ! || (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t) ! && CLASSTYPE_NON_AGGREGATE (t))) { tree variants; DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode; --- 1850,1860 ---- } } ! /* 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_TRIVIAL_INIT_REF (t) || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)) { tree variants; DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode; *************** maybe_warn_about_overly_private_class (t *** 2251,2257 **** } if (!has_nonprivate_method) { ! cp_warning ("all member functions in class `%T' are private", t); return; } } --- 1949,1955 ---- } if (!has_nonprivate_method) { ! warning ("all member functions in class `%T' are private", t); return; } } *************** maybe_warn_about_overly_private_class (t *** 2265,2271 **** if (TREE_PRIVATE (dtor)) { ! cp_warning ("`%#T' only defines a private destructor and has no friends", t); return; } --- 1963,1969 ---- if (TREE_PRIVATE (dtor)) { ! warning ("`%#T' only defines a private destructor and has no friends", t); return; } *************** maybe_warn_about_overly_private_class (t *** 2308,2314 **** if (nonprivate_ctor == 0) { ! cp_warning ("`%#T' only defines private constructors and has no friends", t); return; } --- 2006,2012 ---- if (nonprivate_ctor == 0) { ! warning ("`%#T' only defines private constructors and has no friends", t); return; } *************** void *** 2429,2435 **** duplicate_tag_error (t) tree t; { ! cp_error ("redefinition of `%#T'", t); cp_error_at ("previous definition of `%#T'", t); /* Pretend we haven't defined this type. */ --- 2127,2133 ---- duplicate_tag_error (t) tree t; { ! error ("redefinition of `%#T'", t); cp_error_at ("previous definition of `%#T'", t); /* Pretend we haven't defined this type. */ *************** duplicate_tag_error (t) *** 2481,2487 **** TYPE_METHODS (t) = NULL_TREE; TYPE_VFIELD (t) = NULL_TREE; TYPE_CONTEXT (t) = NULL_TREE; - TYPE_NONCOPIED_PARTS (t) = NULL_TREE; /* Clear TYPE_LANG_FLAGS -- those in TYPE_LANG_SPECIFIC are cleared above. */ TYPE_LANG_FLAG_0 (t) = 0; --- 2179,2184 ---- *************** duplicate_tag_error (t) *** 2495,2501 **** SET_IS_AGGR_TYPE (t, 1); } ! /* Make the BINFO's vtablehave N entries, including RTTI entries, vbase and vcall offsets, etc. Set its type and call the backend to lay it out. */ --- 2192,2198 ---- SET_IS_AGGR_TYPE (t, 1); } ! /* Make BINFO's vtable have N entries, including RTTI entries, vbase and vcall offsets, etc. Set its type and call the backend to lay it out. */ *************** find_final_overrider (t, binfo, fn) *** 2761,2767 **** /* If there was no winner, issue an error message. */ if (!ffod.overriding_fn) { ! cp_error ("no unique final overrider for `%D' in `%T'", fn, t); return error_mark_node; } --- 2458,2464 ---- /* If there was no winner, issue an error message. */ if (!ffod.overriding_fn) { ! error ("no unique final overrider for `%D' in `%T'", fn, t); return error_mark_node; } *************** dfs_modify_vtables (binfo, data) *** 2921,2929 **** t = (tree) data; - /* If we're supporting RTTI then we always need a new vtable to - point to the RTTI information. Under the new ABI we may need - a new vtable to contain vcall and vbase offsets. */ make_new_vtable (t, binfo); /* Now, go through each of the virtual functions in the virtual --- 2618,2623 ---- *************** modify_all_vtables (t, vfuns_p, overridd *** 2960,2968 **** int *vfuns_p; tree overridden_virtuals; { ! tree binfo; ! ! binfo = TYPE_BINFO (t); /* Update all of the vtables. */ dfs_walk (binfo, --- 2654,2661 ---- int *vfuns_p; tree overridden_virtuals; { ! tree binfo = TYPE_BINFO (t); ! tree *fnsp; /* Update all of the vtables. */ dfs_walk (binfo, *************** modify_all_vtables (t, vfuns_p, overridd *** 2971,3029 **** t); dfs_walk (binfo, dfs_unmark, dfs_marked_real_bases_queue_p, t); ! /* If we should include overriding functions for secondary vtables ! in our primary vtable, add them now. */ ! if (all_overridden_vfuns_in_vtables_p ()) { ! tree *fnsp = &overridden_virtuals; ! while (*fnsp) { ! tree fn = TREE_VALUE (*fnsp); ! ! if (!BINFO_VIRTUALS (binfo) ! || !value_member (fn, BINFO_VIRTUALS (binfo))) ! { ! /* Set the vtable index. */ ! set_vindex (fn, vfuns_p); ! /* We don't need to convert to a base class when calling ! this function. */ ! DECL_VIRTUAL_CONTEXT (fn) = t; ! /* 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 an overridden 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); } } ! else ! overridden_virtuals = NULL_TREE; ! return overridden_virtuals; } /* Here, we already know that they match in every respect. ! All we have to check is where they had their declarations. */ static int strictly_overrides (fndecl1, fndecl2) tree fndecl1, fndecl2; { ! int distance = get_base_distance (DECL_CONTEXT (fndecl2), ! DECL_CONTEXT (fndecl1), ! 0, (tree *)0); ! if (distance == -2 || distance > 0) ! return 1; ! return 0; } /* Get the base virtual function declarations in T that have the --- 2664,2717 ---- t); dfs_walk (binfo, dfs_unmark, dfs_marked_real_bases_queue_p, t); ! /* Include overriding functions for secondary vtables in our primary ! vtable. */ ! for (fnsp = &overridden_virtuals; *fnsp; ) { ! tree fn = TREE_VALUE (*fnsp); ! if (!BINFO_VIRTUALS (binfo) ! || !value_member (fn, BINFO_VIRTUALS (binfo))) { ! /* Set the vtable index. */ ! set_vindex (fn, vfuns_p); ! /* We don't need to convert to a base class when calling ! this function. */ ! DECL_VIRTUAL_CONTEXT (fn) = t; ! /* 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 an overridden 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 overridden_virtuals; } /* Here, we already know that they match in every respect. ! All we have to check is where they had their declarations. ! ! Return non-zero iff FNDECL1 is declared in a class which has a ! proper base class containing FNDECL2. We don't care about ! ambiguity or accessibility. */ static int strictly_overrides (fndecl1, fndecl2) tree fndecl1, fndecl2; { ! base_kind kind; ! ! return (lookup_base (DECL_CONTEXT (fndecl1), DECL_CONTEXT (fndecl2), ! ba_ignore | ba_quiet, &kind) ! && kind != bk_same_type); } /* Get the base virtual function declarations in T that have the *************** finish_struct_anon (t) *** 3182,3188 **** tree elt = TYPE_FIELDS (TREE_TYPE (field)); for (; elt; elt = TREE_CHAIN (elt)) { ! if (DECL_ARTIFICIAL (elt)) continue; if (DECL_NAME (elt) == constructor_name (t)) --- 2870,2885 ---- tree elt = TYPE_FIELDS (TREE_TYPE (field)); for (; elt; elt = TREE_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 (DECL_NAME (elt) == constructor_name (t)) *************** add_implicitly_declared_members (t, cant *** 3233,3238 **** --- 2930,2937 ---- tree virtual_dtor = NULL_TREE; tree *f; + ++adding_implicit_members; + /* Destructor. */ if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) && !TYPE_HAS_DESTRUCTOR (t)) { *************** add_implicitly_declared_members (t, cant *** 3292,3297 **** --- 2991,2998 ---- *f = TYPE_METHODS (t); TYPE_METHODS (t) = implicit_fns; + --adding_implicit_members; + return virtual_dtor; } *************** check_bitfield_decl (field) *** 3407,3413 **** DECL_SIZE (field) = convert (bitsizetype, w); DECL_BIT_FIELD (field) = 1; ! if (integer_zerop (w)) { #ifdef EMPTY_FIELD_BOUNDARY DECL_ALIGN (field) = MAX (DECL_ALIGN (field), --- 3108,3115 ---- DECL_SIZE (field) = convert (bitsizetype, w); DECL_BIT_FIELD (field) = 1; ! if (integer_zerop (w) ! && ! (* targetm.ms_bitfield_layout_p) (DECL_FIELD_CONTEXT (field))) { #ifdef EMPTY_FIELD_BOUNDARY DECL_ALIGN (field) = MAX (DECL_ALIGN (field), *************** check_field_decls (t, access_decls, empt *** 3585,3592 **** tree x = *field; tree type = TREE_TYPE (x); - GNU_xref_member (current_class_name, x); - next = &TREE_CHAIN (x); if (TREE_CODE (x) == FIELD_DECL) --- 3287,3292 ---- *************** check_field_decls (t, access_decls, empt *** 3758,3773 **** if (has_pointers && warn_ecpp && TYPE_HAS_CONSTRUCTOR (t) && ! (TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t))) { ! cp_warning ("`%#T' has pointer data members", t); if (! TYPE_HAS_INIT_REF (t)) { ! cp_warning (" but does not override `%T(const %T&)'", t, t); if (! TYPE_HAS_ASSIGN_REF (t)) ! cp_warning (" or `operator=(const %T&)'", t); } else if (! TYPE_HAS_ASSIGN_REF (t)) ! cp_warning (" but does not override `operator=(const %T&)'", t); } --- 3458,3473 ---- if (has_pointers && warn_ecpp && TYPE_HAS_CONSTRUCTOR (t) && ! (TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t))) { ! warning ("`%#T' has pointer data members", t); if (! TYPE_HAS_INIT_REF (t)) { ! warning (" but does not override `%T(const %T&)'", t, t); if (! TYPE_HAS_ASSIGN_REF (t)) ! warning (" or `operator=(const %T&)'", t); } else if (! TYPE_HAS_ASSIGN_REF (t)) ! warning (" but does not override `operator=(const %T&)'", t); } *************** check_field_decls (t, access_decls, empt *** 3779,3821 **** *access_decls = nreverse (*access_decls); } - /* Return a FIELD_DECL for a pointer-to-virtual-table or - pointer-to-virtual-base. The NAME, ASSEMBLER_NAME, and TYPE of the - field are as indicated. The CLASS_TYPE in which this field occurs - is also indicated. FCONTEXT is the type that is needed for the debug - info output routines. *EMPTY_P is set to a non-zero value by this - function to indicate that a class containing this field is - non-empty. */ - - static tree - build_vtbl_or_vbase_field (name, assembler_name, type, class_type, fcontext, - empty_p) - tree name; - tree assembler_name; - tree type; - tree class_type; - tree fcontext; - int *empty_p; - { - tree field; - - /* This class is non-empty. */ - *empty_p = 0; - - /* Build the FIELD_DECL. */ - field = build_decl (FIELD_DECL, name, type); - SET_DECL_ASSEMBLER_NAME (field, assembler_name); - DECL_VIRTUAL_P (field) = 1; - DECL_ARTIFICIAL (field) = 1; - DECL_FIELD_CONTEXT (field) = class_type; - DECL_FCONTEXT (field) = fcontext; - DECL_ALIGN (field) = TYPE_ALIGN (type); - DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (type); - - /* Return it. */ - return field; - } - /* If TYPE is an empty class type, records its OFFSET in the table of OFFSETS. */ --- 3479,3484 ---- *************** build_base_fields (rli, empty_p, offsets *** 4222,4229 **** int i; bool atend = 0; ! /* Under the new ABI, the primary base class is always allocated ! first. */ if (CLASSTYPE_HAS_PRIMARY_BASE_P (rec)) build_base_field (rli, CLASSTYPE_PRIMARY_BINFO (rec), empty_p, offsets, t); --- 3885,3891 ---- int i; bool atend = 0; ! /* The primary base class is always allocated first. */ if (CLASSTYPE_HAS_PRIMARY_BASE_P (rec)) build_base_field (rli, CLASSTYPE_PRIMARY_BINFO (rec), empty_p, offsets, t); *************** build_base_fields (rli, empty_p, offsets *** 4235,4242 **** base_binfo = BINFO_BASETYPE (TYPE_BINFO (rec), i); ! /* Under the new ABI, the primary base was already allocated ! above, so we don't need to allocate it again here. */ if (base_binfo == CLASSTYPE_PRIMARY_BINFO (rec)) continue; --- 3897,3904 ---- base_binfo = BINFO_BASETYPE (TYPE_BINFO (rec), i); ! /* The primary base was already allocated above, so we don't ! need to allocate it again here. */ if (base_binfo == CLASSTYPE_PRIMARY_BINFO (rec)) continue; *************** check_methods (t) *** 4261,4272 **** tree t; { tree x; - int seen_one_arg_array_delete_p = 0; for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x)) { - GNU_xref_member (current_class_name, x); - /* If this was an evil function, don't keep it in class. */ if (DECL_ASSEMBLER_NAME_SET_P (x) && IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (x))) --- 3923,3931 ---- *************** check_methods (t) *** 4285,4316 **** CLASSTYPE_PURE_VIRTUALS (t) = tree_cons (NULL_TREE, x, CLASSTYPE_PURE_VIRTUALS (t)); } - - if (DECL_ARRAY_DELETE_OPERATOR_P (x)) - { - tree second_parm; - - /* When dynamically allocating an array of this type, we - need a "cookie" to record how many elements we allocated, - even if the array elements have no non-trivial - destructor, if the usual array deallocation function - takes a second argument of type size_t. The standard (in - [class.free]) requires that the second argument be set - correctly. */ - second_parm = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (x))); - /* Under the new ABI, we choose only those function that are - explicitly declared as `operator delete[] (void *, - size_t)'. */ - if (!seen_one_arg_array_delete_p - && second_parm - && TREE_CHAIN (second_parm) == void_list_node - && same_type_p (TREE_VALUE (second_parm), sizetype)) - TYPE_VEC_DELETE_TAKES_SIZE (t) = 1; - /* If there's no second parameter, then this is the usual - deallocation function. */ - else if (second_parm == void_list_node) - seen_one_arg_array_delete_p = 1; - } } } --- 3944,3949 ---- *************** remove_zero_width_bit_fields (t) *** 4607,4612 **** --- 4240,4298 ---- } } + /* 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 (type) + tree type; + { + tree fns; + bool has_two_argument_delete_p = false; + + my_friendly_assert (CLASS_TYPE_P (type), 20010712); + + /* 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 = TREE_VALUE (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; + /* 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), sizetype)) + has_two_argument_delete_p = true; + } + + return has_two_argument_delete_p; + } + /* 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 *************** check_bases_and_members (t, empty_p) *** 4692,4697 **** --- 4378,4388 ---- /* 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)->vec_new_uses_cookie + = type_requires_array_cookie (t); } /* If T needs a pointer to its virtual function table, set TYPE_VFIELD *************** create_vtable_ptr (t, empty_p, vfuns_p, *** 4722,4730 **** 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) ! && (*vfuns_p ! || (TYPE_CONTAINS_VPTR_P (t) && vptrs_present_everywhere_p ()))) { /* We build this decl with vtbl_ptr_type_node, which is a `vtable_entry_type*'. It might seem more precise to use --- 4413,4419 ---- 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) && (*vfuns_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 *************** create_vtable_ptr (t, empty_p, vfuns_p, *** 4745,4757 **** 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*! */ ! TYPE_VFIELD (t) ! = build_vtbl_or_vbase_field (get_vfield_name (t), ! get_identifier (VFIELD_BASE), ! vtbl_ptr_type_node, ! t, ! t, ! empty_p); if (CLASSTYPE_N_BASECLASSES (t)) /* If there were any baseclasses, they can't possibly be at --- 4434,4454 ---- 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 (FIELD_DECL, get_vfield_name (t), vtbl_ptr_type_node); ! SET_DECL_ASSEMBLER_NAME (field, get_identifier (VFIELD_BASE)); ! DECL_VIRTUAL_P (field) = 1; ! DECL_ARTIFICIAL (field) = 1; ! DECL_FIELD_CONTEXT (field) = t; ! DECL_FCONTEXT (field) = t; ! DECL_ALIGN (field) = TYPE_ALIGN (vtbl_ptr_type_node); ! DECL_USER_ALIGN (field) = TYPE_USER_ALIGN (vtbl_ptr_type_node); ! ! TYPE_VFIELD (t) = field; ! ! /* This class is non-empty. */ ! *empty_p = 0; if (CLASSTYPE_N_BASECLASSES (t)) /* If there were any baseclasses, they can't possibly be at *************** create_vtable_ptr (t, empty_p, vfuns_p, *** 4760,4766 **** take work. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (t) = 1; ! return TYPE_VFIELD (t); } return NULL_TREE; --- 4457,4463 ---- take work. */ TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (t) = 1; ! return field; } return NULL_TREE; *************** layout_virtual_bases (t, offsets) *** 4909,4916 **** tree t; splay_tree offsets; { ! tree vbases; ! unsigned HOST_WIDE_INT dsize; unsigned HOST_WIDE_INT eoc; if (CLASSTYPE_N_BASECLASSES (t) == 0) --- 4606,4612 ---- tree t; splay_tree offsets; { ! tree vbases, dsize; unsigned HOST_WIDE_INT eoc; if (CLASSTYPE_N_BASECLASSES (t) == 0) *************** layout_virtual_bases (t, offsets) *** 4923,4938 **** #endif /* DSIZE is the size of the class without the virtual bases. */ ! dsize = tree_low_cst (TYPE_SIZE (t), 1); /* Make every class have alignment of at least one. */ TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), BITS_PER_UNIT); /* Go through the virtual bases, allocating space for each virtual ! base that is not already a primary base class. Under the old ! ABI, these are allocated according to a depth-first left-to-right ! postorder traversal; in the new ABI, inheritance graph order is ! used instead. */ for (vbases = TYPE_BINFO (t); vbases; vbases = TREE_CHAIN (vbases)) --- 4619,4632 ---- #endif /* DSIZE is the size of the class without the virtual bases. */ ! dsize = TYPE_SIZE (t); /* Make every class have alignment of at least one. */ TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), BITS_PER_UNIT); /* Go through the virtual bases, allocating space for each virtual ! base that is not already a primary base class. These are ! allocated in inheritance graph order. */ for (vbases = TYPE_BINFO (t); vbases; vbases = TREE_CHAIN (vbases)) *************** layout_virtual_bases (t, offsets) *** 4947,4953 **** { /* This virtual base is not a primary base of any class in the hierarchy, so we have to add space for it. */ ! tree basetype; unsigned int desired_align; basetype = BINFO_TYPE (vbase); --- 4641,4647 ---- { /* This virtual base is not a primary base of any class in the hierarchy, so we have to add space for it. */ ! tree basetype, usize; unsigned int desired_align; basetype = BINFO_TYPE (vbase); *************** layout_virtual_bases (t, offsets) *** 4957,4975 **** /* Add padding so that we can put the virtual base class at an appropriately aligned offset. */ ! dsize = CEIL (dsize, desired_align) * desired_align; ! /* Under the new ABI, we try to squish empty virtual bases in ! just like ordinary empty bases. */ if (is_empty_class (basetype)) layout_empty_base (vbase, ! size_int (CEIL (dsize, BITS_PER_UNIT)), offsets, t); else { tree offset; ! offset = ssize_int (CEIL (dsize, BITS_PER_UNIT)); offset = size_diffop (offset, convert (ssizetype, BINFO_OFFSET (vbase))); --- 4651,4671 ---- /* Add padding so that we can put the virtual base class at an appropriately aligned offset. */ ! dsize = round_up (dsize, desired_align); ! usize = size_binop (CEIL_DIV_EXPR, dsize, bitsize_unit_node); ! ! /* We try to squish empty virtual bases in just like ! ordinary empty bases. */ if (is_empty_class (basetype)) layout_empty_base (vbase, ! convert (sizetype, usize), offsets, t); else { tree offset; ! offset = convert (ssizetype, usize); offset = size_diffop (offset, convert (ssizetype, BINFO_OFFSET (vbase))); *************** layout_virtual_bases (t, offsets) *** 4979,4986 **** /* Every virtual baseclass takes a least a UNIT, so that we can take it's address and get something different for each base. */ ! dsize += MAX (BITS_PER_UNIT, ! tree_low_cst (CLASSTYPE_SIZE (basetype), 0)); } /* Keep track of the offsets assigned to this virtual base. */ --- 4675,4683 ---- /* Every virtual baseclass takes a least a UNIT, so that we can take it's address and get something different for each base. */ ! dsize = size_binop (PLUS_EXPR, dsize, ! size_binop (MAX_EXPR, bitsize_unit_node, ! CLASSTYPE_SIZE (basetype))); } /* Keep track of the offsets assigned to this virtual base. */ *************** layout_virtual_bases (t, offsets) *** 4994,5000 **** /* Now, go through the TYPE_BINFO hierarchy, setting the BINFO_OFFSETs correctly for all non-primary copies of the virtual bases and their direct and indirect bases. The ambiguity checks ! in get_base_distance depend on the BINFO_OFFSETs being set correctly. */ dfs_walk (TYPE_BINFO (t), dfs_set_offset_for_unshared_vbases, NULL, t); --- 4691,4697 ---- /* Now, go through the TYPE_BINFO hierarchy, setting the BINFO_OFFSETs correctly for all non-primary copies of the virtual bases and their direct and indirect bases. The ambiguity checks ! in lookup_base depend on the BINFO_OFFSETs being set correctly. */ dfs_walk (TYPE_BINFO (t), dfs_set_offset_for_unshared_vbases, NULL, t); *************** layout_virtual_bases (t, offsets) *** 5002,5014 **** class, we didn't update DSIZE above; we were hoping to overlay multiple such bases at the same location. */ eoc = end_of_class (t, /*include_virtuals_p=*/1); ! if (eoc * BITS_PER_UNIT > dsize) ! dsize = eoc * BITS_PER_UNIT; /* Now, make sure that the total size of the type is a multiple of its alignment. */ ! dsize = CEIL (dsize, TYPE_ALIGN (t)) * TYPE_ALIGN (t); ! TYPE_SIZE (t) = bitsize_int (dsize); TYPE_SIZE_UNIT (t) = convert (sizetype, size_binop (CEIL_DIV_EXPR, TYPE_SIZE (t), bitsize_unit_node)); --- 4699,4710 ---- class, we didn't update DSIZE above; we were hoping to overlay multiple such bases at the same location. */ eoc = end_of_class (t, /*include_virtuals_p=*/1); ! dsize = size_binop (MAX_EXPR, dsize, bitsize_int (eoc * BITS_PER_UNIT)); /* Now, make sure that the total size of the type is a multiple of its alignment. */ ! dsize = round_up (dsize, TYPE_ALIGN (t)); ! TYPE_SIZE (t) = dsize; TYPE_SIZE_UNIT (t) = convert (sizetype, size_binop (CEIL_DIV_EXPR, TYPE_SIZE (t), bitsize_unit_node)); *************** layout_virtual_bases (t, offsets) *** 5020,5027 **** vbases = TREE_CHAIN (vbases)) { tree basetype = BINFO_TYPE (TREE_VALUE (vbases)); ! if (get_base_distance (basetype, t, 0, (tree*)0) == -2) ! cp_warning ("virtual base `%T' inaccessible in `%T' due to ambiguity", basetype, t); } } --- 4716,4724 ---- vbases = TREE_CHAIN (vbases)) { tree basetype = BINFO_TYPE (TREE_VALUE (vbases)); ! ! if (!lookup_base (t, basetype, ba_ignore | ba_quiet, NULL)) ! warning ("virtual base `%T' inaccessible in `%T' due to ambiguity", basetype, t); } } *************** warn_about_ambiguous_direct_bases (t) *** 5090,5097 **** { tree basetype = TYPE_BINFO_BASETYPE (t, i); ! if (get_base_distance (basetype, t, 0, NULL) == -2) ! cp_warning ("direct base `%T' inaccessible in `%T' due to ambiguity", basetype, t); } } --- 4787,4794 ---- { tree basetype = TYPE_BINFO_BASETYPE (t, i); ! if (!lookup_base (t, basetype, ba_ignore | ba_quiet, NULL)) ! warning ("direct base `%T' inaccessible in `%T' due to ambiguity", basetype, t); } } *************** layout_class_type (t, empty_p, vfuns_p, *** 5142,5149 **** vptr = create_vtable_ptr (t, empty_p, vfuns_p, new_virtuals_p, overridden_virtuals_p); ! /* Under the new ABI, the vptr is always the first thing in the ! class. */ if (vptr) { TYPE_FIELDS (t) = chainon (vptr, TYPE_FIELDS (t)); --- 4839,4845 ---- vptr = create_vtable_ptr (t, empty_p, vfuns_p, new_virtuals_p, overridden_virtuals_p); ! /* The vptr is always the first thing in the class. */ if (vptr) { TYPE_FIELDS (t) = chainon (vptr, TYPE_FIELDS (t)); *************** layout_class_type (t, empty_p, vfuns_p, *** 5156,5169 **** if (build_base_fields (rli, empty_p, empty_base_offsets, t)) CLASSTYPE_NEARLY_EMPTY_P (t) = 0; - /* Add pointers to all of our virtual base-classes. */ - TYPE_FIELDS (t) = chainon (build_vbase_pointer_fields (rli, empty_p), - TYPE_FIELDS (t)); - - /* CLASSTYPE_INLINE_FRIENDS is really TYPE_NONCOPIED_PARTS. Thus, - we have to save this before we zap TYPE_NONCOPIED_PARTS. */ - fixup_inline_methods (t); - /* Layout the non-static data members. */ for (field = non_static_data_members; field; field = TREE_CHAIN (field)) { --- 4852,4857 ---- *************** layout_class_type (t, empty_p, vfuns_p, *** 5175,5190 **** if (TREE_CODE (field) != FIELD_DECL) { place_field (rli, field); continue; } type = TREE_TYPE (field); /* If this field is a bit-field whose width is greater than its ! type, then there are some special rules for allocating it ! under the new ABI. Under the old ABI, there were no special ! rules, but the back-end can't handle bitfields longer than a ! `long long', so we use the same mechanism. */ if (DECL_C_BIT_FIELD (field) && INT_CST_LT (TYPE_SIZE (type), DECL_SIZE (field))) { --- 4863,4888 ---- 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); continue; } type = TREE_TYPE (field); /* 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))) { *************** layout_class_type (t, empty_p, vfuns_p, *** 5249,5258 **** } /* We make all structures have at least one element, so that they ! have non-zero size. In the new ABI, the class may be empty even ! if it has basetypes. Therefore, we add the fake field after all ! the other fields; if there are already FIELD_DECLs on the list, ! their offsets will not be disturbed. */ if (!eoc && *empty_p) { tree padding; --- 4947,4956 ---- } /* We make all structures have at least one element, so that they ! have non-zero size. The class may be empty even if it has ! basetypes. Therefore, we add the fake field after all the other ! fields; if there are already FIELD_DECLs on the list, their ! offsets will not be disturbed. */ if (!eoc && *empty_p) { tree padding; *************** finish_struct_1 (t) *** 5356,5370 **** if (COMPLETE_TYPE_P (t)) { if (IS_AGGR_TYPE (t)) ! cp_error ("redefinition of `%#T'", t); else ! my_friendly_abort (172); popclass (); return; } - GNU_xref_decl (current_function_decl, t); - /* If this type was previously laid out as a forward reference, make sure we lay it out again. */ TYPE_SIZE (t) = NULL_TREE; --- 5054,5066 ---- if (COMPLETE_TYPE_P (t)) { if (IS_AGGR_TYPE (t)) ! error ("redefinition of `%#T'", t); else ! abort (); 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; *************** finish_struct_1 (t) *** 5373,5378 **** --- 5069,5076 ---- vfuns = 0; CLASSTYPE_RTTI (t) = NULL_TREE; + fixup_inline_methods (t); + /* Do end-of-class semantic processing: checking the validity of the bases and members and add implicitly generated methods. */ check_bases_and_members (t, &empty); *************** finish_struct_1 (t) *** 5413,5421 **** = chainon (CLASSTYPE_VFIELDS (t), build_tree_list (NULL_TREE, t)); /* If necessary, create the primary vtable for this class. */ ! if (new_virtuals ! || overridden_virtuals ! || (TYPE_CONTAINS_VPTR_P (t) && vptrs_present_everywhere_p ())) { new_virtuals = nreverse (new_virtuals); /* We must enter these virtuals into the table. */ --- 5111,5117 ---- = chainon (CLASSTYPE_VFIELDS (t), build_tree_list (NULL_TREE, t)); /* If necessary, create the primary vtable for this class. */ ! if (new_virtuals || overridden_virtuals || TYPE_CONTAINS_VPTR_P (t)) { new_virtuals = nreverse (new_virtuals); /* We must enter these virtuals into the table. */ *************** finish_struct_1 (t) *** 5472,5478 **** working on. */ for (x = TYPE_FIELDS (t); x; x = TREE_CHAIN (x)) if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x) ! && TREE_TYPE (x) == t) DECL_MODE (x) = TYPE_MODE (t); /* Done with FIELDS...now decide whether to sort these for --- 5168,5174 ---- working on. */ for (x = TYPE_FIELDS (t); x; x = TREE_CHAIN (x)) if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x) ! && 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 *************** finish_struct_1 (t) *** 5519,5527 **** if (warn_nonvdtor && TYPE_POLYMORPHIC_P (t) && TYPE_HAS_DESTRUCTOR (t) && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1)) == NULL_TREE) ! cp_warning ("`%#T' has virtual functions but non-virtual destructor", t); ! hack_incomplete_structures (t); if (warn_overloaded_virtual) warn_hidden (t); --- 5215,5223 ---- if (warn_nonvdtor && TYPE_POLYMORPHIC_P (t) && TYPE_HAS_DESTRUCTOR (t) && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1)) == NULL_TREE) ! warning ("`%#T' has virtual functions but non-virtual destructor", t); ! complete_vars (t); if (warn_overloaded_virtual) warn_hidden (t); *************** finish_struct (t, attributes) *** 5580,5586 **** as necessary. */ unreverse_member_declarations (t); ! cplus_decl_attributes (t, attributes, NULL_TREE); /* Nadger the current location so that diagnostics point to the start of the struct, not the end. */ --- 5276,5282 ---- 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. */ *************** finish_struct (t, attributes) *** 5603,5609 **** if (current_class_type) popclass (); else ! error ("trying to finish struct, but kicked out due to previous parse errors."); if (processing_template_decl) { --- 5299,5305 ---- if (current_class_type) popclass (); else ! error ("trying to finish struct, but kicked out due to previous parse errors"); if (processing_template_decl) { *************** fixed_type_or_null (instance, nonnull, c *** 5632,5642 **** switch (TREE_CODE (instance)) { case INDIRECT_REF: ! /* Check that we are not going through a cast of some sort. */ ! if (TREE_TYPE (instance) ! == TREE_TYPE (TREE_TYPE (TREE_OPERAND (instance, 0)))) ! instance = TREE_OPERAND (instance, 0); ! /* fall through... */ case CALL_EXPR: /* This is a call to a constructor, hence it's never zero. */ if (TREE_HAS_CONSTRUCTOR (instance)) --- 5328,5339 ---- switch (TREE_CODE (instance)) { case INDIRECT_REF: ! if (POINTER_TYPE_P (TREE_TYPE (instance))) ! return NULL_TREE; ! else ! return fixed_type_or_null (TREE_OPERAND (instance, 0), ! nonnull, cdtorp); ! case CALL_EXPR: /* This is a call to a constructor, hence it's never zero. */ if (TREE_HAS_CONSTRUCTOR (instance)) *************** fixed_type_or_null (instance, nonnull, c *** 5727,5737 **** } } ! /* Return non-zero 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. --- 5424,5435 ---- } } ! /* Return non-zero 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. *************** pop_nested_class () *** 6016,6021 **** --- 5714,5727 ---- pop_nested_class (); } + /* Returns the number of extern "LANG" blocks we are nested within. */ + + int + current_lang_depth () + { + return VARRAY_ACTIVE_SIZE (current_lang_base); + } + /* Set global variables CURRENT_LANG_NAME to appropriate value so that behavior of name-mangling machinery is correct. */ *************** void *** 6023,6037 **** push_lang_context (name) tree name; { ! *current_lang_stack++ = current_lang_name; ! if (current_lang_stack - &VARRAY_TREE (current_lang_base, 0) ! >= (ptrdiff_t) VARRAY_SIZE (current_lang_base)) ! { ! size_t old_size = VARRAY_SIZE (current_lang_base); ! ! VARRAY_GROW (current_lang_base, old_size + 10); ! current_lang_stack = &VARRAY_TREE (current_lang_base, old_size); ! } if (name == lang_name_cplusplus) { --- 5729,5735 ---- push_lang_context (name) tree name; { ! VARRAY_PUSH_TREE (current_lang_base, current_lang_name); if (name == lang_name_cplusplus) { *************** push_lang_context (name) *** 6066,6075 **** void pop_lang_context () { ! /* Clear the current entry so that garbage collector won't hold on ! to it. */ ! *current_lang_stack = NULL_TREE; ! current_lang_name = *--current_lang_stack; } /* Type instantiation routines. */ --- 5764,5771 ---- void pop_lang_context () { ! current_lang_name = VARRAY_TOP_TREE (current_lang_base); ! VARRAY_POP (current_lang_base); } /* Type instantiation routines. */ *************** resolve_address_of_overloaded_function ( *** 6156,6162 **** else { if (complain) ! cp_error ("\ cannot resolve overloaded function `%D' based on conversion to type `%T'", DECL_NAME (OVL_FUNCTION (overload)), target_type); return error_mark_node; --- 5852,5858 ---- else { if (complain) ! error ("\ cannot resolve overloaded function `%D' based on conversion to type `%T'", DECL_NAME (OVL_FUNCTION (overload)), target_type); return error_mark_node; *************** cannot resolve overloaded function `%D' *** 6277,6283 **** /* There were *no* matches. */ if (complain) { ! cp_error ("no matches converting function `%D' to type `%#T'", DECL_NAME (OVL_FUNCTION (overload)), target_type); --- 5973,5979 ---- /* There were *no* matches. */ if (complain) { ! error ("no matches converting function `%D' to type `%#T'", DECL_NAME (OVL_FUNCTION (overload)), target_type); *************** cannot resolve overloaded function `%D' *** 6300,6306 **** { tree match; ! cp_error ("converting overloaded function `%D' to type `%#T' is ambiguous", DECL_NAME (OVL_FUNCTION (overload)), target_type); --- 5996,6002 ---- { tree match; ! error ("converting overloaded function `%D' to type `%#T' is ambiguous", DECL_NAME (OVL_FUNCTION (overload)), target_type); *************** cannot resolve overloaded function `%D' *** 6326,6335 **** if (!complain) return error_mark_node; ! cp_pedwarn ("assuming pointer to member `%D'", fn); if (!explained) { ! cp_pedwarn ("(a pointer to member can only be formed with `&%E')", fn); explained = 1; } } --- 6022,6031 ---- if (!complain) return error_mark_node; ! pedwarn ("assuming pointer to member `%D'", fn); if (!explained) { ! pedwarn ("(a pointer to member can only be formed with `&%E')", fn); explained = 1; } } *************** cannot resolve overloaded function `%D' *** 6361,6374 **** tree instantiate_type (lhstype, rhs, flags) tree lhstype, rhs; ! enum instantiate_type_flags flags; { ! int complain = (flags & itf_complain); ! int strict = (flags & itf_no_attributes) ? COMPARE_NO_ATTRIBUTES : COMPARE_STRICT; ! int allow_ptrmem = flags & itf_ptrmem_ok; ! flags &= ~itf_ptrmem_ok; if (TREE_CODE (lhstype) == UNKNOWN_TYPE) { --- 6057,6070 ---- tree instantiate_type (lhstype, rhs, flags) tree lhstype, rhs; ! tsubst_flags_t flags; { ! int complain = (flags & tf_error); ! int strict = (flags & tf_no_attributes) ? COMPARE_NO_ATTRIBUTES : COMPARE_STRICT; ! int allow_ptrmem = flags & tf_ptrmem_ok; ! flags &= ~tf_ptrmem_ok; if (TREE_CODE (lhstype) == UNKNOWN_TYPE) { *************** instantiate_type (lhstype, rhs, flags) *** 6382,6388 **** if (comptypes (lhstype, TREE_TYPE (rhs), strict)) return rhs; if (complain) ! cp_error ("argument of type `%T' does not match `%T'", TREE_TYPE (rhs), lhstype); return error_mark_node; } --- 6078,6084 ---- if (comptypes (lhstype, TREE_TYPE (rhs), strict)) return rhs; if (complain) ! error ("argument of type `%T' does not match `%T'", TREE_TYPE (rhs), lhstype); return error_mark_node; } *************** instantiate_type (lhstype, rhs, flags) *** 6404,6410 **** case SAVE_EXPR: case CONSTRUCTOR: case BUFFER_REF: ! my_friendly_abort (177); return error_mark_node; case INDIRECT_REF: --- 6100,6106 ---- case SAVE_EXPR: case CONSTRUCTOR: case BUFFER_REF: ! abort (); return error_mark_node; case INDIRECT_REF: *************** instantiate_type (lhstype, rhs, flags) *** 6473,6479 **** case CALL_EXPR: /* This is too hard for now. */ ! my_friendly_abort (183); return error_mark_node; case PLUS_EXPR: --- 6169,6175 ---- case CALL_EXPR: /* This is too hard for now. */ ! abort (); return error_mark_node; case PLUS_EXPR: *************** instantiate_type (lhstype, rhs, flags) *** 6575,6593 **** case ADDR_EXPR: { if (PTRMEM_OK_P (rhs)) ! flags |= itf_ptrmem_ok; return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags); } case ENTRY_VALUE_EXPR: ! my_friendly_abort (184); return error_mark_node; case ERROR_MARK: return error_mark_node; default: ! my_friendly_abort (185); return error_mark_node; } } --- 6271,6289 ---- case ADDR_EXPR: { if (PTRMEM_OK_P (rhs)) ! flags |= tf_ptrmem_ok; return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags); } case ENTRY_VALUE_EXPR: ! abort (); return error_mark_node; case ERROR_MARK: return error_mark_node; default: ! abort (); return error_mark_node; } } *************** get_vfield_name (type) *** 6613,6619 **** type = BINFO_TYPE (binfo); buf = (char *) alloca (sizeof (VFIELD_NAME_FORMAT) + TYPE_NAME_LENGTH (type) + 2); ! sprintf (buf, VFIELD_NAME_FORMAT, TYPE_NAME_STRING (type)); return get_identifier (buf); } --- 6309,6316 ---- 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); } *************** get_enclosing_class (type) *** 6700,6706 **** break; default: ! my_friendly_abort (0); } } return NULL_TREE; --- 6397,6403 ---- break; default: ! abort (); } } return NULL_TREE; *************** is_base_of_enclosing_class (base, type) *** 6714,6720 **** { while (type) { ! if (get_binfo (base, type, 0)) return 1; type = get_enclosing_class (type); --- 6411,6417 ---- { while (type) { ! if (lookup_base (type, base, ba_any, NULL)) return 1; type = get_enclosing_class (type); *************** note_name_declared_in_class (name, decl) *** 6776,6792 **** 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. */ ! cp_error ("declaration of `%#D'", decl); cp_error_at ("changes meaning of `%D' from `%+#D'", DECL_NAME (OVL_CURRENT (decl)), (tree) n->value); } } ! /* Returns the VAR_DECL for the complete vtable associated with ! BINFO. (Under the new ABI, secondary vtables are merged with ! primary vtables; this function will return the VAR_DECL for the ! primary vtable.) */ tree get_vtbl_decl_for_binfo (binfo) --- 6473,6488 ---- 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. */ ! error ("declaration of `%#D'", decl); cp_error_at ("changes meaning of `%D' from `%+#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 (binfo) *************** get_primary_binfo (binfo) *** 6865,6871 **** } /* We should always find the primary base. */ ! my_friendly_abort (20000729); } /* For a primary virtual base, we have to scan the entire hierarchy --- 6561,6567 ---- } /* We should always find the primary base. */ ! abort (); } /* For a primary virtual base, we have to scan the entire hierarchy *************** dump_array (stream, decl) *** 7067,7073 **** for (ix = 0, inits = TREE_OPERAND (DECL_INITIAL (decl), 1); inits; ix++, inits = TREE_CHAIN (inits)) ! fprintf (stream, "%-4d %s\n", ix * elt, expr_as_string (TREE_VALUE (inits), TFF_PLAIN_IDENTIFIER)); } --- 6763,6769 ---- for (ix = 0, inits = TREE_OPERAND (DECL_INITIAL (decl), 1); inits; ix++, inits = TREE_CHAIN (inits)) ! fprintf (stream, "%-4ld %s\n", (long)(ix * elt), expr_as_string (TREE_VALUE (inits), TFF_PLAIN_IDENTIFIER)); } *************** static void *** 7134,7210 **** finish_vtbls (t) tree t; { ! if (merge_primary_and_secondary_vtables_p ()) ! { ! tree list; ! tree vbase; ! int i; ! /* Under the new ABI, 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. */ ! list = build_tree_list (TYPE_BINFO_VTABLE (t), NULL_TREE); ! accumulate_vtbl_inits (TYPE_BINFO (t), TYPE_BINFO (t), ! TYPE_BINFO (t), t, list); ! /* Then come the virtual bases, also in inheritance graph ! order. */ ! for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) ! { ! tree real_base; ! if (!TREE_VIA_VIRTUAL (vbase)) ! continue; ! /* Although we walk in inheritance order, that might not get the ! canonical base. */ ! real_base = binfo_for_vbase (BINFO_TYPE (vbase), t); ! accumulate_vtbl_inits (real_base, real_base, ! TYPE_BINFO (t), t, list); ! } ! /* Fill in BINFO_VPTR_FIELD in the immediate binfos for our virtual ! base classes, for the benefit of the debugging backends. */ ! for (i = 0; i < BINFO_N_BASETYPES (TYPE_BINFO (t)); ++i) { ! tree base = BINFO_BASETYPE (TYPE_BINFO (t), i); ! if (TREE_VIA_VIRTUAL (base)) ! { ! tree vbase = binfo_for_vbase (BINFO_TYPE (base), t); ! BINFO_VPTR_FIELD (base) = BINFO_VPTR_FIELD (vbase); ! } } - - if (TYPE_BINFO_VTABLE (t)) - initialize_vtable (TYPE_BINFO (t), TREE_VALUE (list)); } - else - { - dfs_walk (TYPE_BINFO (t), dfs_finish_vtbls, - dfs_unmarked_real_bases_queue_p, t); - dfs_walk (TYPE_BINFO (t), dfs_unmark, - dfs_marked_real_bases_queue_p, t); - } - } ! /* Called from finish_vtbls via dfs_walk. */ ! ! static tree ! dfs_finish_vtbls (binfo, data) ! tree binfo; ! void *data; ! { ! tree t = (tree) data; ! ! if (BINFO_NEW_VTABLE_MARKED (binfo, t)) ! initialize_vtable (binfo, ! build_vtbl_initializer (binfo, binfo, t, ! TYPE_BINFO (t), NULL)); ! ! SET_BINFO_MARKED (binfo); ! ! return NULL_TREE; } /* Initialize the vtable for BINFO with the INITS. */ --- 6830,6876 ---- finish_vtbls (t) tree t; { ! tree list; ! tree vbase; ! int i; ! /* We lay out the primary and secondary vtables in one contiguous ! vtable. The primary vtable is first, followed by the non-virtual ! secondary vtables in inheritance graph order. */ ! list = build_tree_list (TYPE_BINFO_VTABLE (t), NULL_TREE); ! accumulate_vtbl_inits (TYPE_BINFO (t), TYPE_BINFO (t), ! TYPE_BINFO (t), t, list); ! ! /* Then come the virtual bases, also in inheritance graph order. */ ! for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) ! { ! tree real_base; ! if (!TREE_VIA_VIRTUAL (vbase)) ! continue; ! /* Although we walk in inheritance order, that might not get the ! canonical base. */ ! real_base = binfo_for_vbase (BINFO_TYPE (vbase), t); ! accumulate_vtbl_inits (real_base, real_base, ! TYPE_BINFO (t), t, list); ! } ! /* Fill in BINFO_VPTR_FIELD in the immediate binfos for our virtual ! base classes, for the benefit of the debugging backends. */ ! for (i = 0; i < BINFO_N_BASETYPES (TYPE_BINFO (t)); ++i) ! { ! tree base = BINFO_BASETYPE (TYPE_BINFO (t), i); ! if (TREE_VIA_VIRTUAL (base)) { ! vbase = binfo_for_vbase (BINFO_TYPE (base), t); ! BINFO_VPTR_FIELD (base) = BINFO_VPTR_FIELD (vbase); } } ! if (TYPE_BINFO_VTABLE (t)) ! initialize_vtable (TYPE_BINFO (t), TREE_VALUE (list)); } /* Initialize the vtable for BINFO with the INITS. */ *************** initialize_array (decl, inits) *** 7244,7250 **** 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. --- 6910,6917 ---- 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. *************** build_vtt (t) *** 7282,7288 **** } /* The type corresponding to BASE_BINFO is a base of the type of BINFO, but ! from within some heirarchy which is inherited from the type of BINFO. Return BASE_BINFO's equivalent binfo from the hierarchy dominated by BINFO. */ --- 6949,6955 ---- } /* The type corresponding to BASE_BINFO is a base of the type of BINFO, but ! from within some hierarchy which is inherited from the type of BINFO. Return BASE_BINFO's equivalent binfo from the hierarchy dominated by BINFO. */ *************** get_original_base (base_binfo, binfo) *** 7304,7310 **** if (same_type_p (BINFO_TYPE (base_binfo), BINFO_TYPE (BINFO_BASETYPE (derived, ix)))) return BINFO_BASETYPE (derived, ix); ! my_friendly_abort (20010223); return NULL; } --- 6971,6977 ---- if (same_type_p (BINFO_TYPE (base_binfo), BINFO_TYPE (BINFO_BASETYPE (derived, ix)))) return BINFO_BASETYPE (derived, ix); ! abort (); return NULL; } *************** accumulate_vtbl_inits (binfo, orig_binfo *** 7677,7685 **** } } ! /* Called from accumulate_vtbl_inits when using the new ABI. ! Accumulates the vtable initializers for all of the vtables into ! TREE_VALUE (DATA). Returns the initializers for the BINFO vtable. */ static tree dfs_accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, t, l) --- 7344,7351 ---- } } ! /* Called from accumulate_vtbl_inits. Returns the initializers for ! the BINFO vtable. */ static tree dfs_accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, t, l) *************** dfs_accumulate_vtbl_inits (binfo, orig_b *** 7760,7765 **** --- 7426,7432 ---- vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, vtbl); + TREE_CONSTANT (vtbl) = 1; index = size_binop (PLUS_EXPR, size_int (non_fn_entries), size_int (list_length (TREE_VALUE (l)))); *************** dfs_accumulate_vtbl_inits (binfo, orig_b *** 7784,7790 **** return inits; } ! /* Construct the initializer for BINFOs 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 --- 7451,7457 ---- return inits; } ! /* 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 *************** build_vtbl_initializer (binfo, orig_binf *** 7861,7922 **** tree vcall_index; tree fn; tree pfn; ! tree init; - /* Pull the offset for `this', and the function to call, out of - the list. */ - delta = BV_DELTA (v); - - if (BV_USE_VCALL_INDEX_P (v)) - { - vcall_index = BV_VCALL_INDEX (v); - my_friendly_assert (vcall_index != NULL_TREE, 20000621); - } - else - vcall_index = NULL_TREE; - fn = BV_FN (v); - my_friendly_assert (TREE_CODE (delta) == INTEGER_CST, 19990727); - my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 19990727); - - /* You can't call an abstract virtual function; it's abstract. - So, we replace these functions with __pure_virtual. */ - if (DECL_PURE_VIRTUAL_P (fn)) - fn = abort_fndecl; - - /* Take the address of the function, considering it to be of an - appropriate generic type. */ - pfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); - /* The address of a function can't change. */ - TREE_CONSTANT (pfn) = 1; - - /* Enter it in the vtable. */ - init = build_vtable_entry (delta, vcall_index, pfn); /* 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 could also handle this in update_vtable_entry_for_fn; doing it ! here means we zero out unused slots in ctor vtables as well, ! rather than filling them with erroneous values (though harmless, ! apart from relocation costs). */ ! if (fn != abort_fndecl) ! for (b = binfo; ; b = get_primary_binfo (b)) ! { ! /* We found a defn before a lost primary; go ahead as normal. */ ! if (look_for_overrides_here (BINFO_TYPE (b), fn)) break; ! /* The nearest definition is from a lost primary; clear the ! slot. */ ! if (BINFO_LOST_PRIMARY_P (b)) ! { ! init = size_zero_node; ! break; ! } ! } /* And add it to the chain of initializers. */ if (TARGET_VTABLE_USES_DESCRIPTORS) --- 7528,7593 ---- tree vcall_index; tree fn; tree pfn; ! tree init = NULL_TREE; fn = BV_FN (v); /* If the only definition of this function signature along our primary base chain is from a lost primary, this vtable slot will never be used, so just zero it out. This is important to avoid 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 themff ! with erroneous values (though harmless, apart from relocation ! costs). */ ! for (b = binfo; ; b = get_primary_binfo (b)) ! { ! /* We found a defn before a lost primary; go ahead as normal. */ ! if (look_for_overrides_here (BINFO_TYPE (b), fn)) ! break; ! ! /* The nearest definition is from a lost primary; clear the ! slot. */ ! if (BINFO_LOST_PRIMARY_P (b)) ! { ! init = size_zero_node; break; + } + } ! if (! init) ! { ! /* Pull the offset for `this', and the function to call, out of ! the list. */ ! delta = BV_DELTA (v); ! ! if (BV_USE_VCALL_INDEX_P (v)) ! { ! vcall_index = BV_VCALL_INDEX (v); ! my_friendly_assert (vcall_index != NULL_TREE, 20000621); ! } ! else ! vcall_index = NULL_TREE; ! ! my_friendly_assert (TREE_CODE (delta) == INTEGER_CST, 19990727); ! my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 19990727); ! ! /* You can't call an abstract virtual function; it's abstract. ! So, we replace these functions with __pure_virtual. */ ! if (DECL_PURE_VIRTUAL_P (fn)) ! fn = abort_fndecl; ! ! /* Take the address of the function, considering it to be of an ! appropriate generic type. */ ! pfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn); ! /* The address of a function can't change. */ ! TREE_CONSTANT (pfn) = 1; ! ! /* Enter it in the vtable. */ ! init = build_vtable_entry (delta, vcall_index, pfn); ! } /* And add it to the chain of initializers. */ if (TARGET_VTABLE_USES_DESCRIPTORS) *************** build_vbase_offset_vtbl_entries (binfo, *** 7987,7997 **** tree t; tree non_primary_binfo; - /* Under the old ABI, pointers to virtual bases are stored in each - object. */ - if (!vbase_offsets_in_vtable_p ()) - return; - /* If there are no virtual baseclasses, then there is nothing to do. */ if (!TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (binfo))) --- 7658,7663 ---- *************** build_vbase_offset_vtbl_entries (binfo, *** 8063,8069 **** /* The vbase offset had better be the same. */ if (!tree_int_cst_equal (delta, BINFO_VPTR_FIELD (orig_vbase))) ! my_friendly_abort (20000403); } /* The next vbase will come at a more negative offset. */ --- 7729,7735 ---- /* The vbase offset had better be the same. */ if (!tree_int_cst_equal (delta, BINFO_VPTR_FIELD (orig_vbase))) ! abort (); } /* The next vbase will come at a more negative offset. */ *************** build_vcall_offset_vtbl_entries (binfo, *** 8093,8103 **** tree binfo; vtbl_init_data *vid; { - /* Under the old ABI, the adjustments to the `this' pointer were made - elsewhere. */ - if (!vcall_offsets_in_vtable_p ()) - return; - /* We only need these entries if this base is a virtual base. */ if (!TREE_VIA_VIRTUAL (binfo)) return; --- 7759,7764 ---- *************** add_vcall_offset_vtbl_entries_1 (binfo, *** 8271,8277 **** were multiple copies, there would not be a unique final overrider and vid->derived would be ill-formed. */ base = DECL_CONTEXT (fn); ! base_binfo = get_binfo (base, vid->derived, /*protect=*/0); /* Compute the vcall offset. */ /* As mentioned above, the vbase we're working on is a primary base of --- 7932,7938 ---- were multiple copies, there would not be a unique final overrider and vid->derived would be ill-formed. */ base = DECL_CONTEXT (fn); ! base_binfo = lookup_base (vid->derived, base, ba_any, NULL); /* Compute the vcall offset. */ /* As mentioned above, the vbase we're working on is a primary base of *************** build_rtti_vtbl_entries (binfo, vid) *** 8320,8329 **** basetype = BINFO_TYPE (binfo); t = BINFO_TYPE (vid->rtti_binfo); - /* For a COM object there is no RTTI entry. */ - if (CLASSTYPE_COM_INTERFACE (basetype)) - return; - /* 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; --- 7981,7986 ---- *************** build_rtti_vtbl_entries (binfo, vid) *** 8352,8367 **** vid->last_init = &TREE_CHAIN (*vid->last_init); /* Add the offset-to-top entry. It comes earlier in the vtable that ! the the typeinfo entry. */ ! if (flag_vtable_thunks) ! { ! /* Convert the offset to look like a function pointer, so that ! we can put it in the vtable. */ ! init = build1 (NOP_EXPR, vfunc_ptr_type_node, offset); ! TREE_CONSTANT (init) = 1; ! *vid->last_init = build_tree_list (NULL_TREE, init); ! vid->last_init = &TREE_CHAIN (*vid->last_init); ! } } /* Build an entry in the virtual function table. DELTA is the offset --- 8009,8020 ---- vid->last_init = &TREE_CHAIN (*vid->last_init); /* Add the offset-to-top entry. It comes earlier in the vtable that ! the the typeinfo entry. Convert the offset to look like a ! function pointer, so that we can put it in the vtable. */ ! init = build1 (NOP_EXPR, vfunc_ptr_type_node, offset); ! TREE_CONSTANT (init) = 1; ! *vid->last_init = build_tree_list (NULL_TREE, init); ! vid->last_init = &TREE_CHAIN (*vid->last_init); } /* Build an entry in the virtual function table. DELTA is the offset *************** build_vtable_entry (delta, vcall_index, *** 8378,8432 **** tree vcall_index; tree entry; { ! if (flag_vtable_thunks) ! { ! tree fn; ! ! fn = TREE_OPERAND (entry, 0); ! if ((!integer_zerop (delta) || vcall_index != NULL_TREE) ! && fn != abort_fndecl ! && !DECL_TINFO_FN_P (fn)) ! { ! entry = make_thunk (entry, delta, vcall_index); ! entry = build1 (ADDR_EXPR, vtable_entry_type, entry); ! TREE_READONLY (entry) = 1; ! TREE_CONSTANT (entry) = 1; ! } ! #ifdef GATHER_STATISTICS ! n_vtable_entries += 1; ! #endif ! return entry; ! } ! else { ! tree elems = tree_cons (NULL_TREE, delta, ! tree_cons (NULL_TREE, integer_zero_node, ! build_tree_list (NULL_TREE, entry))); ! tree entry = build (CONSTRUCTOR, vtable_entry_type, NULL_TREE, elems); ! ! /* We don't use vcall offsets when not using vtable thunks. */ ! my_friendly_assert (vcall_index == NULL_TREE, 20000125); ! ! /* DELTA used to be constructed by `size_int' and/or size_binop, ! which caused overflow problems when it was negative. That should ! be fixed now. */ ! ! if (! int_fits_type_p (delta, delta_type_node)) ! { ! if (flag_huge_objects) ! sorry ("object size exceeds built-in limit for virtual function table implementation"); ! else ! sorry ("object size exceeds normal limit for virtual function table implementation, recompile all source and use -fhuge-objects"); ! } ! ! TREE_CONSTANT (entry) = 1; ! TREE_STATIC (entry) = 1; TREE_READONLY (entry) = 1; ! #ifdef GATHER_STATISTICS ! n_vtable_entries += 1; #endif ! ! return entry; ! } } --- 8031,8048 ---- tree vcall_index; tree entry; { ! tree fn = TREE_OPERAND (entry, 0); ! ! if ((!integer_zerop (delta) || vcall_index != NULL_TREE) ! && fn != abort_fndecl) { ! entry = make_thunk (entry, delta, vcall_index); ! entry = build1 (ADDR_EXPR, vtable_entry_type, entry); TREE_READONLY (entry) = 1; ! TREE_CONSTANT (entry) = 1; ! } #ifdef GATHER_STATISTICS ! n_vtable_entries += 1; #endif ! return entry; } diff -Nrc3pad gcc-3.0.4/gcc/cp/config-lang.in gcc-3.1/gcc/cp/config-lang.in *** gcc-3.0.4/gcc/cp/config-lang.in Tue Dec 12 20:28:51 2000 --- gcc-3.1/gcc/cp/config-lang.in Thu Dec 20 00:20:45 2001 *************** *** 1,5 **** # Top level configure fragment for GNU C++. ! # Copyright (C) 1994, 1995, 1997, 1998, 2000 Free Software Foundation, Inc. #This file is part of GNU CC. --- 1,6 ---- # Top level configure fragment for GNU C++. ! # Copyright (C) 1994, 1995, 1997, 1998, 2000, 2001 ! # Free Software Foundation, Inc. #This file is part of GNU CC. *************** *** 24,30 **** # language - name of language as it would appear in $(LANGUAGES) # compilers - value to add to $(COMPILERS) # stagestuff - files to add to $(STAGESTUFF) - # diff_excludes - files to ignore when building diffs between two versions. language="c++" --- 25,30 ---- *************** compilers="cc1plus\$(exeext)" *** 32,37 **** stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)" ! diff_excludes="-x parse.c -x parse.h" ! ! target_libs=${libstdcxx_version} --- 32,35 ---- stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)" ! target_libs="${libstdcxx_version} target-gperf" diff -Nrc3pad gcc-3.0.4/gcc/cp/cp-lang.c gcc-3.1/gcc/cp/cp-lang.c *** gcc-3.0.4/gcc/cp/cp-lang.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/cp/cp-lang.c Wed Dec 5 23:48:14 2001 *************** *** 0 **** --- 1,110 ---- + /* Language-dependent hooks for C++. + Copyright 2001 Free Software Foundation, Inc. + Contributed by Alexandre Oliva + + This file is part of GNU CC. + + GNU CC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU CC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU CC; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + #include "config.h" + #include "system.h" + #include "tree.h" + #include "cp-tree.h" + #include "c-common.h" + #include "toplev.h" + #include "langhooks.h" + #include "langhooks-def.h" + + static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree)); + + #undef LANG_HOOKS_NAME + #define LANG_HOOKS_NAME "GNU C++" + #undef LANG_HOOKS_INIT + #define LANG_HOOKS_INIT cxx_init + #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_INIT_OPTIONS + #define LANG_HOOKS_INIT_OPTIONS cxx_init_options + #undef LANG_HOOKS_DECODE_OPTION + #define LANG_HOOKS_DECODE_OPTION cxx_decode_option + #undef LANG_HOOKS_POST_OPTIONS + #define LANG_HOOKS_POST_OPTIONS cxx_post_options + #undef LANG_HOOKS_GET_ALIAS_SET + #define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set + #undef LANG_HOOKS_EXPAND_CONSTANT + #define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant + #undef LANG_HOOKS_SAFE_FROM_P + #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p + #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_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_SET_YYDEBUG + #define LANG_HOOKS_SET_YYDEBUG cxx_set_yydebug + + #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES + #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \ + cp_walk_subtrees + #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN + #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ + cp_cannot_inline_tree_fn + #undef LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS + #define LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS \ + cp_add_pending_fn_decls + #undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P + #define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \ + cp_is_overload_p + #undef LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P + #define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \ + cp_auto_var_in_fn_p + #undef LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING + #define LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING \ + cp_copy_res_decl_for_inlining + #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P + #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p + #undef LANG_HOOKS_TREE_INLINING_START_INLINING + #define LANG_HOOKS_TREE_INLINING_START_INLINING cp_start_inlining + #undef LANG_HOOKS_TREE_INLINING_END_INLINING + #define LANG_HOOKS_TREE_INLINING_END_INLINING cp_end_inlining + #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 + + /* Each front end provides its own hooks, for toplev.c. */ + const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; + + /* Special routine to get the alias set for C++. */ + + static HOST_WIDE_INT + cxx_get_alias_set (t) + tree t; + { + /* It's not yet safe to use alias sets for classes in C++ because + the TYPE_FIELDs list for a class doesn't mention base classes. */ + if (AGGREGATE_TYPE_P (t)) + return 0; + + return c_common_get_alias_set (t); + } diff -Nrc3pad gcc-3.0.4/gcc/cp/cp-tree.def gcc-3.1/gcc/cp/cp-tree.def *** gcc-3.0.4/gcc/cp/cp-tree.def Sun May 13 07:10:19 2001 --- gcc-3.1/gcc/cp/cp-tree.def Sat Mar 16 01:07:59 2002 *************** DEFTREECODE (EMPTY_CLASS_EXPR, "empty_cl *** 84,93 **** only done for functions so far For class template: DECL_INITIAL associated templates (methods &c) ! DECL_RESULT null For non-class templates: TREE_TYPE type of object to be constructed ! DECL_RESULT decl for object to be created (e.g., FUNCTION_DECL with tmpl parms used) */ DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0) --- 84,93 ---- 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", 'd', 0) *************** DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PAR *** 163,168 **** --- 163,173 ---- of `T'. */ DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 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", 't', 0) + /* A type designated by `__typeof (expr)'. TYPE_FIELDS is the expression in question. */ DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0) *************** DEFTREECODE (WRAPPER, "wrapper", 'x', 1) *** 203,211 **** unused. */ DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 1) - /* Used to represent __PRETTY_FUNCTION__ in template bodies. */ - DEFTREECODE (FUNCTION_NAME, "function_name", 'e', 0) - /* A whole bunch of tree codes for the initial, superficial parsing of templates. */ DEFTREECODE (MODOP_EXPR, "modop_expr", 'e', 3) --- 208,213 ---- *************** DEFTREECODE (SUBOBJECT, "subobject", 'e' *** 228,245 **** the cleanups associated with any SUBOBJECT_CLEANUPS need no longer be run. */ DEFTREECODE (CTOR_STMT, "ctor_stmt", 'e', 0) ! /* A CLEANUP_STMT marks the point at which a declaration is fully ! constructed. If, after this point, the CLEANUP_DECL goes out of ! scope, the CLEANUP_EXPR must be run. */ ! DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2) ! /* A START_CATCH_STMT marks the beginning of a catch handler for the ! the START_CATCH_TYPE. If this is CATCH_ALL_TYPE, then the handler ! catches all types. */ ! DEFTREECODE (START_CATCH_STMT, "start_catch_stmt", 'e', 0) DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2) DEFTREECODE (RETURN_INIT, "return_init", 'e', 2) DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2) DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2) DEFTREECODE (HANDLER, "handler", 'e', 2) /* A MUST_NOT_THROW_EXPR wraps an expression that may not --- 230,245 ---- the cleanups associated with any SUBOBJECT_CLEANUPS need no longer be run. */ DEFTREECODE (CTOR_STMT, "ctor_stmt", 'e', 0) ! /* CTOR_INITIALIZER is a placeholder in template code for a call to ! setup_vtbl_pointer (and appears in all functions, not just ctors). */ DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2) DEFTREECODE (RETURN_INIT, "return_init", 'e', 2) DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2) DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2) + /* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is + 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", 'e', 2) /* A MUST_NOT_THROW_EXPR wraps an expression that may not diff -Nrc3pad gcc-3.0.4/gcc/cp/cp-tree.h gcc-3.1/gcc/cp/cp-tree.h *** gcc-3.0.4/gcc/cp/cp-tree.h Sat Dec 8 16:12:51 2001 --- gcc-3.1/gcc/cp/cp-tree.h Tue Apr 23 21:51:13 2002 *************** *** 1,6 **** /* Definitions for C++ parsing and type checking. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ! 2000, 2001 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Definitions for C++ parsing and type checking. Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ! 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 25,32 **** #include "splay-tree.h" #include "varray.h" ! #ifndef _CP_TREE_H ! #define _CP_TREE_H #include "c-common.h" --- 25,36 ---- #include "splay-tree.h" #include "varray.h" ! #ifndef GCC_CP_TREE_H ! #define GCC_CP_TREE_H ! ! #ifndef __GNUC__ ! #error "You should be using 'make bootstrap' -- see installation instructions" ! #endif #include "c-common.h" *************** Boston, MA 02111-1307, USA. */ *** 87,93 **** Usage of DECL_LANG_FLAG_?: 0: DECL_ERROR_REPORTED (in VAR_DECL). ! DECL_TEMPLATE_PARM_P (in CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL) DECL_MUTABLE_P (in FIELD_DECL) 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). --- 91,97 ---- 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) 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). *************** Boston, MA 02111-1307, USA. */ *** 114,122 **** TYPE_BINFO For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO. ! For a TYPENAME_TYPE, this is TYPENAME_TYPE_FULLNAME. ! For a TEMPLATE_TEMPLATE_PARM or BOUND_TEMPLATE_TEMPLATE_PARM, ! this is TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. BINFO_VIRTUALS For a binfo, this is a TREE_LIST. The BV_DELTA of each node --- 118,124 ---- TYPE_BINFO 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. The BV_DELTA of each node *************** Boston, MA 02111-1307, USA. */ *** 131,145 **** use a virtual thunk, as opposed to an ordinary thunk. The BV_FN is the declaration for the virtual function itself. - When CLASSTYPE_COM_INTERFACE_P does not hold, the first entry - does not have a BV_FN; it is just an offset. BINFO_VTABLE ! Sometimes this is a VAR_DECL. Under the new ABI, it is instead ! an expression with POINTER_TYPE pointing 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; that macro works ! in both ABIs. DECL_ARGUMENTS For a VAR_DECL this is DECL_ANON_UNION_ELEMS. --- 133,143 ---- use a virtual thunk, as opposed to an ordinary thunk. The BV_FN is the declaration for the virtual function itself. 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_ARGUMENTS For a VAR_DECL this is DECL_ANON_UNION_ELEMS. *************** Boston, MA 02111-1307, USA. */ *** 160,186 **** #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ ! ({ const tree __t = NODE; \ ! enum tree_code __c = TREE_CODE(__t); \ if (__c != VAR_DECL && __c != FUNCTION_DECL) \ tree_check_failed (__t, VAR_DECL, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \ ! ({ const tree __t = NODE; \ ! enum tree_code __c = TREE_CODE(__t); \ ! if (__c != VAR_DECL \ ! && __c != FUNCTION_DECL \ && __c != PARM_DECL) \ tree_check_failed (__t, VAR_DECL, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \ ! ({ const tree __t = NODE; \ ! enum tree_code __c = TREE_CODE(__t); \ ! if (__c != VAR_DECL \ && __c != FUNCTION_DECL \ && __c != TYPE_DECL \ && __c != TEMPLATE_DECL) \ --- 158,184 ---- #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ ! ({ const tree __t = (NODE); \ ! enum tree_code const __c = TREE_CODE(__t); \ if (__c != VAR_DECL && __c != FUNCTION_DECL) \ tree_check_failed (__t, VAR_DECL, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \ ! ({ const tree __t = (NODE); \ ! enum tree_code const __c = TREE_CODE(__t); \ ! if (__c != VAR_DECL \ ! && __c != FUNCTION_DECL \ && __c != PARM_DECL) \ tree_check_failed (__t, VAR_DECL, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \ ! ({ const tree __t = (NODE); \ ! enum tree_code const __c = TREE_CODE(__t); \ ! if (__c != VAR_DECL \ && __c != FUNCTION_DECL \ && __c != TYPE_DECL \ && __c != TEMPLATE_DECL) \ *************** Boston, MA 02111-1307, USA. */ *** 189,207 **** __t; }) #define RECORD_OR_UNION_TYPE_CHECK(NODE) \ ! ({ const tree __t = NODE; \ ! enum tree_code __c = TREE_CODE(__t); \ if (__c != RECORD_TYPE && __c != UNION_TYPE) \ tree_check_failed (__t, RECORD_TYPE, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) #else /* not ENABLE_TREE_CHECKING, or not gcc */ ! #define VAR_OR_FUNCTION_DECL_CHECK(NODE) NODE ! #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) NODE ! #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) NODE ! #define RECORD_OR_UNION_TYPE_CHECK(NODE) NODE #endif --- 187,214 ---- __t; }) #define RECORD_OR_UNION_TYPE_CHECK(NODE) \ ! ({ const tree __t = (NODE); \ ! enum tree_code const __c = TREE_CODE(__t); \ if (__c != RECORD_TYPE && __c != UNION_TYPE) \ tree_check_failed (__t, RECORD_TYPE, __FILE__, __LINE__, \ __FUNCTION__); \ __t; }) + #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \ + ({ const tree __t = (NODE); \ + enum tree_code const __c = TREE_CODE(__t); \ + if (__c != BOUND_TEMPLATE_TEMPLATE_PARM) \ + tree_check_failed (__t, BOUND_TEMPLATE_TEMPLATE_PARM, \ + __FILE__, __LINE__, __FUNCTION__); \ + __t; }) + #else /* not ENABLE_TREE_CHECKING, or not gcc */ ! #define VAR_OR_FUNCTION_DECL_CHECK(NODE) (NODE) ! #define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) (NODE) ! #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) (NODE) ! #define RECORD_OR_UNION_TYPE_CHECK(NODE) (NODE) ! #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) (NODE) #endif *************** Boston, MA 02111-1307, USA. */ *** 213,222 **** extern int flag_use_cxa_atexit; - /* Nonzero to not ignore namespace std. */ - - extern int flag_honor_std; - /* Nonzero means generate 'rtti' that give run-time type information. */ extern int flag_rtti; --- 220,225 ---- *************** extern int flag_rtti; *** 226,290 **** extern int flag_huge_objects; - /* Nonzero if virtual base class offsets are stored in the virtual - function table. Zero if, instead, a pointer to the virtual base is - stored in the object itself. */ - #define vbase_offsets_in_vtable_p() (1) - - /* Nonzero if displacements to the `this' pointer to use when calling - virtual functions in a virtual base class are present in the - vtable. */ - #define vcall_offsets_in_vtable_p() (1) - - /* Nonzero if a derived class that needs a vptr should always get one, - even if a non-primary base class already has one. For example, - given: - - struct S { int i; virtual void f(); }; - struct T : virtual public S {}; - - one could either reuse the vptr in `S' for `T', or create a new - vptr for `T'. If this flag is nonzero we choose the latter - alternative; otherwise, we choose the former. */ - #define vptrs_present_everywhere_p() (1) - - /* Nonzero if the vtable for a derived class should contain the - virtual functions from the primary base and all virtual functions - present in the class itself. Zero if, instead, it should contain - only those virtual functions from the primary base together with - the functions declared in the derived class (but not in any base - class). */ - #define all_overridden_vfuns_in_vtables_p() (1) - - /* Nonzero if primary and secondary vtables are combined into a single - vtable. */ - #define merge_primary_and_secondary_vtables_p() (1) - /* Language-dependent contents of an identifier. */ struct lang_identifier { ! struct tree_identifier ignore; tree namespace_bindings; tree bindings; tree class_value; tree class_template_info; struct lang_id2 *x; - enum rid rid_code; }; /* 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 C_RID_CODE(id) \ ! (((struct lang_identifier *) (id))->rid_code) extern const short rid_to_yy[RID_MAX]; ! #define C_RID_YYCODE(id) \ ! rid_to_yy[((struct lang_identifier *) (id))->rid_code] #define LANG_IDENTIFIER_CAST(NODE) \ ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE)) --- 229,255 ---- extern int flag_huge_objects; /* Language-dependent contents of an identifier. */ struct lang_identifier { ! struct c_common_identifier ignore; tree namespace_bindings; tree bindings; tree class_value; tree class_template_info; struct lang_id2 *x; }; /* 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) extern const short rid_to_yy[RID_MAX]; ! #define C_RID_YYCODE(ID) rid_to_yy[C_RID_CODE (ID)] #define LANG_IDENTIFIER_CAST(NODE) \ ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE)) *************** typedef struct ptrmem_cst *** 316,372 **** struct tree_common common; /* This isn't used, but the middle-end expects all constants to have this field. */ ! struct rtx_def *rtl; tree member; }* ptrmem_cst_t; /* Nonzero if this binding is for a local scope, as opposed to a class or namespace scope. */ ! #define LOCAL_BINDING_P(NODE) TREE_LANG_FLAG_0(NODE) /* Nonzero if BINDING_VALUE is from a base class of the class which is currently being defined. */ ! #define INHERITED_VALUE_BINDING_P(NODE) TREE_LANG_FLAG_1(NODE) /* For a binding between a name and an entity at a non-local scope, defines the scope where the binding is declared. (Either a class _TYPE node, or a NAMESPACE_DECL.) This macro should be used only for namespace-level bindings; on the IDENTIFIER_BINDING list BINDING_LEVEL is used instead. */ ! #define BINDING_SCOPE(NODE) (((struct tree_binding*)CPLUS_BINDING_CHECK (NODE))->scope.scope) /* Nonzero if NODE has BINDING_LEVEL, rather than BINDING_SCOPE. */ ! #define BINDING_HAS_LEVEL_P(NODE) TREE_LANG_FLAG_2 ((NODE)) /* This is the declaration bound to the name. Possible values: variable, overloaded function, namespace, template, enumerator. */ ! #define BINDING_VALUE(NODE) (((struct tree_binding*)CPLUS_BINDING_CHECK (NODE))->value) /* If name is bound to a type, this is the type (struct, union, enum). */ ! #define BINDING_TYPE(NODE) TREE_TYPE(NODE) #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 CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0) - #define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1) /* 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) /* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring top-level qualifiers. */ ! #define same_type_ignoring_top_level_qualifiers_p(type1, type2) \ ! same_type_p (TYPE_MAIN_VARIANT (type1), TYPE_MAIN_VARIANT (type2)) /* Non-zero if we are presently building a statement tree, rather than expanding each statement as we encounter it. */ --- 281,337 ---- struct tree_common common; /* This isn't used, but the middle-end expects all constants to have this field. */ ! rtx rtl; tree member; }* ptrmem_cst_t; /* Nonzero if this binding is for a local scope, as opposed to a class or namespace scope. */ ! #define LOCAL_BINDING_P(NODE) TREE_LANG_FLAG_0 (NODE) /* Nonzero if BINDING_VALUE is from a base class of the class which is currently being defined. */ ! #define INHERITED_VALUE_BINDING_P(NODE) TREE_LANG_FLAG_1 (NODE) /* For a binding between a name and an entity at a non-local scope, defines the scope where the binding is declared. (Either a class _TYPE node, or a NAMESPACE_DECL.) This macro should be used only for namespace-level bindings; on the IDENTIFIER_BINDING list BINDING_LEVEL is used instead. */ ! #define BINDING_SCOPE(NODE) \ ! (((struct tree_binding*)CPLUS_BINDING_CHECK (NODE))->scope.scope) /* Nonzero if NODE has BINDING_LEVEL, rather than BINDING_SCOPE. */ ! #define BINDING_HAS_LEVEL_P(NODE) TREE_LANG_FLAG_2 (NODE) /* This is the declaration bound to the name. Possible values: variable, overloaded function, namespace, template, enumerator. */ ! #define BINDING_VALUE(NODE) \ ! (((struct tree_binding*)CPLUS_BINDING_CHECK (NODE))->value) /* If name is bound to a type, this is the type (struct, union, enum). */ ! #define BINDING_TYPE(NODE) TREE_TYPE (NODE) #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)) /* 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) /* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring top-level qualifiers. */ ! #define same_type_ignoring_top_level_qualifiers_p(TYPE1, TYPE2) \ ! same_type_p (TYPE_MAIN_VARIANT (TYPE1), TYPE_MAIN_VARIANT (TYPE2)) /* Non-zero if we are presently building a statement tree, rather than expanding each statement as we encounter it. */ *************** struct tree_binding *** 391,407 **** }; /* 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 tree_overload { --- 356,373 ---- }; /* 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 tree_overload { *************** struct tree_srcloc *** 474,537 **** 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 LANG_ID_FIELD(NAME,NODE) \ (LANG_IDENTIFIER_CAST (NODE)->x \ ? LANG_IDENTIFIER_CAST (NODE)->x->NAME : 0) ! #define SET_LANG_ID(NODE,VALUE,NAME) \ ! (LANG_IDENTIFIER_CAST (NODE)->x == 0 \ ? LANG_IDENTIFIER_CAST (NODE)->x \ = (struct lang_id2 *)perm_calloc (1, sizeof (struct lang_id2)) : 0, \ LANG_IDENTIFIER_CAST (NODE)->x->NAME = (VALUE)) ! #define IDENTIFIER_LABEL_VALUE(NODE) LANG_ID_FIELD(label_value, NODE) ! #define SET_IDENTIFIER_LABEL_VALUE(NODE,VALUE) \ ! SET_LANG_ID(NODE, VALUE, label_value) ! #define IDENTIFIER_IMPLICIT_DECL(NODE) LANG_ID_FIELD(implicit_decl, NODE) ! #define SET_IDENTIFIER_IMPLICIT_DECL(NODE,VALUE) \ ! SET_LANG_ID(NODE, VALUE, implicit_decl) ! #define IDENTIFIER_ERROR_LOCUS(NODE) LANG_ID_FIELD(error_locus, NODE) ! #define SET_IDENTIFIER_ERROR_LOCUS(NODE,VALUE) \ ! SET_LANG_ID(NODE, VALUE, error_locus) /* Nonzero if this identifier is used as a virtual function name somewhere (optimizes searches). */ ! #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) - /* Nonzero means reject anything that ISO standard C++ forbids. */ - extern int pedantic; - /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ ! #define C_TYPE_FIELDS_READONLY(type) TYPE_LANG_FLAG_0 (type) ! ! /* Record in each node resulting from a binary operator ! what operator was specified for it. */ ! #define C_EXP_ORIGINAL_CODE(exp) ((enum tree_code) TREE_COMPLEXITY (exp)) /* Store a value in that field. */ ! #define C_SET_EXP_ORIGINAL_CODE(exp, code) \ ! (TREE_COMPLEXITY (exp) = (int)(code)) /* If non-zero, a VAR_DECL whose cleanup will cause a throw to the next exception handler. */ --- 440,499 ---- 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 LANG_ID_FIELD(NAME, NODE) \ (LANG_IDENTIFIER_CAST (NODE)->x \ ? LANG_IDENTIFIER_CAST (NODE)->x->NAME : 0) ! #define SET_LANG_ID(NODE, VALUE, NAME) \ ! (LANG_IDENTIFIER_CAST (NODE)->x == 0 \ ? LANG_IDENTIFIER_CAST (NODE)->x \ = (struct lang_id2 *)perm_calloc (1, sizeof (struct lang_id2)) : 0, \ LANG_IDENTIFIER_CAST (NODE)->x->NAME = (VALUE)) ! #define IDENTIFIER_LABEL_VALUE(NODE) \ ! LANG_ID_FIELD (label_value, NODE) ! #define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, label_value) ! #define IDENTIFIER_IMPLICIT_DECL(NODE) \ ! LANG_ID_FIELD (implicit_decl, NODE) ! #define SET_IDENTIFIER_IMPLICIT_DECL(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, implicit_decl) ! #define IDENTIFIER_ERROR_LOCUS(NODE) \ ! LANG_ID_FIELD (error_locus, NODE) ! #define SET_IDENTIFIER_ERROR_LOCUS(NODE, VALUE) \ ! SET_LANG_ID (NODE, VALUE, error_locus) /* Nonzero if this identifier is used as a virtual function name somewhere (optimizes searches). */ ! #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) /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ ! #define C_TYPE_FIELDS_READONLY(TYPE) TYPE_LANG_FLAG_0 (TYPE) /* Store a value in that field. */ ! #define C_SET_EXP_ORIGINAL_CODE(EXP, CODE) \ ! (TREE_COMPLEXITY (EXP) = (int)(CODE)) /* If non-zero, a VAR_DECL whose cleanup will cause a throw to the next exception handler. */ *************** enum cp_tree_index *** 575,586 **** CPTI_VTBL_TYPE, CPTI_VTBL_PTR_TYPE, CPTI_STD, - CPTI_FAKE_STD, CPTI_ABI, CPTI_TYPE_INFO_TYPE, - CPTI_TINFO_DECL_ID, CPTI_TINFO_DECL_TYPE, - CPTI_TINFO_VAR_ID, CPTI_ABORT_FNDECL, CPTI_GLOBAL_DELETE_FNDECL, CPTI_AGGR_TAG, --- 537,545 ---- *************** enum cp_tree_index *** 601,615 **** CPTI_COMPLETE_DTOR_IDENTIFIER, CPTI_BASE_DTOR_IDENTIFIER, CPTI_DELETING_DTOR_IDENTIFIER, - CPTI_DELTA2_IDENTIFIER, CPTI_DELTA_IDENTIFIER, CPTI_IN_CHARGE_IDENTIFIER, CPTI_VTT_PARM_IDENTIFIER, - CPTI_INDEX_IDENTIFIER, CPTI_NELTS_IDENTIFIER, CPTI_THIS_IDENTIFIER, CPTI_PFN_IDENTIFIER, - CPTI_PFN_OR_DELTA2_IDENTIFIER, CPTI_VPTR_IDENTIFIER, CPTI_STD_IDENTIFIER, --- 560,571 ---- *************** extern tree cp_global_trees[CPTI_MAX]; *** 643,650 **** #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 and, when not using vtable ! thunks, in vtables. */ #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] --- 599,605 ---- #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] *************** extern tree cp_global_trees[CPTI_MAX]; *** 668,686 **** #define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE] #define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE] #define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE] - /* When the `std' namespace is a real namespace, this is the - corresponding NAMESPACE_DECL. When the `std' namespace is an alias - for the global namespace, this is NULL_TREE. */ #define std_node cp_global_trees[CPTI_STD] - /* When the `std' namespace is a real namespace, this is the - ERROR_MARK_NODE. Otherwise, this is a dummy NAMESPACE_DECL that - should be treated like the global namespace. */ - #define fake_std_node cp_global_trees[CPTI_FAKE_STD] #define abi_node cp_global_trees[CPTI_ABI] #define type_info_type_node cp_global_trees[CPTI_TYPE_INFO_TYPE] - #define tinfo_decl_id cp_global_trees[CPTI_TINFO_DECL_ID] #define tinfo_decl_type cp_global_trees[CPTI_TINFO_DECL_TYPE] - #define tinfo_var_id cp_global_trees[CPTI_TINFO_VAR_ID] #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] --- 623,632 ---- *************** extern tree cp_global_trees[CPTI_MAX]; *** 720,739 **** /* 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 delta2_identifier cp_global_trees[CPTI_DELTA2_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 index_identifier cp_global_trees[CPTI_INDEX_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 pfn_or_delta2_identifier cp_global_trees[CPTI_PFN_OR_DELTA2_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] --- 666,679 ---- *************** extern tree cp_global_trees[CPTI_MAX]; *** 774,795 **** /* Global state. */ ! struct saved_scope { tree old_bindings; tree old_namespace; tree class_name; tree class_type; tree access_specifier; tree function_decl; varray_type lang_base; - tree *lang_stack; tree lang_name; tree template_parms; tree x_previous_class_type; tree x_previous_class_values; tree x_saved_tree; - tree incomplete; tree lookups; HOST_WIDE_INT x_processing_template_decl; int x_processing_specialization; --- 714,736 ---- /* Global state. */ ! struct saved_scope ! { tree old_bindings; tree old_namespace; + tree decl_ns_list; tree class_name; tree class_type; tree access_specifier; tree function_decl; varray_type lang_base; tree lang_name; tree template_parms; tree x_previous_class_type; tree x_previous_class_values; tree x_saved_tree; tree lookups; + tree last_parms; HOST_WIDE_INT x_processing_template_decl; int x_processing_specialization; *************** struct saved_scope { *** 808,813 **** --- 749,758 ---- #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 *************** struct saved_scope { *** 825,831 **** /* Pointer to the top of the language name stack. */ - #define current_lang_stack scope_chain->lang_stack #define current_lang_base scope_chain->lang_base #define current_lang_name scope_chain->lang_name --- 770,775 ---- *************** struct saved_scope { *** 849,885 **** #define previous_class_values scope_chain->x_previous_class_values - /* A list of the declarations with incomplete type at namespace scope. */ - - #define namespace_scope_incomplete scope_chain->incomplete - /* A list of private types mentioned, for deferred access checking. */ #define type_lookups scope_chain->lookups extern struct saved_scope *scope_chain; /* Global state pertinent to the current function. */ struct cp_language_function { struct language_function base; - tree x_ctor_label; tree x_dtor_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_vcalls_possible_p; int returns_value; int returns_null; int in_function_try_handler; int x_expanding_p; - int vtbls_set_up_p; struct named_label_use_list *x_named_label_uses; struct named_label_list *x_named_labels; --- 793,827 ---- #define previous_class_values scope_chain->x_previous_class_values /* A list of private types mentioned, for deferred access checking. */ #define type_lookups scope_chain->lookups extern struct saved_scope *scope_chain; + struct unparsed_text; + /* Global state pertinent to the current function. */ struct cp_language_function { struct language_function base; tree x_dtor_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; tree *x_vcalls_possible_p; int returns_value; int returns_null; + int returns_abnormally; int in_function_try_handler; int x_expanding_p; struct named_label_use_list *x_named_label_uses; struct named_label_list *x_named_labels; *************** struct cp_language_function *** 887,892 **** --- 829,835 ---- varray_type x_local_names; const char *cannot_inline; + struct unparsed_text *unparsed_inlines; }; /* The current C++-specific per-function global variables. */ *************** struct cp_language_function *** 899,909 **** #define dtor_label cp_function_chain->x_dtor_label - /* In a constructor, the point at which we are ready to return - the pointer to the initialized object. */ - - #define ctor_label cp_function_chain->x_ctor_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'. */ --- 842,847 ---- *************** struct cp_language_function *** 944,953 **** #define current_function_returns_null cp_function_chain->returns_null ! /* Nonzero if we have already generated code to initialize virtual ! function tables in this function. */ ! #define vtbls_set_up_p cp_function_chain->vtbls_set_up_p /* Non-zero if we should generate RTL for functions that we process. When this is zero, we just accumulate tree structure, without --- 882,892 ---- #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 /* Non-zero if we should generate RTL for functions that we process. When this is zero, we just accumulate tree structure, without *************** struct cp_language_function *** 962,974 **** #define in_function_try_handler cp_function_chain->in_function_try_handler ! /* Nonzero if __FUNCTION__ and its ilk have been declared in this ! function. */ ! #define function_name_declared_p \ ! (cp_function_chain->base.x_function_name_declared_p) - extern tree current_function_return_value; extern tree global_namespace; #define ansi_opname(CODE) \ --- 901,912 ---- #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) extern tree global_namespace; #define ansi_opname(CODE) \ *************** extern int flag_no_gnu_keywords; *** 992,1001 **** extern int flag_operator_names; - /* For cross referencing. */ - - extern int flag_gnu_xref; - /* For environments where you can use GNU binutils (as, ld in particular). */ extern int flag_gnu_binutils; --- 930,935 ---- *************** extern int warn_implicit; *** 1009,1029 **** extern int warn_ctor_dtor_privacy; - /* Nonzero means warn about function definitions that default the return type - or that use a null return and have a return-type other than void. */ - - extern int warn_return_type; - /* Nonzero means warn about deprecated conversion from string constant to `char *'. */ extern int warn_write_strings; - /* Nonzero means warn about sizeof(function) or addition/subtraction - of function pointers. */ - - extern int warn_pointer_arith; - /* Nonzero means warn about multiple (redundant) decls for the same single variable or function. */ --- 943,953 ---- *************** extern int warn_old_style_cast; *** 1077,1091 **** extern int warn_reorder; /* Nonzero means to treat bitfields as unsigned unless they say `signed'. */ extern int flag_signed_bitfields; - /* True for more efficient but incompatible (not fully tested) - vtable implementation (using thunks). - 0 is old behavior; 1 is new behavior. */ - extern int flag_vtable_thunks; - /* INTERFACE_ONLY nonzero means that we are in an "interface" section of the compiler. INTERFACE_UNKNOWN nonzero means we cannot trust the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN --- 1001,1014 ---- extern int warn_reorder; + /* Non-zero means warn about deprecated features. */ + + extern int warn_deprecated; + /* Nonzero means to treat bitfields as unsigned unless they say `signed'. */ extern int flag_signed_bitfields; /* INTERFACE_ONLY nonzero means that we are in an "interface" section of the compiler. INTERFACE_UNKNOWN nonzero means we cannot trust the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN *************** extern int flag_access_control; *** 1138,1147 **** extern int flag_check_new; - /* Nonnull if we want to dump class heirarchies. */ - - extern const char *flag_dump_class_layout; - /* C++ language-specific tree codes. */ #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM, --- 1061,1066 ---- *************** enum languages { lang_c, lang_cplusplus, *** 1161,1168 **** #define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE))) #define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE))) ! #define TYPE_ASSEMBLER_NAME_STRING(NODE) (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) ! #define TYPE_ASSEMBLER_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) /* Nonzero if NODE has no name for linkage purposes. */ #define TYPE_ANONYMOUS_P(NODE) \ --- 1080,1089 ---- #define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE))) #define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE))) ! #define TYPE_ASSEMBLER_NAME_STRING(NODE) \ ! (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) ! #define TYPE_ASSEMBLER_NAME_LENGTH(NODE) \ ! (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) /* Nonzero if NODE has no name for linkage purposes. */ #define TYPE_ANONYMOUS_P(NODE) \ *************** enum languages { lang_c, lang_cplusplus, *** 1176,1187 **** template template parameters. Despite its name, this macro has nothing to do with the definition of aggregate given in the standard. Think of this macro as MAYBE_CLASS_TYPE_P. */ ! #define IS_AGGR_TYPE(t) \ ! (TREE_CODE (t) == TEMPLATE_TYPE_PARM \ ! || TREE_CODE (t) == TYPENAME_TYPE \ ! || TREE_CODE (t) == TYPEOF_TYPE \ ! || TREE_CODE (t) == BOUND_TEMPLATE_TEMPLATE_PARM \ ! || TYPE_LANG_FLAG_5 (t)) /* Set IS_AGGR_TYPE for T to VAL. T must be a class, struct, or union type. */ --- 1097,1108 ---- template template parameters. Despite its name, this macro has nothing to do with the definition of aggregate given in the standard. Think of this macro as MAYBE_CLASS_TYPE_P. */ ! #define IS_AGGR_TYPE(T) \ ! (TREE_CODE (T) == TEMPLATE_TYPE_PARM \ ! || TREE_CODE (T) == TYPENAME_TYPE \ ! || TREE_CODE (T) == TYPEOF_TYPE \ ! || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \ ! || TYPE_LANG_FLAG_5 (T)) /* Set IS_AGGR_TYPE for T to VAL. T must be a class, struct, or union type. */ *************** enum languages { lang_c, lang_cplusplus, *** 1190,1269 **** /* Nonzero if T is a class type. Zero for template type parameters, typename types, and so forth. */ ! #define CLASS_TYPE_P(t) \ ! (IS_AGGR_TYPE_CODE (TREE_CODE (t)) && IS_AGGR_TYPE (t)) ! #define IS_AGGR_TYPE_CODE(t) (t == RECORD_TYPE || t == UNION_TYPE) ! #define IS_AGGR_TYPE_2(TYPE1,TYPE2) \ (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \ && IS_AGGR_TYPE (TYPE1) && IS_AGGR_TYPE (TYPE2)) ! #define TAGGED_TYPE_P(t) \ ! (CLASS_TYPE_P (t) || TREE_CODE (t) == ENUMERAL_TYPE) #define IS_OVERLOAD_TYPE(T) TAGGED_TYPE_P (T) /* In a *_TYPE, nonzero means a built-in type. */ ! #define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6(NODE) /* True if this a "Java" type, defined in 'extern "Java"'. */ ! #define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3(NODE) ! ! /* The type qualifiers for this type, including the qualifiers on the ! elements for an array type. */ ! #define CP_TYPE_QUALS(NODE) C_TYPE_QUALS (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) - /* Virtual function addresses can be gotten from a virtual function - table entry using this macro. */ - #define FNADDR_FROM_VTABLE_ENTRY(ENTRY) \ - (!flag_vtable_thunks ? \ - TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) \ - : !DECL_THUNK_P (TREE_OPERAND ((ENTRY), 0)) \ - ? (ENTRY) \ - : DECL_INITIAL (TREE_OPERAND ((ENTRY), 0))) - #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))) ! #define PROMOTES_TO_AGGR_TYPE(NODE,CODE) \ (((CODE) == TREE_CODE (NODE) \ ! && IS_AGGR_TYPE (TREE_TYPE (NODE))) \ || IS_AGGR_TYPE (NODE)) ! /* Nonzero iff TYPE is uniquely derived from PARENT. Under MI, PARENT can ! be an ambiguous base class of TYPE, and this macro will be false. */ ! #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) >= 0) ! #define ACCESSIBLY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, -1, (tree *)0) >= 0) ! #define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 1, (tree *)0) >= 0) ! #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 2, (tree *)0) >= 0) ! #define DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) != -1) /* This structure provides additional information above and beyond what is provide in the ordinary tree_type. In the past, we used it --- 1111,1185 ---- /* Nonzero if T is a class type. Zero for template type parameters, typename types, and so forth. */ ! #define CLASS_TYPE_P(T) \ ! (IS_AGGR_TYPE_CODE (TREE_CODE (T)) && IS_AGGR_TYPE (T)) ! #define IS_AGGR_TYPE_CODE(T) ((T) == RECORD_TYPE || (T) == UNION_TYPE) ! #define IS_AGGR_TYPE_2(TYPE1, TYPE2) \ (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \ && IS_AGGR_TYPE (TYPE1) && IS_AGGR_TYPE (TYPE2)) ! #define TAGGED_TYPE_P(T) \ ! (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE) #define IS_OVERLOAD_TYPE(T) TAGGED_TYPE_P (T) /* In a *_TYPE, nonzero means a built-in type. */ ! #define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6 (NODE) /* True if this a "Java" type, defined in 'extern "Java"'. */ ! #define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE) /* Nonzero if this type is const-qualified. */ #define CP_TYPE_CONST_P(NODE) \ ! ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0) /* 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)) ! #define PROMOTES_TO_AGGR_TYPE(NODE, CODE) \ (((CODE) == TREE_CODE (NODE) \ ! && IS_AGGR_TYPE (TREE_TYPE (NODE))) \ || IS_AGGR_TYPE (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) ! /* Nonzero iff TYPE is uniquely derived from PARENT. Ignores ! accessibility. */ ! #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \ ! lookup_base ((TYPE), (PARENT), ba_ignore | ba_quiet, NULL) ! /* Nonzero iff TYPE is accessible in the current scope and uniquely ! derived from PARENT. */ ! #define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ ! lookup_base ((TYPE), (PARENT), ba_check | ba_quiet, NULL) ! /* Nonzero iff TYPE is publicly & uniquely derived from PARENT. */ ! #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ ! lookup_base ((TYPE), (PARENT), ba_not_special | ba_quiet, NULL) /* This structure provides additional information above and beyond what is provide in the ordinary tree_type. In the past, we used it *************** struct lang_type *** 1295,1301 **** unsigned com_interface : 1; unsigned non_pod_class : 1; unsigned nearly_empty_p : 1; ! unsigned vtable_needs_writing : 1; unsigned has_assign_ref : 1; unsigned has_new : 1; unsigned has_array_new : 1; --- 1211,1217 ---- unsigned com_interface : 1; unsigned non_pod_class : 1; unsigned nearly_empty_p : 1; ! unsigned user_align : 1; unsigned has_assign_ref : 1; unsigned has_new : 1; unsigned has_array_new : 1; *************** struct lang_type *** 1309,1315 **** unsigned needs_virtual_reinit : 1; unsigned marks: 6; ! unsigned vec_delete_takes_size : 1; unsigned declared_class : 1; unsigned being_defined : 1; --- 1225,1231 ---- unsigned needs_virtual_reinit : 1; unsigned marks: 6; ! unsigned vec_new_uses_cookie : 1; unsigned declared_class : 1; unsigned being_defined : 1; *************** struct lang_type *** 1327,1333 **** unsigned has_abstract_assign_ref : 1; unsigned non_aggregate : 1; unsigned is_partial_instantiation : 1; ! unsigned user_align : 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 --- 1243,1249 ---- unsigned has_abstract_assign_ref : 1; unsigned non_aggregate : 1; unsigned is_partial_instantiation : 1; ! unsigned java_interface : 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 *************** struct lang_type *** 1336,1343 **** /* 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 java_interface : 1; ! unsigned dummy : 7; int vsize; --- 1252,1258 ---- /* 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 : 8; int vsize; *************** struct lang_type *** 1360,1402 **** 1=implicit template instantiation 2=explicit template specialization 3=explicit template instantiation */ ! #define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC(NODE)->use_template) /* Fields used for storing information before the class is defined. After the class is defined, these fields hold other information. */ /* List of friends which were defined inline in this class definition. */ ! #define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE)) /* Nonzero for _CLASSTYPE means that operator delete is defined. */ ! #define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->gets_delete) #define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1) - /* Nonzero for _CLASSTYPE means that operator vec delete is defined and - takes the optional size_t argument. */ - #define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \ - (TYPE_LANG_SPECIFIC(NODE)->vec_delete_takes_size) - /* Nonzero if `new NODE[x]' should cause the allocation of extra ! storage to indicate how many array elements are in use. The old ! ABI had a bug in that we always allocate the extra storage if NODE ! has a two-argument array operator delete. */ ! #define TYPE_VEC_NEW_USES_COOKIE(NODE) \ ! (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE) \ ! || (TYPE_LANG_SPECIFIC (NODE) \ ! && TYPE_VEC_DELETE_TAKES_SIZE (NODE))) /* Nonzero means that this _CLASSTYPE node defines ways of converting itself to other types. */ ! #define TYPE_HAS_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_type_conversion) /* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */ ! #define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_assign_ref) ! #define TYPE_HAS_CONST_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_const_assign_ref) /* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */ ! #define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_init_ref) ! #define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_const_init_ref) /* Nonzero if this class defines an overloaded operator new. (An operator new [] doesn't count.) */ --- 1275,1312 ---- 1=implicit template instantiation 2=explicit template specialization 3=explicit template instantiation */ ! #define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC (NODE)->use_template) /* Fields used for storing information before the class is defined. After the class is defined, these fields hold other information. */ /* List of friends which were defined inline in this class definition. */ ! #define CLASSTYPE_INLINE_FRIENDS(NODE) CLASSTYPE_PURE_VIRTUALS (NODE) /* Nonzero for _CLASSTYPE means that operator delete is defined. */ ! #define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC (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) \ ! && TYPE_LANG_SPECIFIC (NODE)->vec_new_uses_cookie) /* Nonzero means that this _CLASSTYPE node defines ways of converting itself to other types. */ ! #define TYPE_HAS_CONVERSION(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_type_conversion) /* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */ ! #define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_assign_ref) ! #define TYPE_HAS_CONST_ASSIGN_REF(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_const_assign_ref) /* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */ ! #define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_init_ref) ! #define TYPE_HAS_CONST_INIT_REF(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_const_init_ref) /* Nonzero if this class defines an overloaded operator new. (An operator new [] doesn't count.) */ *************** struct lang_type *** 1409,1440 **** /* 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) (TYPE_LANG_SPECIFIC(NODE)->being_defined) /* Nonzero means that this type has been redefined. In this case, if convenient, don't reprocess any methods that appear in its redefinition. */ ! #define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->redefined) /* The is the basetype that contains NODE's rtti. */ ! #define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti) /* Nonzero means that this _CLASSTYPE node overloads operator(). */ ! #define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_call_overloaded) /* Nonzero means that this _CLASSTYPE node overloads operator[]. */ ! #define TYPE_OVERLOADS_ARRAY_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_array_ref_overloaded) /* Nonzero means that this _CLASSTYPE node overloads operator->. */ ! #define TYPE_OVERLOADS_ARROW(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_arrow_overloaded) /* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses multiple inheritance. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */ ! #define TYPE_USES_MULTIPLE_INHERITANCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->uses_multiple_inheritance) /* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses virtual base classes. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */ ! #define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE)) /* Vector member functions defined in this class. Each element is either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All --- 1319,1354 ---- /* 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) (TYPE_LANG_SPECIFIC (NODE)->being_defined) /* Nonzero means that this type has been redefined. In this case, if convenient, don't reprocess any methods that appear in its redefinition. */ ! #define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC (NODE)->redefined) /* The is the basetype that contains NODE's rtti. */ ! #define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC (NODE)->rtti) /* Nonzero means that this _CLASSTYPE node overloads operator(). */ ! #define TYPE_OVERLOADS_CALL_EXPR(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_call_overloaded) /* Nonzero means that this _CLASSTYPE node overloads operator[]. */ ! #define TYPE_OVERLOADS_ARRAY_REF(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_array_ref_overloaded) /* Nonzero means that this _CLASSTYPE node overloads operator->. */ ! #define TYPE_OVERLOADS_ARROW(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_arrow_overloaded) /* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses multiple inheritance. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */ ! #define TYPE_USES_MULTIPLE_INHERITANCE(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->uses_multiple_inheritance) /* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses virtual base classes. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */ ! #define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3 (NODE)) /* Vector member functions defined in this class. Each element is either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All *************** struct lang_type *** 1442,1448 **** two elements are for constructors, and destructors, respectively. Any conversion operators are next, followed by ordinary member functions. There may be empty entries at the end of the vector. */ ! #define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods) /* The slot in the CLASSTYPE_METHOD_VEC where constructors go. */ #define CLASSTYPE_CONSTRUCTOR_SLOT 0 --- 1356,1362 ---- two elements are for constructors, and destructors, respectively. Any conversion operators are next, followed by ordinary member functions. There may be empty entries at the end of the vector. */ ! #define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC (NODE)->methods) /* The slot in the CLASSTYPE_METHOD_VEC where constructors go. */ #define CLASSTYPE_CONSTRUCTOR_SLOT 0 *************** struct lang_type *** 1469,1475 **** /* Get the value of the Nth mark bit. */ #define CLASSTYPE_MARKED_N(NODE, N) \ (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->marks \ ! : ((unsigned) TYPE_ALIAS_SET (NODE))) & (1 << N)) != 0) /* Set the Nth mark bit. */ #define SET_CLASSTYPE_MARKED_N(NODE, N) \ --- 1383,1389 ---- /* Get the value of the Nth mark bit. */ #define CLASSTYPE_MARKED_N(NODE, N) \ (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->marks \ ! : ((unsigned) TYPE_ALIAS_SET (NODE))) & (1 << (N))) != 0) /* Set the Nth mark bit. */ #define SET_CLASSTYPE_MARKED_N(NODE, N) \ *************** struct lang_type *** 1484,1515 **** : (void) (TYPE_ALIAS_SET (NODE) &= ~(1 << (N)))) /* Get the value of the mark bits. */ ! #define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N(NODE, 0) ! #define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N(NODE, 1) ! #define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N(NODE, 2) ! #define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N(NODE, 3) ! #define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N(NODE, 4) ! #define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N(NODE, 5) /* Macros to modify the above flags */ ! #define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N(NODE, 0) ! #define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 0) ! #define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N(NODE, 1) ! #define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 1) ! #define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N(NODE, 2) ! #define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 2) ! #define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N(NODE, 3) ! #define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 3) ! #define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N(NODE, 4) ! #define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 4) ! #define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N(NODE, 5) ! #define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 5) /* A list of the nested tag-types (class, struct, union, or enum) found within this class. The TREE_PURPOSE of each node is the name of the type; the TREE_VALUE is the type itself. This list includes nested member class templates. */ ! #define CLASSTYPE_TAGS(NODE) (TYPE_LANG_SPECIFIC(NODE)->tags) /* Nonzero if NODE has a primary base class, i.e., a base class with which it shares the virtual function table pointer. */ --- 1398,1429 ---- : (void) (TYPE_ALIAS_SET (NODE) &= ~(1 << (N)))) /* Get the value of the mark bits. */ ! #define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N (NODE, 0) ! #define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N (NODE, 1) ! #define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N (NODE, 2) ! #define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N (NODE, 3) ! #define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N (NODE, 4) ! #define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N (NODE, 5) /* Macros to modify the above flags */ ! #define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N (NODE, 0) ! #define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 0) ! #define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N (NODE, 1) ! #define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 1) ! #define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N (NODE, 2) ! #define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 2) ! #define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N (NODE, 3) ! #define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 3) ! #define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N (NODE, 4) ! #define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 4) ! #define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N (NODE, 5) ! #define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N (NODE, 5) /* A list of the nested tag-types (class, struct, union, or enum) found within this class. The TREE_PURPOSE of each node is the name of the type; the TREE_VALUE is the type itself. This list includes nested member class templates. */ ! #define CLASSTYPE_TAGS(NODE) (TYPE_LANG_SPECIFIC (NODE)->tags) /* Nonzero if NODE has a primary base class, i.e., a base class with which it shares the virtual function table pointer. */ *************** struct lang_type *** 1524,1530 **** /* The number of virtual functions present in this class' virtual function table. */ ! #define CLASSTYPE_VSIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->vsize) /* A chain of BINFOs for the direct and indirect virtual base classes that this type uses in a post-order depth-first left-to-right --- 1438,1444 ---- /* The number of virtual functions present in this class' virtual function table. */ ! #define CLASSTYPE_VSIZE(NODE) (TYPE_LANG_SPECIFIC (NODE)->vsize) /* A chain of BINFOs for the direct and indirect virtual base classes that this type uses in a post-order depth-first left-to-right *************** struct lang_type *** 1534,1540 **** list are all "real"; they are the same BINFOs that will be encountered when using dfs_unmarked_real_bases_queue_p and related functions. */ ! #define CLASSTYPE_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->vbases) /* For a non-virtual BINFO, the BINFO itself; for a virtual BINFO, the binfo_for_vbase. C is the most derived class for the hierarchy --- 1448,1454 ---- list are all "real"; they are the same BINFOs that will be encountered when using dfs_unmarked_real_bases_queue_p and related functions. */ ! #define CLASSTYPE_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC (NODE)->vbases) /* For a non-virtual BINFO, the BINFO itself; for a virtual BINFO, the binfo_for_vbase. C is the most derived class for the hierarchy *************** struct lang_type *** 1542,1548 **** #define CANONICAL_BINFO(BINFO, C) \ (TREE_VIA_VIRTUAL (BINFO) \ ? binfo_for_vbase (BINFO_TYPE (BINFO), C) \ ! : BINFO) /* Number of direct baseclasses of NODE. */ #define CLASSTYPE_N_BASECLASSES(NODE) \ --- 1456,1462 ---- #define CANONICAL_BINFO(BINFO, C) \ (TREE_VIA_VIRTUAL (BINFO) \ ? binfo_for_vbase (BINFO_TYPE (BINFO), C) \ ! : (BINFO)) /* Number of direct baseclasses of NODE. */ #define CLASSTYPE_N_BASECLASSES(NODE) \ *************** struct lang_type *** 1550,1559 **** /* 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_LANG_SPECIFIC(NODE)->size) ! #define CLASSTYPE_SIZE_UNIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->size_unit) ! #define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->align) ! #define CLASSTYPE_USER_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->user_align) /* The alignment of NODE, without its virtual bases, in bytes. */ #define CLASSTYPE_ALIGN_UNIT(NODE) \ --- 1464,1473 ---- /* 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_LANG_SPECIFIC (NODE)->size) ! #define CLASSTYPE_SIZE_UNIT(NODE) (TYPE_LANG_SPECIFIC (NODE)->size_unit) ! #define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC (NODE)->align) ! #define CLASSTYPE_USER_ALIGN(NODE) (TYPE_LANG_SPECIFIC (NODE)->user_align) /* The alignment of NODE, without its virtual bases, in bytes. */ #define CLASSTYPE_ALIGN_UNIT(NODE) \ *************** struct lang_type *** 1561,1572 **** /* True if this a Java interface type, declared with '__attribute__ ((java_interface))'. */ ! #define TYPE_JAVA_INTERFACE(NODE) (TYPE_LANG_SPECIFIC(NODE)->java_interface) /* A cons list 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) (TYPE_LANG_SPECIFIC(NODE)->pure_virtuals) /* Nonzero means that this aggr type has been `closed' by a semicolon. */ #define CLASSTYPE_GOT_SEMICOLON(NODE) (TYPE_LANG_SPECIFIC (NODE)->got_semicolon) --- 1475,1486 ---- /* True if this a Java interface type, declared with '__attribute__ ((java_interface))'. */ ! #define TYPE_JAVA_INTERFACE(NODE) (TYPE_LANG_SPECIFIC (NODE)->java_interface) /* A cons list 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) (TYPE_LANG_SPECIFIC (NODE)->pure_virtuals) /* Nonzero means that this aggr type has been `closed' by a semicolon. */ #define CLASSTYPE_GOT_SEMICOLON(NODE) (TYPE_LANG_SPECIFIC (NODE)->got_semicolon) *************** struct lang_type *** 1575,1591 **** set because base constructors have placed the wrong value there. If this is zero, it means that they placed the right value there, and there is no need to change it. */ ! #define CLASSTYPE_NEEDS_VIRTUAL_REINIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->needs_virtual_reinit) ! ! /* Nonzero means that if this type has virtual functions, that ! the virtual function table will be written out. */ ! #define CLASSTYPE_VTABLE_NEEDS_WRITING(NODE) (TYPE_LANG_SPECIFIC(NODE)->vtable_needs_writing) /* Nonzero means that this type has an X() constructor. */ ! #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_default_ctor) /* Nonzero means that this type contains a mutable member */ ! #define CLASSTYPE_HAS_MUTABLE(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_mutable) #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) /* Nonzero means that this class type is a non-POD class. */ --- 1489,1503 ---- set because base constructors have placed the wrong value there. If this is zero, it means that they placed the right value there, and there is no need to change it. */ ! #define CLASSTYPE_NEEDS_VIRTUAL_REINIT(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->needs_virtual_reinit) /* Nonzero means that this type has an X() constructor. */ ! #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->has_default_ctor) /* Nonzero means that this type contains a mutable member */ ! #define CLASSTYPE_HAS_MUTABLE(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_mutable) #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) /* Nonzero means that this class type is a non-POD class. */ *************** struct lang_type *** 1596,1626 **** #define CLASSTYPE_NEARLY_EMPTY_P(NODE) \ (TYPE_LANG_SPECIFIC (NODE)->nearly_empty_p) - /* Nonzero means that this type is meant for communication via COM. */ - #define CLASSTYPE_COM_INTERFACE(NODE) \ - (TYPE_LANG_SPECIFIC(NODE)->com_interface) - /* 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) (TYPE_LANG_SPECIFIC(NODE)->friend_classes) /* A list of the classes which grant friendship to this class. */ #define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \ (TYPE_LANG_SPECIFIC (NODE)->befriending_classes) /* Say whether this node was declared as a "class" or a "struct". */ ! #define CLASSTYPE_DECLARED_CLASS(NODE) (TYPE_LANG_SPECIFIC(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)->const_needs_init) /* Nonzero if this class has ref members which have no specified initialization. */ ! #define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->ref_needs_init) /* 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) (TYPE_LANG_SPECIFIC(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 --- 1508,1539 ---- #define CLASSTYPE_NEARLY_EMPTY_P(NODE) \ (TYPE_LANG_SPECIFIC (NODE)->nearly_empty_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) \ ! (TYPE_LANG_SPECIFIC (NODE)->friend_classes) /* A list of the classes which grant friendship to this class. */ #define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \ (TYPE_LANG_SPECIFIC (NODE)->befriending_classes) /* Say whether this node was declared as a "class" or a "struct". */ ! #define CLASSTYPE_DECLARED_CLASS(NODE) \ ! (TYPE_LANG_SPECIFIC (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)->const_needs_init) /* Nonzero if this class has ref members which have no specified initialization. */ ! #define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->ref_needs_init) /* 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) \ ! (TYPE_LANG_SPECIFIC (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 *************** struct lang_type *** 1628,1647 **** these items should be emitted; it only indicates that we know one way or the other. */ #define CLASSTYPE_INTERFACE_KNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC(NODE)->interface_unknown == 0) /* The opposite of CLASSTYPE_INTERFANCE_KNOWN. */ #define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC(NODE)->interface_unknown) #define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \ ! (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = !!(X)) #define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = 1) #define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC(NODE)->interface_unknown = 0) /* Nonzero if a _DECL node requires us to output debug info for this class. */ ! #define CLASSTYPE_DEBUG_REQUESTED(NODE) (TYPE_LANG_SPECIFIC(NODE)->debug_requested) /* Additional macros for inheritance information. */ --- 1541,1561 ---- these items should be emitted; it only indicates that we know one way or the other. */ #define CLASSTYPE_INTERFACE_KNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->interface_unknown == 0) /* The opposite of CLASSTYPE_INTERFANCE_KNOWN. */ #define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->interface_unknown) #define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \ ! (TYPE_LANG_SPECIFIC (NODE)->interface_unknown = !!(X)) #define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->interface_unknown = 1) #define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->interface_unknown = 0) /* Nonzero if a _DECL node requires us to output debug info for this class. */ ! #define CLASSTYPE_DEBUG_REQUESTED(NODE) \ ! (TYPE_LANG_SPECIFIC (NODE)->debug_requested) /* Additional macros for inheritance information. */ *************** struct lang_type *** 1658,1678 **** /* Mark the binfo, whether shared or not. Each instance of a virtual base can be separately marked. */ ! #define BINFO_UNSHARED_MARKED(NODE) TREE_LANG_FLAG_0(NODE) ! /* Nonzero means marked by DFS or BFS search, including searches ! by `get_binfo' and `get_base_distance'. */ ! #define BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED(BINFO_TYPE(NODE)):TREE_LANG_FLAG_0(NODE)) /* Macros needed because of C compilers that don't allow conditional expressions to be lvalues. Grr! */ ! #define SET_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=1)) ! #define CLEAR_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=0)) /* Nonzero means that this class is on a path leading to a new vtable. */ ! #define BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):TREE_LANG_FLAG_3(NODE)) ! #define SET_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=1)) ! #define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=0)) /* Nonzero means B (a BINFO) has its own vtable. Under the old ABI, secondary vtables are sometimes shared. Any copies will not have --- 1572,1608 ---- /* Mark the binfo, whether shared or not. Each instance of a virtual base can be separately marked. */ ! #define BINFO_UNSHARED_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) ! /* Nonzero means marked by DFS or BFS search. */ ! #define BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : TREE_LANG_FLAG_0 (NODE)) /* Macros needed because of C compilers that don't allow conditional expressions to be lvalues. Grr! */ ! #define SET_BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL(NODE) \ ! ? SET_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : (void)(TREE_LANG_FLAG_0 (NODE) = 1)) ! #define CLEAR_BINFO_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (NODE)) \ ! : (void)(TREE_LANG_FLAG_0 (NODE) = 0)) /* Nonzero means that this class is on a path leading to a new vtable. */ ! #define BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLASSTYPE_MARKED3 (BINFO_TYPE (NODE)) \ ! : TREE_LANG_FLAG_3 (NODE)) ! #define SET_BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL(NODE) \ ! ? SET_CLASSTYPE_MARKED3 (BINFO_TYPE (NODE)) \ ! : (TREE_LANG_FLAG_3 (NODE) = 1)) ! #define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) \ ! (TREE_VIA_VIRTUAL (NODE) \ ! ? CLEAR_CLASSTYPE_MARKED3 (BINFO_TYPE (NODE))\ ! : (TREE_LANG_FLAG_3 (NODE) = 0)) /* Nonzero means B (a BINFO) has its own vtable. Under the old ABI, secondary vtables are sometimes shared. Any copies will not have *************** struct lang_type *** 1687,1693 **** derived class and never become non-primary.) */ #define SET_BINFO_NEW_VTABLE_MARKED(B, C) \ (BINFO_NEW_VTABLE_MARKED (B, C) = 1, \ ! my_friendly_assert (!BINFO_PRIMARY_P (B) || TREE_VIA_VIRTUAL (B), 20000517), \ my_friendly_assert (CLASSTYPE_VFIELDS (BINFO_TYPE (B)) != NULL_TREE, \ 20000517)) --- 1617,1624 ---- derived class and never become non-primary.) */ #define SET_BINFO_NEW_VTABLE_MARKED(B, C) \ (BINFO_NEW_VTABLE_MARKED (B, C) = 1, \ ! my_friendly_assert (!BINFO_PRIMARY_P (B) \ ! || TREE_VIA_VIRTUAL (B), 20000517), \ my_friendly_assert (CLASSTYPE_VFIELDS (BINFO_TYPE (B)) != NULL_TREE, \ 20000517)) *************** struct lang_type *** 1696,1727 **** #define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE) #define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE) ! /* Nonzero if this BINFO is a primary base class. - In the TYPE_BINFO hierarchy, this flag is never set for a base - class of a non-primary virtual base. This flag is only valid for - paths (given by BINFO_INHERITANCE_CHAIN) that really exist in the - final object. */ #define BINFO_PRIMARY_P(NODE) \ (BINFO_PRIMARY_BASE_OF (NODE) != NULL_TREE) /* The index in the VTT where this subobject's sub-VTT can be found. NULL_TREE if there is no sub-VTT. */ ! #define BINFO_SUBVTT_INDEX(NODE) TREE_VEC_ELT ((NODE), 8) /* The index in the VTT where the vptr for this subobject can be found. NULL_TREE if there is no secondary vptr in the VTT. */ ! #define BINFO_VPTR_INDEX(NODE) TREE_VEC_ELT ((NODE), 9) /* The binfo of which NODE is a primary base. (This is different from BINFO_INHERITANCE_CHAIN for virtual base because a virtual base is sometimes a primary base for a class for which it is not an immediate base.) */ ! #define BINFO_PRIMARY_BASE_OF(NODE) TREE_VEC_ELT ((NODE), 10) /* Nonzero if this binfo has lost its primary base binfo (because that is a nearly-empty virtual base that has been taken by some other ! base in the complete heirarchy. */ #define BINFO_LOST_PRIMARY_P(NODE) TREE_LANG_FLAG_2 (NODE) /* Nonzero if this binfo is an indirect primary base, i.e. a virtual --- 1627,1656 ---- #define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE) #define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE) ! /* Nonzero if this BINFO is a primary base class. Note, this can be ! set for non-canononical virtual bases. For a virtual primary base ! you might also need to check whether it is canonical. */ #define BINFO_PRIMARY_P(NODE) \ (BINFO_PRIMARY_BASE_OF (NODE) != NULL_TREE) /* The index in the VTT where this subobject's sub-VTT can be found. NULL_TREE if there is no sub-VTT. */ ! #define BINFO_SUBVTT_INDEX(NODE) TREE_VEC_ELT (NODE, 8) /* The index in the VTT where the vptr for this subobject can be found. NULL_TREE if there is no secondary vptr in the VTT. */ ! #define BINFO_VPTR_INDEX(NODE) TREE_VEC_ELT (NODE, 9) /* The binfo of which NODE is a primary base. (This is different from BINFO_INHERITANCE_CHAIN for virtual base because a virtual base is sometimes a primary base for a class for which it is not an immediate base.) */ ! #define BINFO_PRIMARY_BASE_OF(NODE) TREE_VEC_ELT (NODE, 10) /* Nonzero if this binfo has lost its primary base binfo (because that is a nearly-empty virtual base that has been taken by some other ! base in the complete hierarchy. */ #define BINFO_LOST_PRIMARY_P(NODE) TREE_LANG_FLAG_2 (NODE) /* Nonzero if this binfo is an indirect primary base, i.e. a virtual *************** struct lang_type *** 1739,1745 **** TREE_PURPOSE is NULL. Otherwise, the TREE_PURPOSE is the BINFO for the class containing the vfield. The TREE_VALUE is the class where the vfield was first defined. */ ! #define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfields) /* Get the assoc info that caused this vfield to exist. */ #define VF_BINFO_VALUE(NODE) TREE_PURPOSE (NODE) --- 1668,1674 ---- TREE_PURPOSE is NULL. Otherwise, the TREE_PURPOSE is the BINFO for the class containing the vfield. The TREE_VALUE is the class where the vfield was first defined. */ ! #define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC (NODE)->vfields) /* Get the assoc info that caused this vfield to exist. */ #define VF_BINFO_VALUE(NODE) TREE_PURPOSE (NODE) *************** struct lang_type *** 1748,1754 **** #define VF_BASETYPE_VALUE(NODE) TREE_VALUE (NODE) /* Get the value of the top-most type dominating the non-`normal' vfields. */ ! #define VF_DERIVED_VALUE(NODE) (VF_BINFO_VALUE (NODE) ? BINFO_TYPE (VF_BINFO_VALUE (NODE)) : NULL_TREE) /* The number of bytes by which to adjust the `this' pointer when calling this virtual function. */ --- 1677,1684 ---- #define VF_BASETYPE_VALUE(NODE) TREE_VALUE (NODE) /* Get the value of the top-most type dominating the non-`normal' vfields. */ ! #define VF_DERIVED_VALUE(NODE) \ ! (VF_BINFO_VALUE (NODE) ? BINFO_TYPE (VF_BINFO_VALUE (NODE)) : NULL_TREE) /* The number of bytes by which to adjust the `this' pointer when calling this virtual function. */ *************** struct lang_type *** 1776,1782 **** 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. */ ! #define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_NONCOPIED_PARTS (NODE) /* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'. */ #define TYPE_NOTHROW_P(NODE) \ --- 1706,1712 ---- 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. */ ! #define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_BINFO (NODE) /* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'. */ #define TYPE_NOTHROW_P(NODE) \ *************** struct lang_type *** 1785,1791 **** /* The binding level associated with the namespace. */ #define NAMESPACE_LEVEL(NODE) \ ! (DECL_LANG_SPECIFIC(NODE)->decl_flags.u.level) /* If a DECL has DECL_LANG_SPECIFIC, it is either a lang_decl_flags or --- 1715,1721 ---- /* The binding level associated with the namespace. */ #define NAMESPACE_LEVEL(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.u.level) /* If a DECL has DECL_LANG_SPECIFIC, it is either a lang_decl_flags or *************** struct lang_type *** 1793,1802 **** This macro is nonzero for tree nodes whose DECL_LANG_SPECIFIC is the full lang_decl, and not just lang_decl_flags. */ #define CAN_HAVE_FULL_LANG_DECL_P(NODE) \ ! (!(TREE_CODE ((NODE)) == VAR_DECL \ ! || TREE_CODE ((NODE)) == CONST_DECL \ ! || TREE_CODE ((NODE)) == FIELD_DECL \ ! || TREE_CODE ((NODE)) == USING_DECL)) struct lang_decl_flags { --- 1723,1732 ---- This macro is nonzero for tree nodes whose DECL_LANG_SPECIFIC is the full lang_decl, and not just lang_decl_flags. */ #define CAN_HAVE_FULL_LANG_DECL_P(NODE) \ ! (!(TREE_CODE (NODE) == VAR_DECL \ ! || TREE_CODE (NODE) == CONST_DECL \ ! || TREE_CODE (NODE) == FIELD_DECL \ ! || TREE_CODE (NODE) == USING_DECL)) struct lang_decl_flags { *************** struct lang_decl_flags *** 1816,1833 **** unsigned deferred : 1; unsigned use_template : 2; unsigned nonconverting : 1; - unsigned declared_inline : 1; unsigned not_really_extern : 1; unsigned needs_final_overrider : 1; unsigned initialized_in_class : 1; - unsigned pending_inline_p : 1; unsigned global_ctor_p : 1; unsigned global_dtor_p : 1; - unsigned tinfo_fn_p : 1; unsigned assignment_operator_p : 1; unsigned anticipated_p : 1; ! /* Two unused bits. */ union { /* In a FUNCTION_DECL, VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this --- 1746,1761 ---- unsigned deferred : 1; unsigned use_template : 2; unsigned nonconverting : 1; unsigned not_really_extern : 1; unsigned needs_final_overrider : 1; unsigned initialized_in_class : 1; unsigned pending_inline_p : 1; + unsigned global_ctor_p : 1; unsigned global_dtor_p : 1; unsigned assignment_operator_p : 1; unsigned anticipated_p : 1; ! /* Four unused bits. */ union { /* In a FUNCTION_DECL, VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this *************** struct lang_decl_flags *** 1855,1862 **** } u2; }; - struct unparsed_text; - struct lang_decl { struct lang_decl_flags decl_flags; --- 1783,1788 ---- *************** struct lang_decl *** 1870,1879 **** /* In a FUNCTION_DECL, this is DECL_CLONED_FUNCTION. */ tree cloned_function; - /* In a FUNCTION_DECL, these are function data which is to be kept - as long as FUNCTION_DECL is kept. */ - tree inlined_fns; - union { tree sorted_fields; --- 1796,1801 ---- *************** struct lang_decl *** 1888,1898 **** } u2; }; ! #define DEFARG_POINTER(NODE) (DEFAULT_ARG_CHECK(NODE)->identifier.pointer) ! ! /* Non-zero if NODE is a _DECL with TREE_READONLY set. */ ! #define TREE_READONLY_DECL_P(NODE) \ ! (TREE_READONLY (NODE) && DECL_P (NODE)) /* DECL_NEEDED_P holds of a declaration when we need to emit its definition. This is true when the back-end tells us that --- 1810,1816 ---- } u2; }; ! #define DEFARG_POINTER(NODE) (DEFAULT_ARG_CHECK (NODE)->identifier.id.str) /* DECL_NEEDED_P holds of a declaration when we need to emit its definition. This is true when the back-end tells us that *************** struct lang_decl *** 1901,1911 **** just been used somewhere, even if it's not really needed. We need anything that isn't comdat, but we don't know for sure whether or not something is comdat until end-of-file. */ ! #define DECL_NEEDED_P(DECL) \ ! ((at_eof && TREE_PUBLIC (DECL) && !DECL_COMDAT (DECL)) \ ! || (DECL_ASSEMBLER_NAME_SET_P (DECL) \ ! && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME ((DECL)))) \ ! || (flag_syntax_only && TREE_USED ((DECL)))) /* Non-zero iff DECL is memory-based. The DECL_RTL of certain const variables might be a CONST_INT, or a REG --- 1819,1829 ---- just been used somewhere, even if it's not really needed. We need anything that isn't comdat, but we don't know for sure whether or not something is comdat until end-of-file. */ ! #define DECL_NEEDED_P(DECL) \ ! ((at_eof && TREE_PUBLIC (DECL) && !DECL_COMDAT (DECL)) \ ! || (DECL_ASSEMBLER_NAME_SET_P (DECL) \ ! && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (DECL))) \ ! || (flag_syntax_only && TREE_USED (DECL))) /* Non-zero iff DECL is memory-based. The DECL_RTL of certain const variables might be a CONST_INT, or a REG *************** struct lang_decl *** 1926,1941 **** we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */ #define DECL_LANGUAGE(NODE) \ (DECL_LANG_SPECIFIC (NODE) \ ! ? DECL_LANG_SPECIFIC(NODE)->decl_flags.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)->decl_flags.language = LANGUAGE) /* For FUNCTION_DECLs: nonzero means that this function is a constructor. */ ! #define DECL_CONSTRUCTOR_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_attr) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete object. */ --- 1844,1860 ---- we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */ #define DECL_LANGUAGE(NODE) \ (DECL_LANG_SPECIFIC (NODE) \ ! ? DECL_LANG_SPECIFIC (NODE)->decl_flags.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)->decl_flags.language = (LANGUAGE)) /* For FUNCTION_DECLs: nonzero means that this function is a constructor. */ ! #define DECL_CONSTRUCTOR_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.constructor_attr) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete object. */ *************** struct lang_decl *** 1957,1963 **** /* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor. */ #define DECL_COPY_CONSTRUCTOR_P(NODE) \ ! (DECL_CONSTRUCTOR_P (NODE) && copy_args_p (NODE)) /* Nonzero if NODE is a destructor. */ #define DECL_DESTRUCTOR_P(NODE) \ --- 1876,1882 ---- /* 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 is a destructor. */ #define DECL_DESTRUCTOR_P(NODE) \ *************** struct lang_decl *** 2000,2009 **** #define DECL_CLONED_FUNCTION(NODE) \ (DECL_LANG_SPECIFIC (NODE)->cloned_function) - /* List of FUNCION_DECLs inlined into this function's body. */ - #define DECL_INLINED_FNS(NODE) \ - (DECL_LANG_SPECIFIC (NODE)->inlined_fns) - /* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS. */ #define DECL_DISCRIMINATOR_P(NODE) \ (TREE_CODE (NODE) == VAR_DECL \ --- 1919,1924 ---- *************** struct lang_decl *** 2040,2046 **** 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))) \ ? DECL_LANG_SPECIFIC (NODE)->u2.operator_code : ERROR_MARK) /* Non-zero if NODE is an assignment operator. */ --- 1955,1961 ---- 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)) \ ? DECL_LANG_SPECIFIC (NODE)->u2.operator_code : ERROR_MARK) /* Non-zero if NODE is an assignment operator. */ *************** struct lang_decl *** 2053,2069 **** #define DECL_HAS_IN_CHARGE_PARM_P(NODE) \ (DECL_LANG_SPECIFIC (NODE)->decl_flags.has_in_charge_parm_p) - /* Non-zero for a FUNCTION_DECL that declares a type-info function. - This only happens in the old abi. */ - #define DECL_TINFO_FN_P(NODE) \ - (TREE_CODE (NODE) == FUNCTION_DECL \ - && DECL_ARTIFICIAL (NODE) \ - && DECL_LANG_SPECIFIC(NODE)->decl_flags.tinfo_fn_p) - - /* Mark NODE as a type-info function. */ - #define SET_DECL_TINFO_FN_P(NODE) \ - (DECL_LANG_SPECIFIC((NODE))->decl_flags.tinfo_fn_p = 1) - /* Nonzero if NODE is an overloaded `operator delete[]' function. */ #define DECL_ARRAY_DELETE_OPERATOR_P(NODE) \ (DECL_OVERLOADED_OPERATOR_P (NODE) == VEC_DELETE_EXPR) --- 1968,1973 ---- *************** struct lang_decl *** 2073,2079 **** 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 if the DECL was initialized in the class definition itself, rather than outside the class. */ --- 1977,1983 ---- 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 if the DECL was initialized in the class definition itself, rather than outside the class. */ *************** struct lang_decl *** 2083,2097 **** /* Nonzero for FUNCTION_DECL means that this decl is just a friend declaration, and should not be added to the list of member functions for this class. */ ! #define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.friend_attr) /* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */ #define DECL_BEFRIENDING_CLASSES(NODE) \ ! (DECL_LANG_SPECIFIC(NODE)->befriending_classes) /* Nonzero for FUNCTION_DECL means that this decl is a static member function. */ ! #define DECL_STATIC_FUNCTION_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.static_function) /* Nonzero for FUNCTION_DECL means that this decl is a non-static member function. */ --- 1987,2002 ---- /* Nonzero for FUNCTION_DECL means that this decl is just a friend declaration, and should not be added to the list of member functions for this class. */ ! #define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.friend_attr) /* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */ #define DECL_BEFRIENDING_CLASSES(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->befriending_classes) /* Nonzero for FUNCTION_DECL means that this decl is a static member function. */ ! #define DECL_STATIC_FUNCTION_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.static_function) /* Nonzero for FUNCTION_DECL means that this decl is a non-static member function. */ *************** struct lang_decl *** 2129,2143 **** /* Nonzero for _DECL means that this constructor is a non-converting constructor. */ ! #define DECL_NONCONVERTING_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.nonconverting) /* Nonzero for FUNCTION_DECL means that this member function is a pure virtual function. */ ! #define DECL_PURE_VIRTUAL_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.pure_virtual) /* Nonzero for FUNCTION_DECL means that this member function must be overridden by derived classes. */ ! #define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.needs_final_overrider) /* Nonzero if NODE is a thunk, rather than an ordinary function. */ #define DECL_THUNK_P(NODE) \ --- 2034,2051 ---- /* Nonzero for _DECL means that this constructor is a non-converting constructor. */ ! #define DECL_NONCONVERTING_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.nonconverting) /* Nonzero for FUNCTION_DECL means that this member function is a pure virtual function. */ ! #define DECL_PURE_VIRTUAL_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.pure_virtual) /* Nonzero for FUNCTION_DECL means that this member function must be overridden by derived classes. */ ! #define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.needs_final_overrider) /* Nonzero if NODE is a thunk, rather than an ordinary function. */ #define DECL_THUNK_P(NODE) \ *************** struct lang_decl *** 2257,2281 **** /* If DECL_PENDING_INLINE_P holds, this is the saved text of the function. */ #define DECL_PENDING_INLINE_INFO(NODE) \ ! (DECL_LANG_SPECIFIC(NODE)->u.pending_inline_info) /* For a TYPE_DECL: if this function has many fields, we'll sort them and put them into a TREE_VEC. */ #define DECL_SORTED_FIELDS(NODE) \ ! (DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE))->u.sorted_fields) /* True if on the deferred_fns (see decl2.c) list. */ #define DECL_DEFERRED_FN(DECL) \ ! (DECL_LANG_SPECIFIC(DECL)->decl_flags.deferred) /* For a VAR_DECL, FUNCTION_DECL, TYPE_DECL or TEMPLATE_DECL: template-specific information. */ #define DECL_TEMPLATE_INFO(NODE) \ ! (DECL_LANG_SPECIFIC(VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE))->decl_flags.u.template_info) /* Template information for a RECORD_TYPE or UNION_TYPE. */ #define CLASSTYPE_TEMPLATE_INFO(NODE) \ ! (TYPE_LANG_SPECIFIC(RECORD_OR_UNION_TYPE_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 --- 2165,2190 ---- /* If DECL_PENDING_INLINE_P holds, this is the saved text of the function. */ #define DECL_PENDING_INLINE_INFO(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->u.pending_inline_info) /* For a TYPE_DECL: if this function has many fields, we'll sort them and put them into a TREE_VEC. */ #define DECL_SORTED_FIELDS(NODE) \ ! (DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE))->u.sorted_fields) /* True if on the deferred_fns (see decl2.c) list. */ #define DECL_DEFERRED_FN(DECL) \ ! (DECL_LANG_SPECIFIC (DECL)->decl_flags.deferred) /* For a VAR_DECL, FUNCTION_DECL, TYPE_DECL or TEMPLATE_DECL: template-specific information. */ #define DECL_TEMPLATE_INFO(NODE) \ ! (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \ ! ->decl_flags.u.template_info) /* Template information for a RECORD_TYPE or UNION_TYPE. */ #define CLASSTYPE_TEMPLATE_INFO(NODE) \ ! (TYPE_LANG_SPECIFIC (RECORD_OR_UNION_TYPE_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 *************** struct lang_decl *** 2283,2290 **** non-type template parameters. */ #define ENUM_TEMPLATE_INFO(NODE) (TYPE_BINFO (ENUMERAL_TYPE_CHECK (NODE))) ! /* Template information for a bound template template parameter. */ ! #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) (TYPE_BINFO (NODE)) /* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */ #define TYPE_TEMPLATE_INFO(NODE) \ --- 2192,2201 ---- non-type template parameters. */ #define ENUM_TEMPLATE_INFO(NODE) (TYPE_BINFO (ENUMERAL_TYPE_CHECK (NODE))) ! /* Template information for a template template parameter. */ ! #define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \ ! (TYPE_LANG_SPECIFIC (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE)) \ ! ->template_info) /* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */ #define TYPE_TEMPLATE_INFO(NODE) \ *************** struct lang_decl *** 2300,2307 **** 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_PURPOSE (NODE)) #define TI_ARGS(NODE) (TREE_VALUE (NODE)) --- 2211,2218 ---- 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_PURPOSE (NODE)) #define TI_ARGS(NODE) (TREE_VALUE (NODE)) *************** struct lang_decl *** 2322,2328 **** /* Non-zero if the template arguments is actually a vector of vectors, rather than just a vector. */ #define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \ ! (NODE != NULL_TREE \ && TREE_CODE (NODE) == TREE_VEC \ && TREE_VEC_LENGTH (NODE) > 0 \ && TREE_VEC_ELT (NODE, 0) != NULL_TREE \ --- 2233,2239 ---- /* Non-zero if the template arguments is actually a vector of vectors, rather than just a vector. */ #define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \ ! ((NODE) != NULL_TREE \ && TREE_CODE (NODE) == TREE_VEC \ && TREE_VEC_LENGTH (NODE) > 0 \ && TREE_VEC_ELT (NODE, 0) != NULL_TREE \ *************** struct lang_decl *** 2340,2351 **** 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) \ --- 2251,2262 ---- 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) \ *************** struct lang_decl *** 2369,2375 **** /* The number of levels of template parameters given by NODE. */ #define TMPL_PARMS_DEPTH(NODE) \ ! (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 --- 2280,2286 ---- /* 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 *************** struct lang_decl *** 2413,2419 **** #define TYPE_TI_ARGS(NODE) \ (TI_ARGS (TYPE_TEMPLATE_INFO (NODE))) ! #define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE(NODE) /* Nonzero if the NODE corresponds to the template parameters for a member template, whose inline definition is being processed after --- 2324,2330 ---- #define TYPE_TI_ARGS(NODE) \ (TI_ARGS (TYPE_TEMPLATE_INFO (NODE))) ! #define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE (NODE) /* Nonzero if the NODE corresponds to the template parameters for a member template, whose inline definition is being processed after *************** struct lang_decl *** 2447,2453 **** 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) TYPE_BINFO (NODE) /* Nonzero if NODE is an implicit typename. */ #define IMPLICIT_TYPENAME_P(NODE) \ --- 2358,2364 ---- 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) (TYPE_FIELDS (NODE)) /* Nonzero if NODE is an implicit typename. */ #define IMPLICIT_TYPENAME_P(NODE) \ *************** struct lang_decl *** 2478,2485 **** /* Nonzero if this class has a virtual function table pointer. */ #define TYPE_CONTAINS_VPTR_P(NODE) \ (TYPE_POLYMORPHIC_P (NODE) \ ! || (vbase_offsets_in_vtable_p () \ ! && TYPE_USES_VIRTUAL_BASECLASSES (NODE))) extern int flag_new_for_scope; --- 2389,2395 ---- /* Nonzero if this class has a virtual function table pointer. */ #define TYPE_CONTAINS_VPTR_P(NODE) \ (TYPE_POLYMORPHIC_P (NODE) \ ! || TYPE_USES_VIRTUAL_BASECLASSES (NODE)) extern int flag_new_for_scope; *************** extern int flag_new_for_scope; *** 2502,2508 **** (DECL_LANG_SPECIFIC (DECL_CHECK (NODE))->decl_flags.anticipated_p) /* Record whether a typedef for type `int' was actually `signed int'. */ ! #define C_TYPEDEF_EXPLICITLY_SIGNED(exp) DECL_LANG_FLAG_1 ((exp)) /* Returns non-zero if DECL has external linkage, as specified by the language standard. (This predicate may hold even when the --- 2412,2418 ---- (DECL_LANG_SPECIFIC (DECL_CHECK (NODE))->decl_flags.anticipated_p) /* Record whether a typedef for type `int' was actually `signed int'. */ ! #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) /* Returns non-zero if DECL has external linkage, as specified by the language standard. (This predicate may hold even when the *************** extern int flag_new_for_scope; *** 2512,2518 **** (decl_linkage (DECL) == lk_external) #define INTEGRAL_CODE_P(CODE) \ ! (CODE == INTEGER_TYPE || CODE == ENUMERAL_TYPE || CODE == BOOLEAN_TYPE) /* [basic.fundamental] --- 2422,2428 ---- (decl_linkage (DECL) == lk_external) #define INTEGRAL_CODE_P(CODE) \ ! ((CODE) == INTEGER_TYPE || (CODE) == ENUMERAL_TYPE || (CODE) == BOOLEAN_TYPE) /* [basic.fundamental] *************** extern int flag_new_for_scope; *** 2522,2529 **** Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration types as well, which is incorrect in C++. */ #define CP_INTEGRAL_TYPE_P(TYPE) \ ! (TREE_CODE ((TYPE)) == BOOLEAN_TYPE \ ! || TREE_CODE ((TYPE)) == INTEGER_TYPE) /* [basic.fundamental] --- 2432,2439 ---- Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration types as well, which is incorrect in C++. */ #define CP_INTEGRAL_TYPE_P(TYPE) \ ! (TREE_CODE (TYPE) == BOOLEAN_TYPE \ ! || TREE_CODE (TYPE) == INTEGER_TYPE) /* [basic.fundamental] *************** extern int flag_new_for_scope; *** 2534,2540 **** /* Nonzero for _TYPE means that the _TYPE defines at least one constructor. */ ! #define TYPE_HAS_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 --- 2444,2450 ---- /* Nonzero for _TYPE means that the _TYPE defines at least one constructor. */ ! #define TYPE_HAS_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 *************** extern int flag_new_for_scope; *** 2550,2563 **** 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)) #define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \ && ! TREE_HAS_CONSTRUCTOR (NODE)) /* Nonzero for _TYPE means that the _TYPE defines a destructor. */ ! #define TYPE_HAS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_2(NODE)) /* Nonzero means that an object of this type can not be initialized using an initializer list. */ --- 2460,2473 ---- 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)) #define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \ && ! TREE_HAS_CONSTRUCTOR (NODE)) /* Nonzero for _TYPE means that the _TYPE defines a destructor. */ ! #define TYPE_HAS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_2 (NODE)) /* Nonzero means that an object of this type can not be initialized using an initializer list. */ *************** extern int flag_new_for_scope; *** 2567,2576 **** (IS_AGGR_TYPE (NODE) && CLASSTYPE_NON_AGGREGATE (NODE)) /* Nonzero if there is a user-defined X::op=(x&) for this class. */ ! #define TYPE_HAS_REAL_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_real_assign_ref) ! #define TYPE_HAS_COMPLEX_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_complex_assign_ref) ! #define TYPE_HAS_ABSTRACT_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_abstract_assign_ref) ! #define TYPE_HAS_COMPLEX_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_complex_init_ref) /* Nonzero if TYPE has a trivial destructor. From [class.dtor]: --- 2477,2486 ---- (IS_AGGR_TYPE (NODE) && CLASSTYPE_NON_AGGREGATE (NODE)) /* Nonzero if there is a user-defined X::op=(x&) for this class. */ ! #define TYPE_HAS_REAL_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_real_assign_ref) ! #define TYPE_HAS_COMPLEX_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_complex_assign_ref) ! #define TYPE_HAS_ABSTRACT_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_abstract_assign_ref) ! #define TYPE_HAS_COMPLEX_INIT_REF(NODE) (TYPE_LANG_SPECIFIC (NODE)->has_complex_init_ref) /* Nonzero if TYPE has a trivial destructor. From [class.dtor]: *************** extern int flag_new_for_scope; *** 2591,2597 **** 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 copy initialization of this type can use a bitwise copy. */ --- 2501,2507 ---- 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 copy initialization of this type can use a bitwise copy. */ *************** extern int flag_new_for_scope; *** 2617,2632 **** #define TYPE_PTRFN_P(NODE) \ (TREE_CODE (NODE) == POINTER_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) \ ! (TYPE_LANG_SPECIFIC(NODE)->ptrmemfunc_flag) /* Indicates when overload resolution may resolve to a pointer to member function. [expr.unary.op]/3 */ --- 2527,2545 ---- #define TYPE_PTRFN_P(NODE) \ (TREE_CODE (NODE) == POINTER_TYPE \ && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) + #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) \ ! (TYPE_LANG_SPECIFIC (NODE)->ptrmemfunc_flag) /* Indicates when overload resolution may resolve to a pointer to member function. [expr.unary.op]/3 */ *************** extern int flag_new_for_scope; *** 2634,2700 **** /* A pointer-to-function member type looks like: - struct { - short __delta; - short __index; - union { - P __pfn; - short __delta2; - } __pfn_or_delta2; - }; - - where P is a POINTER_TYPE to a METHOD_TYPE appropriate for the - pointer to member. The fields are used as follows: - - If __INDEX is -1, then the function to call is non-virtual, and - is located at the address given by __PFN. - - If __INDEX is zero, then this a NULL pointer-to-member. - - Otherwise, the function to call is virtual. Then, __DELTA2 gives - the offset from an instance of the object to the virtual function - table, and __INDEX - 1 is the index into the vtable to use to - find the function. - - The value to use for the THIS parameter is the address of the - object plus __DELTA. - - For example, given: - - struct B1 { - int i; - }; - - struct B2 { - double d; - void f(); - }; - - struct S : public B1, B2 {}; - - the pointer-to-member for `&S::f' looks like: - - { 4, -1, { &f__2B2 } }; - - The `4' means that given an `S*' you have to add 4 bytes to get to - the address of the `B2*'. Then, the -1 indicates that this is a - non-virtual function. Of course, `&f__2B2' is the name of that - function. - - (Of course, the exact values may differ depending on the mangling - scheme, sizes of types, and such.). - - Under the new ABI, we do: - struct { __P __pfn; ptrdiff_t __delta; }; ! (We don't need DELTA2, because the vtable is always the first thing ! in the object.) If the function is virtual, then PFN is one plus ! twice the index into the vtable; otherwise, it is just a pointer to ! the function. Unfortunately, using the lowest bit of PFN doesn't work in architectures that don't impose alignment requirements on function --- 2547,2563 ---- /* A pointer-to-function member type looks like: struct { __P __pfn; ptrdiff_t __delta; }; ! If __pfn is NULL, it is a NULL pointer-to-member-function. ! ! (Because the vtable is always the first thing in the object, we ! don't need its offset.) If the function is virtual, then PFN is ! one plus twice the index into the vtable; otherwise, it is just a ! pointer to the function. Unfortunately, using the lowest bit of PFN doesn't work in architectures that don't impose alignment requirements on function *************** enum ptrmemfunc_vbit_where_t *** 2720,2727 **** /* 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) ((tree)TYPE_LANG_SPECIFIC(NODE)) ! #define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) (TYPE_LANG_SPECIFIC(NODE) = ((struct lang_type *)(void*)(VALUE))) /* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */ #define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE)) --- 2583,2592 ---- /* 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) \ ! ((tree)TYPE_LANG_SPECIFIC (NODE)) ! #define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) \ ! (TYPE_LANG_SPECIFIC (NODE) = ((struct lang_type *)(void*)(VALUE))) /* Returns the pfn field from a TYPE_PTRMEMFUNC_P. */ #define PFN_FROM_PTRMEMFUNC(NODE) pfn_from_ptrmemfunc ((NODE)) *************** enum ptrmemfunc_vbit_where_t *** 2731,2745 **** 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 (TREE_TYPE ((NODE))) \ ! : TYPE_PTRMEMFUNC_OBJECT_TYPE ((NODE))) /* For a pointer-to-member type of the form `T X::*', this is `T'. */ #define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \ ! (TYPE_PTRMEM_P ((NODE)) \ ? TREE_TYPE (TREE_TYPE (NODE)) \ ! : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE ((NODE)))) /* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for `X'. */ --- 2596,2610 ---- 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 (TREE_TYPE (NODE)) \ ! : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE)) /* For a pointer-to-member type of the form `T X::*', this is `T'. */ #define TYPE_PTRMEM_POINTED_TO_TYPE(NODE) \ ! (TYPE_PTRMEM_P (NODE) \ ? TREE_TYPE (TREE_TYPE (NODE)) \ ! : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) /* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for `X'. */ *************** enum ptrmemfunc_vbit_where_t *** 2803,2824 **** 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) (DECL_LANG_SPECIFIC(NODE)->decl_flags.u2.access) /* Nonzero if the FUNCTION_DECL is a global constructor. */ #define DECL_GLOBAL_CTOR_P(NODE) \ ! (DECL_LANG_SPECIFIC ((NODE))->decl_flags.global_ctor_p) /* Nonzero if the FUNCTION_DECL is a global destructor. */ #define DECL_GLOBAL_DTOR_P(NODE) \ ! (DECL_LANG_SPECIFIC ((NODE))->decl_flags.global_dtor_p) /* If DECL_GLOBAL_CTOR_P or DECL_GLOBAL_DTOR_P holds, this macro returns the initialization priority for the function. Constructors with lower numbers should be run first. Destructors should be run in the reverse order of constructors. */ #define GLOBAL_INIT_PRIORITY(NODE) \ ! (DECL_LANG_SPECIFIC ((NODE))->decl_flags.u2.init_priority) /* Accessor macros for C++ template decl nodes. */ --- 2668,2689 ---- 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) (DECL_LANG_SPECIFIC (NODE)->decl_flags.u2.access) /* Nonzero if the FUNCTION_DECL is a global constructor. */ #define DECL_GLOBAL_CTOR_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.global_ctor_p) /* Nonzero if the FUNCTION_DECL is a global destructor. */ #define DECL_GLOBAL_DTOR_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.global_dtor_p) /* If DECL_GLOBAL_CTOR_P or DECL_GLOBAL_DTOR_P holds, this macro returns the initialization priority for the function. Constructors with lower numbers should be run first. Destructors should be run in the reverse order of constructors. */ #define GLOBAL_INIT_PRIORITY(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.u2.init_priority) /* Accessor macros for C++ template decl nodes. */ *************** enum ptrmemfunc_vbit_where_t *** 2833,2845 **** TEMPLATE_PARM_INDEX for the parameter is avilable as the DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a TYPE_DECL). */ ! #define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS(NODE) #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 static member variable template, the DECL_TEMPLATE_INSTANTIATIONS list contains the explicitly and implicitly generated instantiations of the variable. There are no --- 2698,2710 ---- TEMPLATE_PARM_INDEX for the parameter is avilable as the DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a TYPE_DECL). */ ! #define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS (NODE) #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 static member variable template, the DECL_TEMPLATE_INSTANTIATIONS list contains the explicitly and implicitly generated instantiations of the variable. There are no *************** enum ptrmemfunc_vbit_where_t *** 2865,2871 **** struct S1::S2'. This list is not used for function templates. */ ! #define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX(NODE) /* For a function template, the DECL_TEMPLATE_SPECIALIZATIONS lists contains all instantiations and specializations of the function, including partial instantiations. For a partial instantiation --- 2730,2736 ---- struct S1::S2'. This list is not used for function templates. */ ! #define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX (NODE) /* For a function template, the DECL_TEMPLATE_SPECIALIZATIONS lists contains all instantiations and specializations of the function, including partial instantiations. For a partial instantiation *************** enum ptrmemfunc_vbit_where_t *** 2896,2907 **** for the partial specialization. This list is not used for static variable templates. */ ! #define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE(NODE) /* Nonzero for a DECL which is actually a template parameter. */ #define DECL_TEMPLATE_PARM_P(NODE) \ (DECL_LANG_FLAG_0 (NODE) \ && (TREE_CODE (NODE) == CONST_DECL \ || TREE_CODE (NODE) == TYPE_DECL \ || TREE_CODE (NODE) == TEMPLATE_DECL)) --- 2761,2773 ---- for the partial specialization. This list is not used for static variable templates. */ ! #define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE (NODE) /* Nonzero for a DECL which is actually a template parameter. */ #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)) *************** enum ptrmemfunc_vbit_where_t *** 2935,2943 **** itself, so that you can say `S::S'. This macro does *not* hold for those typedefs. */ #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) /* A `primary' template is one that has its own template header. A member function of a class template is a template, but not primary. --- 2801,2809 ---- itself, so that you can say `S::S'. This macro does *not* hold for those typedefs. */ #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) /* A `primary' template is one that has its own template header. A member function of a class template is a template, but not primary. *************** enum ptrmemfunc_vbit_where_t *** 2948,2954 **** (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE))) /* Returns non-zero if NODE is a primary template. */ ! #define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == NODE) #define CLASSTYPE_TEMPLATE_LEVEL(NODE) \ (TREE_INT_CST_LOW (TREE_PURPOSE (CLASSTYPE_TI_TEMPLATE (NODE)))) --- 2814,2820 ---- (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE))) /* Returns non-zero if NODE is a primary template. */ ! #define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE)) #define CLASSTYPE_TEMPLATE_LEVEL(NODE) \ (TREE_INT_CST_LOW (TREE_PURPOSE (CLASSTYPE_TI_TEMPLATE (NODE)))) *************** enum ptrmemfunc_vbit_where_t *** 2959,2965 **** 1=implicit template instantiation 2=explicit template specialization, e.g. int min (int, int); 3=explicit template instantiation, e.g. template int min (int, int); */ ! #define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.use_template) #define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1) #define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \ --- 2825,2831 ---- 1=implicit template instantiation 2=explicit template specialization, e.g. int min (int, int); 3=explicit template instantiation, e.g. template int min (int, int); */ ! #define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.use_template) #define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1) #define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \ *************** enum ptrmemfunc_vbit_where_t *** 2975,2990 **** #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) /* Non-zero if DECL is a friend function which is an instantiation from the point of view of the compiler, but not from the point of --- 2841,2856 ---- #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) /* Non-zero if DECL is a friend function which is an instantiation from the point of view of the compiler, but not from the point of *************** enum ptrmemfunc_vbit_where_t *** 3024,3030 **** semantics of 'inline'; whether or not the function is inlined is controlled by DECL_INLINE. */ #define DECL_DECLARED_INLINE_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.declared_inline) /* DECL_EXTERNAL must be set on a decl until the decl is actually emitted, so that assemble_external will work properly. So we have this flag to --- 2890,2896 ---- semantics of 'inline'; whether or not the function is inlined is controlled by DECL_INLINE. */ #define DECL_DECLARED_INLINE_P(NODE) \ ! (DECL_LANG_SPECIFIC (NODE)->decl_flags.base.declared_inline) /* DECL_EXTERNAL must be set on a decl until the decl is actually emitted, so that assemble_external will work properly. So we have this flag to *************** enum ptrmemfunc_vbit_where_t *** 3072,3088 **** #define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0) #define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1) - #define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0) - #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) /* 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 SUBOBJECT_CLEANUP(NODE) TREE_OPERAND (SUBOBJECT_CHECK (NODE), 0) - #define START_CATCH_TYPE(NODE) TREE_TYPE (START_CATCH_STMT_CHECK (NODE)) /* Nonzero if this CTOR_STMT is for the beginning of a constructor. */ #define CTOR_BEGIN_P(NODE) \ --- 2938,2954 ---- #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)) #define SUBOBJECT_CLEANUP(NODE) TREE_OPERAND (SUBOBJECT_CHECK (NODE), 0) /* Nonzero if this CTOR_STMT is for the beginning of a constructor. */ #define CTOR_BEGIN_P(NODE) \ *************** enum ptrmemfunc_vbit_where_t *** 3094,3108 **** /* The parameters for a call-declarator. */ #define CALL_DECLARATOR_PARMS(NODE) \ ! (TREE_PURPOSE (TREE_OPERAND ((NODE), 1))) /* The cv-qualifiers for a call-declarator. */ #define CALL_DECLARATOR_QUALS(NODE) \ ! (TREE_VALUE (TREE_OPERAND ((NODE), 1))) /* The exception-specification for a call-declarator. */ #define CALL_DECLARATOR_EXCEPTION_SPEC(NODE) \ ! (TREE_TYPE ((NODE))) /* An enumeration of the kind of tags that C++ accepts. */ enum tag_types { record_type, class_type, union_type, enum_type }; --- 2960,2974 ---- /* The parameters for a call-declarator. */ #define CALL_DECLARATOR_PARMS(NODE) \ ! (TREE_PURPOSE (TREE_OPERAND (NODE, 1))) /* The cv-qualifiers for a call-declarator. */ #define CALL_DECLARATOR_QUALS(NODE) \ ! (TREE_VALUE (TREE_OPERAND (NODE, 1))) /* The exception-specification for a call-declarator. */ #define CALL_DECLARATOR_EXCEPTION_SPEC(NODE) \ ! (TREE_TYPE (NODE)) /* An enumeration of the kind of tags that C++ accepts. */ enum tag_types { record_type, class_type, union_type, enum_type }; *************** typedef enum linkage_kind { *** 3193,3205 **** lk_external /* External linkage. */ } linkage_kind; ! /* Bitmask flags to pass to instantiate_type. */ ! typedef enum instantiate_type_flags { ! itf_none = 0, /* nothing special */ ! itf_complain = 1 << 0, /* complain about errors */ ! itf_no_attributes = 1 << 1, /* ignore attributes on comparisons */ ! itf_ptrmem_ok = 1 << 2, /* pointers to member ok (internal use) */ ! } instantiate_type_flags; /* Nonzero means allow Microsoft extensions without a pedwarn. */ extern int flag_ms_extensions; --- 3059,3101 ---- lk_external /* External linkage. */ } linkage_kind; ! /* Bitmask flags to control type substitution. */ ! typedef enum tsubst_flags_t { ! tf_none = 0, /* nothing special */ ! tf_error = 1 << 0, /* give error messages */ ! tf_warning = 1 << 1, /* give warnings too */ ! tf_no_attributes = 1 << 2, /* ignore attributes on comparisons ! (instantiate_type use) */ ! tf_ignore_bad_quals = 1 << 3, /* ignore bad cvr qualifiers */ ! tf_keep_type_decl = 1 << 4, /* retain typedef type decls ! (make_typename_type use) */ ! tf_ptrmem_ok = 1 << 5 /* pointers to member ok (internal ! instantiate_type use) */ ! } tsubst_flags_t; ! ! /* The kind of checking we can do looking in a class hierarchy. */ ! typedef enum base_access { ! ba_any = 0, /* Do not check access, allow an ambiguous base, ! prefer a non-virtual base */ ! ba_ignore = 1, /* Do not check access */ ! ba_check = 2, /* Check access */ ! ba_not_special = 3, /* Do not consider special privilege ! current_class_type might give. */ ! ba_quiet = 4, /* Do not issue error messages (bit mask). */ ! } base_access; ! ! /* The kind of base we can find, looking in a class hierarchy. ! Values <0 indicate we failed. */ ! typedef enum base_kind { ! 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; /* Nonzero means allow Microsoft extensions without a pedwarn. */ extern int flag_ms_extensions; *************** extern int warn_overloaded_virtual; *** 3212,3217 **** --- 3108,3118 ---- /* Nonzero means warn about use of multicharacter literals. */ extern int warn_multichar; + /* Set by add_implicitly_declared_members() to keep those members from + being flagged as deprecated or reported as using deprecated + types. */ + extern int adding_implicit_members; + /* Non-zero means warn if a non-templatized friend function is declared in a templatized class. This behavior is warned about with flag_guiding_decls in do_friend. */ *************** extern int warn_nontemplate_friend; *** 3221,3233 **** /* A node that is a list (length 1) of error_mark_nodes. */ extern tree error_mark_list; - /* A list of virtual function tables we must make sure to write out. */ - extern tree pending_vtables; - /* Node for "pointer to (virtual) function". This may be distinct from ptr_type_node so gdb can distinguish them. */ ! #define vfunc_ptr_type_node \ ! (flag_vtable_thunks ? vtable_entry_type : ptr_type_node) /* For building calls to `delete'. */ --- 3122,3130 ---- /* A node that is a list (length 1) of error_mark_nodes. */ extern tree error_mark_list; /* 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'. */ *************** typedef enum unification_kind_t { *** 3253,3259 **** DEDUCE_ORDER } unification_kind_t; ! /* Macros for operating on a template instantation level node, represented by an EXPR_WITH_FILE_LOCATION. */ #define TINST_DECL(NODE) EXPR_WFL_NODE (NODE) --- 3150,3156 ---- DEDUCE_ORDER } unification_kind_t; ! /* Macros for operating on a template instantiation level node, represented by an EXPR_WITH_FILE_LOCATION. */ #define TINST_DECL(NODE) EXPR_WFL_NODE (NODE) *************** extern varray_type local_classes; *** 3290,3306 **** #define VPTR_NAME "$v" #define THROW_NAME "$eh_throw" - #define DESTRUCTOR_DECL_PREFIX "_$_" #define AUTO_VTABLE_NAME "__vtbl$me__" #define AUTO_TEMP_NAME "_$tmp_" #define AUTO_TEMP_FORMAT "_$tmp_%d" #define VTABLE_BASE "$vb" ! #define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt$") #define VFIELD_BASE "$vf" #define VFIELD_NAME "_vptr$" #define VFIELD_NAME_FORMAT "_vptr$%s" - #define VBASE_NAME "_vb$" - #define VBASE_NAME_FORMAT "_vb$%s" #define STATIC_NAME_FORMAT "_%s$%s" #define ANON_AGGRNAME_FORMAT "$_%d" --- 3187,3200 ---- #define VPTR_NAME "$v" #define THROW_NAME "$eh_throw" #define AUTO_VTABLE_NAME "__vtbl$me__" #define AUTO_TEMP_NAME "_$tmp_" #define AUTO_TEMP_FORMAT "_$tmp_%d" #define VTABLE_BASE "$vb" ! #define VTABLE_NAME_PREFIX "__vt_" #define VFIELD_BASE "$vf" #define VFIELD_NAME "_vptr$" #define VFIELD_NAME_FORMAT "_vptr$%s" #define STATIC_NAME_FORMAT "_%s$%s" #define ANON_AGGRNAME_FORMAT "$_%d" *************** extern varray_type local_classes; *** 3312,3328 **** #define VPTR_NAME ".v" #define THROW_NAME ".eh_throw" - #define DESTRUCTOR_DECL_PREFIX "_._" #define AUTO_VTABLE_NAME "__vtbl.me__" #define AUTO_TEMP_NAME "_.tmp_" #define AUTO_TEMP_FORMAT "_.tmp_%d" #define VTABLE_BASE ".vb" ! #define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt.") #define VFIELD_BASE ".vf" #define VFIELD_NAME "_vptr." #define VFIELD_NAME_FORMAT "_vptr.%s" - #define VBASE_NAME "_vb." - #define VBASE_NAME_FORMAT "_vb.%s" #define STATIC_NAME_FORMAT "_%s.%s" #define ANON_AGGRNAME_FORMAT "._%d" --- 3206,3219 ---- #define VPTR_NAME ".v" #define THROW_NAME ".eh_throw" #define AUTO_VTABLE_NAME "__vtbl.me__" #define AUTO_TEMP_NAME "_.tmp_" #define AUTO_TEMP_FORMAT "_.tmp_%d" #define VTABLE_BASE ".vb" ! #define VTABLE_NAME_PREFIX "__vt_" #define VFIELD_BASE ".vf" #define VFIELD_NAME "_vptr." #define VFIELD_NAME_FORMAT "_vptr.%s" #define STATIC_NAME_FORMAT "_%s.%s" #define ANON_AGGRNAME_FORMAT "._%d" *************** extern varray_type local_classes; *** 3333,3342 **** #define VPTR_NAME_P(ID_NODE) \ (!strncmp (IDENTIFIER_POINTER (ID_NODE), VPTR_NAME, sizeof (VPTR_NAME) - 1)) #define THROW_NAME "__eh_throw" - #define DESTRUCTOR_DECL_PREFIX "__destr_" - #define DESTRUCTOR_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), DESTRUCTOR_DECL_PREFIX, \ - sizeof (DESTRUCTOR_DECL_PREFIX) - 1)) #define IN_CHARGE_NAME "__in_chrg" #define AUTO_VTABLE_NAME "__vtbl_me__" #define AUTO_TEMP_NAME "__tmp_" --- 3224,3229 ---- *************** extern varray_type local_classes; *** 3346,3352 **** #define AUTO_TEMP_FORMAT "__tmp_%d" #define VTABLE_BASE "__vtb" #define VTABLE_NAME "__vt_" ! #define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt_") #define VTABLE_NAME_P(ID_NODE) \ (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \ sizeof (VTABLE_NAME) - 1)) --- 3233,3239 ---- #define AUTO_TEMP_FORMAT "__tmp_%d" #define VTABLE_BASE "__vtb" #define VTABLE_NAME "__vt_" ! #define VTABLE_NAME_PREFIX "__vt_" #define VTABLE_NAME_P(ID_NODE) \ (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \ sizeof (VTABLE_NAME) - 1)) *************** extern varray_type local_classes; *** 3355,3366 **** #define VFIELD_NAME_P(ID_NODE) \ (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ sizeof (VFIELD_NAME) - 1)) ! #define VFIELD_NAME_FORMAT "_vptr_%s" ! #define VBASE_NAME "__vb_" ! #define VBASE_NAME_P(ID_NODE) \ ! (!strncmp (IDENTIFIER_POINTER (ID_NODE), VBASE_NAME, \ ! sizeof (VBASE_NAME) - 1)) ! #define VBASE_NAME_FORMAT "__vb_%s" #define STATIC_NAME_FORMAT "__static_%s_%s" #define ANON_AGGRNAME_PREFIX "__anon_" --- 3242,3248 ---- #define VFIELD_NAME_P(ID_NODE) \ (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ sizeof (VFIELD_NAME) - 1)) ! #define VFIELD_NAME_FORMAT "__vptr_%s" #define STATIC_NAME_FORMAT "__static_%s_%s" #define ANON_AGGRNAME_PREFIX "__anon_" *************** extern varray_type local_classes; *** 3368,3383 **** (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \ sizeof (ANON_AGGRNAME_PREFIX) - 1)) #define ANON_AGGRNAME_FORMAT "__anon_%d" - #define ANON_PARMNAME_FORMAT "__%d" - #define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[1] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[2] <= '9') #endif /* NO_DOT_IN_LABEL */ #endif /* NO_DOLLAR_IN_LABEL */ #define THIS_NAME "this" - #define DESTRUCTOR_NAME_FORMAT "~%s" #define FILE_FUNCTION_PREFIX_LEN 9 #define CTOR_NAME "__ct" #define DTOR_NAME "__dt" --- 3250,3260 ---- *************** extern varray_type local_classes; *** 3386,3444 **** #define VTBL_PTR_TYPE "__vtbl_ptr_type" #define VTABLE_DELTA_NAME "__delta" - #define VTABLE_INDEX_NAME "__index" #define VTABLE_PFN_NAME "__pfn" - #define VTABLE_DELTA2_NAME "__delta2" #define EXCEPTION_CLEANUP_NAME "exception cleanup" - /* The name used as a prefix for VTTs. When the new ABI mangling - scheme is implemented, this should be removed. */ - - #define VTT_NAME_PREFIX "__vtt_" - - /* The name used as a prefix for construction vtables. */ - - #define CTOR_VTBL_NAME_PREFIX "__ctorvt_" - - #define THIS_NAME_P(ID_NODE) (strcmp(IDENTIFIER_POINTER (ID_NODE), "this") == 0) - #if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) #define VPTR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \ && IDENTIFIER_POINTER (ID_NODE)[1] == 'v') - #define DESTRUCTOR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == JOINER \ - && IDENTIFIER_POINTER (ID_NODE)[2] == '_') #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 VBASE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ ! && IDENTIFIER_POINTER (ID_NODE)[2] == 'b' \ ! && 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] == '_') - #define ANON_PARMNAME_FORMAT "_%d" - #define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[1] <= '9') #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */ - /* Store the vbase pointer field name for type TYPE into pointer BUF. */ - #define FORMAT_VBASE_NAME(BUF,TYPE) do { \ - char *wbuf = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (TYPE) \ - + sizeof (VBASE_NAME) + 1); \ - sprintf (wbuf, VBASE_NAME_FORMAT, TYPE_ASSEMBLER_NAME_STRING (TYPE)); \ - (BUF) = wbuf; \ - } while (0) - /* Returns non-zero iff NODE is a declaration for the global function `main'. */ #define DECL_MAIN_P(NODE) \ --- 3263,3293 ---- #define VTBL_PTR_TYPE "__vtbl_ptr_type" #define VTABLE_DELTA_NAME "__delta" #define VTABLE_PFN_NAME "__pfn" #define EXCEPTION_CLEANUP_NAME "exception cleanup" #if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) #define VPTR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \ && IDENTIFIER_POINTER (ID_NODE)[1] == 'v') #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) */ /* Returns non-zero iff NODE is a declaration for the global function `main'. */ #define DECL_MAIN_P(NODE) \ *************** extern int flag_implicit_templates; *** 3472,3484 **** extern int flag_weak; - /* 0 if we should not perform inlining. - 1 if we should expand functions calls inline at the tree level. - 2 if we should consider *all* functions to be inline - candidates. */ - - extern int flag_inline_trees; - /* Nonzero if we're done parsing and into end-of-file activities. */ extern int at_eof; --- 3321,3326 ---- *************** extern tree static_dtors; *** 3491,3499 **** enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; /* Some macros for char-based bitfields. */ ! #define B_SET(a,x) (a[x>>3] |= (1 << (x&7))) ! #define B_CLR(a,x) (a[x>>3] &= ~(1 << (x&7))) ! #define B_TST(a,x) (a[x>>3] & (1 << (x&7))) /* These are uses as bits in flags passed to build_method_call to control its error reporting behavior. --- 3333,3341 ---- enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; /* Some macros for char-based bitfields. */ ! #define B_SET(A,X) ((A)[(X)>>3] |= (1 << ((X)&7))) ! #define B_CLR(A,X) ((A)[(X)>>3] &= ~(1 << ((X)&7))) ! #define B_TST(A,X) ((A)[(X)>>3] & (1 << ((X)&7))) /* These are uses as bits in flags passed to build_method_call to control its error reporting behavior. *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3545,3555 **** #define LOOKUP_PREFER_BOTH (6144) #define LOOKUP_TEMPLATES_EXPECTED (8192) ! #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. --- 3387,3397 ---- #define LOOKUP_PREFER_BOTH (6144) #define LOOKUP_TEMPLATES_EXPECTED (8192) ! #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. *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3623,3630 **** /* 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) \ --- 3465,3472 ---- /* 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) \ *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3650,3660 **** /* These constants can used as bit flags in the process of tree formatting. TFF_PLAIN_IDENTIFIER: unqualified part of a name. ! TFF_NAMESPACE_SCOPE: the complete qualified-id form of a name. ! TFF_CLASS_SCOPE: if possible, include the class-name part of a ! qualified-id. This flag may be implied in some circumstances by ! TFF_NAMESPACE_SCOPE. ! TFF_SCOPE: the combinaison of the two above. 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 --- 3492,3498 ---- /* 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 *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3662,3688 **** 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<...> hearder in a template-declaration. - TFF_TEMPLATE_DEFAULT_ARGUMENTS: show template paramter default values. TFF_TEMPLATE_NAME: show only template-name. TFF_EXPR_IN_PARENS: Parenthesize expressions. */ #define TFF_PLAIN_IDENTIFIER (0) ! #define TFF_NAMESPACE_SCOPE (1) ! #define TFF_CLASS_SCOPE (1 << 1) ! #define TFF_CHASE_NAMESPACE_ALIAS (1 << 2) ! #define TFF_CHASE_TYPEDEF (1 << 3) ! #define TFF_DECL_SPECIFIERS (1 << 4) ! #define TFF_CLASS_KEY_OR_ENUM (1 << 5) ! #define TFF_RETURN_TYPE (1 << 6) ! #define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 7) ! #define TFF_EXCEPTION_SPECIFICATION (1 << 8) ! #define TFF_TEMPLATE_HEADER (1 << 9) ! #define TFF_TEMPLATE_DEFAULT_ARGUMENTS (1 << 10) ! #define TFF_TEMPLATE_NAME (1 << 11) ! #define TFF_EXPR_IN_PARENS (1 << 12) ! #define TFF_SCOPE (TFF_NAMESPACE_SCOPE | TFF_CLASS_SCOPE) /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM node. */ --- 3500,3521 ---- 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. */ #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) /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM node. */ *************** enum overload_flags { NO_SPECIAL = 0, DT *** 3692,3697 **** --- 3525,3533 ---- : TYPE_NAME (NODE)) /* in lex.c */ + + extern void init_reswords PARAMS ((void)); + /* Indexed by TREE_CODE, these tables give C-looking names to operators represented by TREE_CODES. For example, opname_tab[(int) MINUS_EXPR] == "-". */ *************** extern tree build_new_op PARAMS ((enum *** 3731,3736 **** --- 3567,3573 ---- extern tree build_op_delete_call PARAMS ((enum tree_code, tree, tree, int, tree)); extern int can_convert PARAMS ((tree, tree)); extern int can_convert_arg PARAMS ((tree, tree, tree)); + extern int can_convert_arg_bad PARAMS ((tree, tree, tree)); extern int enforce_access PARAMS ((tree, tree)); extern tree convert_default_arg PARAMS ((tree, tree, tree, int)); extern tree convert_arg_to_ellipsis PARAMS ((tree)); *************** extern tree strip_top_quals *** 3742,3750 **** extern tree perform_implicit_conversion PARAMS ((tree, tree)); /* in class.c */ extern tree build_vbase_path PARAMS ((enum tree_code, tree, tree, tree, int)); extern tree build_vtbl_ref PARAMS ((tree, tree)); ! extern tree build_vfn_ref PARAMS ((tree *, tree, tree)); extern tree get_vtable_decl PARAMS ((tree, int)); extern void add_method PARAMS ((tree, tree, int)); extern int currently_open_class PARAMS ((tree)); --- 3579,3588 ---- extern tree perform_implicit_conversion PARAMS ((tree, tree)); /* in class.c */ + extern tree build_base_path PARAMS ((enum tree_code, tree, tree, int)); extern tree build_vbase_path PARAMS ((enum tree_code, tree, tree, tree, int)); extern tree build_vtbl_ref PARAMS ((tree, tree)); ! extern tree build_vfn_ref PARAMS ((tree, tree)); extern tree get_vtable_decl PARAMS ((tree, int)); extern void add_method PARAMS ((tree, tree, int)); extern int currently_open_class PARAMS ((tree)); *************** extern void pushclass PARAMS ((tree, *** 3759,3768 **** extern void popclass PARAMS ((void)); extern void push_nested_class PARAMS ((tree, int)); extern void pop_nested_class PARAMS ((void)); extern void push_lang_context PARAMS ((tree)); extern void pop_lang_context PARAMS ((void)); ! extern tree instantiate_type PARAMS ((tree, tree, enum instantiate_type_flags)); ! extern void print_class_statistics PARAMS ((void)); extern void build_self_reference PARAMS ((void)); extern int same_signature_p PARAMS ((tree, tree)); extern void warn_hidden PARAMS ((tree)); --- 3597,3613 ---- extern void popclass PARAMS ((void)); extern void push_nested_class PARAMS ((tree, int)); extern void pop_nested_class PARAMS ((void)); + extern int current_lang_depth PARAMS ((void)); extern void push_lang_context PARAMS ((tree)); extern void pop_lang_context PARAMS ((void)); ! extern tree instantiate_type PARAMS ((tree, tree, tsubst_flags_t)); ! extern void print_class_statistics PARAMS ((void)); ! extern void cxx_print_statistics PARAMS ((void)); ! extern void cxx_print_xnode PARAMS ((FILE *, tree, int)); ! extern void cxx_print_decl PARAMS ((FILE *, tree, int)); ! extern void cxx_print_type PARAMS ((FILE *, tree, int)); ! extern void cxx_print_identifier PARAMS ((FILE *, tree, int)); ! extern void cxx_set_yydebug PARAMS ((int)); extern void build_self_reference PARAMS ((void)); extern int same_signature_p PARAMS ((tree, tree)); extern void warn_hidden PARAMS ((tree)); *************** extern tree get_primary_binfo *** 3781,3792 **** extern tree convert_to_reference PARAMS ((tree, tree, int, int, tree)); extern tree convert_from_reference PARAMS ((tree)); extern tree convert_lvalue PARAMS ((tree, tree)); - extern tree convert_pointer_to_real PARAMS ((tree, tree)); - extern tree convert_pointer_to PARAMS ((tree, tree)); extern tree ocp_convert PARAMS ((tree, tree, int, int)); extern tree cp_convert PARAMS ((tree, tree)); extern tree convert_to_void PARAMS ((tree, const char */*implicit context*/)); - extern tree convert PARAMS ((tree, tree)); extern tree convert_force PARAMS ((tree, tree, int)); extern tree build_type_conversion PARAMS ((tree, tree, int)); extern tree build_expr_type_conversion PARAMS ((int, tree, int)); --- 3626,3634 ---- *************** extern void adjust_clone_args PARAMS ( *** 3797,3804 **** /* decl.c */ /* resume_binding_level */ ! extern void set_identifier_local_value PARAMS ((tree, tree)); ! extern int global_bindings_p PARAMS ((void)); extern int toplevel_bindings_p PARAMS ((void)); extern int namespace_bindings_p PARAMS ((void)); extern void keep_next_level PARAMS ((int)); --- 3639,3645 ---- /* decl.c */ /* resume_binding_level */ ! extern void cxx_init_decl_processing PARAMS ((void)); extern int toplevel_bindings_p PARAMS ((void)); extern int namespace_bindings_p PARAMS ((void)); extern void keep_next_level PARAMS ((int)); *************** extern void note_level_for_try PARAMS *** 3813,3821 **** extern void note_level_for_catch PARAMS ((void)); extern void resume_level PARAMS ((struct binding_level *)); extern void delete_block PARAMS ((tree)); - extern void insert_block PARAMS ((tree)); extern void add_block_current_level PARAMS ((tree)); - extern void set_block PARAMS ((tree)); extern void pushlevel_class PARAMS ((void)); extern void poplevel_class PARAMS ((void)); extern void print_binding_stack PARAMS ((void)); --- 3654,3660 ---- *************** extern tree make_anon_name PARAMS ((vo *** 3837,3843 **** extern void clear_anon_tags PARAMS ((void)); extern int decls_match PARAMS ((tree, tree)); extern int duplicate_decls PARAMS ((tree, tree)); - extern tree pushdecl PARAMS ((tree)); extern tree pushdecl_top_level PARAMS ((tree)); extern void pushdecl_class_level PARAMS ((tree)); extern tree pushdecl_namespace_level PARAMS ((tree)); --- 3676,3681 ---- *************** extern tree push_using_decl *** 3845,3863 **** extern tree push_using_directive PARAMS ((tree)); extern void push_class_level_binding PARAMS ((tree, tree)); extern tree implicitly_declare PARAMS ((tree)); - extern tree lookup_label PARAMS ((tree)); extern tree declare_local_label PARAMS ((tree)); extern tree define_label PARAMS ((const char *, int, tree)); extern void check_goto PARAMS ((tree)); extern void define_case_label PARAMS ((void)); - extern tree getdecls PARAMS ((void)); - extern tree gettags PARAMS ((void)); extern tree binding_for_name PARAMS ((tree, tree)); extern tree namespace_binding PARAMS ((tree, tree)); extern void set_namespace_binding PARAMS ((tree, tree, tree)); extern tree lookup_namespace_name PARAMS ((tree, tree)); extern tree build_typename_type PARAMS ((tree, tree, tree, tree)); ! extern tree make_typename_type PARAMS ((tree, tree, int)); extern tree lookup_name_nonclass PARAMS ((tree)); extern tree lookup_function_nonclass PARAMS ((tree, tree)); extern tree lookup_name PARAMS ((tree, int)); --- 3683,3699 ---- extern tree push_using_directive PARAMS ((tree)); extern void push_class_level_binding PARAMS ((tree, tree)); extern tree implicitly_declare PARAMS ((tree)); extern tree declare_local_label PARAMS ((tree)); extern tree define_label PARAMS ((const char *, int, tree)); extern void check_goto PARAMS ((tree)); extern void define_case_label PARAMS ((void)); extern tree binding_for_name PARAMS ((tree, tree)); extern tree namespace_binding PARAMS ((tree, tree)); extern void set_namespace_binding PARAMS ((tree, tree, tree)); extern tree lookup_namespace_name PARAMS ((tree, tree)); extern tree build_typename_type PARAMS ((tree, tree, tree, tree)); ! extern tree make_typename_type PARAMS ((tree, tree, tsubst_flags_t)); ! extern tree make_unbound_class_template PARAMS ((tree, tree, int)); extern tree lookup_name_nonclass PARAMS ((tree)); extern tree lookup_function_nonclass PARAMS ((tree, tree)); extern tree lookup_name PARAMS ((tree, int)); *************** extern tree build_cp_library_fn_ptr PAR *** 3876,3882 **** extern tree push_library_fn PARAMS ((tree, tree)); extern tree push_void_library_fn PARAMS ((tree, tree)); extern tree push_throw_library_fn PARAMS ((tree, tree)); - extern void init_decl_processing PARAMS ((void)); extern int init_type_desc PARAMS ((void)); extern tree check_tag_decl PARAMS ((tree)); extern void shadow_tag PARAMS ((tree)); --- 3712,3717 ---- *************** extern int complete_array_type PARAMS *** 3893,3901 **** extern tree build_ptrmemfunc_type PARAMS ((tree)); /* the grokdeclarator prototype is in decl.h */ extern int parmlist_is_exprlist PARAMS ((tree)); ! extern int copy_args_p PARAMS ((tree)); extern int grok_ctor_properties PARAMS ((tree, tree)); ! extern void grok_op_properties PARAMS ((tree, int, int)); extern tree xref_tag PARAMS ((tree, tree, int)); extern tree xref_tag_from_type PARAMS ((tree, tree, int)); extern void xref_basetypes PARAMS ((tree, tree, tree, tree)); --- 3728,3737 ---- extern tree build_ptrmemfunc_type PARAMS ((tree)); /* the grokdeclarator prototype is in decl.h */ extern int parmlist_is_exprlist PARAMS ((tree)); ! extern int copy_fn_p PARAMS ((tree)); ! extern void grok_special_member_properties PARAMS ((tree)); extern int grok_ctor_properties PARAMS ((tree, tree)); ! extern void grok_op_properties PARAMS ((tree, int)); extern tree xref_tag PARAMS ((tree, tree, int)); extern tree xref_tag_from_type PARAMS ((tree, tree, int)); extern void xref_basetypes PARAMS ((tree, tree, tree, tree)); *************** extern tree start_enum PARAMS ((tree) *** 3903,3913 **** extern void finish_enum PARAMS ((tree)); extern void build_enumerator PARAMS ((tree, tree, tree)); extern int start_function PARAMS ((tree, tree, tree, int)); extern tree finish_function PARAMS ((int)); extern tree start_method PARAMS ((tree, tree, tree)); extern tree finish_method PARAMS ((tree)); ! extern void hack_incomplete_structures PARAMS ((tree)); ! extern tree maybe_build_cleanup PARAMS ((tree)); extern void finish_stmt PARAMS ((void)); extern void print_other_binding_stack PARAMS ((struct binding_level *)); extern void revert_static_member_fn PARAMS ((tree)); --- 3739,3751 ---- extern void finish_enum PARAMS ((tree)); extern void build_enumerator PARAMS ((tree, tree, tree)); extern int start_function PARAMS ((tree, tree, tree, int)); + extern tree begin_function_body PARAMS ((void)); + extern void finish_function_body PARAMS ((tree)); extern tree finish_function PARAMS ((int)); extern tree start_method PARAMS ((tree, tree, tree)); extern tree finish_method PARAMS ((tree)); ! extern void maybe_register_incomplete_var PARAMS ((tree)); ! extern void complete_vars PARAMS ((tree)); extern void finish_stmt PARAMS ((void)); extern void print_other_binding_stack PARAMS ((struct binding_level *)); extern void revert_static_member_fn PARAMS ((tree)); *************** extern int nonstatic_local_decl_p *** 3941,3946 **** --- 3779,3785 ---- extern tree declare_global_var PARAMS ((tree, tree)); extern void register_dtor_fn PARAMS ((tree)); extern tmpl_spec_kind current_tmpl_spec_kind PARAMS ((int)); + extern tree cp_fname_init PARAMS ((const char *)); /* in decl2.c */ extern void init_decl2 PARAMS ((void)); *************** extern void grok_x_components PARAMS ( *** 3952,3958 **** extern void maybe_retrofit_in_chrg PARAMS ((tree)); extern void maybe_make_one_only PARAMS ((tree)); extern void grokclassfn PARAMS ((tree, tree, enum overload_flags, tree)); - extern tree grok_alignof PARAMS ((tree)); extern tree grok_array_decl PARAMS ((tree, tree)); extern tree delete_sanity PARAMS ((tree, tree, int, int)); extern tree check_classfn PARAMS ((tree, tree)); --- 3791,3796 ---- *************** extern tree grokfield PARAMS ((tree, *** 3961,3972 **** extern tree grokbitfield PARAMS ((tree, tree, tree)); extern tree groktypefield PARAMS ((tree, tree)); extern tree grokoptypename PARAMS ((tree, tree)); ! extern int copy_assignment_arg_p PARAMS ((tree, int)); ! extern void cplus_decl_attributes PARAMS ((tree, tree, tree)); extern tree constructor_name_full PARAMS ((tree)); extern tree constructor_name PARAMS ((tree)); extern void defer_fn PARAMS ((tree)); - extern tree get_temp_name PARAMS ((tree)); extern void finish_anon_union PARAMS ((tree)); extern tree finish_table PARAMS ((tree, tree, tree, int)); extern void finish_builtin_type PARAMS ((tree, const char *, --- 3799,3808 ---- extern tree grokbitfield PARAMS ((tree, tree, tree)); extern tree groktypefield PARAMS ((tree, tree)); extern tree grokoptypename PARAMS ((tree, tree)); ! extern void cplus_decl_attributes PARAMS ((tree *, tree, int)); extern tree constructor_name_full PARAMS ((tree)); extern tree constructor_name PARAMS ((tree)); extern void defer_fn PARAMS ((tree)); extern void finish_anon_union PARAMS ((tree)); extern tree finish_table PARAMS ((tree, tree, tree, int)); extern void finish_builtin_type PARAMS ((tree, const char *, *************** extern tree do_class_using_decl PARAMS *** 3996,4002 **** extern void do_using_directive PARAMS ((tree)); extern void check_default_args PARAMS ((tree)); extern void mark_used PARAMS ((tree)); ! extern tree handle_class_head PARAMS ((tree, tree, tree)); extern tree lookup_arg_dependent PARAMS ((tree, tree, tree)); extern void finish_static_data_member_decl PARAMS ((tree, tree, tree, int)); extern tree build_artificial_parm PARAMS ((tree, tree)); --- 3832,3838 ---- extern void do_using_directive PARAMS ((tree)); extern void check_default_args PARAMS ((tree)); extern void mark_used PARAMS ((tree)); ! extern tree handle_class_head PARAMS ((tree, tree, tree, int, int *)); extern tree lookup_arg_dependent PARAMS ((tree, tree, tree)); extern void finish_static_data_member_decl PARAMS ((tree, tree, tree, int)); extern tree build_artificial_parm PARAMS ((tree, tree)); *************** extern tree set_guard *** 4007,4023 **** /* in parse.y */ extern void cp_parse_init PARAMS ((void)); ! /* in errfn.c */ ! /* The cp_* functions aren't suitable for ATTRIBUTE_PRINTF. */ ! extern void cp_error PARAMS ((const char *, ...)); ! extern void cp_error_at PARAMS ((const char *, ...)); ! extern void cp_warning PARAMS ((const char *, ...)); ! extern void cp_warning_at PARAMS ((const char *, ...)); ! extern void cp_pedwarn PARAMS ((const char *, ...)); ! extern void cp_pedwarn_at PARAMS ((const char *, ...)); ! extern void cp_compiler_error PARAMS ((const char *, ...)); ! extern void cp_sprintf PARAMS ((const char *, ...)); ! extern void cp_deprecated PARAMS ((const char*)); /* in error.c */ extern void init_error PARAMS ((void)); --- 3843,3859 ---- /* in parse.y */ extern void cp_parse_init PARAMS ((void)); ! extern void cp_error_at PARAMS ((const char *msgid, ...)); ! extern void cp_warning_at PARAMS ((const char *msgid, ...)); ! extern void cp_pedwarn_at PARAMS ((const char *msgid, ...)); ! ! /* XXX Not i18n clean. */ ! #define cp_deprecated(STR) \ ! do { \ ! if (warn_deprecated) \ ! warning ("%s is deprecated, please see the documentation for details", \ ! (STR)); \ ! } while (0) /* in error.c */ extern void init_error PARAMS ((void)); *************** extern const char *cp_file_of PARAMS ( *** 4030,4047 **** extern int cp_line_of PARAMS ((tree)); extern const char *language_to_string PARAMS ((enum languages, int)); extern void print_instantiation_context PARAMS ((void)); - /* cp_printer is the type of a function which converts an argument into - a string for digestion by printf. The cp_printer function should deal - with all memory management; the functions in errfn will not free - the char*s returned. See error.c for an example use of this code. */ - typedef const char *cp_printer PARAMS ((tree, int)); - extern cp_printer *cp_printers[256]; - /* in except.c */ extern void init_exception_processing PARAMS ((void)); extern tree expand_start_catch_block PARAMS ((tree)); ! extern void expand_end_catch_block PARAMS ((tree)); extern void expand_builtin_throw PARAMS ((void)); extern void expand_eh_spec_block PARAMS ((tree)); extern void expand_exception_blocks PARAMS ((void)); --- 3866,3876 ---- extern int cp_line_of PARAMS ((tree)); extern const char *language_to_string PARAMS ((enum languages, int)); extern void print_instantiation_context PARAMS ((void)); /* in except.c */ extern void init_exception_processing PARAMS ((void)); extern tree expand_start_catch_block PARAMS ((tree)); ! extern void expand_end_catch_block PARAMS ((void)); extern void expand_builtin_throw PARAMS ((void)); extern void expand_eh_spec_block PARAMS ((tree)); extern void expand_exception_blocks PARAMS ((void)); *************** extern tree build_new PARAMS ((tree, *** 4078,4083 **** --- 3907,3913 ---- extern tree build_vec_init PARAMS ((tree, tree, int)); extern tree build_x_delete PARAMS ((tree, int, tree)); extern tree build_delete PARAMS ((tree, tree, special_function_kind, int, int)); + extern void perform_base_cleanups PARAMS ((void)); extern tree build_vbase_delete PARAMS ((tree, tree)); extern tree build_vec_delete PARAMS ((tree, tree, special_function_kind, int)); extern tree create_temporary_var PARAMS ((tree)); *************** extern tree build_java_class_ref *** 4089,4095 **** /* in input.c */ /* in lex.c */ - extern char *file_name_nondirectory PARAMS ((const char *)); extern tree make_pointer_declarator PARAMS ((tree, tree)); extern tree make_reference_declarator PARAMS ((tree, tree)); extern tree make_call_declarator PARAMS ((tree, tree, tree, tree)); --- 3919,3924 ---- *************** extern tree identifier_typedecl_value P *** 4112,4118 **** extern tree build_lang_decl PARAMS ((enum tree_code, tree, tree)); extern void retrofit_lang_decl PARAMS ((tree)); extern tree copy_decl PARAMS ((tree)); ! extern void copy_lang_decl PARAMS ((tree)); extern tree cp_make_lang_type PARAMS ((enum tree_code)); extern tree make_aggr_type PARAMS ((enum tree_code)); extern void compiler_error PARAMS ((const char *, ...)) --- 3941,3947 ---- extern tree build_lang_decl PARAMS ((enum tree_code, tree, tree)); extern void retrofit_lang_decl PARAMS ((tree)); extern tree copy_decl PARAMS ((tree)); ! extern tree copy_type PARAMS ((tree)); extern tree cp_make_lang_type PARAMS ((enum tree_code)); extern tree make_aggr_type PARAMS ((enum tree_code)); extern void compiler_error PARAMS ((const char *, ...)) *************** extern void yyerror PARAMS ((const ch *** 4121,4126 **** --- 3950,3959 ---- extern void clear_inline_text_obstack PARAMS ((void)); extern void yyhook PARAMS ((int)); extern int cp_type_qual_from_rid PARAMS ((tree)); + extern const char *cxx_init PARAMS ((const char *)); + extern void cxx_finish PARAMS ((void)); + extern void cxx_init_options PARAMS ((void)); + extern void cxx_post_options PARAMS ((void)); /* in method.c */ extern void init_method PARAMS ((void)); *************** extern int maybe_clone_body *** 4142,4150 **** extern void init_pt PARAMS ((void)); extern void check_template_shadow PARAMS ((tree)); extern tree get_innermost_template_args PARAMS ((tree, int)); ! extern tree tsubst PARAMS ((tree, tree, int, tree)); ! extern tree tsubst_expr PARAMS ((tree, tree, int, tree)); ! extern tree tsubst_copy PARAMS ((tree, tree, int, tree)); extern void maybe_begin_member_template_processing PARAMS ((tree)); extern void maybe_end_member_template_processing PARAMS ((void)); extern tree finish_member_template_decl PARAMS ((tree)); --- 3975,3983 ---- extern void init_pt PARAMS ((void)); extern void check_template_shadow PARAMS ((tree)); extern tree get_innermost_template_args PARAMS ((tree, int)); ! extern tree tsubst PARAMS ((tree, tree, tsubst_flags_t, tree)); ! extern tree tsubst_expr PARAMS ((tree, tree, tsubst_flags_t, tree)); ! extern tree tsubst_copy PARAMS ((tree, tree, tsubst_flags_t, tree)); extern void maybe_begin_member_template_processing PARAMS ((tree)); extern void maybe_end_member_template_processing PARAMS ((void)); extern tree finish_member_template_decl PARAMS ((tree)); *************** extern tree current_template_args PARAM *** 4162,4168 **** extern tree push_template_decl PARAMS ((tree)); extern tree push_template_decl_real PARAMS ((tree, int)); extern void redeclare_class_template PARAMS ((tree, tree)); ! extern tree lookup_template_class PARAMS ((tree, tree, tree, tree, int, int)); extern tree lookup_template_function PARAMS ((tree, tree)); extern int uses_template_parms PARAMS ((tree)); extern tree instantiate_class_template PARAMS ((tree)); --- 3995,4001 ---- extern tree push_template_decl PARAMS ((tree)); extern tree push_template_decl_real PARAMS ((tree, int)); extern void redeclare_class_template PARAMS ((tree, tree)); ! extern tree lookup_template_class PARAMS ((tree, tree, tree, tree, int, tsubst_flags_t)); extern tree lookup_template_function PARAMS ((tree, tree)); extern int uses_template_parms PARAMS ((tree)); extern tree instantiate_class_template PARAMS ((tree)); *************** extern void mark_decl_instantiated PARA *** 4173,4179 **** extern int more_specialized PARAMS ((tree, tree, int, int)); extern void mark_class_instantiated PARAMS ((tree, int)); extern void do_decl_instantiation PARAMS ((tree, tree, tree)); ! extern void do_type_instantiation PARAMS ((tree, tree, int)); extern tree instantiate_decl PARAMS ((tree, int)); extern tree get_bindings PARAMS ((tree, tree, tree)); extern int push_tinst_level PARAMS ((tree)); --- 4006,4012 ---- extern int more_specialized PARAMS ((tree, tree, int, int)); extern void mark_class_instantiated PARAMS ((tree, int)); extern void do_decl_instantiation PARAMS ((tree, tree, tree)); ! extern void do_type_instantiation PARAMS ((tree, tree, tsubst_flags_t)); extern tree instantiate_decl PARAMS ((tree, int)); extern tree get_bindings PARAMS ((tree, tree, tree)); extern int push_tinst_level PARAMS ((tree)); *************** extern void init_rtti_processing PARAMS *** 4209,4225 **** extern tree build_typeid PARAMS((tree)); extern tree get_tinfo_decl PARAMS((tree)); extern tree get_typeid PARAMS((tree)); - extern tree get_typeid_1 PARAMS((tree)); extern tree build_dynamic_cast PARAMS((tree, tree)); extern void emit_support_tinfos PARAMS((void)); extern int tinfo_decl_p PARAMS((tree, void *)); extern int emit_tinfo_decl PARAMS((tree *, void *)); /* in search.c */ extern int types_overlap_p PARAMS ((tree, tree)); extern tree get_vbase PARAMS ((tree, tree)); - extern tree get_binfo PARAMS ((tree, tree, int)); - extern int get_base_distance PARAMS ((tree, tree, int, tree *)); extern tree get_dynamic_cast_base_type PARAMS ((tree, tree)); extern void type_access_control PARAMS ((tree, tree)); extern int accessible_p PARAMS ((tree, tree)); --- 4042,4056 ---- extern tree build_typeid PARAMS((tree)); extern tree get_tinfo_decl PARAMS((tree)); extern tree get_typeid PARAMS((tree)); extern tree build_dynamic_cast PARAMS((tree, tree)); extern void emit_support_tinfos PARAMS((void)); extern int tinfo_decl_p PARAMS((tree, void *)); extern int emit_tinfo_decl PARAMS((tree *, void *)); /* in search.c */ + extern tree lookup_base PARAMS ((tree, tree, base_access, base_kind *)); extern int types_overlap_p PARAMS ((tree, tree)); extern tree get_vbase PARAMS ((tree, tree)); extern tree get_dynamic_cast_base_type PARAMS ((tree, tree)); extern void type_access_control PARAMS ((tree, tree)); extern int accessible_p PARAMS ((tree, tree)); *************** extern tree lookup_fnfields PARAMS ((t *** 4229,4235 **** extern tree lookup_member PARAMS ((tree, tree, int, int)); extern int look_for_overrides PARAMS ((tree, tree)); extern void get_pure_virtuals PARAMS ((tree)); - extern tree init_vbase_pointers PARAMS ((tree, tree)); extern void get_vbase_types PARAMS ((tree)); extern void maybe_suppress_debug_info PARAMS ((tree)); extern void note_debug_info_needed PARAMS ((tree)); --- 4060,4065 ---- *************** extern tree dfs_walk_real *** 4258,4275 **** extern tree dfs_unmark PARAMS ((tree, void *)); extern tree markedp PARAMS ((tree, void *)); extern tree unmarkedp PARAMS ((tree, void *)); - extern tree dfs_skip_nonprimary_vbases_unmarkedp PARAMS ((tree, void *)); - extern tree dfs_skip_nonprimary_vbases_markedp PARAMS ((tree, void *)); extern tree dfs_unmarked_real_bases_queue_p PARAMS ((tree, void *)); extern tree dfs_marked_real_bases_queue_p PARAMS ((tree, void *)); extern tree dfs_skip_vbases PARAMS ((tree, void *)); extern tree marked_vtable_pathp PARAMS ((tree, void *)); extern tree unmarked_vtable_pathp PARAMS ((tree, void *)); - extern tree convert_pointer_to_vbase PARAMS ((tree, tree)); extern tree find_vbase_instance PARAMS ((tree, tree)); extern tree binfo_for_vbase PARAMS ((tree, tree)); extern tree binfo_via_virtual PARAMS ((tree, tree)); - extern void fixup_all_virtual_upcast_offsets PARAMS ((tree)); /* in semantics.c */ extern void init_cp_semantics PARAMS ((void)); --- 4088,4101 ---- *************** extern void finish_function_try_block *** 4309,4317 **** extern void finish_function_handler_sequence PARAMS ((tree)); extern void finish_cleanup_try_block PARAMS ((tree)); extern tree begin_handler PARAMS ((void)); ! extern tree finish_handler_parms PARAMS ((tree, tree)); extern void begin_catch_block PARAMS ((tree)); ! extern void finish_handler PARAMS ((tree, tree)); extern void finish_cleanup PARAMS ((tree, tree)); extern tree begin_compound_stmt PARAMS ((int)); extern tree finish_compound_stmt PARAMS ((int, tree)); --- 4135,4143 ---- extern void finish_function_handler_sequence PARAMS ((tree)); extern void finish_cleanup_try_block PARAMS ((tree)); extern tree begin_handler PARAMS ((void)); ! extern void finish_handler_parms PARAMS ((tree, tree)); extern void begin_catch_block PARAMS ((tree)); ! extern void finish_handler PARAMS ((tree)); extern void finish_cleanup PARAMS ((tree, tree)); extern tree begin_compound_stmt PARAMS ((int)); extern tree finish_compound_stmt PARAMS ((int, tree)); *************** extern tree finish_object_call_expr *** 4329,4338 **** extern tree finish_qualified_object_call_expr PARAMS ((tree, tree, tree)); extern tree finish_pseudo_destructor_call_expr PARAMS ((tree, tree, tree)); extern tree finish_qualified_call_expr PARAMS ((tree, tree)); - extern tree finish_label_address_expr PARAMS ((tree)); extern tree finish_unary_op_expr PARAMS ((enum tree_code, tree)); extern tree finish_id_expr PARAMS ((tree)); extern void save_type_access_control PARAMS ((tree)); extern void decl_type_access_control PARAMS ((tree)); extern int begin_function_definition PARAMS ((tree, tree)); extern tree begin_constructor_declarator PARAMS ((tree, tree)); --- 4155,4164 ---- extern tree finish_qualified_object_call_expr PARAMS ((tree, tree, tree)); extern tree finish_pseudo_destructor_call_expr PARAMS ((tree, tree, tree)); extern tree finish_qualified_call_expr PARAMS ((tree, tree)); extern tree finish_unary_op_expr PARAMS ((enum tree_code, tree)); extern tree finish_id_expr PARAMS ((tree)); extern void save_type_access_control PARAMS ((tree)); + extern void reset_type_access_control PARAMS ((void)); extern void decl_type_access_control PARAMS ((tree)); extern int begin_function_definition PARAMS ((tree, tree)); extern tree begin_constructor_declarator PARAMS ((tree, tree)); *************** extern tree finish_base_specifier *** 4354,4363 **** extern void finish_member_declaration PARAMS ((tree)); extern void check_multiple_declarators PARAMS ((void)); extern tree finish_typeof PARAMS ((tree)); extern void finish_decl_cleanup PARAMS ((tree, tree)); extern void finish_named_return_value PARAMS ((tree, tree)); extern void expand_body PARAMS ((tree)); ! extern void prep_stmt PARAMS ((tree)); extern void do_pushlevel PARAMS ((void)); extern tree do_poplevel PARAMS ((void)); extern void finish_mem_initializers PARAMS ((tree)); --- 4180,4191 ---- extern void finish_member_declaration PARAMS ((tree)); extern void check_multiple_declarators PARAMS ((void)); extern tree finish_typeof PARAMS ((tree)); + extern tree finish_sizeof PARAMS ((tree)); + extern tree finish_alignof PARAMS ((tree)); extern void finish_decl_cleanup PARAMS ((tree, tree)); extern void finish_named_return_value PARAMS ((tree, tree)); extern void expand_body PARAMS ((tree)); ! extern tree nullify_returns_r PARAMS ((tree *, int *, void *)); extern void do_pushlevel PARAMS ((void)); extern tree do_poplevel PARAMS ((void)); extern void finish_mem_initializers PARAMS ((tree)); *************** extern tree finish_global_stmt_expr *** 4369,4376 **** /* in spew.c */ extern void init_spew PARAMS ((void)); extern int peekyylex PARAMS ((void)); - extern int yylex PARAMS ((void)); extern tree arbitrate_lookup PARAMS ((tree, tree, tree)); extern tree frob_opname PARAMS ((tree)); extern void maybe_snarf_defarg PARAMS ((void)); --- 4197,4204 ---- /* in spew.c */ extern void init_spew PARAMS ((void)); + extern void mark_pending_inlines PARAMS ((PTR)); extern int peekyylex PARAMS ((void)); extern tree arbitrate_lookup PARAMS ((tree, tree, tree)); extern tree frob_opname PARAMS ((tree)); extern void maybe_snarf_defarg PARAMS ((void)); *************** extern void do_pending_defargs PARAMS *** 4379,4384 **** --- 4207,4213 ---- extern void done_pending_defargs PARAMS ((void)); extern void unprocessed_defarg_fn PARAMS ((tree)); extern void replace_defarg PARAMS ((tree, tree)); + extern void end_input PARAMS ((void)); /* in tree.c */ extern void init_tree PARAMS ((void)); *************** extern int member_p PARAMS ((tree)); *** 4389,4396 **** extern cp_lvalue_kind real_lvalue_p PARAMS ((tree)); extern tree build_min PARAMS ((enum tree_code, tree, ...)); extern tree build_min_nt PARAMS ((enum tree_code, ...)); - extern int lvalue_p PARAMS ((tree)); - extern int lvalue_or_else PARAMS ((tree, const char *)); extern tree build_cplus_new PARAMS ((tree, tree)); extern tree get_target_expr PARAMS ((tree)); extern tree break_out_calls PARAMS ((tree)); --- 4218,4223 ---- *************** extern tree hash_tree_cons PARAMS ((tr *** 4401,4407 **** extern tree hash_tree_chain PARAMS ((tree, tree)); extern tree hash_chainon PARAMS ((tree, tree)); extern tree make_binfo PARAMS ((tree, tree, tree, tree)); - extern tree binfo_value PARAMS ((tree, tree)); extern tree reverse_path PARAMS ((tree)); extern int count_functions PARAMS ((tree)); extern int is_overloaded_fn PARAMS ((tree)); --- 4228,4233 ---- *************** extern tree get_first_fn PARAMS ((tree *** 4409,4422 **** extern int bound_pmf_p PARAMS ((tree)); extern tree ovl_cons PARAMS ((tree, tree)); extern tree build_overload PARAMS ((tree, tree)); - extern tree fnaddr_from_vtable_entry PARAMS ((tree)); extern tree function_arg_chain PARAMS ((tree)); extern int promotes_to_aggr_type PARAMS ((tree, enum tree_code)); extern int is_aggr_type_2 PARAMS ((tree, tree)); extern const char *lang_printable_name PARAMS ((tree, int)); extern tree build_exception_variant PARAMS ((tree, tree)); ! extern tree copy_template_template_parm PARAMS ((tree, tree)); ! extern void print_lang_statistics PARAMS ((void)); extern tree array_type_nelts_total PARAMS ((tree)); extern tree array_type_nelts_top PARAMS ((tree)); extern tree break_out_target_exprs PARAMS ((tree)); --- 4235,4246 ---- extern int bound_pmf_p PARAMS ((tree)); extern tree ovl_cons PARAMS ((tree, tree)); extern tree build_overload PARAMS ((tree, tree)); extern tree function_arg_chain PARAMS ((tree)); extern int promotes_to_aggr_type PARAMS ((tree, enum tree_code)); extern int is_aggr_type_2 PARAMS ((tree, tree)); extern const char *lang_printable_name PARAMS ((tree, int)); extern tree build_exception_variant PARAMS ((tree, tree)); ! extern tree bind_template_template_parm PARAMS ((tree, tree)); extern tree array_type_nelts_total PARAMS ((tree)); extern tree array_type_nelts_top PARAMS ((tree)); extern tree break_out_target_exprs PARAMS ((tree)); *************** extern void debug_binfo PARAMS ((tree *** 4436,4455 **** extern tree build_dummy_object PARAMS ((tree)); extern tree maybe_dummy_object PARAMS ((tree, tree *)); extern int is_dummy_object PARAMS ((tree)); ! extern tree walk_tree PARAMS ((tree *, ! walk_tree_fn, ! void *, ! htab_t)); ! extern tree walk_tree_without_duplicates PARAMS ((tree *, ! walk_tree_fn, ! void *)); ! extern tree copy_tree_r PARAMS ((tree *, int *, void *)); ! extern int cp_valid_lang_attribute PARAMS ((tree, tree, tree, tree)); extern tree make_ptrmem_cst PARAMS ((tree, tree)); ! extern tree cp_build_qualified_type_real PARAMS ((tree, int, int)); ! extern void remap_save_expr PARAMS ((tree *, splay_tree, tree, int *)); #define cp_build_qualified_type(TYPE, QUALS) \ ! cp_build_qualified_type_real ((TYPE), (QUALS), /*complain=*/1) extern tree build_shared_int_cst PARAMS ((int)); extern special_function_kind special_function_p PARAMS ((tree)); extern int count_trees PARAMS ((tree)); --- 4260,4270 ---- extern tree build_dummy_object PARAMS ((tree)); extern tree maybe_dummy_object PARAMS ((tree, tree *)); extern int is_dummy_object PARAMS ((tree)); ! extern const struct attribute_spec cp_attribute_table[]; extern tree make_ptrmem_cst PARAMS ((tree, tree)); ! extern tree cp_build_qualified_type_real PARAMS ((tree, int, tsubst_flags_t)); #define cp_build_qualified_type(TYPE, QUALS) \ ! cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning) extern tree build_shared_int_cst PARAMS ((int)); extern special_function_kind special_function_p PARAMS ((tree)); extern int count_trees PARAMS ((tree)); *************** extern int char_type_p *** 4457,4462 **** --- 4272,4287 ---- extern void verify_stmt_tree PARAMS ((tree)); extern tree find_tree PARAMS ((tree, tree)); extern linkage_kind decl_linkage PARAMS ((tree)); + extern tree cp_walk_subtrees PARAMS ((tree*, int*, walk_tree_fn, + void*, void*)); + extern int cp_cannot_inline_tree_fn PARAMS ((tree*)); + extern tree cp_add_pending_fn_decls PARAMS ((void*,tree)); + extern int cp_is_overload_p PARAMS ((tree)); + extern int cp_auto_var_in_fn_p PARAMS ((tree,tree)); + extern tree cp_copy_res_decl_for_inlining PARAMS ((tree, tree, tree, void*, + int*, void*)); + extern int cp_start_inlining PARAMS ((tree)); + extern void cp_end_inlining PARAMS ((tree)); /* in typeck.c */ extern int string_conv_p PARAMS ((tree, tree, int)); *************** extern int comp_except_specs PARAMS (( *** 4473,4488 **** extern int comptypes PARAMS ((tree, tree, int)); extern int comp_target_types PARAMS ((tree, tree, int)); extern int compparms PARAMS ((tree, tree)); - extern int comp_target_types PARAMS ((tree, tree, int)); extern int comp_cv_qualification PARAMS ((tree, tree)); extern int comp_cv_qual_signature PARAMS ((tree, tree)); - extern tree unsigned_type PARAMS ((tree)); - extern tree signed_type PARAMS ((tree)); - extern tree signed_or_unsigned_type PARAMS ((int, tree)); extern tree expr_sizeof PARAMS ((tree)); - extern tree c_sizeof PARAMS ((tree)); extern tree c_sizeof_nowarn PARAMS ((tree)); - extern tree c_alignof PARAMS ((tree)); extern tree inline_conversion PARAMS ((tree)); extern tree decay_conversion PARAMS ((tree)); extern tree build_object_ref PARAMS ((tree, tree, tree)); --- 4298,4307 ---- *************** extern tree build_array_ref PARAMS ((t *** 4495,4507 **** extern tree build_x_function_call PARAMS ((tree, tree, tree)); extern tree get_member_function_from_ptrfunc PARAMS ((tree *, tree)); extern tree build_function_call_real PARAMS ((tree, tree, int, int)); - extern tree build_function_call PARAMS ((tree, tree)); extern tree build_function_call_maybe PARAMS ((tree, tree)); extern tree convert_arguments PARAMS ((tree, tree, tree, int)); extern tree build_x_binary_op PARAMS ((enum tree_code, tree, tree)); extern tree build_x_unary_op PARAMS ((enum tree_code, tree)); extern tree unary_complex_lvalue PARAMS ((enum tree_code, tree)); - extern int mark_addressable PARAMS ((tree)); extern tree build_x_conditional_expr PARAMS ((tree, tree, tree)); extern tree build_x_compound_expr PARAMS ((tree)); extern tree build_compound_expr PARAMS ((tree)); --- 4314,4324 ---- *************** extern tree pfn_from_ptrmemfunc *** 4526,4531 **** --- 4343,4349 ---- extern tree type_after_usual_arithmetic_conversions PARAMS ((tree, tree)); extern tree composite_pointer_type PARAMS ((tree, tree, tree, tree, const char*)); + extern tree merge_types PARAMS ((tree, tree)); extern tree check_return_expr PARAMS ((tree)); #define cp_build_binary_op(code, arg1, arg2) \ build_binary_op(code, arg1, arg2, 1) *************** extern tree error_not_base_type PARAMS *** 4535,4549 **** extern tree binfo_or_else PARAMS ((tree, tree)); extern void readonly_error PARAMS ((tree, const char *, int)); extern int abstract_virtuals_error PARAMS ((tree, tree)); - extern void incomplete_type_error PARAMS ((tree, tree)); - extern void friendly_abort PARAMS ((int, const char *, - int, const char *)) - ATTRIBUTE_NORETURN; - #define my_friendly_abort(N) \ - friendly_abort (N, __FILE__, __LINE__, __FUNCTION__) #define my_friendly_assert(EXP, N) (void) \ ! (((EXP) == 0) ? (friendly_abort (N, __FILE__, __LINE__, __FUNCTION__), 0) : 0) extern tree store_init_value PARAMS ((tree, tree)); extern tree digest_init PARAMS ((tree, tree, tree *)); --- 4353,4361 ---- extern tree binfo_or_else PARAMS ((tree, tree)); extern void readonly_error PARAMS ((tree, const char *, int)); extern int abstract_virtuals_error PARAMS ((tree, tree)); #define my_friendly_assert(EXP, N) (void) \ ! (((EXP) == 0) ? (fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0) : 0) extern tree store_init_value PARAMS ((tree, tree)); extern tree digest_init PARAMS ((tree, tree, tree *)); *************** extern void check_for_new_type PARAMS *** 4555,4574 **** extern tree add_exception_specifier PARAMS ((tree, tree, int)); extern tree merge_exception_specifiers PARAMS ((tree, tree)); - /* in xref.c */ - extern void GNU_xref_begin PARAMS ((const char *)); - extern void GNU_xref_end PARAMS ((int)); - extern void GNU_xref_file PARAMS ((const char *)); - extern void GNU_xref_start_scope PARAMS ((HOST_WIDE_INT)); - extern void GNU_xref_end_scope PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, int, int)); - extern void GNU_xref_ref PARAMS ((tree, const char *)); - extern void GNU_xref_decl PARAMS ((tree, tree)); - extern void GNU_xref_call PARAMS ((tree, const char *)); - extern void GNU_xref_function PARAMS ((tree, tree)); - extern void GNU_xref_assign PARAMS ((tree)); - extern void GNU_xref_hier PARAMS ((tree, tree, int, int, int)); - extern void GNU_xref_member PARAMS ((tree, tree)); - /* in mangle.c */ extern void init_mangle PARAMS ((void)); extern void mangle_decl PARAMS ((tree)); --- 4367,4372 ---- *************** extern tree mangle_ctor_vtbl_for_type *** 4582,4591 **** extern tree mangle_thunk PARAMS ((tree, tree, tree)); extern tree mangle_conv_op_name_for_type PARAMS ((tree)); extern tree mangle_guard_variable PARAMS ((tree)); /* in dump.c */ ! extern int cp_dump_tree PARAMS ((dump_info_p, tree)); /* -- end of C++ */ ! #endif /* not _CP_TREE_H */ --- 4380,4390 ---- extern tree mangle_thunk PARAMS ((tree, tree, tree)); extern tree mangle_conv_op_name_for_type PARAMS ((tree)); extern tree mangle_guard_variable PARAMS ((tree)); + extern tree mangle_ref_init_variable PARAMS ((tree)); /* in dump.c */ ! extern int cp_dump_tree PARAMS ((void *, tree)); /* -- end of C++ */ ! #endif /* ! GCC_CP_TREE_H */ diff -Nrc3pad gcc-3.0.4/gcc/cp/cvt.c gcc-3.1/gcc/cp/cvt.c *** gcc-3.0.4/gcc/cp/cvt.c Fri Aug 17 04:31:27 2001 --- gcc-3.1/gcc/cp/cvt.c Wed Apr 24 22:40:59 2002 *************** Boston, MA 02111-1307, USA. */ *** 37,43 **** static tree cp_convert_to_pointer PARAMS ((tree, tree, int)); static tree convert_to_pointer_force PARAMS ((tree, tree)); ! static tree build_up_reference PARAMS ((tree, tree, int)); static void warn_ref_binding PARAMS ((tree, tree, tree)); /* Change of width--truncation and extension of integers or reals-- --- 37,43 ---- static tree cp_convert_to_pointer PARAMS ((tree, tree, int)); static tree convert_to_pointer_force PARAMS ((tree, tree)); ! static tree build_up_reference PARAMS ((tree, tree, int, tree)); static void warn_ref_binding PARAMS ((tree, tree, tree)); /* Change of width--truncation and extension of integers or reals-- *************** cp_convert_to_pointer (type, expr, force *** 85,91 **** intype = complete_type (intype); if (!COMPLETE_TYPE_P (intype)) { ! cp_error ("can't convert from incomplete type `%T' to `%T'", intype, type); return error_mark_node; } --- 85,91 ---- intype = complete_type (intype); if (!COMPLETE_TYPE_P (intype)) { ! error ("can't convert from incomplete type `%T' to `%T'", intype, type); return error_mark_node; } *************** cp_convert_to_pointer (type, expr, force *** 94,100 **** if (rval) { if (rval == error_mark_node) ! cp_error ("conversion of `%E' from `%T' to `%T' is ambiguous", expr, intype, type); return rval; } --- 94,100 ---- if (rval) { if (rval == error_mark_node) ! error ("conversion of `%E' from `%T' to `%T' is ambiguous", expr, intype, type); return rval; } *************** cp_convert_to_pointer (type, expr, force *** 123,129 **** { if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE) if (pedantic || warn_pmf2ptr) ! cp_pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr), type); return build1 (NOP_EXPR, type, expr); } --- 123,129 ---- { if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE) if (pedantic || warn_pmf2ptr) ! pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr), type); return build1 (NOP_EXPR, type, expr); } *************** cp_convert_to_pointer (type, expr, force *** 141,184 **** && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE && IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype)) ! && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE ! /* If EXPR is NULL, then we don't need to do any arithmetic ! to convert it: ! ! [conv.ptr] ! ! The null pointer value is converted to the null pointer ! value of the destination type. */ ! && !integer_zerop (expr)) { enum tree_code code = PLUS_EXPR; ! tree binfo = get_binfo (TREE_TYPE (type), TREE_TYPE (intype), 1); ! if (binfo == error_mark_node) ! return error_mark_node; ! if (binfo == NULL_TREE) { ! binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 1); ! if (binfo == error_mark_node) ! return error_mark_node; code = MINUS_EXPR; } if (binfo) { ! if (TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (type)) ! || TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (intype)) ! || ! BINFO_OFFSET_ZEROP (binfo)) { ! /* Need to get the path we took. */ ! tree path; ! ! if (code == PLUS_EXPR) ! get_base_distance (TREE_TYPE (type), TREE_TYPE (intype), ! 0, &path); ! else ! get_base_distance (TREE_TYPE (intype), TREE_TYPE (type), ! 0, &path); ! return build_vbase_path (code, type, expr, path, 0); } } } --- 141,175 ---- && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE && IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype)) ! && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE) { enum tree_code code = PLUS_EXPR; ! tree binfo; ! ! /* Try derived to base conversion. */ ! binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type), ! ba_check, NULL); ! if (!binfo) { ! /* Try base to derived conversion. */ ! binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype), ! ba_check, NULL); code = MINUS_EXPR; } + if (binfo == error_mark_node) + return error_mark_node; if (binfo) { ! expr = build_base_path (code, expr, binfo, 0); ! /* Add any qualifier conversions. */ ! if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)), ! TREE_TYPE (type))) { ! expr = build1 (NOP_EXPR, type, expr); ! TREE_CONSTANT (expr) = ! TREE_CONSTANT (TREE_OPERAND (expr, 0)); } + return expr; } } *************** cp_convert_to_pointer (type, expr, force *** 187,222 **** tree b1; tree b2; tree binfo; ! tree virt_binfo; ! enum tree_code code; b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type)); b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)); ! binfo = get_binfo (b2, b1, 1); ! ! if (binfo == NULL_TREE) { ! binfo = get_binfo (b1, b2, 1); code = MINUS_EXPR; } - else - code = PLUS_EXPR; - if (binfo == error_mark_node) return error_mark_node; ! virt_binfo = binfo_from_vbase (binfo); ! if (virt_binfo) { if (force) ! cp_warning ("pointer to member cast via virtual base `%T' of `%T'", ! BINFO_TYPE (virt_binfo), ! BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); else { ! cp_error ("pointer to member cast via virtual base `%T' of `%T'", ! BINFO_TYPE (virt_binfo), ! BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); return error_mark_node; } /* This is a reinterpret cast, whose result is unspecified. --- 178,206 ---- tree b1; tree b2; tree binfo; ! enum tree_code code = PLUS_EXPR; ! base_kind bk; b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type)); b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)); ! binfo = lookup_base (b1, b2, ba_check, &bk); ! if (!binfo) { ! binfo = lookup_base (b2, b1, ba_check, &bk); code = MINUS_EXPR; } if (binfo == error_mark_node) return error_mark_node; ! if (bk == bk_via_virtual) { if (force) ! warning ("pointer to member cast from `%T' to `%T' is via virtual base", ! TREE_TYPE (intype), TREE_TYPE (type)); else { ! error ("pointer to member cast from `%T' to `%T' is via virtual base", ! TREE_TYPE (intype), TREE_TYPE (type)); return error_mark_node; } /* This is a reinterpret cast, whose result is unspecified. *************** cp_convert_to_pointer (type, expr, force *** 233,239 **** } else if (TYPE_PTRMEMFUNC_P (type)) { ! cp_error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } --- 217,223 ---- } else if (TYPE_PTRMEMFUNC_P (type)) { ! error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } *************** cp_convert_to_pointer (type, expr, force *** 246,252 **** return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); else if (TYPE_PTRMEMFUNC_P (intype)) { ! cp_error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } --- 230,236 ---- return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); else if (TYPE_PTRMEMFUNC_P (intype)) { ! error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } *************** cp_convert_to_pointer (type, expr, force *** 259,266 **** return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); if (TYPE_PTRMEM_P (type)) ! /* Under the new ABI, a NULL pointer-to-member is represented ! by -1, not by zero. */ expr = build_int_2 (-1, -1); else expr = build_int_2 (0, 0); --- 243,250 ---- return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); if (TYPE_PTRMEM_P (type)) ! /* A NULL pointer-to-member is represented by -1, not by ! zero. */ expr = build_int_2 (-1, -1); else expr = build_int_2 (0, 0); *************** cp_convert_to_pointer (type, expr, force *** 283,291 **** } if (type_unknown_p (expr)) ! return instantiate_type (type, expr, itf_complain); ! cp_error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } --- 267,275 ---- } if (type_unknown_p (expr)) ! return instantiate_type (type, expr, tf_error | tf_warning); ! error ("cannot convert `%E' from type `%T' to type `%T'", expr, intype, type); return error_mark_node; } *************** convert_to_pointer_force (type, expr) *** 319,352 **** && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE) { enum tree_code code = PLUS_EXPR; ! tree path; ! int distance = get_base_distance (TREE_TYPE (type), ! TREE_TYPE (intype), 0, &path); ! if (distance == -2) { ! cp_error ("type `%T' is ambiguous base of `%T'", ! TREE_TYPE (type), ! TREE_TYPE (intype)); ! return error_mark_node; } ! if (distance == -1) { ! distance = get_base_distance (TREE_TYPE (intype), ! TREE_TYPE (type), 0, &path); ! if (distance == -2) ! { ! cp_error ("type `%T' is ambiguous base of `%T'", ! TREE_TYPE (intype), ! TREE_TYPE (type)); ! return error_mark_node; ! } ! if (distance < 0) ! /* Doesn't need any special help from us. */ ! return build1 (NOP_EXPR, type, expr); ! ! code = MINUS_EXPR; } ! return build_vbase_path (code, type, expr, path, 0); } } --- 303,334 ---- && 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_ignore, NULL); ! if (!binfo) { ! binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype), ! ba_ignore, NULL); ! code = MINUS_EXPR; } ! if (binfo == error_mark_node) ! return error_mark_node; ! if (binfo) { ! expr = build_base_path (code, expr, binfo, 0); ! /* Add any qualifier conversions. */ ! if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)), ! TREE_TYPE (type))) ! { ! expr = build1 (NOP_EXPR, type, expr); ! TREE_CONSTANT (expr) = ! TREE_CONSTANT (TREE_OPERAND (expr, 0)); ! } ! return expr; } ! } } *************** convert_to_pointer_force (type, expr) *** 358,368 **** 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. */ static tree ! build_up_reference (type, arg, flags) ! tree type, arg; int flags; { tree rval; --- 340,351 ---- 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 (type, arg, flags, decl) ! tree type, arg, decl; int flags; { tree rval; *************** build_up_reference (type, arg, flags) *** 374,388 **** if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg)) { ! /* Create a new temporary variable. */ tree targ = arg; ! if (toplevel_bindings_p ()) ! arg = get_temp_name (argtype); else { maybe_push_cleanup_level (argtype); ! arg = pushdecl (build_decl (VAR_DECL, NULL_TREE, argtype)); ! DECL_ARTIFICIAL (arg) = 1; } /* Process the initializer for the declaration. */ --- 357,384 ---- 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 = build_decl (VAR_DECL, NULL_TREE, argtype); ! DECL_ARTIFICIAL (arg) = 1; ! TREE_USED (arg) = 1; ! TREE_STATIC (arg) = TREE_STATIC (decl); ! ! if (TREE_STATIC (decl)) ! { ! /* Namespace-scope or local static; give it a mangled name. */ ! tree name = mangle_ref_init_variable (decl); ! DECL_NAME (arg) = name; ! SET_DECL_ASSEMBLER_NAME (arg, name); ! arg = pushdecl_top_level (arg); ! } else { + /* Automatic; make sure we handle the cleanup properly. */ maybe_push_cleanup_level (argtype); ! arg = pushdecl (arg); } /* Process the initializer for the declaration. */ *************** build_up_reference (type, arg, flags) *** 393,399 **** 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 it's address, transform all occurrences of the register, into a memory reference we could win better. */ rval = build_unary_op (ADDR_EXPR, arg, 1); --- 389,395 ---- 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 = build_unary_op (ADDR_EXPR, arg, 1); *************** build_up_reference (type, arg, flags) *** 405,417 **** && IS_AGGR_TYPE (argtype) && IS_AGGR_TYPE (target_type)) { ! /* We go through get_binfo for the access control. */ ! tree binfo = get_binfo (target_type, argtype, 1); if (binfo == error_mark_node) return error_mark_node; if (binfo == NULL_TREE) return error_not_base_type (target_type, argtype); ! rval = convert_pointer_to_real (binfo, rval); } else rval --- 401,413 ---- && IS_AGGR_TYPE (argtype) && IS_AGGR_TYPE (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 *************** warn_ref_binding (reftype, intype, decl) *** 455,461 **** else msg = "conversion to non-const reference type `%#T' from rvalue of type `%T'"; ! cp_pedwarn (msg, reftype, intype); } } --- 451,457 ---- else msg = "conversion to non-const reference type `%#T' from rvalue of type `%T'"; ! pedwarn (msg, reftype, intype); } } *************** convert_to_reference (reftype, expr, con *** 482,496 **** { expr = instantiate_type (type, expr, (flags & LOOKUP_COMPLAIN) ! ? itf_complain : itf_none); if (expr == error_mark_node) return error_mark_node; intype = TREE_TYPE (expr); } ! if (TREE_CODE (intype) == REFERENCE_TYPE) ! my_friendly_abort (364); intype = TYPE_MAIN_VARIANT (intype); --- 478,491 ---- { expr = instantiate_type (type, expr, (flags & LOOKUP_COMPLAIN) ! ? tf_error | tf_warning : tf_none); if (expr == error_mark_node) return error_mark_node; intype = TREE_TYPE (expr); } ! my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364); intype = TYPE_MAIN_VARIANT (intype); *************** convert_to_reference (reftype, expr, con *** 527,537 **** if (! (convtype & CONV_CONST) && !at_least_as_qualified_p (ttl, ttr)) ! cp_pedwarn ("conversion from `%T' to `%T' discards qualifiers", ttr, reftype); } ! return build_up_reference (reftype, expr, flags); } else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr)) { --- 522,532 ---- if (! (convtype & CONV_CONST) && !at_least_as_qualified_p (ttl, ttr)) ! pedwarn ("conversion from `%T' to `%T' discards qualifiers", ttr, reftype); } ! return build_up_reference (reftype, expr, flags, decl); } else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr)) { *************** convert_to_reference (reftype, expr, con *** 545,551 **** if (TREE_CODE (intype) == POINTER_TYPE && (comptypes (TREE_TYPE (intype), type, COMPARE_BASE | COMPARE_RELAXED ))) ! cp_warning ("casting `%T' to `%T' does not dereference pointer", intype, reftype); rval = build_unary_op (ADDR_EXPR, expr, 0); --- 540,546 ---- if (TREE_CODE (intype) == POINTER_TYPE && (comptypes (TREE_TYPE (intype), type, COMPARE_BASE | COMPARE_RELAXED ))) ! warning ("casting `%T' to `%T' does not dereference pointer", intype, reftype); rval = build_unary_op (ADDR_EXPR, expr, 0); *************** convert_to_reference (reftype, expr, con *** 562,568 **** if (rval == NULL_TREE || rval == error_mark_node) return rval; warn_ref_binding (reftype, intype, decl); ! rval = build_up_reference (reftype, rval, flags); } if (rval) --- 557,563 ---- 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) *************** convert_to_reference (reftype, expr, con *** 574,580 **** my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189); if (flags & LOOKUP_COMPLAIN) ! cp_error ("cannot convert type `%T' to type `%T'", intype, reftype); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; --- 569,575 ---- my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189); if (flags & LOOKUP_COMPLAIN) ! error ("cannot convert type `%T' to type `%T'", intype, reftype); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; *************** convert_from_reference (val) *** 594,600 **** if (TREE_CODE (type) == OFFSET_TYPE) type = TREE_TYPE (type); if (TREE_CODE (type) == REFERENCE_TYPE) ! return build_indirect_ref (val, NULL_PTR); return val; } --- 589,595 ---- if (TREE_CODE (type) == OFFSET_TYPE) type = TREE_TYPE (type); if (TREE_CODE (type) == REFERENCE_TYPE) ! return build_indirect_ref (val, NULL); return val; } *************** convert_lvalue (totype, expr) *** 612,698 **** return convert_from_reference (expr); } - /* Call this when we know (for any reason) that expr is not, in fact, - zero. This routine is like convert_pointer_to, but it pays - attention to which specific instance of what type we want to - convert to. This routine should eventually become - convert_to_pointer after all references to convert_to_pointer - are removed. */ - - tree - convert_pointer_to_real (binfo, expr) - tree binfo, expr; - { - register tree intype = TREE_TYPE (expr); - tree ptr_type; - tree type, rval; - - if (intype == error_mark_node) - return error_mark_node; - - if (TREE_CODE (binfo) == TREE_VEC) - type = BINFO_TYPE (binfo); - else if (IS_AGGR_TYPE (binfo)) - { - type = binfo; - } - else - { - type = binfo; - binfo = NULL_TREE; - } - - ptr_type = cp_build_qualified_type (type, - CP_TYPE_QUALS (TREE_TYPE (intype))); - ptr_type = build_pointer_type (ptr_type); - if (same_type_p (ptr_type, TYPE_MAIN_VARIANT (intype))) - return expr; - - my_friendly_assert (!integer_zerop (expr), 191); - - intype = TYPE_MAIN_VARIANT (TREE_TYPE (intype)); - if (TREE_CODE (type) == RECORD_TYPE - && TREE_CODE (intype) == RECORD_TYPE - && type != intype) - { - tree path; - int distance - = get_base_distance (binfo, intype, 0, &path); - - /* This function shouldn't be called with unqualified arguments - but if it is, give them an error message that they can read. */ - if (distance < 0) - { - cp_error ("cannot convert a pointer of type `%T' to a pointer of type `%T'", - intype, type); - - if (distance == -2) - cp_error ("because `%T' is an ambiguous base class", type); - return error_mark_node; - } - - return build_vbase_path (PLUS_EXPR, ptr_type, expr, path, 1); - } - rval = build1 (NOP_EXPR, ptr_type, - TREE_CODE (expr) == NOP_EXPR ? TREE_OPERAND (expr, 0) : expr); - TREE_CONSTANT (rval) = TREE_CONSTANT (expr); - return rval; - } - - /* Call this when we know (for any reason) that expr is - not, in fact, zero. This routine gets a type out of the first - argument and uses it to search for the type to convert to. If there - is more than one instance of that type in the expr, the conversion is - ambiguous. This routine should eventually go away, and all - callers should use convert_to_pointer_real. */ - - tree - convert_pointer_to (binfo, expr) - tree binfo, expr; - { - return convert_pointer_to_real (binfo, expr); - } - /* C++ conversions, preference to static cast conversions. */ tree --- 607,612 ---- *************** ocp_convert (type, expr, convtype, flags *** 772,778 **** && ((ARITHMETIC_TYPE_P (intype) && ! (convtype & CONV_STATIC)) || (TREE_CODE (intype) == POINTER_TYPE))) { ! cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type); if (flag_pedantic_errors) return error_mark_node; --- 686,692 ---- && ((ARITHMETIC_TYPE_P (intype) && ! (convtype & CONV_STATIC)) || (TREE_CODE (intype) == POINTER_TYPE))) { ! pedwarn ("conversion from `%#T' to `%#T'", intype, type); if (flag_pedantic_errors) return error_mark_node; *************** ocp_convert (type, expr, convtype, flags *** 784,790 **** if (rval) return rval; if (flags & LOOKUP_COMPLAIN) ! cp_error ("`%#T' used where a `%T' was expected", intype, type); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; return error_mark_node; --- 698,704 ---- if (rval) return rval; if (flags & LOOKUP_COMPLAIN) ! error ("`%#T' used where a `%T' was expected", intype, type); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; return error_mark_node; *************** ocp_convert (type, expr, convtype, flags *** 800,807 **** else if (TREE_CODE (expr) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL) fn = TREE_OPERAND (expr, 0); ! if (fn) ! cp_warning ("the address of `%D', will always be `true'", fn); return cp_truthvalue_conversion (e); } return fold (convert_to_integer (type, e)); --- 714,721 ---- else if (TREE_CODE (expr) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL) fn = TREE_OPERAND (expr, 0); ! if (fn && !DECL_WEAK (fn)) ! warning ("the address of `%D', will always be `true'", fn); return cp_truthvalue_conversion (e); } return fold (convert_to_integer (type, e)); *************** ocp_convert (type, expr, convtype, flags *** 821,827 **** return rval; else if (flags & LOOKUP_COMPLAIN) ! cp_error ("`%#T' used where a floating point value was expected", TREE_TYPE (e)); } if (code == REAL_TYPE) --- 735,741 ---- return rval; else if (flags & LOOKUP_COMPLAIN) ! error ("`%#T' used where a floating point value was expected", TREE_TYPE (e)); } if (code == REAL_TYPE) *************** ocp_convert (type, expr, convtype, flags *** 876,882 **** return e; if (flags & LOOKUP_COMPLAIN) ! cp_error ("conversion from `%T' to non-scalar type `%T' requested", TREE_TYPE (expr), type); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; --- 790,796 ---- return e; if (flags & LOOKUP_COMPLAIN) ! error ("conversion from `%T' to non-scalar type `%T' requested", TREE_TYPE (expr), type); if (flags & LOOKUP_SPECULATIVELY) return NULL_TREE; *************** convert_to_void (expr, implicit) *** 922,931 **** tree new_op1 = convert_to_void (op1, implicit); tree new_op2 = convert_to_void (op2, implicit); ! if (new_op1 != op1 || new_op2 != op2) ! expr = build (COND_EXPR, ! implicit ? TREE_TYPE (expr) : void_type_node, ! TREE_OPERAND (expr, 0), new_op1, new_op2); break; } --- 836,843 ---- tree new_op1 = convert_to_void (op1, implicit); tree new_op2 = convert_to_void (op2, implicit); ! expr = build (COND_EXPR, TREE_TYPE (new_op1), ! TREE_OPERAND (expr, 0), new_op1, new_op2); break; } *************** convert_to_void (expr, implicit) *** 940,945 **** --- 852,858 ---- tree t = build (COMPOUND_EXPR, TREE_TYPE (new_op1), TREE_OPERAND (expr, 0), new_op1); TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (expr); + TREE_NO_UNUSED_WARNING (t) = TREE_NO_UNUSED_WARNING (expr); expr = t; } *************** convert_to_void (expr, implicit) *** 963,972 **** int is_complete = COMPLETE_TYPE_P (complete_type (type)); if (is_volatile && !is_complete) ! cp_warning ("object of incomplete type `%T' will not be accessed in %s", type, implicit ? implicit : "void context"); else if (is_reference && is_volatile) ! cp_warning ("object of type `%T' will not be accessed in %s", TREE_TYPE (TREE_OPERAND (expr, 0)), implicit ? implicit : "void context"); if (is_reference || !is_volatile || !is_complete) --- 876,885 ---- int is_complete = COMPLETE_TYPE_P (complete_type (type)); if (is_volatile && !is_complete) ! warning ("object of incomplete type `%T' will not be accessed in %s", type, implicit ? implicit : "void context"); else if (is_reference && is_volatile) ! warning ("object of type `%T' will not be accessed in %s", TREE_TYPE (TREE_OPERAND (expr, 0)), implicit ? implicit : "void context"); if (is_reference || !is_volatile || !is_complete) *************** convert_to_void (expr, implicit) *** 982,988 **** int is_complete = COMPLETE_TYPE_P (complete_type (type)); if (TYPE_VOLATILE (type) && !is_complete) ! cp_warning ("object `%E' of incomplete type `%T' will not be accessed in %s", expr, type, implicit ? implicit : "void context"); break; } --- 895,901 ---- int is_complete = COMPLETE_TYPE_P (complete_type (type)); if (TYPE_VOLATILE (type) && !is_complete) ! warning ("object `%E' of incomplete type `%T' will not be accessed in %s", expr, type, implicit ? implicit : "void context"); break; } *************** convert_to_void (expr, implicit) *** 1002,1013 **** { /* [over.over] enumerates the places where we can take the address of an overloaded function, and this is not one of them. */ ! cp_pedwarn ("%s cannot resolve address of overloaded function", implicit ? implicit : "void cast"); } else if (implicit && probe == expr && is_overloaded_fn (probe)) /* Only warn when there is no &. */ ! cp_warning ("%s is a reference, not call, to function `%E'", implicit, expr); } --- 915,926 ---- { /* [over.over] enumerates the places where we can take the address of an overloaded function, and this is not one of them. */ ! pedwarn ("%s cannot resolve address of overloaded function", implicit ? implicit : "void cast"); } else if (implicit && probe == expr && is_overloaded_fn (probe)) /* Only warn when there is no &. */ ! warning ("%s is a reference, not call, to function `%E'", implicit, expr); } *************** build_expr_type_conversion (desires, exp *** 1145,1151 **** if (expr == null_node && (desires & WANT_INT) && !(desires & WANT_NULL)) ! cp_warning ("converting NULL to non-pointer type"); if (TREE_CODE (expr) == OFFSET_REF) expr = resolve_offset_ref (expr); --- 1058,1064 ---- if (expr == null_node && (desires & WANT_INT) && !(desires & WANT_NULL)) ! warning ("converting NULL to non-pointer type"); if (TREE_CODE (expr) == OFFSET_REF) expr = resolve_offset_ref (expr); *************** build_expr_type_conversion (desires, exp *** 1221,1229 **** { if (complain) { ! cp_error ("ambiguous default type conversion from `%T'", basetype); ! cp_error (" candidate conversions include `%D' and `%D'", winner, cand); } return error_mark_node; --- 1134,1142 ---- { if (complain) { ! error ("ambiguous default type conversion from `%T'", basetype); ! error (" candidate conversions include `%D' and `%D'", winner, cand); } return error_mark_node; *************** type_promotes_to (type) *** 1255,1261 **** if (type == error_mark_node) return error_mark_node; ! type_quals = CP_TYPE_QUALS (type); type = TYPE_MAIN_VARIANT (type); /* bool always promotes to int (not unsigned), even if it's the same --- 1168,1174 ---- if (type == error_mark_node) return error_mark_node; ! type_quals = cp_type_quals (type); type = TYPE_MAIN_VARIANT (type); /* bool always promotes to int (not unsigned), even if it's the same diff -Nrc3pad gcc-3.0.4/gcc/cp/decl.c gcc-3.1/gcc/cp/decl.c *** gcc-3.0.4/gcc/cp/decl.c Mon Feb 18 02:44:54 2002 --- gcc-3.1/gcc/cp/decl.c Fri May 3 18:55:23 2002 *************** *** 1,6 **** /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 35,40 **** --- 35,41 ---- #include "expr.h" #include "flags.h" #include "cp-tree.h" + #include "tree-inline.h" #include "decl.h" #include "lex.h" #include "output.h" *************** Boston, MA 02111-1307, USA. */ *** 43,60 **** #include "../hash.h" #include "ggc.h" #include "tm_p.h" ! extern int current_class_depth; ! ! extern tree global_namespace; ! ! extern int (*valid_lang_attribute) PARAMS ((tree, tree, tree, tree)); ! ! #ifndef BOOL_TYPE_SIZE ! /* In the new ABI, `bool' has size and alignment `1', on all ! platforms. */ ! #define BOOL_TYPE_SIZE CHAR_TYPE_SIZE ! #endif static tree grokparms PARAMS ((tree)); static const char *redeclaration_error_message PARAMS ((tree, tree)); --- 44,55 ---- #include "../hash.h" #include "ggc.h" #include "tm_p.h" + #include "target.h" + #include "c-common.h" + #include "c-pragma.h" + #include "diagnostic.h" ! extern const struct attribute_spec *lang_attribute_table; static tree grokparms PARAMS ((tree)); static const char *redeclaration_error_message PARAMS ((tree, tree)); *************** static tree grokfndecl PARAMS ((tree, tr *** 82,92 **** --- 77,90 ---- enum overload_flags, tree, tree, int, int, int, int, int, int, tree)); static tree grokvardecl PARAMS ((tree, tree, RID_BIT_TYPE *, int, int, tree)); + static tree follow_tag_typedef PARAMS ((tree)); static tree lookup_tag PARAMS ((enum tree_code, tree, struct binding_level *, int)); static void set_identifier_type_value_with_scope PARAMS ((tree, tree, struct binding_level *)); static void record_unknown_type PARAMS ((tree, const char *)); + static tree builtin_function_1 PARAMS ((const char *, tree, tree, int, + enum built_in_class, const char *)); static tree build_library_fn_1 PARAMS ((tree, enum tree_code, tree)); static int member_function_or_else PARAMS ((tree, tree, enum overload_flags)); static void bad_specifiers PARAMS ((tree, const char *, int, int, int, int, *************** static void mark_lang_function PARAMS (( *** 135,148 **** static void save_function_data PARAMS ((tree)); static void check_function_type PARAMS ((tree, tree)); static void destroy_local_var PARAMS ((tree)); static void finish_constructor_body PARAMS ((void)); static void finish_destructor_body PARAMS ((void)); static tree create_array_type_for_decl PARAMS ((tree, tree, tree)); static tree get_atexit_node PARAMS ((void)); static tree get_dso_handle_node PARAMS ((void)); static tree start_cleanup_fn PARAMS ((void)); static void end_cleanup_fn PARAMS ((void)); ! static tree cp_make_fname_decl PARAMS ((tree, const char *, int)); static void initialize_predefined_identifiers PARAMS ((void)); static tree check_special_function_return_type PARAMS ((special_function_kind, tree, tree)); --- 133,148 ---- static void save_function_data PARAMS ((tree)); static void check_function_type PARAMS ((tree, tree)); static void destroy_local_var PARAMS ((tree)); + static void begin_constructor_body PARAMS ((void)); static void finish_constructor_body PARAMS ((void)); + static void begin_destructor_body PARAMS ((void)); static void finish_destructor_body PARAMS ((void)); static tree create_array_type_for_decl PARAMS ((tree, tree, tree)); static tree get_atexit_node PARAMS ((void)); static tree get_dso_handle_node PARAMS ((void)); static tree start_cleanup_fn PARAMS ((void)); static void end_cleanup_fn PARAMS ((void)); ! static tree cp_make_fname_decl PARAMS ((tree, int)); static void initialize_predefined_identifiers PARAMS ((void)); static tree check_special_function_return_type PARAMS ((special_function_kind, tree, tree)); *************** tree error_mark_list; *** 166,193 **** tree vtable_entry_type; tree delta_type_node; - #if 0 - Old rtti stuff. - tree __baselist_desc_type_node; - tree __i_desc_type_node, __m_desc_type_node; - tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type; - #endif tree __t_desc_type_node; - #if 0 - tree __tp_desc_type_node; - #endif tree ti_desc_type_node; tree bltn_desc_type_node, ptr_desc_type_node; tree ary_desc_type_node, func_desc_type_node, enum_desc_type_node; tree class_desc_type_node, si_class_desc_type_node, vmi_class_desc_type_node; tree ptm_desc_type_node; tree base_desc_type_node; - #if 0 - Not needed yet? May be needed one day? - tree __bltn_desc_array_type, __user_desc_array_type, __class_desc_array_type; - tree __ptr_desc_array_type, __attr_dec_array_type, __func_desc_array_type; - tree __ptmf_desc_array_type, __ptmd_desc_array_type; - #endif tree class_type_node, record_type_node, union_type_node, enum_type_node; tree unknown_type_node; --- 166,178 ---- *************** tree cp_global_trees[CPTI_MAX]; *** 225,235 **** static tree global_type_node; - /* If non-zero, this is the number of times we have entered the `std' - namespace when we are treating that namespace as an alias for the - global namespace. */ - static int in_fake_std; - /* Expect only namespace names now. */ static int only_namespace_names; --- 210,215 ---- *************** tree static_aggregates; *** 262,275 **** tree integer_two_node, integer_three_node; - /* Parsing a function declarator leaves here a chain of structure - and enum types declared in the parmlist. */ - - static tree last_function_parm_tags; - /* Similar, for last_function_parm_tags. */ tree last_function_parms; - static tree current_function_parm_tags; /* 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 --- 242,249 ---- *************** struct named_label_list *** 289,301 **** #define named_labels cp_function_chain->x_named_labels - /* Set to 0 at beginning of a function definition, and whenever - a label (case or named) is defined. Set to value of expression - returned from function when that value can be transformed into - a named return value. */ - - tree current_function_return_value; - /* Nonzero means use the ISO C94 dialect of C. */ int flag_isoc94; --- 263,268 ---- *************** extern int flag_conserve_space; *** 321,330 **** /* C and C++ flags are in decl2.c. */ - /* Flag used when debugging spew.c */ - - extern int spew_debug; - /* A expression of value 0 with the same precision as a sizetype node, but signed. */ tree signed_size_zero_node; --- 288,293 ---- *************** tree anonymous_namespace_name; *** 337,342 **** --- 300,322 ---- (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; + + /* 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 + }; + + static enum deprecated_states deprecated_state = DEPRECATED_NORMAL; + + /* Set by add_implicitly_declared_members() to keep those members from + being flagged as deprecated or reported as using deprecated + types. */ + int adding_implicit_members = 0; /* For each binding contour we allocate a binding_level structure which records the names defined in that contour. *************** struct binding_level *** 414,423 **** /* The binding level which this one is contained in (inherits from). */ struct binding_level *level_chain; - /* List of decls in `names' that have incomplete - structure or union types. */ - tree incomplete; - /* List of VAR_DECLS saved from a previous for statement. These would be dead in ISO-conforming code, but might be referenced in ARM-era code. These are stored in a --- 394,399 ---- *************** static struct binding_level *global_bind *** 500,505 **** --- 476,487 ---- static int keep_next_level_flag; + /* A TREE_LIST of VAR_DECLs. The TREE_PURPOSE is a RECORD_TYPE or + UNION_TYPE; the TREE_VALUE is a VAR_DECL with that type. At the + time the VAR_DECL was declared, the type was incomplete. */ + + static tree incomplete_vars; + #if defined(DEBUG_CP_BINDING_LEVELS) static int binding_depth = 0; static int is_class_level = 0; *************** pop_binding_level () *** 563,569 **** { /* Cannot pop a level, if there are none left to pop. */ if (current_binding_level == global_binding_level) ! my_friendly_abort (123); } /* Pop the current level, and free the structure for reuse. */ #if defined(DEBUG_CP_BINDING_LEVELS) --- 545,551 ---- { /* Cannot pop a level, if there are none left to pop. */ if (current_binding_level == global_binding_level) ! abort (); } /* Pop the current level, and free the structure for reuse. */ #if defined(DEBUG_CP_BINDING_LEVELS) *************** suspend_binding_level () *** 602,608 **** { /* Cannot suspend a level, if there are none left to suspend. */ if (current_binding_level == global_binding_level) ! my_friendly_abort (123); } /* Suspend the current level. */ #if defined(DEBUG_CP_BINDING_LEVELS) --- 584,590 ---- { /* Cannot suspend a level, if there are none left to suspend. */ if (current_binding_level == global_binding_level) ! abort (); } /* Suspend the current level. */ #if defined(DEBUG_CP_BINDING_LEVELS) *************** pushlevel (tag_transparent) *** 861,867 **** newlevel = make_binding_level (); push_binding_level (newlevel, tag_transparent, keep_next_level_flag); - GNU_xref_start_scope ((HOST_WIDE_INT) newlevel); keep_next_level_flag = 0; } --- 843,848 ---- *************** begin_scope (sk) *** 903,909 **** break; default: ! my_friendly_abort (20000309); } } --- 884,890 ---- break; default: ! abort (); } } *************** note_level_for_catch () *** 940,946 **** /* For a binding between a name and an entity at a block scope, this is the `struct binding_level' for the block. */ #define BINDING_LEVEL(NODE) \ ! (((struct tree_binding*)NODE)->scope.level) /* A free list of CPLUS_BINDING nodes, connected by their TREE_CHAINs. */ --- 921,927 ---- /* For a binding between a name and an entity at a block scope, this is the `struct binding_level' for the block. */ #define BINDING_LEVEL(NODE) \ ! (((struct tree_binding*)(NODE))->scope.level) /* A free list of CPLUS_BINDING nodes, connected by their TREE_CHAINs. */ *************** add_binding (id, decl) *** 1016,1023 **** else if (TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL && TREE_CODE (decl) == TYPE_DECL && DECL_NAME (decl) == DECL_NAME (BINDING_VALUE (binding)) ! && same_type_p (TREE_TYPE (decl), ! TREE_TYPE (BINDING_VALUE (binding)))) /* We have two typedef-names, both naming the same type to have the same name. This is OK because of: --- 997,1008 ---- else if (TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL && TREE_CODE (decl) == TYPE_DECL && DECL_NAME (decl) == DECL_NAME (BINDING_VALUE (binding)) ! && (same_type_p (TREE_TYPE (decl), ! TREE_TYPE (BINDING_VALUE (binding))) ! /* If either type involves template parameters, we must ! wait until instantiation. */ ! || uses_template_parms (TREE_TYPE (decl)) ! || uses_template_parms (TREE_TYPE (BINDING_VALUE (binding))))) /* We have two typedef-names, both naming the same type to have the same name. This is OK because of: *************** add_binding (id, decl) *** 1039,1045 **** } else { ! cp_error ("declaration of `%#D'", decl); cp_error_at ("conflicts with previous declaration `%#D'", BINDING_VALUE (binding)); ok = 0; --- 1024,1030 ---- } else { ! error ("declaration of `%#D'", decl); cp_error_at ("conflicts with previous declaration `%#D'", BINDING_VALUE (binding)); ok = 0; *************** pop_binding (id, decl) *** 1199,1205 **** else if (BINDING_TYPE (binding) == decl) BINDING_TYPE (binding) = NULL_TREE; else ! my_friendly_abort (0); if (!BINDING_VALUE (binding) && !BINDING_TYPE (binding)) { --- 1184,1190 ---- else if (BINDING_TYPE (binding) == decl) BINDING_TYPE (binding) = NULL_TREE; else ! abort (); if (!BINDING_VALUE (binding) && !BINDING_TYPE (binding)) { *************** poplevel (keep, reverse, functionbody) *** 1316,1326 **** rather than the end. This hack is no longer used. */ my_friendly_assert (keep == 0 || keep == 1, 0); - GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, - (HOST_WIDE_INT) current_binding_level->level_chain, - current_binding_level->parm_flag, - current_binding_level->keep); - if (current_binding_level->keep == 1) keep = 1; --- 1301,1306 ---- *************** poplevel (keep, reverse, functionbody) *** 1503,1509 **** else if (TREE_CODE (decl) == OVERLOAD) pop_binding (DECL_NAME (OVL_FUNCTION (decl)), decl); else ! my_friendly_abort (0); } } --- 1483,1489 ---- else if (TREE_CODE (decl) == OVERLOAD) pop_binding (DECL_NAME (OVL_FUNCTION (decl)), decl); else ! abort (); } } *************** poplevel_class () *** 1742,1752 **** shadowed = TREE_CHAIN (shadowed)) pop_binding (TREE_PURPOSE (shadowed), TREE_TYPE (shadowed)); - GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level, - (HOST_WIDE_INT) class_binding_level->level_chain, - class_binding_level->parm_flag, - class_binding_level->keep); - /* Now, pop out of the binding level which we created up in the `pushlevel_class' routine. */ #if defined(DEBUG_CP_BINDING_LEVELS) --- 1722,1727 ---- *************** walk_namespaces_r (namespace, f, data) *** 1826,1837 **** if (TREE_CODE (current) != NAMESPACE_DECL || DECL_NAMESPACE_ALIAS (current)) continue; - if (!DECL_LANG_SPECIFIC (current)) - { - /* Hmm. std. */ - my_friendly_assert (current == fake_std_node, 393); - continue; - } /* We found a namespace. */ result |= walk_namespaces_r (current, f, data); --- 1801,1806 ---- *************** mark_binding_level (arg) *** 1986,1992 **** ggc_mark_tree (lvl->shadowed_labels); ggc_mark_tree (lvl->blocks); ggc_mark_tree (lvl->this_class); - ggc_mark_tree (lvl->incomplete); ggc_mark_tree (lvl->dead_vars_from_for); } } --- 1955,1960 ---- *************** print_binding_level (lvl) *** 2024,2031 **** int i = 0, len; fprintf (stderr, " blocks="); fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks); - fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d", - list_length (lvl->incomplete), lvl->parm_flag, lvl->keep); if (lvl->tag_transparent) fprintf (stderr, " tag-transparent"); if (lvl->more_cleanups_ok) --- 1992,1997 ---- *************** push_namespace (name) *** 2311,2323 **** need_new = 0; implicit_use = 1; } - else if (current_namespace == global_namespace - && !flag_honor_std - && name == std_identifier) - { - in_fake_std++; - return; - } else { /* Check whether this is an extended namespace definition. */ --- 2277,2282 ---- *************** push_namespace (name) *** 2327,2333 **** need_new = 0; if (DECL_NAMESPACE_ALIAS (d)) { ! cp_error ("namespace alias `%D' not allowed here, assuming `%D'", d, DECL_NAMESPACE_ALIAS (d)); d = DECL_NAMESPACE_ALIAS (d); } --- 2286,2292 ---- need_new = 0; if (DECL_NAMESPACE_ALIAS (d)) { ! error ("namespace alias `%D' not allowed here, assuming `%D'", d, DECL_NAMESPACE_ALIAS (d)); d = DECL_NAMESPACE_ALIAS (d); } *************** push_namespace (name) *** 2363,2374 **** void pop_namespace () { ! if (current_namespace == global_namespace) ! { ! my_friendly_assert (in_fake_std > 0, 980421); ! in_fake_std--; ! return; ! } current_namespace = CP_DECL_CONTEXT (current_namespace); /* The binding level is not popped, as it might be re-opened later. */ suspend_binding_level (); --- 2322,2328 ---- void pop_namespace () { ! my_friendly_assert (current_namespace != global_namespace, 20010801); current_namespace = CP_DECL_CONTEXT (current_namespace); /* The binding level is not popped, as it might be re-opened later. */ suspend_binding_level (); *************** mark_saved_scope (arg) *** 2426,2431 **** --- 2380,2386 ---- mark_binding_level (&t->class_bindings); ggc_mark_tree (t->old_bindings); ggc_mark_tree (t->old_namespace); + ggc_mark_tree (t->decl_ns_list); ggc_mark_tree (t->class_name); ggc_mark_tree (t->class_type); ggc_mark_tree (t->access_specifier); *************** mark_saved_scope (arg) *** 2437,2443 **** ggc_mark_tree (t->x_previous_class_type); ggc_mark_tree (t->x_previous_class_values); ggc_mark_tree (t->x_saved_tree); - ggc_mark_tree (t->incomplete); ggc_mark_tree (t->lookups); mark_stmt_tree (&t->x_stmt_tree); --- 2392,2397 ---- *************** maybe_push_to_top_level (pseudo) *** 2543,2553 **** s->bindings = b; s->need_pop_function_context = need_pop; s->function_decl = current_function_decl; scope_chain = s; current_function_decl = NULL_TREE; VARRAY_TREE_INIT (current_lang_base, 10, "current_lang_base"); - current_lang_stack = &VARRAY_TREE (current_lang_base, 0); current_lang_name = lang_name_cplusplus; current_namespace = global_namespace; } --- 2497,2507 ---- s->bindings = b; s->need_pop_function_context = need_pop; s->function_decl = current_function_decl; + s->last_parms = last_function_parms; scope_chain = s; current_function_decl = NULL_TREE; VARRAY_TREE_INIT (current_lang_base, 10, "current_lang_base"); current_lang_name = lang_name_cplusplus; current_namespace = global_namespace; } *************** pop_from_top_level () *** 2585,2590 **** --- 2539,2545 ---- if (s->need_pop_function_context) pop_function_context_from (NULL_TREE); current_function_decl = s->function_decl; + last_function_parms = s->last_parms; free (s); } *************** static void *** 3083,3091 **** warn_extern_redeclared_static (newdecl, olddecl) tree newdecl, olddecl; { ! static const char *explicit_extern_static_warning = "`%D' was declared `extern' and later `static'"; ! static const char *implicit_extern_static_warning = "`%D' was declared implicitly `extern' and later `static'"; tree name; --- 3038,3046 ---- warn_extern_redeclared_static (newdecl, olddecl) tree newdecl, olddecl; { ! static const char *const explicit_extern_static_warning = "`%D' was declared `extern' and later `static'"; ! static const char *const implicit_extern_static_warning = "`%D' was declared implicitly `extern' and later `static'"; tree name; *************** warn_extern_redeclared_static (newdecl, *** 3112,3118 **** return; name = DECL_ASSEMBLER_NAME (newdecl); ! cp_pedwarn (IDENTIFIER_IMPLICIT_DECL (name) ? implicit_extern_static_warning : explicit_extern_static_warning, newdecl); cp_pedwarn_at ("previous declaration of `%D'", olddecl); --- 3067,3073 ---- return; name = DECL_ASSEMBLER_NAME (newdecl); ! pedwarn (IDENTIFIER_IMPLICIT_DECL (name) ? implicit_extern_static_warning : explicit_extern_static_warning, newdecl); cp_pedwarn_at ("previous declaration of `%D'", olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3147,3165 **** || TREE_TYPE (olddecl) == error_mark_node) types_match = 1; /* Check for redeclaration and other discrepancies. */ if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_ARTIFICIAL (olddecl)) { if (TREE_CODE (newdecl) != FUNCTION_DECL) { /* 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)) { if (warn_shadow) ! cp_warning ("shadowing %s function `%#D'", DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); /* Discard the old built-in function. */ --- 3102,3157 ---- || TREE_TYPE (olddecl) == error_mark_node) types_match = 1; + 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_with_decl (newdecl, + "function `%s' redeclared as inline"); + warning_with_decl (olddecl, + "previous declaration of function `%s' with attribute noinline"); + } + else if (DECL_DECLARED_INLINE_P (olddecl) + && DECL_UNINLINABLE (newdecl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) + { + warning_with_decl (newdecl, + "function `%s' redeclared with attribute noinline"); + warning_with_decl (olddecl, + "previous declaration of function `%s' was inline"); + } + } + /* Check for redeclaration and other discrepancies. */ if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_ARTIFICIAL (olddecl)) { if (TREE_CODE (newdecl) != FUNCTION_DECL) { + /* Avoid warnings redeclaring anticipated built-ins. */ + if (DECL_ANTICIPATED (olddecl)) + return 0; + /* If you declare a built-in or predefined function name as static, the old definition is overridden, but optionally warn this was a bad choice of name. */ if (! TREE_PUBLIC (newdecl)) { if (warn_shadow) ! warning ("shadowing %s function `%#D'", DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); /* Discard the old built-in function. */ *************** duplicate_decls (newdecl, olddecl) *** 3168,3186 **** /* If the built-in is not ansi, then programs can override it even globally without an error. */ else if (! DECL_BUILT_IN (olddecl)) ! cp_warning ("library function `%#D' redeclared as non-function `%#D'", olddecl, newdecl); else { ! cp_error ("declaration of `%#D'", newdecl); ! cp_error ("conflicts with built-in declaration `%#D'", olddecl); } return 0; } else if (!types_match) { ! if ((DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl)) || compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) --- 3160,3181 ---- /* If the built-in is not ansi, then programs can override it even globally without an error. */ else if (! DECL_BUILT_IN (olddecl)) ! warning ("library function `%#D' redeclared as non-function `%#D'", olddecl, newdecl); else { ! error ("declaration of `%#D'", newdecl); ! error ("conflicts with built-in declaration `%#D'", olddecl); } return 0; } else if (!types_match) { ! /* Avoid warnings redeclaring anticipated built-ins. */ ! if (DECL_ANTICIPATED (olddecl)) ! ; /* Do nothing yet. */ ! 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)))) *************** duplicate_decls (newdecl, olddecl) *** 3189,3206 **** if (TREE_PUBLIC (newdecl)) { ! cp_warning ("new declaration `%#D'", newdecl); ! cp_warning ("ambiguates built-in declaration `%#D'", olddecl); } else if (warn_shadow) ! cp_warning ("shadowing %s function `%#D'", DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); } else /* Discard the old built-in function. */ return 0; } if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl)) --- 3184,3204 ---- if (TREE_PUBLIC (newdecl)) { ! warning ("new declaration `%#D'", newdecl); ! warning ("ambiguates built-in declaration `%#D'", olddecl); } else if (warn_shadow) ! warning ("shadowing %s function `%#D'", DECL_BUILT_IN (olddecl) ? "built-in" : "library", olddecl); } else /* Discard the old built-in function. */ return 0; + + /* Replace the old RTL to avoid problems with inlining. */ + SET_DECL_RTL (olddecl, DECL_RTL (newdecl)); } if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl)) *************** duplicate_decls (newdecl, olddecl) *** 3215,3223 **** will be banished. */ SET_DECL_LANGUAGE (olddecl, DECL_LANGUAGE (newdecl)); SET_DECL_RTL (olddecl, DECL_RTL (newdecl)); - COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); - SET_IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (newdecl), - newdecl); } } else if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) --- 3213,3218 ---- *************** duplicate_decls (newdecl, olddecl) *** 3246,3252 **** && DECL_FUNCTION_TEMPLATE_P (newdecl))) return 0; ! cp_error ("`%#D' redeclared as different kind of symbol", newdecl); if (TREE_CODE (olddecl) == TREE_LIST) olddecl = TREE_VALUE (olddecl); cp_error_at ("previous declaration of `%#D'", olddecl); --- 3241,3247 ---- && DECL_FUNCTION_TEMPLATE_P (newdecl))) return 0; ! error ("`%#D' redeclared as different kind of symbol", newdecl); if (TREE_CODE (olddecl) == TREE_LIST) olddecl = TREE_VALUE (olddecl); cp_error_at ("previous declaration of `%#D'", olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3271,3277 **** if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == TYPE_DECL || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) { ! cp_error ("declaration of template `%#D'", newdecl); cp_error_at ("conflicts with previous declaration `%#D'", olddecl); } --- 3266,3272 ---- if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == TYPE_DECL || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) { ! error ("declaration of template `%#D'", newdecl); cp_error_at ("conflicts with previous declaration `%#D'", olddecl); } *************** duplicate_decls (newdecl, olddecl) *** 3282,3288 **** && comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), DECL_TEMPLATE_PARMS (olddecl))) { ! cp_error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } return 0; --- 3277,3283 ---- && comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), DECL_TEMPLATE_PARMS (olddecl))) { ! error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } return 0; *************** duplicate_decls (newdecl, olddecl) *** 3291,3304 **** { if (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl)) { ! cp_error ("declaration of C function `%#D' conflicts with", newdecl); cp_error_at ("previous declaration `%#D' here", olddecl); } else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) { ! cp_error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } else --- 3286,3299 ---- { if (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl)) { ! error ("declaration of C function `%#D' conflicts with", newdecl); cp_error_at ("previous declaration `%#D' here", olddecl); } else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) { ! error ("new declaration `%#D'", newdecl); cp_error_at ("ambiguates old declaration `%#D'", olddecl); } else *************** duplicate_decls (newdecl, olddecl) *** 3309,3315 **** else if (current_class_type == NULL_TREE || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) { ! cp_error ("conflicting types for `%#D'", newdecl); cp_error_at ("previous declaration as `%#D'", olddecl); } } --- 3304,3310 ---- else if (current_class_type == NULL_TREE || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) { ! error ("conflicting types for `%#D'", newdecl); cp_error_at ("previous declaration as `%#D'", olddecl); } } *************** duplicate_decls (newdecl, olddecl) *** 3349,3360 **** const char *errmsg = redeclaration_error_message (newdecl, olddecl); if (errmsg) { ! cp_error (errmsg, newdecl); if (DECL_NAME (olddecl) != NULL_TREE) cp_error_at ((DECL_INITIAL (olddecl) && namespace_bindings_p ()) ? "`%#D' previously defined here" : "`%#D' previously declared here", olddecl); } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_INITIAL (olddecl) != NULL_TREE --- 3344,3356 ---- const char *errmsg = redeclaration_error_message (newdecl, olddecl); if (errmsg) { ! error (errmsg, newdecl); if (DECL_NAME (olddecl) != NULL_TREE) cp_error_at ((DECL_INITIAL (olddecl) && namespace_bindings_p ()) ? "`%#D' previously defined here" : "`%#D' previously declared here", olddecl); + return 0; } else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_INITIAL (olddecl) != NULL_TREE *************** duplicate_decls (newdecl, olddecl) *** 3371,3384 **** /* extern "C" int foo (); int foo () { bar (); } is OK. */ ! if (current_lang_stack ! == &VARRAY_TREE (current_lang_base, 0)) SET_DECL_LANGUAGE (newdecl, DECL_LANGUAGE (olddecl)); else { cp_error_at ("previous declaration of `%#D' with %L linkage", olddecl, DECL_LANGUAGE (olddecl)); ! cp_error ("conflicts with new declaration with %L linkage", DECL_LANGUAGE (newdecl)); } } --- 3367,3379 ---- /* extern "C" int foo (); int foo () { bar (); } is OK. */ ! if (current_lang_depth () == 0) SET_DECL_LANGUAGE (newdecl, DECL_LANGUAGE (olddecl)); else { cp_error_at ("previous declaration of `%#D' with %L linkage", olddecl, DECL_LANGUAGE (olddecl)); ! error ("conflicts with new declaration with %L linkage", DECL_LANGUAGE (newdecl)); } } *************** duplicate_decls (newdecl, olddecl) *** 3401,3417 **** if (1 == simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2))) { ! if (pedantic) ! { ! cp_pedwarn ("default argument given for parameter %d of `%#D'", ! i, newdecl); ! cp_pedwarn_at ("after previous specification in `%#D'", ! olddecl); ! } } else { ! cp_error ("default argument given for parameter %d of `%#D'", i, newdecl); cp_error_at ("after previous specification in `%#D'", olddecl); --- 3396,3409 ---- if (1 == simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2))) { ! pedwarn ("default argument given for parameter %d of `%#D'", ! i, newdecl); ! cp_pedwarn_at ("after previous specification in `%#D'", ! olddecl); } else { ! error ("default argument given for parameter %d of `%#D'", i, newdecl); cp_error_at ("after previous specification in `%#D'", olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3422,3428 **** && ! DECL_DECLARED_INLINE_P (olddecl) && TREE_ADDRESSABLE (olddecl) && warn_inline) { ! cp_warning ("`%#D' was used before it was declared inline", newdecl); cp_warning_at ("previous non-inline declaration here", olddecl); --- 3414,3420 ---- && ! DECL_DECLARED_INLINE_P (olddecl) && TREE_ADDRESSABLE (olddecl) && warn_inline) { ! warning ("`%#D' was used before it was declared inline", newdecl); cp_warning_at ("previous non-inline declaration here", olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3430,3435 **** --- 3422,3439 ---- } } + /* 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 0; + /* If new decl is `static' and an `extern' was seen previously, warn about it. */ warn_extern_redeclared_static (newdecl, olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3468,3476 **** /* 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. */ ! && ! DECL_FRIEND_P (newdecl)) { ! cp_warning ("redundant redeclaration of `%D' in same scope", newdecl); cp_warning_at ("previous declaration of `%D'", olddecl); } } --- 3472,3480 ---- /* 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. */ ! && ! (DECL_FRIEND_P (newdecl) || DECL_FRIEND_P (olddecl))) { ! warning ("redundant redeclaration of `%D' in same scope", newdecl); cp_warning_at ("previous declaration of `%D'", olddecl); } } *************** duplicate_decls (newdecl, olddecl) *** 3494,3501 **** /* Copy all the DECL_... slots specified in the new decl except for any that we copy here from the old type. */ ! DECL_MACHINE_ATTRIBUTES (newdecl) ! = merge_machine_decl_attributes (olddecl, newdecl); if (TREE_CODE (newdecl) == TEMPLATE_DECL) { --- 3498,3506 ---- /* 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); ! decl_attributes (&newdecl, DECL_ATTRIBUTES (newdecl), 0); if (TREE_CODE (newdecl) == TEMPLATE_DECL) { *************** duplicate_decls (newdecl, olddecl) *** 3527,3542 **** tree newtype; /* Merge the data types specified in the two decls. */ ! newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); ! /* If common_type 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); ! /* Do this after calling `common_type' so that default parameters don't confuse us. */ else if (TREE_CODE (newdecl) == FUNCTION_DECL && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)) --- 3532,3547 ---- 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); ! /* Do this after calling `merge_types' so that default parameters don't confuse us. */ else if (TREE_CODE (newdecl) == FUNCTION_DECL && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)) *************** duplicate_decls (newdecl, olddecl) *** 3553,3559 **** && !comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)), TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)), 1)) { ! cp_error ("declaration of `%F' throws different exceptions", newdecl); cp_error_at ("than previous declaration `%F'", olddecl); } --- 3558,3564 ---- && !comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)), TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)), 1)) { ! error ("declaration of `%F' throws different exceptions", newdecl); cp_error_at ("than previous declaration `%F'", olddecl); } *************** duplicate_decls (newdecl, olddecl) *** 3600,3616 **** if (DECL_SECTION_NAME (newdecl) == NULL_TREE) DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl); - /* Keep the old rtl since we can safely use it. */ - COPY_DECL_RTL (olddecl, newdecl); - if (TREE_CODE (newdecl) == FUNCTION_DECL) { DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl) |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl); - DECL_NO_CHECK_MEMORY_USAGE (newdecl) - |= DECL_NO_CHECK_MEMORY_USAGE (olddecl); DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl); } } /* If cannot merge, then use the new type and qualifiers, --- 3605,3627 ---- 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); + /* 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, *************** duplicate_decls (newdecl, olddecl) *** 3629,3635 **** } /* Merge the storage class information. */ ! DECL_WEAK (newdecl) |= DECL_WEAK (olddecl); DECL_ONE_ONLY (newdecl) |= DECL_ONE_ONLY (olddecl); DECL_DEFER_OUTPUT (newdecl) |= DECL_DEFER_OUTPUT (olddecl); TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); --- 3640,3647 ---- } /* Merge the storage class information. */ ! merge_weak (newdecl, olddecl); ! DECL_ONE_ONLY (newdecl) |= DECL_ONE_ONLY (olddecl); DECL_DEFER_OUTPUT (newdecl) |= DECL_DEFER_OUTPUT (olddecl); TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3682,3688 **** that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs. */ ! cp_error ("explicit specialization of %D after first use", olddecl); SET_DECL_TEMPLATE_SPECIALIZATION (olddecl); --- 3694,3700 ---- 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 %D after first use", olddecl); SET_DECL_TEMPLATE_SPECIALIZATION (olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3695,3700 **** --- 3707,3715 ---- DECL_INLINE (olddecl) = 1; DECL_INLINE (newdecl) = DECL_INLINE (olddecl); + DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl) + = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl)); + /* Preserve abstractness on cloned [cd]tors. */ DECL_ABSTRACT (newdecl) = DECL_ABSTRACT (olddecl); *************** duplicate_decls (newdecl, olddecl) *** 3732,3741 **** DECL_NUM_STMTS (newdecl) = DECL_NUM_STMTS (olddecl); DECL_RESULT (newdecl) = DECL_RESULT (olddecl); - if ((DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl))) - /* Previously saved insns go together with - the function's previous definition. */ - DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); /* Don't clear out the arguments if we're redefining a function. */ if (DECL_ARGUMENTS (olddecl)) DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); --- 3747,3752 ---- *************** duplicate_decls (newdecl, olddecl) *** 3756,3764 **** function_size = sizeof (struct tree_decl); ! bcopy ((char *) newdecl + sizeof (struct tree_common), ! (char *) olddecl + sizeof (struct tree_common), ! function_size - sizeof (struct tree_common)); if (DECL_TEMPLATE_INSTANTIATION (newdecl)) { --- 3767,3775 ---- function_size = sizeof (struct tree_decl); ! memcpy ((char *) olddecl + sizeof (struct tree_common), ! (char *) newdecl + sizeof (struct tree_common), ! function_size - sizeof (struct tree_common)); if (DECL_TEMPLATE_INSTANTIATION (newdecl)) { *************** duplicate_decls (newdecl, olddecl) *** 3794,3803 **** } else { ! bcopy ((char *) newdecl + sizeof (struct tree_common), ! (char *) olddecl + sizeof (struct tree_common), ! sizeof (struct tree_decl) - sizeof (struct tree_common) ! + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *)); } DECL_UID (olddecl) = olddecl_uid; --- 3805,3814 ---- } else { ! memcpy ((char *) olddecl + sizeof (struct tree_common), ! (char *) newdecl + sizeof (struct tree_common), ! sizeof (struct tree_decl) - sizeof (struct tree_common) ! + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *)); } DECL_UID (olddecl) = olddecl_uid; *************** duplicate_decls (newdecl, olddecl) *** 3806,3812 **** /* NEWDECL contains the merged attribute lists. Update OLDDECL to be the same. */ ! DECL_MACHINE_ATTRIBUTES (olddecl) = DECL_MACHINE_ATTRIBUTES (newdecl); return 1; } --- 3817,3823 ---- /* NEWDECL contains the merged attribute lists. Update OLDDECL to be the same. */ ! DECL_ATTRIBUTES (olddecl) = DECL_ATTRIBUTES (newdecl); return 1; } *************** pushdecl (x) *** 3959,3965 **** else if (t == wchar_decl_node) { if (pedantic && ! DECL_IN_SYSTEM_HEADER (x)) ! cp_pedwarn ("redeclaration of wchar_t as `%T'", TREE_TYPE (x)); /* Throw away the redeclaration. */ return t; --- 3970,3977 ---- else if (t == wchar_decl_node) { if (pedantic && ! DECL_IN_SYSTEM_HEADER (x)) ! pedwarn ("redeclaration of `wchar_t' as `%T'", ! TREE_TYPE (x)); /* Throw away the redeclaration. */ return t; *************** pushdecl (x) *** 3987,3993 **** This function shall not be overloaded. */ cp_error_at ("invalid redeclaration of `%D'", t); ! cp_error ("as `%D'", x); /* We don't try to push this declaration since that causes a crash. */ return x; --- 3999,4005 ---- This function shall not be overloaded. */ cp_error_at ("invalid redeclaration of `%D'", t); ! error ("as `%D'", x); /* We don't try to push this declaration since that causes a crash. */ return x; *************** pushdecl (x) *** 4076,4082 **** && TREE_CODE (decl) == TREE_CODE (x) && !same_type_p (TREE_TYPE (x), TREE_TYPE (decl))) { ! cp_pedwarn ("type mismatch with previous external decl", x); cp_pedwarn_at ("previous external decl of `%#D'", decl); } } --- 4088,4094 ---- && TREE_CODE (decl) == TREE_CODE (x) && !same_type_p (TREE_TYPE (x), TREE_TYPE (decl))) { ! pedwarn ("type mismatch with previous external decl", x); cp_pedwarn_at ("previous external decl of `%#D'", decl); } } *************** pushdecl (x) *** 4117,4123 **** /* If this real decl matches the implicit, don't complain. */ && ! (TREE_CODE (x) == FUNCTION_DECL && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) ! cp_warning ("`%D' was previously implicitly declared to return `int'", x); /* If new decl is `static' and an `extern' was seen previously, --- 4129,4135 ---- /* If this real decl matches the implicit, don't complain. */ && ! (TREE_CODE (x) == FUNCTION_DECL && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) ! warning ("`%D' was previously implicitly declared to return `int'", x); /* If new decl is `static' and an `extern' was seen previously, *************** pushdecl (x) *** 4178,4184 **** /* OK */; else { ! cp_warning ("extern declaration of `%#D' doesn't match", x); cp_warning_at ("global declaration `%#D'", oldglobal); } } --- 4190,4196 ---- /* OK */; else { ! warning ("extern declaration of `%#D' doesn't match", x); cp_warning_at ("global declaration `%#D'", oldglobal); } } *************** pushdecl (x) *** 4195,4263 **** if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) /* Inline decls shadow nothing. */ && !DECL_FROM_INLINE (x) ! && TREE_CODE (oldlocal) == PARM_DECL ! /* Don't complain if it's from an enclosing function. */ ! && DECL_CONTEXT (oldlocal) == current_function_decl ! && TREE_CODE (x) != PARM_DECL) { ! /* Go to where the parms should be and see if we ! find them there. */ ! struct binding_level *b = current_binding_level->level_chain; ! if (cleanup_label) ! b = b->level_chain; ! /* ARM $8.3 */ ! if (b->parm_flag == 1) ! cp_error ("declaration of `%#D' shadows a parameter", name); } /* Maybe warn if shadowing something else. */ ! if (warn_shadow && !DECL_EXTERNAL (x) ! /* Inline decls shadow nothing. */ ! && !DECL_FROM_INLINE (x) /* No shadow warnings for internally generated vars. */ && ! DECL_ARTIFICIAL (x) /* No shadow warnings for vars made for inlining. */ && ! DECL_FROM_INLINE (x)) { ! if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL) ! warning ("declaration of `%s' shadows a parameter", ! IDENTIFIER_POINTER (name)); ! else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE && current_class_ptr && !TREE_STATIC (name)) warning ("declaration of `%s' shadows a member of `this'", ! IDENTIFIER_POINTER (name)); ! else if (oldlocal != NULL_TREE) ! warning ("declaration of `%s' shadows previous local", ! IDENTIFIER_POINTER (name)); ! else if (oldglobal != NULL_TREE) /* XXX shadow warnings in outer-more namespaces */ ! warning ("declaration of `%s' shadows global declaration", ! IDENTIFIER_POINTER (name)); } } if (TREE_CODE (x) == FUNCTION_DECL) check_default_args (x); ! /* Keep count of variables in this level with incomplete type. */ ! if (TREE_CODE (x) == VAR_DECL ! && TREE_TYPE (x) != error_mark_node ! && ((!COMPLETE_TYPE_P (TREE_TYPE (x)) ! && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE)) ! /* RTTI TD entries are created while defining the type_info. */ ! || (TYPE_LANG_SPECIFIC (TREE_TYPE (x)) ! && TYPE_BEING_DEFINED (TREE_TYPE (x))))) ! { ! if (namespace_bindings_p ()) ! namespace_scope_incomplete ! = tree_cons (NULL_TREE, x, namespace_scope_incomplete); ! else ! current_binding_level->incomplete ! = tree_cons (NULL_TREE, x, current_binding_level->incomplete); ! } } if (need_new_binding) --- 4207,4264 ---- if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) /* Inline decls shadow nothing. */ && !DECL_FROM_INLINE (x) ! && TREE_CODE (oldlocal) == PARM_DECL) { ! bool err = false; ! /* Don't complain if it's from an enclosing function. */ ! if (DECL_CONTEXT (oldlocal) == current_function_decl ! && TREE_CODE (x) != PARM_DECL) ! { ! /* Go to where the parms should be and see if we find ! them there. */ ! struct binding_level *b = current_binding_level->level_chain; ! /* ARM $8.3 */ ! if (b->parm_flag == 1) ! { ! error ("declaration of `%#D' shadows a parameter", ! name); ! err = true; ! } ! } ! ! if (warn_shadow && !err) ! shadow_warning ("a parameter", name, oldlocal); } /* Maybe warn if shadowing something else. */ ! else if (warn_shadow && !DECL_EXTERNAL (x) /* No shadow warnings for internally generated vars. */ && ! DECL_ARTIFICIAL (x) /* No shadow warnings for vars made for inlining. */ && ! DECL_FROM_INLINE (x)) { ! if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE && current_class_ptr && !TREE_STATIC (name)) warning ("declaration of `%s' shadows a member of `this'", ! IDENTIFIER_POINTER (name)); ! else if (oldlocal != NULL_TREE ! && TREE_CODE (oldlocal) == VAR_DECL) ! shadow_warning ("a previous local", name, oldlocal); ! else if (oldglobal != NULL_TREE ! && TREE_CODE (oldglobal) == VAR_DECL) /* XXX shadow warnings in outer-more namespaces */ ! shadow_warning ("a global declaration", name, oldglobal); } } if (TREE_CODE (x) == FUNCTION_DECL) check_default_args (x); ! if (TREE_CODE (x) == VAR_DECL) ! maybe_register_incomplete_var (x); } if (need_new_binding) *************** push_overloaded_decl (decl, flags) *** 4592,4598 **** if (IS_AGGR_TYPE (t) && warn_shadow && (! DECL_IN_SYSTEM_HEADER (decl) || ! DECL_IN_SYSTEM_HEADER (old))) ! cp_warning ("`%#D' hides constructor for `%#T'", decl, t); old = NULL_TREE; } else if (is_overloaded_fn (old)) --- 4593,4599 ---- if (IS_AGGR_TYPE (t) && warn_shadow && (! DECL_IN_SYSTEM_HEADER (decl) || ! DECL_IN_SYSTEM_HEADER (old))) ! warning ("`%#D' hides constructor for `%#T'", decl, t); old = NULL_TREE; } else if (is_overloaded_fn (old)) *************** push_overloaded_decl (decl, flags) *** 4607,4613 **** && !(flags & PUSH_USING) && compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)), TYPE_ARG_TYPES (TREE_TYPE (decl)))) ! cp_error ("`%#D' conflicts with previous using declaration `%#D'", decl, fn); if (duplicate_decls (decl, fn)) --- 4608,4614 ---- && !(flags & PUSH_USING) && compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)), TYPE_ARG_TYPES (TREE_TYPE (decl)))) ! error ("`%#D' conflicts with previous using declaration `%#D'", decl, fn); if (duplicate_decls (decl, fn)) *************** push_overloaded_decl (decl, flags) *** 4620,4626 **** else { cp_error_at ("previous non-function declaration `%#D'", old); ! cp_error ("conflicts with function declaration `%#D'", decl); return decl; } } --- 4621,4627 ---- else { cp_error_at ("previous non-function declaration `%#D'", old); ! error ("conflicts with function declaration `%#D'", decl); return decl; } } *************** push_overloaded_decl (decl, flags) *** 4674,4680 **** } /* We should always find a previous binding in this case. */ ! my_friendly_abort (0); } /* Install the new binding. */ --- 4675,4681 ---- } /* We should always find a previous binding in this case. */ ! abort (); } /* Install the new binding. */ *************** implicitly_declare (functionid) *** 4704,4716 **** /* ISO standard says implicit declarations are in the innermost block. So we record the decl in the standard fashion. */ pushdecl (decl); ! rest_of_decl_compilation (decl, NULL_PTR, 0, 0); if (warn_implicit /* Only one warning per identifier. */ && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE) { ! cp_pedwarn ("implicit declaration of function `%#D'", decl); } SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl); --- 4705,4717 ---- /* ISO standard says implicit declarations are in the innermost block. So we record the decl in the standard fashion. */ pushdecl (decl); ! rest_of_decl_compilation (decl, NULL, 0, 0); if (warn_implicit /* Only one warning per identifier. */ && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE) { ! pedwarn ("implicit declaration of function `%#D'", decl); } SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl); *************** check_previous_goto_1 (decl, level, name *** 4971,4977 **** if (! identified) { if (decl) ! cp_pedwarn ("jump to label `%D'", decl); else pedwarn ("jump to case label"); --- 4972,4978 ---- if (! identified) { if (decl) ! pedwarn ("jump to label `%D'", decl); else pedwarn ("jump to case label"); *************** check_previous_goto_1 (decl, level, name *** 4995,5001 **** if (! identified) { if (decl) ! cp_pedwarn ("jump to label `%D'", decl); else pedwarn ("jump to case label"); --- 4996,5002 ---- if (! identified) { if (decl) ! pedwarn ("jump to label `%D'", decl); else pedwarn ("jump to case label"); *************** define_label (filename, line, name) *** 5137,5147 **** p->more_cleanups_ok = 0; if (name == get_identifier ("wchar_t")) ! cp_pedwarn ("label named wchar_t"); if (DECL_INITIAL (decl) != NULL_TREE) { ! cp_error ("duplicate label `%D'", decl); return 0; } else --- 5138,5148 ---- p->more_cleanups_ok = 0; if (name == get_identifier ("wchar_t")) ! pedwarn ("label named wchar_t"); if (DECL_INITIAL (decl) != NULL_TREE) { ! error ("duplicate label `%D'", decl); return 0; } else *************** define_label (filename, line, name) *** 5157,5163 **** ent->binding_level = current_binding_level; } check_previous_gotos (decl); - current_function_return_value = NULL_TREE; return decl; } } --- 5158,5163 ---- *************** finish_case_label (low_value, high_value *** 5227,5233 **** if (high_value) error ("case label not within a switch statement"); else if (low_value) ! cp_error ("case label `%E' not within a switch statement", low_value); else error ("`default' label not within a switch statement"); --- 5227,5233 ---- if (high_value) error ("case label not within a switch statement"); else if (low_value) ! error ("case label `%E' not within a switch statement", low_value); else error ("`default' label not within a switch statement"); *************** finish_case_label (low_value, high_value *** 5259,5265 **** own new (temporary) binding contour. */ for (p = current_binding_level; !(p->parm_flag); p = p->level_chain) p->more_cleanups_ok = 0; - current_function_return_value = NULL_TREE; return r; } --- 5259,5264 ---- *************** storetags (tags) *** 5303,5308 **** --- 5302,5348 ---- current_binding_level->tags = tags; } + /* Return the type that should be used when TYPE's name is preceded + by a tag such as 'struct' or 'union', or null if the name cannot + be used in this way. + + For example, when processing the third line of: + + struct A; + typedef struct A A; + struct A; + + lookup of A will find the typedef. Given A's typedef, this function + will return the type associated with "struct A". For the tag to be + anything other than TYPE, TYPE must be a typedef whose original type + has the same name and context as TYPE itself. + + It is not valid for a typedef of an anonymous type to be used with + an explicit tag: + + typedef struct { ... } B; + struct B; + + Return null for this case. */ + + static tree + follow_tag_typedef (type) + tree type; + { + tree original; + + original = original_type (type); + if (! TYPE_NAME (original)) + return NULL_TREE; + if (TYPE_IDENTIFIER (original) == TYPE_IDENTIFIER (type) + && (CP_DECL_CONTEXT (TYPE_NAME (original)) + == CP_DECL_CONTEXT (TYPE_NAME (type))) + && !(CLASS_TYPE_P (original) && TYPE_WAS_ANONYMOUS (original))) + return original; + else + return NULL_TREE; + } + /* Given NAME, an IDENTIFIER_NODE, return the structure (or union or enum) definition for that name. Searches binding levels from BINDING_LEVEL up to the global level. *************** lookup_tag (form, name, binding_level, t *** 5354,5371 **** else old = BINDING_TYPE (old); ! /* If it has an original type, it is a typedef, and we ! should not return it. */ ! if (old && DECL_ORIGINAL_TYPE (TYPE_NAME (old))) ! old = NULL_TREE; ! if (old && TREE_CODE (old) != form ! && !(form != ENUMERAL_TYPE && TREE_CODE (old) == TEMPLATE_DECL)) { ! cp_error ("`%#D' redeclared as %C", old, form); ! return NULL_TREE; } - if (old) - return old; if (thislevel_only || tail == global_namespace) return NULL_TREE; } --- 5394,5416 ---- else old = BINDING_TYPE (old); ! if (old) { ! /* We've found something at this binding level. If it is ! a typedef, extract the tag it refers to. Lookup fails ! if the typedef doesn't refer to a taggable type. */ ! old = follow_tag_typedef (old); ! if (!old) ! return NULL_TREE; ! if (TREE_CODE (old) != form ! && (form == ENUMERAL_TYPE ! || TREE_CODE (old) == ENUMERAL_TYPE)) ! { ! error ("`%#D' redeclared as %C", old, form); ! return NULL_TREE; ! } ! return old; } if (thislevel_only || tail == global_namespace) return NULL_TREE; } *************** lookup_tag (form, name, binding_level, t *** 5375,5388 **** if (TREE_PURPOSE (tail) == name) { enum tree_code code = TREE_CODE (TREE_VALUE (tail)); ! /* Should tighten this up; it'll probably permit ! UNION_TYPE and a struct template, for example. */ if (code != form ! && !(form != ENUMERAL_TYPE && code == TEMPLATE_DECL)) { /* Definition isn't the kind we were looking for. */ ! cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail), ! form); return NULL_TREE; } return TREE_VALUE (tail); --- 5420,5431 ---- if (TREE_PURPOSE (tail) == name) { enum tree_code code = TREE_CODE (TREE_VALUE (tail)); ! if (code != form ! && (form == ENUMERAL_TYPE || code == ENUMERAL_TYPE)) { /* Definition isn't the kind we were looking for. */ ! error ("`%#D' redeclared as %C", TREE_VALUE (tail), form); return NULL_TREE; } return TREE_VALUE (tail); *************** lookup_namespace_name (namespace, name) *** 5470,5476 **** { /* This happens for A::B where B is a template, and there are no template arguments. */ ! cp_error ("invalid use of `%D'", name); return error_mark_node; } --- 5513,5519 ---- { /* This happens for A::B where B is a template, and there are no template arguments. */ ! error ("invalid use of `%D'", name); return error_mark_node; } *************** lookup_namespace_name (namespace, name) *** 5504,5517 **** /*in_decl=*/NULL_TREE, /*context=*/NULL_TREE, /*entering_scope=*/0, ! /*complain=*/1); else if (DECL_FUNCTION_TEMPLATE_P (val) || TREE_CODE (val) == OVERLOAD) val = lookup_template_function (val, TREE_OPERAND (template_id, 1)); else { ! cp_error ("`%D::%D' is not a template", namespace, name); return error_mark_node; } --- 5547,5560 ---- /*in_decl=*/NULL_TREE, /*context=*/NULL_TREE, /*entering_scope=*/0, ! tf_error | tf_warning); else if (DECL_FUNCTION_TEMPLATE_P (val) || TREE_CODE (val) == OVERLOAD) val = lookup_template_function (val, TREE_OPERAND (template_id, 1)); else { ! error ("`%D::%D' is not a template", namespace, name); return error_mark_node; } *************** lookup_namespace_name (namespace, name) *** 5520,5529 **** /* If we have a single function from a using decl, pull it out. */ if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) val = OVL_FUNCTION (val); ! return val; } ! cp_error ("`%D' undeclared in namespace `%D'", name, namespace); return error_mark_node; } --- 5563,5577 ---- /* If we have a single function from a using decl, pull it out. */ if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) val = OVL_FUNCTION (val); ! ! /* Ignore built-in functions that haven't been prototyped yet. */ ! if (!val || !DECL_P(val) ! || !DECL_LANG_SPECIFIC(val) ! || !DECL_ANTICIPATED (val)) ! return val; } ! error ("`%D' undeclared in namespace `%D'", name, namespace); return error_mark_node; } *************** build_typename_type (context, name, full *** 5623,5634 **** /* Resolve `typename CONTEXT::NAME'. Returns an appropriate type, unless an error occurs, in which case error_mark_node is returned. ! If COMPLAIN zero, don't complain about any errors that occur. */ tree make_typename_type (context, name, complain) tree context, name; ! int complain; { tree fullname; --- 5671,5685 ---- /* Resolve `typename CONTEXT::NAME'. 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 (context, name, complain) tree context, name; ! tsubst_flags_t complain; { tree fullname; *************** make_typename_type (context, name, compl *** 5655,5669 **** if (TREE_CODE (name) == TEMPLATE_DECL) name = TREE_OPERAND (fullname, 0) = DECL_NAME (name); } if (TREE_CODE (name) != IDENTIFIER_NODE) ! my_friendly_abort (2000); if (TREE_CODE (context) == NAMESPACE_DECL) { /* We can get here from typename_sub0 in the explicit_template_type expansion. Just fail. */ ! if (complain) ! cp_error ("no class template named `%#T' in `%#T'", name, context); return error_mark_node; } --- 5706,5725 ---- if (TREE_CODE (name) == TEMPLATE_DECL) name = TREE_OPERAND (fullname, 0) = DECL_NAME (name); } + if (TREE_CODE (name) == TEMPLATE_DECL) + { + error ("`%D' used without template parameters", name); + return error_mark_node; + } if (TREE_CODE (name) != IDENTIFIER_NODE) ! abort (); if (TREE_CODE (context) == NAMESPACE_DECL) { /* We can get here from typename_sub0 in the explicit_template_type expansion. Just fail. */ ! if (complain & tf_error) ! error ("no class template named `%#T' in `%#T'", name, context); return error_mark_node; } *************** make_typename_type (context, name, compl *** 5678,5685 **** tmpl = lookup_field (context, name, 0, 0); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { ! if (complain) ! cp_error ("no class template named `%#T' in `%#T'", name, context); return error_mark_node; } --- 5734,5741 ---- tmpl = lookup_field (context, name, 0, 0); if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) { ! if (complain & tf_error) ! error ("no class template named `%#T' in `%#T'", name, context); return error_mark_node; } *************** make_typename_type (context, name, compl *** 5688,5694 **** TREE_OPERAND (fullname, 1), NULL_TREE, context, /*entering_scope=*/0, ! /*complain=*/1); } else { --- 5744,5750 ---- TREE_OPERAND (fullname, 1), NULL_TREE, context, /*entering_scope=*/0, ! tf_error | tf_warning); } else { *************** make_typename_type (context, name, compl *** 5696,5709 **** if (!IS_AGGR_TYPE (context)) { ! if (complain) ! cp_error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } t = lookup_field (context, name, 0, 1); if (t) ! return TREE_TYPE (t); } } --- 5752,5780 ---- if (!IS_AGGR_TYPE (context)) { ! if (complain & tf_error) ! error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } t = lookup_field (context, name, 0, 1); if (t) ! { ! if (DECL_ARTIFICIAL (t) || !(complain & tf_keep_type_decl)) ! t = TREE_TYPE (t); ! if (IMPLICIT_TYPENAME_P (t)) ! { ! /* Lookup found an implicit typename that we had ! injected into the current scope. Doing things ! properly would have located the exact same type, ! so there is no error here. We must remove the ! implicitness so that we do not warn about it. */ ! t = copy_node (t); ! TREE_TYPE (t) = NULL_TREE; ! } ! ! return t; ! } } } *************** make_typename_type (context, name, compl *** 5711,5718 **** there now or its never going to be. */ if (!uses_template_parms (context)) { ! if (complain) ! cp_error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } --- 5782,5789 ---- there now or its never going to be. */ if (!uses_template_parms (context)) { ! if (complain & tf_error) ! error ("no type named `%#T' in `%#T'", name, context); return error_mark_node; } *************** make_typename_type (context, name, compl *** 5720,5725 **** --- 5791,5853 ---- return build_typename_type (context, name, fullname, NULL_TREE); } + /* Resolve `CONTEXT::template NAME'. Returns an appropriate type, + unless an error occurs, in which case error_mark_node is returned. + If we locate a TYPE_DECL, we return that, rather than the _TYPE it + corresponds to. If COMPLAIN zero, don't complain about any errors + that occur. */ + + tree + make_unbound_class_template (context, name, complain) + tree context, name; + int complain; + { + tree t; + tree d; + + if (TYPE_P (name)) + name = TYPE_IDENTIFIER (name); + else if (DECL_P (name)) + name = DECL_NAME (name); + if (TREE_CODE (name) != IDENTIFIER_NODE) + abort (); + + if (!uses_template_parms (context) + || currently_open_class (context)) + { + tree tmpl = NULL_TREE; + + if (IS_AGGR_TYPE (context)) + tmpl = lookup_field (context, name, 0, 0); + + if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) + { + if (complain) + error ("no class template named `%#T' in `%#T'", name, context); + return error_mark_node; + } + + if (!enforce_access (context, tmpl)) + return error_mark_node; + + return tmpl; + } + + /* Build the UNBOUND_CLASS_TEMPLATE. */ + t = make_aggr_type (UNBOUND_CLASS_TEMPLATE); + TYPE_CONTEXT (t) = FROB_CONTEXT (context); + TREE_TYPE (t) = NULL_TREE; + + /* Build the corresponding TEMPLATE_DECL. */ + d = build_decl (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; + + return t; + } + /* Select the right _DECL from multiple choices. */ static tree *************** select_decl (binding, flags) *** 5730,5743 **** tree val; val = BINDING_VALUE (binding); - /* When we implicitly declare some builtin entity, we mark it - DECL_ANTICIPATED, so that we know to ignore it until it is - really declared. */ - if (val && DECL_P (val) - && DECL_LANG_SPECIFIC (val) - && DECL_ANTICIPATED (val)) - return NULL_TREE; - if (LOOKUP_NAMESPACES_ONLY (flags)) { /* We are not interested in types. */ --- 5858,5863 ---- *************** unqualified_namespace_lookup (name, flag *** 5772,5778 **** tree *spacesp; { tree b = make_node (CPLUS_BINDING); ! tree initial = current_decl_namespace(); tree scope = initial; tree siter; struct binding_level *level; --- 5892,5898 ---- tree *spacesp; { tree b = make_node (CPLUS_BINDING); ! tree initial = current_decl_namespace (); tree scope = initial; tree siter; struct binding_level *level; *************** unqualified_namespace_lookup (name, flag *** 5787,5795 **** *spacesp = tree_cons (scope, NULL_TREE, *spacesp); val = binding_for_name (name, scope); ! /* Initialize binding for this context. */ ! BINDING_VALUE (b) = BINDING_VALUE (val); ! BINDING_TYPE (b) = BINDING_TYPE (val); /* Add all _DECLs seen through local using-directives. */ for (level = current_binding_level; --- 5907,5927 ---- *spacesp = tree_cons (scope, NULL_TREE, *spacesp); val = binding_for_name (name, scope); ! /* Ignore anticipated built-in functions. */ ! if (val && BINDING_VALUE (val) ! && DECL_P (BINDING_VALUE (val)) ! && DECL_LANG_SPECIFIC (BINDING_VALUE (val)) ! && DECL_ANTICIPATED (BINDING_VALUE (val))) ! { ! BINDING_VALUE (b) = NULL_TREE; ! BINDING_TYPE (b) = NULL_TREE; ! } ! else ! { ! /* Initialize binding for this context. */ ! BINDING_VALUE (b) = BINDING_VALUE (val); ! BINDING_TYPE (b) = BINDING_TYPE (val); ! } /* Add all _DECLs seen through local using-directives. */ for (level = current_binding_level; *************** warn_about_implicit_typename_lookup (typ *** 5874,5884 **** && ! (TREE_CODE (binding) == TYPE_DECL && same_type_p (TREE_TYPE (binding), subtype))) { ! cp_warning ("lookup of `%D' finds `%#D'", name, binding); ! cp_warning (" instead of `%D' from dependent base class", typename); ! cp_warning (" (use `typename %T::%D' if that's what you meant)", constructor_name (current_class_type), name); } } --- 6006,6016 ---- && ! (TREE_CODE (binding) == TYPE_DECL && same_type_p (TREE_TYPE (binding), subtype))) { ! warning ("lookup of `%D' finds `%#D'", name, binding); ! warning (" instead of `%D' from dependent base class", typename); ! warning (" (use `typename %T::%D' if that's what you meant)", constructor_name (current_class_type), name); } } *************** lookup_name_real (name, prefer_type, non *** 5926,5935 **** if (looking_for_template) flags |= LOOKUP_TEMPLATES_EXPECTED; - /* std:: becomes :: for now. */ - if (got_scope && got_scope == fake_std_node) - got_scope = void_type_node; - if (got_scope) type = got_scope; else if (got_object != error_mark_node) --- 6058,6063 ---- *************** lookup_name_real (name, prefer_type, non *** 6055,6061 **** if (looking_for_typename && TREE_CODE (from_obj) == TYPE_DECL && TREE_CODE (val) == TYPE_DECL && ! same_type_p (TREE_TYPE (from_obj), TREE_TYPE (val))) ! cp_pedwarn ("\ lookup of `%D' in the scope of `%#T' (`%#D') \ does not match lookup in the current scope (`%#D')", name, got_object, from_obj, val); --- 6183,6189 ---- if (looking_for_typename && TREE_CODE (from_obj) == TYPE_DECL && TREE_CODE (val) == TYPE_DECL && ! same_type_p (TREE_TYPE (from_obj), TREE_TYPE (val))) ! pedwarn ("\ lookup of `%D' in the scope of `%#T' (`%#D') \ does not match lookup in the current scope (`%#D')", name, got_object, from_obj, val); *************** record_unknown_type (type, name) *** 6291,6301 **** typedef struct predefined_identifier { /* The name of the identifier. */ ! const char *name; /* The place where the IDENTIFIER_NODE should be stored. */ ! tree *node; /* Non-zero if this is the name of a constructor or destructor. */ ! int ctor_or_dtor_p; } predefined_identifier; /* Create all the predefined identifiers. */ --- 6419,6429 ---- 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; /* Non-zero if this is the name of a constructor or destructor. */ ! const int ctor_or_dtor_p; } predefined_identifier; /* Create all the predefined identifiers. */ *************** typedef struct predefined_identifier *** 6303,6312 **** static void initialize_predefined_identifiers () { ! struct predefined_identifier *pid; /* A table of identifiers to create at startup. */ ! static predefined_identifier predefined_identifiers[] = { { "C++", &lang_name_cplusplus, 0 }, { "C", &lang_name_c, 0 }, { "Java", &lang_name_java, 0 }, --- 6431,6440 ---- static void initialize_predefined_identifiers () { ! 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 }, *************** initialize_predefined_identifiers () *** 6317,6330 **** { "__comp_dtor", &complete_dtor_identifier, 1 }, { "__base_dtor", &base_dtor_identifier, 1 }, { "__deleting_dtor", &deleting_dtor_identifier, 1 }, - { VTABLE_DELTA2_NAME, &delta2_identifier, 0 }, - { VTABLE_DELTA_NAME, &delta_identifier, 0 }, { IN_CHARGE_NAME, &in_charge_identifier, 0 }, - { VTABLE_INDEX_NAME, &index_identifier, 0 }, { "nelts", &nelts_identifier, 0 }, { THIS_NAME, &this_identifier, 0 }, { VTABLE_PFN_NAME, &pfn_identifier, 0 }, - { "__pfn_or_delta2", &pfn_or_delta2_identifier, 0 }, { "_vptr", &vptr_identifier, 0 }, { "__vtt_parm", &vtt_parm_identifier, 0 }, { "std", &std_identifier, 0 }, --- 6445,6455 ---- { "__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 }, { "std", &std_identifier, 0 }, *************** initialize_predefined_identifiers () *** 6345,6358 **** Make definitions for built-in primitive functions. */ void ! init_decl_processing () { ! tree fields[20]; ! ! /* Check to see that the user did not specify an invalid combination ! of command-line options. */ ! if (!flag_vtable_thunks) ! error ("the ABI requires vtable thunks"); /* Create all the identifiers we need. */ initialize_predefined_identifiers (); --- 6470,6479 ---- Make definitions for built-in primitive functions. */ void ! cxx_init_decl_processing () { ! tree void_ftype; ! tree void_ftype_ptr; /* Create all the identifiers we need. */ initialize_predefined_identifiers (); *************** init_decl_processing () *** 6361,6368 **** init_lang_status = &push_cp_function_context; free_lang_status = &pop_cp_function_context; mark_lang_status = &mark_cp_function_context; - lang_safe_from_p = &c_safe_from_p; - lang_dump_tree = &cp_dump_tree; lang_missing_noreturn_ok_p = &cp_missing_noreturn_ok_p; cp_parse_init (); --- 6482,6487 ---- *************** init_decl_processing () *** 6392,6403 **** flag_inline_functions = 0; } - /* In C++, we never create builtin functions whose name does not - begin with `__'. Users should be using headers to get prototypes - in C++. It would be nice if we could warn when `-fbuiltin' is - used explicitly, but we do not have that information. */ - flag_no_builtin = 1; - /* Initially, C. */ current_lang_name = lang_name_c; --- 6511,6516 ---- *************** init_decl_processing () *** 6418,6437 **** declare_namespace_level (); /* Create the `std' namespace. */ ! if (flag_honor_std) ! { ! push_namespace (std_identifier); ! std_node = current_namespace; ! pop_namespace (); ! fake_std_node = error_mark_node; ! } ! else ! { ! fake_std_node = build_decl (NAMESPACE_DECL, ! std_identifier, ! void_type_node); ! pushdecl (fake_std_node); ! } c_common_nodes_and_builtins (); --- 6531,6541 ---- declare_namespace_level (); /* Create the `std' namespace. */ ! push_namespace (std_identifier); ! std_node = current_namespace; ! pop_namespace (); ! ! lang_attribute_table = cp_attribute_table; c_common_nodes_and_builtins (); *************** init_decl_processing () *** 6466,6472 **** empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); #if 0 ! record_builtin_type (RID_MAX, NULL_PTR, string_type_node); #endif delta_type_node = ptrdiff_type_node; --- 6570,6576 ---- empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); #if 0 ! record_builtin_type (RID_MAX, NULL, string_type_node); #endif delta_type_node = ptrdiff_type_node; *************** init_decl_processing () *** 6475,6480 **** --- 6579,6589 ---- vtt_parm_type = build_pointer_type (const_ptr_type_node); lang_type_promotes_to = convert_type_from_ellipsis; + void_ftype = build_function_type (void_type_node, void_list_node); + void_ftype_ptr = build_function_type (void_type_node, + tree_cons (NULL_TREE, + ptr_type_node, + void_list_node)); void_ftype_ptr = build_exception_variant (void_ftype_ptr, empty_except_spec); *************** init_decl_processing () *** 6486,6543 **** /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node. */ TREE_TYPE (unknown_type_node) = unknown_type_node; - TREE_TYPE (null_node) = type_for_size (POINTER_SIZE, 0); - /* 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; ! if (flag_vtable_thunks) ! { ! /* 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); ! } ! else ! { ! vtable_entry_type = make_aggr_type (RECORD_TYPE); ! fields[0] = build_decl (FIELD_DECL, delta_identifier, ! delta_type_node); ! fields[1] = build_decl (FIELD_DECL, index_identifier, ! delta_type_node); ! fields[2] = build_decl (FIELD_DECL, pfn_identifier, ! ptr_type_node); ! finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2, ! double_type_node); ! /* Make this part of an invisible union. */ ! fields[3] = copy_node (fields[2]); ! TREE_TYPE (fields[3]) = delta_type_node; ! DECL_NAME (fields[3]) = delta2_identifier; ! DECL_MODE (fields[3]) = TYPE_MODE (delta_type_node); ! DECL_SIZE (fields[3]) = TYPE_SIZE (delta_type_node); ! DECL_SIZE_UNIT (fields[3]) = TYPE_SIZE_UNIT (delta_type_node); ! TREE_UNSIGNED (fields[3]) = 0; ! TREE_CHAIN (fields[2]) = fields[3]; ! vtable_entry_type = build_qualified_type (vtable_entry_type, ! TYPE_QUAL_CONST); ! } 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 = build_qualified_type (vtbl_type_node, TYPE_QUAL_CONST); ! record_builtin_type (RID_MAX, NULL_PTR, 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_PTR, vtbl_ptr_type_node); push_namespace (get_identifier ("__cxxabiv1")); abi_node = current_namespace; --- 6595,6625 ---- /* 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; ! { ! /* 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 = 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; *************** init_decl_processing () *** 6551,6564 **** { tree bad_alloc_type_node, newtype, deltype; ! if (flag_honor_std) ! push_namespace (std_identifier); bad_alloc_type_node = xref_tag (class_type_node, get_identifier ("bad_alloc"), 1); ! if (flag_honor_std) ! pop_namespace (); newtype = build_exception_variant ! (ptr_ftype_sizetype, add_exception_specifier (NULL_TREE, bad_alloc_type_node, -1)); 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); --- 6633,6652 ---- { tree bad_alloc_type_node, newtype, deltype; ! tree ptr_ftype_sizetype; ! ! push_namespace (std_identifier); bad_alloc_type_node = xref_tag (class_type_node, get_identifier ("bad_alloc"), 1); ! pop_namespace (); ! ptr_ftype_sizetype ! = build_function_type (ptr_type_node, ! tree_cons (NULL_TREE, ! c_size_type_node, ! void_list_node)); newtype = build_exception_variant ! (ptr_ftype_sizetype, add_exception_specifier ! (NULL_TREE, bad_alloc_type_node, -1)); 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); *************** init_decl_processing () *** 6581,6602 **** if (! supports_one_only ()) flag_weak = 0; - /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */ - function_id_node = get_identifier ("__FUNCTION__"); - pretty_function_id_node = get_identifier ("__PRETTY_FUNCTION__"); - func_id_node = get_identifier ("__func__"); - make_fname_decl = cp_make_fname_decl; ! declare_function_name (); ! ! /* Prepare to check format strings against argument lists. */ ! init_function_format_info (); /* Show we use EH for cleanups. */ using_eh_for_cleanups (); - valid_lang_attribute = cp_valid_lang_attribute; - /* Maintain consistency. Perhaps we should just complain if they say -fwritable-strings? */ if (flag_writable_strings) --- 6669,6680 ---- if (! supports_one_only ()) flag_weak = 0; make_fname_decl = cp_make_fname_decl; ! start_fname_decls (); /* Show we use EH for cleanups. */ using_eh_for_cleanups (); /* Maintain consistency. Perhaps we should just complain if they say -fwritable-strings? */ if (flag_writable_strings) *************** init_decl_processing () *** 6617,6625 **** ggc_add_tree_root (&static_dtors, 1); ggc_add_tree_root (&lastiddecl, 1); - ggc_add_tree_root (&last_function_parm_tags, 1); - ggc_add_tree_root (¤t_function_return_value, 1); - ggc_add_tree_root (¤t_function_parm_tags, 1); ggc_add_tree_root (&last_function_parms, 1); ggc_add_tree_root (&error_mark_list, 1); --- 6695,6700 ---- *************** init_decl_processing () *** 6633,6698 **** ggc_add_tree_root (¤t_lang_name, 1); ggc_add_tree_root (&static_aggregates, 1); ggc_add_tree_root (&free_bindings, 1); } /* Create the VAR_DECL for __FUNCTION__ etc. ID is the name 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. Because we build a tree for ! the function before emitting any of it, we don't need to treat the ! VAR_DECL specially. We can decide whether to emit it later, if it was ! used. */ static tree ! cp_make_fname_decl (id, name, type_dep) tree id; - const char *name; int type_dep; { ! tree decl, type, init; ! size_t length = strlen (name); ! tree domain = NULL_TREE; ! ! if (!processing_template_decl) ! type_dep = 0; ! if (!type_dep) ! domain = build_index_type (size_int (length)); ! ! type = build_cplus_array_type ! (build_qualified_type (char_type_node, TYPE_QUAL_CONST), ! domain); ! decl = build_decl (VAR_DECL, id, type); TREE_STATIC (decl) = 1; TREE_READONLY (decl) = 1; - DECL_SOURCE_LINE (decl) = 0; DECL_ARTIFICIAL (decl) = 1; - DECL_IN_SYSTEM_HEADER (decl) = 1; - DECL_IGNORED_P (decl) = 1; - pushdecl (decl); - if (processing_template_decl) - decl = push_template_decl (decl); - if (type_dep) - { - init = build (FUNCTION_NAME, type); - DECL_PRETTY_FUNCTION_P (decl) = 1; - } - else - { - init = build_string (length + 1, name); - TREE_TYPE (init) = type; - } DECL_INITIAL (decl) = init; ! cp_finish_decl (decl, init, NULL_TREE, LOOKUP_ONLYCONVERTING); ! /* We will have to make sure we only emit this, if it is actually used. */ return decl; } ! /* Entry point for the benefit of c_common_nodes_and_builtins. ! ! Make a definition for a builtin function named NAME and whose data type ! is TYPE. TYPE should be a function type with argument types. CLASS and CODE tell later passes how to compile calls to this function. See tree.h for possible values. --- 6708,6784 ---- ggc_add_tree_root (¤t_lang_name, 1); ggc_add_tree_root (&static_aggregates, 1); ggc_add_tree_root (&free_bindings, 1); + ggc_add_tree_root (&incomplete_vars, 1); + } + + /* Generate an initializer for a function naming variable from + NAME. NAME may be NULL, in which case we generate a special + ERROR_MARK node which should be replaced later. */ + + tree + cp_fname_init (name) + const char *name; + { + tree domain = NULL_TREE; + tree type; + 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 = build_qualified_type (char_type_node, TYPE_QUAL_CONST); + type = build_cplus_array_type (type, domain); + + if (init) + TREE_TYPE (init) = type; + else + /* We don't know the value until instantiation time. Make + something which will be digested now, but replaced later. */ + init = build (ERROR_MARK, type); + + return init; } /* Create the VAR_DECL for __FUNCTION__ etc. ID is the name 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 musn't push the decl now. */ static tree ! cp_make_fname_decl (id, type_dep) tree id; int type_dep; { ! const char *const name = (type_dep && processing_template_decl ! ? NULL : fname_as_string (type_dep)); ! tree init = cp_fname_init (name); ! tree decl = build_decl (VAR_DECL, id, TREE_TYPE (init)); ! /* As we don't push the decl here, we must set the context. */ ! DECL_CONTEXT (decl) = current_function_decl; ! DECL_PRETTY_FUNCTION_P (decl) = type_dep; ! TREE_STATIC (decl) = 1; TREE_READONLY (decl) = 1; DECL_ARTIFICIAL (decl) = 1; DECL_INITIAL (decl) = init; ! ! TREE_USED (decl) = 1; ! cp_finish_decl (decl, init, NULL_TREE, LOOKUP_ONLYCONVERTING); ! return decl; } ! /* Make a definition for a builtin function named NAME in the current ! namespace, whose data type is TYPE and whose context is CONTEXT. ! TYPE should be a function type with argument types. CLASS and CODE tell later passes how to compile calls to this function. See tree.h for possible values. *************** cp_make_fname_decl (id, name, type_dep) *** 6700,6709 **** If LIBNAME is nonzero, use that for DECL_ASSEMBLER_NAME, the name to be called if we can't opencode the function. */ ! tree ! builtin_function (name, type, code, class, libname) const char *name; tree type; int code; enum built_in_class class; const char *libname; --- 6786,6796 ---- If LIBNAME is nonzero, use that for DECL_ASSEMBLER_NAME, the name to be called if we can't opencode the function. */ ! static tree ! builtin_function_1 (name, type, context, code, class, libname) const char *name; tree type; + tree context; int code; enum built_in_class class; const char *libname; *************** builtin_function (name, type, code, clas *** 6711,6729 **** tree decl = build_library_fn_1 (get_identifier (name), ERROR_MARK, type); DECL_BUILT_IN_CLASS (decl) = class; DECL_FUNCTION_CODE (decl) = code; ! my_friendly_assert (DECL_CONTEXT (decl) == NULL_TREE, 392); - /* All builtins that don't begin with an `_' should go in the `std' - namespace. */ - if (flag_honor_std && name[0] != '_') - { - push_namespace (std_identifier); - DECL_CONTEXT (decl) = std_node; - } pushdecl (decl); - if (flag_honor_std && name[0] != '_') - pop_namespace (); /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME, we cannot change DECL_ASSEMBLER_NAME until we have installed this --- 6798,6810 ---- tree decl = build_library_fn_1 (get_identifier (name), ERROR_MARK, type); DECL_BUILT_IN_CLASS (decl) = class; DECL_FUNCTION_CODE (decl) = code; + DECL_CONTEXT (decl) = context; ! /* The return builtins leave the current function. */ ! if (code == BUILT_IN_RETURN || code == BUILT_IN_EH_RETURN) ! TREE_THIS_VOLATILE (decl) = 1; pushdecl (decl); /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME, we cannot change DECL_ASSEMBLER_NAME until we have installed this *************** builtin_function (name, type, code, clas *** 6737,6745 **** --- 6818,6862 ---- if (name[0] != '_' || name[1] != '_') DECL_ANTICIPATED (decl) = 1; + /* Possibly apply some default attributes to this built-in function. */ + decl_attributes (&decl, NULL_TREE, 0); + return decl; } + /* Entry point for the benefit of c_common_nodes_and_builtins. + + Make a defintion for a builtin function named NAME and whose data type + is TYPE. TYPE should be a function type with argument types. This + function places the anticipated declaration in the global namespace + and additionally in the std namespace if appropriate. + + CLASS and CODE tell later passes how to compile calls to this function. + See tree.h for possible values. + + If LIBNAME is nonzero, use that for DECL_ASSEMBLER_NAME, + the name to be called if we can't opencode the function. */ + + tree + builtin_function (name, type, code, class, libname) + const char *name; + tree type; + int code; + enum built_in_class class; + const char *libname; + { + /* All builtins that don't begin with an '_' should additionally + go in the 'std' namespace. */ + if (name[0] != '_') + { + push_namespace (std_identifier); + builtin_function_1 (name, type, std_node, code, class, libname); + pop_namespace (); + } + + return builtin_function_1 (name, type, NULL_TREE, code, class, libname); + } + /* Generate a FUNCTION_DECL with the typical flags for a runtime library function. Not called directly. */ *************** push_throw_library_fn (name, type) *** 6859,6864 **** --- 6976,6995 ---- TREE_NOTHROW (fn) = 0; return fn; } + + /* Apply default attributes to a function, if a system function with default + attributes. */ + + void + insert_default_attributes (decl) + tree decl; + { + if (!DECL_EXTERN_C_FUNCTION_P (decl)) + return; + if (!TREE_PUBLIC (decl)) + return; + c_common_insert_default_attributes (decl); + } /* When we call finish_struct for an anonymous union, we create default copy constructors and such. But, an anonymous union *************** check_tag_decl (declspecs) *** 6958,6964 **** if (found_type == 2 && TREE_CODE (value) == IDENTIFIER_NODE) { if (! in_system_header) ! cp_pedwarn ("redeclaration of C++ built-in type `%T'", value); return NULL_TREE; } --- 7089,7095 ---- if (found_type == 2 && TREE_CODE (value) == IDENTIFIER_NODE) { if (! in_system_header) ! pedwarn ("redeclaration of C++ built-in type `%T'", value); return NULL_TREE; } *************** check_tag_decl (declspecs) *** 7020,7026 **** --end example] */ if (saw_typedef) { ! error ("Missing type-name in typedef-declaration."); return NULL_TREE; } /* Anonymous unions are objects, so they can have specifiers. */; --- 7151,7157 ---- --end example] */ if (saw_typedef) { ! error ("missing type-name in typedef-declaration"); return NULL_TREE; } /* Anonymous unions are objects, so they can have specifiers. */; *************** check_tag_decl (declspecs) *** 7034,7047 **** { if (ob_modifier == ridpointers[(int) RID_INLINE] || ob_modifier == ridpointers[(int) RID_VIRTUAL]) ! cp_error ("`%D' can only be specified for functions", ob_modifier); else if (ob_modifier == ridpointers[(int) RID_FRIEND]) ! cp_error ("`%D' can only be specified inside a class", ob_modifier); else if (ob_modifier == ridpointers[(int) RID_EXPLICIT]) ! cp_error ("`%D' can only be specified for constructors", ob_modifier); else ! cp_error ("`%D' can only be specified for objects and functions", ob_modifier); } --- 7165,7178 ---- { if (ob_modifier == ridpointers[(int) RID_INLINE] || ob_modifier == ridpointers[(int) RID_VIRTUAL]) ! error ("`%D' can only be specified for functions", ob_modifier); else if (ob_modifier == ridpointers[(int) RID_FRIEND]) ! error ("`%D' can only be specified inside a class", ob_modifier); else if (ob_modifier == ridpointers[(int) RID_EXPLICIT]) ! error ("`%D' can only be specified for constructors", ob_modifier); else ! error ("`%D' can only be specified for objects and functions", ob_modifier); } *************** shadow_tag (declspecs) *** 7080,7086 **** if (TYPE_FIELDS (t)) { tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, ! NULL_TREE); finish_anon_union (decl); } } --- 7211,7217 ---- if (TYPE_FIELDS (t)) { tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, ! NULL); finish_anon_union (decl); } } *************** tree *** 7092,7102 **** groktypename (typename) tree typename; { if (TREE_CODE (typename) != TREE_LIST) return typename; ! return grokdeclarator (TREE_VALUE (typename), ! TREE_PURPOSE (typename), ! TYPENAME, 0, NULL_TREE); } /* Decode a declarator in an ordinary declaration or data definition. --- 7223,7238 ---- groktypename (typename) tree typename; { + tree specs, attrs; + tree type; if (TREE_CODE (typename) != TREE_LIST) return typename; ! split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs); ! type = grokdeclarator (TREE_VALUE (typename), specs, ! TYPENAME, 0, &attrs); ! if (attrs) ! cplus_decl_attributes (&type, attrs, 0); ! return type; } /* Decode a declarator in an ordinary declaration or data definition. *************** start_decl (declarator, declspecs, initi *** 7120,7131 **** int initialized; tree attributes, prefix_attributes; { ! register tree decl; register tree type, tem; tree context; extern int have_extern_spec; extern int used_extern_spec; - tree attrlist; #if 0 /* See code below that used this. */ --- 7256,7266 ---- int initialized; tree attributes, prefix_attributes; { ! tree decl; register tree type, tem; tree context; extern int have_extern_spec; extern int used_extern_spec; #if 0 /* See code below that used this. */ *************** start_decl (declarator, declspecs, initi *** 7140,7152 **** used_extern_spec = 1; } ! if (attributes || prefix_attributes) ! attrlist = build_tree_list (attributes, prefix_attributes); ! else ! attrlist = NULL_TREE; decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, ! attrlist); if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE) return NULL_TREE; --- 7275,7291 ---- used_extern_spec = 1; } ! /* 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) return NULL_TREE; *************** start_decl (declarator, declspecs, initi *** 7182,7194 **** Any other case of an initialization in a TYPE_DECL is an error. */ if (pedantic || list_length (declspecs) > 1) { ! cp_error ("typedef `%D' is initialized", decl); initialized = 0; } break; case FUNCTION_DECL: ! cp_error ("function `%#D' is initialized like a variable", decl); initialized = 0; break; --- 7321,7333 ---- Any other case of an initialization in a TYPE_DECL is an error. */ if (pedantic || list_length (declspecs) > 1) { ! error ("typedef `%D' is initialized", decl); initialized = 0; } break; case FUNCTION_DECL: ! error ("function `%#D' is initialized like a variable", decl); initialized = 0; break; *************** start_decl (declarator, declspecs, initi *** 7200,7206 **** { if (! toplevel_bindings_p () && DECL_EXTERNAL (decl)) ! cp_warning ("declaration of `%#D' has `extern' and is initialized", decl); DECL_EXTERNAL (decl) = 0; if (toplevel_bindings_p ()) --- 7339,7345 ---- { if (! toplevel_bindings_p () && DECL_EXTERNAL (decl)) ! warning ("declaration of `%#D' has `extern' and is initialized", decl); DECL_EXTERNAL (decl) = 0; if (toplevel_bindings_p ()) *************** start_decl (declarator, declspecs, initi *** 7212,7223 **** DECL_INITIAL (decl) = error_mark_node; } - #ifdef SET_DEFAULT_DECL_ATTRIBUTES - SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes); - #endif - /* Set attributes here so if duplicate decl, will have proper attributes. */ ! cplus_decl_attributes (decl, attributes, prefix_attributes); if (context && COMPLETE_TYPE_P (complete_type (context))) { --- 7351,7369 ---- DECL_INITIAL (decl) = error_mark_node; } /* Set attributes here so if duplicate decl, will have proper attributes. */ ! cplus_decl_attributes (&decl, attributes, 0); ! ! /* If #pragma weak was used, mark the decl weak now. */ ! if (current_binding_level == global_binding_level) ! 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_with_decl (decl, ! "inline function `%s' given attribute noinline"); if (context && COMPLETE_TYPE_P (complete_type (context))) { *************** start_decl (declarator, declspecs, initi *** 7227,7238 **** { tree field = lookup_field (context, DECL_NAME (decl), 0, 0); if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) ! cp_error ("`%#D' is not a static member of `%#T'", decl, context); else { if (DECL_CONTEXT (field) != context) { ! cp_pedwarn ("ISO C++ does not permit `%T::%D' to be defined as `%T::%D'", DECL_CONTEXT (field), DECL_NAME (decl), context, DECL_NAME (decl)); DECL_CONTEXT (decl) = DECL_CONTEXT (field); --- 7373,7384 ---- { tree field = lookup_field (context, DECL_NAME (decl), 0, 0); if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) ! error ("`%#D' is not a static member of `%#T'", decl, context); else { if (DECL_CONTEXT (field) != context) { ! pedwarn ("ISO C++ does not permit `%T::%D' to be defined as `%T::%D'", DECL_CONTEXT (field), DECL_NAME (decl), context, DECL_NAME (decl)); DECL_CONTEXT (decl) = DECL_CONTEXT (field); *************** start_decl (declarator, declspecs, initi *** 7243,7249 **** initialization. Thus, duplicate_decls won't warn about this situation, and so we check here. */ if (DECL_INITIAL (decl) && DECL_INITIAL (field)) ! cp_error ("duplicate initialization of %D", decl); if (duplicate_decls (decl, field)) decl = field; } --- 7389,7395 ---- initialization. Thus, duplicate_decls won't warn about this situation, and so we check here. */ if (DECL_INITIAL (decl) && DECL_INITIAL (field)) ! error ("duplicate initialization of %D", decl); if (duplicate_decls (decl, field)) decl = field; } *************** start_decl (declarator, declspecs, initi *** 7272,7278 **** } if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl)) ! cp_pedwarn ("declaration of `%#D' outside of class is not definition", decl); } --- 7418,7424 ---- } if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl)) ! pedwarn ("declaration of `%#D' outside of class is not definition", decl); } *************** start_decl_1 (decl) *** 7320,7326 **** ; /* A complete type is ok. */ else if (TREE_CODE (type) != ARRAY_TYPE) { ! cp_error ("variable `%#D' has initializer but incomplete type", decl); initialized = 0; type = TREE_TYPE (decl) = error_mark_node; --- 7466,7472 ---- ; /* A complete type is ok. */ else if (TREE_CODE (type) != ARRAY_TYPE) { ! error ("variable `%#D' has initializer but incomplete type", decl); initialized = 0; type = TREE_TYPE (decl) = error_mark_node; *************** start_decl_1 (decl) *** 7328,7334 **** else if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type)))) { if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)) ! cp_error ("elements of array `%#D' have incomplete type", decl); /* else we already gave an error in start_decl. */ initialized = 0; } --- 7474,7480 ---- else if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type)))) { if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)) ! error ("elements of array `%#D' have incomplete type", decl); /* else we already gave an error in start_decl. */ initialized = 0; } *************** start_decl_1 (decl) *** 7344,7350 **** if ((! processing_template_decl || ! uses_template_parms (type)) && !COMPLETE_TYPE_P (complete_type (type))) { ! cp_error ("aggregate `%#D' has incomplete type and cannot be initialized", decl); /* Change the type so that assemble_variable will give DECL an rtl we can live with: (mem (const_int 0)). */ --- 7490,7496 ---- if ((! processing_template_decl || ! uses_template_parms (type)) && !COMPLETE_TYPE_P (complete_type (type))) { ! error ("aggregate `%#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)). */ *************** grok_reference_init (decl, type, init) *** 7383,7389 **** if ((DECL_LANG_SPECIFIC (decl) == 0 || DECL_IN_AGGR_P (decl) == 0) && ! DECL_THIS_EXTERN (decl)) ! cp_error ("`%D' declared as reference but not initialized", decl); return NULL_TREE; } --- 7529,7535 ---- if ((DECL_LANG_SPECIFIC (decl) == 0 || DECL_IN_AGGR_P (decl) == 0) && ! DECL_THIS_EXTERN (decl)) ! error ("`%D' declared as reference but not initialized", decl); return NULL_TREE; } *************** grok_reference_init (decl, type, init) *** 7392,7398 **** if (TREE_CODE (init) == CONSTRUCTOR) { ! cp_error ("ISO C++ forbids use of initializer list to initialize reference `%D'", decl); return NULL_TREE; } --- 7538,7544 ---- if (TREE_CODE (init) == CONSTRUCTOR) { ! error ("ISO C++ forbids use of initializer list to initialize reference `%D'", decl); return NULL_TREE; } *************** grok_reference_init (decl, type, init) *** 7425,7447 **** return NULL_TREE; else if (tmp == NULL_TREE) { ! cp_error ("cannot initialize `%T' from `%T'", type, TREE_TYPE (init)); return NULL_TREE; } - init = tmp; - tmp = save_expr (tmp); if (TREE_STATIC (decl) && !TREE_CONSTANT (tmp)) return tmp; ! if (building_stmt_tree ()) ! { ! /* Initialize the declaration. */ ! tmp = build (INIT_EXPR, TREE_TYPE (decl), decl, tmp); ! finish_expr_stmt (tmp); ! } ! else ! DECL_INITIAL (decl) = tmp; return NULL_TREE; } --- 7571,7584 ---- return NULL_TREE; else if (tmp == NULL_TREE) { ! error ("cannot initialize `%T' from `%T'", type, TREE_TYPE (init)); return NULL_TREE; } if (TREE_STATIC (decl) && !TREE_CONSTANT (tmp)) return tmp; ! DECL_INITIAL (decl) = tmp; return NULL_TREE; } *************** maybe_deduce_size_from_array_init (decl, *** 7495,7506 **** int failure = complete_array_type (type, initializer, do_default); if (failure == 1) ! cp_error ("initializer fails to determine size of `%D'", decl); if (failure == 2) { if (do_default) ! cp_error ("array size missing in `%D'", decl); /* 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 --- 7632,7643 ---- int failure = complete_array_type (type, initializer, do_default); if (failure == 1) ! error ("initializer fails to determine size of `%D'", decl); if (failure == 2) { if (do_default) ! error ("array size missing in `%D'", decl); /* 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 *************** maybe_deduce_size_from_array_init (decl, *** 7512,7518 **** if (pedantic && TYPE_DOMAIN (type) != NULL_TREE && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), integer_zero_node)) ! cp_error ("zero-size array `%D'", decl); layout_decl (decl, 0); } --- 7649,7655 ---- if (pedantic && TYPE_DOMAIN (type) != NULL_TREE && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), integer_zero_node)) ! error ("zero-size array `%D'", decl); layout_decl (decl, 0); } *************** layout_var_decl (decl) *** 7545,7551 **** /* 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. */ ! cp_error ("storage size of `%D' isn't known", decl); TREE_TYPE (decl) = error_mark_node; } #if 0 --- 7682,7688 ---- /* 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 `%D' isn't known", decl); TREE_TYPE (decl) = error_mark_node; } #if 0 *************** layout_var_decl (decl) *** 7567,7573 **** if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) constant_expression_warning (DECL_SIZE (decl)); else ! cp_error ("storage size of `%D' isn't constant", decl); } if (TREE_STATIC (decl) --- 7704,7710 ---- if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) constant_expression_warning (DECL_SIZE (decl)); else ! error ("storage size of `%D' isn't constant", decl); } if (TREE_STATIC (decl) *************** check_for_uninitialized_const_var (decl) *** 7647,7653 **** && CP_TYPE_CONST_P (type) && !TYPE_NEEDS_CONSTRUCTING (type) && !DECL_INITIAL (decl)) ! cp_error ("uninitialized const `%D'", decl); } /* Verify INIT (the initializer for DECL), and record the --- 7784,7790 ---- && CP_TYPE_CONST_P (type) && !TYPE_NEEDS_CONSTRUCTING (type) && !DECL_INITIAL (decl)) ! error ("uninitialized const `%D'", decl); } /* Verify INIT (the initializer for DECL), and record the *************** check_initializer (decl, init) *** 7682,7699 **** init = NULL_TREE; else if (COMPLETE_TYPE_P (type) && !TREE_CONSTANT (TYPE_SIZE (type))) { ! cp_error ("variable-sized object `%D' may not be initialized", decl); init = NULL_TREE; } else if (TREE_CODE (type) == ARRAY_TYPE ! && !COMPLETE_TYPE_P (TREE_TYPE (type))) { ! cp_error ("elements of array `%#D' have incomplete type", decl); init = NULL_TREE; } ! else if (!COMPLETE_TYPE_P (type)) { ! cp_error ("`%D' has incomplete type", decl); TREE_TYPE (decl) = error_mark_node; init = NULL_TREE; } --- 7819,7836 ---- init = NULL_TREE; else if (COMPLETE_TYPE_P (type) && !TREE_CONSTANT (TYPE_SIZE (type))) { ! error ("variable-sized object `%D' may not be initialized", decl); init = NULL_TREE; } else if (TREE_CODE (type) == ARRAY_TYPE ! && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (type)))) { ! error ("elements of array `%#D' have incomplete type", decl); init = NULL_TREE; } ! else if (TREE_CODE (type) != ARRAY_TYPE && !COMPLETE_TYPE_P (type)) { ! error ("`%D' has incomplete type", decl); TREE_TYPE (decl) = error_mark_node; init = NULL_TREE; } *************** check_initializer (decl, init) *** 7725,7731 **** { if (TYPE_NON_AGGREGATE_CLASS (type)) { ! cp_error ("`%D' must be initialized by constructor, not by `{...}'", decl); init = error_mark_node; } --- 7862,7868 ---- { if (TYPE_NON_AGGREGATE_CLASS (type)) { ! error ("`%D' must be initialized by constructor, not by `{...}'", decl); init = error_mark_node; } *************** check_initializer (decl, init) *** 7755,7763 **** if (! TYPE_NEEDS_CONSTRUCTING (core_type)) { if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)) ! cp_error ("structure `%D' with uninitialized const members", decl); if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)) ! cp_error ("structure `%D' with uninitialized reference members", decl); } --- 7892,7900 ---- if (! TYPE_NEEDS_CONSTRUCTING (core_type)) { if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)) ! error ("structure `%D' with uninitialized const members", decl); if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)) ! error ("structure `%D' with uninitialized reference members", decl); } *************** make_rtl_for_nonlocal_decl (decl, init, *** 7822,7828 **** 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 unncessarily. */ if (!DECL_VIRTUAL_P (decl) && TREE_READONLY (decl) && DECL_INITIAL (decl) != NULL_TREE --- 7959,7965 ---- 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. */ if (!DECL_VIRTUAL_P (decl) && TREE_READONLY (decl) && DECL_INITIAL (decl) != NULL_TREE *************** make_rtl_for_nonlocal_decl (decl, init, *** 7831,7838 **** && toplev && !TREE_PUBLIC (decl)) { ! /* Fool with the linkage according to #pragma interface. */ ! if (!interface_unknown) { TREE_PUBLIC (decl) = 1; DECL_EXTERNAL (decl) = interface_only; --- 7968,7976 ---- && toplev && !TREE_PUBLIC (decl)) { ! /* Fool with the linkage of static consts according to #pragma ! interface. */ ! if (!interface_unknown && !TREE_PUBLIC (decl)) { TREE_PUBLIC (decl) = 1; DECL_EXTERNAL (decl) = interface_only; *************** make_rtl_for_nonlocal_decl (decl, init, *** 7840,7845 **** --- 7978,7986 ---- defer_p = 1; } + /* Likewise for template instantiations. */ + else if (DECL_COMDAT (decl)) + defer_p = 1; /* If we're deferring the variable, we only need to make RTL if there's an ASMSPEC. Otherwise, we'll lazily create it later when *************** destroy_local_var (decl) *** 7992,7999 **** cleanup = maybe_build_cleanup (decl); /* Record the cleanup required for this declaration. */ ! if (DECL_SIZE (decl) && TREE_TYPE (decl) != error_mark_node ! && cleanup) finish_decl_cleanup (decl, cleanup); } --- 8133,8139 ---- cleanup = maybe_build_cleanup (decl); /* Record the cleanup required for this declaration. */ ! if (DECL_SIZE (decl) && cleanup) finish_decl_cleanup (decl, cleanup); } *************** cp_finish_decl (decl, init, asmspec_tree *** 8027,8038 **** } /* If a name was specified, get the string. */ if (asmspec_tree) ! asmspec = TREE_STRING_POINTER (asmspec_tree); if (init && TREE_CODE (init) == NAMESPACE_DECL) { ! cp_error ("cannot initialize `%D' to namespace `%D'", decl, init); init = NULL_TREE; } --- 8167,8180 ---- } /* If a name was specified, get the string. */ + if (current_binding_level == global_binding_level) + asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); if (asmspec_tree) ! asmspec = TREE_STRING_POINTER (asmspec_tree); if (init && TREE_CODE (init) == NAMESPACE_DECL) { ! error ("cannot initialize `%D' to namespace `%D'", decl, init); init = NULL_TREE; } *************** cp_finish_decl (decl, init, asmspec_tree *** 8058,8074 **** if (type == error_mark_node) return; - /* Add this declaration to the statement-tree. */ - if (building_stmt_tree () - && at_function_scope_p () - && TREE_CODE (decl) != RESULT_DECL) - add_decl_stmt (decl); - if (TYPE_HAS_MUTABLE_P (type)) TREE_READONLY (decl) = 0; if (processing_template_decl) { if (init && DECL_INITIAL (decl)) DECL_INITIAL (decl) = init; goto finish_end0; --- 8200,8215 ---- if (type == error_mark_node) return; if (TYPE_HAS_MUTABLE_P (type)) TREE_READONLY (decl) = 0; if (processing_template_decl) { + /* Add this declaration to the statement-tree. */ + if (at_function_scope_p () + && TREE_CODE (decl) != RESULT_DECL) + add_decl_stmt (decl); + if (init && DECL_INITIAL (decl)) DECL_INITIAL (decl) = init; goto finish_end0; *************** cp_finish_decl (decl, init, asmspec_tree *** 8090,8100 **** && IS_AGGR_TYPE (type) && DECL_NAME (decl)) { if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) ! cp_warning ("shadowing previous type declaration of `%#D'", decl); set_identifier_type_value (DECL_NAME (decl), type); CLASSTYPE_GOT_SEMICOLON (type) = 1; } - GNU_xref_decl (current_function_decl, decl); /* If we have installed this as the canonical typedef for this type, and that type has not been defined yet, delay emitting --- 8231,8240 ---- && IS_AGGR_TYPE (type) && DECL_NAME (decl)) { if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) ! warning ("shadowing previous type declaration of `%#D'", decl); set_identifier_type_value (DECL_NAME (decl), type); CLASSTYPE_GOT_SEMICOLON (type) = 1; } /* If we have installed this as the canonical typedef for this type, and that type has not been defined yet, delay emitting *************** cp_finish_decl (decl, init, asmspec_tree *** 8103,8109 **** && !COMPLETE_TYPE_P (TREE_TYPE (decl))) TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; ! rest_of_decl_compilation (decl, NULL_PTR, DECL_CONTEXT (decl) == NULL_TREE, at_eof); goto finish_end; } --- 8243,8249 ---- && !COMPLETE_TYPE_P (TREE_TYPE (decl))) TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; ! rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == NULL_TREE, at_eof); goto finish_end; } *************** cp_finish_decl (decl, init, asmspec_tree *** 8132,8141 **** } /* Deduce size of array from initialization, if not already known. */ - maybe_deduce_size_from_array_init (decl, init); init = check_initializer (decl, init); ! GNU_xref_decl (current_function_decl, decl); if (TREE_CODE (decl) == VAR_DECL) layout_var_decl (decl); --- 8272,8287 ---- } /* Deduce size of array from initialization, if not already known. */ init = check_initializer (decl, init); + maybe_deduce_size_from_array_init (decl, init); ! /* Add this declaration to the statement-tree. This needs to happen ! after the call to check_initializer so that the DECL_STMT for a ! reference temp is added before the DECL_STMT for the reference itself. */ ! if (building_stmt_tree () ! && at_function_scope_p () ! && TREE_CODE (decl) != RESULT_DECL) ! add_decl_stmt (decl); if (TREE_CODE (decl) == VAR_DECL) layout_var_decl (decl); *************** start_cleanup_fn () *** 8382,8388 **** 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 unncessary emissions this way. */ DECL_INLINE (fndecl) = 1; /* Build the parameter. */ --- 8528,8534 ---- 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_INLINE (fndecl) = 1; /* Build the parameter. */ *************** start_cleanup_fn () *** 8399,8405 **** pushdecl (fndecl); start_function (/*specs=*/NULL_TREE, fndecl, NULL_TREE, SF_PRE_PARSED); - do_pushlevel (); interface_unknown = old_interface_unknown; --- 8545,8550 ---- *************** start_cleanup_fn () *** 8413,8420 **** static void end_cleanup_fn () { - do_poplevel (); - expand_body (finish_function (0)); pop_from_top_level (); --- 8558,8563 ---- *************** register_dtor_fn (decl) *** 8465,8471 **** cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); if (flag_use_cxa_atexit) { ! args = tree_cons (NULL_TREE, get_dso_handle_node (), NULL_TREE); args = tree_cons (NULL_TREE, null_pointer_node, args); args = tree_cons (NULL_TREE, cleanup, args); } --- 8608,8616 ---- cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); if (flag_use_cxa_atexit) { ! args = tree_cons (NULL_TREE, ! build_unary_op (ADDR_EXPR, get_dso_handle_node (), 0), ! NULL_TREE); args = tree_cons (NULL_TREE, null_pointer_node, args); args = tree_cons (NULL_TREE, cleanup, args); } *************** expand_static_init (decl, init) *** 8484,8490 **** if (oldstatic) { if (TREE_PURPOSE (oldstatic) && init != NULL_TREE) ! cp_error ("multiple initializations given for `%D'", decl); } else if (! toplevel_bindings_p ()) { --- 8629,8635 ---- if (oldstatic) { if (TREE_PURPOSE (oldstatic) && init != NULL_TREE) ! error ("multiple initializations given for `%D'", decl); } else if (! toplevel_bindings_p ()) { *************** start_handler_parms (declspecs, declarat *** 8582,8588 **** if (declspecs) { decl = grokdeclarator (declarator, declspecs, CATCHPARM, ! 1, NULL_TREE); if (decl == NULL_TREE) error ("invalid catch parameter"); } --- 8727,8733 ---- if (declspecs) { decl = grokdeclarator (declarator, declspecs, CATCHPARM, ! 1, NULL); if (decl == NULL_TREE) error ("invalid catch parameter"); } *************** member_function_or_else (ctype, cur_type *** 8702,8711 **** if (ctype && ctype != cur_type) { if (flags == DTOR_FLAG) ! cp_error ("destructor for alien class `%T' cannot be a member", ctype); else ! cp_error ("constructor for alien class `%T' cannot be a member", ctype); return 0; } --- 8847,8856 ---- if (ctype && ctype != cur_type) { if (flags == DTOR_FLAG) ! error ("destructor for alien class `%T' cannot be a member", ctype); else ! error ("constructor for alien class `%T' cannot be a member", ctype); return 0; } *************** bad_specifiers (object, type, virtualp, *** 8724,8739 **** int virtualp, quals, friendp, raises, inlinep; { if (virtualp) ! cp_error ("`%D' declared as a `virtual' %s", object, type); if (inlinep) ! cp_error ("`%D' declared as an `inline' %s", object, type); if (quals) ! cp_error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration", object, type); if (friendp) cp_error_at ("`%D' declared as a friend", object); ! if (raises && !TYPE_PTRFN_P (TREE_TYPE (object)) ! && !TYPE_PTRMEMFUNC_P (TREE_TYPE (object))) cp_error_at ("`%D' declared with an exception specification", object); } --- 8869,8887 ---- int virtualp, quals, friendp, raises, inlinep; { if (virtualp) ! error ("`%D' declared as a `virtual' %s", object, type); if (inlinep) ! error ("`%D' declared as an `inline' %s", object, type); if (quals) ! error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration", object, type); if (friendp) cp_error_at ("`%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))))) cp_error_at ("`%D' declared with an exception specification", object); } *************** grokfndecl (ctype, type, declarator, ori *** 8771,8779 **** tree t; if (raises) ! { ! type = build_exception_variant (type, raises); ! } decl = build_lang_decl (FUNCTION_DECL, declarator, type); /* Propagate volatile out from type to decl. */ --- 8919,8925 ---- tree t; if (raises) ! type = build_exception_variant (type, raises); decl = build_lang_decl (FUNCTION_DECL, declarator, type); /* Propagate volatile out from type to decl. */ *************** grokfndecl (ctype, type, declarator, ori *** 8846,8852 **** /* Allow this; it's pretty common in C. */; else { ! cp_pedwarn ("non-local function `%#D' uses anonymous type", decl); if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) cp_pedwarn_at ("\ --- 8992,8998 ---- /* Allow this; it's pretty common in C. */; else { ! pedwarn ("non-local function `%#D' uses anonymous type", decl); if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) cp_pedwarn_at ("\ *************** grokfndecl (ctype, type, declarator, ori *** 8855,8861 **** } } else ! cp_pedwarn ("non-local function `%#D' uses local type `%T'", decl, t); } } --- 9001,9007 ---- } } else ! pedwarn ("non-local function `%#D' uses local type `%T'", decl, t); } } *************** grokfndecl (ctype, type, declarator, ori *** 8878,8890 **** DECL_EXTERNAL (decl) = 1; if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) { ! cp_error ("%smember function `%D' cannot have `%T' method qualifier", (ctype ? "static " : "non-"), decl, TREE_VALUE (quals)); quals = NULL_TREE; } if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) ! grok_op_properties (decl, virtualp, check < 0); if (ctype && decl_function_context (decl)) DECL_NO_STATIC_CHAIN (decl) = 1; --- 9024,9036 ---- DECL_EXTERNAL (decl) = 1; if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) { ! error ("%smember function `%D' cannot have `%T' method qualifier", (ctype ? "static " : "non-"), decl, TREE_VALUE (quals)); quals = NULL_TREE; } if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) ! grok_op_properties (decl, friendp); if (ctype && decl_function_context (decl)) DECL_NO_STATIC_CHAIN (decl) = 1; *************** grokfndecl (ctype, type, declarator, ori *** 8901,8907 **** && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR) { if (funcdef_flag) ! cp_error ("defining explicit specialization `%D' in friend declaration", orig_declarator); else --- 9047,9053 ---- && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR) { if (funcdef_flag) ! error ("defining explicit specialization `%D' in friend declaration", orig_declarator); else *************** grokfndecl (ctype, type, declarator, ori *** 8912,8918 **** if (PROCESSING_REAL_TEMPLATE_DECL_P ()) { /* Something like `template friend void f()'. */ ! cp_error ("invalid use of template-id `%D' in declaration of primary template", orig_declarator); return NULL_TREE; } --- 9058,9064 ---- if (PROCESSING_REAL_TEMPLATE_DECL_P ()) { /* Something like `template friend void f()'. */ ! error ("invalid use of template-id `%D' in declaration of primary template", orig_declarator); return NULL_TREE; } *************** grokfndecl (ctype, type, declarator, ori *** 8940,8953 **** if (has_default_arg) { ! cp_error ("default arguments are not allowed in declaration of friend template specialization `%D'", decl); return NULL_TREE; } if (inlinep) { ! cp_error ("`inline' is not allowed in declaration of friend template specialization `%D'", decl); return NULL_TREE; } --- 9086,9099 ---- if (has_default_arg) { ! error ("default arguments are not allowed in declaration of friend template specialization `%D'", decl); return NULL_TREE; } if (inlinep) { ! error ("`inline' is not allowed in declaration of friend template specialization `%D'", decl); return NULL_TREE; } *************** grokfndecl (ctype, type, declarator, ori *** 9009,9015 **** last_function_parms = TREE_CHAIN (last_function_parms); } if (old_decl && DECL_ARTIFICIAL (old_decl)) ! cp_error ("definition of implicitly-declared `%D'", old_decl); if (old_decl) { --- 9155,9161 ---- last_function_parms = TREE_CHAIN (last_function_parms); } if (old_decl && DECL_ARTIFICIAL (old_decl)) ! error ("definition of implicitly-declared `%D'", old_decl); if (old_decl) { *************** grokfndecl (ctype, type, declarator, ori *** 9021,9027 **** /* Attempt to merge the declarations. This can fail, in the case of some illegal specialization declarations. */ if (!duplicate_decls (decl, old_decl)) ! cp_error ("no `%#D' member function declared in class `%T'", decl, ctype); return old_decl; } --- 9167,9173 ---- /* Attempt to merge the declarations. This can fail, in the case of some illegal specialization declarations. */ if (!duplicate_decls (decl, old_decl)) ! error ("no `%#D' member function declared in class `%T'", decl, ctype); return old_decl; } *************** grokvardecl (type, declarator, specbits_ *** 9140,9146 **** if (TYPE_ANONYMOUS_P (t)) /* Ignore for now; `enum { foo } e' is pretty common. */; else ! cp_pedwarn ("non-local variable `%#D' uses local type `%T'", decl, t); } } --- 9286,9292 ---- if (TYPE_ANONYMOUS_P (t)) /* Ignore for now; `enum { foo } e' is pretty common. */; else ! pedwarn ("non-local variable `%#D' uses local type `%T'", decl, t); } } *************** build_ptrmemfunc_type (type) *** 9171,9177 **** /* 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)); --- 9317,9323 ---- /* 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)); *************** build_ptrmemfunc_type (type) *** 9194,9202 **** 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. */ ! if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED) { ! t = build_qualified_type (t, CP_TYPE_QUALS (type)); TYPE_MAIN_VARIANT (t) = unqualified_variant; TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (unqualified_variant); TYPE_NEXT_VARIANT (unqualified_variant) = t; --- 9340,9348 ---- 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. */ ! if (cp_type_quals (type) != TYPE_UNQUALIFIED) { ! t = build_qualified_type (t, cp_type_quals (type)); TYPE_MAIN_VARIANT (t) = unqualified_variant; TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (unqualified_variant); TYPE_NEXT_VARIANT (unqualified_variant) = t; *************** check_static_variable_definition (decl, *** 9230,9236 **** required. */ if (CLASS_TYPE_P (type) || TREE_CODE (type) == REFERENCE_TYPE) { ! cp_error ("invalid in-class initialization of static data member of non-integral type `%T'", type); /* If we just return the declaration, crashes will sometimes occur. We therefore return void_type_node, as if this was a --- 9376,9382 ---- required. */ if (CLASS_TYPE_P (type) || TREE_CODE (type) == REFERENCE_TYPE) { ! error ("invalid in-class initialization of static data member of non-integral type `%T'", type); /* If we just return the declaration, crashes will sometimes occur. We therefore return void_type_node, as if this was a *************** check_static_variable_definition (decl, *** 9239,9248 **** return 1; } else if (!CP_TYPE_CONST_P (type)) ! cp_error ("ISO C++ forbids in-class initialization of non-const static member `%D'", decl); else if (pedantic && !INTEGRAL_TYPE_P (type)) ! cp_pedwarn ("ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'", decl, type); return 0; } --- 9385,9394 ---- return 1; } else if (!CP_TYPE_CONST_P (type)) ! error ("ISO C++ forbids in-class initialization of non-const static member `%D'", decl); else if (pedantic && !INTEGRAL_TYPE_P (type)) ! pedwarn ("ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'", decl, type); return 0; } *************** compute_array_index_type (name, size) *** 9292,9300 **** && TREE_CODE (TREE_TYPE (size)) != BOOLEAN_TYPE) { if (name) ! cp_error ("size of array `%D' has non-integer type", name); else ! cp_error ("size of array has non-integer type"); size = integer_one_node; } --- 9438,9446 ---- && TREE_CODE (TREE_TYPE (size)) != BOOLEAN_TYPE) { if (name) ! error ("size of array `%D' has non-integer type", name); else ! error ("size of array has non-integer type"); size = integer_one_node; } *************** compute_array_index_type (name, size) *** 9314,9322 **** if (INT_CST_LT (size, integer_zero_node)) { if (name) ! cp_error ("size of array `%D' is negative", name); else ! cp_error ("size of array is negative"); size = integer_one_node; } /* Except that an extension we allow zero-sized arrays. We --- 9460,9468 ---- if (INT_CST_LT (size, integer_zero_node)) { if (name) ! error ("size of array `%D' is negative", name); else ! error ("size of array is negative"); size = integer_one_node; } /* Except that an extension we allow zero-sized arrays. We *************** compute_array_index_type (name, size) *** 9325,9343 **** else if (integer_zerop (size) && pedantic && !in_system_header) { if (name) ! cp_pedwarn ("ISO C++ forbids zero-size array `%D'", name); else ! cp_pedwarn ("ISO C++ forbids zero-size array"); } } else if (TREE_CONSTANT (size)) { /* `(int) &fn' is not a valid array bound. */ if (name) ! cp_error ("size of array `%D' is not an integral constant-expression", name); else ! cp_error ("size of array is not an integral constant-expression"); } /* Compute the index of the largest element in the array. It is --- 9471,9489 ---- else if (integer_zerop (size) && pedantic && !in_system_header) { if (name) ! pedwarn ("ISO C++ forbids zero-size array `%D'", name); else ! pedwarn ("ISO C++ forbids zero-size array"); } } else if (TREE_CONSTANT (size)) { /* `(int) &fn' is not a valid array bound. */ if (name) ! error ("size of array `%D' is not an integral constant-expression", name); else ! error ("size of array is not an integral constant-expression"); } /* Compute the index of the largest element in the array. It is *************** compute_array_index_type (name, size) *** 9355,9364 **** if (pedantic) { if (name) ! cp_pedwarn ("ISO C++ forbids variable-size array `%D'", name); else ! cp_pedwarn ("ISO C++ forbids variable-size array"); } /* Create a variable-sized array index type. */ --- 9501,9510 ---- if (pedantic) { if (name) ! pedwarn ("ISO C++ forbids variable-size array `%D'", name); else ! pedwarn ("ISO C++ forbids variable-size array"); } /* Create a variable-sized array index type. */ *************** create_array_type_for_decl (name, type, *** 9428,9436 **** if (error_msg) { if (name) ! cp_error ("declaration of `%D' as %s", name, error_msg); else ! cp_error ("creating %s", error_msg); return error_mark_node; } --- 9574,9582 ---- if (error_msg) { if (name) ! error ("declaration of `%D' as %s", name, error_msg); else ! error ("creating %s", error_msg); return error_mark_node; } *************** create_array_type_for_decl (name, type, *** 9441,9448 **** can be omitted only for the first member of the sequence. */ if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) { ! cp_error ("declaration of `%D' as multidimensional array must have bounds for all dimensions except the first", ! name); return error_mark_node; } --- 9587,9597 ---- 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 `%D' 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; } *************** check_special_function_return_type (sfk, *** 9471,9498 **** { case sfk_constructor: if (type) ! cp_error ("return type specification for constructor invalid"); - /* In the new ABI constructors do not return a value. */ type = void_type_node; break; case sfk_destructor: if (type) ! cp_error ("return type specification for destructor invalid"); type = void_type_node; break; case sfk_conversion: if (type && !same_type_p (type, optype)) ! cp_error ("operator `%T' declared to return `%T'", optype, type); else if (type) ! cp_pedwarn ("return type specified for `operator %T'", optype); type = optype; break; default: ! my_friendly_abort (20000408); break; } --- 9620,9646 ---- { case sfk_constructor: if (type) ! error ("return type specification for constructor invalid"); type = void_type_node; break; case sfk_destructor: if (type) ! error ("return type specification for destructor invalid"); type = void_type_node; break; case sfk_conversion: if (type && !same_type_p (type, optype)) ! error ("operator `%T' declared to return `%T'", optype, type); else if (type) ! pedwarn ("return type specified for `operator %T'", optype); type = optype; break; default: ! abort (); break; } *************** check_special_function_return_type (sfk, *** 9526,9533 **** BITFIELD for a field with specified width. INITIALIZED is 1 if the decl has an initializer. ! ATTRLIST is a TREE_LIST node with prefix attributes in TREE_VALUE and ! normal attributes in TREE_PURPOSE, or NULL_TREE. In the TYPENAME case, DECLARATOR is really an abstract declarator. It may also be so in the PARM case, for a prototype where the --- 9674,9682 ---- BITFIELD for a field with specified width. INITIALIZED is 1 if the decl has an initializer. ! 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. In the TYPENAME case, DECLARATOR is really an abstract declarator. It may also be so in the PARM case, for a prototype where the *************** grokdeclarator (declarator, declspecs, d *** 9565,9585 **** tree declarator; enum decl_context decl_context; int initialized; ! tree attrlist; { RID_BIT_TYPE specbits; int nclasses = 0; tree spec; tree type = NULL_TREE; int longlong = 0; - int constp; - int restrictp; - int volatilep; int type_quals; int virtualp, explicitp, friendp, inlinep, staticp; int explicit_int = 0; int explicit_char = 0; int defaulted_int = 0; tree typedef_decl = NULL_TREE; const char *name; tree typedef_type = NULL_TREE; --- 9714,9734 ---- tree declarator; enum decl_context decl_context; int initialized; ! tree *attrlist; { RID_BIT_TYPE specbits; int nclasses = 0; tree spec; tree type = NULL_TREE; int longlong = 0; int type_quals; int virtualp, explicitp, friendp, inlinep, staticp; int explicit_int = 0; int explicit_char = 0; int defaulted_int = 0; + int extern_langp = 0; + tree dependant_name = NULL_TREE; + tree typedef_decl = NULL_TREE; const char *name; tree typedef_type = NULL_TREE; *************** grokdeclarator (declarator, declspecs, d *** 9588,9594 **** int bitfield = 0; #if 0 /* See the code below that used this. */ ! tree decl_machine_attr = NULL_TREE; #endif /* Set this to error_mark_node for FIELD_DECLs we could not handle properly. All FIELD_DECLs we build here have `init' put into their DECL_INITIAL. */ --- 9737,9743 ---- int bitfield = 0; #if 0 /* See the code below that used this. */ ! tree decl_attr = NULL_TREE; #endif /* Set this to error_mark_node for FIELD_DECLs we could not handle properly. All FIELD_DECLs we build here have `init' put into their DECL_INITIAL. */ *************** grokdeclarator (declarator, declspecs, d *** 9607,9614 **** tree raises = NULL_TREE; int template_count = 0; tree in_namespace = NULL_TREE; ! tree inner_attrs; ! int ignore_attrs; RIDBIT_RESET_ALL (specbits); if (decl_context == FUNCDEF) --- 9756,9762 ---- tree raises = NULL_TREE; int template_count = 0; tree in_namespace = NULL_TREE; ! tree returned_attrs = NULL_TREE; RIDBIT_RESET_ALL (specbits); if (decl_context == FUNCDEF) *************** grokdeclarator (declarator, declspecs, d *** 9674,9680 **** if (rename) { ! cp_error ("destructor `%T' must match class name `%T'", name, rename); TREE_OPERAND (decl, 0) = rename; } --- 9822,9828 ---- if (rename) { ! error ("destructor `%T' must match class name `%T'", name, rename); TREE_OPERAND (decl, 0) = rename; } *************** grokdeclarator (declarator, declspecs, d *** 9699,9722 **** cp_finish_decl so we can get the variable initialized... */ ! tree attributes, prefix_attributes; *next = TREE_OPERAND (decl, 0); init = CALL_DECLARATOR_PARMS (decl); if (attrlist) { ! attributes = TREE_PURPOSE (attrlist); ! prefix_attributes = TREE_VALUE (attrlist); } else { attributes = NULL_TREE; - prefix_attributes = NULL_TREE; } decl = start_decl (declarator, declspecs, 1, ! attributes, prefix_attributes); decl_type_access_control (decl); if (decl) { --- 9847,9868 ---- cp_finish_decl so we can get the variable initialized... */ ! tree attributes; *next = TREE_OPERAND (decl, 0); init = CALL_DECLARATOR_PARMS (decl); if (attrlist) { ! attributes = *attrlist; } else { attributes = NULL_TREE; } decl = start_decl (declarator, declspecs, 1, ! attributes, NULL_TREE); decl_type_access_control (decl); if (decl) { *************** grokdeclarator (declarator, declspecs, d *** 9726,9732 **** finish_decl (decl, init, NULL_TREE); } else ! cp_error ("invalid declarator"); return 0; } innermost_code = TREE_CODE (decl); --- 9872,9878 ---- finish_decl (decl, init, NULL_TREE); } else ! error ("invalid declarator"); return 0; } innermost_code = TREE_CODE (decl); *************** grokdeclarator (declarator, declspecs, d *** 9779,9785 **** if (C_IS_RESERVED_WORD (dname)) { ! cp_error ("declarator-id missing; using reserved word `%D'", dname); name = IDENTIFIER_POINTER (dname); } --- 9925,9931 ---- if (C_IS_RESERVED_WORD (dname)) { ! error ("declarator-id missing; using reserved word `%D'", dname); name = IDENTIFIER_POINTER (dname); } *************** grokdeclarator (declarator, declspecs, d *** 9823,9833 **** else if (TREE_CODE (cname) == TEMPLATE_TYPE_PARM || TREE_CODE (cname) == BOUND_TEMPLATE_TEMPLATE_PARM) { ! cp_error ("`%T::%D' is not a valid declarator", cname, ! TREE_OPERAND (decl, 1)); ! cp_error (" perhaps you want `typename %T::%D' to make it a type", ! cname, TREE_OPERAND (decl, 1)); ! return void_type_node; } else if (ctype == NULL_TREE) ctype = cname; --- 9969,9978 ---- else if (TREE_CODE (cname) == TEMPLATE_TYPE_PARM || TREE_CODE (cname) == BOUND_TEMPLATE_TEMPLATE_PARM) { ! /* This might be declaring a member of a template ! parm to be a friend. */ ! ctype = cname; ! dependant_name = TREE_OPERAND (decl, 1); } else if (ctype == NULL_TREE) ctype = cname; *************** grokdeclarator (declarator, declspecs, d *** 9837,9843 **** { if (! UNIQUELY_DERIVED_FROM_P (cname, ctype)) { ! cp_error ("type `%T' is not derived from type `%T'", cname, ctype); TREE_OPERAND (decl, 0) = NULL_TREE; } --- 9982,9988 ---- { if (! UNIQUELY_DERIVED_FROM_P (cname, ctype)) { ! error ("type `%T' is not derived from type `%T'", cname, ctype); TREE_OPERAND (decl, 0) = NULL_TREE; } *************** grokdeclarator (declarator, declspecs, d *** 9883,9891 **** case TYPE_DECL: /* Parse error puts this typespec where a declarator should go. */ ! cp_error ("`%T' specified as declarator-id", DECL_NAME (decl)); if (TREE_TYPE (decl) == current_class_type) ! cp_error (" perhaps you want `%T' for a constructor", current_class_name); dname = DECL_NAME (decl); name = IDENTIFIER_POINTER (dname); --- 10028,10036 ---- case TYPE_DECL: /* Parse error puts this typespec where a declarator should go. */ ! error ("`%T' specified as declarator-id", DECL_NAME (decl)); if (TREE_TYPE (decl) == current_class_type) ! error (" perhaps you want `%T' for a constructor", current_class_name); dname = DECL_NAME (decl); name = IDENTIFIER_POINTER (dname); *************** grokdeclarator (declarator, declspecs, d *** 9899,9906 **** break; default: ! cp_compiler_error ("`%D' as declarator", decl); ! return 0; /* We used to do a 155 abort here. */ } } } --- 10044,10050 ---- break; default: ! internal_error ("`%D' as declarator", decl); } } } *************** grokdeclarator (declarator, declspecs, d *** 9915,9921 **** && innermost_code != CALL_EXPR && ! (ctype && declspecs == NULL_TREE)) { ! cp_error ("declaration of `%D' as non-function", dname); return void_type_node; } --- 10059,10065 ---- && innermost_code != CALL_EXPR && ! (ctype && declspecs == NULL_TREE)) { ! error ("declaration of `%D' as non-function", dname); return void_type_node; } *************** grokdeclarator (declarator, declspecs, d *** 9974,9979 **** --- 10118,10131 ---- id = TREE_VALUE (spec); + /* If the entire declaration is itself tagged as deprecated then + suppress reports of deprecated items. */ + if (!adding_implicit_members && id && TREE_DEPRECATED (id)) + { + if (deprecated_state != DEPRECATED_SUPPRESS) + warn_deprecated_use (id); + } + if (TREE_CODE (id) == IDENTIFIER_NODE) { if (id == ridpointers[(int) RID_INT] *************** grokdeclarator (declarator, declspecs, d *** 9986,9992 **** if (id == ridpointers[(int) RID_BOOL]) error ("`bool' is now a keyword"); else ! cp_error ("extraneous `%T' ignored", id); } else { --- 10138,10144 ---- if (id == ridpointers[(int) RID_BOOL]) error ("`bool' is now a keyword"); else ! error ("extraneous `%T' ignored", id); } else { *************** grokdeclarator (declarator, declspecs, d *** 10002,10008 **** if (IDENTIFIER_HAS_TYPE_VALUE (id)) { if (type) ! cp_error ("multiple declarations `%T' and `%T'", type, id); else type = IDENTIFIER_TYPE_VALUE (id); goto found; --- 10154,10160 ---- if (IDENTIFIER_HAS_TYPE_VALUE (id)) { if (type) ! error ("multiple declarations `%T' and `%T'", type, id); else type = IDENTIFIER_TYPE_VALUE (id); goto found; *************** grokdeclarator (declarator, declspecs, d *** 10023,10043 **** } else if (RIDBIT_SETP (i, specbits)) pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); RIDBIT_SET (i, specbits); goto found; } } } - /* C++ aggregate types. */ else if (TREE_CODE (id) == TYPE_DECL) { if (type) ! cp_error ("multiple declarations `%T' and `%T'", type, TREE_TYPE (id)); else { type = TREE_TYPE (id); TREE_VALUE (spec) = type; } goto found; } --- 10175,10199 ---- } else if (RIDBIT_SETP (i, specbits)) pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); + if (i == (int)RID_EXTERN + && TREE_PURPOSE (spec) == error_mark_node) + /* This extern was part of a language linkage. */ + extern_langp = 1; RIDBIT_SET (i, specbits); goto found; } } } else if (TREE_CODE (id) == TYPE_DECL) { if (type) ! error ("multiple declarations `%T' and `%T'", type, TREE_TYPE (id)); else { type = TREE_TYPE (id); TREE_VALUE (spec) = type; + typedef_decl = id; } goto found; } *************** grokdeclarator (declarator, declspecs, d *** 10052,10061 **** else { type = TREE_TYPE (t); - #if 0 - /* See the code below that used this. */ - decl_machine_attr = DECL_MACHINE_ATTRIBUTES (id); - #endif typedef_decl = t; } } --- 10208,10213 ---- *************** grokdeclarator (declarator, declspecs, d *** 10066,10071 **** --- 10218,10228 ---- found: ; } + #if 0 + /* See the code below that used this. */ + if (typedef_decl) + decl_attr = DECL_ATTRIBUTES (typedef_decl); + #endif typedef_type = type; /* No type at all: default to `int', and set DEFAULTED_INT *************** grokdeclarator (declarator, declspecs, d *** 10091,10101 **** 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 ! && MAIN_NAME_P (dname) && ctype == NULL_TREE && in_namespace == NULL_TREE && current_namespace == global_namespace); --- 10248,10258 ---- 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 && MAIN_NAME_P (dname) && ctype == NULL_TREE && in_namespace == NULL_TREE && current_namespace == global_namespace); *************** grokdeclarator (declarator, declspecs, d *** 10103,10116 **** if (in_system_header || flag_ms_extensions) /* Allow it, sigh. */; else if (pedantic || ! is_main) ! cp_pedwarn ("ISO C++ forbids declaration of `%s' with no type", name); else if (warn_return_type) ! cp_warning ("ISO C++ forbids declaration of `%s' with no type", name); type = integer_type_node; } ctype = NULL_TREE; --- 10260,10288 ---- if (in_system_header || flag_ms_extensions) /* Allow it, sigh. */; else if (pedantic || ! is_main) ! pedwarn ("ISO C++ forbids declaration of `%s' with no type", name); else if (warn_return_type) ! warning ("ISO C++ forbids declaration of `%s' with no type", name); type = integer_type_node; } + + if (type && IMPLICIT_TYPENAME_P (type)) + { + /* The implicit typename extension is deprecated and will be + removed. Warn about its use now. */ + warning ("`%T' is implicitly a typename", type); + cp_deprecated ("implicit typename"); + + /* Now remove its implicitness, so that we don't warn again. + For instance this might be a typedef, and we do not want to + warn on uses of the typedef itself. Simply clearing the + TREE_TYPE is insufficient. */ + type = copy_node (type); + TREE_TYPE (type) = NULL_TREE; + } ctype = NULL_TREE; *************** grokdeclarator (declarator, declspecs, d *** 10124,10130 **** { RIDBIT_RESET (RID_LONG, specbits); type = build_qualified_type (long_double_type_node, ! CP_TYPE_QUALS (type)); } /* Check all other uses of type modifiers. */ --- 10296,10302 ---- { RIDBIT_RESET (RID_LONG, specbits); type = build_qualified_type (long_double_type_node, ! cp_type_quals (type)); } /* Check all other uses of type modifiers. */ *************** grokdeclarator (declarator, declspecs, d *** 10254,10279 **** type = build_complex_type (type); } ! if (sfk == sfk_conversion ! && (RIDBIT_SETP (RID_CONST, specbits) ! || RIDBIT_SETP (RID_VOLATILE, specbits) ! || RIDBIT_SETP (RID_RESTRICT, specbits))) ! cp_error ("qualifiers are not allowed on declaration of `operator %T'", ctor_return_type); ! /* Set CONSTP if this declaration is `const', whether by ! explicit specification or via a typedef. ! Likewise for VOLATILEP. */ ! ! constp = !! RIDBIT_SETP (RID_CONST, specbits) + CP_TYPE_CONST_P (type); ! restrictp = ! !! RIDBIT_SETP (RID_RESTRICT, specbits) + CP_TYPE_RESTRICT_P (type); ! volatilep = ! !! RIDBIT_SETP (RID_VOLATILE, specbits) + CP_TYPE_VOLATILE_P (type); ! type_quals = ((constp ? TYPE_QUAL_CONST : 0) ! | (restrictp ? TYPE_QUAL_RESTRICT : 0) ! | (volatilep ? TYPE_QUAL_VOLATILE : 0)); ! type = cp_build_qualified_type (type, type_quals); staticp = 0; inlinep = !! RIDBIT_SETP (RID_INLINE, specbits); virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits); --- 10426,10449 ---- type = build_complex_type (type); } ! type_quals = TYPE_UNQUALIFIED; ! if (RIDBIT_SETP (RID_CONST, specbits)) ! type_quals |= TYPE_QUAL_CONST; ! if (RIDBIT_SETP (RID_VOLATILE, specbits)) ! type_quals |= TYPE_QUAL_VOLATILE; ! if (RIDBIT_SETP (RID_RESTRICT, specbits)) ! type_quals |= TYPE_QUAL_RESTRICT; ! if (sfk == sfk_conversion && type_quals != TYPE_UNQUALIFIED) ! error ("qualifiers are not allowed on declaration of `operator %T'", 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_error | tf_warning)); ! /* We might have ignored or rejected some of the qualifiers. */ ! type_quals = cp_type_quals (type); ! staticp = 0; inlinep = !! RIDBIT_SETP (RID_INLINE, specbits); virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits); *************** grokdeclarator (declarator, declspecs, d *** 10286,10304 **** if (virtualp && staticp == 2) { ! cp_error ("member `%D' cannot be declared both virtual and static", dname); staticp = 0; } friendp = RIDBIT_SETP (RID_FRIEND, specbits); RIDBIT_RESET (RID_FRIEND, specbits); /* Warn if two storage classes are given. Default to `auto'. */ if (RIDBIT_ANY_SET (specbits)) { if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++; ! if (RIDBIT_SETP (RID_EXTERN, specbits)) nclasses++; if (decl_context == PARM && nclasses > 0) error ("storage class specifiers invalid in parameter declarations"); if (RIDBIT_SETP (RID_TYPEDEF, specbits)) --- 10456,10480 ---- if (virtualp && staticp == 2) { ! error ("member `%D' cannot be declared both virtual and static", dname); staticp = 0; } friendp = RIDBIT_SETP (RID_FRIEND, specbits); RIDBIT_RESET (RID_FRIEND, specbits); + if (dependant_name && !friendp) + { + error ("`%T::%D' is not a valid declarator", ctype, dependant_name); + return void_type_node; + } + /* Warn if two storage classes are given. Default to `auto'. */ if (RIDBIT_ANY_SET (specbits)) { if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++; ! if (RIDBIT_SETP (RID_EXTERN, specbits) && !extern_langp) nclasses++; if (decl_context == PARM && nclasses > 0) error ("storage class specifiers invalid in parameter declarations"); if (RIDBIT_SETP (RID_TYPEDEF, specbits)) *************** grokdeclarator (declarator, declspecs, d *** 10309,10314 **** --- 10485,10492 ---- } if (RIDBIT_SETP (RID_AUTO, specbits)) nclasses++; if (RIDBIT_SETP (RID_REGISTER, specbits)) nclasses++; + if (!nclasses && !friendp && extern_langp) + nclasses++; } /* Give error if `virtual' is used outside of class declaration. */ *************** grokdeclarator (declarator, declspecs, d *** 10413,10421 **** Descend through it, creating more complex types, until we reach the declared identifier (or NULL_TREE, in an absolute declarator). */ - inner_attrs = NULL_TREE; - ignore_attrs = 0; - while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE && TREE_CODE (declarator) != TEMPLATE_ID_EXPR) { --- 10591,10596 ---- *************** grokdeclarator (declarator, declspecs, d *** 10464,10491 **** } } - /* See the comment for the TREE_LIST case, below. */ - if (ignore_attrs) - ignore_attrs = 0; - else if (inner_attrs) - { - decl_attributes (type, inner_attrs, NULL_TREE); - inner_attrs = NULL_TREE; - } - switch (TREE_CODE (declarator)) { case TREE_LIST: { /* We encode a declarator with embedded attributes using ! a TREE_LIST. The attributes apply to the declarator ! directly inside them, so we have to skip an iteration ! before applying them to the type. If the declarator just ! inside is the declarator-id, we apply the attrs to the ! decl itself. */ ! inner_attrs = TREE_PURPOSE (declarator); ! ignore_attrs = 1; declarator = TREE_VALUE (declarator); } break; --- 10639,10670 ---- } } switch (TREE_CODE (declarator)) { case TREE_LIST: { /* We encode a declarator with embedded attributes using ! a TREE_LIST. */ ! tree attrs = TREE_PURPOSE (declarator); ! tree inner_decl; ! int attr_flags; ! declarator = TREE_VALUE (declarator); + inner_decl = declarator; + while (inner_decl != NULL_TREE + && TREE_CODE (inner_decl) == TREE_LIST) + inner_decl = TREE_VALUE (inner_decl); + attr_flags = 0; + if (inner_decl == NULL_TREE + || TREE_CODE (inner_decl) == IDENTIFIER_NODE) + attr_flags |= (int) ATTR_FLAG_DECL_NEXT; + if (TREE_CODE (inner_decl) == CALL_EXPR) + attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT; + if (TREE_CODE (inner_decl) == ARRAY_REF) + attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT; + returned_attrs = decl_attributes (&type, + chainon (returned_attrs, attrs), + attr_flags); } break; *************** grokdeclarator (declarator, declspecs, d *** 10510,10516 **** && TYPE_DOMAIN (type) != NULL_TREE && !TREE_CONSTANT (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))) { ! cp_error ("size of member `%D' is not constant", dname); /* Proceed with arbitrary constant size, so that offset computations don't get confused. */ type = create_array_type_for_decl (dname, TREE_TYPE (type), --- 10689,10695 ---- && TYPE_DOMAIN (type) != NULL_TREE && !TREE_CONSTANT (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))) { ! error ("size of member `%D' is not constant", dname); /* Proceed with arbitrary constant size, so that offset computations don't get confused. */ type = create_array_type_for_decl (dname, TREE_TYPE (type), *************** grokdeclarator (declarator, declspecs, d *** 10592,10598 **** error ("destructor cannot be static member function"); if (quals) { ! cp_error ("destructors may not be `%s'", IDENTIFIER_POINTER (TREE_VALUE (quals))); quals = NULL_TREE; } --- 10771,10777 ---- error ("destructor cannot be static member function"); if (quals) { ! error ("destructors may not be `%s'", IDENTIFIER_POINTER (TREE_VALUE (quals))); quals = NULL_TREE; } *************** grokdeclarator (declarator, declspecs, d *** 10621,10627 **** } if (quals) { ! cp_error ("constructors may not be `%s'", IDENTIFIER_POINTER (TREE_VALUE (quals))); quals = NULL_TREE; } --- 10800,10806 ---- } if (quals) { ! error ("constructors may not be `%s'", IDENTIFIER_POINTER (TREE_VALUE (quals))); quals = NULL_TREE; } *************** grokdeclarator (declarator, declspecs, d *** 10661,10667 **** if (decl_context == NORMAL) error ("friend declaration not in class definition"); if (current_function_decl && funcdef_flag) ! cp_error ("can't define friend function `%s' in a local class definition", name); } --- 10840,10846 ---- if (decl_context == NORMAL) error ("friend declaration not in class definition"); if (current_function_decl && funcdef_flag) ! error ("can't define friend function `%s' in a local class definition", name); } *************** grokdeclarator (declarator, declspecs, d *** 10685,10691 **** if (arg_types != void_list_node) { ! cp_error ("destructors may not have parameters"); arg_types = void_list_node; last_function_parms = NULL_TREE; } --- 10864,10870 ---- if (arg_types != void_list_node) { ! error ("destructors may not have parameters"); arg_types = void_list_node; last_function_parms = NULL_TREE; } *************** grokdeclarator (declarator, declspecs, d *** 10726,10732 **** && (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE || TREE_CODE (TREE_TYPE (type)) == REFERENCE_TYPE)) { ! cp_error ("cannot declare pointer to `%#T' member", TREE_TYPE (type)); type = TREE_TYPE (type); } --- 10905,10911 ---- && (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE || TREE_CODE (TREE_TYPE (type)) == REFERENCE_TYPE)) { ! error ("cannot declare pointer to `%#T' member", TREE_TYPE (type)); type = TREE_TYPE (type); } *************** grokdeclarator (declarator, declspecs, d *** 10757,10777 **** { register tree typemodlist; int erred = 0; ! ! constp = 0; ! volatilep = 0; ! restrictp = 0; for (typemodlist = TREE_TYPE (declarator); typemodlist; typemodlist = TREE_CHAIN (typemodlist)) { tree qualifier = TREE_VALUE (typemodlist); if (qualifier == ridpointers[(int) RID_CONST]) ! constp++; else if (qualifier == ridpointers[(int) RID_VOLATILE]) ! volatilep++; else if (qualifier == ridpointers[(int) RID_RESTRICT]) ! restrictp++; else if (!erred) { erred = 1; --- 10936,10965 ---- { register tree typemodlist; int erred = 0; ! int constp = 0; ! int volatilep = 0; ! int restrictp = 0; ! for (typemodlist = TREE_TYPE (declarator); typemodlist; typemodlist = TREE_CHAIN (typemodlist)) { tree qualifier = TREE_VALUE (typemodlist); if (qualifier == ridpointers[(int) RID_CONST]) ! { ! constp++; ! type_quals |= TYPE_QUAL_CONST; ! } else if (qualifier == ridpointers[(int) RID_VOLATILE]) ! { ! volatilep++; ! type_quals |= TYPE_QUAL_VOLATILE; ! } else if (qualifier == ridpointers[(int) RID_RESTRICT]) ! { ! restrictp++; ! type_quals |= TYPE_QUAL_RESTRICT; ! } else if (!erred) { erred = 1; *************** grokdeclarator (declarator, declspecs, d *** 10784,10803 **** pedwarn ("duplicate `volatile'"); if (restrictp > 1) pedwarn ("duplicate `restrict'"); - - type_quals = ((constp ? TYPE_QUAL_CONST : 0) - | (restrictp ? TYPE_QUAL_RESTRICT : 0) - | (volatilep ? TYPE_QUAL_VOLATILE : 0)); - if (TREE_CODE (declarator) == ADDR_EXPR - && (constp || volatilep)) - { - if (constp) - pedwarn ("discarding `const' applied to a reference"); - if (volatilep) - pedwarn ("discarding `volatile' applied to a reference"); - type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); - } type = cp_build_qualified_type (type, type_quals); } declarator = TREE_OPERAND (declarator, 0); ctype = NULL_TREE; --- 10972,10979 ---- pedwarn ("duplicate `volatile'"); if (restrictp > 1) pedwarn ("duplicate `restrict'"); type = cp_build_qualified_type (type, type_quals); + type_quals = cp_type_quals (type); } declarator = TREE_OPERAND (declarator, 0); ctype = NULL_TREE; *************** grokdeclarator (declarator, declspecs, d *** 10841,10847 **** && uses_template_parms (current_class_type)) { tree args = current_template_args (); ! type = tsubst (type, args, /*complain=*/1, NULL_TREE); } /* This pop_nested_class corresponds to the --- 11017,11024 ---- && uses_template_parms (current_class_type)) { tree args = current_template_args (); ! type = tsubst (type, args, tf_error | tf_warning, ! NULL_TREE); } /* This pop_nested_class corresponds to the *************** grokdeclarator (declarator, declspecs, d *** 10852,10858 **** TREE_COMPLEXITY (declarator) = current_class_depth; } else ! my_friendly_abort (16); if (TREE_OPERAND (declarator, 0) == NULL_TREE) { --- 11029,11035 ---- TREE_COMPLEXITY (declarator) = current_class_depth; } else ! abort (); if (TREE_OPERAND (declarator, 0) == NULL_TREE) { *************** grokdeclarator (declarator, declspecs, d *** 10905,10911 **** Is this ill-formed? */ if (pedantic) ! cp_pedwarn ("extra qualification `%T::' on member `%s' ignored", ctype, name); } else if (TREE_CODE (type) == FUNCTION_TYPE) --- 11082,11088 ---- Is this ill-formed? */ if (pedantic) ! pedwarn ("extra qualification `%T::' on member `%s' ignored", ctype, name); } else if (TREE_CODE (type) == FUNCTION_TYPE) *************** grokdeclarator (declarator, declspecs, d *** 10915,10921 **** TYPE_ARG_TYPES (type)); else { ! cp_error ("cannot declare member function `%T::%s' within `%T'", ctype, name, current_class_type); return void_type_node; } --- 11092,11098 ---- TYPE_ARG_TYPES (type)); else { ! error ("cannot declare member function `%T::%s' within `%T'", ctype, name, current_class_type); return void_type_node; } *************** grokdeclarator (declarator, declspecs, d *** 10930,10936 **** if (current_class_type) { ! cp_error ("cannot declare member `%T::%s' within `%T'", ctype, name, current_class_type); return void_type_node; } --- 11107,11113 ---- if (current_class_type) { ! error ("cannot declare member `%T::%s' within `%T'", ctype, name, current_class_type); return void_type_node; } *************** grokdeclarator (declarator, declspecs, d *** 10945,10951 **** declarator = sname; } else if (TREE_CODE (sname) == SCOPE_REF) ! my_friendly_abort (17); else { done_scoping: --- 11122,11128 ---- declarator = sname; } else if (TREE_CODE (sname) == SCOPE_REF) ! abort (); else { done_scoping: *************** grokdeclarator (declarator, declspecs, d *** 10980,11002 **** break; default: ! my_friendly_abort (158); } } ! /* See the comment for the TREE_LIST case, above. */ ! if (inner_attrs) { ! if (! ignore_attrs) ! decl_attributes (type, inner_attrs, NULL_TREE); ! else if (attrlist) ! TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist)); else ! attrlist = build_tree_list (NULL_TREE, inner_attrs); } /* Now TYPE has the actual type. */ if (explicitp == 1 || (explicitp && friendp)) { /* [dcl.fct.spec] The explicit specifier shall only be used in --- 11157,11188 ---- break; default: ! abort (); } } ! if (returned_attrs) { ! if (attrlist) ! *attrlist = chainon (returned_attrs, *attrlist); else ! attrlist = &returned_attrs; } /* Now TYPE has the actual type. */ + /* Did array size calculations overflow? */ + + if (TREE_CODE (type) == ARRAY_TYPE + && COMPLETE_TYPE_P (type) + && TREE_OVERFLOW (TYPE_SIZE (type))) + { + error ("size of array `%s' 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 (explicitp == 1 || (explicitp && friendp)) { /* [dcl.fct.spec] The explicit specifier shall only be used in *************** grokdeclarator (declarator, declspecs, d *** 11031,11037 **** else if (type_quals & TYPE_QUAL_CONST) { error ("const `%s' cannot be declared `mutable'", name); ! RIDBIT_RESET (RID_MUTABLE, specbits); } } --- 11217,11223 ---- else if (type_quals & TYPE_QUAL_CONST) { error ("const `%s' cannot be declared `mutable'", name); ! RIDBIT_RESET (RID_MUTABLE, specbits); } } *************** grokdeclarator (declarator, declspecs, d *** 11043,11054 **** /* OK */; else if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR) { ! cp_error ("template-id `%D' used as a declarator", declarator); declarator = dname; } else /* Unexpected declarator format. */ ! my_friendly_abort (990210); /* If this is declaring a typedef name, return a TYPE_DECL. */ --- 11229,11240 ---- /* OK */; else if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR) { ! error ("template-id `%D' used as a declarator", declarator); declarator = dname; } else /* Unexpected declarator format. */ ! abort (); /* If this is declaring a typedef name, return a TYPE_DECL. */ *************** grokdeclarator (declarator, declspecs, d *** 11064,11070 **** if (decl_context == FIELD) { if (declarator == constructor_name (current_class_type)) ! cp_pedwarn ("ISO C++ forbids nested type `%D' with same name as enclosing class", declarator); decl = build_lang_decl (TYPE_DECL, declarator, type); } --- 11250,11256 ---- if (decl_context == FIELD) { if (declarator == constructor_name (current_class_type)) ! pedwarn ("ISO C++ forbids nested type `%D' with same name as enclosing class", declarator); decl = build_lang_decl (TYPE_DECL, declarator, type); } *************** grokdeclarator (declarator, declspecs, d *** 11084,11090 **** && TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL && TYPE_ANONYMOUS_P (type) ! && CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED) { tree oldname = TYPE_NAME (type); tree t; --- 11270,11278 ---- && TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL && TYPE_ANONYMOUS_P (type) ! /* Don't do this if there are attributes. */ ! && (!attrlist || !*attrlist) ! && cp_type_quals (type) == TYPE_UNQUALIFIED) { tree oldname = TYPE_NAME (type); tree t; *************** grokdeclarator (declarator, declspecs, d *** 11142,11156 **** /* 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 each identifier gets ! a distinct type, so that each identifier's size can be ! controlled separately by its own initializer. */ ! if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE ! && TYPE_DOMAIN (type) == NULL_TREE) ! { ! type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type)); ! } /* Detect where we're using a typedef of function type to declare a function. last_function_parms will not be set, so we must create --- 11330,11342 ---- /* 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. last_function_parms will not be set, so we must create *************** grokdeclarator (declarator, declspecs, d *** 11187,11198 **** { if (type_quals != TYPE_UNQUALIFIED) { ! cp_error ("type qualifiers specified for friend class declaration"); type_quals = TYPE_UNQUALIFIED; } if (inlinep) { ! cp_error ("`inline' specified for friend class declaration"); inlinep = 0; } --- 11373,11384 ---- { if (type_quals != TYPE_UNQUALIFIED) { ! error ("type qualifiers specified for friend class declaration"); type_quals = TYPE_UNQUALIFIED; } if (inlinep) { ! error ("`inline' specified for friend class declaration"); inlinep = 0; } *************** grokdeclarator (declarator, declspecs, d *** 11202,11215 **** || IMPLICIT_TYPENAME_P (type))) { if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) ! cp_pedwarn ("template parameters cannot be friends"); else if (TREE_CODE (type) == TYPENAME_TYPE) ! cp_pedwarn ("\ friend declaration requires class-key, i.e. `friend class %T::%T'", constructor_name (current_class_type), TYPE_IDENTIFIER (type)); else ! cp_pedwarn ("\ friend declaration requires class-key, i.e. `friend %#T'", type); } --- 11388,11401 ---- || IMPLICIT_TYPENAME_P (type))) { if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) ! pedwarn ("template parameters cannot be friends"); else if (TREE_CODE (type) == TYPENAME_TYPE) ! pedwarn ("\ friend declaration requires class-key, i.e. `friend class %T::%T'", constructor_name (current_class_type), TYPE_IDENTIFIER (type)); else ! pedwarn ("\ friend declaration requires class-key, i.e. `friend %#T'", type); } *************** friend declaration requires class-key, i *** 11223,11229 **** if (current_class_type) make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type)); else ! cp_error ("trying to make class `%T' a friend of global scope", type); type = void_type_node; --- 11409,11415 ---- if (current_class_type) make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type)); else ! error ("trying to make class `%T' a friend of global scope", type); type = void_type_node; *************** friend declaration requires class-key, i *** 11234,11240 **** if (ctype == NULL_TREE) { if (TREE_CODE (type) != METHOD_TYPE) ! cp_error ("invalid qualifiers on non-member function type"); else ctype = TYPE_METHOD_BASETYPE (type); } --- 11420,11426 ---- if (ctype == NULL_TREE) { if (TREE_CODE (type) != METHOD_TYPE) ! error ("invalid qualifiers on non-member function type"); else ctype = TYPE_METHOD_BASETYPE (type); } *************** friend declaration requires class-key, i *** 11253,11259 **** && TREE_CODE (type) != UNION_TYPE && ! bitfield) { ! cp_error ("abstract declarator `%T' used as declaration", type); declarator = make_anon_name (); } --- 11439,11445 ---- && TREE_CODE (type) != UNION_TYPE && ! bitfield) { ! error ("abstract declarator `%T' used as declaration", type); declarator = make_anon_name (); } *************** friend declaration requires class-key, i *** 11269,11275 **** else if (TREE_CODE (declarator) == IDENTIFIER_NODE) { if (IDENTIFIER_OPNAME_P (declarator)) ! my_friendly_abort (356); else error ("variable or field `%s' declared void", name); } --- 11455,11461 ---- else if (TREE_CODE (declarator) == IDENTIFIER_NODE) { if (IDENTIFIER_OPNAME_P (declarator)) ! abort (); else error ("variable or field `%s' declared void", name); } *************** friend declaration requires class-key, i *** 11330,11336 **** else if (in_namespace && !friendp) { /* Something like struct S { int N::j; }; */ ! cp_error ("invalid use of `::'"); decl = NULL_TREE; } else if (TREE_CODE (type) == FUNCTION_TYPE) --- 11516,11522 ---- else if (in_namespace && !friendp) { /* Something like struct S { int N::j; }; */ ! error ("invalid use of `::'"); decl = NULL_TREE; } else if (TREE_CODE (type) == FUNCTION_TYPE) *************** friend declaration requires class-key, i *** 11342,11348 **** typedefs. */ if (friendp && declarator == ridpointers[(int) RID_SIGNED]) { ! cp_error ("function `%D' cannot be declared friend", declarator); friendp = 0; } --- 11528,11534 ---- typedefs. */ if (friendp && declarator == ridpointers[(int) RID_SIGNED]) { ! error ("function `%D' cannot be declared friend", declarator); friendp = 0; } *************** friend declaration requires class-key, i *** 11354,11360 **** if (ctype == NULL_TREE) { ! cp_error ("can't make `%D' into a method -- not in a class", declarator); return void_type_node; } --- 11540,11546 ---- if (ctype == NULL_TREE) { ! error ("can't make `%D' into a method -- not in a class", declarator); return void_type_node; } *************** friend declaration requires class-key, i *** 11363,11369 **** ARM 9.5 */ if (virtualp && TREE_CODE (ctype) == UNION_TYPE) { ! cp_error ("function `%D' declared virtual inside a union", declarator); return void_type_node; } --- 11549,11555 ---- ARM 9.5 */ if (virtualp && TREE_CODE (ctype) == UNION_TYPE) { ! error ("function `%D' declared virtual inside a union", declarator); return void_type_node; } *************** friend declaration requires class-key, i *** 11375,11381 **** { if (virtualp) { ! cp_error ("`%D' cannot be declared virtual, since it is always static", declarator); virtualp = 0; } --- 11561,11567 ---- { if (virtualp) { ! error ("`%D' cannot be declared virtual, since it is always static", declarator); virtualp = 0; } *************** friend declaration requires class-key, i *** 11401,11408 **** return decl; #if 0 /* This clobbers the attrs stored in `decl' from `attrlist'. */ ! /* The decl and setting of decl_machine_attr is also turned off. */ ! decl = build_decl_attribute_variant (decl, decl_machine_attr); #endif /* [class.conv.ctor] --- 11587,11594 ---- return decl; #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] *************** friend declaration requires class-key, i *** 11448,11456 **** && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) { if (declarator) ! cp_error ("field `%D' has incomplete type", declarator); else ! cp_error ("name `%T' has incomplete type", type); /* If we're instantiating a template, tell them which instantiation made the field's type be incomplete. */ --- 11634,11642 ---- && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) { if (declarator) ! error ("field `%D' has incomplete type", declarator); else ! error ("name `%T' has incomplete type", type); /* If we're instantiating a template, tell them which instantiation made the field's type be incomplete. */ *************** friend declaration requires class-key, i *** 11459,11465 **** && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (current_class_type)) && declspecs && TREE_VALUE (declspecs) && TREE_TYPE (TREE_VALUE (declspecs)) == type) ! cp_error (" in instantiation of template `%T'", current_class_type); type = error_mark_node; --- 11645,11651 ---- && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (current_class_type)) && declspecs && TREE_VALUE (declspecs) && TREE_TYPE (TREE_VALUE (declspecs)) == type) ! error (" in instantiation of template `%T'", current_class_type); type = error_mark_node; *************** friend declaration requires class-key, i *** 11481,11510 **** /* Friends are treated specially. */ if (ctype == current_class_type) warning ("member functions are implicitly friends of their class"); ! else ! { ! tree t = NULL_TREE; ! if (decl && DECL_NAME (decl)) ! { ! if (template_class_depth (current_class_type) == 0) ! { ! decl ! = check_explicit_specialization ! (declarator, decl, ! template_count, 2 * (funcdef_flag != 0) + 4); ! if (decl == error_mark_node) ! return error_mark_node; ! } ! ! t = do_friend (ctype, declarator, decl, ! last_function_parms, attrlist, flags, quals, ! funcdef_flag); ! } ! if (t && funcdef_flag) ! return t; ! ! return void_type_node; ! } } /* Structure field. It may not be a function, except for C++ */ --- 11667,11696 ---- /* Friends are treated specially. */ if (ctype == current_class_type) warning ("member functions are implicitly friends of their class"); ! else ! { ! tree t = NULL_TREE; ! if (decl && DECL_NAME (decl)) ! { ! if (template_class_depth (current_class_type) == 0) ! { ! decl ! = check_explicit_specialization ! (declarator, decl, ! template_count, 2 * (funcdef_flag != 0) + 4); ! if (decl == error_mark_node) ! return error_mark_node; ! } ! ! t = do_friend (ctype, declarator, decl, ! last_function_parms, *attrlist, ! flags, quals, funcdef_flag); ! } ! if (t && funcdef_flag) ! return t; ! ! return void_type_node; ! } } /* Structure field. It may not be a function, except for C++ */ *************** friend declaration requires class-key, i *** 11527,11535 **** the rest of the compiler does not correctly handle the initialization unless the member is static so we make it static below. */ ! cp_pedwarn ("ISO C++ forbids initialization of member `%D'", declarator); ! cp_pedwarn ("making `%D' static", declarator); staticp = 1; } --- 11713,11721 ---- the rest of the compiler does not correctly handle the initialization unless the member is static so we make it static below. */ ! pedwarn ("ISO C++ forbids initialization of member `%D'", declarator); ! pedwarn ("making `%D' static", declarator); staticp = 1; } *************** friend declaration requires class-key, i *** 11553,11559 **** to change that in TC 1 so that they are allowed in classes with no user-defined constructors. */ && staticp) ! cp_pedwarn ("ISO C++ forbids static data member `%D' with same name as enclosing class", declarator); if (staticp) --- 11739,11745 ---- to change that in TC 1 so that they are allowed in classes with no user-defined constructors. */ && staticp) ! pedwarn ("ISO C++ forbids static data member `%D' with same name as enclosing class", declarator); if (staticp) *************** friend declaration requires class-key, i *** 11645,11651 **** declaring main to be static. */ if (TREE_CODE (type) == METHOD_TYPE) { ! cp_pedwarn ("cannot declare member function `%D' to have static linkage", decl); illegal_static = 1; } else if (current_function_decl) --- 11831,11837 ---- declaring main to be static. */ if (TREE_CODE (type) == METHOD_TYPE) { ! pedwarn ("cannot declare member function `%D' to have static linkage", decl); illegal_static = 1; } else if (current_function_decl) *************** friend declaration requires class-key, i *** 11679,11696 **** DECL_CONTEXT (decl) = ctype; if (staticp == 1) { ! cp_pedwarn ("static member `%D' re-declared as static", decl); staticp = 0; RIDBIT_RESET (RID_STATIC, specbits); } if (RIDBIT_SETP (RID_REGISTER, specbits) && TREE_STATIC (decl)) { ! cp_error ("static member `%D' declared `register'", decl); RIDBIT_RESET (RID_REGISTER, specbits); } if (RIDBIT_SETP (RID_EXTERN, specbits) && pedantic) { ! cp_pedwarn ("cannot explicitly declare member `%#D' to have extern linkage", decl); RIDBIT_RESET (RID_EXTERN, specbits); } --- 11865,11882 ---- DECL_CONTEXT (decl) = ctype; if (staticp == 1) { ! pedwarn ("`static' may not be used when defining (as opposed to declaring) a static data member"); staticp = 0; RIDBIT_RESET (RID_STATIC, specbits); } if (RIDBIT_SETP (RID_REGISTER, specbits) && TREE_STATIC (decl)) { ! error ("static member `%D' declared `register'", decl); RIDBIT_RESET (RID_REGISTER, specbits); } if (RIDBIT_SETP (RID_EXTERN, specbits) && pedantic) { ! pedwarn ("cannot explicitly declare member `%#D' to have extern linkage", decl); RIDBIT_RESET (RID_EXTERN, specbits); } *************** check_default_argument (decl, arg) *** 11862,11871 **** || !can_convert_arg (decl_type, TREE_TYPE (arg), arg)) { if (decl) ! cp_error ("default argument for `%#D' has type `%T'", decl, TREE_TYPE (arg)); else ! cp_error ("default argument for parameter of type `%T' has type `%T'", decl_type, TREE_TYPE (arg)); return error_mark_node; --- 12048,12057 ---- || !can_convert_arg (decl_type, TREE_TYPE (arg), arg)) { if (decl) ! error ("default argument for `%#D' has type `%T'", decl, TREE_TYPE (arg)); else ! error ("default argument for parameter of type `%T' has type `%T'", decl_type, TREE_TYPE (arg)); return error_mark_node; *************** check_default_argument (decl, arg) *** 11882,11888 **** NULL); if (var) { ! cp_error ("default argument `%E' uses local variable `%D'", arg, var); return error_mark_node; } --- 12068,12074 ---- NULL); if (var) { ! error ("default argument `%E' uses local variable `%D'", arg, var); return error_mark_node; } *************** grokparms (first_parm) *** 11916,11923 **** for (parm = first_parm; parm != NULL_TREE; parm = chain) { tree type = NULL_TREE; ! register tree decl = TREE_VALUE (parm); tree init = TREE_PURPOSE (parm); chain = TREE_CHAIN (parm); /* @@ weak defense against parse errors. */ --- 12102,12110 ---- for (parm = first_parm; parm != NULL_TREE; parm = chain) { tree type = NULL_TREE; ! tree decl = TREE_VALUE (parm); tree init = TREE_PURPOSE (parm); + tree specs, attrs; chain = TREE_CHAIN (parm); /* @@ weak defense against parse errors. */ *************** grokparms (first_parm) *** 11926,11932 **** { /* Give various messages as the need arises. */ if (TREE_CODE (decl) == STRING_CST) ! cp_error ("invalid string constant `%E'", decl); else if (TREE_CODE (decl) == INTEGER_CST) error ("invalid integer constant in parameter list, did you forget to give parameter name?"); continue; --- 12113,12119 ---- { /* Give various messages as the need arises. */ if (TREE_CODE (decl) == STRING_CST) ! error ("invalid string constant `%E'", decl); else if (TREE_CODE (decl) == INTEGER_CST) error ("invalid integer constant in parameter list, did you forget to give parameter name?"); continue; *************** grokparms (first_parm) *** 11935,11945 **** if (parm == void_list_node) break; ! decl = grokdeclarator (TREE_VALUE (decl), TREE_PURPOSE (decl), ! PARM, init != NULL_TREE, NULL_TREE); if (! decl || TREE_TYPE (decl) == error_mark_node) continue; type = TREE_TYPE (decl); if (VOID_TYPE_P (type)) { --- 12122,12136 ---- if (parm == void_list_node) break; ! split_specs_attrs (TREE_PURPOSE (decl), &specs, &attrs); ! decl = grokdeclarator (TREE_VALUE (decl), specs, ! PARM, init != NULL_TREE, &attrs); if (! decl || TREE_TYPE (decl) == error_mark_node) continue; + if (attrs) + cplus_decl_attributes (&decl, attrs, 0); + type = TREE_TYPE (decl); if (VOID_TYPE_P (type)) { *************** grokparms (first_parm) *** 11962,11974 **** type = TYPE_MAIN_VARIANT (type); if (TREE_CODE (type) == METHOD_TYPE) { ! cp_error ("parameter `%D' invalidly declared method type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } else if (TREE_CODE (type) == OFFSET_TYPE) { ! cp_error ("parameter `%D' invalidly declared offset type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } --- 12153,12165 ---- type = TYPE_MAIN_VARIANT (type); if (TREE_CODE (type) == METHOD_TYPE) { ! error ("parameter `%D' invalidly declared method type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } else if (TREE_CODE (type) == OFFSET_TYPE) { ! error ("parameter `%D' invalidly declared offset type", decl); type = build_pointer_type (type); TREE_TYPE (decl) = type; } *************** grokparms (first_parm) *** 11992,11998 **** t = TREE_TYPE (t); } if (TREE_CODE (t) == ARRAY_TYPE) ! cp_error ("parameter `%D' includes %s to array of unknown bound `%T'", decl, ptr ? "pointer" : "reference", t); } --- 12183,12189 ---- t = TREE_TYPE (t); } if (TREE_CODE (t) == ARRAY_TYPE) ! error ("parameter `%D' includes %s to array of unknown bound `%T'", decl, ptr ? "pointer" : "reference", t); } *************** grokparms (first_parm) *** 12021,12110 **** } ! /* D is a constructor or overloaded `operator='. Returns non-zero if ! D's arguments allow it to be a copy constructor, or copy assignment operator. */ int ! copy_args_p (d) tree d; { ! tree t; ! if (!DECL_FUNCTION_MEMBER_P (d)) return 0; ! t = FUNCTION_FIRST_USER_PARMTYPE (d); ! if (t && TREE_CODE (TREE_VALUE (t)) == REFERENCE_TYPE ! && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (t))) ! == DECL_CONTEXT (d)) ! && (TREE_CHAIN (t) == NULL_TREE ! || TREE_CHAIN (t) == void_list_node ! || TREE_PURPOSE (TREE_CHAIN (t)))) ! return 1; ! return 0; ! } ! /* These memoizing functions keep track of special properties which ! a class may have. `grok_ctor_properties' notices whether a class ! has a constructor of the form X(X&), and also complains ! if the class has a constructor of the form X(X). ! `grok_op_properties' takes notice of the various forms of ! operator= which are defined, as well as what sorts of type conversion ! may apply. Both functions take a FUNCTION_DECL as an argument. */ ! int ! grok_ctor_properties (ctype, decl) ! tree ctype, decl; ! { ! tree parmtypes = FUNCTION_FIRST_USER_PARMTYPE (decl); ! tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node; ! /* [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. */ ! if (TREE_CODE (parmtype) == REFERENCE_TYPE ! && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype ! && sufficient_parms_p (TREE_CHAIN (parmtypes)) ! && !(DECL_TEMPLATE_INSTANTIATION (decl) ! && is_member_template (DECL_TI_TEMPLATE (decl)))) { ! TYPE_HAS_INIT_REF (ctype) = 1; ! if (CP_TYPE_CONST_P (TREE_TYPE (parmtype))) ! TYPE_HAS_CONST_INIT_REF (ctype) = 1; } ! /* [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. */ ! else if (TYPE_MAIN_VARIANT (parmtype) == ctype ! && sufficient_parms_p (TREE_CHAIN (parmtypes)) ! && !(DECL_TEMPLATE_INSTANTIATION (decl) ! && is_member_template (DECL_TI_TEMPLATE (decl)))) { ! cp_error ("invalid constructor; you probably meant `%T (const %T&)'", ctype, ctype); SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype); return 0; } ! else if (TREE_CODE (parmtype) == VOID_TYPE ! || TREE_PURPOSE (parmtypes) != NULL_TREE) ! TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1; ! return 1; } --- 12212,12361 ---- } ! /* 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 const qualified T. ! 2 if D is a copy constructor or copy assignment operator whose ! first parameter is a reference to non-const qualified T. ! ! This function can be used as a predicate. Positive values indicate ! a copy constructor and non-zero values indicate a copy assignment operator. */ int ! copy_fn_p (d) tree d; { ! tree args; ! tree arg_type; ! int result = 1; ! ! my_friendly_assert (DECL_FUNCTION_MEMBER_P (d), 20011208); ! if (DECL_TEMPLATE_INFO (d) && is_member_template (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 (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_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; ! } ! /* Remember any special properties of member function DECL. */ ! ! void grok_special_member_properties (decl) ! tree decl; ! { ! if (!DECL_NONSTATIC_MEMBER_FUNCTION_P(decl)) ! ; /* Not special. */ ! else if (DECL_CONSTRUCTOR_P (decl)) { ! int ctor = copy_fn_p (decl); ! ! 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_INIT_REF (DECL_CONTEXT (decl)) = 1; ! if (ctor > 1) ! TYPE_HAS_CONST_INIT_REF (DECL_CONTEXT (decl)) = 1; ! } ! else if (sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (decl))) ! TYPE_HAS_DEFAULT_CONSTRUCTOR (DECL_CONTEXT (decl)) = 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_ASSIGN_REF (DECL_CONTEXT (decl)) = 1; ! if (assop != 1) ! TYPE_HAS_CONST_ASSIGN_REF (DECL_CONTEXT (decl)) = 1; ! if (DECL_PURE_VIRTUAL_P (decl)) ! TYPE_HAS_ABSTRACT_ASSIGN_REF (DECL_CONTEXT (decl)) = 1; ! } ! } ! } ! /* Check a constructor DECL has the correct form. Complains ! if the class has a constructor of the form X(X). */ ! int ! grok_ctor_properties (ctype, decl) ! tree ctype, decl; ! { ! int ctor_parm = copy_fn_p (decl); ! ! 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); SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype); return 0; } ! return 1; } *************** unary_op_p (code) *** 12137,12145 **** /* Do a little sanity-checking on how they declared their operator. */ void ! grok_op_properties (decl, virtualp, friendp) tree decl; ! int virtualp, friendp; { tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); tree argtype; --- 12388,12396 ---- /* Do a little sanity-checking on how they declared their operator. */ void ! grok_op_properties (decl, friendp) tree decl; ! int friendp; { tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); tree argtype; *************** grok_op_properties (decl, virtualp, frie *** 12165,12176 **** #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; \ } --- 12416,12427 ---- #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; \ } *************** grok_op_properties (decl, virtualp, frie *** 12178,12184 **** #include "operators.def" #undef DEF_OPERATOR ! my_friendly_abort (20000527); } while (0); my_friendly_assert (operator_code != LAST_CPLUS_TREE_CODE, 20000526); --- 12429,12435 ---- #include "operators.def" #undef DEF_OPERATOR ! abort (); } while (0); my_friendly_assert (operator_code != LAST_CPLUS_TREE_CODE, 20000526); *************** grok_op_properties (decl, virtualp, frie *** 12250,12262 **** || operator_code == COMPONENT_REF || operator_code == ARRAY_REF || operator_code == NOP_EXPR) ! cp_error ("`%D' must be a nonstatic member function", decl); else { tree p = argtypes; if (DECL_STATIC_FUNCTION_P (decl)) ! cp_error ("`%D' must be either a non-static member function or a non-member function", decl); if (p) for (; TREE_CODE (TREE_VALUE (p)) != VOID_TYPE ; p = TREE_CHAIN (p)) --- 12501,12513 ---- || operator_code == COMPONENT_REF || operator_code == ARRAY_REF || operator_code == NOP_EXPR) ! error ("`%D' must be a nonstatic member function", decl); else { tree p = argtypes; if (DECL_STATIC_FUNCTION_P (decl)) ! error ("`%D' must be either a non-static member function or a non-member function", decl); if (p) for (; TREE_CODE (TREE_VALUE (p)) != VOID_TYPE ; p = TREE_CHAIN (p)) *************** grok_op_properties (decl, virtualp, frie *** 12272,12278 **** || TREE_CODE (arg) == BOUND_TEMPLATE_TEMPLATE_PARM) goto foundaggr; } ! cp_error ("`%D' must have an argument of class or enumerated type", decl); foundaggr: --- 12523,12529 ---- || TREE_CODE (arg) == BOUND_TEMPLATE_TEMPLATE_PARM) goto foundaggr; } ! error ("`%D' must have an argument of class or enumerated type", decl); foundaggr: *************** grok_op_properties (decl, virtualp, frie *** 12309,12348 **** ref ? "a reference to " : "", what); } } ! ! if (DECL_ASSIGNMENT_OPERATOR_P (decl) ! && operator_code == NOP_EXPR) ! { ! tree parmtype; ! ! if (arity != 2 && methodp) ! { ! cp_error ("`%D' must take exactly one argument", decl); ! return; ! } ! parmtype = TREE_VALUE (TREE_CHAIN (argtypes)); ! ! /* [class.copy] ! ! A user-declared copy assignment operator X::operator= is ! a non-static non-template member function of class X with ! exactly one parameter of type X, X&, const X&, volatile ! X& or const volatile X&. */ ! if (copy_assignment_arg_p (parmtype, virtualp) ! && !(DECL_TEMPLATE_INSTANTIATION (decl) ! && is_member_template (DECL_TI_TEMPLATE (decl))) ! && ! friendp) ! { ! TYPE_HAS_ASSIGN_REF (current_class_type) = 1; ! if (TREE_CODE (parmtype) != REFERENCE_TYPE ! || CP_TYPE_CONST_P (TREE_TYPE (parmtype))) ! TYPE_HAS_CONST_ASSIGN_REF (current_class_type) = 1; ! } ! } ! else if (operator_code == COND_EXPR) { /* 13.4.0.3 */ ! cp_error ("ISO C++ prohibits overloading operator ?:"); } else if (ambi_op_p (operator_code)) { --- 12560,12569 ---- ref ? "a reference to " : "", what); } } ! if (operator_code == COND_EXPR) { /* 13.4.0.3 */ ! error ("ISO C++ prohibits overloading operator ?:"); } else if (ambi_op_p (operator_code)) { *************** grok_op_properties (decl, virtualp, frie *** 12381,12387 **** break; default: ! my_friendly_abort (20000527); } SET_OVERLOADED_OPERATOR_CODE (decl, operator_code); --- 12602,12608 ---- break; default: ! abort (); } SET_OVERLOADED_OPERATOR_CODE (decl, operator_code); *************** grok_op_properties (decl, virtualp, frie *** 12392,12401 **** && ! same_type_p (TREE_VALUE (TREE_CHAIN (argtypes)), integer_type_node)) { if (methodp) ! cp_error ("postfix `%D' must take `int' as its argument", decl); else ! cp_error ("postfix `%D' must take `int' as its second argument", decl); } --- 12613,12622 ---- && ! same_type_p (TREE_VALUE (TREE_CHAIN (argtypes)), integer_type_node)) { if (methodp) ! error ("postfix `%D' must take `int' as its argument", decl); else ! error ("postfix `%D' must take `int' as its second argument", decl); } *************** grok_op_properties (decl, virtualp, frie *** 12403,12411 **** else { if (methodp) ! cp_error ("`%D' must take either zero or one argument", decl); else ! cp_error ("`%D' must take either one or two arguments", decl); } /* More Effective C++ rule 6. */ --- 12624,12632 ---- else { if (methodp) ! error ("`%D' must take either zero or one argument", decl); else ! error ("`%D' must take either one or two arguments", decl); } /* More Effective C++ rule 6. */ *************** grok_op_properties (decl, virtualp, frie *** 12426,12438 **** if (TREE_CODE (ret) != REFERENCE_TYPE || !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ret)), arg)) ! cp_warning ("prefix `%D' should return `%T'", decl, build_reference_type (arg)); } else { if (!same_type_p (TYPE_MAIN_VARIANT (ret), arg)) ! cp_warning ("postfix `%D' should return `%T'", decl, arg); } } } --- 12647,12659 ---- if (TREE_CODE (ret) != REFERENCE_TYPE || !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ret)), arg)) ! warning ("prefix `%D' should return `%T'", decl, build_reference_type (arg)); } else { if (!same_type_p (TYPE_MAIN_VARIANT (ret), arg)) ! warning ("postfix `%D' should return `%T'", decl, arg); } } } *************** grok_op_properties (decl, virtualp, frie *** 12441,12449 **** if (arity != 1) { if (methodp) ! cp_error ("`%D' must take `void'", decl); else ! cp_error ("`%D' must take exactly one argument", decl); } } else /* if (binary_op_p (operator_code)) */ --- 12662,12670 ---- if (arity != 1) { if (methodp) ! error ("`%D' must take `void'", decl); else ! error ("`%D' must take exactly one argument", decl); } } else /* if (binary_op_p (operator_code)) */ *************** grok_op_properties (decl, virtualp, frie *** 12451,12459 **** if (arity != 2) { if (methodp) ! cp_error ("`%D' must take exactly one argument", decl); else ! cp_error ("`%D' must take exactly two arguments", decl); } /* More Effective C++ rule 7. */ --- 12672,12680 ---- if (arity != 2) { if (methodp) ! error ("`%D' must take exactly one argument", decl); else ! error ("`%D' must take exactly two arguments", decl); } /* More Effective C++ rule 7. */ *************** grok_op_properties (decl, virtualp, frie *** 12461,12481 **** && (operator_code == TRUTH_ANDIF_EXPR || operator_code == TRUTH_ORIF_EXPR || operator_code == COMPOUND_EXPR)) ! cp_warning ("user-defined `%D' always evaluates both arguments", decl); } /* Effective C++ rule 23. */ if (warn_ecpp && arity == 2 && (operator_code == PLUS_EXPR || operator_code == MINUS_EXPR || operator_code == TRUNC_DIV_EXPR ! || operator_code == MULT_EXPR) && TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) == REFERENCE_TYPE) ! cp_warning ("`%D' should return by value", decl); ! /* 13.4.0.8 */ for (; argtypes && argtypes != void_list_node; argtypes = TREE_CHAIN (argtypes)) if (TREE_PURPOSE (argtypes)) --- 12682,12704 ---- && (operator_code == TRUTH_ANDIF_EXPR || operator_code == TRUTH_ORIF_EXPR || operator_code == COMPOUND_EXPR)) ! warning ("user-defined `%D' 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 ("`%D' should return by value", decl); ! /* [over.oper]/8 */ for (; argtypes && argtypes != void_list_node; argtypes = TREE_CHAIN (argtypes)) if (TREE_PURPOSE (argtypes)) *************** grok_op_properties (decl, virtualp, frie *** 12485,12494 **** || operator_code == POSTDECREMENT_EXPR) { if (pedantic) ! cp_pedwarn ("`%D' cannot have default arguments", decl); } else ! cp_error ("`%D' cannot have default arguments", decl); } } --- 12708,12717 ---- || operator_code == POSTDECREMENT_EXPR) { if (pedantic) ! pedwarn ("`%D' cannot have default arguments", decl); } else ! error ("`%D' cannot have default arguments", decl); } } *************** tag_name (code) *** 12509,12515 **** case enum_type: return "enum"; default: ! my_friendly_abort (981122); } } --- 12732,12738 ---- case enum_type: return "enum"; default: ! abort (); } } *************** xref_tag (code_type_node, name, globaliz *** 12533,12539 **** enum tree_code code; register tree ref, t; struct binding_level *b = current_binding_level; - int got_type = 0; tree attributes = NULL_TREE; tree context = NULL_TREE; --- 12756,12761 ---- *************** xref_tag (code_type_node, name, globaliz *** 12561,12567 **** code = ENUMERAL_TYPE; break; default: ! my_friendly_abort (18); } /* If a cross reference is requested, look up the type --- 12783,12789 ---- code = ENUMERAL_TYPE; break; default: ! abort (); } /* If a cross reference is requested, look up the type *************** xref_tag (code_type_node, name, globaliz *** 12570,12576 **** { t = name; name = TYPE_IDENTIFIER (t); - got_type = 1; } else t = IDENTIFIER_TYPE_VALUE (name); --- 12792,12797 ---- *************** xref_tag (code_type_node, name, globaliz *** 12579,12594 **** if (t && globalize && TREE_CODE (t) == TYPENAME_TYPE) { static int explained; ! cp_warning ("`%s %T' declares a new type at namespace scope;\n\ ! to refer to the inherited type, say `%s %T::%T'%s", ! tag_name (tag_code), name, tag_name (tag_code), ! constructor_name (current_class_type), TYPE_IDENTIFIER (t), ! (!explained ? "\n\ ! (names from dependent base classes are not visible to unqualified name lookup)" ! : "")); ! explained = 1; } if (t && TREE_CODE (t) != code && TREE_CODE (t) != TEMPLATE_TYPE_PARM --- 12800,12825 ---- if (t && globalize && TREE_CODE (t) == TYPENAME_TYPE) { static int explained; + tree shadowed; ! warning ("`%s %T' declares a new type at namespace scope", ! tag_name (tag_code), name); ! if (!explained++) ! warning (" names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'", ! tag_name (tag_code), ! constructor_name (current_class_type), ! TYPE_IDENTIFIER (t)); ! /* We need to remove the class scope binding for the ! TYPENAME_TYPE as otherwise poplevel_class gets confused. */ ! for (shadowed = b->class_shadowed; ! shadowed; ! shadowed = TREE_CHAIN (shadowed)) ! if (TREE_TYPE (shadowed) == TYPE_NAME (t)) ! { ! TREE_PURPOSE (shadowed) = NULL_TREE; ! break; ! } } if (t && TREE_CODE (t) != code && TREE_CODE (t) != TEMPLATE_TYPE_PARM *************** to refer to the inherited type, say `%s *** 12605,12622 **** { if (t) { /* [dcl.type.elab] If the identifier resolves to a typedef-name or a template type-parameter, the elaborated-type-specifier is ill-formed. */ ! if (t != TYPE_MAIN_VARIANT (t) ! || (CLASS_TYPE_P (t) && TYPE_WAS_ANONYMOUS (t))) ! cp_pedwarn ("using typedef-name `%D' after `%s'", ! TYPE_NAME (t), tag_name (tag_code)); else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM) ! cp_error ("using template type parameter `%T' after `%s'", ! t, tag_name (tag_code)); ! ! ref = t; } else ref = lookup_tag (code, name, b, 0); --- 12836,12855 ---- { if (t) { + ref = follow_tag_typedef (t); + /* [dcl.type.elab] If the identifier resolves to a typedef-name or a template type-parameter, the elaborated-type-specifier is ill-formed. */ ! if (!ref) ! { ! pedwarn ("using typedef-name `%D' after `%s'", ! TYPE_NAME (t), tag_name (tag_code)); ! ref = t; ! } else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM) ! error ("using template type parameter `%T' after `%s'", ! t, tag_name (tag_code)); } else ref = lookup_tag (code, name, b, 0); *************** to refer to the inherited type, say `%s *** 12695,12701 **** the forward-reference will be altered into a real type. */ if (code == ENUMERAL_TYPE) { ! cp_error ("use of enum `%#D' without previous declaration", name); ref = make_node (ENUMERAL_TYPE); --- 12928,12934 ---- the forward-reference will be altered into a real type. */ if (code == ENUMERAL_TYPE) { ! error ("use of enum `%#D' without previous declaration", name); ref = make_node (ENUMERAL_TYPE); *************** to refer to the inherited type, say `%s *** 12737,12756 **** redeclare_class_template (ref, current_template_parms); } ! /* Until the type is defined, tentatively accept whatever ! structure tag the user hands us. */ ! if (!COMPLETE_TYPE_P (ref) ! && ref != current_class_type ! /* Have to check this, in case we have contradictory tag info. */ ! && IS_AGGR_TYPE_CODE (TREE_CODE (ref))) ! { ! if (tag_code == class_type) ! CLASSTYPE_DECLARED_CLASS (ref) = 1; ! else if (tag_code == record_type) ! CLASSTYPE_DECLARED_CLASS (ref) = 0; ! } ! ! TREE_TYPE (ref) = attributes; return ref; } --- 12970,12976 ---- redeclare_class_template (ref, current_template_parms); } ! TYPE_ATTRIBUTES (ref) = attributes; return ref; } *************** xref_tag_from_type (old, id, globalize) *** 12783,12789 **** void xref_basetypes (code_type_node, name, ref, binfo) tree code_type_node; ! tree name, ref; tree binfo; { /* In the declaration `A : X, Y, ... Z' we mark all the types --- 13003,13010 ---- void xref_basetypes (code_type_node, name, ref, binfo) tree code_type_node; ! tree name ATTRIBUTE_UNUSED; ! tree ref; tree binfo; { /* In the declaration `A : X, Y, ... Z' we mark all the types *************** xref_basetypes (code_type_node, name, re *** 12805,12811 **** if (tag_code == union_type) { ! cp_error ("derived union `%T' invalid", ref); return; } --- 13026,13032 ---- if (tag_code == union_type) { ! error ("derived union `%T' invalid", ref); return; } *************** xref_basetypes (code_type_node, name, re *** 12849,12867 **** && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM && TREE_CODE (basetype) != BOUND_TEMPLATE_TEMPLATE_PARM)) { ! cp_error ("base type `%T' fails to be a struct or class type", TREE_VALUE (binfo)); continue; } - GNU_xref_hier (name, basetype, via_public, via_virtual, 0); - /* This code replaces similar code in layout_basetypes. We put the complete_type first for implicit `typename'. */ if (!COMPLETE_TYPE_P (basetype) && ! (current_template_parms && uses_template_parms (basetype))) { ! cp_error ("base class `%T' has incomplete type", basetype); continue; } else --- 13070,13086 ---- && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM && TREE_CODE (basetype) != BOUND_TEMPLATE_TEMPLATE_PARM)) { ! error ("base type `%T' fails to be a struct or class type", TREE_VALUE (binfo)); continue; } /* This code replaces similar code in layout_basetypes. We put the complete_type first for implicit `typename'. */ if (!COMPLETE_TYPE_P (basetype) && ! (current_template_parms && uses_template_parms (basetype))) { ! error ("base class `%T' has incomplete type", basetype); continue; } else *************** xref_basetypes (code_type_node, name, re *** 12869,12883 **** if (CLASSTYPE_MARKED (basetype)) { if (basetype == ref) ! cp_error ("recursive type `%T' undefined", basetype); else ! cp_error ("duplicate base type `%T' invalid", basetype); continue; } if (TYPE_FOR_JAVA (basetype) ! && (current_lang_stack ! == &VARRAY_TREE (current_lang_base, 0))) TYPE_FOR_JAVA (ref) = 1; /* Note that the BINFO records which describe individual --- 13088,13101 ---- if (CLASSTYPE_MARKED (basetype)) { if (basetype == ref) ! error ("recursive type `%T' undefined", basetype); else ! error ("duplicate base type `%T' invalid", basetype); continue; } if (TYPE_FOR_JAVA (basetype) ! && (current_lang_depth () == 0)) TYPE_FOR_JAVA (ref) = 1; /* Note that the BINFO records which describe individual *************** start_enum (name) *** 12983,12989 **** if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) { ! cp_error ("multiple definition of `%#T'", enumtype); cp_error_at ("previous definition here", enumtype); /* Clear out TYPE_VALUES, and start again. */ TYPE_VALUES (enumtype) = NULL_TREE; --- 13201,13207 ---- if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) { ! error ("multiple definition of `%#T'", enumtype); cp_error_at ("previous definition here", enumtype); /* Clear out TYPE_VALUES, and start again. */ TYPE_VALUES (enumtype) = NULL_TREE; *************** start_enum (name) *** 12994,13003 **** pushtag (name, enumtype, 0); } - if (current_class_type) - TREE_ADDRESSABLE (b->tags) = 1; - - GNU_xref_decl (current_function_decl, enumtype); return enumtype; } --- 13212,13217 ---- *************** finish_enum (enumtype) *** 13038,13043 **** --- 13252,13258 ---- if (scope && TREE_CODE (scope) == FUNCTION_DECL) add_stmt (build_min (TAG_DEFN, enumtype)); + return; } *************** build_enumerator (name, value, enumtype) *** 13158,13164 **** } else { ! cp_error ("enumerator value for `%D' not integer constant", name); value = NULL_TREE; } } --- 13373,13379 ---- } else { ! error ("enumerator value for `%D' not integer constant", name); value = NULL_TREE; } } *************** build_enumerator (name, value, enumtype) *** 13178,13184 **** integer_one_node); if (tree_int_cst_lt (value, prev_value)) ! cp_error ("overflow in enumeration values at `%D'", name); } else value = integer_zero_node; --- 13393,13399 ---- integer_one_node); if (tree_int_cst_lt (value, prev_value)) ! error ("overflow in enumeration values at `%D'", name); } else value = integer_zero_node; *************** build_enumerator (name, value, enumtype) *** 13242,13251 **** things like `S::i' later.) */ finish_member_declaration (decl); else ! { ! pushdecl (decl); ! GNU_xref_decl (current_function_decl, decl); ! } /* Add this enumeration constant to the list for this type. */ TYPE_VALUES (enumtype) = tree_cons (name, decl, TYPE_VALUES (enumtype)); --- 13457,13463 ---- 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)); *************** check_function_type (decl, current_funct *** 13267,13273 **** if (!COMPLETE_OR_VOID_TYPE_P (return_type)) { ! cp_error ("return type `%#T' is incomplete", TREE_TYPE (fntype)); /* Make it return void instead, but don't change the type of the DECL_RESULT, in case we have a named return value. */ --- 13479,13485 ---- if (!COMPLETE_OR_VOID_TYPE_P (return_type)) { ! error ("return type `%#T' is incomplete", TREE_TYPE (fntype)); /* Make it return void instead, but don't change the type of the DECL_RESULT, in case we have a named return value. */ *************** start_function (declspecs, declarator, a *** 13363,13383 **** } last_function_parms = DECL_ARGUMENTS (decl1); - last_function_parm_tags = NULL_TREE; } else { ! decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL_TREE); /* If the declarator is not suitable for a function definition, cause a syntax error. */ ! if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0; fntype = TREE_TYPE (decl1); restype = TREE_TYPE (fntype); if (CLASS_TYPE_P (restype) && !CLASSTYPE_GOT_SEMICOLON (restype)) { ! cp_error ("semicolon missing after declaration of `%#T'", restype); shadow_tag (build_tree_list (NULL_TREE, restype)); CLASSTYPE_GOT_SEMICOLON (restype) = 1; if (TREE_CODE (fntype) == FUNCTION_TYPE) --- 13575,13601 ---- } last_function_parms = DECL_ARGUMENTS (decl1); } else { ! decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL); /* If the declarator is not suitable for a function definition, cause a syntax error. */ ! if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) ! return 0; ! ! cplus_decl_attributes (&decl1, attrs, 0); ! ! /* If #pragma weak was used, mark the decl weak now. */ ! if (current_binding_level == global_binding_level) ! maybe_apply_pragma_weak (decl1); fntype = TREE_TYPE (decl1); restype = TREE_TYPE (fntype); if (CLASS_TYPE_P (restype) && !CLASSTYPE_GOT_SEMICOLON (restype)) { ! error ("semicolon missing after declaration of `%#T'", restype); shadow_tag (build_tree_list (NULL_TREE, restype)); CLASSTYPE_GOT_SEMICOLON (restype) = 1; if (TREE_CODE (fntype) == FUNCTION_TYPE) *************** start_function (declspecs, declarator, a *** 13404,13409 **** --- 13622,13632 ---- } } + if (DECL_DECLARED_INLINE_P (decl1) + && lookup_attribute ("noinline", attrs)) + warning_with_decl (decl1, + "inline function `%s' given attribute noinline"); + if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl1)) /* This is a constructor, we must ensure that any default args introduced by this definition are propagated to the clones *************** start_function (declspecs, declarator, a *** 13446,13462 **** if (warn_ecpp && DECL_OVERLOADED_OPERATOR_P (decl1) == NOP_EXPR && TREE_CODE (TREE_TYPE (fntype)) == VOID_TYPE) ! cp_warning ("`operator=' 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; - #ifdef SET_DEFAULT_DECL_ATTRIBUTES - SET_DEFAULT_DECL_ATTRIBUTES (decl1, attrs); - #endif - /* This function exists in static storage. (This does not mean `static' in the C sense!) */ TREE_STATIC (decl1) = 1; --- 13669,13681 ---- if (warn_ecpp && DECL_OVERLOADED_OPERATOR_P (decl1) == NOP_EXPR && TREE_CODE (TREE_TYPE (fntype)) == VOID_TYPE) ! warning ("`operator=' 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; *************** start_function (declspecs, declarator, a *** 13474,13480 **** /* Save the parm names or decls from this function's declarator where store_parm_decls will find them. */ current_function_parms = last_function_parms; - current_function_parm_tags = last_function_parm_tags; /* Make sure the parameter and return types are reasonable. When you declare a function, these types can be incomplete, but they --- 13693,13698 ---- *************** start_function (declspecs, declarator, a *** 13484,13502 **** /* Build the return declaration for the function. */ restype = TREE_TYPE (fntype); ! if (!processing_template_decl) { ! if (!DECL_RESULT (decl1)) ! { ! DECL_RESULT (decl1) ! = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype)); ! c_apply_type_quals_to_decl (CP_TYPE_QUALS (restype), ! DECL_RESULT (decl1)); ! } } - else - /* Just use `void'. Nobody will ever look at this anyhow. */ - DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, void_type_node); /* Initialize RTL machinery. We cannot do this until CURRENT_FUNCTION_DECL and DECL_RESULT are set up. We do this --- 13702,13717 ---- /* Build the return declaration for the function. */ restype = TREE_TYPE (fntype); ! /* Promote the value to int before returning it. */ ! if (c_promoting_integer_type_p (restype)) ! restype = type_promotes_to (restype); ! if (DECL_RESULT (decl1) == NULL_TREE) { ! DECL_RESULT (decl1) ! = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype)); ! c_apply_type_quals_to_decl (cp_type_quals (restype), ! DECL_RESULT (decl1)); } /* Initialize RTL machinery. We cannot do this until CURRENT_FUNCTION_DECL and DECL_RESULT are set up. We do this *************** start_function (declspecs, declarator, a *** 13567,13573 **** 19990811); cp_function_chain->x_current_class_ref ! = build_indirect_ref (t, NULL_PTR); cp_function_chain->x_current_class_ptr = t; /* Constructors and destructors need to know whether they're "in --- 13782,13788 ---- 19990811); cp_function_chain->x_current_class_ref ! = build_indirect_ref (t, NULL); cp_function_chain->x_current_class_ptr = t; /* Constructors and destructors need to know whether they're "in *************** start_function (declspecs, declarator, a *** 13657,13677 **** pushlevel (0); current_binding_level->parm_flag = 1; - if (attrs) - cplus_decl_attributes (decl1, NULL_TREE, attrs); - - /* Promote the value to int before returning it. */ - if (c_promoting_integer_type_p (restype)) - restype = type_promotes_to (restype); - - if (DECL_RESULT (decl1) == NULL_TREE) - { - DECL_RESULT (decl1) - = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype)); - TREE_READONLY (DECL_RESULT (decl1)) = CP_TYPE_CONST_P (restype); - TREE_THIS_VOLATILE (DECL_RESULT (decl1)) = CP_TYPE_VOLATILE_P (restype); - } - ++function_depth; if (DECL_DESTRUCTOR_P (decl1)) --- 13872,13877 ---- *************** start_function (declspecs, declarator, a *** 13680,13685 **** --- 13880,13887 ---- DECL_CONTEXT (dtor_label) = current_function_decl; } + start_fname_decls (); + store_parm_decls (current_function_parms); return 1; *************** store_parm_decls (current_function_parms *** 13697,13707 **** { register tree fndecl = current_function_decl; register tree parm; - int parms_have_cleanups = 0; - tree cleanups = NULL_TREE; - - /* This is a list of types declared among parms in a prototype. */ - tree parmtags = current_function_parm_tags; /* 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; --- 13899,13904 ---- *************** store_parm_decls (current_function_parms *** 13732,13751 **** next = TREE_CHAIN (parm); if (TREE_CODE (parm) == PARM_DECL) { - tree cleanup; - if (DECL_NAME (parm) == NULL_TREE || TREE_CODE (parm) != VOID_TYPE) pushdecl (parm); else ! cp_error ("parameter `%D' declared void", parm); ! ! cleanup = (processing_template_decl ! ? NULL_TREE ! : maybe_build_cleanup (parm)); ! ! if (cleanup) ! cleanups = tree_cons (parm, cleanup, cleanups); } else { --- 13929,13939 ---- next = TREE_CHAIN (parm); if (TREE_CODE (parm) == PARM_DECL) { if (DECL_NAME (parm) == NULL_TREE || TREE_CODE (parm) != VOID_TYPE) pushdecl (parm); else ! error ("parameter `%D' declared void", parm); } else { *************** store_parm_decls (current_function_parms *** 13760,13766 **** function. This is all and only the PARM_DECLs that were pushed into scope by the loop above. */ DECL_ARGUMENTS (fndecl) = getdecls (); ! storetags (chainon (parmtags, gettags ())); } else DECL_ARGUMENTS (fndecl) = NULL_TREE; --- 13948,13954 ---- function. This is all and only the PARM_DECLs that were pushed into scope by the loop above. */ DECL_ARGUMENTS (fndecl) = getdecls (); ! storetags (gettags ()); } else DECL_ARGUMENTS (fndecl) = NULL_TREE; *************** store_parm_decls (current_function_parms *** 13771,13791 **** DECL_ARGUMENTS is not modified. */ storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); - /* Now that we have initialized the parms, we can start their - cleanups. We cannot do this before, since expand_decl_cleanup - should not be called before the parm can be used. */ - while (cleanups) - { - finish_decl_cleanup (TREE_PURPOSE (cleanups), - TREE_VALUE (cleanups)); - cleanups = TREE_CHAIN (cleanups); - } - - /* Create a binding contour which can be used to catch - cleanup-generated temporaries. */ - if (parms_have_cleanups) - pushlevel (0); - /* Do the starting of the exception specifications, if we have any. */ if (flag_exceptions && !processing_template_decl && flag_enforce_eh_specs --- 13959,13964 ---- *************** save_function_data (decl) *** 13835,13949 **** } } ! /* At the end of every constructor we generate to code to return ! `this'. Do that now. */ static void finish_constructor_body () { ! /* Any return from a constructor will end up here. */ ! if (ctor_label) ! add_stmt (build_stmt (LABEL_STMT, ctor_label)); ! /* Clear CTOR_LABEL so that finish_return_stmt knows to really ! generate the return, rather than a goto to CTOR_LABEL. */ ! ctor_label = NULL_TREE; ! /* In check_return_expr we translate an empty return from a ! constructor to a return of `this'. */ ! finish_return_stmt (NULL_TREE); ! /* Mark the end of the constructor. */ add_stmt (build_stmt (CTOR_STMT)); } ! /* At the end of every destructor we generate code to restore virtual ! function tables to the values desired by base classes and to call ! to base class destructors. Do that now. */ static void ! finish_destructor_body () { tree compound_stmt; - tree exprstmt; - - /* Create a block to contain all the extra code. */ - compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); - - /* Any return from a destructor will end up here. */ - add_stmt (build_stmt (LABEL_STMT, dtor_label)); ! /* Generate the code to call destructor on base class. If this ! destructor belongs to a class with virtual functions, then set ! the virtual function table pointer to represent the type of our ! base class. */ ! /* This side-effect makes call to `build_delete' generate the code ! we have to have at the end of this destructor. `build_delete' ! will set the flag again. */ ! TYPE_HAS_DESTRUCTOR (current_class_type) = 0; ! exprstmt = build_delete (current_class_type, ! current_class_ref, ! sfk_base_destructor, ! LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, ! 0); ! if (exprstmt != error_mark_node ! && (TREE_CODE (exprstmt) != NOP_EXPR ! || TREE_OPERAND (exprstmt, 0) != integer_zero_node ! || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))) ! { ! if (exprstmt != void_zero_node) ! /* Don't call `expand_expr_stmt' if we're not going to do ! anything, since -Wall will give a diagnostic. */ ! finish_expr_stmt (exprstmt); ! /* Run destructors for all virtual baseclasses. */ ! if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! { ! tree vbases; ! tree if_stmt; ! if_stmt = begin_if_stmt (); ! finish_if_stmt_cond (build (BIT_AND_EXPR, integer_type_node, ! current_in_charge_parm, ! integer_two_node), ! if_stmt); ! vbases = CLASSTYPE_VBASECLASSES (current_class_type); ! /* The CLASSTYPE_VBASECLASSES list is in initialization ! order, so we have to march through it in reverse order. */ ! for (vbases = nreverse (copy_list (vbases)); ! vbases; ! vbases = TREE_CHAIN (vbases)) ! { ! tree vbase = TREE_VALUE (vbases); ! tree base_type = BINFO_TYPE (vbase); ! if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (base_type)) ! { ! tree base_ptr_type = build_pointer_type (base_type); ! tree expr = current_class_ptr; ! ! /* Convert to the basetype here, as we know the layout is ! fixed. What is more, if we let build_method_call do it, ! it will use the vtable, which may have been clobbered ! by the deletion of our primary base. */ ! ! expr = build1 (NOP_EXPR, base_ptr_type, expr); ! expr = build (PLUS_EXPR, base_ptr_type, expr, ! BINFO_OFFSET (vbase)); ! expr = build_indirect_ref (expr, NULL); ! expr = build_method_call (expr, base_dtor_identifier, ! NULL_TREE, vbase, ! LOOKUP_NORMAL); ! finish_expr_stmt (expr); ! } ! } ! finish_then_clause (if_stmt); ! finish_if_stmt (); ! } ! } /* In a virtual destructor, we must call delete. */ if (DECL_VIRTUAL_P (current_function_decl)) --- 14008,14094 ---- } } ! /* Add a note to mark the beginning of the main body of the constructor. ! This is used to set up the data structures for the cleanup regions for ! fully-constructed bases and members. */ ! ! static void ! begin_constructor_body () ! { ! tree ctor_stmt = build_stmt (CTOR_STMT); ! CTOR_BEGIN_P (ctor_stmt) = 1; ! add_stmt (ctor_stmt); ! } ! ! /* Add a note to mark the end of the main body of the constructor. This is ! used to end the cleanup regions for fully-constructed bases and ! members. */ static void finish_constructor_body () { ! /* Mark the end of the cleanups for a partially constructed object. ! ??? These should really be handled automatically by closing the block, ! as with the destructor cleanups; the only difference is that these are ! only run if an exception is thrown. */ add_stmt (build_stmt (CTOR_STMT)); } ! /* 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 () { + tree if_stmt; tree compound_stmt; ! /* If the dtor is empty, and we know there is not any possible ! way we could use any vtable entries, before they are possibly ! set by a base class dtor, we don't have to setup the vtables, ! as we know that any base class dtor will set up any vtables ! it needs. We avoid MI, because one base class dtor can do a ! virtual dispatch to an overridden function that would need to ! have a non-related vtable set up, we cannot avoid setting up ! vtables in that case. We could change this to see if there ! is just one vtable. ! ??? In the destructor for a class, the vtables are set ! appropriately for that class. There will be no non-related ! vtables. jason 2001-12-11. */ ! if_stmt = begin_if_stmt (); ! /* If it is not safe to avoid setting up the vtables, then ! someone will change the condition to be boolean_true_node. ! (Actually, for now, we do not have code to set the condition ! appropriately, so we just assume that we always need to ! initialize the vtables.) */ ! finish_if_stmt_cond (boolean_true_node, if_stmt); ! current_vcalls_possible_p = &IF_COND (if_stmt); ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); ! /* Make all virtual function table pointers in non-virtual base ! classes point to CURRENT_CLASS_TYPE's virtual function ! tables. */ ! initialize_vtbl_ptrs (current_class_ptr); ! finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); ! finish_then_clause (if_stmt); ! finish_if_stmt (); ! } ! /* At the end of every destructor we generate code to delete the object if ! necessary. Do that now. */ ! static void ! finish_destructor_body () ! { ! tree exprstmt; ! /* And perform cleanups for our bases and members. */ ! perform_base_cleanups (); /* In a virtual destructor, we must call delete. */ if (DECL_VIRTUAL_P (current_function_decl)) *************** finish_destructor_body () *** 13953,13962 **** /* [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, LOOKUP_NORMAL | LOOKUP_SPECULATIVELY, NULL_TREE); --- 14098,14107 ---- /* [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, LOOKUP_NORMAL | LOOKUP_SPECULATIVELY, NULL_TREE); *************** finish_destructor_body () *** 13970,13989 **** finish_then_clause (if_stmt); finish_if_stmt (); } ! /* Close the block we started above. */ ! finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); } /* 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: - 1 - CALL_POPLEVEL - An extra call to poplevel (and expand_end_bindings) must be - made to take care of the binding contour for the base - initializers. This is only relevant for constructors. 2 - INCLASS_INLINE We just finished processing the body of an in-class inline function definition. (This processing will have taken place --- 14115,14190 ---- finish_then_clause (if_stmt); finish_if_stmt (); } + } ! /* 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). ! In other functions, this isn't necessary, but it doesn't hurt. */ ! ! tree ! begin_function_body () ! { ! tree stmt; ! ! 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 (1); ! ! stmt = begin_compound_stmt (0); ! COMPOUND_STMT_BODY_BLOCK (stmt) = 1; ! ! if (processing_template_decl) ! /* Do nothing now. */; ! else if (DECL_CONSTRUCTOR_P (current_function_decl)) ! begin_constructor_body (); ! 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 (compstmt) + tree compstmt; + { + if (processing_template_decl) + /* Do nothing now. */; + else if (DECL_DESTRUCTOR_P (current_function_decl)) + /* Any return from a destructor will end up here. Put it before the + cleanups so that an explicit return doesn't duplicate them. */ + add_stmt (build_stmt (LABEL_STMT, dtor_label)); + + /* Close the block; in a destructor, run the member cleanups. */ + finish_compound_stmt (0, 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 (); + } + /* 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 *************** finish_function (flags) *** 13995,14001 **** { register tree fndecl = current_function_decl; tree fntype, ctype = NULL_TREE; - int call_poplevel = (flags & 1) != 0; int inclass_inline = (flags & 2) != 0; int nested; --- 14196,14201 ---- *************** finish_function (flags) *** 14013,14034 **** my_friendly_assert (building_stmt_tree (), 20000911); /* 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_CONSTRUCTOR_P (fndecl)) ! { ! finish_constructor_body (); ! if (call_poplevel) ! do_poplevel (); ! } ! else if (DECL_DESTRUCTOR_P (fndecl) && !processing_template_decl) ! finish_destructor_body (); ! else if (DECL_MAIN_P (fndecl)) { /* Make it so that `main' always returns 0 by default. */ ! #ifdef VMS finish_return_stmt (integer_one_node); #else finish_return_stmt (integer_zero_node); --- 14213,14228 ---- my_friendly_assert (building_stmt_tree (), 20000911); + finish_fname_decls (); + /* For a cloned function, we've already got all the code we need; there's no need to add any extra bits. */ if (!DECL_CLONED_FUNCTION_P (fndecl)) { ! if (DECL_MAIN_P (current_function_decl)) { /* Make it so that `main' always returns 0 by default. */ ! #ifdef VMS_TARGET finish_return_stmt (integer_one_node); #else finish_return_stmt (integer_zero_node); *************** finish_function (flags) *** 14050,14059 **** /* 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 (current_binding_level->parm_flag != 1) ! my_friendly_abort (122); poplevel (1, 0, 1); /* Remember that we were in class scope. */ if (current_class_name) ctype = current_class_type; --- 14244,14295 ---- /* 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->parm_flag != 1) ! { ! /* Make sure we have already experienced errors. */ ! if (errorcount == 0) ! abort (); ! ! /* Throw away the broken statement tree and extra binding ! levels. */ ! DECL_SAVED_TREE (fndecl) = build_stmt (COMPOUND_STMT, NULL_TREE); ! ! while (current_binding_level->parm_flag != 1) ! { ! if (current_binding_level->parm_flag == 2) ! pop_nested_class (); ! else ! poplevel (0, 0, 0); ! } ! } poplevel (1, 0, 1); + /* Set up the named return value optimization, if we can. Here, we + eliminate the copy from the nrv into the RESULT_DECL and any cleanup + for the nrv. genrtl_start_function and declare_return_variable + handle making the nrv and RESULT_DECL share space. */ + if (current_function_return_value) + { + tree r = current_function_return_value; + /* This is only worth doing for fns that return in memory--and + simpler, since we don't have to worry about promoted modes. */ + if (r != error_mark_node + && aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl)))) + { + DECL_ALIGN (r) = DECL_ALIGN (DECL_RESULT (fndecl)); + walk_tree_without_duplicates (&DECL_SAVED_TREE (fndecl), + nullify_returns_r, r); + } + else + /* Clear it so genrtl_start_function and declare_return_variable + know we're not optimizing. */ + current_function_return_value = NULL_TREE; + } + /* Remember that we were in class scope. */ if (current_class_name) ctype = current_class_type; *************** finish_function (flags) *** 14081,14086 **** --- 14317,14335 ---- if (!processing_template_decl && calls_setjmp_p (fndecl)) DECL_UNINLINABLE (fndecl) = 1; + /* Complain if there's just no return statement. */ + if (warn_return_type + && !processing_template_decl + && TREE_CODE (TREE_TYPE (fntype)) != VOID_TYPE + && !current_function_returns_value && !current_function_returns_null + /* Don't complain if we abort or throw. */ + && !current_function_returns_abnormally + && !DECL_NAME (DECL_RESULT (fndecl)) + /* Normally, with -Wreturn-type, flow will complain. Unless we're an + inline function, as we might never be compiled separately. */ + && DECL_INLINE (fndecl)) + warning ("no return statement in function returning non-void"); + /* Clear out memory we no longer need. */ free_after_parsing (cfun); /* Since we never call rest_of_compilation, we never clear *************** start_method (declspecs, declarator, att *** 14137,14150 **** tree declarator, declspecs, attrlist; { tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, ! attrlist); /* Something too ugly to handle. */ if (fndecl == NULL_TREE) return NULL_TREE; if (attrlist) ! cplus_decl_attributes (fndecl, attrlist, 0); /* Pass friends other than inline friend functions back. */ if (fndecl == void_type_node) --- 14386,14399 ---- tree declarator, declspecs, attrlist; { tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, ! &attrlist); /* Something too ugly to handle. */ if (fndecl == NULL_TREE) return NULL_TREE; if (attrlist) ! cplus_decl_attributes (&fndecl, attrlist, 0); /* Pass friends other than inline friend functions back. */ if (fndecl == void_type_node) *************** start_method (declspecs, declarator, att *** 14160,14166 **** { if (DECL_CONTEXT (fndecl) && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL) ! cp_error ("`%D' is already defined in class `%T'", fndecl, DECL_CONTEXT (fndecl)); } return void_type_node; --- 14409,14415 ---- { if (DECL_CONTEXT (fndecl) && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL) ! error ("`%D' is already defined in class `%T'", fndecl, DECL_CONTEXT (fndecl)); } return void_type_node; *************** start_method (declspecs, declarator, att *** 14184,14197 **** fndecl = copy_node (fndecl); TREE_CHAIN (fndecl) = NULL_TREE; } ! ! if (DECL_CONSTRUCTOR_P (fndecl)) ! { ! if (! grok_ctor_properties (current_class_type, fndecl)) ! return void_type_node; ! } ! else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl))) ! grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl), 0); } cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); --- 14433,14439 ---- fndecl = copy_node (fndecl); TREE_CHAIN (fndecl) = NULL_TREE; } ! grok_special_member_properties (fndecl); } cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); *************** finish_method (decl) *** 14248,14258 **** DECL_CONTEXT (link) = NULL_TREE; } - GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, - (HOST_WIDE_INT) current_binding_level->level_chain, - current_binding_level->parm_flag, - current_binding_level->keep); - poplevel (0, 0, 0); DECL_INITIAL (fndecl) = old_initial; --- 14490,14495 ---- *************** finish_method (decl) *** 14270,14341 **** return decl; } ! /* Called when a new struct TYPE is defined. ! If this structure or union completes the type of any previous ! variable declaration, lay it out and output its rtl. */ void ! hack_incomplete_structures (type) ! tree type; { ! tree *list; ! struct binding_level *level; ! ! if (!type) /* Don't do this for class templates. */ ! return; ! if (namespace_bindings_p ()) ! { ! level = 0; ! list = &namespace_scope_incomplete; ! } ! else { ! level = innermost_nonclass_level (); ! list = &level->incomplete; } ! while (1) ! { ! while (*list) ! { ! tree decl = TREE_VALUE (*list); ! if ((decl && TREE_TYPE (decl) == type) ! || (TREE_TYPE (decl) ! && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE ! && TREE_TYPE (TREE_TYPE (decl)) == type)) ! { ! int toplevel = toplevel_bindings_p (); ! if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE ! && TREE_TYPE (TREE_TYPE (decl)) == type) ! layout_type (TREE_TYPE (decl)); ! layout_decl (decl, 0); ! rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0); ! if (! toplevel) ! { ! tree cleanup; ! expand_decl (decl); ! cleanup = maybe_build_cleanup (decl); ! expand_decl_init (decl); ! if (! expand_decl_cleanup (decl, cleanup)) ! cp_error ("parser lost in parsing declaration of `%D'", ! decl); ! } ! *list = TREE_CHAIN (*list); ! } ! else ! list = &TREE_CHAIN (*list); ! } ! /* Keep looking through artificial binding levels generated ! for local variables. */ ! if (level && level->keep == 2) { ! level = level->level_chain; ! list = &level->incomplete; } else ! break; } } --- 14507,14564 ---- return decl; } ! ! /* 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 (var) ! tree var; { ! my_friendly_assert (TREE_CODE (var) == VAR_DECL, 20020406); ! /* 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_vars = tree_cons (inner_type, var, incomplete_vars); } + } ! /* Called when a class type (given by TYPE) is defined. If there are ! any existing VAR_DECLs whose type hsa been completed by this ! declaration, update them now. */ ! void ! complete_vars (type) ! tree type; ! { ! tree *list = &incomplete_vars; ! ! my_friendly_assert (CLASS_TYPE_P (type), 20020406); ! while (*list) ! { ! if (same_type_p (type, TREE_PURPOSE (*list))) { ! tree var = TREE_VALUE (*list); ! /* Complete the type of the variable. The VAR_DECL itself ! will be laid out in expand_expr. */ ! complete_type (TREE_TYPE (var)); ! /* Remove this entry from the list. */ ! *list = TREE_CHAIN (*list); } else ! list = &TREE_CHAIN (*list); } } *************** maybe_build_cleanup (decl) *** 14348,14358 **** { tree type = TREE_TYPE (decl); ! if (type != error_mark_node && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) ! /* The destructor must not be called on the parameters of a thunk ! because they are not copied when the thunk calls the function ! to which is thunking. */ ! && (! DECL_CONTEXT (decl) || ! DECL_THUNK_P (DECL_CONTEXT (decl)))) { int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; tree rval; --- 14571,14577 ---- { tree type = TREE_TYPE (decl); ! if (type != error_mark_node && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) { int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; tree rval; *************** maybe_build_cleanup (decl) *** 14380,14386 **** return rval; } ! return 0; } /* When a stmt has been parsed, this function is called. */ --- 14599,14605 ---- return rval; } ! return NULL_TREE; } /* When a stmt has been parsed, this function is called. */ *************** revert_static_member_fn (decl) *** 14405,14418 **** tree function = TREE_TYPE (decl); tree args = TYPE_ARG_TYPES (function); ! if (CP_TYPE_QUALS (TREE_TYPE (TREE_VALUE (args))) != TYPE_UNQUALIFIED) ! cp_error ("static member function `%#D' declared with type qualifiers", decl); args = TREE_CHAIN (args); tmp = build_function_type (TREE_TYPE (function), args); ! tmp = build_qualified_type (tmp, CP_TYPE_QUALS (function)); tmp = build_exception_variant (tmp, TYPE_RAISES_EXCEPTIONS (function)); TREE_TYPE (decl) = tmp; --- 14624,14637 ---- tree function = TREE_TYPE (decl); tree args = TYPE_ARG_TYPES (function); ! if (cp_type_quals (TREE_TYPE (TREE_VALUE (args))) != TYPE_UNQUALIFIED) ! error ("static member function `%#D' declared with type qualifiers", decl); args = TREE_CHAIN (args); tmp = build_function_type (TREE_TYPE (function), args); ! tmp = build_qualified_type (tmp, cp_type_quals (function)); tmp = build_exception_variant (tmp, TYPE_RAISES_EXCEPTIONS (function)); TREE_TYPE (decl) = tmp; *************** mark_lang_function (p) *** 14471,14477 **** mark_c_language_function (&p->base); - ggc_mark_tree (p->x_ctor_label); ggc_mark_tree (p->x_dtor_label); ggc_mark_tree (p->x_current_class_ptr); ggc_mark_tree (p->x_current_class_ref); --- 14690,14695 ---- *************** mark_lang_function (p) *** 14480,14485 **** --- 14698,14704 ---- mark_named_label_lists (&p->x_named_labels, &p->x_named_label_uses); mark_binding_level (&p->bindings); + mark_pending_inlines (&p->unparsed_inlines); } /* Mark the language-specific data in F for GC. */ *************** lang_mark_tree (t) *** 14548,14554 **** ggc_mark_tree (ld->befriending_classes); ggc_mark_tree (ld->context); ggc_mark_tree (ld->cloned_function); - ggc_mark_tree (ld->inlined_fns); if (TREE_CODE (t) == TYPE_DECL) ggc_mark_tree (ld->u.sorted_fields); else if (TREE_CODE (t) == FUNCTION_DECL --- 14767,14772 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/decl.h gcc-3.1/gcc/cp/decl.h *** gcc-3.0.4/gcc/cp/decl.h Wed Jan 26 20:51:34 2000 --- gcc-3.1/gcc/cp/decl.h Wed Jan 9 06:32:47 2002 *************** *** 1,5 **** /* Variables and structures for declaration processing. ! Copyright (C) 1993, 2000 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Variables and structures for declaration processing. ! Copyright (C) 1993, 2000, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** enum decl_context *** 31,37 **** }; /* We need this in here to get the decl_context definition. */ ! extern tree grokdeclarator PARAMS ((tree, tree, enum decl_context, int, tree)); /* Parsing a function declarator leaves a list of parameter names or a chain or parameter decls here. */ --- 31,38 ---- }; /* We need this in here to get the decl_context definition. */ ! extern tree grokdeclarator PARAMS ((tree, tree, enum decl_context, int, ! tree *)); /* Parsing a function declarator leaves a list of parameter names or a chain or parameter decls here. */ diff -Nrc3pad gcc-3.0.4/gcc/cp/decl2.c gcc-3.1/gcc/cp/decl2.c *** gcc-3.0.4/gcc/cp/decl2.c Fri Nov 30 03:12:42 2001 --- gcc-3.1/gcc/cp/decl2.c Wed Apr 17 17:13:39 2002 *************** *** 1,6 **** /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 40,50 **** #include "output.h" #include "except.h" #include "toplev.h" - #include "dwarf2out.h" - #include "dwarfout.h" #include "ggc.h" #include "timevar.h" #include "cpplib.h" extern cpp_reader *parse_in; /* This structure contains information about the initializations --- 40,49 ---- #include "output.h" #include "except.h" #include "toplev.h" #include "ggc.h" #include "timevar.h" #include "cpplib.h" + #include "target.h" extern cpp_reader *parse_in; /* This structure contains information about the initializations *************** static tree key_method PARAMS ((tree)); *** 92,105 **** static int compare_options PARAMS ((const PTR, const PTR)); static tree get_guard_bits PARAMS ((tree)); - extern int current_class_depth; - - /* A list of virtual function tables we must make sure to write out. */ - tree pending_vtables; - /* 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, staticly, outside the class. */ static varray_type pending_statics; #define pending_statics_used \ (pending_statics ? pending_statics->elements_used : 0) --- 91,99 ---- static int compare_options PARAMS ((const PTR, const PTR)); static tree get_guard_bits PARAMS ((tree)); /* A list of static class variables. This is needed, because a static class variable can be declared inside the class without ! an initializer, and then initialized, statically, outside the class. */ static varray_type pending_statics; #define pending_statics_used \ (pending_statics ? pending_statics->elements_used : 0) *************** static varray_type deferred_fns; *** 110,119 **** #define deferred_fns_used \ (deferred_fns ? deferred_fns->elements_used : 0) - /* Same, but not reset. Local temp variables and global temp variables - can have the same name. */ - static int global_temp_name_counter; - /* Flag used when debugging spew.c */ extern int spew_debug; --- 104,109 ---- *************** tree static_dtors; *** 130,140 **** /* The :: namespace. */ tree global_namespace; - - /* The stack for namespaces of current declarations. */ - - static tree decl_namespace_list; - /* C (and C++) language-specific option variables. */ --- 120,125 ---- *************** int warn_long_long = 1; *** 200,210 **** int warn_ctor_dtor_privacy = 1; - /* True if we want to implement vtables using "thunks". - The default is off. */ - - int flag_vtable_thunks = 1; - /* Nonzero means generate separate instantiation control files and juggle them at link time. */ --- 185,190 ---- *************** int flag_default_inline = 1; *** 353,363 **** int flag_rtti = 1; - /* Nonzero if we wish to output cross-referencing information - for the GNU class browser. */ - - extern int flag_gnu_xref; - /* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes) objects. */ --- 333,338 ---- *************** int flag_weak = 1; *** 403,424 **** int flag_use_cxa_atexit; - /* Nonzero to not ignore namespace std. */ - - int flag_honor_std = ENABLE_STD_NAMESPACE; - - /* 0 if we should not perform inlining. - 1 if we should expand functions calls inline at the tree level. - 2 if we should consider *all* functions to be inline - candidates. */ - - int flag_inline_trees = 0; - /* Maximum template instantiation depth. This limit is rather arbitrary, but it exists to limit the time it takes to notice infinite template instantiations. */ ! int max_tinst_depth = 50; /* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */ --- 378,388 ---- int flag_use_cxa_atexit; /* Maximum template instantiation depth. This limit is rather arbitrary, but it exists to limit the time it takes to notice infinite template instantiations. */ ! int max_tinst_depth = 500; /* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */ *************** int flag_permissive; *** 436,452 **** int flag_enforce_eh_specs = 1; - /* The variant of the C language being processed. */ - - c_language_kind c_language = clk_cplusplus; - /* Table of language-dependent -f options. STRING is the option name. VARIABLE is the address of the variable. ON_VALUE is the value to store in VARIABLE if `-fSTRING' is seen as an option. (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ ! static struct { const char *string; int *variable; int on_value;} lang_f_options[] = { /* C/C++ options. */ --- 400,412 ---- int flag_enforce_eh_specs = 1; /* Table of language-dependent -f options. STRING is the option name. VARIABLE is the address of the variable. ON_VALUE is the value to store in VARIABLE if `-fSTRING' is seen as an option. (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ ! static const struct { const char *const string; int *const variable; const int on_value;} lang_f_options[] = { /* C/C++ options. */ *************** lang_f_options[] = *** 484,489 **** --- 444,450 ---- {"repo", &flag_use_repository, 1}, {"rtti", &flag_rtti, 1}, {"stats", &flag_detailed_statistics, 1}, + {"vtable-gc", &flag_vtable_gc, 1}, {"use-cxa-atexit", &flag_use_cxa_atexit, 1}, {"weak", &flag_weak, 1} }; *************** static const char * const unsupported_op *** 504,510 **** "squangle", "strict-prototype", "this-is-variable", - "vtable-gc", "vtable-thunks", "xref" }; --- 465,470 ---- *************** cxx_decode_option (argc, argv) *** 533,539 **** int strings_processed; const char *p = argv[0]; ! strings_processed = cpp_handle_option (parse_in, argc, argv); if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) /* ignore */; --- 493,499 ---- int strings_processed; const char *p = argv[0]; ! strings_processed = cpp_handle_option (parse_in, argc, argv, 0); if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) /* ignore */; *************** cxx_decode_option (argc, argv) *** 616,632 **** { *lang_f_options[j].variable = lang_f_options[j].on_value; /* A goto here would be cleaner, ! but breaks the vax pcc. */ found = 1; } ! if (p[0] == 'n' && p[1] == 'o' && p[2] == '-' ! && ! strcmp (p+3, lang_f_options[j].string)) { *lang_f_options[j].variable = ! lang_f_options[j].on_value; found = 1; } } ! return found; } } --- 576,592 ---- { *lang_f_options[j].variable = lang_f_options[j].on_value; /* A goto here would be cleaner, ! but breaks the VAX pcc. */ found = 1; } ! else if (p[0] == 'n' && p[1] == 'o' && p[2] == '-' ! && ! strcmp (p+3, lang_f_options[j].string)) { *lang_f_options[j].variable = ! lang_f_options[j].on_value; found = 1; } } ! return found; } } *************** grok_method_quals (ctype, function, qual *** 798,804 **** while (quals); if (dup_quals != TYPE_UNQUALIFIED) ! cp_error ("duplicate type qualifiers in %s declaration", TREE_CODE (function) == FUNCTION_DECL ? "member function" : "type"); --- 758,764 ---- while (quals); if (dup_quals != TYPE_UNQUALIFIED) ! error ("duplicate type qualifiers in %s declaration", TREE_CODE (function) == FUNCTION_DECL ? "member function" : "type"); *************** warn_if_unknown_interface (decl) *** 837,843 **** lineno = TINST_LINE (til); input_filename = TINST_FILE (til); } ! cp_warning ("template `%#D' instantiated in file without #pragma interface", decl); lineno = sl; input_filename = sf; --- 797,803 ---- lineno = TINST_LINE (til); input_filename = TINST_FILE (til); } ! warning ("template `%#D' instantiated in file without #pragma interface", decl); lineno = sl; input_filename = sf; *************** build_artificial_parm (name, type) *** 881,886 **** --- 841,849 ---- parm = build_decl (PARM_DECL, name, type); DECL_ARTIFICIAL (parm) = 1; + /* All our artificial parms are implicitly `const'; they cannot be + assigned to. */ + TREE_READONLY (parm) = 1; DECL_ARG_TYPE (parm) = type; return parm; } *************** grokclassfn (ctype, function, flags, qua *** 1020,1029 **** qual_type = cp_build_qualified_type (type, this_quals); parm = build_artificial_parm (this_identifier, qual_type); c_apply_type_quals_to_decl (this_quals, parm); - - /* We can make this a register, so long as we don't - accidentally complain if someone tries to take its address. */ - DECL_REGISTER (parm) = 1; TREE_CHAIN (parm) = last_function_parms; last_function_parms = parm; } --- 983,988 ---- *************** grokclassfn (ctype, function, flags, qua *** 1044,1085 **** } } - /* Work on the expr used by alignof (this is only called by the parser). */ - - tree - grok_alignof (expr) - tree expr; - { - tree best, t; - int bestalign; - - if (processing_template_decl) - return build_min_nt (ALIGNOF_EXPR, expr); - - if (TREE_CODE (expr) == COMPONENT_REF - && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1))) - error ("`__alignof__' applied to a bit-field"); - - if (TREE_CODE (expr) == INDIRECT_REF) - { - best = t = TREE_OPERAND (expr, 0); - bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); - - while (TREE_CODE (t) == NOP_EXPR - && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) - { - int thisalign; - t = TREE_OPERAND (t, 0); - thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); - if (thisalign > bestalign) - best = t, bestalign = thisalign; - } - return c_alignof (TREE_TYPE (TREE_TYPE (best))); - } - else - return c_alignof (TREE_TYPE (expr)); - } - /* Create an ARRAY_REF, checking for the user doing things backwards along the way. */ --- 1003,1008 ---- *************** grok_array_decl (array_expr, index_exp) *** 1139,1145 **** array_expr = p2, index_exp = i1; else { ! cp_error ("invalid types `%T[%T]' for array subscript", type, TREE_TYPE (index_exp)); return error_mark_node; } --- 1062,1068 ---- array_expr = p2, index_exp = i1; else { ! error ("invalid types `%T[%T]' for array subscript", type, TREE_TYPE (index_exp)); return error_mark_node; } *************** delete_sanity (exp, size, doing_vec, use *** 1187,1193 **** if (t == NULL_TREE || t == error_mark_node) { ! cp_error ("type `%#T' argument given to `delete', expected pointer", TREE_TYPE (exp)); return error_mark_node; } --- 1110,1116 ---- if (t == NULL_TREE || t == error_mark_node) { ! error ("type `%#T' argument given to `delete', expected pointer", TREE_TYPE (exp)); return error_mark_node; } *************** delete_sanity (exp, size, doing_vec, use *** 1212,1218 **** /* Deleting ptr to void is undefined behaviour [expr.delete/3]. */ if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE) { ! cp_warning ("deleting `%T' is undefined", type); doing_vec = 0; } --- 1135,1141 ---- /* Deleting ptr to void is undefined behaviour [expr.delete/3]. */ if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE) { ! warning ("deleting `%T' is undefined", type); doing_vec = 0; } *************** delete_sanity (exp, size, doing_vec, use *** 1220,1226 **** if (TREE_CODE (t) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE) ! cp_warning ("deleting array `%#D'", TREE_OPERAND (t, 0)); /* Deleting a pointer with the value zero is valid and has no effect. */ if (integer_zerop (t)) --- 1143,1149 ---- if (TREE_CODE (t) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE) ! warning ("deleting array `%#D'", TREE_OPERAND (t, 0)); /* Deleting a pointer with the value zero is valid and has no effect. */ if (integer_zerop (t)) *************** delete_sanity (exp, size, doing_vec, use *** 1230,1250 **** return build_vec_delete (t, maxindex, sfk_deleting_destructor, use_global_delete); else ! { ! if (IS_AGGR_TYPE (TREE_TYPE (type)) ! && TYPE_GETS_REG_DELETE (TREE_TYPE (type))) ! { ! /* Only do access checking here; we'll be calling op delete ! from the destructor. */ ! tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node, ! LOOKUP_NORMAL, NULL_TREE); ! if (tmp == error_mark_node) ! return error_mark_node; ! } ! ! return build_delete (type, t, sfk_deleting_destructor, ! LOOKUP_NORMAL, use_global_delete); ! } } /* Report an error if the indicated template declaration is not the --- 1153,1160 ---- return build_vec_delete (t, maxindex, 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 *************** check_member_template (tmpl) *** 1267,1273 **** /* 14.5.2.2 [temp.mem] A local class shall not have member templates. */ ! cp_error ("invalid declaration of member template `%#D' in local class", decl); if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl)) --- 1177,1183 ---- /* 14.5.2.2 [temp.mem] A local class shall not have member templates. */ ! error ("invalid declaration of member template `%#D' in local class", decl); if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl)) *************** check_member_template (tmpl) *** 1275,1281 **** /* 14.5.2.3 [temp.mem] A member function template shall not be virtual. */ ! cp_error ("invalid use of `virtual' in template declaration of `%#D'", decl); DECL_VIRTUAL_P (decl) = 0; --- 1185,1191 ---- /* 14.5.2.3 [temp.mem] A member function template shall not be virtual. */ ! error ("invalid use of `virtual' in template declaration of `%#D'", decl); DECL_VIRTUAL_P (decl) = 0; *************** check_member_template (tmpl) *** 1286,1292 **** DECL_IGNORED_P (tmpl) = 1; } else ! cp_error ("template declaration of `%#D'", decl); } /* Return true iff TYPE is a valid Java parameter or return type. */ --- 1196,1202 ---- DECL_IGNORED_P (tmpl) = 1; } else ! error ("template declaration of `%#D'", decl); } /* Return true iff TYPE is a valid Java parameter or return type. */ *************** check_java_method (method) *** 1336,1342 **** tree ret_type = TREE_TYPE (TREE_TYPE (method)); if (! acceptable_java_type (ret_type)) { ! cp_error ("Java method '%D' has non-Java return type `%T'", method, ret_type); jerr++; } --- 1246,1252 ---- tree ret_type = TREE_TYPE (TREE_TYPE (method)); if (! acceptable_java_type (ret_type)) { ! error ("Java method '%D' has non-Java return type `%T'", method, ret_type); jerr++; } *************** check_java_method (method) *** 1345,1351 **** tree type = TREE_VALUE (arg_types); if (! acceptable_java_type (type)) { ! cp_error ("Java method '%D' has non-Java parameter type `%T'", method, type); jerr++; } --- 1255,1261 ---- tree type = TREE_VALUE (arg_types); if (! acceptable_java_type (type)) { ! error ("Java method '%D' has non-Java parameter type `%T'", method, type); jerr++; } *************** check_classfn (ctype, function) *** 1441,1447 **** if (methods != end && *methods) { tree fndecl = *methods; ! cp_error ("prototype for `%#D' does not match any in class `%T'", function, ctype); cp_error_at ("candidate%s: %+#D", OVL_NEXT (fndecl) ? "s are" : " is", OVL_CURRENT (fndecl)); --- 1351,1357 ---- if (methods != end && *methods) { tree fndecl = *methods; ! error ("prototype for `%#D' does not match any in class `%T'", function, ctype); cp_error_at ("candidate%s: %+#D", OVL_NEXT (fndecl) ? "s are" : " is", OVL_CURRENT (fndecl)); *************** check_classfn (ctype, function) *** 1454,1460 **** if (!COMPLETE_TYPE_P (ctype)) incomplete_type_error (function, ctype); else ! cp_error ("no `%#D' member function declared in class `%T'", function, ctype); } --- 1364,1370 ---- if (!COMPLETE_TYPE_P (ctype)) incomplete_type_error (function, ctype); else ! error ("no `%#D' member function declared in class `%T'", function, ctype); } *************** finish_static_data_member_decl (decl, in *** 1484,1490 **** DECL_CONTEXT (decl) = current_class_type; /* We cannot call pushdecl here, because that would fill in the ! decl of our TREE_CHAIN. Instead, we modify cp_finish_decl to do the right thing, namely, to put this decl out straight away. */ /* current_class_type can be NULL_TREE in case of error. */ if (!asmspec_tree && current_class_type) --- 1394,1400 ---- 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. */ /* current_class_type can be NULL_TREE in case of error. */ if (!asmspec_tree && current_class_type) *************** finish_static_data_member_decl (decl, in *** 1497,1502 **** --- 1407,1416 ---- VARRAY_PUSH_TREE (pending_statics, decl); } + if (LOCAL_CLASS_P (current_class_type)) + pedwarn ("local class `%#T' shall not have static data member `%#D'", + current_class_type, decl); + /* Static consts need not be initialized in the class definition. */ if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) { *************** tree *** 1542,1548 **** grokfield (declarator, declspecs, init, asmspec_tree, attrlist) tree declarator, declspecs, init, asmspec_tree, attrlist; { ! register tree value; const char *asmspec = 0; int flags = LOOKUP_ONLYCONVERTING; --- 1456,1462 ---- grokfield (declarator, declspecs, init, asmspec_tree, attrlist) tree declarator, declspecs, init, asmspec_tree, attrlist; { ! tree value; const char *asmspec = 0; int flags = LOOKUP_ONLYCONVERTING; *************** grokfield (declarator, declspecs, init, *** 1564,1573 **** Explain that to the user. */ static int explained; ! cp_error ("invalid data member initialization"); if (!explained) { ! cp_error ("(use `=' to initialize static data members)"); explained = 1; } --- 1478,1487 ---- Explain that to the user. */ static int explained; ! error ("invalid data member initialization"); if (!explained) { ! error ("(use `=' to initialize static data members)"); explained = 1; } *************** grokfield (declarator, declspecs, init, *** 1593,1599 **** && TREE_CHAIN (init) == NULL_TREE) init = NULL_TREE; ! value = grokdeclarator (declarator, declspecs, FIELD, init != 0, attrlist); if (! value || value == error_mark_node) /* friend or constructor went bad. */ return value; --- 1507,1513 ---- && TREE_CHAIN (init) == NULL_TREE) init = NULL_TREE; ! value = grokdeclarator (declarator, declspecs, FIELD, init != 0, &attrlist); if (! value || value == error_mark_node) /* friend or constructor went bad. */ return value; *************** grokfield (declarator, declspecs, init, *** 1607,1613 **** if (DECL_NAME (value) != NULL_TREE && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_' && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr")) ! cp_error ("member `%D' conflicts with virtual function table field name", value); /* Stash away type declarations. */ --- 1521,1527 ---- if (DECL_NAME (value) != NULL_TREE && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_' && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr")) ! error ("member `%D' conflicts with virtual function table field name", value); /* Stash away type declarations. */ *************** grokfield (declarator, declspecs, init, *** 1627,1633 **** if (DECL_IN_AGGR_P (value)) { ! cp_error ("`%D' is already defined in `%T'", value, DECL_CONTEXT (value)); return void_type_node; } --- 1541,1547 ---- if (DECL_IN_AGGR_P (value)) { ! error ("`%D' is already defined in `%T'", value, DECL_CONTEXT (value)); return void_type_node; } *************** grokfield (declarator, declspecs, init, *** 1690,1697 **** value = push_template_decl (value); if (attrlist) ! cplus_decl_attributes (value, TREE_PURPOSE (attrlist), ! TREE_VALUE (attrlist)); if (TREE_CODE (value) == VAR_DECL) { --- 1604,1610 ---- value = push_template_decl (value); if (attrlist) ! cplus_decl_attributes (&value, attrlist, 0); if (TREE_CODE (value) == VAR_DECL) { *************** grokfield (declarator, declspecs, init, *** 1702,1708 **** if (TREE_CODE (value) == FIELD_DECL) { if (asmspec) ! cp_error ("`asm' 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, NULL_TREE, flags); --- 1615,1621 ---- if (TREE_CODE (value) == FIELD_DECL) { if (asmspec) ! error ("`asm' 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, NULL_TREE, flags); *************** grokfield (declarator, declspecs, init, *** 1719,1724 **** --- 1632,1640 ---- SET_DECL_RTL (value, NULL_RTX); SET_DECL_ASSEMBLER_NAME (value, get_identifier (asmspec)); } + if (!DECL_FRIEND_P (value)) + grok_special_member_properties (value); + cp_finish_decl (value, init, asmspec_tree, flags); /* Pass friends back this way. */ *************** grokfield (declarator, declspecs, init, *** 1728,1734 **** DECL_IN_AGGR_P (value) = 1; return value; } ! my_friendly_abort (21); /* NOTREACHED */ return NULL_TREE; } --- 1644,1650 ---- DECL_IN_AGGR_P (value) = 1; return value; } ! abort (); /* NOTREACHED */ return NULL_TREE; } *************** grokbitfield (declarator, declspecs, wid *** 1741,1747 **** tree declarator, declspecs, width; { register tree value = grokdeclarator (declarator, declspecs, BITFIELD, ! 0, NULL_TREE); if (! value) return NULL_TREE; /* friends went bad. */ --- 1657,1663 ---- tree declarator, declspecs, width; { register tree value = grokdeclarator (declarator, declspecs, BITFIELD, ! 0, NULL); if (! value) return NULL_TREE; /* friends went bad. */ *************** grokbitfield (declarator, declspecs, wid *** 1751,1783 **** if (TREE_CODE (value) == TYPE_DECL) { ! cp_error ("cannot declare `%D' to be a bitfield type", value); return NULL_TREE; } ! /* Usually, finish_struct_1 catches bitifields 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) { ! cp_error ("cannot declare bitfield `%D' with funcion type", ! DECL_NAME (value)); return NULL_TREE; } if (DECL_IN_AGGR_P (value)) { ! cp_error ("`%D' is already defined in the class %T", value, DECL_CONTEXT (value)); return void_type_node; } - GNU_xref_member (current_class_name, value); - if (TREE_STATIC (value)) { ! cp_error ("static member `%D' cannot be a bitfield", value); return NULL_TREE; } cp_finish_decl (value, NULL_TREE, NULL_TREE, 0); --- 1667,1697 ---- if (TREE_CODE (value) == TYPE_DECL) { ! error ("cannot declare `%D' 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 `%D' with function type", ! DECL_NAME (value)); return NULL_TREE; } if (DECL_IN_AGGR_P (value)) { ! error ("`%D' is already defined in the class %T", value, DECL_CONTEXT (value)); return void_type_node; } if (TREE_STATIC (value)) { ! error ("static member `%D' cannot be a bit-field", value); return NULL_TREE; } cp_finish_decl (value, NULL_TREE, NULL_TREE, 0); *************** tree *** 1797,1803 **** grokoptypename (declspecs, declarator) tree declspecs, declarator; { ! tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE); return mangle_conv_op_name_for_type (t); } --- 1711,1717 ---- grokoptypename (declspecs, declarator) tree declspecs, declarator; { ! tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL); return mangle_conv_op_name_for_type (t); } *************** grokoptypename (declspecs, declarator) *** 1836,1863 **** */ - int - copy_assignment_arg_p (parmtype, virtualp) - tree parmtype; - int virtualp ATTRIBUTE_UNUSED; - { - if (current_class_type == NULL_TREE) - return 0; - - if (TREE_CODE (parmtype) == REFERENCE_TYPE) - parmtype = TREE_TYPE (parmtype); - - if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type) - #if 0 - /* Non-standard hack to support old Booch components. */ - || (! virtualp && DERIVED_FROM_P (parmtype, current_class_type)) - #endif - ) - return 1; - - return 0; - } - static void grok_function_init (decl, init) tree decl; --- 1750,1755 ---- *************** grok_function_init (decl, init) *** 1868,1904 **** tree type = TREE_TYPE (decl); if (TREE_CODE (type) == FUNCTION_TYPE) ! cp_error ("initializer specified for non-member function `%D'", decl); else if (integer_zerop (init)) ! { ! DECL_PURE_VIRTUAL_P (decl) = 1; ! if (DECL_OVERLOADED_OPERATOR_P (decl) == NOP_EXPR) ! { ! tree parmtype ! = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl)))); ! ! if (copy_assignment_arg_p (parmtype, 1)) ! TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1; ! } ! } else ! cp_error ("invalid initializer for virtual method `%D'", decl); } void ! cplus_decl_attributes (decl, attributes, prefix_attributes) ! tree decl, attributes, prefix_attributes; { ! if (decl == NULL_TREE || decl == void_type_node) return; ! if (TREE_CODE (decl) == TEMPLATE_DECL) ! decl = DECL_TEMPLATE_RESULT (decl); ! decl_attributes (decl, attributes, prefix_attributes); ! if (TREE_CODE (decl) == TYPE_DECL) ! SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl)); } /* CONSTRUCTOR_NAME: --- 1760,1787 ---- tree type = TREE_TYPE (decl); if (TREE_CODE (type) == FUNCTION_TYPE) ! error ("initializer specified for non-member function `%D'", decl); else if (integer_zerop (init)) ! DECL_PURE_VIRTUAL_P (decl) = 1; else ! error ("invalid initializer for virtual method `%D'", decl); } void ! cplus_decl_attributes (decl, attributes, flags) ! tree *decl, attributes; ! int flags; { ! if (*decl == NULL_TREE || *decl == void_type_node) return; ! 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)); } /* CONSTRUCTOR_NAME: *************** defer_fn (fn) *** 1963,2007 **** VARRAY_PUSH_TREE (deferred_fns, fn); } - /* Hand off a unique name which can be used for variable we don't really - want to know about anyway, for example, the anonymous variables which - are needed to make references work. Declare this thing so we can use it. - The variable created will be of type TYPE, and will have internal - linkage. */ - - tree - get_temp_name (type) - tree type; - { - char buf[sizeof (AUTO_TEMP_FORMAT) + 20]; - tree decl; - int toplev = toplevel_bindings_p (); - - sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++); - decl = build_decl (VAR_DECL, get_identifier (buf), type); - DECL_ARTIFICIAL (decl) = 1; - TREE_USED (decl) = 1; - TREE_STATIC (decl) = 1; - - decl = pushdecl_top_level (decl); - - /* If this is a local variable, then lay out its rtl now. - Otherwise, callers of this function are responsible for dealing - with this variable's rtl. */ - if (! toplev) - { - expand_decl (decl); - my_friendly_assert (DECL_INITIAL (decl) == NULL_TREE, - 19990826); - } - - return decl; - } - /* Hunts through the global anonymous union ANON_DECL, building appropriate VAR_DECLs. Stores cleanups on the list of ELEMS, and returns a VAR_DECL whose size is the same as the size of the ! ANON_DECL, if one is available. */ static tree build_anon_union_vars (anon_decl, elems, static_p, external_p) --- 1846,1858 ---- VARRAY_PUSH_TREE (deferred_fns, fn); } /* Hunts through the global anonymous union ANON_DECL, building appropriate VAR_DECLs. Stores cleanups on the list of ELEMS, and returns a VAR_DECL whose size is the same as the size of the ! ANON_DECL, if one is available. ! ! FIXME: we should really handle anonymous unions by binding the names ! of the members to COMPONENT_REFs rather than this kludge. */ static tree build_anon_union_vars (anon_decl, elems, static_p, external_p) *************** build_anon_union_vars (anon_decl, elems, *** 2091,2102 **** return main_decl; } ! /* Finish off the processing of a UNION_TYPE structure. ! If there are static members, then all members are ! static, and must be laid out together. If the ! union is an anonymous union, we arrange for that ! as well. PUBLIC_P is nonzero if this union is ! not declared static. */ void finish_anon_union (anon_union_decl) --- 1942,1950 ---- 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 (anon_union_decl) *************** coerce_new_type (type) *** 2193,2199 **** my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107); if (!same_type_p (TREE_TYPE (type), ptr_type_node)) ! e = 1, cp_error ("`operator new' must return type `%T'", ptr_type_node); if (!args || args == void_list_node || !same_type_p (TREE_VALUE (args), c_size_type_node)) --- 2041,2047 ---- my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107); if (!same_type_p (TREE_TYPE (type), ptr_type_node)) ! e = 1, error ("`operator new' must return type `%T'", ptr_type_node); if (!args || args == void_list_node || !same_type_p (TREE_VALUE (args), c_size_type_node)) *************** coerce_new_type (type) *** 2201,2207 **** e = 2; if (args && args != void_list_node) args = TREE_CHAIN (args); ! cp_error ("`operator new' takes type `size_t' (`%T') as first parameter", c_size_type_node); } switch (e) { --- 2049,2055 ---- e = 2; if (args && args != void_list_node) args = TREE_CHAIN (args); ! pedwarn ("`operator new' takes type `size_t' (`%T') as first parameter", c_size_type_node); } switch (e) { *************** coerce_delete_type (type) *** 2228,2234 **** my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107); if (!same_type_p (TREE_TYPE (type), void_type_node)) ! e = 1, cp_error ("`operator delete' must return type `%T'", void_type_node); if (!args || args == void_list_node || !same_type_p (TREE_VALUE (args), ptr_type_node)) --- 2076,2082 ---- my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107); if (!same_type_p (TREE_TYPE (type), void_type_node)) ! e = 1, error ("`operator delete' must return type `%T'", void_type_node); if (!args || args == void_list_node || !same_type_p (TREE_VALUE (args), ptr_type_node)) *************** coerce_delete_type (type) *** 2236,2242 **** e = 2; if (args && args != void_list_node) args = TREE_CHAIN (args); ! cp_error ("`operator delete' takes type `%T' as first parameter", ptr_type_node); } switch (e) { --- 2084,2090 ---- e = 2; if (args && args != void_list_node) args = TREE_CHAIN (args); ! error ("`operator delete' takes type `%T' as first parameter", ptr_type_node); } switch (e) { *************** mark_vtable_entries (decl) *** 2262,2277 **** for (; entries; entries = TREE_CHAIN (entries)) { ! tree fnaddr; tree fn; ! ! fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries) ! : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries))); ! 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, and RTTI offset, etc. */ continue; fn = TREE_OPERAND (fnaddr, 0); --- 2110,2122 ---- for (; entries; entries = TREE_CHAIN (entries)) { ! tree fnaddr = TREE_VALUE (entries); tree fn; ! if (TREE_CODE (fnaddr) != ADDR_EXPR && TREE_CODE (fnaddr) != FDESC_EXPR) /* This entry is an offset: a virtual base class offset, a ! virtual call offset, an RTTI offset, etc. */ continue; fn = TREE_OPERAND (fnaddr, 0); *************** comdat_linkage (decl) *** 2307,2318 **** 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 for the new ABI ! 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 { --- 2152,2163 ---- 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 { *************** maybe_make_one_only (decl) *** 2353,2359 **** 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 (! supports_one_only ()) return; /* We can't set DECL_COMDAT on functions, or finish_file will think --- 2198,2204 ---- 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 finish_file will think *************** maybe_make_one_only (decl) *** 2363,2370 **** make_decl_one_only (decl); ! if (TREE_CODE (decl) == VAR_DECL && DECL_LANG_SPECIFIC (decl)) ! DECL_COMDAT (decl) = 1; } /* Returns the virtual function with which the vtable for TYPE is --- 2208,2219 ---- make_decl_one_only (decl); ! if (TREE_CODE (decl) == VAR_DECL) ! { ! DECL_COMDAT (decl) = 1; ! /* Mark it needed so we don't forget to emit it. */ ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = 1; ! } } /* Returns the virtual function with which the vtable for TYPE is *************** key_method (type) *** 2385,2391 **** method = TREE_CHAIN (method)) if (DECL_VINDEX (method) != NULL_TREE && ! DECL_DECLARED_INLINE_P (method) ! && ! DECL_PURE_VIRTUAL_P (method)) return method; return NULL_TREE; --- 2234,2245 ---- method = TREE_CHAIN (method)) if (DECL_VINDEX (method) != NULL_TREE && ! DECL_DECLARED_INLINE_P (method) ! && (! DECL_PURE_VIRTUAL_P (method) ! #if 0 ! /* This would be nice, but we didn't think of it in time. */ ! || DECL_DESTRUCTOR_P (method) ! #endif ! )) return method; return NULL_TREE; *************** import_export_vtable (decl, type, final) *** 2414,2420 **** else if (CLASSTYPE_INTERFACE_KNOWN (type)) { TREE_PUBLIC (decl) = 1; ! DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type); DECL_INTERFACE_KNOWN (decl) = 1; } else --- 2268,2274 ---- else if (CLASSTYPE_INTERFACE_KNOWN (type)) { TREE_PUBLIC (decl) = 1; ! DECL_EXTERNAL (decl) = CLASSTYPE_INTERFACE_ONLY (type); DECL_INTERFACE_KNOWN (decl) = 1; } else *************** import_export_class (ctype) *** 2466,2478 **** if (CLASSTYPE_INTERFACE_ONLY (ctype)) return; - #ifdef VALID_MACHINE_TYPE_ATTRIBUTE - /* FIXME this should really use some sort of target-independent macro. */ if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype))) import_export = -1; else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype))) import_export = 1; - #endif /* If we got -fno-implicit-templates, we import template classes that weren't explicitly instantiated. */ --- 2320,2329 ---- *************** import_export_class (ctype) *** 2499,2505 **** if (import_export) { SET_CLASSTYPE_INTERFACE_KNOWN (ctype); - CLASSTYPE_VTABLE_NEEDS_WRITING (ctype) = (import_export > 0); CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0); } } --- 2350,2355 ---- *************** output_vtable_inherit (vars) *** 2512,2534 **** tree vars; { tree parent; ! rtx op[2]; ! op[0] = XEXP (DECL_RTL (vars), 0); /* strip the mem ref */ parent = binfo_for_vtable (vars); if (parent == TYPE_BINFO (DECL_CONTEXT (vars))) ! op[1] = const0_rtx; else if (parent) { parent = get_vtbl_decl_for_binfo (TYPE_BINFO (BINFO_TYPE (parent))); ! op[1] = XEXP (DECL_RTL (parent), 0); /* strip the mem ref */ } else ! my_friendly_abort (980826); ! output_asm_insn (".vtable_inherit %c0, %c1", op); } static int --- 2362,2384 ---- tree vars; { tree parent; ! rtx child_rtx, parent_rtx; ! child_rtx = XEXP (DECL_RTL (vars), 0); /* strip the mem ref */ parent = binfo_for_vtable (vars); if (parent == TYPE_BINFO (DECL_CONTEXT (vars))) ! parent_rtx = const0_rtx; else if (parent) { parent = get_vtbl_decl_for_binfo (TYPE_BINFO (BINFO_TYPE (parent))); ! parent_rtx = XEXP (DECL_RTL (parent), 0); /* strip the mem ref */ } else ! abort (); ! assemble_vtable_inherit (child_rtx, parent_rtx); } static int *************** finish_vtable_vardecl (t, data) *** 2584,2590 **** if (flag_weak) comdat_linkage (vars); ! rest_of_decl_compilation (vars, NULL_PTR, 1, 1); if (flag_vtable_gc) output_vtable_inherit (vars); --- 2434,2440 ---- if (flag_weak) comdat_linkage (vars); ! rest_of_decl_compilation (vars, NULL, 1, 1); if (flag_vtable_gc) output_vtable_inherit (vars); *************** import_export_decl (decl) *** 2673,2679 **** else comdat_linkage (decl); } ! else if (DECL_TINFO_FN_P (decl)) { tree ctype = TREE_TYPE (DECL_NAME (decl)); --- 2523,2529 ---- else comdat_linkage (decl); } ! else if (tinfo_decl_p (decl, 0)) { tree ctype = TREE_TYPE (DECL_NAME (decl)); *************** get_guard (decl) *** 2751,2758 **** { tree guard_type; ! /* Under the new ABI, we use a type that is big enough to ! contain a mutex as well as an integer counter. */ guard_type = long_long_integer_type_node; guard = build_decl (VAR_DECL, sname, guard_type); --- 2601,2608 ---- { tree guard_type; ! /* We use a type that is big enough to contain a mutex as well ! as an integer counter. */ guard_type = long_long_integer_type_node; guard = build_decl (VAR_DECL, sname, guard_type); *************** static tree *** 2779,2786 **** get_guard_bits (guard) tree guard; { ! /* Under the new ABI, 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); --- 2629,2636 ---- get_guard_bits (guard) tree guard; { ! /* We only set the first byte of the guard, in order to leave room ! for a mutex in the high-order bits. */ guard = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (guard)), guard); *************** start_objects (method_type, initp) *** 2861,2871 **** NULL_TREE), NULL_TREE, SF_DEFAULT); - #if defined(ASM_OUTPUT_CONSTRUCTOR) && defined(ASM_OUTPUT_DESTRUCTOR) /* It can be a static function as long as collect2 does not have to scan the object file to find its ctor/dtor routine. */ ! TREE_PUBLIC (current_function_decl) = 0; ! #endif /* Mark this declaration as used to avoid spurious warnings. */ TREE_USED (current_function_decl) = 1; --- 2711,2719 ---- NULL_TREE), NULL_TREE, SF_DEFAULT); /* It can be a static function as long as collect2 does not have to scan the object file to find its ctor/dtor routine. */ ! TREE_PUBLIC (current_function_decl) = ! targetm.have_ctors_dtors; /* Mark this declaration as used to avoid spurious warnings. */ TREE_USED (current_function_decl) = 1; *************** finish_objects (method_type, initp, body *** 2897,2903 **** int method_type, initp; tree body; { - const char *fnname; tree fn; /* Finish up. */ --- 2745,2750 ---- *************** finish_objects (method_type, initp, body *** 2911,2941 **** if (flag_syntax_only) return; ! fnname = XSTR (XEXP (DECL_RTL (fn), 0), 0); ! if (initp == DEFAULT_INIT_PRIORITY) { if (method_type == 'I') ! assemble_constructor (fnname); else ! assemble_destructor (fnname); ! } ! #if defined (ASM_OUTPUT_SECTION_NAME) && defined (ASM_OUTPUT_CONSTRUCTOR) ! /* If we're using init priority we can't use assemble_*tor, but on ELF ! targets we can stick the references into named sections for GNU ld ! to collect. */ ! else ! { ! char buf[15]; ! sprintf (buf, ".%ctors.%.5u", method_type == 'I' ? 'c' : 'd', ! /* invert the numbering so the linker puts us in the proper ! order; constructors are run from right to left, and the ! linker sorts in increasing order. */ ! MAX_INIT_PRIORITY - initp); ! named_section (NULL_TREE, buf, 0); ! assemble_integer (gen_rtx_SYMBOL_REF (Pmode, fnname), ! POINTER_SIZE / BITS_PER_UNIT, 1); } - #endif } /* The names of the parameters to the function created to handle --- 2758,2771 ---- if (flag_syntax_only) return; ! if (targetm.have_ctors_dtors) { + rtx fnsym = XEXP (DECL_RTL (fn), 0); if (method_type == 'I') ! (* targetm.asm_out.constructor) (fnsym, initp); else ! (* targetm.asm_out.destructor) (fnsym, initp); } } /* The names of the parameters to the function created to handle *************** start_static_storage_duration_function ( *** 2996,3002 **** /* Overflow occurred. That means there are at least 4 billion initialization functions. */ sorry ("too many initialization functions required"); ! my_friendly_abort (19990430); } /* Create the parameters. */ --- 2826,2832 ---- /* Overflow occurred. That means there are at least 4 billion initialization functions. */ sorry ("too many initialization functions required"); ! abort (); } /* Create the parameters. */ *************** finish_file () *** 3611,3617 **** 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. */ for (i = 0; i < deferred_fns_used; ++i) { tree decl = VARRAY_TREE (deferred_fns, i); --- 3441,3451 ---- 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. ! 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. */ for (i = 0; i < deferred_fns_used; ++i) { tree decl = VARRAY_TREE (deferred_fns, i); *************** finish_file () *** 3620,3625 **** --- 3454,3464 ---- && DECL_INITIAL (decl) && DECL_NEEDED_P (decl)) DECL_EXTERNAL (decl) = 0; + } + + for (i = 0; i < deferred_fns_used; ++i) + { + tree decl = VARRAY_TREE (deferred_fns, i); /* If we're going to need to write this function out, and there's already a body for it, create RTL for it now. *************** finish_file () *** 3628,3634 **** if (!DECL_EXTERNAL (decl) && DECL_NEEDED_P (decl) && DECL_SAVED_TREE (decl) - && !DECL_SAVED_INSNS (decl) && !TREE_ASM_WRITTEN (decl)) { int saved_not_really_extern; --- 3467,3472 ---- *************** finish_file () *** 3723,3733 **** } } - /* If there's some tool that wants to examine the entire translation - unit, let it do so now. */ - if (back_end_hook) - (*back_end_hook) (global_namespace); - timevar_pop (TV_VARCONST); if (flag_detailed_statistics) --- 3561,3566 ---- *************** reparse_absdcl_as_casts (decl, expr) *** 3780,3785 **** --- 3613,3619 ---- tree decl, expr; { tree type; + int non_void_p = 0; if (TREE_CODE (expr) == CONSTRUCTOR && TREE_TYPE (expr) == 0) *************** reparse_absdcl_as_casts (decl, expr) *** 3787,3798 **** type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); decl = TREE_OPERAND (decl, 0); ! expr = digest_init (type, expr, (tree *) 0); ! if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type)) { ! int failure = complete_array_type (type, expr, 1); ! if (failure) ! my_friendly_abort (78); } } --- 3621,3636 ---- type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); decl = TREE_OPERAND (decl, 0); ! if (processing_template_decl) ! TREE_TYPE (expr) = type; ! else { ! expr = digest_init (type, expr, (tree *) 0); ! if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type)) ! { ! int failure = complete_array_type (type, expr, 1); ! my_friendly_assert (!failure, 78); ! } } } *************** reparse_absdcl_as_casts (decl, expr) *** 3800,3810 **** { type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); decl = TREE_OPERAND (decl, 0); expr = build_c_cast (type, expr); } if (warn_old_style_cast && ! in_system_header ! && current_lang_name != lang_name_c) warning ("use of old-style cast"); return expr; --- 3638,3650 ---- { type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl))); decl = TREE_OPERAND (decl, 0); + if (!VOID_TYPE_P (type)) + non_void_p = 1; expr = build_c_cast (type, expr); } if (warn_old_style_cast && ! in_system_header ! && non_void_p && current_lang_name != lang_name_c) warning ("use of old-style cast"); return expr; *************** build_expr_from_tree (t) *** 3933,3940 **** { tree r = build_expr_from_tree (TREE_OPERAND (t, 0)); if (!TYPE_P (r)) ! r = TREE_TYPE (r); ! return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r); } case MODOP_EXPR: --- 3773,3781 ---- { tree r = build_expr_from_tree (TREE_OPERAND (t, 0)); if (!TYPE_P (r)) ! return TREE_CODE (t) == SIZEOF_EXPR ? expr_sizeof (r) : c_alignof_expr (r); ! else ! return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r); } case MODOP_EXPR: *************** build_expr_from_tree (t) *** 3965,3971 **** return build_x_compound_expr (build_expr_from_tree (TREE_OPERAND (t, 0))); else ! my_friendly_abort (42); case METHOD_CALL_EXPR: if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) --- 3806,3812 ---- return build_x_compound_expr (build_expr_from_tree (TREE_OPERAND (t, 0))); else ! abort (); case METHOD_CALL_EXPR: if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) *************** build_expr_from_tree (t) *** 4099,4115 **** case CONSTRUCTOR: { tree r; /* digest_init will do the wrong thing if we let it. */ ! if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) return t; ! r = build_nt (CONSTRUCTOR, NULL_TREE, ! build_expr_from_tree (CONSTRUCTOR_ELTS (t))); TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); ! if (TREE_TYPE (t)) ! return digest_init (TREE_TYPE (t), r, 0); return r; } --- 3940,3974 ---- case CONSTRUCTOR: { tree r; + tree elts; + tree type = TREE_TYPE (t); + bool purpose_p; /* digest_init will do the wrong thing if we let it. */ ! if (type && TYPE_PTRMEMFUNC_P (type)) return t; ! r = NULL_TREE; ! /* We do not want to process the purpose of aggregate ! initializers as they are identifier nodes which will be ! looked up by digest_init. */ ! purpose_p = !(type && IS_AGGR_TYPE (type)); ! for (elts = CONSTRUCTOR_ELTS (t); elts; elts = TREE_CHAIN (elts)) ! { ! tree purpose = TREE_PURPOSE (elts); ! tree value = TREE_VALUE (elts); ! ! if (purpose && purpose_p) ! purpose = build_expr_from_tree (purpose); ! value = build_expr_from_tree (value); ! r = tree_cons (purpose, value, r); ! } ! ! r = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (r)); TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); ! if (type) ! return digest_init (type, r, 0); return r; } *************** tree *** 4156,4163 **** finish_decl_parsing (decl) tree decl; { - extern int current_class_depth; - switch (TREE_CODE (decl)) { case IDENTIFIER_NODE: --- 4015,4020 ---- *************** finish_decl_parsing (decl) *** 4185,4191 **** case TEMPLATE_ID_EXPR: return decl; default: ! my_friendly_abort (5); return NULL_TREE; } } --- 4042,4048 ---- case TEMPLATE_ID_EXPR: return decl; default: ! abort (); return NULL_TREE; } } *************** ambiguous_decl (name, old, new, flags) *** 4339,4344 **** --- 4196,4206 ---- if (LOOKUP_TYPES_ONLY (flags)) val = NULL_TREE; break; + case FUNCTION_DECL: + /* Ignore built-in functions that are still anticipated. */ + if (LOOKUP_QUALIFIERS_ONLY (flags) || DECL_ANTICIPATED (val)) + val = NULL_TREE; + break; default: if (LOOKUP_QUALIFIERS_ONLY (flags)) val = NULL_TREE; *************** ambiguous_decl (name, old, new, flags) *** 4364,4370 **** repeat ourselves. */ if (BINDING_VALUE (old) != error_mark_node) { ! cp_error ("use of `%D' is ambiguous", name); cp_error_at (" first declared as `%#D' here", BINDING_VALUE (old)); } --- 4226,4232 ---- repeat ourselves. */ if (BINDING_VALUE (old) != error_mark_node) { ! error ("use of `%D' is ambiguous", name); cp_error_at (" first declared as `%#D' here", BINDING_VALUE (old)); } *************** ambiguous_decl (name, old, new, flags) *** 4383,4389 **** { if (flags & LOOKUP_COMPLAIN) { ! cp_error ("`%D' denotes an ambiguous type",name); cp_error_at (" first type here", BINDING_TYPE (old)); cp_error_at (" other type here", type); } --- 4245,4251 ---- { if (flags & LOOKUP_COMPLAIN) { ! error ("`%D' denotes an ambiguous type",name); cp_error_at (" first type here", BINDING_TYPE (old)); cp_error_at (" other type here", type); } *************** set_decl_namespace (decl, scope, friendp *** 4476,4489 **** int friendp; { tree old; ! if (scope == fake_std_node) ! scope = global_namespace; /* Get rid of namespace aliases. */ scope = ORIGINAL_NAMESPACE (scope); /* It is ok for friends to be qualified in parallel space. */ if (!friendp && !is_namespace_ancestor (current_namespace, scope)) ! cp_error ("declaration of `%D' not in a namespace surrounding `%D'", decl, scope); DECL_CONTEXT (decl) = FROB_CONTEXT (scope); if (scope != current_namespace) --- 4338,4350 ---- int friendp; { tree old; ! /* Get rid of namespace aliases. */ scope = ORIGINAL_NAMESPACE (scope); /* It is ok for friends to be qualified in parallel space. */ if (!friendp && !is_namespace_ancestor (current_namespace, scope)) ! error ("declaration of `%D' not in a namespace surrounding `%D'", decl, scope); DECL_CONTEXT (decl) = FROB_CONTEXT (scope); if (scope != current_namespace) *************** set_decl_namespace (decl, scope, friendp *** 4517,4523 **** else return; complain: ! cp_error ("`%D' should have been declared inside `%D'", decl, scope); } --- 4378,4384 ---- else return; complain: ! error ("`%D' should have been declared inside `%D'", decl, scope); } *************** add_function (k, fn) *** 4653,4659 **** } cp_error_at ("`%D' is not a function,", f1); cp_error_at (" conflict with `%D'", f2); ! cp_error (" in call to `%D'", k->name); return 1; } --- 4514,4520 ---- } cp_error_at ("`%D' is not a function,", f1); cp_error_at (" conflict with `%D'", f2); ! error (" in call to `%D'", k->name); return 1; } *************** arg_assoc_template_arg (k, arg) *** 4705,4711 **** contribute to the set of associated namespaces. ] */ /* Consider first template template arguments. */ ! if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM) return 0; else if (TREE_CODE (arg) == TEMPLATE_DECL) { --- 4566,4573 ---- contribute to the set of associated namespaces. ] */ /* Consider first template template arguments. */ ! if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM ! || TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE) return 0; else if (TREE_CODE (arg) == TEMPLATE_DECL) { *************** arg_assoc_type (k, type) *** 4833,4839 **** return 0; /* else fall through */ default: ! my_friendly_abort (390); } return 0; } --- 4695,4701 ---- return 0; /* else fall through */ default: ! abort (); } return 0; } *************** do_namespace_alias (alias, namespace) *** 4965,4971 **** if (TREE_CODE (namespace) != NAMESPACE_DECL) { /* The parser did not find it, so it's not there. */ ! cp_error ("unknown namespace `%D'", namespace); return; } --- 4827,4833 ---- if (TREE_CODE (namespace) != NAMESPACE_DECL) { /* The parser did not find it, so it's not there. */ ! error ("unknown namespace `%D'", namespace); return; } *************** validate_nonmember_using_decl (decl, sco *** 4986,5015 **** tree *scope; tree *name; { ! if (TREE_CODE (decl) == SCOPE_REF ! && TREE_OPERAND (decl, 0) == fake_std_node) ! { ! *scope = global_namespace; ! *name = TREE_OPERAND (decl, 1); ! } ! else if (TREE_CODE (decl) == SCOPE_REF) { *scope = TREE_OPERAND (decl, 0); *name = TREE_OPERAND (decl, 1); ! /* [namespace.udecl] ! ! A using-declaration for a class member shall be a ! member-declaration. */ ! if (!processing_template_decl ! && TREE_CODE (*scope) != NAMESPACE_DECL) ! { ! if (TYPE_P (*scope)) ! cp_error ("`%T' is not a namespace", *scope); ! else ! cp_error ("`%D' is not a namespace", *scope); ! return NULL_TREE; ! } } else if (TREE_CODE (decl) == IDENTIFIER_NODE || TREE_CODE (decl) == TYPE_DECL --- 4848,4881 ---- tree *scope; tree *name; { ! if (TREE_CODE (decl) == SCOPE_REF) { *scope = TREE_OPERAND (decl, 0); *name = TREE_OPERAND (decl, 1); ! if (!processing_template_decl) ! { ! /* [namespace.udecl] ! A using-declaration for a class member shall be a ! member-declaration. */ ! if(TREE_CODE (*scope) != NAMESPACE_DECL) ! { ! if (TYPE_P (*scope)) ! error ("`%T' is not a namespace", *scope); ! else ! error ("`%D' is not a namespace", *scope); ! return NULL_TREE; ! } ! ! /* 7.3.3/5 ! A using-declaration shall not name a template-id. */ ! if (TREE_CODE (*name) == TEMPLATE_ID_EXPR) ! { ! *name = TREE_OPERAND (*name, 0); ! error ("a using-declaration cannot specify a template-id. Try `using %D'", *name); ! return NULL_TREE; ! } ! } } else if (TREE_CODE (decl) == IDENTIFIER_NODE || TREE_CODE (decl) == TYPE_DECL *************** validate_nonmember_using_decl (decl, sco *** 5018,5025 **** *scope = global_namespace; *name = decl; } else ! my_friendly_abort (382); if (DECL_P (*name)) *name = DECL_NAME (*name); /* Make a USING_DECL. */ --- 4884,4896 ---- *scope = global_namespace; *name = decl; } + else if (TREE_CODE (decl) == NAMESPACE_DECL) + { + error ("namespace `%D' not allowed in using-declaration", decl); + return NULL_TREE; + } else ! abort (); if (DECL_P (*name)) *name = DECL_NAME (*name); /* Make a USING_DECL. */ *************** do_nonmember_using_decl (scope, name, ol *** 5044,5050 **** if (!BINDING_VALUE (decls) && !BINDING_TYPE (decls)) { ! cp_error ("`%D' not declared", name); return; } --- 4915,4921 ---- if (!BINDING_VALUE (decls) && !BINDING_TYPE (decls)) { ! error ("`%D' not declared", name); return; } *************** do_nonmember_using_decl (scope, name, ol *** 5082,5092 **** else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)), TYPE_ARG_TYPES (TREE_TYPE (old_fn)))) { /* There was already a non-using declaration in this scope with the same parameter types. If both are the same extern "C" functions, that's ok. */ if (!decls_match (new_fn, old_fn)) ! cp_error ("`%D' is already declared in this scope", name); break; } } --- 4953,4972 ---- else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)), TYPE_ARG_TYPES (TREE_TYPE (old_fn)))) { + /* If this using declaration introduces a function + recognized as a built-in, no longer mark it as + anticipated in this scope. */ + if (DECL_ANTICIPATED (old_fn)) + { + DECL_ANTICIPATED (old_fn) = 0; + break; + } + /* There was already a non-using declaration in this scope with the same parameter types. If both are the same extern "C" functions, that's ok. */ if (!decls_match (new_fn, old_fn)) ! error ("`%D' is already declared in this scope", name); break; } } *************** do_nonmember_using_decl (scope, name, ol *** 5113,5119 **** *newtype = BINDING_TYPE (decls); if (oldtype && *newtype && oldtype != *newtype) { ! cp_error ("using directive `%D' introduced ambiguous type `%T'", name, oldtype); return; } --- 4993,4999 ---- *newtype = BINDING_TYPE (decls); if (oldtype && *newtype && oldtype != *newtype) { ! error ("using declaration `%D' introduced ambiguous type `%T'", name, oldtype); return; } *************** do_class_using_decl (decl) *** 5204,5219 **** if (TREE_CODE (decl) != SCOPE_REF || !TYPE_P (TREE_OPERAND (decl, 0))) { ! cp_error ("using-declaration for non-member at class scope"); return NULL_TREE; } name = TREE_OPERAND (decl, 1); if (TREE_CODE (name) == BIT_NOT_EXPR) { ! cp_error ("using-declaration for destructor"); return NULL_TREE; } ! if (TREE_CODE (name) == TYPE_DECL) name = DECL_NAME (name); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716); --- 5084,5105 ---- if (TREE_CODE (decl) != SCOPE_REF || !TYPE_P (TREE_OPERAND (decl, 0))) { ! error ("using-declaration for non-member at class scope"); return NULL_TREE; } name = TREE_OPERAND (decl, 1); if (TREE_CODE (name) == BIT_NOT_EXPR) { ! error ("using-declaration for destructor"); return NULL_TREE; } ! else if (TREE_CODE (name) == TEMPLATE_ID_EXPR) ! { ! name = TREE_OPERAND (name, 0); ! error ("a using-declaration cannot specify a template-id. Try `using %T::%D'", TREE_OPERAND (decl, 0), name); ! return NULL_TREE; ! } ! if (TREE_CODE (name) == TYPE_DECL || TREE_CODE (name) == TEMPLATE_DECL) name = DECL_NAME (name); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716); *************** void *** 5229,5236 **** do_using_directive (namespace) tree namespace; { - if (namespace == fake_std_node) - return; if (building_stmt_tree ()) add_stmt (build_stmt (USING_STMT, namespace)); --- 5115,5120 ---- *************** do_using_directive (namespace) *** 5241,5253 **** { /* Lookup in lexer did not find a namespace. */ if (!processing_template_decl) ! cp_error ("namespace `%T' undeclared", namespace); return; } if (TREE_CODE (namespace) != NAMESPACE_DECL) { if (!processing_template_decl) ! cp_error ("`%T' is not a namespace", namespace); return; } namespace = ORIGINAL_NAMESPACE (namespace); --- 5125,5137 ---- { /* Lookup in lexer did not find a namespace. */ if (!processing_template_decl) ! error ("namespace `%T' undeclared", namespace); return; } if (TREE_CODE (namespace) != NAMESPACE_DECL) { if (!processing_template_decl) ! error ("`%T' is not a namespace", namespace); return; } namespace = ORIGINAL_NAMESPACE (namespace); *************** mark_used (decl) *** 5311,5382 **** instantiate_decl (decl, /*defer_ok=*/1); } ! /* Helper function for named_class_head_sans_basetype nonterminal. We ! have just seen something of the form `AGGR SCOPE::ID'. Return a ! TYPE_DECL for the type declared by ID in SCOPE. */ tree ! handle_class_head (aggr, scope, id) tree aggr, scope, id; { tree decl = NULL_TREE; ! ! if (TREE_CODE (id) == TYPE_DECL) ! /* We must bash typedefs back to the main decl of the type. Otherwise ! we become confused about scopes. */ ! decl = TYPE_MAIN_DECL (TREE_TYPE (id)); ! else if (DECL_CLASS_TEMPLATE_P (id)) ! decl = DECL_TEMPLATE_RESULT (id); ! else ! { ! tree current = current_scope (); ! if (current == NULL_TREE) ! current = current_namespace; ! if (scope == fake_std_node) ! scope = global_namespace; ! if (scope == NULL_TREE) ! scope = global_namespace; ! if (TYPE_P (scope)) { ! /* According to the suggested resolution of core issue 180, ! 'typename' is assumed after a class-key. */ ! decl = make_typename_type (scope, id, 1); ! if (decl != error_mark_node) ! decl = TYPE_MAIN_DECL (decl); else ! decl = NULL_TREE; } - else if (scope == current) - { - /* We've been given AGGR SCOPE::ID, when we're already inside SCOPE. - Be nice about it. */ - if (pedantic) - cp_pedwarn ("extra qualification `%T::' on member `%D' ignored", - FROB_CONTEXT (scope), id); - } - else if (scope != global_namespace) - cp_error ("`%T' does not have a nested type named `%D'", scope, id); - else - cp_error ("no file-scope type named `%D'", id); - - /* Inject it at the current scope. */ - if (! decl) - decl = TYPE_MAIN_DECL (xref_tag (aggr, id, 1)); } ! ! /* Enter the SCOPE. If this turns out not to be a definition, the ! parser must leave the scope. */ ! push_scope (CP_DECL_CONTEXT (decl)); ! /* If we see something like: ! template struct S::I .... ! ! we must create a TEMPLATE_DECL for the nested type. */ ! if (PROCESSING_REAL_TEMPLATE_DECL_P ()) ! decl = push_template_decl (decl); return decl; } --- 5195,5292 ---- instantiate_decl (decl, /*defer_ok=*/1); } ! /* Helper function for class_head_decl and class_head_defn ! nonterminals. AGGR is the class, union or struct tag. SCOPE is the ! explicit scope used (NULL for no scope resolution). ID is the ! name. DEFN_P is true, if this is a definition of the class and ! NEW_TYPE_P is set to non-zero, if we push into the scope containing ! the to be defined aggregate. ! ! Return a TYPE_DECL for the type declared by ID in SCOPE. */ tree ! handle_class_head (aggr, scope, id, defn_p, new_type_p) tree aggr, scope, id; + int defn_p; + int *new_type_p; { tree decl = NULL_TREE; ! tree current = current_scope (); ! bool xrefd_p = false; ! if (current == NULL_TREE) ! current = current_namespace; ! *new_type_p = 0; ! ! if (scope) ! { ! if (TREE_CODE (id) == TYPE_DECL) ! /* We must bash typedefs back to the main decl of the ! type. Otherwise we become confused about scopes. */ ! decl = TYPE_MAIN_DECL (TREE_TYPE (id)); ! else if (DECL_CLASS_TEMPLATE_P (id)) ! decl = DECL_TEMPLATE_RESULT (id); ! else { ! if (TYPE_P (scope)) ! { ! /* According to the suggested resolution of core issue ! 180, 'typename' is assumed after a class-key. */ ! decl = make_typename_type (scope, id, tf_error); ! if (decl != error_mark_node) ! decl = TYPE_MAIN_DECL (decl); ! else ! decl = NULL_TREE; ! } ! else if (scope == current) ! { ! /* We've been given AGGR SCOPE::ID, when we're already ! inside SCOPE. Be nice about it. */ ! if (pedantic) ! pedwarn ("extra qualification `%T::' on member `%D' ignored", ! scope, id); ! } else ! error ("`%T' does not have a class or union named `%D'", ! scope, id); } } ! ! if (!decl) ! { ! decl = TYPE_MAIN_DECL (xref_tag (aggr, id, !defn_p)); ! xrefd_p = true; ! } ! if (!TYPE_BINFO (TREE_TYPE (decl))) ! { ! error ("`%T' is not a class or union type", decl); ! return error_mark_node; ! } ! ! if (defn_p) ! { ! /* For a definition, we want to enter the containing scope ! before looking up any base classes etc. Only do so, if this ! is different to the current scope. */ ! tree context = CP_DECL_CONTEXT (decl); ! *new_type_p = (current != context ! && TREE_CODE (context) != TEMPLATE_TYPE_PARM ! && TREE_CODE (context) != BOUND_TEMPLATE_TEMPLATE_PARM); ! if (*new_type_p) ! push_scope (context); ! ! if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE) ! /* It is legal to define a class with a different class key, ! and this changes the default member access. */ ! CLASSTYPE_DECLARED_CLASS (TREE_TYPE (decl)) ! = aggr == class_type_node; ! ! if (!xrefd_p && PROCESSING_REAL_TEMPLATE_DECL_P ()) ! decl = push_template_decl (decl); ! } return decl; } *************** handle_class_head (aggr, scope, id) *** 5386,5397 **** void init_decl2 () { - ggc_add_tree_root (&decl_namespace_list, 1); ggc_add_tree_varray_root (&deferred_fns, 1); ggc_add_tree_varray_root (&pending_statics, 1); ggc_add_tree_varray_root (&ssdf_decls, 1); ggc_add_tree_root (&ssdf_decl, 1); ggc_add_tree_root (&priority_decl, 1); ggc_add_tree_root (&initialize_p_decl, 1); - ggc_add_tree_root (&pending_vtables, 1); } --- 5296,5305 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/dump.c gcc-3.1/gcc/cp/dump.c *** gcc-3.0.4/gcc/cp/dump.c Tue Jun 5 07:47:05 2001 --- gcc-3.1/gcc/cp/dump.c Sat Mar 16 01:08:03 2002 *************** *** 1,5 **** /* Tree-dumping functionality for intermediate representation. ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. Written by Mark Mitchell This file is part of GNU CC. --- 1,5 ---- /* Tree-dumping functionality for intermediate representation. ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Written by Mark Mitchell This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 23,33 **** #include "system.h" #include "tree.h" #include "cp-tree.h" ! #include "c-dump.h" static void dump_access PARAMS ((dump_info_p, tree)); /* Dump a representation of the accessibility information associated with T. */ --- 23,36 ---- #include "system.h" #include "tree.h" #include "cp-tree.h" ! #include "tree-dump.h" static void dump_access PARAMS ((dump_info_p, tree)); + static void dump_op + PARAMS ((dump_info_p, tree)); + /* Dump a representation of the accessibility information associated with T. */ *************** dump_access (di, t) *** 44,55 **** dump_string (di, "public"); } ! int ! cp_dump_tree (di, t) dump_info_p di; tree t; { enum tree_code code; /* Figure out what kind of node this is. */ code = TREE_CODE (t); --- 47,219 ---- dump_string (di, "public"); } ! /* Dump a representation of the specific operator for an overloaded ! operator associated with node t. ! */ ! ! static void ! dump_op (di, t) dump_info_p di; tree t; { + switch (DECL_OVERLOADED_OPERATOR_P (t)) { + case NEW_EXPR: + 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 CONVERT_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; + } + } + + int + cp_dump_tree (dump_info, t) + void *dump_info; + tree t; + { enum tree_code code; + dump_info_p di = (dump_info_p) dump_info; /* Figure out what kind of node this is. */ code = TREE_CODE (t); *************** cp_dump_tree (di, t) *** 101,106 **** --- 265,272 ---- } dump_child ("vfld", TYPE_VFIELD (t)); + if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t)) + dump_string(di, "spec"); if (!dump_flag (di, TDF_SLIM, t)) { *************** cp_dump_tree (di, t) *** 119,140 **** case FIELD_DECL: dump_access (di, t); break; case FUNCTION_DECL: if (!DECL_THUNK_P (t)) { if (DECL_FUNCTION_MEMBER_P (t)) { dump_string (di, "member"); dump_access (di, t); } if (DECL_CONSTRUCTOR_P (t)) dump_string (di, "constructor"); if (DECL_DESTRUCTOR_P (t)) dump_string (di, "destructor"); - if (DECL_OVERLOADED_OPERATOR_P (t)) - dump_string (di, "operator"); if (DECL_CONV_FN_P (t)) dump_string (di, "conversion"); if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) --- 285,321 ---- case FIELD_DECL: dump_access (di, t); + if (DECL_MUTABLE_P (t)) + dump_string(di, "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 (di, "static"); + break; + case FUNCTION_DECL: if (!DECL_THUNK_P (t)) { + if (DECL_OVERLOADED_OPERATOR_P (t)) { + dump_string (di, "operator"); + dump_op (di, t); + } if (DECL_FUNCTION_MEMBER_P (t)) { dump_string (di, "member"); dump_access (di, t); } + if (DECL_PURE_VIRTUAL_P (t)) + dump_string (di, "pure"); + if (DECL_VIRTUAL_P (t)) + dump_string (di, "virtual"); if (DECL_CONSTRUCTOR_P (t)) dump_string (di, "constructor"); if (DECL_DESTRUCTOR_P (t)) dump_string (di, "destructor"); if (DECL_CONV_FN_P (t)) dump_string (di, "conversion"); if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) *************** cp_dump_tree (di, t) *** 158,167 **** break; case NAMESPACE_DECL: - /* The fake `::std' namespace does not have DECL_LANG_SPECIFIC, - and therefore many other macros do not work on it. */ - if (t == fake_std_node) - break; if (DECL_NAMESPACE_ALIAS (t)) dump_child ("alis", DECL_NAMESPACE_ALIAS (t)); else if (!dump_flag (di, TDF_SLIM, t)) --- 339,344 ---- *************** cp_dump_tree (di, t) *** 213,225 **** dump_child ("decl", TREE_OPERAND (t, 2)); break; - case CLEANUP_STMT: - dump_stmt (di, t); - dump_child ("decl", CLEANUP_DECL (t)); - dump_child ("expr", CLEANUP_EXPR (t)); - dump_next_stmt (di, t); - break; - case CTOR_STMT: dump_stmt (di, t); if (CTOR_BEGIN_P (t)) --- 390,395 ---- *************** cp_dump_tree (di, t) *** 231,236 **** --- 401,407 ---- case HANDLER: dump_stmt (di, t); + dump_child ("parm", HANDLER_PARMS (t)); dump_child ("body", HANDLER_BODY (t)); dump_next_stmt (di, t); break; *************** cp_dump_tree (di, t) *** 247,258 **** dump_next_stmt (di, t); break; - case START_CATCH_STMT: - dump_stmt (di, t); - queue_and_dump_type (di, t); - dump_next_stmt (di, t); - break; - case USING_STMT: dump_stmt (di, t); dump_child ("nmsp", USING_STMT_NAMESPACE (t)); --- 418,423 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/errfn.c gcc-3.1/gcc/cp/errfn.c *** gcc-3.0.4/gcc/cp/errfn.c Wed Feb 14 10:12:54 2001 --- gcc-3.1/gcc/cp/errfn.c Thu Jan 1 00:00:00 1970 *************** *** 1,344 **** - /* Provide a call-back mechanism for handling error output. - Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 - Free Software Foundation, Inc. - Contributed by Jason Merrill (jason@cygnus.com) - - This file is part of GNU CC. - - GNU CC is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU CC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU CC; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - - #include "config.h" - #include "system.h" - #include "tree.h" - #include "cp-tree.h" - #include "toplev.h" - - /* Whether or not we should try to be quiet for errors and warnings; this is - used to avoid being too talkative about problems with tentative choices - when we're computing the conversion costs for a method call. */ - int cp_silent = 0; - - typedef void errorfn (); /* deliberately vague */ - - static void cp_thing PARAMS ((errorfn *, int, const char *, va_list)); - - #define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap) - - /* This function supports only `%s', `%d', `%%', and the C++ print - codes. */ - - static void - cp_thing (errfn, atarg1, format, ap) - errorfn *errfn; - int atarg1; - const char *format; - va_list ap; - { - static char *buf; - static long buflen; - int nargs = 0; - long len; - long offset; - const char *f; - tree atarg = 0; - - len = strlen (format) + 1; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, buflen); - } - offset = 0; - - for (f = format; *f; ++f) - { - cp_printer * function; - int alternate; - int maybe_here; - - /* ignore text */ - if (*f != '%') - { - buf[offset++] = *f; - continue; - } - - ++f; - - alternate = 0; - maybe_here = 0; - - /* Check for '+' and '#' (in that order). */ - if (*f == '+') - { - maybe_here = 1; - ++f; - } - if (*f == '#') - { - alternate = 1; - ++f; - } - - /* no field width or precision */ - - function = cp_printers[(int)*f]; - - if (function || *f == 's') - { - const char *p; - int plen; - - if (*f == 's') - { - p = va_arg (ap, char *); - nargs++; - } - else - { - tree t = va_arg (ap, tree); - nargs++; - - /* This indicates that ATARG comes from a different - location than normal. */ - if (maybe_here && atarg1) - atarg = t; - - /* If atarg1 is set and this is the first argument, then - set ATARG appropriately. */ - if (atarg1 && nargs == 1) - atarg = t; - - p = (*function) (t, alternate); - } - - plen = strlen (p); - len += plen; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - strcpy (buf + offset, p); - offset += plen; - } - else if (*f == '%') - { - /* A `%%' has occurred in the input string. Replace it with - a `%' in the formatted message buf. */ - - if (++len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - buf[offset++] = '%'; - } - else - { - if (*f != 'd') - abort (); - len += HOST_BITS_PER_INT / 2; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - sprintf (buf + offset, "%d", va_arg (ap, int)); - nargs++; - offset += strlen (buf + offset); - /* With an ANSI C library one could write - out += sprintf (...); */ - } - } - buf[offset] = '\0'; - - /* If ATARG1 is set, but we haven't extracted any arguments, then - extract one tree argument for ATARG. */ - if (nargs == 0 && atarg1) - atarg = va_arg (ap, tree); - - if (atarg) - { - const char *file = cp_file_of (atarg); - int line = cp_line_of (atarg); - (*errfn) (file, line, "%s", buf); - } - else - (*errfn) ("%s", buf); - - } - - void - cp_error VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) error, 0, format, ap); - va_end (ap); - } - - void - cp_warning VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) warning, 0, format, ap); - va_end (ap); - } - - void - cp_pedwarn VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn, 0, format, ap); - va_end (ap); - } - - void - cp_compiler_error VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) compiler_error, 0, format, ap); - va_end (ap); - } - - void - cp_deprecated (msg) - const char *msg; - { - extern int warn_deprecated; - if (!warn_deprecated) - return; - cp_warning ("%s is deprecated, please see the documentation for details", msg); - } - - void - cp_sprintf VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - cp_thing ((errorfn *) sprintf, 0, format, ap); - va_end (ap); - } - - void - cp_error_at VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) error_with_file_and_line, 1, format, ap); - va_end (ap); - } - - void - cp_warning_at VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) warning_with_file_and_line, 1, format, ap); - va_end (ap); - } - - void - cp_pedwarn_at VPARAMS ((const char *format, ...)) - { - #ifndef ANSI_PROTOTYPES - char *format; - #endif - va_list ap; - - VA_START (ap, format); - - #ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); - #endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn_with_file_and_line, 1, format, ap); - va_end (ap); - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/error.c gcc-3.1/gcc/cp/error.c *** gcc-3.0.4/gcc/cp/error.c Sat Sep 15 19:43:41 2001 --- gcc-3.1/gcc/cp/error.c Wed May 1 16:29:27 2002 *************** *** 1,6 **** /* Call-backs for C++ error reporting. This code is non-reentrant. ! Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,6 ---- /* Call-backs for C++ error reporting. This code is non-reentrant. ! Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 26,70 **** #include "real.h" #include "obstack.h" #include "toplev.h" #include "diagnostic.h" enum pad { none, before, after }; - /* This data structure bundles altogether, all the information necessary - for pretty-printing a C++ source-level entity represented by a tree. */ - typedef struct - { - tree decl; - int flags; - enum pad pad; - } tree_formatting_info, *tfi_t; - - #define tree_being_formatted(TFI) (TFI)->decl - #define tree_formatting_flags(TFI) (TFI)->flags - #define put_whitespace(TFI) (TFI)->pad - #define sorry_for_unsupported_tree(T) \ sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \ __FUNCTION__) ! #define print_scope_operator(BUFFER) output_add_string (BUFFER, "::") ! #define print_left_paren(BUFFER) output_add_character (BUFFER, '(') ! #define print_right_paren(BUFFER) output_add_character (BUFFER, ')') ! #define print_left_bracket(BUFFER) output_add_character (BUFFER, '[') ! #define print_right_bracket(BUFFER) output_add_character (BUFFER, ']') #define print_template_argument_list_start(BUFFER) \ ! print_non_consecutive_character (BUFFER, '<') #define print_template_argument_list_end(BUFFER) \ ! print_non_consecutive_character (BUFFER, '>') #define print_whitespace(BUFFER, TFI) \ do { \ output_add_space (BUFFER); \ put_whitespace (TFI) = none; \ } while (0) #define print_tree_identifier(BUFFER, TID) \ ! output_add_string (BUFFER, IDENTIFIER_POINTER (TID)) ! #define print_identifier(BUFFER, ID) output_add_string (BUFFER, ID) ! #define separate_with_comma(BUFFER) output_add_string (BUFFER, ", ") /* The global buffer where we dump everything. It is there only for transitional purpose. It is expected, in the near future, to be --- 26,58 ---- #include "real.h" #include "obstack.h" #include "toplev.h" + #include "flags.h" #include "diagnostic.h" enum pad { none, before, after }; #define sorry_for_unsupported_tree(T) \ sorry ("`%s' not supported by %s", tree_code_name[(int) TREE_CODE (T)], \ __FUNCTION__) ! #define print_scope_operator(BUFFER) output_add_string ((BUFFER), "::") ! #define print_left_paren(BUFFER) output_add_character ((BUFFER), '(') ! #define print_right_paren(BUFFER) output_add_character ((BUFFER), ')') ! #define print_left_bracket(BUFFER) output_add_character ((BUFFER), '[') ! #define print_right_bracket(BUFFER) output_add_character ((BUFFER), ']') #define print_template_argument_list_start(BUFFER) \ ! print_non_consecutive_character ((BUFFER), '<') #define print_template_argument_list_end(BUFFER) \ ! print_non_consecutive_character ((BUFFER), '>') #define print_whitespace(BUFFER, TFI) \ do { \ output_add_space (BUFFER); \ put_whitespace (TFI) = none; \ } while (0) #define print_tree_identifier(BUFFER, TID) \ ! output_add_string ((BUFFER), IDENTIFIER_POINTER (TID)) ! #define print_identifier(BUFFER, ID) output_add_string ((BUFFER), (ID)) ! #define separate_with_comma(BUFFER) output_add_string ((BUFFER), ", ") /* The global buffer where we dump everything. It is there only for transitional purpose. It is expected, in the near future, to be *************** typedef struct *** 72,78 **** static output_buffer scratch_buffer_rec; static output_buffer *scratch_buffer = &scratch_buffer_rec; ! # define NEXT_CODE(t) (TREE_CODE (TREE_TYPE (t))) #define reinit_global_formatting_buffer() \ output_clear_message_text (scratch_buffer) --- 60,66 ---- static output_buffer scratch_buffer_rec; static output_buffer *scratch_buffer = &scratch_buffer_rec; ! # define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T))) #define reinit_global_formatting_buffer() \ output_clear_message_text (scratch_buffer) *************** static void dump_char PARAMS ((int)); *** 108,114 **** static void dump_parameters PARAMS ((tree, int)); static void dump_exception_spec PARAMS ((tree, int)); static const char *class_key_or_enum PARAMS ((tree)); - static tree ident_fndecl PARAMS ((tree)); static void dump_template_argument PARAMS ((tree, int)); static void dump_template_argument_list PARAMS ((tree, int)); static void dump_template_parameter PARAMS ((tree, int)); --- 96,101 ---- *************** static void dump_scope PARAMS ((tree, in *** 117,123 **** static void dump_template_parms PARAMS ((tree, int, int)); static const char *function_category PARAMS ((tree)); ! static void lang_print_error_function PARAMS ((const char *)); static void maybe_print_instantiation_context PARAMS ((output_buffer *)); static void print_instantiation_full_context PARAMS ((output_buffer *)); static void print_instantiation_partial_context PARAMS ((output_buffer *, tree, --- 104,111 ---- static void dump_template_parms PARAMS ((tree, int, int)); static const char *function_category PARAMS ((tree)); ! static void lang_print_error_function PARAMS ((diagnostic_context *, ! const char *)); static void maybe_print_instantiation_context PARAMS ((output_buffer *)); static void print_instantiation_full_context PARAMS ((output_buffer *)); static void print_instantiation_partial_context PARAMS ((output_buffer *, tree, *************** static void cp_diagnostic_finalizer PARA *** 129,203 **** static void cp_print_error_function PARAMS ((output_buffer *, diagnostic_context *)); ! static int cp_tree_printer PARAMS ((output_buffer *)); ! static void print_function_argument_list PARAMS ((output_buffer *, tfi_t)); ! static void print_declaration PARAMS ((output_buffer *, tfi_t)); ! static void print_expression PARAMS ((output_buffer *, tfi_t)); ! static void print_integer PARAMS ((output_buffer *, HOST_WIDE_INT)); ! static void print_function_declaration PARAMS ((output_buffer *, tfi_t)); ! static void print_function_parameter PARAMS ((output_buffer *, int)); ! static void print_type_id PARAMS ((output_buffer *, tfi_t)); ! static void print_cv_qualifier_seq PARAMS ((output_buffer *, tfi_t)); ! static void print_type_specifier_seq PARAMS ((output_buffer *, tfi_t)); ! static void print_simple_type_specifier PARAMS ((output_buffer *, tfi_t)); ! static void print_elaborated_type_specifier PARAMS ((output_buffer *, tfi_t)); ! static void print_rest_of_abstract_declarator PARAMS ((output_buffer *, ! tfi_t)); ! static void print_parameter_declaration_clause PARAMS ((output_buffer *, ! tfi_t)); ! static void print_exception_specification PARAMS ((output_buffer *, tfi_t)); ! static void print_nested_name_specifier PARAMS ((output_buffer *, tfi_t)); ! static void print_template_id PARAMS ((output_buffer *, tfi_t)); ! static tree typedef_original_name PARAMS ((tree)); static void print_non_consecutive_character PARAMS ((output_buffer *, int)); ! ! #define A args_to_string ! #define C code_to_string ! #define D decl_to_string ! #define E expr_to_string ! #define F fndecl_to_string ! #define L language_to_string ! #define O op_to_string ! #define P parm_to_string ! #define Q assop_to_string ! #define T type_to_string ! #define V cv_to_string ! ! #define o (cp_printer *) 0 ! cp_printer * cp_printers[256] = ! { ! /*0 1 2 3 4 5 6 7 8 9 A B C D E F */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x00 */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x10 */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x20 */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x30 */ ! o, A, o, C, D, E, F, o, o, o, o, o, L, o, o, O, /* 0x40 */ ! P, Q, o, o, T, o, V, o, o, o, o, o, o, o, o, o, /* 0x50 */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x60 */ ! o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x70 */ ! }; ! #undef C ! #undef D ! #undef E ! #undef F ! #undef L ! #undef O ! #undef P ! #undef Q ! #undef T ! #undef V ! #undef o void init_error () { - init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0); - print_error_function = lang_print_error_function; ! lang_diagnostic_starter = cp_diagnostic_starter; ! lang_diagnostic_finalizer = cp_diagnostic_finalizer; ! lang_printer = cp_tree_printer; } /* Dump a scope, if deemed necessary. */ --- 117,136 ---- static void cp_print_error_function PARAMS ((output_buffer *, diagnostic_context *)); ! static int cp_printer PARAMS ((output_buffer *)); static void print_non_consecutive_character PARAMS ((output_buffer *, int)); ! static void print_integer PARAMS ((output_buffer *, HOST_WIDE_INT)); ! static tree locate_error PARAMS ((const char *, va_list)); void init_error () { print_error_function = lang_print_error_function; ! diagnostic_starter (global_dc) = cp_diagnostic_starter; ! diagnostic_finalizer (global_dc) = cp_diagnostic_finalizer; ! diagnostic_format_decoder (global_dc) = cp_printer; ! init_output_buffer (scratch_buffer, /* prefix */NULL, /* line-width */0); } /* Dump a scope, if deemed necessary. */ *************** dump_scope (scope, flags) *** 207,214 **** tree scope; int flags; { ! int f = ~TFF_RETURN_TYPE & (TFF_DECL_SPECIFIERS ! | (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF))); if (scope == NULL_TREE) return; --- 140,146 ---- tree scope; int flags; { ! int f = ~TFF_RETURN_TYPE & (flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF)); if (scope == NULL_TREE) return; *************** dump_type (t, flags) *** 450,456 **** case VECTOR_TYPE: output_add_string (scratch_buffer, "vector "); ! dump_type (TREE_TYPE (t), flags); break; case INTEGER_TYPE: --- 382,395 ---- case VECTOR_TYPE: output_add_string (scratch_buffer, "vector "); ! { ! /* The subtype of a VECTOR_TYPE is something like intQI_type_node, ! which has no name and is not very useful for diagnostics. So ! look up the equivalent C type and print its name. */ ! tree elt = TREE_TYPE (t); ! elt = type_for_mode (TYPE_MODE (elt), TREE_UNSIGNED (elt)); ! dump_type (elt, flags); ! } break; case INTEGER_TYPE: *************** dump_type (t, flags) *** 520,529 **** break; } case TYPENAME_TYPE: ! output_add_string (scratch_buffer, "typename "); dump_typename (t, flags); break; case TYPEOF_TYPE: output_add_string (scratch_buffer, "__typeof ("); dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS); --- 459,476 ---- break; } case TYPENAME_TYPE: ! if (IMPLICIT_TYPENAME_P (t)) ! output_add_string (scratch_buffer, "typename "); dump_typename (t, flags); break; + case UNBOUND_CLASS_TEMPLATE: + dump_type (TYPE_CONTEXT (t), flags); + print_scope_operator (scratch_buffer); + print_identifier (scratch_buffer, "template "); + dump_type (DECL_NAME (TYPE_NAME (t)), flags); + break; + case TYPEOF_TYPE: output_add_string (scratch_buffer, "__typeof ("); dump_expr (TYPE_FIELDS (t), flags & ~TFF_EXPR_IN_PARENS); *************** dump_type_suffix (t, flags) *** 797,804 **** if (TREE_CODE (t) == METHOD_TYPE) dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before); - dump_type_suffix (TREE_TYPE (t), flags); dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags); break; } --- 744,751 ---- if (TREE_CODE (t) == METHOD_TYPE) dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before); dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags); + dump_type_suffix (TREE_TYPE (t), flags); break; } *************** dump_type_suffix (t, flags) *** 852,881 **** } } - /* Return a function declaration which corresponds to the IDENTIFIER_NODE - argument. */ - - static tree - ident_fndecl (t) - tree t; - { - tree n = lookup_name (t, 0); - - if (n == NULL_TREE) - return NULL_TREE; - - if (TREE_CODE (n) == FUNCTION_DECL) - return n; - else if (TREE_CODE (n) == TREE_LIST - && TREE_CODE (TREE_VALUE (n)) == FUNCTION_DECL) - return TREE_VALUE (n); - - my_friendly_abort (66); - return NULL_TREE; - } - - #define GLOBAL_THING "_GLOBAL__" - static void dump_global_iord (t) tree t; --- 799,804 ---- *************** dump_global_iord (t) *** 887,893 **** else if (DECL_GLOBAL_DTOR_P (t)) p = "destructors"; else ! my_friendly_abort (352); output_printf (scratch_buffer, "(static %s for %s)", p, input_filename); } --- 810,816 ---- else if (DECL_GLOBAL_DTOR_P (t)) p = "destructors"; else ! abort (); output_printf (scratch_buffer, "(static %s for %s)", p, input_filename); } *************** dump_decl (t, flags) *** 950,962 **** if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) { output_add_string (scratch_buffer, "vtable for "); ! if (TYPE_P (DECL_CONTEXT (t))) ! dump_type (DECL_CONTEXT (t), flags); ! else ! /* This case can arise with -fno-vtable-thunks. See ! expand_upcast_fixups. It's not clear what to print ! here. */ ! print_identifier (scratch_buffer, ""); break; } /* else fall through */ --- 873,880 ---- if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) { output_add_string (scratch_buffer, "vtable for "); ! my_friendly_assert (TYPE_P (DECL_CONTEXT (t)), 20010720); ! dump_type (DECL_CONTEXT (t), flags); break; } /* else fall through */ *************** dump_decl (t, flags) *** 999,1028 **** break; case TYPE_EXPR: ! my_friendly_abort (69); break; /* These special cases are duplicated here so that other functions ! can feed identifiers to cp_error and get them demangled properly. */ case IDENTIFIER_NODE: ! { tree f; ! if (DESTRUCTOR_NAME_P (t) ! && (f = ident_fndecl (t)) ! && DECL_LANGUAGE (f) == lang_cplusplus) ! { ! output_add_character (scratch_buffer, '~'); ! dump_decl (DECL_NAME (f), flags); ! } ! else if (IDENTIFIER_TYPENAME_P (t)) ! { ! output_add_string (scratch_buffer, "operator "); ! /* Not exactly IDENTIFIER_TYPE_VALUE. */ ! dump_type (TREE_TYPE (t), flags); ! break; ! } ! else ! print_tree_identifier (scratch_buffer, t); ! } break; case OVERLOAD: --- 917,937 ---- break; case TYPE_EXPR: ! abort (); 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)) ! { ! output_add_string (scratch_buffer, "operator "); ! /* Not exactly IDENTIFIER_TYPE_VALUE. */ ! dump_type (TREE_TYPE (t), flags); ! break; ! } ! else ! print_tree_identifier (scratch_buffer, t); break; case OVERLOAD: *************** dump_decl (t, flags) *** 1039,1045 **** break; case TEMPLATE_DECL: ! dump_template_decl (t, flags); break; case TEMPLATE_ID_EXPR: --- 948,954 ---- break; case TEMPLATE_DECL: ! dump_template_decl (t, flags); break; case TEMPLATE_ID_EXPR: *************** dump_template_decl (t, flags) *** 1120,1125 **** --- 1029,1039 ---- int len = TREE_VEC_LENGTH (inner_parms); output_add_string (scratch_buffer, "template<"); + + /* If we've shown the template prefix, we'd better show the + parameters' and decl's type too. */ + flags |= TFF_DECL_SPECIFIERS; + for (i = 0; i < len; i++) { if (i) *************** dump_template_decl (t, flags) *** 1130,1139 **** output_add_space (scratch_buffer); } nreverse(orig_parms); ! /* If we've shown the template prefix, we'd better show the ! decl's type too. */ ! flags |= TFF_DECL_SPECIFIERS; } if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) dump_type (TREE_TYPE (t), ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME --- 1044,1055 ---- output_add_space (scratch_buffer); } nreverse(orig_parms); ! ! if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) ! /* Say `template class TT' not just `template TT'. */ ! output_add_string (scratch_buffer, "class "); } + if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) dump_type (TREE_TYPE (t), ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME *************** dump_template_decl (t, flags) *** 1141,1147 **** else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL) dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME); else if (TREE_TYPE (t) == NULL_TREE) ! my_friendly_abort (353); else switch (NEXT_CODE (t)) { --- 1057,1063 ---- else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL) dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME); else if (TREE_TYPE (t) == NULL_TREE) ! abort (); else switch (NEXT_CODE (t)) { *************** dump_template_decl (t, flags) *** 1159,1165 **** /* 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 cp_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 --- 1075,1081 ---- /* 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 (t, flags) *** 1228,1246 **** dump_function_name (t, flags); ! if (flags & TFF_DECL_SPECIFIERS) { dump_parameters (parmtypes, flags); - if (show_return) - dump_type_suffix (TREE_TYPE (fntype), flags); - if (TREE_CODE (fntype) == METHOD_TYPE) dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))), before); if (flags & TFF_EXCEPTION_SPECIFICATION) dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags); } /* If T is a template instantiation, dump the parameter binding. */ --- 1144,1162 ---- dump_function_name (t, flags); ! if (1) { dump_parameters (parmtypes, flags); if (TREE_CODE (fntype) == METHOD_TYPE) dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))), before); if (flags & TFF_EXCEPTION_SPECIFICATION) dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags); + + if (show_return) + dump_type_suffix (TREE_TYPE (fntype), flags); } /* If T is a template instantiation, dump the parameter binding. */ *************** dump_expr (t, flags) *** 1819,1825 **** break; case CONVERT_EXPR: ! if (VOID_TYPE_P (TREE_TYPE (t))) { print_left_paren (scratch_buffer); dump_type (TREE_TYPE (t), flags); --- 1735,1741 ---- break; case CONVERT_EXPR: ! if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t))) { print_left_paren (scratch_buffer); dump_type (TREE_TYPE (t), flags); *************** dump_expr (t, flags) *** 1918,1933 **** case CONSTRUCTOR: if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) { ! tree idx = build_component_ref (t, index_identifier, NULL_TREE, 0); ! if (integer_all_onesp (idx)) ! { ! tree pfn = PFN_FROM_PTRMEMFUNC (t); ! dump_unary_op ("&", pfn, flags | TFF_EXPR_IN_PARENS); ! break; ! } ! else if (TREE_CODE (idx) == INTEGER_CST ! && tree_int_cst_equal (idx, integer_zero_node)) { /* A NULL pointer-to-member constant. */ output_add_string (scratch_buffer, "(("); --- 1834,1842 ---- case CONSTRUCTOR: if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) { ! tree idx = build_component_ref (t, pfn_identifier, NULL_TREE, 0); ! if (integer_zerop (idx)) { /* A NULL pointer-to-member constant. */ output_add_string (scratch_buffer, "(("); *************** cp_line_of (t) *** 2288,2294 **** return line; } ! /* Now the interfaces from cp_error et al to dump_type et al. Each takes an on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_ function. */ --- 2197,2203 ---- return line; } ! /* Now the interfaces from error et al to dump_type et al. Each takes an on/off VERBOSE flag and supply the appropriate TFF_ flags to a dump_ function. */ *************** language_to_string (c, v) *** 2370,2376 **** return "Java"; default: ! my_friendly_abort (355); return 0; } } --- 2279,2285 ---- return "Java"; default: ! abort (); return 0; } } *************** args_to_string (p, verbose) *** 2461,2486 **** static const char * cv_to_string (p, v) tree p; ! int v ATTRIBUTE_UNUSED; { reinit_global_formatting_buffer (); ! dump_qualifiers (p, before); return output_finalize_message (scratch_buffer); } static void ! lang_print_error_function (file) const char *file; { output_state os; ! default_print_error_function (file); ! os = output_buffer_state (diagnostic_buffer); ! output_set_prefix (diagnostic_buffer, file); ! maybe_print_instantiation_context (diagnostic_buffer); ! output_buffer_state (diagnostic_buffer) = os; } static void --- 2370,2396 ---- static const char * cv_to_string (p, v) tree p; ! int v; { reinit_global_formatting_buffer (); ! dump_qualifiers (p, v ? before : none); return output_finalize_message (scratch_buffer); } static void ! lang_print_error_function (context, file) ! diagnostic_context *context; const char *file; { output_state os; ! default_print_error_function (context, file); ! os = output_buffer_state (context); ! output_set_prefix ((output_buffer *)context, file); ! maybe_print_instantiation_context ((output_buffer *)context); ! output_buffer_state (context) = os; } static void *************** print_instantiation_context () *** 2637,2757 **** /* Called from output_format -- during diagnostic message processing -- to handle C++ specific format specifier with the following meanings: %A function argument-list. %D declaration. %E expression. %F function declaration. %P function parameter whose position is indicated by an integer. %T type. %V cv-qualifier. */ static int ! cp_tree_printer (buffer) output_buffer *buffer; { ! int be_verbose = 0; ! tree_formatting_info tfi; ! ! memset (&tfi, 0, sizeof (tree_formatting_info)); if (*output_buffer_text_cursor (buffer) == '+') ++output_buffer_text_cursor (buffer); if (*output_buffer_text_cursor (buffer) == '#') { ! be_verbose = 1; ++output_buffer_text_cursor (buffer); } switch (*output_buffer_text_cursor (buffer)) { ! case 'A': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! if (be_verbose) ! tree_formatting_flags (&tfi) = TFF_SCOPE ! | TFF_FUNCTION_DEFAULT_ARGUMENTS; ! print_function_argument_list (buffer, &tfi); ! break; ! ! case 'D': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! if (be_verbose) ! tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_DECL_SPECIFIERS ! | TFF_CLASS_KEY_OR_ENUM | TFF_RETURN_TYPE ! | TFF_FUNCTION_DEFAULT_ARGUMENTS | TFF_TEMPLATE_DEFAULT_ARGUMENTS ! | TFF_EXCEPTION_SPECIFICATION | TFF_CHASE_NAMESPACE_ALIAS; ! print_declaration (buffer, &tfi); ! break; ! ! case 'E': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! if (be_verbose) ! tree_formatting_flags (&tfi) = TFF_SCOPE; ! print_expression (buffer, &tfi); ! break; ! ! case 'F': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! if (be_verbose) ! tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_DECL_SPECIFIERS ! | TFF_RETURN_TYPE | TFF_FUNCTION_DEFAULT_ARGUMENTS ! | TFF_EXCEPTION_SPECIFICATION; ! print_function_declaration (buffer, &tfi); ! break; ! ! case 'P': ! print_function_parameter ! (buffer, va_arg (output_buffer_format_args (buffer), int)); ! break; ! ! case 'T': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! if (be_verbose) ! tree_formatting_flags (&tfi) = TFF_SCOPE | TFF_CLASS_KEY_OR_ENUM ! | TFF_RETURN_TYPE | TFF_EXCEPTION_SPECIFICATION; ! print_type_id (buffer, &tfi); ! break; ! ! case 'V': ! tree_being_formatted (&tfi) = ! va_arg (output_buffer_format_args (buffer), tree); ! print_cv_qualifier_seq (buffer, &tfi); ! break; ! default: return 0; } return 1; ! } ! ! /* Print a function argument-list represented by tree_being_formatted (TFI) ! onto BUFFER. */ ! static void ! print_function_argument_list (buffer, tfi) ! output_buffer *buffer __attribute__ ((__unused__)); ! tfi_t tfi __attribute__ ((__unused__)); ! { ! } ! ! /* Print a declaration represented by tree_being_formatted (TFI) ! onto buffer. */ ! static void ! print_declaration (buffer, tfi) ! output_buffer *buffer __attribute__ ((__unused__)); ! tfi_t tfi __attribute__ ((__unused__)); ! { ! } ! ! /* Print an expression represented by tree_being_formatted (TFI) ! onto BUFFER. */ ! static void ! print_expression (buffer, tfi) ! output_buffer *buffer __attribute__ ((__unused__)); ! tfi_t tfi __attribute__ ((__unused__)); ! { } static void --- 2547,2605 ---- /* Called from output_format -- during diagnostic message processing -- to handle C++ specific format specifier with the following meanings: %A function argument-list. + %C tree code. %D declaration. %E expression. %F function declaration. + %L language as used in extern "lang". + %O binary operator. %P function parameter whose position is indicated by an integer. + %Q assignment operator. %T type. %V cv-qualifier. */ static int ! cp_printer (buffer) output_buffer *buffer; { ! int verbose = 0; ! const char *result; ! #define next_tree va_arg (output_buffer_format_args (buffer), tree) ! #define next_tcode va_arg (output_buffer_format_args (buffer), enum tree_code) ! #define next_lang va_arg (output_buffer_format_args (buffer), enum languages) ! #define next_int va_arg (output_buffer_format_args (buffer), int) if (*output_buffer_text_cursor (buffer) == '+') ++output_buffer_text_cursor (buffer); if (*output_buffer_text_cursor (buffer) == '#') { ! verbose = 1; ++output_buffer_text_cursor (buffer); } switch (*output_buffer_text_cursor (buffer)) { ! case 'A': result = args_to_string (next_tree, verbose); break; ! case 'C': result = code_to_string (next_tcode, verbose); break; ! case 'D': result = decl_to_string (next_tree, verbose); break; ! case 'E': result = expr_to_string (next_tree, verbose); break; ! case 'F': result = fndecl_to_string (next_tree, verbose); break; ! case 'L': result = language_to_string (next_lang, verbose); break; ! case 'O': result = op_to_string (next_tcode, verbose); break; ! case 'P': result = parm_to_string (next_int, verbose); break; ! case 'Q': result = assop_to_string (next_tcode, verbose); break; ! case 'T': result = type_to_string (next_tree, verbose); break; ! case 'V': result = cv_to_string (next_tree, verbose); break; ! default: return 0; } + output_add_string (buffer, result); return 1; ! #undef next_tree ! #undef next_tcode ! #undef next_lang ! #undef next_int } static void *************** print_integer (buffer, i) *** 2763,3379 **** output_add_string (buffer, digit_buffer); } - /* Print a function declaration represented by tree_being_formatted (TFI) - onto BUFFER. */ - static void - print_function_declaration (buffer, tfi) - output_buffer *buffer __attribute__ ((__unused__)); - tfi_t tfi __attribute__ ((__unused__)); - { - } - - /* Print the N'th function parameter onto BUFFER. A negative value of N - means the implicit "this" parameter of a member function. */ static void ! print_function_parameter (buffer, n) ! output_buffer *buffer; ! int n; ! { ! if (n < 0) ! print_identifier (buffer, "this"); ! else ! output_decimal (buffer, n + 1); ! } ! ! /* Print a type represented by tree_being_formatted (TFI) onto BUFFER. */ ! static void ! print_type_id (buffer, tfi) output_buffer *buffer; ! tfi_t tfi; { ! tree t = tree_being_formatted (tfi); ! int flags = tree_formatting_flags (tfi); ! if (t == NULL_TREE) ! return; ! ! if (flags & TFF_CHASE_TYPEDEF) ! tree_being_formatted (tfi) = ! typedef_original_name (tree_being_formatted (tfi)); ! ! /* A type-id is of the form: ! type-id: ! type-specifier-seq abstract-declarator(opt) */ ! print_type_specifier_seq (buffer, tfi); ! ! if (TYPE_PTRMEMFUNC_P (t)) ! goto ptr_mem_fun; ! ! /* For types with abstract-declarator, print_type_specifier_seq prints ! the start of the abstract-declarator. Fiinish the job. */ ! switch (TREE_CODE (t)) ! { ! case ARRAY_TYPE: ! case POINTER_TYPE: ! case REFERENCE_TYPE: ! case OFFSET_TYPE: ! case METHOD_TYPE: ! case FUNCTION_TYPE: ! ptr_mem_fun: ! print_rest_of_abstract_declarator (buffer, tfi); ! ! default: ! break; ! } ! tree_being_formatted (tfi) = t; } ! /* Print the type-specifier-seq part of a type-id. If appropriate, print ! also the prefix of the abstract-declarator. */ ! static void ! print_type_specifier_seq (buffer, tfi) ! output_buffer *buffer; ! tfi_t tfi; ! { ! int flags = tree_formatting_flags (tfi); ! tree t = tree_being_formatted (tfi); ! enum tree_code code = TREE_CODE (t); ! ! /* A type-speficier-seq is: ! type-specifier type-specifier-seq(opt) ! where ! type-specifier: ! simple-type-specifier ! class-specifier ! enum-specifier ! elaborated-type-specifier ! cv-qualifier ! ! We do not, however, pretty-print class-specifier nor enum-specifier. */ ! ! switch (code) ! { ! case UNKNOWN_TYPE: ! case IDENTIFIER_NODE: ! case VOID_TYPE: ! case INTEGER_TYPE: ! case REAL_TYPE: ! case COMPLEX_TYPE: ! case ENUMERAL_TYPE: ! case BOOLEAN_TYPE: ! case UNION_TYPE: ! case TYPE_DECL: ! case TEMPLATE_DECL: ! case TEMPLATE_TYPE_PARM: ! case TYPEOF_TYPE: ! case TEMPLATE_TEMPLATE_PARM: ! case TYPENAME_TYPE: ! class_type: ! print_cv_qualifier_seq (buffer, tfi); ! if ((flags & TFF_DECL_SPECIFIERS) ! && (code == TYPENAME_TYPE || IS_AGGR_TYPE (t))) ! print_elaborated_type_specifier (buffer, tfi); ! else ! print_simple_type_specifier (buffer, tfi); ! break; ! ! /* Because the abstract-declarator can modify the type-specifier-seq ! in a highly non linear manner, we pretty-print its prefix here. ! The suffix part is handled by print_rest_of_abstract_declarator. */ ! ! /* A RECORD_TYPE is also used to represent a pointer to member ! function. */ ! case RECORD_TYPE: ! if (TYPE_PTRMEMFUNC_P (t)) ! { ! /* Print the return type. */ ! tree_being_formatted (tfi) = ! TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (t)); ! print_type_id (buffer, tfi); ! print_whitespace (buffer, tfi); ! ! /* Then the beginning of the abstract-declarator part. */ ! tree_being_formatted (tfi) = ! TYPE_METHOD_BASETYPE (TYPE_PTRMEMFUNC_FN_TYPE (t)); ! print_left_paren (buffer); ! print_nested_name_specifier (buffer, tfi); ! } ! else ! goto class_type; ! break; ! ! case POINTER_TYPE: ! if (TYPE_PTRMEM_P (t)) ! goto ptr_data_member; ! else ! goto non_ptr_data_member; ! break; ! ! case ARRAY_TYPE: ! case REFERENCE_TYPE: ! case FUNCTION_TYPE: ! case METHOD_TYPE: ! non_ptr_data_member: ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_type_specifier_seq (buffer, tfi); ! if (code == POINTER_TYPE || code == REFERENCE_TYPE) ! { ! if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) ! print_left_paren (buffer); ! } ! else if (code == FUNCTION_TYPE || code == METHOD_TYPE) ! { ! print_whitespace (buffer, tfi); ! print_left_paren (buffer); ! if (code == METHOD_TYPE) ! { ! tree_being_formatted (tfi) = TYPE_METHOD_BASETYPE (t); ! print_nested_name_specifier (buffer, tfi); ! tree_being_formatted (tfi) = t; ! } ! } ! tree_being_formatted (tfi) = t; ! break; ! ! ptr_data_member: ! case OFFSET_TYPE: ! /* Firstly, the type of the member. */ ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_type_id (buffer, tfi); ! print_whitespace (buffer, tfi); ! ! /* Then, the containing class. */ ! tree_being_formatted (tfi) = TYPE_OFFSET_BASETYPE (t); ! print_nested_name_specifier (buffer, tfi); ! tree_being_formatted (tfi) = t; ! break; ! ! default: ! sorry_for_unsupported_tree (t); ! /* fall throught */ ! ! case ERROR_MARK: ! print_identifier (buffer, "{type-specifier-seq error}"); ! break; ! } ! ! tree_being_formatted (tfi) = t; ! } ! /* Print the simpe-type-specifier component of a type-specifier. */ ! static void ! print_simple_type_specifier (buffer, tfi) ! output_buffer *buffer; ! tfi_t tfi; { ! int flags = tree_formatting_flags (tfi); ! tree t = tree_being_formatted (tfi); ! enum tree_code code = TREE_CODE (t); ! switch (code) { ! case UNKNOWN_TYPE: ! print_identifier (buffer, "{unknown type}"); ! break; ! ! case IDENTIFIER_NODE: ! print_tree_identifier (buffer, t); ! break; ! ! case COMPLEX_TYPE: ! print_identifier (buffer, "__complex__ "); ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_type_id (buffer, tfi); ! break; ! ! case TYPENAME_TYPE: ! tree_being_formatted (tfi) = TYPE_CONTEXT (t); ! print_nested_name_specifier (buffer, tfi); ! tree_being_formatted (tfi) = TYPENAME_TYPE_FULLNAME (t); ! tree_formatting_flags (tfi) |= ~TFF_CHASE_TYPEDEF; ! print_type_id (buffer, tfi); ! break; ! ! case TYPEOF_TYPE: ! print_identifier (buffer, "__typeof__"); ! tree_being_formatted (tfi) = TYPE_FIELDS (t); ! print_left_paren (buffer); ! print_expression (buffer, tfi); ! print_right_paren (buffer); ! break; ! ! case INTEGER_TYPE: ! if (TREE_UNSIGNED (t)) ! { ! if (TYPE_MAIN_VARIANT (t) == integer_type_node) ! /* We don't want pedantry like `unsigned int'. */; ! else if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t))) ! { ! print_identifier (buffer, "unsigned"); ! print_whitespace (buffer, tfi); ! } ! } ! else if (TYPE_MAIN_VARIANT (t) == char_type_node) ! { ! print_identifier (buffer, "signed"); ! print_whitespace (buffer, tfi); ! } ! case REAL_TYPE: ! case BOOLEAN_TYPE: ! case VOID_TYPE: ! { ! tree s = (flags & TFF_CHASE_TYPEDEF) ? TYPE_MAIN_VARIANT (t) : t; ! ! if (TYPE_NAME (s) && TYPE_IDENTIFIER (s)) ! print_tree_identifier (buffer, TYPE_IDENTIFIER (s)); ! else ! /* Types like intQI_type_node and friends have no names. ! These don't come up in user error messages, but it's nice ! to be able to print them from the debugger. */ ! print_identifier (buffer, "{anonymous}"); ! } ! break; ! ! case TEMPLATE_TEMPLATE_PARM: ! if (TYPE_IDENTIFIER (t)) ! print_tree_identifier (buffer, TYPE_IDENTIFIER (t)); ! else ! print_identifier (buffer, "{anonymous template template parameter}"); ! break; ! ! case TYPE_DECL: ! if (flags & TFF_CHASE_TYPEDEF) ! print_type_id (buffer, tfi); ! else ! print_tree_identifier (buffer, DECL_NAME (t)); ! break; ! case BOUND_TEMPLATE_TEMPLATE_PARM: ! case TEMPLATE_DECL: ! print_template_id (buffer, tfi); ! break; ! case TEMPLATE_TYPE_PARM: ! if (TYPE_IDENTIFIER (t)) ! print_tree_identifier (buffer, TYPE_IDENTIFIER (t)); ! else ! print_identifier (buffer, "{anonymous template type parameter}"); ! break; ! default: ! break; } ! tree_being_formatted (tfi) = t; ! tree_formatting_flags (tfi) = flags; ! } ! ! /* Print the elaborated-type-specifier form of a type-specifier. */ ! static void ! print_elaborated_type_specifier (buffer, tfi) ! output_buffer *buffer; ! tfi_t tfi; ! { ! int flags = tree_formatting_flags (tfi); ! tree t = tree_being_formatted (tfi); ! ! switch (TREE_CODE (t)) ! { ! case TYPENAME_TYPE: ! print_identifier (buffer, "typename"); ! print_whitespace (buffer, tfi); ! tree_formatting_flags (tfi) |= ~TFF_DECL_SPECIFIERS; ! print_simple_type_specifier (buffer, tfi); ! break; ! ! case UNION_TYPE: ! case RECORD_TYPE: ! { ! tree name = NULL_TREE; ! ! if (flags & TFF_CHASE_TYPEDEF) ! tree_being_formatted (tfi) = typedef_original_name (t); ! ! print_identifier ! (buffer, class_key_or_enum (tree_being_formatted (tfi))); ! print_whitespace (buffer, tfi); ! ! name = TYPE_NAME (tree_being_formatted (tfi)); ! if (name) ! { ! if (flags & TFF_SCOPE) ! { ! tree_being_formatted (tfi) = CP_DECL_CONTEXT (name); ! print_nested_name_specifier (buffer, tfi); ! } ! print_tree_identifier (buffer, DECL_NAME (name)); ! } ! else ! print_identifier (buffer, "{anonymous}"); ! } ! break; ! ! default: ! sorry_for_unsupported_tree (t); ! break; ! } ! tree_being_formatted (tfi) = t; ! tree_formatting_flags (tfi) = flags; } - /* Finish the job of printing the abstract-declarator part of a - type-id. */ - static void - print_rest_of_abstract_declarator (buffer, tfi) - output_buffer *buffer; - tfi_t tfi; - { - tree t = tree_being_formatted (tfi); - enum tree_code code = TREE_CODE (t); - - /* An abstract-declarator has the form: - - abstract-declarator: - ptr-operator abstract-declarator(opt) - direct-abstract-declarator - - direct-abstract-declarator: - direct-abstract-declarator(opt) - ( parameter-declaration-clause ) cv-qualifier-seq(opt) - exception-specification(opt) - direct-abstract-declarator(opt) [ constant-expression(opt) ] - ( direct-abstract-declarator ) */ - - switch (code) - { - case ARRAY_TYPE: - print_left_bracket (buffer); - if (TYPE_DOMAIN (t)) - { - tree s = TYPE_DOMAIN (t); ! if (host_integerp (TYPE_MAX_VALUE (s), 0)) ! output_decimal (buffer, tree_low_cst (TYPE_MAX_VALUE (s), 0) + 1); ! else if (TREE_CODE (TYPE_MAX_VALUE (s)) == MINUS_EXPR) ! { ! tree_being_formatted (tfi) = ! TREE_OPERAND (TYPE_MAX_VALUE (s), 0); ! print_expression (buffer, tfi); ! tree_being_formatted (tfi) = t; ! } ! else ! { ! tree_being_formatted (tfi) = fold ! (cp_build_binary_op (PLUS_EXPR, TYPE_MAX_VALUE (s), ! integer_one_node)); ! print_expression (buffer, tfi); ! tree_being_formatted (tfi) = t; ! } ! } ! print_right_bracket (buffer); ! put_whitespace (tfi) = none; ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_rest_of_abstract_declarator (buffer, tfi); ! tree_being_formatted (tfi) = t; ! break; ! ! case POINTER_TYPE: ! case REFERENCE_TYPE: ! case OFFSET_TYPE: ! if (code == POINTER_TYPE || code == REFERENCE_TYPE) ! { ! output_add_character (buffer, "&*"[code == POINTER_TYPE]); ! if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) ! print_right_paren (buffer); ! } ! put_whitespace (tfi) = before; ! print_cv_qualifier_seq (buffer, tfi); ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_rest_of_abstract_declarator (buffer, tfi); ! tree_being_formatted (tfi) = t; ! break; ! ! case FUNCTION_TYPE: ! case METHOD_TYPE: ! print_right_paren (buffer); ! print_whitespace (buffer, tfi); ! ! /* Skip the `this' implicit parameter if present. */ ! tree_being_formatted (tfi) = TYPE_ARG_TYPES (t); ! if (code == METHOD_TYPE) ! tree_being_formatted (tfi) = TREE_CHAIN (tree_being_formatted (tfi)); ! ! /* Print the parameter-list. */ ! print_left_paren (buffer); ! print_parameter_declaration_clause (buffer, tfi); ! print_right_paren (buffer); ! ! print_whitespace (buffer, tfi); ! ! if (code == METHOD_TYPE) ! { ! tree_being_formatted (tfi) = ! TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))); ! print_cv_qualifier_seq (buffer, tfi); ! } ! ! /* Finish the abstract-declarator. */ ! tree_being_formatted (tfi) = TREE_TYPE (t); ! print_rest_of_abstract_declarator (buffer, tfi); ! ! /* Print the exception-specification for documentaion purpose. */ ! tree_being_formatted (tfi) = TYPE_RAISES_EXCEPTIONS (t); ! print_exception_specification (buffer, tfi); ! tree_being_formatted (tfi) = t; ! break; ! ! /* These types don't have abstract-declarator. */ ! case UNKNOWN_TYPE: ! case IDENTIFIER_NODE: ! case VOID_TYPE: ! case INTEGER_TYPE: ! case REAL_TYPE: ! case COMPLEX_TYPE: ! case ENUMERAL_TYPE: ! case BOOLEAN_TYPE: ! case UNION_TYPE: ! case TYPE_DECL: ! case TEMPLATE_DECL: ! case TEMPLATE_TYPE_PARM: ! case TYPEOF_TYPE: ! case TEMPLATE_TEMPLATE_PARM: ! case TYPENAME_TYPE: ! break; ! ! default: ! sorry_for_unsupported_tree (t); ! /* fall throught. */ ! case ERROR_MARK: ! break; ! } ! } ! ! /* Print the cv-quafilers of tree_being_formatted (TFI) onto BUFFER. */ ! static void ! print_cv_qualifier_seq (buffer, tfi) ! output_buffer *buffer; ! tree_formatting_info *tfi; { ! int cv = TYPE_QUALS (tree_being_formatted (tfi)); ! int pad_after = after == put_whitespace (tfi); ! static const int mask[] ! = {TYPE_QUAL_CONST, TYPE_QUAL_VOLATILE, TYPE_QUAL_RESTRICT}; ! static const char *const qualifier[] ! = { "const", "volatile", "__restrict__" }; ! ! if (cv != 0) ! { ! int i; ! for (i = 0; i != 3; ++i) ! if (mask[i] & cv) ! { ! if (put_whitespace (tfi) == before) ! output_add_space (buffer); ! print_identifier (buffer, qualifier[i]); ! put_whitespace (tfi) = before; ! } ! if (pad_after) ! { ! output_add_space (buffer); ! put_whitespace (tfi) = none; ! } ! } ! } ! static void ! print_parameter_declaration_clause (buffer, tfi) ! output_buffer *buffer __attribute__ ((__unused__)); ! tfi_t tfi __attribute__ ((__unused__)); ! { ! } ! static void ! print_exception_specification (buffer, tfi) ! output_buffer *buffer __attribute__ ((__unused__)); ! tfi_t tfi __attribute__ ((__unused__)); ! { } ! static void ! print_nested_name_specifier (buffer, tfi) ! output_buffer *buffer; ! tfi_t tfi; { ! int flags = tree_formatting_flags (tfi); ! tree t = tree_being_formatted (tfi); ! /* A nested-name-specifier is: ! class-or-namespace-name :: nested-name-specifier(opt) ! class-or-namespace-name :: template nested-name-specifier ! ! The latter form being the correct syntax for a name designating ! a template member, where the preceding class-or-namespace-name part ! is name-dependent. For the time being, we do not do such a ! sophisticated pretty-printing. ! ! class-or-namespace-name: ! class-name ! namespace-name */ ! ! if (t == NULL_TREE || t == global_namespace) ! return; ! ! if (CLASS_TYPE_P (t) && !(flags & TFF_CLASS_SCOPE)) ! return; ! if (TREE_CODE (t) == NAMESPACE_DECL && !(flags & TFF_NAMESPACE_SCOPE)) ! return; ! tree_being_formatted (tfi) = DECL_CONTEXT (t); ! print_nested_name_specifier (buffer, tfi); ! print_scope_operator (buffer); ! if (TREE_CODE (t) == NAMESPACE_DECL) ! print_tree_identifier (buffer, DECL_NAME (t)); ! else if (CLASS_TYPE_P (t)) ! { ! if (!DECL_USE_TEMPLATE (t)) ! print_tree_identifier (buffer, TYPE_IDENTIFIER (t)); ! else ! { ! tree_being_formatted (tfi) = t; ! print_template_id (buffer, tfi); ! } ! } ! tree_being_formatted (tfi) = t; } ! static void ! print_template_id (buffer, tfi) ! output_buffer *buffer; ! tfi_t tfi __attribute__ ((__unused__)); { ! print_template_argument_list_start (buffer); ! /* ... */ ! print_template_argument_list_end (buffer); ! } ! static tree ! typedef_original_name (t) ! tree t; ! { ! return DECL_ORIGINAL_TYPE (t) ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t); ! } ! static void ! print_non_consecutive_character (buffer, c) ! output_buffer *buffer; ! int c; ! { ! const char *p = output_last_position (buffer); ! if (p != NULL && *p == c) ! output_add_space (buffer); ! output_add_character (buffer, c); } --- 2611,2750 ---- output_add_string (buffer, digit_buffer); } static void ! print_non_consecutive_character (buffer, c) output_buffer *buffer; ! int c; { ! const char *p = output_last_position (buffer); ! if (p != NULL && *p == c) ! output_add_space (buffer); ! output_add_character (buffer, c); } ! /* These are temporary wrapper functions which handle the historic ! behavior of cp_*_at. */ ! static tree ! locate_error (msgid, ap) ! const char *msgid; ! va_list ap; { ! tree here = 0, t; ! int plus = 0; ! const char *f; ! for (f = msgid; *f; f++) { ! plus = 0; ! if (*f == '%') ! { ! f++; ! if (*f == '+') ! f++, plus = 1; ! if (*f == '#') ! f++; ! switch (*f) ! { ! /* Just ignore these possibilities. */ ! case '%': break; ! case 'd': (void) va_arg (ap, int); break; ! case 's': (void) va_arg (ap, char *); break; ! case 'L': (void) va_arg (ap, enum languages); break; ! case 'C': ! case 'O': ! case 'Q': (void) va_arg (ap, enum tree_code); break; ! /* These take a tree, which may be where the error is ! located. */ ! case 'A': ! case 'D': ! case 'E': ! case 'F': ! case 'P': ! case 'T': ! case 'V': ! t = va_arg (ap, tree); ! if (!here || plus) ! here = t; ! break; ! default: ! errorcount = 0; /* damn ICE suppression */ ! internal_error ("unexpected letter `%c' in locate_error\n", *f); ! } ! } } ! if (here == 0) ! here = va_arg (ap, tree); ! return here; } ! void ! cp_error_at VPARAMS ((const char *msgid, ...)) { ! tree here; ! diagnostic_context dc; ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! here = locate_error (msgid, ap); ! VA_CLOSE (ap); ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! set_diagnostic_context (&dc, msgid, &ap, ! cp_file_of (here), ! cp_line_of (here), /* warning = */ 0); ! report_diagnostic (&dc); ! VA_CLOSE (ap); } ! void ! cp_warning_at VPARAMS ((const char *msgid, ...)) { ! tree here; ! diagnostic_context dc; ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! here = locate_error (msgid, ap); ! VA_CLOSE (ap); ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! set_diagnostic_context (&dc, msgid, &ap, ! cp_file_of (here), ! cp_line_of (here), /* warning = */ 1); ! report_diagnostic (&dc); ! VA_CLOSE (ap); } ! void ! cp_pedwarn_at VPARAMS ((const char *msgid, ...)) { ! tree here; ! diagnostic_context dc; ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! here = locate_error (msgid, ap); ! VA_CLOSE (ap); ! VA_OPEN (ap, msgid); ! VA_FIXEDARG (ap, const char *, msgid); ! set_diagnostic_context (&dc, msgid, &ap, ! cp_file_of (here), ! cp_line_of (here), ! /* warning = */ !flag_pedantic_errors); ! report_diagnostic (&dc); ! VA_CLOSE (ap); } diff -Nrc3pad gcc-3.0.4/gcc/cp/except.c gcc-3.1/gcc/cp/except.c *** gcc-3.0.4/gcc/cp/except.c Wed Jun 27 12:15:10 2001 --- gcc-3.1/gcc/cp/except.c Tue Dec 18 03:35:30 2001 *************** Boston, MA 02111-1307, USA. */ *** 28,33 **** --- 28,34 ---- #include "tree.h" #include "rtl.h" #include "expr.h" + #include "libfuncs.h" #include "cp-tree.h" #include "flags.h" #include "obstack.h" *************** init_exception_processing () *** 62,77 **** { tree tmp; - if (flag_honor_std) - push_namespace (std_identifier); - /* void std::terminate (); */ tmp = build_function_type (void_type_node, void_list_node); terminate_node = build_cp_library_fn_ptr ("terminate", tmp); TREE_THIS_VOLATILE (terminate_node) = 1; TREE_NOTHROW (terminate_node) = 1; ! if (flag_honor_std) ! pop_namespace (); /* void __cxa_call_unexpected(void *); */ tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node); --- 63,75 ---- { tree tmp; /* void std::terminate (); */ + push_namespace (std_identifier); tmp = build_function_type (void_type_node, void_list_node); terminate_node = build_cp_library_fn_ptr ("terminate", tmp); TREE_THIS_VOLATILE (terminate_node) = 1; TREE_NOTHROW (terminate_node) = 1; ! pop_namespace (); /* void __cxa_call_unexpected(void *); */ tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node); *************** init_exception_processing () *** 88,94 **** } /* Returns an expression to be executed if an unhandled exception is ! propogated out of a cleanup region. */ static tree cp_protect_cleanup_actions () --- 86,92 ---- } /* Returns an expression to be executed if an unhandled exception is ! propagated out of a cleanup region. */ static tree cp_protect_cleanup_actions () *************** decl_is_java_type (decl, err) *** 244,250 **** && TYPE_FOR_JAVA (TREE_TYPE (decl))) { /* Can't throw a reference. */ ! cp_error ("type `%T' is disallowed in Java `throw' or `catch'", decl); } --- 242,248 ---- && TYPE_FOR_JAVA (TREE_TYPE (decl))) { /* Can't throw a reference. */ ! error ("type `%T' is disallowed in Java `throw' or `catch'", decl); } *************** decl_is_java_type (decl, err) *** 262,268 **** if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl))) { /* Thrown object must be a Throwable. */ ! cp_error ("type `%T' is not derived from `java::lang::Throwable'", TREE_TYPE (decl)); } } --- 260,266 ---- if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl))) { /* Thrown object must be a Throwable. */ ! error ("type `%T' is not derived from `java::lang::Throwable'", TREE_TYPE (decl)); } } *************** tree *** 391,398 **** expand_start_catch_block (decl) tree decl; { - tree compound_stmt_1; - tree compound_stmt_2; tree exp = NULL_TREE; tree type; bool is_java; --- 389,394 ---- *************** expand_start_catch_block (decl) *** 404,419 **** if (decl && !complete_ptr_ref_or_void_ptr_p (TREE_TYPE (decl), NULL_TREE)) decl = NULL_TREE; - /* Create a binding level for the eh_info and the exception object - cleanup. */ - compound_stmt_1 = begin_compound_stmt (/*has_no_scope=*/0); - note_level_for_catch (); - if (decl) type = prepare_eh_type (TREE_TYPE (decl)); else type = NULL_TREE; - begin_catch_block (type); is_java = false; if (decl) --- 400,409 ---- *************** expand_start_catch_block (decl) *** 452,464 **** if (! is_java) push_eh_cleanup (type); - /* Create a binding level for the parm. */ - compound_stmt_2 = begin_compound_stmt (/*has_no_scope=*/0); - if (decl) initialize_handler_parm (decl, exp); ! return build_tree_list (compound_stmt_1, compound_stmt_2); } --- 442,451 ---- if (! is_java) push_eh_cleanup (type); if (decl) initialize_handler_parm (decl, exp); ! return type; } *************** expand_start_catch_block (decl) *** 467,478 **** the label to jump to if this catch block didn't match. */ void ! expand_end_catch_block (blocks) ! tree blocks; { - tree compound_stmt_1 = blocks ? TREE_PURPOSE (blocks): NULL_TREE; - tree compound_stmt_2 = blocks ? TREE_VALUE (blocks): NULL_TREE; - if (! doing_eh (1)) return; --- 454,461 ---- the label to jump to if this catch block didn't match. */ void ! expand_end_catch_block () { if (! doing_eh (1)) return; *************** expand_end_catch_block (blocks) *** 482,492 **** && (DECL_CONSTRUCTOR_P (current_function_decl) || DECL_DESTRUCTOR_P (current_function_decl))) finish_expr_stmt (build_throw (NULL_TREE)); - - /* Cleanup the EH parameter. */ - finish_compound_stmt (/*has_no_scope=*/0, compound_stmt_2); - /* Cleanup the EH object. */ - finish_compound_stmt (/*has_no_scope=*/0, compound_stmt_1); } tree --- 465,470 ---- *************** build_throw (exp) *** 577,583 **** return build_min (THROW_EXPR, void_type_node, exp); if (exp == null_node) ! cp_warning ("throwing NULL, which has integral, not pointer type"); if (exp != NULL_TREE) { --- 555,561 ---- return build_min (THROW_EXPR, void_type_node, exp); if (exp == null_node) ! warning ("throwing NULL, which has integral, not pointer type"); if (exp != NULL_TREE) { *************** is_admissible_throw_operand (expr) *** 794,800 **** conversion. */ else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type)) { ! cp_error ("Expression '%E' of abstract class type '%T' cannot be used in throw-expression", expr, type); return false; } --- 772,778 ---- conversion. */ else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type)) { ! error ("expression '%E' of abstract class type '%T' cannot be used in throw-expression", expr, type); return false; } *************** check_handlers_1 (master, handlers) *** 882,891 **** && can_convert_eh (type, TREE_TYPE (handler))) { lineno = STMT_LINENO (handler); ! cp_warning ("exception of type `%T' will be caught", TREE_TYPE (handler)); lineno = STMT_LINENO (master); ! cp_warning (" by earlier handler for `%T'", type); break; } } --- 860,869 ---- && can_convert_eh (type, TREE_TYPE (handler))) { lineno = STMT_LINENO (handler); ! warning ("exception of type `%T' will be caught", TREE_TYPE (handler)); lineno = STMT_LINENO (master); ! warning (" by earlier handler for `%T'", type); break; } } *************** check_handlers (handlers) *** 905,911 **** else if (TREE_TYPE (handler) == NULL_TREE) { lineno = STMT_LINENO (handler); ! cp_pedwarn ("`...' handler must be the last handler for its try block"); } else --- 883,889 ---- else if (TREE_TYPE (handler) == NULL_TREE) { lineno = STMT_LINENO (handler); ! pedwarn ("`...' handler must be the last handler for its try block"); } else diff -Nrc3pad gcc-3.0.4/gcc/cp/expr.c gcc-3.1/gcc/cp/expr.c *** gcc-3.0.4/gcc/cp/expr.c Wed Jul 25 09:01:32 2001 --- gcc-3.1/gcc/cp/expr.c Wed Jan 23 14:25:56 2002 *************** cplus_expand_expr (exp, target, tmode, m *** 106,112 **** case OFFSET_REF: /* Offset refs should not make it through to here. */ ! my_friendly_abort (20010724); return const0_rtx; case THROW_EXPR: --- 106,112 ---- case OFFSET_REF: /* Offset refs should not make it through to here. */ ! abort (); return const0_rtx; case THROW_EXPR: *************** cplus_expand_expr (exp, target, tmode, m *** 126,132 **** default: return c_expand_expr (exp, target, tmode, modifier); } ! my_friendly_abort (40); /* NOTREACHED */ return NULL; } --- 126,132 ---- default: return c_expand_expr (exp, target, tmode, modifier); } ! abort (); /* NOTREACHED */ return NULL; } *************** void *** 135,141 **** init_cplus_expand () { lang_expand_expr = cplus_expand_expr; - lang_expand_constant = cplus_expand_constant; } int --- 135,140 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/friend.c gcc-3.1/gcc/cp/friend.c *** gcc-3.0.4/gcc/cp/friend.c Fri Jun 8 12:47:57 2001 --- gcc-3.1/gcc/cp/friend.c Mon Feb 4 08:55:43 2002 *************** add_friend (type, decl) *** 152,158 **** { if (decl == TREE_VALUE (friends)) { ! cp_warning ("`%D' is already a friend of class `%T'", decl, type); cp_warning_at ("previous friend declaration of `%D'", TREE_VALUE (friends)); --- 152,158 ---- { if (decl == TREE_VALUE (friends)) { ! warning ("`%D' is already a friend of class `%T'", decl, type); cp_warning_at ("previous friend declaration of `%D'", TREE_VALUE (friends)); *************** make_friend_class (type, friend_type) *** 194,200 **** if (! IS_AGGR_TYPE (friend_type)) { ! cp_error ("invalid type `%T' declared `friend'", friend_type); return; } --- 194,200 ---- if (! IS_AGGR_TYPE (friend_type)) { ! error ("invalid type `%T' declared `friend'", friend_type); return; } *************** make_friend_class (type, friend_type) *** 206,212 **** Friend declarations shall not declare partial specializations. */ ! cp_error ("partial specialization `%T' declared `friend'", friend_type); return; } --- 206,212 ---- Friend declarations shall not declare partial specializations. */ ! error ("partial specialization `%T' declared `friend'", friend_type); return; } *************** make_friend_class (type, friend_type) *** 218,224 **** is_template_friend = 1; else if (same_type_p (type, friend_type)) { ! cp_pedwarn ("class `%T' is implicitly friends with itself", type); return; } --- 218,224 ---- is_template_friend = 1; else if (same_type_p (type, friend_type)) { ! pedwarn ("class `%T' is implicitly friends with itself", type); return; } *************** make_friend_class (type, friend_type) *** 236,259 **** else if (TREE_CODE (friend_type) == TYPENAME_TYPE) { /* template friend typename S::X; */ ! cp_error ("typename type `%#T' declared `friend'", friend_type); return; } else if (TREE_CODE (friend_type) == TEMPLATE_TYPE_PARM) { /* template friend class T; */ ! cp_error ("template parameter type `%T' declared `friend'", friend_type); return; } else if (!CLASSTYPE_TEMPLATE_INFO (friend_type)) { /* template friend class A; where A is not a template */ ! cp_error ("`%#T' is not a template", friend_type); return; } - GNU_xref_hier (type, friend_type, 0, 0, 1); - if (is_template_friend) friend_type = CLASSTYPE_TI_TEMPLATE (friend_type); --- 236,257 ---- else if (TREE_CODE (friend_type) == TYPENAME_TYPE) { /* template friend typename S::X; */ ! error ("typename type `%#T' declared `friend'", friend_type); return; } else if (TREE_CODE (friend_type) == TEMPLATE_TYPE_PARM) { /* template friend class T; */ ! error ("template parameter type `%T' declared `friend'", friend_type); return; } else if (!CLASSTYPE_TEMPLATE_INFO (friend_type)) { /* template friend class A; where A is not a template */ ! error ("`%#T' is not a template", friend_type); return; } if (is_template_friend) friend_type = CLASSTYPE_TI_TEMPLATE (friend_type); *************** make_friend_class (type, friend_type) *** 265,271 **** same_type_p (TREE_VALUE (classes), friend_type))) classes = TREE_CHAIN (classes); if (classes) ! cp_warning ("`%T' is already a friend of `%T'", TREE_VALUE (classes), type); else { --- 263,269 ---- same_type_p (TREE_VALUE (classes), friend_type))) classes = TREE_CHAIN (classes); if (classes) ! warning ("`%T' is already a friend of `%T'", TREE_VALUE (classes), type); else { *************** do_friend (ctype, declarator, decl, parm *** 309,315 **** int funcdef_flag; { int is_friend_template = 0; - tree prefix_attributes, attributes; /* Every decl that gets here is a friend of something. */ DECL_FRIEND_P (decl) = 1; --- 307,312 ---- *************** do_friend (ctype, declarator, decl, parm *** 324,330 **** } if (TREE_CODE (decl) != FUNCTION_DECL) ! my_friendly_abort (990513); is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P (); --- 321,327 ---- } if (TREE_CODE (decl) != FUNCTION_DECL) ! abort (); is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P (); *************** do_friend (ctype, declarator, decl, parm *** 362,368 **** add_friend (current_class_type, decl); } else ! cp_error ("member `%D' declared as friend before type `%T' defined", decl, ctype); } /* A global friend. --- 359,365 ---- add_friend (current_class_type, decl); } else ! error ("member `%D' declared as friend before type `%T' defined", decl, ctype); } /* A global friend. *************** do_friend (ctype, declarator, decl, parm *** 417,426 **** if (warn) { static int explained; ! cp_warning ("friend declaration `%#D' declares a non-template function", decl); if (! explained) { ! warning ("(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning."); explained = 1; } } --- 414,423 ---- if (warn) { static int explained; ! warning ("friend declaration `%#D' declares a non-template function", decl); if (! explained) { ! warning ("(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning"); explained = 1; } } *************** do_friend (ctype, declarator, decl, parm *** 435,457 **** handle them in start_decl_1, but since this is a friend decl start_decl_1 never gets to see it. */ - if (attrlist) - { - attributes = TREE_PURPOSE (attrlist); - prefix_attributes = TREE_VALUE (attrlist); - } - else - { - attributes = NULL_TREE; - prefix_attributes = NULL_TREE; - } - - #ifdef SET_DEFAULT_DECL_ATTRIBUTES - SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes); - #endif - /* Set attributes here so if duplicate decl, will have proper attributes. */ ! cplus_decl_attributes (decl, attributes, prefix_attributes); return decl; } --- 432,439 ---- handle them in start_decl_1, but since this is a friend decl start_decl_1 never gets to see it. */ /* Set attributes here so if duplicate decl, will have proper attributes. */ ! cplus_decl_attributes (&decl, attrlist, 0); return decl; } diff -Nrc3pad gcc-3.0.4/gcc/cp/g++spec.c gcc-3.1/gcc/cp/g++spec.c *** gcc-3.0.4/gcc/cp/g++spec.c Fri Feb 2 17:41:57 2001 --- gcc-3.1/gcc/cp/g++spec.c Tue Apr 23 16:36:52 2002 *************** Boston, MA 02111-1307, USA. */ *** 32,41 **** --- 32,47 ---- #ifndef MATH_LIBRARY #define MATH_LIBRARY "-lm" #endif + #ifndef MATH_LIBRARY_PROFILE + #define MATH_LIBRARY_PROFILE "-lm" + #endif #ifndef LIBSTDCXX #define LIBSTDCXX "-lstdc++" #endif + #ifndef LIBSTDCXX_PROFILE + #define LIBSTDCXX_PROFILE "-lstdc++" + #endif void lang_specific_driver (in_argc, in_argv, in_added_libraries) *************** lang_specific_driver (in_argc, in_argv, *** 45,50 **** --- 51,59 ---- { int i, j; + /* If non-zero, the user gave us the `-p' or `-pg' flag. */ + int saw_profile_flag = 0; + /* If non-zero, the user gave us the `-v' flag. */ int saw_verbose_flag = 0; *************** lang_specific_driver (in_argc, in_argv, *** 137,142 **** --- 146,153 ---- } else if (strcmp (argv[i], "-lc") == 0) args[i] |= WITHLIBC; + else if (strcmp (argv[i], "-pg") == 0 || strcmp (argv[i], "-p") == 0) + saw_profile_flag++; else if (strcmp (argv[i], "-v") == 0) { saw_verbose_flag = 1; *************** lang_specific_driver (in_argc, in_argv, *** 151,156 **** --- 162,168 ---- saw_speclang = 1; else if (((argv[i][2] == '\0' && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL) + || strcmp (argv[i], "-Xlinker") == 0 || strcmp (argv[i], "-Tdata") == 0)) quote = argv[i]; else if (library != 0 && ((argv[i][2] == '\0' *************** lang_specific_driver (in_argc, in_argv, *** 258,271 **** /* Add `-lstdc++' if we haven't already done so. */ if (library) { ! arglist[j++] = LIBSTDCXX; added_libraries++; } if (saw_math) arglist[j++] = saw_math; else if (library && need_math) { ! arglist[j++] = MATH_LIBRARY; added_libraries++; } if (saw_libc) --- 270,283 ---- /* Add `-lstdc++' if we haven't already done so. */ if (library) { ! arglist[j++] = saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX; added_libraries++; } if (saw_math) arglist[j++] = saw_math; else if (library && need_math) { ! arglist[j++] = saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY; added_libraries++; } if (saw_libc) diff -Nrc3pad gcc-3.0.4/gcc/cp/init.c gcc-3.1/gcc/cp/init.c *** gcc-3.0.4/gcc/cp/init.c Wed Jan 23 12:47:11 2002 --- gcc-3.1/gcc/cp/init.c Thu May 2 20:02:41 2002 *************** static tree build_vec_delete_1 PARAMS (( *** 42,48 **** static void perform_member_init PARAMS ((tree, tree, int)); static void sort_base_init PARAMS ((tree, tree, tree *, tree *)); static tree build_builtin_delete_call PARAMS ((tree)); ! static int member_init_ok_or_else PARAMS ((tree, tree, const char *)); static void expand_virtual_init PARAMS ((tree, tree)); static tree sort_member_init PARAMS ((tree, tree)); static tree initializing_context PARAMS ((tree)); --- 42,48 ---- static void perform_member_init PARAMS ((tree, tree, int)); static void sort_base_init PARAMS ((tree, tree, tree *, tree *)); static tree build_builtin_delete_call PARAMS ((tree)); ! static int member_init_ok_or_else PARAMS ((tree, tree, tree)); static void expand_virtual_init PARAMS ((tree, tree)); static tree sort_member_init PARAMS ((tree, tree)); static tree initializing_context PARAMS ((tree)); *************** begin_init_stmts (stmt_expr_p, compound_ *** 97,106 **** if (building_stmt_tree ()) *compound_stmt_p = begin_compound_stmt (/*has_no_scope=*/1); - /* - else - *compound_stmt_p = genrtl_begin_compound_stmt (has_no_scope=1); - */ } /* Finish out the statement-expression begun by the previous call to --- 97,102 ---- *************** finish_init_stmts (stmt_expr, compound_s *** 116,122 **** finish_compound_stmt (/*has_no_scope=*/1, compound_stmt); if (building_stmt_tree ()) ! stmt_expr = finish_stmt_expr (stmt_expr); else stmt_expr = finish_global_stmt_expr (stmt_expr); --- 112,121 ---- finish_compound_stmt (/*has_no_scope=*/1, compound_stmt); if (building_stmt_tree ()) ! { ! stmt_expr = finish_stmt_expr (stmt_expr); ! STMT_EXPR_NO_SCOPE (stmt_expr) = true; ! } else stmt_expr = finish_global_stmt_expr (stmt_expr); *************** finish_init_stmts (stmt_expr, compound_s *** 130,136 **** /* Constructors */ ! /* Called from initialize_vtbl_ptrs via dfs_walk. */ static tree dfs_initialize_vtbl_ptrs (binfo, data) --- 129,137 ---- /* Constructors */ ! /* Called from initialize_vtbl_ptrs via dfs_walk. BINFO is the base ! which we want to initialize the vtable pointer for, DATA is ! TREE_LIST whose TREE_VALUE is the this ptr expression. */ static tree dfs_initialize_vtbl_ptrs (binfo, data) *************** dfs_initialize_vtbl_ptrs (binfo, data) *** 142,157 **** { tree base_ptr = TREE_VALUE ((tree) data); ! if (TREE_VIA_VIRTUAL (binfo)) ! base_ptr = convert_pointer_to_vbase (BINFO_TYPE (binfo), ! base_ptr); ! else ! base_ptr ! = build_vbase_path (PLUS_EXPR, ! build_pointer_type (BINFO_TYPE (binfo)), ! base_ptr, ! binfo, ! /*nonnull=*/1); expand_virtual_init (binfo, base_ptr); } --- 143,149 ---- { tree base_ptr = TREE_VALUE ((tree) data); ! base_ptr = build_base_path (PLUS_EXPR, base_ptr, binfo, /*nonnull=*/1); expand_virtual_init (binfo, base_ptr); } *************** initialize_vtbl_ptrs (addr) *** 175,195 **** list = build_tree_list (type, addr); /* Walk through the hierarchy, initializing the vptr in each base ! class. We do these in pre-order because under the new ABI we ! can't find the virtual bases for a class until we've initialized ! the vtbl for that class. */ dfs_walk_real (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, dfs_unmarked_real_bases_queue_p, list); dfs_walk (TYPE_BINFO (type), dfs_unmark, dfs_marked_real_bases_queue_p, type); - - /* If we're not using thunks, we may need to adjust the deltas in - the vtable to handle virtual base classes correctly. When we are - using thunks, we either use construction vtables (which are - preloaded with the right answers) or nothing (in which case - vitual function calls sometimes don't work right.) */ - if (TYPE_USES_VIRTUAL_BASECLASSES (type) && !flag_vtable_thunks) - fixup_all_virtual_upcast_offsets (addr); } /* [dcl.init]: --- 167,179 ---- list = build_tree_list (type, addr); /* Walk through the hierarchy, initializing the vptr in each base ! class. We do these in pre-order because can't find the virtual ! bases for a class until we've initialized the vtbl for that ! class. */ dfs_walk_real (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, dfs_unmarked_real_bases_queue_p, list); dfs_walk (TYPE_BINFO (type), dfs_unmark, dfs_marked_real_bases_queue_p, type); } /* [dcl.init]: *************** perform_member_init (member, init, expli *** 296,308 **** { init = build_default_init (type); if (TREE_CODE (type) == REFERENCE_TYPE) ! cp_warning ("default-initialization of `%#D', which has reference type", member); } /* member traversal: note it leaves init NULL */ else if (TREE_CODE (type) == REFERENCE_TYPE) ! cp_pedwarn ("uninitialized reference member `%D'", member); } else if (TREE_CODE (init) == TREE_LIST) { --- 280,292 ---- { init = build_default_init (type); if (TREE_CODE (type) == REFERENCE_TYPE) ! warning ("default-initialization of `%#D', which has reference type", member); } /* member traversal: note it leaves init NULL */ else if (TREE_CODE (type) == REFERENCE_TYPE) ! pedwarn ("uninitialized reference member `%D'", member); } else if (TREE_CODE (init) == TREE_LIST) { *************** sort_member_init (t, member_init_list) *** 440,446 **** /* If there was already an explicit initializer for this field, issue an error. */ if (TREE_TYPE (f)) ! cp_error ("multiple initializations given for member `%D'", initialized_field); else { --- 424,430 ---- /* If there was already an explicit initializer for this field, issue an error. */ if (TREE_TYPE (f)) ! error ("multiple initializations given for member `%D'", initialized_field); else { *************** sort_member_init (t, member_init_list) *** 512,518 **** if (same_type_p (last_field_type, field_type)) { if (TREE_CODE (field_type) == UNION_TYPE) ! cp_error ("initializations for multiple members of `%T'", last_field_type); done = 1; break; --- 496,502 ---- if (same_type_p (last_field_type, field_type)) { if (TREE_CODE (field_type) == UNION_TYPE) ! error ("initializations for multiple members of `%T'", last_field_type); done = 1; break; *************** sort_base_init (t, base_init_list, rbase *** 565,632 **** tree vbases = NULL_TREE; /* First walk through and splice out vbase and invalid initializers. ! Also replace names with binfos. */ last = tree_cons (NULL_TREE, NULL_TREE, base_init_list); for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x)) { tree basetype = TREE_PURPOSE (x); ! tree binfo = NULL_TREE; ! if (basetype == NULL_TREE) { ! /* Initializer for single base class. Must not ! use multiple inheritance or this is ambiguous. */ ! switch (n_baseclasses) ! { ! case 0: ! cp_error ("`%T' does not have a base class to initialize", ! current_class_type); ! return; ! case 1: ! break; ! default: ! cp_error ("unnamed initializer ambiguous for `%T' which uses multiple inheritance", ! current_class_type); ! return; ! } ! binfo = TREE_VEC_ELT (binfos, 0); } ! else if (is_aggr_type (basetype, 1)) { ! binfo = binfo_or_else (basetype, t); ! if (binfo == NULL_TREE) ! continue; ! /* Virtual base classes are special cases. Their initializers ! are recorded with this constructor, and they are used when ! this constructor is the top-level constructor called. */ ! if (TREE_VIA_VIRTUAL (binfo)) ! { ! tree v = binfo_for_vbase (BINFO_TYPE (binfo), t); ! vbases = tree_cons (v, TREE_VALUE (x), vbases); ! continue; ! } ! else ! { ! /* Otherwise, if it is not an immediate base class, complain. */ ! for (i = n_baseclasses-1; i >= 0; i--) ! if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i))) ! break; ! if (i < 0) ! { ! cp_error ("`%T' is not an immediate base class of `%T'", ! basetype, current_class_type); ! continue; ! } ! } } - else - my_friendly_abort (365); - - TREE_PURPOSE (x) = binfo; - TREE_CHAIN (last) = x; - last = x; } TREE_CHAIN (last) = NULL_TREE; --- 549,588 ---- tree vbases = NULL_TREE; /* First walk through and splice out vbase and invalid initializers. ! Also replace types with binfos. */ last = tree_cons (NULL_TREE, NULL_TREE, base_init_list); for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x)) { tree basetype = TREE_PURPOSE (x); ! tree binfo = (TREE_CODE (basetype) == TREE_VEC ! ? basetype : binfo_or_else (basetype, t)); ! ! if (binfo == NULL_TREE) ! /* BASETYPE might be an inaccessible direct base (because it ! is also an indirect base). */ ! continue; ! if (TREE_VIA_VIRTUAL (binfo)) { ! /* Virtual base classes are special cases. Their ! initializers are recorded with this constructor, and they ! are used when this constructor is the top-level ! constructor called. */ ! tree v = binfo_for_vbase (BINFO_TYPE (binfo), t); ! vbases = tree_cons (v, TREE_VALUE (x), vbases); } ! else { ! /* Otherwise, it must be an immediate base class. */ ! my_friendly_assert ! (same_type_p (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo)), ! t), 20011113); ! TREE_PURPOSE (x) = binfo; ! TREE_CHAIN (last) = x; ! last = x; } } TREE_CHAIN (last) = NULL_TREE; *************** sort_base_init (t, base_init_list, rbase *** 671,677 **** } else if (binfo == base_binfo) { ! cp_error ("base class `%T' already initialized", BINFO_TYPE (binfo)); break; } --- 627,633 ---- } else if (binfo == base_binfo) { ! error ("base class `%T' already initialized", BINFO_TYPE (binfo)); break; } *************** emit_base_init (mem_init_list, base_init *** 742,756 **** init = NULL_TREE; if (extra_warnings && DECL_COPY_CONSTRUCTOR_P (current_function_decl)) ! cp_warning ("base class `%#T' should be explicitly initialized in the copy constructor", BINFO_TYPE (base_binfo)); } if (init != void_list_node) { ! member = convert_pointer_to_real (base_binfo, current_class_ptr); expand_aggr_init_1 (base_binfo, NULL_TREE, ! build_indirect_ref (member, NULL_PTR), init, LOOKUP_NORMAL); } --- 698,713 ---- init = NULL_TREE; if (extra_warnings && DECL_COPY_CONSTRUCTOR_P (current_function_decl)) ! warning ("base class `%#T' should be explicitly initialized in the copy constructor", BINFO_TYPE (base_binfo)); } if (init != void_list_node) { ! member = build_base_path (PLUS_EXPR, current_class_ptr, ! base_binfo, 1); expand_aggr_init_1 (base_binfo, NULL_TREE, ! build_indirect_ref (member, NULL), init, LOOKUP_NORMAL); } *************** emit_base_init (mem_init_list, base_init *** 784,790 **** if (warn_ecpp && init == NULL_TREE && !DECL_ARTIFICIAL (member) && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE) ! cp_warning ("`%D' should be initialized in the member initialization list", member); } perform_member_init (member, init, from_init_list); --- 741,747 ---- if (warn_ecpp && init == NULL_TREE && !DECL_ARTIFICIAL (member) && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE) ! warning ("`%D' should be initialized in the member initialization list", member); } perform_member_init (member, init, from_init_list); *************** static void *** 839,858 **** expand_virtual_init (binfo, decl) tree binfo, decl; { - tree type = BINFO_TYPE (binfo); tree vtbl, vtbl_ptr; - tree vtype, vtype_binfo; tree vtt_index; - /* Compute the location of the vtable. */ - vtype = DECL_CONTEXT (TYPE_VFIELD (type)); - vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0); - /* Compute the initializer for vptr. */ vtbl = build_vtbl_address (binfo); ! /* Under the new ABI, we may get this vptr from a VTT, if this is a ! subobject constructor or subobject destructor. */ vtt_index = BINFO_VPTR_INDEX (binfo); if (vtt_index) { --- 796,809 ---- expand_virtual_init (binfo, decl) tree binfo, decl; { tree vtbl, vtbl_ptr; tree vtt_index; /* Compute the initializer for vptr. */ vtbl = build_vtbl_address (binfo); ! /* We may get this vptr from a VTT, if this is a subobject ! constructor or subobject destructor. */ vtt_index = BINFO_VPTR_INDEX (binfo); if (vtt_index) { *************** expand_virtual_init (binfo, decl) *** 879,888 **** } /* Compute the location of the vtpr. */ ! decl = convert_pointer_to_real (vtype_binfo, decl); ! vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype); ! if (vtbl_ptr == error_mark_node) ! return; /* Assign the vtable to the vptr. */ vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0); --- 830,838 ---- } /* Compute the location of the vtpr. */ ! vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL), ! TREE_TYPE (binfo)); ! my_friendly_assert (vtbl_ptr != error_mark_node, 20010730); /* Assign the vtable to the vptr. */ vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0); *************** expand_aggr_vbase_init_1 (binfo, exp, ad *** 925,931 **** tree binfo, exp, addr, init_list; { tree init = purpose_member (binfo, init_list); ! tree ref = build_indirect_ref (addr, NULL_PTR); if (init) init = TREE_VALUE (init); --- 875,881 ---- tree binfo, exp, addr, init_list; { tree init = purpose_member (binfo, init_list); ! tree ref = build_indirect_ref (addr, NULL); if (init) init = TREE_VALUE (init); *************** construct_virtual_bases (type, this_ref, *** 951,972 **** /* If there are no virtual baseclasses, we shouldn't even be here. */ my_friendly_assert (TYPE_USES_VIRTUAL_BASECLASSES (type), 19990621); - /* First set the pointers in our object that tell us where to find - our virtual baseclasses. */ - if (!vbase_offsets_in_vtable_p ()) - { - tree if_stmt; - tree result; - - if_stmt = begin_if_stmt (); - finish_if_stmt_cond (flag, if_stmt); - result = init_vbase_pointers (type, this_ptr); - if (result) - finish_expr_stmt (build_compound_expr (result)); - finish_then_clause (if_stmt); - finish_if_stmt (); - } - /* Now, run through the baseclasses, initializing each. */ for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; vbases = TREE_CHAIN (vbases)) --- 901,906 ---- *************** static int *** 1043,1061 **** member_init_ok_or_else (field, type, member_name) tree field; tree type; ! const char *member_name; { if (field == error_mark_node) return 0; if (field == NULL_TREE || initializing_context (field) != type) { ! cp_error ("class `%T' does not have any field named `%s'", type, member_name); return 0; } if (TREE_STATIC (field)) { ! cp_error ("field `%#D' is static; only point of initialization is its declaration", field); return 0; } --- 977,995 ---- member_init_ok_or_else (field, type, member_name) tree field; tree type; ! tree member_name; { if (field == error_mark_node) return 0; if (field == NULL_TREE || initializing_context (field) != type) { ! error ("class `%T' does not have any field named `%D'", type, member_name); return 0; } if (TREE_STATIC (field)) { ! error ("field `%#D' is static; the only point of initialization is its definition", field); return 0; } *************** member_init_ok_or_else (field, type, mem *** 1063,1079 **** return 1; } ! /* If NAME is a viable field name for the aggregate DECL, ! and PARMS is a viable parameter list, then expand an _EXPR ! which describes this initialization. ! ! Note that we do not need to chase through the class's base classes ! to look for NAME, because if it's in that list, it will be handled ! by the constructor for that base class. ! We do not yet have a fixed-point finder to instantiate types ! being fed to overloaded constructors. If there is a unique ! constructor, then argument types can be got from that one. */ tree expand_member_init (exp, name, init) --- 997,1012 ---- return 1; } ! /* EXP is an expression of aggregate type. NAME is an IDENTIFIER_NODE ! which names a field, or it is a _TYPE node or TYPE_DECL which names ! a base for that type. INIT is a parameter list for that field's or ! base's constructor. Check the validity of NAME, and return a ! TREE_LIST of the base _TYPE or FIELD_DECL and the INIT. EXP is used ! only to get its type. If NAME is invalid, return NULL_TREE and ! issue a diagnostic. ! An old style unnamed direct single base construction is permitted, ! where NAME is NULL. */ tree expand_member_init (exp, name, init) *************** expand_member_init (exp, name, init) *** 1086,1157 **** return NULL_TREE; type = TYPE_MAIN_VARIANT (TREE_TYPE (exp)); ! if (name && TYPE_P (name)) { ! basetype = name; ! name = TYPE_IDENTIFIER (name); } ! else if (name && TREE_CODE (name) == TYPE_DECL) { ! basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name)); ! name = DECL_NAME (name); } ! ! if (name == NULL_TREE && IS_AGGR_TYPE (type)) ! switch (CLASSTYPE_N_BASECLASSES (type)) ! { ! case 0: ! error ("base class initializer specified, but no base class to initialize"); ! return NULL_TREE; ! case 1: ! basetype = TYPE_BINFO_BASETYPE (type, 0); ! break; ! default: ! error ("initializer for unnamed base class ambiguous"); ! cp_error ("(type `%T' uses multiple inheritance)", type); ! return NULL_TREE; ! } my_friendly_assert (init != NULL_TREE, 0); - /* The grammar should not allow fields which have names that are - TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we - may assume that this is an attempt to initialize a base class - member of the current type. Otherwise, it is an attempt to - initialize a member field. */ - if (init == void_type_node) init = NULL_TREE; ! if (name == NULL_TREE || basetype) { ! if (name == NULL_TREE) ! { ! #if 0 ! if (basetype) ! name = TYPE_IDENTIFIER (basetype); ! else ! { ! error ("no base class to initialize"); ! return; ! } ! #endif ! } ! else if (basetype != type ! && ! current_template_parms ! && ! vec_binfo_member (basetype, ! TYPE_BINFO_BASETYPES (type)) ! && ! binfo_for_vbase (basetype, type)) { - if (IDENTIFIER_CLASS_VALUE (name)) - goto try_member; if (TYPE_USES_VIRTUAL_BASECLASSES (type)) ! cp_error ("type `%T' is not an immediate or virtual basetype for `%T'", ! basetype, type); else ! cp_error ("type `%T' is not an immediate basetype for `%T'", ! basetype, type); return NULL_TREE; } --- 1019,1074 ---- return NULL_TREE; type = TYPE_MAIN_VARIANT (TREE_TYPE (exp)); + my_friendly_assert (IS_AGGR_TYPE (type), 20011113); ! if (!name) { ! /* This is an obsolete unnamed base class initializer. The ! parser will already have warned about its use. */ ! switch (CLASSTYPE_N_BASECLASSES (type)) ! { ! case 0: ! error ("unnamed initializer for `%T', which has no base classes", ! type); ! return NULL_TREE; ! case 1: ! basetype = TYPE_BINFO_BASETYPE (type, 0); ! break; ! default: ! error ("unnamed initializer for `%T', which uses multiple inheritance", ! type); ! return NULL_TREE; ! } } ! else if (TYPE_P (name)) { ! basetype = name; ! name = TYPE_NAME (name); } ! else if (TREE_CODE (name) == TYPE_DECL) ! basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name)); my_friendly_assert (init != NULL_TREE, 0); if (init == void_type_node) init = NULL_TREE; ! if (basetype) { ! if (current_template_parms) ! ; ! else if (vec_binfo_member (basetype, TYPE_BINFO_BASETYPES (type))) ! /* A direct base. */; ! else if (binfo_for_vbase (basetype, type)) ! /* A virtual base. */; ! else { if (TYPE_USES_VIRTUAL_BASECLASSES (type)) ! error ("type `%D' is not a direct or virtual base of `%T'", ! name, type); else ! error ("type `%D' is not a direct base of `%T'", ! name, type); return NULL_TREE; } *************** expand_member_init (exp, name, init) *** 1159,1168 **** } else { - try_member: field = lookup_field (type, name, 1, 0); ! if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name))) return NULL_TREE; init = build_tree_list (field, init); --- 1076,1084 ---- } else { field = lookup_field (type, name, 1, 0); ! if (! member_init_ok_or_else (field, type, name)) return NULL_TREE; init = build_tree_list (field, init); *************** build_aggr_init (exp, init, flags) *** 1245,1254 **** COMPLEX zees(1.0, 0.0)[10]; } */ ! cp_error ("bad array initializer"); return error_mark_node; } ! if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED) { TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); if (init) --- 1161,1170 ---- COMPLEX zees(1.0, 0.0)[10]; } */ ! error ("bad array initializer"); return error_mark_node; } ! if (cp_type_quals (type) != TYPE_UNQUALIFIED) { TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); if (init) *************** is_aggr_type (type, or_else) *** 1437,1443 **** && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM) { if (or_else) ! cp_error ("`%T' is not an aggregate type", type); return 0; } return 1; --- 1353,1359 ---- && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM) { if (or_else) ! error ("`%T' is not an aggregate type", type); return 0; } return 1; *************** get_aggr_from_typedef (name, or_else) *** 1460,1466 **** else { if (or_else) ! cp_error ("`%T' fails to be an aggregate typedef", name); return NULL_TREE; } --- 1376,1382 ---- else { if (or_else) ! error ("`%T' fails to be an aggregate typedef", name); return NULL_TREE; } *************** get_aggr_from_typedef (name, or_else) *** 1469,1475 **** && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM) { if (or_else) ! cp_error ("type `%T' is of non-aggregate type", type); return NULL_TREE; } return type; --- 1385,1391 ---- && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM) { if (or_else) ! error ("type `%T' is of non-aggregate type", type); return NULL_TREE; } return type; *************** build_member_call (type, name, parmlist) *** 1527,1535 **** if (DECL_P (name)) name = DECL_NAME (name); - if (type == fake_std_node) - return build_x_function_call (do_scoped_id (name, 0), parmlist, - current_class_ref); if (TREE_CODE (type) == NAMESPACE_DECL) return build_x_function_call (lookup_namespace_name (type, name), parmlist, current_class_ref); --- 1443,1448 ---- *************** build_member_call (type, name, parmlist) *** 1560,1566 **** tree ns = lookup_name (type, 0); if (ns && TREE_CODE (ns) == NAMESPACE_DECL) { ! return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref); } } --- 1473,1480 ---- tree ns = lookup_name (type, 0); if (ns && TREE_CODE (ns) == NAMESPACE_DECL) { ! return build_x_function_call (build_offset_ref (type, name), ! parmlist, current_class_ref); } } *************** build_member_call (type, name, parmlist) *** 1573,1579 **** if (dtor) { ! cp_error ("cannot call destructor `%T::~%T' without object", type, method_name); return error_mark_node; } --- 1487,1493 ---- if (dtor) { ! error ("cannot call destructor `%T::~%T' without object", type, method_name); return error_mark_node; } *************** build_member_call (type, name, parmlist) *** 1581,1590 **** decl = maybe_dummy_object (type, &basetype_path); /* Convert 'this' to the specified type to disambiguate conversion ! to the function's context. Apparently Standard C++ says that we ! shouldn't do this. */ if (decl == current_class_ref - && ! pedantic && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type)) { tree olddecl = current_class_ptr; --- 1495,1502 ---- decl = maybe_dummy_object (type, &basetype_path); /* Convert 'this' to the specified type to disambiguate conversion ! to the function's context. */ if (decl == current_class_ref && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type)) { tree olddecl = current_class_ptr; *************** build_member_call (type, name, parmlist) *** 1593,1599 **** { tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype)); decl = convert_force (build_pointer_type (newtype), olddecl, 0); ! decl = build_indirect_ref (decl, NULL_PTR); } } --- 1505,1511 ---- { tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype)); decl = convert_force (build_pointer_type (newtype), olddecl, 0); ! decl = build_indirect_ref (decl, NULL); } } *************** build_member_call (type, name, parmlist) *** 1615,1621 **** { if (is_dummy_object (decl)) { ! cp_error ("invalid use of non-static field `%D'", t); return error_mark_node; } decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t); --- 1527,1533 ---- { if (is_dummy_object (decl)) { ! error ("invalid use of non-static field `%D'", t); return error_mark_node; } decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t); *************** build_member_call (type, name, parmlist) *** 1624,1630 **** decl = t; else { ! cp_error ("invalid use of member `%D'", t); return error_mark_node; } if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl))) --- 1536,1542 ---- decl = t; else { ! error ("invalid use of member `%D'", t); return error_mark_node; } if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl))) *************** build_member_call (type, name, parmlist) *** 1634,1640 **** } else { ! cp_error ("no method `%T::%D'", type, name); return error_mark_node; } } --- 1546,1552 ---- } else { ! error ("no method `%T::%D'", type, name); return error_mark_node; } } *************** build_offset_ref (type, name) *** 1662,1670 **** if (TREE_CODE (name) == TEMPLATE_DECL) return name; - if (type == fake_std_node) - return do_scoped_id (name, 0); - if (processing_template_decl || uses_template_parms (type)) return build_min_nt (SCOPE_REF, type, name); --- 1574,1579 ---- *************** build_offset_ref (type, name) *** 1722,1728 **** if (TREE_CODE (name) == BIT_NOT_EXPR) { if (! check_dtor_name (type, name)) ! cp_error ("qualified type `%T' does not match destructor name `~%T'", type, TREE_OPERAND (name, 0)); name = dtor_identifier; } --- 1631,1637 ---- if (TREE_CODE (name) == BIT_NOT_EXPR) { if (! check_dtor_name (type, name)) ! error ("qualified type `%T' does not match destructor name `~%T'", type, TREE_OPERAND (name, 0)); name = dtor_identifier; } *************** build_offset_ref (type, name) *** 1730,1736 **** if (!COMPLETE_TYPE_P (complete_type (type)) && !TYPE_BEING_DEFINED (type)) { ! cp_error ("incomplete type `%T' does not have member `%D'", type, name); return error_mark_node; } --- 1639,1645 ---- if (!COMPLETE_TYPE_P (complete_type (type)) && !TYPE_BEING_DEFINED (type)) { ! error ("incomplete type `%T' does not have member `%D'", type, name); return error_mark_node; } *************** build_offset_ref (type, name) *** 1799,1805 **** if (t == NULL_TREE) { ! cp_error ("`%D' is not a member of type `%T'", name, type); return error_mark_node; } --- 1708,1714 ---- if (t == NULL_TREE) { ! error ("`%D' is not a member of type `%T'", name, type); return error_mark_node; } *************** build_offset_ref (type, name) *** 1818,1831 **** if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t)) { ! cp_error ("illegal pointer to bit field `%D'", t); return error_mark_node; } /* static class functions too. */ if (TREE_CODE (t) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) ! my_friendly_abort (53); /* In member functions, the form `type::name' is no longer equivalent to `this->type::name', at least not until --- 1727,1740 ---- if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t)) { ! error ("illegal pointer to bit-field `%D'", t); return error_mark_node; } /* static class functions too. */ if (TREE_CODE (t) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) ! abort (); /* In member functions, the form `type::name' is no longer equivalent to `this->type::name', at least not until *************** resolve_offset_ref (exp) *** 1907,1915 **** if (TREE_CODE (member) == FIELD_DECL && (base == current_class_ref || is_dummy_object (base))) { ! tree expr; ! ! basetype = DECL_CONTEXT (member); /* Try to get to basetype from 'this'; if that doesn't work, nothing will. */ --- 1816,1822 ---- if (TREE_CODE (member) == FIELD_DECL && (base == current_class_ref || is_dummy_object (base))) { ! tree binfo = TYPE_BINFO (current_class_type); /* Try to get to basetype from 'this'; if that doesn't work, nothing will. */ *************** resolve_offset_ref (exp) *** 1917,1933 **** /* First convert to the intermediate base specified, if appropriate. */ if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE) ! base = build_scoped_ref (base, TYPE_OFFSET_BASETYPE (type)); ! ! addr = build_unary_op (ADDR_EXPR, base, 0); ! addr = convert_pointer_to (basetype, addr); ! ! if (addr == error_mark_node) ! return error_mark_node; ! expr = build (COMPONENT_REF, TREE_TYPE (member), ! build_indirect_ref (addr, NULL_PTR), member); ! return convert_from_reference (expr); } /* Ensure that we have an object. */ --- 1824,1838 ---- /* First convert to the intermediate base specified, if appropriate. */ if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE) ! { ! binfo = binfo_or_else (TYPE_OFFSET_BASETYPE (type), ! current_class_type); ! if (!binfo) ! return error_mark_node; ! base = build_base_path (PLUS_EXPR, base, binfo, 1); ! } ! return build_component_ref (base, member, binfo, 1); } /* Ensure that we have an object. */ *************** resolve_offset_ref (exp) *** 1944,1955 **** { if (addr == error_mark_node) { ! cp_error ("object missing in `%E'", exp); return error_mark_node; } basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member))); ! addr = convert_pointer_to (basetype, addr); member = cp_convert (ptrdiff_type_node, member); addr = build (PLUS_EXPR, build_pointer_type (type), addr, member); --- 1849,1863 ---- { if (addr == error_mark_node) { ! error ("object missing in `%E'", exp); return error_mark_node; } basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member))); ! basetype = lookup_base (TREE_TYPE (TREE_TYPE (addr)), ! basetype, ba_check, NULL); ! addr = build_base_path (PLUS_EXPR, addr, basetype, 1); ! member = cp_convert (ptrdiff_type_node, member); addr = build (PLUS_EXPR, build_pointer_type (type), addr, member); *************** resolve_offset_ref (exp) *** 1959,1965 **** { return get_member_function_from_ptrfunc (&addr, member); } ! my_friendly_abort (56); /* NOTREACHED */ return NULL_TREE; } --- 1867,1873 ---- { return get_member_function_from_ptrfunc (&addr, member); } ! abort (); /* NOTREACHED */ return NULL_TREE; } *************** build_new (placement, decl, init, use_gl *** 2048,2054 **** nelts = integer_one_node; if (absdcl && TREE_CODE (absdcl) == CALL_EXPR) ! my_friendly_abort (215); while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF) { last_absdcl = absdcl; --- 1956,1962 ---- nelts = integer_one_node; if (absdcl && TREE_CODE (absdcl) == CALL_EXPR) ! abort (); while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF) { last_absdcl = absdcl; *************** build_new (placement, decl, init, use_gl *** 2080,2087 **** } else { ! int flags = pedantic ? WANT_INT : (WANT_INT | WANT_ENUM); ! if (build_expr_type_conversion (flags, this_nelts, 0) == NULL_TREE) pedwarn ("size in array new must have integral type"); --- 1988,1995 ---- } else { ! if (build_expr_type_conversion (WANT_INT | WANT_ENUM, ! this_nelts, 0) == NULL_TREE) pedwarn ("size in array new must have integral type"); *************** tree *** 2199,2205 **** build_java_class_ref (type) tree type; { ! tree name, class_decl; static tree CL_suffix = NULL_TREE; if (CL_suffix == NULL_TREE) CL_suffix = get_identifier("class$"); --- 2107,2113 ---- build_java_class_ref (type) tree type; { ! tree name = NULL_TREE, class_decl; static tree CL_suffix = NULL_TREE; if (CL_suffix == NULL_TREE) CL_suffix = get_identifier("class$"); *************** build_java_class_ref (type) *** 2212,2218 **** jclass_node = TREE_TYPE (jclass_node); } ! /* Mangle the class$ field, new and old ABI */ { tree field; for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) --- 2120,2126 ---- jclass_node = TREE_TYPE (jclass_node); } ! /* Mangle the class$ field */ { tree field; for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) *************** build_java_class_ref (type) *** 2223,2229 **** break; } if (!field) ! internal_error ("Can't find class$"); } class_decl = IDENTIFIER_GLOBAL_VALUE (name); --- 2131,2137 ---- break; } if (!field) ! internal_error ("can't find class$"); } class_decl = IDENTIFIER_GLOBAL_VALUE (name); *************** build_java_class_ref (type) *** 2236,2242 **** DECL_ARTIFICIAL (class_decl) = 1; DECL_IGNORED_P (class_decl) = 1; pushdecl_top_level (class_decl); ! make_decl_rtl (class_decl, NULL_PTR); } return class_decl; } --- 2144,2150 ---- DECL_ARTIFICIAL (class_decl) = 1; DECL_IGNORED_P (class_decl) = 1; pushdecl_top_level (class_decl); ! make_decl_rtl (class_decl, NULL); } return class_decl; } *************** get_cookie_size (type) *** 2251,2258 **** { tree cookie_size; ! /* Under the new ABI, we need to allocate an additional max ! (sizeof (size_t), alignof (true_type)) bytes. */ tree sizetype_size; tree type_align; --- 2159,2166 ---- { tree cookie_size; ! /* We need to allocate an additional max (sizeof (size_t), alignof ! (true_type)) bytes. */ tree sizetype_size; tree type_align; *************** build_new_1 (exp) *** 2278,2283 **** --- 2186,2192 ---- tree full_type; tree nelts = NULL_TREE; tree alloc_call, alloc_expr, alloc_node; + tree alloc_fn; tree cookie_expr, init_expr; int has_array = 0; enum tree_code code; *************** build_new_1 (exp) *** 2332,2338 **** size = size_in_bytes (true_type); if (has_array) ! size = fold (cp_build_binary_op (MULT_EXPR, size, nelts)); if (TREE_CODE (true_type) == VOID_TYPE) { --- 2241,2247 ---- size = size_in_bytes (true_type); if (has_array) ! size = size_binop (MULT_EXPR, size, convert (sizetype, nelts)); if (TREE_CODE (true_type) == VOID_TYPE) { *************** build_new_1 (exp) *** 2359,2368 **** if (!has_array || !TYPE_VEC_NEW_USES_COOKIE (true_type)) use_cookie = 0; /* When using placement new, users may not realize that they need ! the extra storage. Under the old ABI, we don't allocate the ! cookie whenever they use one placement argument of type `void ! *'. Under the new ABI, we require that the operator called be ! the global placement operator delete[]. */ else if (placement && !TREE_CHAIN (placement) && same_type_p (TREE_TYPE (TREE_VALUE (placement)), ptr_type_node)) --- 2268,2275 ---- if (!has_array || !TYPE_VEC_NEW_USES_COOKIE (true_type)) use_cookie = 0; /* When using placement new, users may not realize that they need ! the extra storage. We require that the operator called be ! the global placement operator new[]. */ else if (placement && !TREE_CHAIN (placement) && same_type_p (TREE_TYPE (TREE_VALUE (placement)), ptr_type_node)) *************** build_new_1 (exp) *** 2386,2392 **** tree class_addr, alloc_decl; tree class_decl = build_java_class_ref (true_type); tree class_size = size_in_bytes (true_type); ! static char alloc_name[] = "_Jv_AllocObject"; use_java_new = 1; alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name)); if (alloc_decl == NULL_TREE) --- 2293,2299 ---- tree class_addr, alloc_decl; tree class_decl = build_java_class_ref (true_type); tree class_size = size_in_bytes (true_type); ! static const char alloc_name[] = "_Jv_AllocObject"; use_java_new = 1; alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name)); if (alloc_decl == NULL_TREE) *************** build_new_1 (exp) *** 2420,2432 **** if (alloc_call == error_mark_node) return error_mark_node; ! /* The ALLOC_CALL should be a CALL_EXPR, and the first operand ! should be the address of a known FUNCTION_DECL. */ ! my_friendly_assert (TREE_CODE (alloc_call) == CALL_EXPR, 20000521); ! t = TREE_OPERAND (alloc_call, 0); ! my_friendly_assert (TREE_CODE (t) == ADDR_EXPR, 20000521); ! t = TREE_OPERAND (t, 0); ! my_friendly_assert (TREE_CODE (t) == FUNCTION_DECL, 20000521); /* Now, check to see if this function is actually a placement allocation function. This can happen even when PLACEMENT is NULL because we might have something like: --- 2327,2340 ---- if (alloc_call == error_mark_node) return error_mark_node; ! /* The ALLOC_CALL should be a CALL_EXPR -- or a COMPOUND_EXPR whose ! right-hand-side is ultimately a CALL_EXPR -- and the first ! operand should be the address of a known FUNCTION_DECL. */ ! t = alloc_call; ! while (TREE_CODE (t) == COMPOUND_EXPR) ! t = TREE_OPERAND (t, 1); ! alloc_fn = get_callee_fndecl (t); ! my_friendly_assert (alloc_fn != NULL_TREE, 20020325); /* Now, check to see if this function is actually a placement allocation function. This can happen even when PLACEMENT is NULL because we might have something like: *************** build_new_1 (exp) *** 2438,2444 **** one argument, or there are variable arguments, then this is a placement allocation function. */ placement_allocation_fn_p ! = (type_num_arguments (TREE_TYPE (t)) > 1 || varargs_function_p (t)); /* unless an allocation function is declared with an empty excep- tion-specification (_except.spec_), throw(), it indicates failure to --- 2346,2353 ---- one argument, or there are variable arguments, then this is a placement allocation function. */ placement_allocation_fn_p ! = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1 ! || varargs_function_p (alloc_fn)); /* unless an allocation function is declared with an empty excep- tion-specification (_except.spec_), throw(), it indicates failure to *************** build_new_1 (exp) *** 2450,2460 **** So check for a null exception spec on the op new we just called. */ ! /* The ADDR_EXPR. */ ! t = TREE_OPERAND (alloc_call, 0); ! /* The function. */ ! t = TREE_OPERAND (t, 0); ! nothrow = TYPE_NOTHROW_P (TREE_TYPE (t)); check_new = (flag_check_new || nothrow) && ! use_java_new; alloc_expr = alloc_call; --- 2359,2365 ---- So check for a null exception spec on the op new we just called. */ ! nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn)); check_new = (flag_check_new || nothrow) && ! use_java_new; alloc_expr = alloc_call; *************** build_new_1 (exp) *** 2478,2489 **** tree cookie; /* Store the number of bytes allocated so that we can know how ! many elements to destroy later. Under the new ABI, we use ! the last sizeof (size_t) bytes to store the number of ! elements. */ cookie = build (MINUS_EXPR, build_pointer_type (sizetype), alloc_node, size_in_bytes (sizetype)); ! cookie = build_indirect_ref (cookie, NULL_PTR); cookie_expr = build (MODIFY_EXPR, void_type_node, cookie, nelts); TREE_SIDE_EFFECTS (cookie_expr) = 1; --- 2383,2393 ---- tree cookie; /* Store the number of bytes allocated so that we can know how ! many elements to destroy later. We use the last sizeof ! (size_t) bytes to store the number of elements. */ cookie = build (MINUS_EXPR, build_pointer_type (sizetype), alloc_node, size_in_bytes (sizetype)); ! cookie = build_indirect_ref (cookie, NULL); cookie_expr = build (MODIFY_EXPR, void_type_node, cookie, nelts); TREE_SIDE_EFFECTS (cookie_expr) = 1; *************** build_new_1 (exp) *** 2495,2506 **** init_expr = NULL_TREE; if (TYPE_NEEDS_CONSTRUCTING (type) || init) { ! init_expr = build_indirect_ref (alloc_node, NULL_PTR); if (init == void_zero_node) init = build_default_init (full_type); else if (init && pedantic && has_array) ! cp_pedwarn ("ISO C++ forbids initialization in array new"); if (has_array) init_expr = build_vec_init (init_expr, init, 0); --- 2399,2410 ---- init_expr = NULL_TREE; if (TYPE_NEEDS_CONSTRUCTING (type) || init) { ! init_expr = build_indirect_ref (alloc_node, NULL); if (init == void_zero_node) init = build_default_init (full_type); else if (init && pedantic && has_array) ! pedwarn ("ISO C++ forbids initialization in array new"); if (has_array) init_expr = build_vec_init (init_expr, init, 0); *************** build_new_1 (exp) *** 2548,2560 **** tree cleanup; int flags = (LOOKUP_NORMAL | (globally_qualified_p * LOOKUP_GLOBAL)); /* The Standard is unclear here, but the right thing to do is to use the same method for finding deallocation functions that we use for finding allocation functions. */ flags |= LOOKUP_SPECULATIVELY; ! cleanup = build_op_delete_call (dcode, alloc_node, size, flags, (placement_allocation_fn_p ? alloc_call : NULL_TREE)); --- 2452,2473 ---- tree cleanup; int flags = (LOOKUP_NORMAL | (globally_qualified_p * LOOKUP_GLOBAL)); + tree delete_node; + + if (use_cookie) + /* Subtract the padding back out to get to the pointer returned + from operator new. */ + delete_node = fold (build (MINUS_EXPR, TREE_TYPE (alloc_node), + alloc_node, cookie_size)); + else + delete_node = alloc_node; /* The Standard is unclear here, but the right thing to do is to use the same method for finding deallocation functions that we use for finding allocation functions. */ flags |= LOOKUP_SPECULATIVELY; ! cleanup = build_op_delete_call (dcode, delete_node, size, flags, (placement_allocation_fn_p ? alloc_call : NULL_TREE)); *************** build_new_1 (exp) *** 2599,2605 **** } } else if (CP_TYPE_CONST_P (true_type)) ! cp_error ("uninitialized const in `new' of `%#T'", true_type); /* Now build up the return value in reverse order. */ --- 2512,2518 ---- } } else if (CP_TYPE_CONST_P (true_type)) ! error ("uninitialized const in `new' of `%#T'", true_type); /* Now build up the return value in reverse order. */ *************** build_vec_init (base, init, from_array) *** 3027,3033 **** else if (from) elt_init = build_modify_expr (to, NOP_EXPR, from); else ! my_friendly_abort (57); } else if (TREE_CODE (type) == ARRAY_TYPE) { --- 2940,2946 ---- else if (from) elt_init = build_modify_expr (to, NOP_EXPR, from); else ! abort (); } else if (TREE_CODE (type) == ARRAY_TYPE) { *************** build_dtor_call (exp, dtor_kind, flags) *** 3150,3156 **** break; default: ! my_friendly_abort (20000524); } return build_method_call (exp, name, NULL_TREE, NULL_TREE, flags); } --- 3063,3069 ---- break; default: ! abort (); } return build_method_call (exp, name, NULL_TREE, NULL_TREE, flags); } *************** build_dtor_call (exp, dtor_kind, flags) *** 3162,3170 **** sfk_deleting_destructor. FLAGS is the logical disjunction of zero or more LOOKUP_ ! flags. See cp-tree.h for more info. ! ! This function does not delete an object's virtual base classes. */ tree build_delete (type, addr, auto_delete, flags, use_global_delete) --- 3075,3081 ---- sfk_deleting_destructor. FLAGS is the logical disjunction of zero or more LOOKUP_ ! flags. See cp-tree.h for more info. */ tree build_delete (type, addr, auto_delete, flags, use_global_delete) *************** build_delete (type, addr, auto_delete, f *** 3173,3179 **** int flags; int use_global_delete; { - tree member; tree expr; if (addr == error_mark_node) --- 3084,3089 ---- *************** build_delete (type, addr, auto_delete, f *** 3241,3255 **** LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL), NULL_TREE); } ! ! /* Below, we will reverse the order in which these calls are made. ! If we have a destructor, then that destructor will take care ! of the base classes; otherwise, we must do that here. */ ! if (TYPE_HAS_DESTRUCTOR (type)) { tree do_delete = NULL_TREE; tree ifexp; /* For `::delete x', we must not use the deleting destructor since then we would not be sure to get the global `operator delete'. */ --- 3151,3163 ---- LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL), NULL_TREE); } ! else { tree do_delete = NULL_TREE; tree ifexp; + my_friendly_assert (TYPE_HAS_DESTRUCTOR (type), 20011213); + /* For `::delete x', we must not use the deleting destructor since then we would not be sure to get the global `operator delete'. */ *************** build_delete (type, addr, auto_delete, f *** 3280,3287 **** /* Call the complete object destructor. */ auto_delete = sfk_complete_destructor; } ! expr = build_dtor_call (build_indirect_ref (addr, NULL_PTR), auto_delete, flags); if (do_delete) expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete); --- 3188,3203 ---- /* Call the complete object destructor. */ auto_delete = sfk_complete_destructor; } + else if (auto_delete == sfk_deleting_destructor + && TYPE_GETS_REG_DELETE (type)) + { + /* Make sure we have access to the member op delete, even though + we'll actually be calling it from the destructor. */ + build_op_delete_call (DELETE_EXPR, addr, c_sizeof_nowarn (type), + LOOKUP_NORMAL, NULL_TREE); + } ! expr = build_dtor_call (build_indirect_ref (addr, NULL), auto_delete, flags); if (do_delete) expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete); *************** build_delete (type, addr, auto_delete, f *** 3299,3355 **** return expr; } ! else ! { ! /* We only get here from finish_function for a destructor. */ ! tree binfos = BINFO_BASETYPES (TYPE_BINFO (type)); ! int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (type); ! tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE; ! tree exprstmt = NULL_TREE; ! tree ref = build_indirect_ref (addr, NULL_PTR); ! /* Set this again before we call anything, as we might get called ! recursively. */ ! TYPE_HAS_DESTRUCTOR (type) = 1; ! /* If we have member delete or vbases, we call delete in ! finish_function. */ ! my_friendly_assert (auto_delete == sfk_base_destructor, 20000411); ! /* Take care of the remaining baseclasses. */ ! for (i = 0; i < n_baseclasses; i++) { ! base_binfo = TREE_VEC_ELT (binfos, i); ! if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)) ! || TREE_VIA_VIRTUAL (base_binfo)) ! continue; ! expr = build_scoped_method_call (ref, base_binfo, ! base_dtor_identifier, ! NULL_TREE); ! exprstmt = tree_cons (NULL_TREE, expr, exprstmt); ! } ! for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member)) { ! if (TREE_CODE (member) != FIELD_DECL) ! continue; ! if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member))) { ! tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0); ! tree this_type = TREE_TYPE (member); ! expr = build_delete (this_type, this_member, ! sfk_complete_destructor, flags, 0); ! exprstmt = tree_cons (NULL_TREE, expr, exprstmt); } } - - if (exprstmt) - return build_compound_expr (exprstmt); - /* Virtual base classes make this function do nothing. */ - return void_zero_node; } } /* For type TYPE, delete the virtual baseclass objects of DECL. */ --- 3215,3331 ---- return expr; } ! } ! /* At the end of a destructor, call the destructors for our base classes ! and members. ! Called from finish_destructor_body. */ ! void ! perform_base_cleanups () ! { ! tree binfos; ! int i, n_baseclasses; ! tree member; ! tree expr; ! tree member_destructions = NULL; ! tree vbase_destructions = NULL; ! ! for (member = TYPE_FIELDS (current_class_type); member; ! member = TREE_CHAIN (member)) ! { ! if (TREE_CODE (member) != FIELD_DECL) ! continue; ! if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member))) { ! tree this_member = (build_component_ref ! (current_class_ref, member, ! NULL_TREE, 0)); ! tree this_type = TREE_TYPE (member); ! expr = build_delete (this_type, this_member, ! sfk_complete_destructor, ! LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, ! 0); ! if (!member_destructions) ! member_destructions = expr; ! else ! member_destructions = build (COMPOUND_EXPR, ! TREE_TYPE (member_destructions), ! expr, ! member_destructions); ! } ! } ! if (member_destructions) ! finish_expr_stmt (member_destructions); ! binfos = BINFO_BASETYPES (TYPE_BINFO (current_class_type)); ! n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type); ! /* Take care of the remaining baseclasses. */ ! for (i = n_baseclasses - 1; i >= 0; i--) ! { ! tree base_binfo = TREE_VEC_ELT (binfos, i); ! if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)) ! || TREE_VIA_VIRTUAL (base_binfo)) ! continue; ! expr = build_scoped_method_call (current_class_ref, base_binfo, ! base_dtor_identifier, ! NULL_TREE); ! ! finish_expr_stmt (expr); ! } ! ! /* Run destructors for all virtual baseclasses. */ ! if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! { ! tree vbases; ! tree cond = (condition_conversion ! (build (BIT_AND_EXPR, integer_type_node, ! current_in_charge_parm, ! integer_two_node))); ! ! vbases = CLASSTYPE_VBASECLASSES (current_class_type); ! /* The CLASSTYPE_VBASECLASSES list is in initialization ! order, which is also the right order for pushing cleanups. */ ! for (; vbases; ! vbases = TREE_CHAIN (vbases)) { ! tree vbase = TREE_VALUE (vbases); ! tree base_type = BINFO_TYPE (vbase); ! ! if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (base_type)) { ! tree base_ptr_type = build_pointer_type (base_type); ! expr = current_class_ptr; ! ! /* Convert to the basetype here, as we know the layout is ! fixed. What is more, if we let build_method_call do it, ! it will use the vtable, which may have been clobbered ! by the deletion of our primary base. */ ! ! expr = build1 (NOP_EXPR, base_ptr_type, expr); ! expr = build (PLUS_EXPR, base_ptr_type, expr, ! BINFO_OFFSET (vbase)); ! expr = build_indirect_ref (expr, NULL); ! expr = build_method_call (expr, base_dtor_identifier, ! NULL_TREE, vbase, ! LOOKUP_NORMAL); ! expr = build (COND_EXPR, void_type_node, cond, ! expr, void_zero_node); ! if (!vbase_destructions) ! vbase_destructions = expr; ! else ! vbase_destructions = build (COMPOUND_EXPR, ! TREE_TYPE (vbase_destructions), ! expr, ! vbase_destructions); } } } + if (vbase_destructions) + finish_expr_stmt (vbase_destructions); } /* For type TYPE, delete the virtual baseclass objects of DECL. */ *************** build_vec_delete (base, maxindex, auto_d *** 3424,3430 **** build_pointer_type (sizetype), base, TYPE_SIZE_UNIT (sizetype)); ! maxindex = build_indirect_ref (cookie_addr, NULL_PTR); } else if (TREE_CODE (type) == ARRAY_TYPE) { --- 3400,3406 ---- build_pointer_type (sizetype), base, TYPE_SIZE_UNIT (sizetype)); ! maxindex = build_indirect_ref (cookie_addr, NULL); } else if (TREE_CODE (type) == ARRAY_TYPE) { diff -Nrc3pad gcc-3.0.4/gcc/cp/lang-options.h gcc-3.1/gcc/cp/lang-options.h *** gcc-3.0.4/gcc/cp/lang-options.h Thu Aug 2 14:23:12 2001 --- gcc-3.1/gcc/cp/lang-options.h Sat Dec 15 20:06:12 2001 *************** DEFINE_LANG_NAME ("C++") *** 61,67 **** N_("Scope of for-init-statement vars extends outside") }, { "-fgnu-keywords", "" }, { "-fno-gnu-keywords", ! N_("Do not recognise GNU defined keywords") }, { "-fhandle-exceptions", "" }, { "-fno-handle-exceptions", "" }, { "-fhuge-objects", --- 61,67 ---- N_("Scope of for-init-statement vars extends outside") }, { "-fgnu-keywords", "" }, { "-fno-gnu-keywords", ! N_("Do not recognize GNU defined keywords") }, { "-fhandle-exceptions", "" }, { "-fno-handle-exceptions", "" }, { "-fhuge-objects", *************** DEFINE_LANG_NAME ("C++") *** 84,90 **** N_("Don't pedwarn about uses of Microsoft extensions") }, { "-fno-ms-extensions", "" }, { "-foperator-names", ! N_("Recognise and/bitand/bitor/compl/not/or/xor") }, { "-fno-operator-names", "" }, { "-foptional-diags", "" }, { "-fno-optional-diags", --- 84,90 ---- N_("Don't pedwarn about uses of Microsoft extensions") }, { "-fno-ms-extensions", "" }, { "-foperator-names", ! N_("Recognize and/bitand/bitor/compl/not/or/xor") }, { "-fno-operator-names", "" }, { "-foptional-diags", "" }, { "-fno-optional-diags", *************** DEFINE_LANG_NAME ("C++") *** 103,109 **** { "-ftemplate-depth-", N_("Specify maximum template instantiation depth") }, { "-fuse-cxa-atexit", ! N_("Use __cxa_atexit to register destructors.") }, { "-fno-use-cxa-atexit", "" }, { "-fvtable-gc", N_("Discard unused virtual functions") }, --- 103,109 ---- { "-ftemplate-depth-", N_("Specify maximum template instantiation depth") }, { "-fuse-cxa-atexit", ! N_("Use __cxa_atexit to register destructors") }, { "-fno-use-cxa-atexit", "" }, { "-fvtable-gc", N_("Discard unused virtual functions") }, *************** DEFINE_LANG_NAME ("C++") *** 137,143 **** N_("Warn when the compiler reorders code") }, { "-Wno-reorder", "" }, { "-Wsynth", ! N_("Warn when synthesis behaviour differs from Cfront") }, { "-Wno-synth", "" }, { "-Wpmf-conversions", "" }, { "-Wno-pmf-conversions", --- 137,143 ---- N_("Warn when the compiler reorders code") }, { "-Wno-reorder", "" }, { "-Wsynth", ! N_("Warn when synthesis behavior differs from Cfront") }, { "-Wno-synth", "" }, { "-Wpmf-conversions", "" }, { "-Wno-pmf-conversions", diff -Nrc3pad gcc-3.0.4/gcc/cp/lang-specs.h gcc-3.1/gcc/cp/lang-specs.h *** gcc-3.0.4/gcc/cp/lang-specs.h Fri Jun 8 00:00:32 2001 --- gcc-3.1/gcc/cp/lang-specs.h Mon Mar 18 20:10:19 2002 *************** *** 1,5 **** /* Definitions for specs for C++. ! Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Definitions for specs for C++. ! Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 36,60 **** /* cc1plus has an integrated ISO C preprocessor. We should invoke the external preprocessor if -save-temps is given. */ "%{E|M|MM:cpp0 -lang-c++ %{!no-gcc:-D__GNUG__=%v1}\ ! %{!Wno-deprecated:-D__GXX_DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! %{!fno-new-abi:-D__GXX_ABI_VERSION=100}\ %{ansi:-D__STRICT_ANSI__ -trigraphs -$} %(cpp_options)}\ %{!E:%{!M:%{!MM:\ ! %{save-temps:cpp0 -lang-c++ \ %{!no-gcc:-D__GNUG__=%v1}\ ! %{!Wno-deprecated:-D__GXX_DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! %{!fno-new-abi:-D__GXX_ABI_VERSION=100}\ %{ansi:-D__STRICT_ANSI__ -trigraphs -$}\ ! %(cpp_options) %b.ii \n}\ ! cc1plus %{save-temps:-fpreprocessed %b.ii}\ ! %{!save-temps:%(cpp_options)\ %{!no-gcc:-D__GNUG__=%v1} \ ! %{!Wno-deprecated:-D__GXX_DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! %{!fno-new-abi:-D__GXX_ABI_VERSION=100}\ ! %{ansi:-D__STRICT_ANSI__}}\ %{ansi:-trigraphs -$}\ %(cc1_options) %2 %{+e1*}\ %{!fsyntax-only:%(invoke_as)}}}}", --- 36,60 ---- /* cc1plus has an integrated ISO C preprocessor. We should invoke the external preprocessor if -save-temps is given. */ "%{E|M|MM:cpp0 -lang-c++ %{!no-gcc:-D__GNUG__=%v1}\ ! %{!Wno-deprecated:-D__DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! -D__GXX_ABI_VERSION=100\ %{ansi:-D__STRICT_ANSI__ -trigraphs -$} %(cpp_options)}\ %{!E:%{!M:%{!MM:\ ! %{save-temps|no-integrated-cpp:cpp0 -lang-c++ \ %{!no-gcc:-D__GNUG__=%v1}\ ! %{!Wno-deprecated:-D__DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! -D__GXX_ABI_VERSION=100\ %{ansi:-D__STRICT_ANSI__ -trigraphs -$}\ ! %(cpp_options) %{save-temps:%b.ii} %{!save-temps:%g.ii} \n}\ ! cc1plus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.ii} %{!save-temps:%g.ii}}\ ! %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)\ %{!no-gcc:-D__GNUG__=%v1} \ ! %{!Wno-deprecated:-D__DEPRECATED}\ %{!fno-exceptions:-D__EXCEPTIONS}\ ! -D__GXX_ABI_VERSION=100\ ! %{ansi:-D__STRICT_ANSI__}}}\ %{ansi:-trigraphs -$}\ %(cc1_options) %2 %{+e1*}\ %{!fsyntax-only:%(invoke_as)}}}}", diff -Nrc3pad gcc-3.0.4/gcc/cp/lex.c gcc-3.1/gcc/cp/lex.c *** gcc-3.0.4/gcc/cp/lex.c Sun May 20 16:24:38 2001 --- gcc-3.1/gcc/cp/lex.c Fri Mar 29 20:30:55 2002 *************** extern void yyprint PARAMS ((FILE *, int *** 53,59 **** static int interface_strcmp PARAMS ((const char *)); static int *init_cpp_parse PARAMS ((void)); - static void init_reswords PARAMS ((void)); static void init_cp_pragma PARAMS ((void)); static tree parse_strconst_pragma PARAMS ((const char *, int)); --- 53,58 ---- *************** static void handle_pragma_unit PARAMS (( *** 62,71 **** static void handle_pragma_interface PARAMS ((cpp_reader *)); static void handle_pragma_implementation PARAMS ((cpp_reader *)); static void handle_pragma_java_exceptions PARAMS ((cpp_reader *)); - static void cxx_init PARAMS ((void)); - static void cxx_finish PARAMS ((void)); - static void cxx_init_options PARAMS ((void)); - static void cxx_post_options PARAMS ((void)); #ifdef GATHER_STATISTICS #ifdef REDUCE_LENGTH --- 61,66 ---- *************** static int token_cmp PARAMS ((int *, int *** 75,80 **** --- 70,76 ---- #endif static int is_global PARAMS ((tree)); static void init_operators PARAMS ((void)); + static void copy_lang_type PARAMS ((tree)); /* A constraint that can be tested at compile time. */ #ifdef __STDC__ *************** int interface_unknown; /* whether or no *** 213,219 **** #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, ! static char cplus_tree_code_type[] = { 'x', #include "cp-tree.def" }; --- 209,215 ---- #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, ! static const char cplus_tree_code_type[] = { 'x', #include "cp-tree.def" }; *************** static char cplus_tree_code_type[] = { *** 225,231 **** #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, ! static int cplus_tree_code_length[] = { 0, #include "cp-tree.def" }; --- 221,227 ---- #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, ! static const int cplus_tree_code_length[] = { 0, #include "cp-tree.def" }; *************** static int cplus_tree_code_length[] = { *** 235,296 **** Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, ! static const char *cplus_tree_code_name[] = { "@@dummy", #include "cp-tree.def" }; #undef DEFTREECODE - /* Each front end provides its own hooks, for toplev.c. */ - struct lang_hooks lang_hooks = {cxx_init, - cxx_finish, - cxx_init_options, - cxx_decode_option, - cxx_post_options}; - /* Post-switch processing. */ ! static void cxx_post_options () { ! cpp_post_options (parse_in); } ! static void cxx_init_options () { ! parse_in = cpp_create_reader (CLK_GNUCXX); /* Default exceptions on. */ flag_exceptions = 1; - /* Mark as "unspecified". */ - flag_bounds_check = -1; /* By default wrap lines at 80 characters. Is getenv ("COLUMNS") preferable? */ ! diagnostic_message_length_per_line = 80; /* By default, emit location information once for every diagnostic message. */ ! set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_ONCE); ! } ! ! static void ! cxx_init () ! { ! c_common_lang_init (); ! ! if (flag_gnu_xref) GNU_xref_begin (input_filename); ! init_repo (input_filename); } ! static void cxx_finish () { ! if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount); ! } ! ! const char * ! lang_identify () ! { ! return "cplusplus"; } static int * --- 231,269 ---- Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, ! static const char *const cplus_tree_code_name[] = { "@@dummy", #include "cp-tree.def" }; #undef DEFTREECODE /* Post-switch processing. */ ! void cxx_post_options () { ! c_common_post_options (); } ! /* Initialization before switch parsing. */ ! void cxx_init_options () { ! c_common_init_options (clk_cplusplus); /* Default exceptions on. */ flag_exceptions = 1; /* By default wrap lines at 80 characters. Is getenv ("COLUMNS") preferable? */ ! diagnostic_line_cutoff (global_dc) = 80; /* By default, emit location information once for every diagnostic message. */ ! diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE; } ! void cxx_finish () { ! c_common_finish (); } static int * *************** init_operators () *** 387,395 **** /* The reserved keyword table. */ struct resword { ! const char *word; ! ENUM_BITFIELD(rid) rid : 16; ! unsigned int disable : 16; }; /* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is --- 360,368 ---- /* The reserved keyword table. */ struct resword { ! const char *const word; ! const ENUM_BITFIELD(rid) rid : 16; ! const unsigned int disable : 16; }; /* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is *************** CONSTRAINT(ridbits_fit, RID_LAST_MODIFIE *** 403,408 **** --- 376,383 ---- static const struct resword reswords[] = { { "_Complex", RID_COMPLEX, 0 }, + { "__FUNCTION__", RID_FUNCTION_NAME, 0 }, + { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 }, { "__alignof", RID_ALIGNOF, 0 }, { "__alignof__", RID_ALIGNOF, 0 }, { "__asm", RID_ASM, 0 }, *************** static const struct resword reswords[] = *** 415,420 **** --- 390,396 ---- { "__const", RID_CONST, 0 }, { "__const__", RID_CONST, 0 }, { "__extension__", RID_EXTENSION, 0 }, + { "__func__", RID_C99_FUNCTION_NAME, 0 }, { "__imag", RID_IMAGPART, 0 }, { "__imag__", RID_IMAGPART, 0 }, { "__inline", RID_INLINE, 0 }, *************** const short rid_to_yy[RID_MAX] = *** 585,590 **** --- 561,572 ---- /* RID_PTRBASE */ 0, /* RID_PTREXTENT */ 0, /* RID_PTRVALUE */ 0, + /* RID_CHOOSE_EXPR */ 0, + /* RID_TYPES_COMPATIBLE_P */ 0, + + /* RID_FUNCTION_NAME */ VAR_FUNC_NAME, + /* RID_PRETTY_FUNCTION_NAME */ VAR_FUNC_NAME, + /* RID_c99_FUNCTION_NAME */ VAR_FUNC_NAME, /* C++ */ /* RID_BOOL */ TYPESPEC, *************** const short rid_to_yy[RID_MAX] = *** 644,650 **** /* RID_AT_IMPLEMENTATION */ 0 }; ! static void init_reswords () { unsigned int i; --- 626,632 ---- /* RID_AT_IMPLEMENTATION */ 0 }; ! void init_reswords () { unsigned int i; *************** init_cp_pragma () *** 677,683 **** cpp_register_pragma (parse_in, 0, "implementation", handle_pragma_implementation); - cpp_register_pragma_space (parse_in, "GCC"); cpp_register_pragma (parse_in, "GCC", "interface", handle_pragma_interface); cpp_register_pragma (parse_in, "GCC", "implementation", handle_pragma_implementation); --- 659,664 ---- *************** init_cp_pragma () *** 685,703 **** handle_pragma_java_exceptions); } const char * ! init_parse (filename) const char *filename; { - /* Make identifier nodes long enough for the language-specific slots. */ - set_identifier_size (sizeof (struct lang_identifier)); decl_printable_name = lang_printable_name; - input_filename = ""; init_reswords (); - init_pragma (); - init_cp_pragma (); init_spew (); init_tree (); init_cplus_expand (); --- 666,683 ---- handle_pragma_java_exceptions); } + /* Initialize the C++ front end. This function is very sensitive to + the exact order that things are done here. It would be nice if the + initialization done by this routine were moved to its subroutines, + and the ordering dependencies clarified and reduced. */ const char * ! cxx_init (filename) const char *filename; { decl_printable_name = lang_printable_name; input_filename = ""; init_reswords (); init_spew (); init_tree (); init_cplus_expand (); *************** init_parse (filename) *** 737,761 **** TREE_TYPE (enum_type_node) = enum_type_node; ridpointers[(int) RID_ENUM] = enum_type_node; ! /* Create the built-in __null node. Note that we can't yet call for ! type_for_size here because integer_type_node and so forth are not ! set up. Therefore, we don't set the type of these nodes until ! init_decl_processing. */ null_node = build_int_2 (0, 0); ridpointers[RID_NULL] = null_node; token_count = init_cpp_parse (); interface_unknown = 1; ! return init_c_lex (filename); ! } ! void ! finish_parse () ! { ! cpp_finish (parse_in); ! /* Call to cpp_destroy () omitted for performance reasons. */ ! errorcount += cpp_errors (parse_in); } inline void --- 717,739 ---- TREE_TYPE (enum_type_node) = enum_type_node; ridpointers[(int) RID_ENUM] = enum_type_node; ! cxx_init_decl_processing (); ! ! /* Create the built-in __null node. */ null_node = build_int_2 (0, 0); + TREE_TYPE (null_node) = type_for_size (POINTER_SIZE, 0); ridpointers[RID_NULL] = null_node; token_count = init_cpp_parse (); interface_unknown = 1; ! filename = c_common_init (filename); ! init_cp_pragma (); ! ! init_repo (filename); ! ! return filename; } inline void *************** yyprint (file, yychar, yylval) *** 798,804 **** else if (yylval.ttype == enum_type_node) fprintf (file, " `enum'"); else ! my_friendly_abort (80); break; case CONSTANT: --- 776,782 ---- else if (yylval.ttype == enum_type_node) fprintf (file, " `enum'"); else ! abort (); break; case CONSTANT: *************** print_parse_statistics () *** 918,931 **** in order to build the compiler. */ void ! set_yydebug (value) int value; { #if YYDEBUG != 0 extern int yydebug; yydebug = value; #else ! warning ("YYDEBUG not defined."); #endif } --- 896,909 ---- in order to build the compiler. */ void ! cxx_set_yydebug (value) int value; { #if YYDEBUG != 0 extern int yydebug; yydebug = value; #else ! warning ("YYDEBUG not defined"); #endif } *************** extract_interface_info () *** 949,957 **** interface_only = finfo->interface_only; interface_unknown = finfo->interface_unknown; - - /* This happens to be a convenient place to put this. */ - if (flag_gnu_xref) GNU_xref_file (input_filename); } /* Return nonzero if S is not considered part of an --- 927,932 ---- *************** check_for_missing_semicolon (type) *** 1018,1024 **** error ("semicolon missing after %s declaration", TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct"); else ! cp_error ("semicolon missing after declaration of `%T'", type); shadow_tag (build_tree_list (0, type)); } /* Could probably also hack cases where class { ... } f (); appears. */ --- 993,999 ---- error ("semicolon missing after %s declaration", TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct"); else ! error ("semicolon missing after declaration of `%T'", type); shadow_tag (build_tree_list (0, type)); } /* Could probably also hack cases where class { ... } f (); appears. */ *************** note_got_semicolon (type) *** 1030,1036 **** tree type; { if (!TYPE_P (type)) ! my_friendly_abort (60); if (CLASS_TYPE_P (type)) CLASSTYPE_GOT_SEMICOLON (type) = 1; } --- 1005,1011 ---- tree type; { if (!TYPE_P (type)) ! abort (); if (CLASS_TYPE_P (type)) CLASSTYPE_GOT_SEMICOLON (type) = 1; } *************** note_list_got_semicolon (declspecs) *** 1044,1050 **** for (link = declspecs; link; link = TREE_CHAIN (link)) { tree type = TREE_VALUE (link); ! if (TYPE_P (type)) note_got_semicolon (type); } clear_anon_tags (); --- 1019,1025 ---- for (link = declspecs; link; link = TREE_CHAIN (link)) { tree type = TREE_VALUE (link); ! if (type && TYPE_P (type)) note_got_semicolon (type); } clear_anon_tags (); *************** static void *** 1081,1092 **** handle_pragma_vtable (dfile) cpp_reader *dfile ATTRIBUTE_UNUSED; { ! tree vtbl = parse_strconst_pragma ("vtable", 0); ! ! if (vtbl && vtbl != (tree)-1) ! pending_vtables = tree_cons (NULL_TREE, ! get_identifier (TREE_STRING_POINTER (vtbl)), ! pending_vtables); } static void --- 1056,1063 ---- handle_pragma_vtable (dfile) cpp_reader *dfile ATTRIBUTE_UNUSED; { ! parse_strconst_pragma ("vtable", 0); ! sorry ("#pragma vtable no longer supported"); } static void *************** handle_pragma_interface (dfile) *** 1108,1114 **** if (fname == (tree)-1) return; else if (fname == 0) ! main_filename = file_name_nondirectory (input_filename); else main_filename = TREE_STRING_POINTER (fname); --- 1079,1085 ---- if (fname == (tree)-1) return; else if (fname == 0) ! main_filename = lbasename (input_filename); else main_filename = TREE_STRING_POINTER (fname); *************** handle_pragma_implementation (dfile) *** 1157,1163 **** main_filename = main_input_filename; else main_filename = input_filename; ! main_filename = file_name_nondirectory (main_filename); } else { --- 1128,1134 ---- main_filename = main_input_filename; else main_filename = input_filename; ! main_filename = lbasename (main_filename); } else { *************** do_identifier (token, parsing, args) *** 1237,1242 **** --- 1208,1216 ---- else id = lastiddecl; + if (lexing && id && TREE_DEPRECATED (id)) + warn_deprecated_use (id); + /* Do Koenig lookup if appropriate (inside templates we build lookup expressions instead). *************** do_identifier (token, parsing, args) *** 1270,1281 **** else if (IDENTIFIER_OPNAME_P (token)) { if (token != ansi_opname (ERROR_MARK)) ! cp_error ("`%D' not defined", token); id = error_mark_node; } else if (current_function_decl == 0) { ! cp_error ("`%D' was not declared in this scope", token); id = error_mark_node; } else --- 1244,1255 ---- else if (IDENTIFIER_OPNAME_P (token)) { if (token != ansi_opname (ERROR_MARK)) ! error ("`%D' not defined", token); id = error_mark_node; } else if (current_function_decl == 0) { ! error ("`%D' was not declared in this scope", token); id = error_mark_node; } else *************** do_identifier (token, parsing, args) *** 1285,1291 **** { static int undeclared_variable_notice; ! cp_error ("`%D' undeclared (first use this function)", token); if (! undeclared_variable_notice) { --- 1259,1265 ---- { static int undeclared_variable_notice; ! error ("`%D' undeclared (first use this function)", token); if (! undeclared_variable_notice) { *************** do_scoped_id (token, parsing) *** 1391,1397 **** id = IDENTIFIER_GLOBAL_VALUE (token); if (parsing && yychar == YYEMPTY) yychar = yylex (); ! if (! id) { if (processing_template_decl) { --- 1365,1372 ---- id = IDENTIFIER_GLOBAL_VALUE (token); if (parsing && yychar == YYEMPTY) yychar = yylex (); ! if (!id || (TREE_CODE (id) == FUNCTION_DECL ! && DECL_ANTICIPATED (id))) { if (processing_template_decl) { *************** do_scoped_id (token, parsing) *** 1400,1406 **** return id; } if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node) ! cp_error ("`::%D' undeclared (first use here)", token); id = error_mark_node; /* Prevent repeated error messages. */ SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); --- 1375,1381 ---- return id; } if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node) ! error ("`::%D' undeclared (first use here)", token); id = error_mark_node; /* Prevent repeated error messages. */ SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); *************** retrofit_lang_decl (t) *** 1533,1539 **** SET_DECL_LANGUAGE (t, lang_c); else if (current_lang_name == lang_name_java) SET_DECL_LANGUAGE (t, lang_java); ! else my_friendly_abort (64); #ifdef GATHER_STATISTICS tree_node_counts[(int)lang_decl] += 1; --- 1508,1514 ---- SET_DECL_LANGUAGE (t, lang_c); else if (current_lang_name == lang_name_java) SET_DECL_LANGUAGE (t, lang_java); ! else abort (); #ifdef GATHER_STATISTICS tree_node_counts[(int)lang_decl] += 1; *************** copy_lang_decl (node) *** 1558,1563 **** --- 1533,1543 ---- ld = (struct lang_decl *) ggc_alloc (size); memcpy (ld, DECL_LANG_SPECIFIC (node), size); DECL_LANG_SPECIFIC (node) = ld; + + #ifdef GATHER_STATISTICS + tree_node_counts[(int)lang_decl] += 1; + tree_node_sizes[(int)lang_decl] += size; + #endif } /* Copy DECL, including any language-specific parts. */ *************** copy_decl (decl) *** 1573,1586 **** return copy; } tree cp_make_lang_type (code) enum tree_code code; { register tree t = make_node (code); ! /* Set up some flags that give proper default behavior. */ ! if (IS_AGGR_TYPE_CODE (code)) { struct lang_type *pi; --- 1553,1603 ---- return copy; } + /* Replace the shared language-specific parts of NODE with a new copy. */ + + static void + copy_lang_type (node) + tree node; + { + int size; + struct lang_type *lt; + + if (! TYPE_LANG_SPECIFIC (node)) + return; + + size = sizeof (struct lang_type); + lt = (struct lang_type *) ggc_alloc (size); + memcpy (lt, TYPE_LANG_SPECIFIC (node), size); + TYPE_LANG_SPECIFIC (node) = lt; + + #ifdef GATHER_STATISTICS + tree_node_counts[(int)lang_type] += 1; + tree_node_sizes[(int)lang_type] += size; + #endif + } + + /* Copy TYPE, including any language-specific parts. */ + + tree + copy_type (type) + tree type; + { + tree copy; + + copy = copy_node (type); + copy_lang_type (copy); + return copy; + } + tree cp_make_lang_type (code) enum tree_code code; { register tree t = make_node (code); ! /* Create lang_type structure. */ ! if (IS_AGGR_TYPE_CODE (code) ! || code == BOUND_TEMPLATE_TEMPLATE_PARM) { struct lang_type *pi; *************** cp_make_lang_type (code) *** 1588,1593 **** --- 1605,1620 ---- ggc_alloc_cleared (sizeof (struct lang_type))); TYPE_LANG_SPECIFIC (t) = pi; + + #ifdef GATHER_STATISTICS + tree_node_counts[(int)lang_type] += 1; + tree_node_sizes[(int)lang_type] += sizeof (struct lang_type); + #endif + } + + /* Set up some flags that give proper default behavior. */ + if (IS_AGGR_TYPE_CODE (code)) + { SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); CLASSTYPE_INTERFACE_ONLY (t) = interface_only; *************** cp_make_lang_type (code) *** 1595,1605 **** presence of parse errors, the normal was of assuring this might not ever get executed, so we lay it out *immediately*. */ build_pointer_type (t); - - #ifdef GATHER_STATISTICS - tree_node_counts[(int)lang_type] += 1; - tree_node_sizes[(int)lang_type] += sizeof (struct lang_type); - #endif } else /* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But, --- 1622,1627 ---- *************** cp_make_lang_type (code) *** 1611,1617 **** since they can be virtual base types, and we then need a canonical binfo for them. Ideally, this would be done lazily for all types. */ ! if (IS_AGGR_TYPE_CODE (code) || code == TEMPLATE_TYPE_PARM) TYPE_BINFO (t) = make_binfo (size_zero_node, t, NULL_TREE, NULL_TREE); return t; --- 1633,1641 ---- since they can be virtual base types, and we then need a canonical binfo for them. Ideally, this would be done lazily for all types. */ ! if (IS_AGGR_TYPE_CODE (code) || code == TEMPLATE_TYPE_PARM ! || code == BOUND_TEMPLATE_TEMPLATE_PARM ! || code == TYPENAME_TYPE) TYPE_BINFO (t) = make_binfo (size_zero_node, t, NULL_TREE, NULL_TREE); return t; *************** make_aggr_type (code) *** 1632,1651 **** void compiler_error VPARAMS ((const char *msg, ...)) { - #ifndef ANSI_PROTOTYPES - const char *msg; - #endif char buf[1024]; - va_list ap; - - VA_START (ap, msg); ! #ifndef ANSI_PROTOTYPES ! msg = va_arg (ap, const char *); ! #endif vsprintf (buf, msg, ap); ! va_end (ap); error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf); } --- 1656,1669 ---- void compiler_error VPARAMS ((const char *msg, ...)) { char buf[1024]; ! VA_OPEN (ap, msg); ! VA_FIXEDARG (ap, const char *, msg); vsprintf (buf, msg, ap); ! VA_CLOSE (ap); ! error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf); } *************** cp_type_qual_from_rid (rid) *** 1663,1668 **** else if (rid == ridpointers[(int) RID_RESTRICT]) return TYPE_QUAL_RESTRICT; ! my_friendly_abort (0); return TYPE_UNQUALIFIED; } --- 1681,1686 ---- else if (rid == ridpointers[(int) RID_RESTRICT]) return TYPE_QUAL_RESTRICT; ! abort (); return TYPE_UNQUALIFIED; } diff -Nrc3pad gcc-3.0.4/gcc/cp/lex.h gcc-3.1/gcc/cp/lex.h *** gcc-3.0.4/gcc/cp/lex.h Sat Nov 25 19:28:44 2000 --- gcc-3.1/gcc/cp/lex.h Sat May 26 01:31:45 2001 *************** can know your rights and responsibilitie *** 21,28 **** file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ ! #ifndef _CP_LEX_H ! #define _CP_LEX_H #if 0 /* Formerly, the RID_* values used as mask bits did not fit into a --- 21,28 ---- file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ ! #ifndef GCC_CP_LEX_H ! #define GCC_CP_LEX_H #if 0 /* Formerly, the RID_* values used as mask bits did not fit into a *************** extern int pending_lang_change; *** 84,87 **** extern int yylex PARAMS ((void)); ! #endif /* _CP_LEX_H */ --- 84,87 ---- extern int yylex PARAMS ((void)); ! #endif /* ! GCC_CP_LEX_H */ diff -Nrc3pad gcc-3.0.4/gcc/cp/mangle.c gcc-3.1/gcc/cp/mangle.c *** gcc-3.0.4/gcc/cp/mangle.c Mon Dec 3 17:38:50 2001 --- gcc-3.1/gcc/cp/mangle.c Thu Apr 25 01:04:55 2002 *************** *** 1,5 **** ! /* Name mangling for the new standard C++ ABI. ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Alex Samuel This file is part of GNU CC. --- 1,5 ---- ! /* Name mangling for the 3.0 C++ ABI. ! Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. Written by Alex Samuel This file is part of GNU CC. *************** *** 65,74 **** /* Macros for tracing the write_* functions. */ #if DEBUG_MANGLE # define MANGLE_TRACE(FN, INPUT) \ ! fprintf (stderr, " %-24s: %-24s\n", FN, INPUT) # define MANGLE_TRACE_TREE(FN, NODE) \ fprintf (stderr, " %-24s: %-24s (%p)\n", \ ! FN, tree_code_name[TREE_CODE (NODE)], (void *) NODE) #else # define MANGLE_TRACE(FN, INPUT) # define MANGLE_TRACE_TREE(FN, NODE) --- 65,74 ---- /* Macros for tracing the write_* functions. */ #if DEBUG_MANGLE # define MANGLE_TRACE(FN, INPUT) \ ! fprintf (stderr, " %-24s: %-24s\n", (FN), (INPUT)) # define MANGLE_TRACE_TREE(FN, NODE) \ fprintf (stderr, " %-24s: %-24s (%p)\n", \ ! (FN), tree_code_name[TREE_CODE (NODE)], (void *) (NODE)) #else # define MANGLE_TRACE(FN, INPUT) # define MANGLE_TRACE_TREE(FN, NODE) *************** static void write_java_integer_type_code *** 227,237 **** /* Write out a signed quantity in base 10. */ #define write_signed_number(NUMBER) \ ! write_number (NUMBER, /*unsigned_p=*/0, 10) /* Write out an unsigned quantity in base 10. */ #define write_unsigned_number(NUMBER) \ ! write_number (NUMBER, /*unsigned_p=*/1, 10) /* If DECL is a template instance, return non-zero and, if TEMPLATE_INFO is non-NULL, set *TEMPLATE_INFO to its template info. --- 227,237 ---- /* Write out a signed quantity in base 10. */ #define write_signed_number(NUMBER) \ ! write_number ((NUMBER), /*unsigned_p=*/0, 10) /* Write out an unsigned quantity in base 10. */ #define write_unsigned_number(NUMBER) \ ! write_number ((NUMBER), /*unsigned_p=*/1, 10) /* If DECL is a template instance, return non-zero and, if TEMPLATE_INFO is non-NULL, set *TEMPLATE_INFO to its template info. *************** add_substitution (node) *** 361,367 **** || (TYPE_P (node) && TYPE_P (candidate) && same_type_p (node, candidate))) ! my_friendly_abort (20000524); } } #endif /* ENABLE_CHECKING */ --- 361,367 ---- || (TYPE_P (node) && TYPE_P (candidate) && same_type_p (node, candidate))) ! abort (); } } #endif /* ENABLE_CHECKING */ *************** find_substitution (node) *** 509,515 **** std::basic_string , std::allocator > . */ ! if (CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED && CLASSTYPE_USE_TEMPLATE (type)) { tree args = CLASSTYPE_TI_ARGS (type); --- 509,515 ---- std::basic_string , std::allocator > . */ ! if (cp_type_quals (type) == TYPE_UNQUALIFIED && CLASSTYPE_USE_TEMPLATE (type)) { tree args = CLASSTYPE_TI_ARGS (type); *************** find_substitution (node) *** 535,541 **** /* Check for basic_{i,o,io}stream. */ if (TYPE_P (node) ! && CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED && CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type) && CLASSTYPE_TEMPLATE_INFO (type) != NULL) --- 535,541 ---- /* Check for basic_{i,o,io}stream. */ if (TYPE_P (node) ! && cp_type_quals (type) == TYPE_UNQUALIFIED && CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type) && CLASSTYPE_TEMPLATE_INFO (type) != NULL) *************** write_unscoped_name (decl) *** 779,785 **** || TREE_CODE (context) == FUNCTION_DECL) write_unqualified_name (decl); else ! my_friendly_abort (20000521); } /* ::= --- 779,785 ---- || TREE_CODE (context) == FUNCTION_DECL) write_unqualified_name (decl); else ! abort (); } /* ::= *************** write_template_prefix (node) *** 923,929 **** template = CLASSTYPE_TI_TEMPLATE (type); else /* Oops, not a template. */ ! my_friendly_abort (20000524); /* For a member template, though, the template name for the innermost name must have all the outer template levels --- 923,929 ---- template = CLASSTYPE_TI_TEMPLATE (type); else /* Oops, not a template. */ ! abort (); /* For a member template, though, the template name for the innermost name must have all the outer template levels *************** write_identifier (identifier) *** 1168,1177 **** Currently, allocating constructors are never used. ! We also need to provide unique mangled names (which should never be ! exported) for the constructor that takes an in-charge parameter, ! and for a constructor whose name is the same as its class's name. ! We use "C*INTERNAL*" for these. */ static void write_special_name_constructor (ctor) --- 1168,1176 ---- Currently, allocating constructors are never used. ! We also need to provide mangled names for the maybe-in-charge ! constructor, so we treat it here too. mangle_decl_string will ! append *INTERNAL* to that, to make sure we never emit it. */ static void write_special_name_constructor (ctor) *************** write_special_name_constructor (ctor) *** 1186,1204 **** else if (DECL_BASE_CONSTRUCTOR_P (ctor)) write_string ("C2"); else ! my_friendly_abort (20001115); } /* Handle destructor productions of non-terminal . ! DTOR is a denstructor FUNCTION_DECL. ::= D0 # deleting (in-charge) destructor ::= D1 # complete object (in-charge) destructor ! ::= D2 # base object (not-in-charge) destructor ! We also need to provide unique mngled names for old-ABI ! destructors, sometimes. These should only be used internally. We ! use "D*INTERNAL*" for these. */ static void write_special_name_destructor (dtor) --- 1185,1203 ---- else if (DECL_BASE_CONSTRUCTOR_P (ctor)) write_string ("C2"); else ! abort (); } /* Handle destructor productions of non-terminal . ! DTOR is a destructor FUNCTION_DECL. ::= D0 # deleting (in-charge) destructor ::= D1 # complete object (in-charge) destructor ! ::= D2 # base object (not-in-charge) destructor ! We also need to provide mangled names for the maybe-incharge ! destructor, so we treat it here too. mangle_decl_string will ! append *INTERNAL* to that, to make sure we never emit it. */ static void write_special_name_destructor (dtor) *************** write_special_name_destructor (dtor) *** 1215,1221 **** else if (DECL_BASE_DESTRUCTOR_P (dtor)) write_string ("D2"); else ! my_friendly_abort (20001115); } /* Return the discriminator for ENTITY appearing inside --- 1214,1220 ---- else if (DECL_BASE_DESTRUCTOR_P (dtor)) write_string ("D2"); else ! abort (); } /* Return the discriminator for ENTITY appearing inside *************** write_type (type) *** 1354,1359 **** --- 1353,1363 ---- since both the qualified and uqualified types are substitution candidates. */ write_type (TYPE_MAIN_VARIANT (type)); + else if (TREE_CODE (type) == ARRAY_TYPE) + /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here + so that the cv-qualification of the element type is available + in write_array_type. */ + write_array_type (type); else { /* See through any typedefs. */ *************** write_type (type) *** 1394,1407 **** break; case TYPENAME_TYPE: ! /* We handle TYPENAME_TYPEs like ordinary nested names. */ write_nested_name (TYPE_STUB_DECL (type)); break; - case ARRAY_TYPE: - write_array_type (type); - break; - case POINTER_TYPE: /* A pointer-to-member variable is represented by a POINTER_TYPE to an OFFSET_TYPE, so check for this first. */ --- 1398,1409 ---- break; case TYPENAME_TYPE: ! case UNBOUND_CLASS_TEMPLATE: ! /* We handle TYPENAME_TYPEs and UNBOUND_CLASS_TEMPLATEs like ! ordinary nested names. */ write_nested_name (TYPE_STUB_DECL (type)); break; case POINTER_TYPE: /* A pointer-to-member variable is represented by a POINTER_TYPE to an OFFSET_TYPE, so check for this first. */ *************** write_type (type) *** 1444,1450 **** break; default: ! my_friendly_abort (20000409); } } --- 1446,1452 ---- break; default: ! abort (); } } *************** write_CV_qualifiers_for_type (type) *** 1468,1486 **** "In cases where multiple order-insensitive qualifiers are present, they should be ordered 'K' (closest to the base type), ! 'V', 'r', and 'U' (farthest from the base type) ..." */ ! if (CP_TYPE_RESTRICT_P (type)) { write_char ('r'); ++num_qualifiers; } ! if (CP_TYPE_VOLATILE_P (type)) { write_char ('V'); ++num_qualifiers; } ! if (CP_TYPE_CONST_P (type)) { write_char ('K'); ++num_qualifiers; --- 1470,1492 ---- "In cases where multiple order-insensitive qualifiers are present, they should be ordered 'K' (closest to the base type), ! 'V', 'r', and 'U' (farthest from the base type) ..." ! Note that we do not use cp_type_quals below; given "const ! int[3]", the "const" is emitted with the "int", not with the ! array. */ ! ! if (TYPE_QUALS (type) & TYPE_QUAL_RESTRICT) { write_char ('r'); ++num_qualifiers; } ! if (TYPE_QUALS (type) & TYPE_QUAL_VOLATILE) { write_char ('V'); ++num_qualifiers; } ! if (TYPE_QUALS (type) & TYPE_QUAL_CONST) { write_char ('K'); ++num_qualifiers; *************** write_CV_qualifiers_for_type (type) *** 1505,1512 **** ::= m # unsigned long ::= x # long long, __int64 ::= y # unsigned long long, __int64 ! ::= n # __int128 [not supported] ! ::= o # unsigned __int128 [not supported] ::= f # float ::= d # double ::= e # long double, __float80 --- 1511,1518 ---- ::= m # unsigned long ::= x # long long, __int64 ::= y # unsigned long long, __int64 ! ::= n # __int128 ! ::= o # unsigned __int128 ::= f # float ::= d # double ::= e # long double, __float80 *************** write_builtin_type (type) *** 1551,1565 **** write_char (integer_type_codes[itk]); break; } ! if (itk == itk_none) { tree t = type_for_mode (TYPE_MODE (type), TREE_UNSIGNED (type)); if (type == t) ! /* Couldn't find this type. */ ! my_friendly_abort (20000408); ! type = t; ! goto iagain; } } break; --- 1557,1579 ---- write_char (integer_type_codes[itk]); break; } ! if (itk == itk_none) { tree t = type_for_mode (TYPE_MODE (type), TREE_UNSIGNED (type)); if (type == t) ! { ! if (TYPE_PRECISION (type) == 128) ! write_char (TREE_UNSIGNED (type) ? 'o' : 'n'); ! else ! /* Couldn't find this type. */ ! abort (); ! } ! else ! { ! type = t; ! goto iagain; ! } } } break; *************** write_builtin_type (type) *** 1574,1584 **** else if (type == long_double_type_node) write_char ('e'); else ! my_friendly_abort (20000409); break; default: ! my_friendly_abort (20000509); } } --- 1588,1598 ---- else if (type == long_double_type_node) write_char ('e'); else ! abort (); break; default: ! abort (); } } *************** write_function_type (type) *** 1594,1599 **** --- 1608,1624 ---- { MANGLE_TRACE_TREE ("function-type", type); + /* For a pointer to member function, the function type may have + cv-qualifiers, indicating the quals for the artificial 'this' + parameter. */ + if (TREE_CODE (type) == METHOD_TYPE) + { + /* The first parameter must be a POINTER_TYPE pointing to the + `this' parameter. */ + tree this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))); + write_CV_qualifiers_for_type (this_type); + } + write_char ('F'); /* We don't track whether or not a type is `extern "C"'. Note that you can have an `extern "C"' function that does not have *************** write_expression (expr) *** 1768,1773 **** --- 1793,1808 ---- code = TREE_CODE (expr); } + /* Skip NOP_EXPRs. They can occur when (say) a pointer argument + is converted (via qualification conversions) to another + type. */ + while (TREE_CODE (expr) == NOP_EXPR + || TREE_CODE (expr) == NON_LVALUE_EXPR) + { + expr = TREE_OPERAND (expr, 0); + code = TREE_CODE (expr); + } + /* Handle template parameters. */ if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM *************** write_expression (expr) *** 1787,1801 **** { int i; - /* Skip NOP_EXPRs. They can occur when (say) a pointer argument - is converted (via qualification conversions) to another - type. */ - while (TREE_CODE (expr) == NOP_EXPR) - { - expr = TREE_OPERAND (expr, 0); - code = TREE_CODE (expr); - } - /* When we bind a variable or function to a non-type template argument with reference type, we create an ADDR_EXPR to show the fact that the entity's address has been taken. But, we --- 1822,1827 ---- *************** write_template_arg_literal (value) *** 1876,1882 **** else if (value == boolean_true_node) write_unsigned_number (1); else ! my_friendly_abort (20000412); } else write_integer_cst (value); --- 1902,1908 ---- else if (value == boolean_true_node) write_unsigned_number (1); else ! abort (); } else write_integer_cst (value); *************** write_template_arg_literal (value) *** 1901,1907 **** #endif } else ! my_friendly_abort (20000412); write_char ('E'); } --- 1927,1933 ---- #endif } else ! abort (); write_char ('E'); } *************** write_pointer_to_member_type (type) *** 2020,2043 **** tree type; { write_char ('M'); ! /* For a pointer-to-function member, the class type may be ! cv-qualified, bug that won't be reflected in ! TYPE_PTRMEM_CLASS_TYPE. So, we go fishing around in ! TYPE_PTRMEM_POINTED_TO_TYPE instead. */ ! if (TYPE_PTRMEMFUNC_P (type)) ! { ! tree fn_type; ! tree this_type; ! ! fn_type = TYPE_PTRMEM_POINTED_TO_TYPE (type); ! /* The first parameter must be a POINTER_TYPE pointing to the ! `this' parameter. */ ! this_type = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fn_type))); ! write_type (this_type); ! } ! /* For a pointer-to-data member, things are simpler. */ ! else ! write_type (TYPE_PTRMEM_CLASS_TYPE (type)); write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type)); } --- 2046,2052 ---- tree type; { write_char ('M'); ! write_type (TYPE_PTRMEM_CLASS_TYPE (type)); write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type)); } *************** write_template_param (parm) *** 2068,2074 **** break; default: ! my_friendly_abort (20000523); } write_char ('T'); --- 2077,2083 ---- break; default: ! abort (); } write_char ('T'); *************** mangle_conv_op_name_for_type (type) *** 2407,2417 **** /* Build the mangling for TYPE. */ const char *mangled_type = mangle_type_string (type); /* Allocate a temporary buffer for the complete name. */ ! char *op_name = (char *) xmalloc (strlen ("operator ") ! + strlen (mangled_type) + 1); ! /* Assemble the mangling. */ ! strcpy (op_name, "operator "); ! strcat (op_name, mangled_type); /* Find or create an identifier. */ identifier = get_identifier (op_name); /* Done with the temporary buffer. */ --- 2416,2422 ---- /* Build the mangling for TYPE. */ const char *mangled_type = mangle_type_string (type); /* Allocate a temporary buffer for the complete name. */ ! char *op_name = concat ("operator ", mangled_type, NULL); /* Find or create an identifier. */ identifier = get_identifier (op_name); /* Done with the temporary buffer. */ *************** mangle_guard_variable (variable) *** 2435,2444 **** { start_mangling (); write_string ("_ZGV"); ! write_name (variable, /*ignore_local_scope=*/0); return get_identifier (finish_mangling ()); } /* Foreign language type mangling section. */ --- 2440,2467 ---- { start_mangling (); write_string ("_ZGV"); ! if (strncmp (IDENTIFIER_POINTER (DECL_NAME (variable)), "_ZGR", 4) == 0) ! /* The name of a guard variable for a reference temporary should refer ! to the reference, not the temporary. */ ! write_string (IDENTIFIER_POINTER (DECL_NAME (variable)) + 4); ! else ! write_name (variable, /*ignore_local_scope=*/0); return get_identifier (finish_mangling ()); } + /* Return an identifier for the name of a temporary variable used to + initialize a static reference. This isn't part of the ABI, but we might + as well call them something readable. */ + + tree + mangle_ref_init_variable (variable) + tree variable; + { + start_mangling (); + write_string ("_ZGR"); + write_name (variable, /*ignore_local_scope=*/0); + return get_identifier (finish_mangling ()); + } /* Foreign language type mangling section. */ *************** write_java_integer_type_codes (type) *** 2462,2467 **** else if (type == java_boolean_type_node) write_char ('b'); else ! my_friendly_abort (20001207); } --- 2485,2490 ---- else if (type == java_boolean_type_node) write_char ('b'); else ! abort (); } diff -Nrc3pad gcc-3.0.4/gcc/cp/method.c gcc-3.1/gcc/cp/method.c *** gcc-3.0.4/gcc/cp/method.c Mon Jan 7 20:51:38 2002 --- gcc-3.1/gcc/cp/method.c Mon Apr 29 14:54:52 2002 *************** enum mangling_flags *** 54,71 **** typedef enum mangling_flags mangling_flags; - /* TREE_LIST of the current inline functions that need to be - processed. */ - struct pending_inline *pending_inlines; - #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free static void do_build_assign_ref PARAMS ((tree)); static void do_build_copy_constructor PARAMS ((tree)); - #if HOST_BITS_PER_WIDE_INT >= 64 - static void build_mangled_C99_name PARAMS ((int)); - #endif static tree synthesize_exception_spec PARAMS ((tree, tree (*) (tree, void *), void *)); static tree locate_dtor PARAMS ((tree, void *)); static tree locate_ctor PARAMS ((tree, void *)); --- 54,64 ---- *************** hack_identifier (value, name) *** 152,189 **** tree type; if (value == error_mark_node) ! { ! if (current_class_name) ! { ! tree fields = lookup_fnfields (TYPE_BINFO (current_class_type), ! name, 1); ! if (fields == error_mark_node) ! return error_mark_node; ! if (fields) ! { ! tree fndecl; ! ! fndecl = TREE_VALUE (fields); ! my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251); ! /* I could not trigger this code. MvL */ ! my_friendly_abort (980325); ! #ifdef DEAD ! if (DECL_CHAIN (fndecl) == NULL_TREE) ! { ! warning ("methods cannot be converted to function pointers"); ! return fndecl; ! } ! else ! { ! error ("ambiguous request for method pointer `%s'", ! IDENTIFIER_POINTER (name)); ! return error_mark_node; ! } ! #endif ! } ! } ! return error_mark_node; ! } type = TREE_TYPE (value); if (TREE_CODE (value) == FIELD_DECL) --- 145,151 ---- tree type; if (value == error_mark_node) ! return error_mark_node; type = TREE_TYPE (value); if (TREE_CODE (value) == FIELD_DECL) *************** hack_identifier (value, name) *** 192,204 **** { if (current_function_decl && DECL_STATIC_FUNCTION_P (current_function_decl)) ! cp_error ("invalid use of member `%D' in static member function", value); else /* We can get here when processing a bad default argument, like: struct S { int a; void f(int i = a); } */ ! cp_error ("invalid use of member `%D'", value); return error_mark_node; } --- 154,166 ---- { if (current_function_decl && DECL_STATIC_FUNCTION_P (current_function_decl)) ! error ("invalid use of member `%D' in static member function", value); else /* We can get here when processing a bad default argument, like: struct S { int a; void f(int i = a); } */ ! error ("invalid use of member `%D'", value); return error_mark_node; } *************** hack_identifier (value, name) *** 240,251 **** } else if (TREE_CODE (value) == NAMESPACE_DECL) { ! cp_error ("use of namespace `%D' as expression", value); return error_mark_node; } else if (DECL_CLASS_TEMPLATE_P (value)) { ! cp_error ("use of class template `%T' as expression", value); return error_mark_node; } else --- 202,213 ---- } else if (TREE_CODE (value) == NAMESPACE_DECL) { ! error ("use of namespace `%D' as expression", value); return error_mark_node; } else if (DECL_CLASS_TEMPLATE_P (value)) { ! error ("use of class template `%T' as expression", value); return error_mark_node; } else *************** hack_identifier (value, name) *** 258,264 **** if (context != NULL_TREE && context != current_function_decl && ! TREE_STATIC (value)) { ! cp_error ("use of %s from containing function", (TREE_CODE (value) == VAR_DECL ? "`auto' variable" : "parameter")); cp_error_at (" `%#D' declared here", value); --- 220,226 ---- if (context != NULL_TREE && context != current_function_decl && ! TREE_STATIC (value)) { ! error ("use of %s from containing function", (TREE_CODE (value) == VAR_DECL ? "`auto' variable" : "parameter")); cp_error_at (" `%#D' declared here", value); *************** hack_identifier (value, name) *** 279,285 **** else if (TREE_CODE (value) == TREE_LIST && TREE_TYPE (value) == error_mark_node) { ! cp_error ("\ request for member `%D' is ambiguous in multiple inheritance lattice", name); print_candidates (value); --- 241,247 ---- else if (TREE_CODE (value) == TREE_LIST && TREE_TYPE (value) == error_mark_node) { ! error ("\ request for member `%D' is ambiguous in multiple inheritance lattice", name); print_candidates (value); *************** make_thunk (function, delta, vcall_index *** 332,338 **** thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id); if (thunk && !DECL_THUNK_P (thunk)) { ! cp_error ("implementation-reserved name `%D' used", thunk_id); thunk = NULL_TREE; SET_IDENTIFIER_GLOBAL_VALUE (thunk_id, thunk); } --- 294,300 ---- thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id); if (thunk && !DECL_THUNK_P (thunk)) { ! error ("implementation-reserved name `%D' used", thunk_id); thunk = NULL_TREE; SET_IDENTIFIER_GLOBAL_VALUE (thunk_id, thunk); } *************** use_thunk (thunk_fndecl, emit_p) *** 396,404 **** fnaddr = DECL_INITIAL (thunk_fndecl); if (TREE_CODE (DECL_INITIAL (thunk_fndecl)) != ADDR_EXPR) /* We already turned this thunk into an ordinary function. ! There's no need to process this thunk again. (We can't just ! clear DECL_THUNK_P because that will confuse ! FNADDR_FROM_VTABLE_ENTRY and friends.) */ return; /* Thunks are always addressable; they only appear in vtables. */ --- 358,364 ---- fnaddr = DECL_INITIAL (thunk_fndecl); if (TREE_CODE (DECL_INITIAL (thunk_fndecl)) != ADDR_EXPR) /* We already turned this thunk into an ordinary function. ! There's no need to process this thunk again. */ return; /* Thunks are always addressable; they only appear in vtables. */ *************** use_thunk (thunk_fndecl, emit_p) *** 432,437 **** --- 392,403 ---- push_to_top_level (); + /* The back-end expects DECL_INITIAL to contain a BLOCK, so we + create one. */ + DECL_INITIAL (thunk_fndecl) = make_node (BLOCK); + BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) + = DECL_ARGUMENTS (thunk_fndecl); + #ifdef ASM_OUTPUT_MI_THUNK if (!vcall_offset) { *************** use_thunk (thunk_fndecl, emit_p) *** 451,534 **** } else #endif /* ASM_OUTPUT_MI_THUNK */ ! { ! /* If we don't have the necessary macro for efficient thunks, generate a ! thunk function that just makes a call to the real function. ! Unfortunately, this doesn't work for varargs. */ ! tree a, t; ! if (varargs_function_p (function)) ! cp_error ("generic thunk code fails for method `%#D' which uses `...'", ! function); ! /* Set up clone argument trees for the thunk. */ ! t = NULL_TREE; ! for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a)) ! { ! tree x = copy_node (a); ! TREE_CHAIN (x) = t; ! DECL_CONTEXT (x) = thunk_fndecl; ! t = x; ! } ! a = nreverse (t); ! DECL_ARGUMENTS (thunk_fndecl) = a; ! DECL_RESULT (thunk_fndecl) = NULL_TREE; ! start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED); ! /* Adjust the this pointer by the constant. */ ! t = ssize_int (delta); ! t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t)); ! /* If there's a vcall offset, look up that value in the vtable and ! adjust the `this' pointer again. */ ! if (vcall_offset && !integer_zerop (vcall_offset)) ! { ! tree orig_this; ! t = save_expr (t); ! orig_this = t; ! /* The vptr is always at offset zero in the object. */ ! t = build1 (NOP_EXPR, ! build_pointer_type (build_pointer_type ! (vtable_entry_type)), ! t); ! /* Form the vtable address. */ ! t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t); ! /* Find the entry with the vcall offset. */ ! t = build (PLUS_EXPR, TREE_TYPE (t), t, vcall_offset); ! /* Calculate the offset itself. */ ! t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t); ! /* Adjust the `this' pointer. */ ! t = fold (build (PLUS_EXPR, ! TREE_TYPE (orig_this), ! orig_this, ! t)); ! } ! /* Build up the call to the real function. */ ! t = tree_cons (NULL_TREE, t, NULL_TREE); ! for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a)) ! t = tree_cons (NULL_TREE, a, t); ! t = nreverse (t); ! t = build_call (function, t); ! if (VOID_TYPE_P (TREE_TYPE (t))) ! finish_expr_stmt (t); ! else ! finish_return_stmt (t); ! /* The back-end expects DECL_INITIAL to contain a BLOCK, so we ! create one. */ ! DECL_INITIAL (thunk_fndecl) = make_node (BLOCK); ! BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) ! = DECL_ARGUMENTS (thunk_fndecl); ! /* Since we want to emit the thunk, we explicitly mark its name as ! referenced. */ ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl)) = 1; ! expand_body (finish_function (0)); ! } pop_from_top_level (); } --- 417,499 ---- } else #endif /* ASM_OUTPUT_MI_THUNK */ ! { ! /* If we don't have the necessary macro for efficient thunks, generate ! a thunk function that just makes a call to the real function. ! Unfortunately, this doesn't work for varargs. */ ! tree a, t; ! if (varargs_function_p (function)) ! error ("generic thunk code fails for method `%#D' which uses `...'", ! function); ! /* Set up clone argument trees for the thunk. */ ! t = NULL_TREE; ! for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a)) ! { ! tree x = copy_node (a); ! TREE_CHAIN (x) = t; ! DECL_CONTEXT (x) = thunk_fndecl; ! t = x; ! } ! a = nreverse (t); ! DECL_ARGUMENTS (thunk_fndecl) = a; ! DECL_RESULT (thunk_fndecl) = NULL_TREE; ! start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED); ! /* We don't bother with a body block for thunks. */ ! /* Adjust the this pointer by the constant. */ ! t = ssize_int (delta); ! t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t)); ! /* If there's a vcall offset, look up that value in the vtable and ! adjust the `this' pointer again. */ ! if (vcall_offset && !integer_zerop (vcall_offset)) ! { ! tree orig_this; ! t = save_expr (t); ! orig_this = t; ! /* The vptr is always at offset zero in the object. */ ! t = build1 (NOP_EXPR, ! build_pointer_type (build_pointer_type ! (vtable_entry_type)), ! t); ! /* Form the vtable address. */ ! t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t); ! /* Find the entry with the vcall offset. */ ! t = build (PLUS_EXPR, TREE_TYPE (t), t, vcall_offset); ! /* Calculate the offset itself. */ ! t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t); ! /* Adjust the `this' pointer. */ ! t = fold (build (PLUS_EXPR, ! TREE_TYPE (orig_this), ! orig_this, ! t)); ! } ! /* Build up the call to the real function. */ ! t = tree_cons (NULL_TREE, t, NULL_TREE); ! for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a)) ! t = tree_cons (NULL_TREE, a, t); ! t = nreverse (t); ! t = build_call (function, t); ! if (VOID_TYPE_P (TREE_TYPE (t))) ! finish_expr_stmt (t); ! else ! finish_return_stmt (t); ! /* Since we want to emit the thunk, we explicitly mark its name as ! referenced. */ ! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl)) = 1; ! /* But we don't want debugging information about it. */ ! DECL_IGNORED_P (thunk_fndecl) = 1; ! ! expand_body (finish_function (0)); ! } pop_from_top_level (); } *************** do_build_copy_constructor (fndecl) *** 562,589 **** tree binfos = TYPE_BINFO_BASETYPES (current_class_type); tree member_init_list = NULL_TREE; tree base_init_list = NULL_TREE; ! int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm)); int i; ! /* Initialize all the base-classes with the parameter converted to ! their type so that we get their copy constructor and not another ! constructor that takes current_class_type. */ for (t = CLASSTYPE_VBASECLASSES (current_class_type); t; t = TREE_CHAIN (t)) { ! tree type = BINFO_TYPE (TREE_VALUE (t)); ! base_init_list = tree_cons (type, convert_lvalue (type, parm), base_init_list); } for (i = 0; i < n_bases; ++i) { ! t = TREE_VEC_ELT (binfos, i); ! if (TREE_VIA_VIRTUAL (t)) continue; ! t = BINFO_TYPE (t); ! base_init_list = tree_cons (t, convert_lvalue (t, parm), base_init_list); } --- 527,560 ---- tree binfos = TYPE_BINFO_BASETYPES (current_class_type); tree member_init_list = NULL_TREE; tree base_init_list = NULL_TREE; ! int cvquals = cp_type_quals (TREE_TYPE (parm)); int i; ! /* Initialize all the base-classes with the parameter converted ! to their type so that we get their copy constructor and not ! another constructor that takes current_class_type. We must ! deal with the binfo's directly as a direct base might be ! inaccessible due to ambiguity. */ for (t = CLASSTYPE_VBASECLASSES (current_class_type); t; t = TREE_CHAIN (t)) { ! tree binfo = TREE_VALUE (t); ! ! base_init_list = tree_cons (binfo, ! build_base_path (PLUS_EXPR, parm, ! binfo, 1), base_init_list); } for (i = 0; i < n_bases; ++i) { ! tree binfo = TREE_VEC_ELT (binfos, i); ! if (TREE_VIA_VIRTUAL (binfo)) continue; ! base_init_list = tree_cons (binfo, ! build_base_path (PLUS_EXPR, parm, ! binfo, 1), base_init_list); } *************** do_build_copy_constructor (fndecl) *** 591,596 **** --- 562,568 ---- { tree init; tree field = fields; + tree expr_type; if (TREE_CODE (field) != FIELD_DECL) continue; *************** do_build_copy_constructor (fndecl) *** 600,607 **** { if (VFIELD_NAME_P (DECL_NAME (field))) continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; /* True for duplicate members. */ if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) --- 572,577 ---- *************** do_build_copy_constructor (fndecl) *** 615,623 **** else continue; ! init = build (COMPONENT_REF, ! build_qualified_type (TREE_TYPE (field), cvquals), ! init, field); init = build_tree_list (NULL_TREE, init); member_init_list --- 585,599 ---- else continue; ! /* Compute the type of "init->field". If the copy-constructor ! parameter is, for example, "const S&", and the type of ! the field is "T", then the type will usually be "const ! T". (There are no cv-qualified variants of reference ! types.) */ ! expr_type = TREE_TYPE (field); ! if (TREE_CODE (expr_type) != REFERENCE_TYPE) ! expr_type = cp_build_qualified_type (expr_type, cvquals); ! init = build (COMPONENT_REF, expr_type, init, field); init = build_tree_list (NULL_TREE, init); member_init_list *************** do_build_copy_constructor (fndecl) *** 625,631 **** } member_init_list = nreverse (member_init_list); base_init_list = nreverse (base_init_list); ! setup_vtbl_ptr (member_init_list, base_init_list); } } --- 601,607 ---- } member_init_list = nreverse (member_init_list); base_init_list = nreverse (base_init_list); ! emit_base_init (member_init_list, base_init_list); } } *************** do_build_assign_ref (fndecl) *** 653,668 **** tree fields = TYPE_FIELDS (current_class_type); int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); tree binfos = TYPE_BINFO_BASETYPES (current_class_type); ! int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm)); int i; for (i = 0; i < n_bases; ++i) { ! tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); ! tree p = convert_lvalue (basetype, parm); ! p = build_member_call (basetype, ansi_assopname (NOP_EXPR), ! build_tree_list (NULL_TREE, p)); ! finish_expr_stmt (p); } for (; fields; fields = TREE_CHAIN (fields)) { --- 629,651 ---- tree fields = TYPE_FIELDS (current_class_type); int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); tree binfos = TYPE_BINFO_BASETYPES (current_class_type); ! int cvquals = cp_type_quals (TREE_TYPE (parm)); int i; for (i = 0; i < n_bases; ++i) { ! /* We must deal with the binfo's directly as a direct base ! might be inaccessible due to ambiguity. */ ! tree binfo = TREE_VEC_ELT (binfos, i); ! tree src = build_base_path (PLUS_EXPR, parm, binfo, 1); ! tree dst = build_base_path (PLUS_EXPR, current_class_ref, binfo, 1); ! ! tree expr = build_method_call (dst, ! ansi_assopname (NOP_EXPR), ! build_tree_list (NULL_TREE, src), ! binfo, ! LOOKUP_NORMAL | LOOKUP_NONVIRTUAL); ! finish_expr_stmt (expr); } for (; fields; fields = TREE_CHAIN (fields)) { *************** do_build_assign_ref (fndecl) *** 674,685 **** if (CP_TYPE_CONST_P (TREE_TYPE (field))) { ! cp_error ("non-static const member `%#D', can't use default assignment operator", field); continue; } else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) { ! cp_error ("non-static reference member `%#D', can't use default assignment operator", field); continue; } --- 657,668 ---- if (CP_TYPE_CONST_P (TREE_TYPE (field))) { ! error ("non-static const member `%#D', can't use default assignment operator", field); continue; } else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) { ! error ("non-static reference member `%#D', can't use default assignment operator", field); continue; } *************** do_build_assign_ref (fndecl) *** 690,697 **** { if (VFIELD_NAME_P (DECL_NAME (field))) continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; /* True for duplicate members. */ if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) --- 673,678 ---- *************** synthesize_method (fndecl) *** 728,733 **** --- 709,715 ---- int nested = (current_function_decl != NULL_TREE); tree context = decl_function_context (fndecl); int need_body = 1; + tree stmt; if (at_eof) import_export_decl (fndecl); *************** synthesize_method (fndecl) *** 758,778 **** interface_unknown = 1; start_function (NULL_TREE, fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED); clear_last_expr (); if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR) { do_build_assign_ref (fndecl); need_body = 0; } ! else if (DECL_DESTRUCTOR_P (fndecl)) ! setup_vtbl_ptr (NULL_TREE, NULL_TREE); ! else { tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl); if (arg_chain != void_list_node) do_build_copy_constructor (fndecl); else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) ! setup_vtbl_ptr (NULL_TREE, NULL_TREE); } /* If we haven't yet generated the body of the function, just --- 740,759 ---- interface_unknown = 1; start_function (NULL_TREE, fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED); clear_last_expr (); + stmt = begin_function_body (); if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR) { do_build_assign_ref (fndecl); need_body = 0; } ! else if (DECL_CONSTRUCTOR_P (fndecl)) { tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl); if (arg_chain != void_list_node) do_build_copy_constructor (fndecl); else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) ! finish_mem_initializers (NULL_TREE); } /* If we haven't yet generated the body of the function, just *************** synthesize_method (fndecl) *** 784,789 **** --- 765,771 ---- finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); } + finish_function_body (stmt); expand_body (finish_function (0)); extract_interface_info (); *************** synthesize_method (fndecl) *** 795,802 **** /* Use EXTRACTOR to locate the relevant function called for each base & class field of TYPE. CLIENT allows additional information to be passed ! to EXTRACTOR. Generates the union of all exceptions generated by ! those functions. */ static tree synthesize_exception_spec (type, extractor, client) --- 777,785 ---- /* Use EXTRACTOR to locate the relevant function called for each base & class field of TYPE. CLIENT allows additional information to be passed ! to EXTRACTOR. Generates the union of all exceptions generated by those ! functions. Note that we haven't updated TYPE_FIELDS and such of any ! variants yet, so we need to look at the main one. */ static tree synthesize_exception_spec (type, extractor, client) *************** synthesize_exception_spec (type, extract *** 808,814 **** tree fields = TYPE_FIELDS (type); int i, n_bases = CLASSTYPE_N_BASECLASSES (type); tree binfos = TYPE_BINFO_BASETYPES (type); ! for (i = 0; i != n_bases; i++) { tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); --- 791,797 ---- tree fields = TYPE_FIELDS (type); int i, n_bases = CLASSTYPE_N_BASECLASSES (type); tree binfos = TYPE_BINFO_BASETYPES (type); ! for (i = 0; i != n_bases; i++) { tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); *************** locate_copy (type, client_) *** 934,940 **** continue; if (!sufficient_parms_p (TREE_CHAIN (parms))) continue; ! quals = CP_TYPE_QUALS (src_type); if (client->quals & ~quals) continue; excess = quals & ~client->quals; --- 917,923 ---- continue; if (!sufficient_parms_p (TREE_CHAIN (parms))) continue; ! quals = cp_type_quals (src_type); if (client->quals & ~quals) continue; excess = quals & ~client->quals; *************** implicitly_declare_fn (kind, type, const *** 987,993 **** case sfk_assignment_operator: { struct copy_data data; ! tree argtype; has_parm = 1; data.name = NULL; --- 970,976 ---- case sfk_assignment_operator: { struct copy_data data; ! tree argtype = type; has_parm = 1; data.name = NULL; *************** implicitly_declare_fn (kind, type, const *** 1003,1012 **** if (const_p) { data.quals = TYPE_QUAL_CONST; ! type = build_qualified_type (type, TYPE_QUAL_CONST); } ! argtype = build_reference_type (type); args = build_tree_list (hash_tree_chain (argtype, NULL_TREE), get_identifier ("_ctor_arg")); args = tree_cons (NULL_TREE, args, void_list_node); --- 986,995 ---- if (const_p) { data.quals = TYPE_QUAL_CONST; ! argtype = build_qualified_type (argtype, TYPE_QUAL_CONST); } ! argtype = build_reference_type (argtype); args = build_tree_list (hash_tree_chain (argtype, NULL_TREE), get_identifier ("_ctor_arg")); args = tree_cons (NULL_TREE, args, void_list_node); *************** implicitly_declare_fn (kind, type, const *** 1015,1021 **** break; } default: ! my_friendly_abort (59); } TREE_PARMLIST (args) = 1; --- 998,1004 ---- break; } default: ! abort (); } TREE_PARMLIST (args) = 1; diff -Nrc3pad gcc-3.0.4/gcc/cp/operators.def gcc-3.1/gcc/cp/operators.def *** gcc-3.0.4/gcc/cp/operators.def Mon Dec 3 17:38:51 2001 --- gcc-3.1/gcc/cp/operators.def Sun Dec 16 16:07:00 2001 *************** Boston, MA 02111-1307, USA. */ *** 29,35 **** NAME The name of the operator, as a C string, but without the ! preceeding `operator'. This is the name that would be given in the source program. For `operator +', for example, this would be `+'. --- 29,35 ---- NAME The name of the operator, as a C string, but without the ! preceding `operator'. This is the name that would be given in the source program. For `operator +', for example, this would be `+'. *************** Boston, MA 02111-1307, USA. */ *** 48,54 **** OLD_MANGLING ! Analagous, but for the old ABI. ARITY --- 48,54 ---- OLD_MANGLING ! Analogous, but for the old ABI. ARITY *************** Boston, MA 02111-1307, USA. */ *** 65,71 **** There is code (such as in grok_op_properties) that depends on the order the operators are presented in this file. In particular, ! unary operators must preceed binary operators. */ /* Use DEF_SIMPLE_OPERATOR to define a non-assignment operator. Its arguments are as for DEF_OPERATOR, but there is no need to provide --- 65,71 ---- There is code (such as in grok_op_properties) that depends on the order the operators are presented in this file. In particular, ! unary operators must precede binary operators. */ /* Use DEF_SIMPLE_OPERATOR to define a non-assignment operator. Its arguments are as for DEF_OPERATOR, but there is no need to provide diff -Nrc3pad gcc-3.0.4/gcc/cp/optimize.c gcc-3.1/gcc/cp/optimize.c *** gcc-3.0.4/gcc/cp/optimize.c Wed Jan 2 17:18:12 2002 --- gcc-3.1/gcc/cp/optimize.c Sun Dec 16 16:07:00 2001 *************** Software Foundation, 59 Temple Place - S *** 32,948 **** #include "ggc.h" #include "params.h" #include "hashtab.h" ! ! /* To Do: ! ! o In order to make inlining-on-trees work, we pessimized ! function-local static constants. In particular, they are now ! always output, even when not addressed. Fix this by treating ! function-local static constants just like global static ! constants; the back-end already knows not to output them if they ! are not needed. ! ! o Provide heuristics to clamp inlining of recursive template ! calls? */ ! ! /* Data required for function inlining. */ ! ! typedef struct inline_data ! { ! /* A stack of the functions we are inlining. For example, if we are ! compiling `f', which calls `g', which calls `h', and we are ! inlining the body of `h', the stack will contain, `h', followed ! by `g', followed by `f'. The first few elements of the stack may ! contain other functions that we know we should not recurse into, ! even though they are not directly being inlined. */ ! varray_type fns; ! /* The index of the first element of FNS that really represents an ! inlined function. */ ! unsigned first_inlined_fn; ! /* The label to jump to when a return statement is encountered. If ! this value is NULL, then return statements will simply be ! remapped as return statements, rather than as jumps. */ ! tree ret_label; ! /* The map from local declarations in the inlined function to ! equivalents in the function into which it is being inlined. */ ! splay_tree decl_map; ! /* Nonzero if we are currently within the cleanup for a ! TARGET_EXPR. */ ! int in_target_cleanup_p; ! /* A stack of the TARGET_EXPRs that we are currently processing. */ ! varray_type target_exprs; ! /* A list of the functions current function has inlined. */ ! varray_type inlined_fns; ! /* The approximate number of statements we have inlined in the ! current call stack. */ ! int inlined_stmts; ! /* We use the same mechanism to build clones that we do to perform ! inlining. However, there are a few places where we need to ! distinguish between those two situations. This flag is true nif ! we are cloning, rather than inlining. */ ! bool cloning_p; ! /* Hash table used to prevent walk_tree from visiting the same node ! umpteen million times. */ ! htab_t tree_pruner; ! } inline_data; /* Prototypes. */ - static tree initialize_inlined_parameters PARAMS ((inline_data *, tree, tree)); - static tree declare_return_variable PARAMS ((inline_data *, tree *)); - static tree copy_body_r PARAMS ((tree *, int *, void *)); - static tree copy_body PARAMS ((inline_data *)); - static tree expand_call_inline PARAMS ((tree *, int *, void *)); - static void expand_calls_inline PARAMS ((tree *, inline_data *)); - static int inlinable_function_p PARAMS ((tree, inline_data *)); - static tree remap_decl PARAMS ((tree, inline_data *)); - static void remap_block PARAMS ((tree, tree, inline_data *)); - static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *)); static tree calls_setjmp_r PARAMS ((tree *, int *, void *)); static void update_cloned_parm PARAMS ((tree, tree)); static void dump_function PARAMS ((enum tree_dump_index, tree)); - /* The approximate number of instructions per statement. This number - need not be particularly accurate; it is used only to make - decisions about when a function is too big to inline. */ - #define INSNS_PER_STMT (10) - - /* Remap DECL during the copying of the BLOCK tree for the function. */ - - static tree - remap_decl (decl, id) - tree decl; - inline_data *id; - { - splay_tree_node n; - tree fn; - - /* We only remap local variables in the current function. */ - fn = VARRAY_TOP_TREE (id->fns); - if (!nonstatic_local_decl_p (decl) || DECL_CONTEXT (decl) != fn) - return NULL_TREE; - - /* See if we have remapped this declaration. */ - n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl); - /* If we didn't already have an equivalent for this declaration, - create one now. */ - if (!n) - { - tree t; - - /* Make a copy of the variable or label. */ - t = copy_decl_for_inlining (decl, fn, - VARRAY_TREE (id->fns, 0)); - - /* The decl T could be a dynamic array or other variable size type, - in which case some fields need to be remapped because they may - contain SAVE_EXPRs. */ - walk_tree (&DECL_SIZE (t), copy_body_r, id, NULL); - walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id, NULL); - if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE - && TYPE_DOMAIN (TREE_TYPE (t))) - { - TREE_TYPE (t) = copy_node (TREE_TYPE (t)); - TYPE_DOMAIN (TREE_TYPE (t)) - = copy_node (TYPE_DOMAIN (TREE_TYPE (t))); - walk_tree (&TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))), - copy_body_r, id, NULL); - } - - if (!DECL_NAME (t) && TREE_TYPE (t) - && ANON_AGGR_TYPE_P (TREE_TYPE ((t)))) - { - /* For a VAR_DECL of anonymous type, we must also copy the - member VAR_DECLS here and rechain the - DECL_ANON_UNION_ELEMS. */ - tree members = NULL; - tree src; - - for (src = DECL_ANON_UNION_ELEMS (t); src; - src = TREE_CHAIN (src)) - { - tree member = remap_decl (TREE_VALUE (src), id); - - my_friendly_assert (!TREE_PURPOSE (src), 20010529); - members = tree_cons (NULL, member, members); - } - DECL_ANON_UNION_ELEMS (t) = nreverse (members); - } - - /* Remember it, so that if we encounter this local entity - again we can reuse this copy. */ - n = splay_tree_insert (id->decl_map, - (splay_tree_key) decl, - (splay_tree_value) t); - } - - return (tree) n->value; - } - - /* Copy the SCOPE_STMT_BLOCK associated with SCOPE_STMT to contain - remapped versions of the variables therein. And hook the new block - into the block-tree. If non-NULL, the DECLS are declarations to - add to use instead of the BLOCK_VARS in the old block. */ - - static void - remap_block (scope_stmt, decls, id) - tree scope_stmt; - tree decls; - inline_data *id; - { - /* We cannot do this in the cleanup for a TARGET_EXPR since we do - not know whether or not expand_expr will actually write out the - code we put there. If it does not, then we'll have more BLOCKs - than block-notes, and things will go awry. At some point, we - should make the back-end handle BLOCK notes in a tidier way, - without requiring a strict correspondence to the block-tree; then - this check can go. */ - if (id->in_target_cleanup_p) - { - SCOPE_STMT_BLOCK (scope_stmt) = NULL_TREE; - return; - } - - /* If this is the beginning of a scope, remap the associated BLOCK. */ - if (SCOPE_BEGIN_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt)) - { - tree old_block; - tree new_block; - tree old_var; - tree fn; - - /* Make the new block. */ - old_block = SCOPE_STMT_BLOCK (scope_stmt); - new_block = make_node (BLOCK); - TREE_USED (new_block) = TREE_USED (old_block); - BLOCK_ABSTRACT_ORIGIN (new_block) = old_block; - SCOPE_STMT_BLOCK (scope_stmt) = new_block; - - /* Remap its variables. */ - for (old_var = decls ? decls : BLOCK_VARS (old_block); - old_var; - old_var = TREE_CHAIN (old_var)) - { - tree new_var; - - /* Remap the variable. */ - new_var = remap_decl (old_var, id); - /* If we didn't remap this variable, so we can't mess with - its TREE_CHAIN. If we remapped this variable to - something other than a declaration (say, if we mapped it - to a constant), then we must similarly omit any mention - of it here. */ - if (!new_var || !DECL_P (new_var)) - ; - else - { - TREE_CHAIN (new_var) = BLOCK_VARS (new_block); - BLOCK_VARS (new_block) = new_var; - } - } - /* We put the BLOCK_VARS in reverse order; fix that now. */ - BLOCK_VARS (new_block) = nreverse (BLOCK_VARS (new_block)); - fn = VARRAY_TREE (id->fns, 0); - if (id->cloning_p) - /* We're building a clone; DECL_INITIAL is still - error_mark_node, and current_binding_level is the parm - binding level. */ - insert_block (new_block); - else - { - /* Attach this new block after the DECL_INITIAL block for the - function into which this block is being inlined. In - rest_of_compilation we will straighten out the BLOCK tree. */ - tree *first_block; - if (DECL_INITIAL (fn)) - first_block = &BLOCK_CHAIN (DECL_INITIAL (fn)); - else - first_block = &DECL_INITIAL (fn); - BLOCK_CHAIN (new_block) = *first_block; - *first_block = new_block; - } - /* Remember the remapped block. */ - splay_tree_insert (id->decl_map, - (splay_tree_key) old_block, - (splay_tree_value) new_block); - } - /* If this is the end of a scope, set the SCOPE_STMT_BLOCK to be the - remapped block. */ - else if (SCOPE_END_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt)) - { - splay_tree_node n; - - /* Find this block in the table of remapped things. */ - n = splay_tree_lookup (id->decl_map, - (splay_tree_key) SCOPE_STMT_BLOCK (scope_stmt)); - my_friendly_assert (n != NULL, 19991203); - SCOPE_STMT_BLOCK (scope_stmt) = (tree) n->value; - } - } - - /* Copy the SCOPE_STMT pointed to by TP. */ - - static void - copy_scope_stmt (tp, walk_subtrees, id) - tree *tp; - int *walk_subtrees; - inline_data *id; - { - tree block; - - /* Remember whether or not this statement was nullified. When - making a copy, copy_tree_r always sets SCOPE_NULLIFIED_P (and - doesn't copy the SCOPE_STMT_BLOCK) to free callers from having to - deal with copying BLOCKs if they do not wish to do so. */ - block = SCOPE_STMT_BLOCK (*tp); - /* Copy (and replace) the statement. */ - copy_tree_r (tp, walk_subtrees, NULL); - /* Restore the SCOPE_STMT_BLOCK. */ - SCOPE_STMT_BLOCK (*tp) = block; - - /* Remap the associated block. */ - remap_block (*tp, NULL_TREE, id); - } - - /* Called from copy_body via walk_tree. DATA is really an - `inline_data *'. */ - - static tree - copy_body_r (tp, walk_subtrees, data) - tree *tp; - int *walk_subtrees; - void *data; - { - inline_data* id; - tree fn; - - /* Set up. */ - id = (inline_data *) data; - fn = VARRAY_TOP_TREE (id->fns); - - /* All automatic variables should have a DECL_CONTEXT indicating - what function they come from. */ - if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL) - && DECL_NAMESPACE_SCOPE_P (*tp)) - my_friendly_assert (DECL_EXTERNAL (*tp) || TREE_STATIC (*tp), - 19991113); - - /* If this is a RETURN_STMT, change it into an EXPR_STMT and a - GOTO_STMT with the RET_LABEL as its target. */ - if (TREE_CODE (*tp) == RETURN_STMT && id->ret_label) - { - tree return_stmt = *tp; - tree goto_stmt; - - /* Build the GOTO_STMT. */ - goto_stmt = build_stmt (GOTO_STMT, id->ret_label); - TREE_CHAIN (goto_stmt) = TREE_CHAIN (return_stmt); - - /* If we're returning something, just turn that into an - assignment into the equivalent of the original - RESULT_DECL. */ - if (RETURN_EXPR (return_stmt)) - { - *tp = build_stmt (EXPR_STMT, - RETURN_EXPR (return_stmt)); - STMT_IS_FULL_EXPR_P (*tp) = 1; - /* And then jump to the end of the function. */ - TREE_CHAIN (*tp) = goto_stmt; - } - /* If we're not returning anything just do the jump. */ - else - *tp = goto_stmt; - } - /* Local variables and labels need to be replaced by equivalent - variables. We don't want to copy static variables; there's only - one of those, no matter how many times we inline the containing - function. */ - else if (nonstatic_local_decl_p (*tp) && DECL_CONTEXT (*tp) == fn) - { - tree new_decl; - - /* Remap the declaration. */ - new_decl = remap_decl (*tp, id); - my_friendly_assert (new_decl != NULL_TREE, 19991203); - /* Replace this variable with the copy. */ - STRIP_TYPE_NOPS (new_decl); - *tp = new_decl; - } - else if (nonstatic_local_decl_p (*tp) - && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0)) - my_friendly_abort (0); - else if (TREE_CODE (*tp) == SAVE_EXPR) - remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0), - walk_subtrees); - else if (TREE_CODE (*tp) == UNSAVE_EXPR) - /* UNSAVE_EXPRs should not be generated until expansion time. */ - my_friendly_abort (19991113); - /* For a SCOPE_STMT, we must copy the associated block so that we - can write out debugging information for the inlined variables. */ - else if (TREE_CODE (*tp) == SCOPE_STMT && !id->in_target_cleanup_p) - copy_scope_stmt (tp, walk_subtrees, id); - /* Otherwise, just copy the node. Note that copy_tree_r already - knows not to copy VAR_DECLs, etc., so this is safe. */ - else - { - copy_tree_r (tp, walk_subtrees, NULL); - - /* The copied TARGET_EXPR has never been expanded, even if the - original node was expanded already. */ - if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3)) - { - TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3); - TREE_OPERAND (*tp, 3) = NULL_TREE; - } - else if (TREE_CODE (*tp) == MODIFY_EXPR - && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1) - && nonstatic_local_decl_p (TREE_OPERAND (*tp, 0)) - && DECL_CONTEXT (TREE_OPERAND (*tp, 0)) == fn) - { - /* Some assignments VAR = VAR; don't generate any rtl code - and thus don't count as variable modification. Avoid - keeping bogosities like 0 = 0. */ - tree decl = TREE_OPERAND (*tp, 0), value; - splay_tree_node n; - - n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl); - if (n) - { - value = (tree) n->value; - STRIP_TYPE_NOPS (value); - if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value)) - *tp = value; - } - } - } - - /* Keep iterating. */ - return NULL_TREE; - } - - /* Make a copy of the body of FN so that it can be inserted inline in - another function. */ - - static tree - copy_body (id) - inline_data *id; - { - tree body; - - body = DECL_SAVED_TREE (VARRAY_TOP_TREE (id->fns)); - walk_tree (&body, copy_body_r, id, NULL); - - return body; - } - - /* Generate code to initialize the parameters of the function at the - top of the stack in ID from the ARGS (presented as a TREE_LIST). */ - - static tree - initialize_inlined_parameters (id, args, fn) - inline_data *id; - tree args; - tree fn; - { - tree init_stmts; - tree parms; - tree a; - tree p; - - /* Figure out what the parameters are. */ - parms = DECL_ARGUMENTS (fn); - - /* Start with no initializations whatsoever. */ - init_stmts = NULL_TREE; - - /* Loop through the parameter declarations, replacing each with an - equivalent VAR_DECL, appropriately initialized. */ - for (p = parms, a = args; p; a = TREE_CHAIN (a), p = TREE_CHAIN (p)) - { - tree init_stmt; - tree var; - tree value; - - /* Find the initializer. */ - value = TREE_VALUE (a); - /* If the parameter is never assigned to, we may not need to - create a new variable here at all. Instead, we may be able - to just use the argument value. */ - if (TREE_READONLY (p) - && !TREE_ADDRESSABLE (p) - && !TREE_SIDE_EFFECTS (value)) - { - /* Simplify the value, if possible. */ - value = fold (decl_constant_value (value)); - - /* We can't risk substituting complex expressions. They - might contain variables that will be assigned to later. - Theoretically, we could check the expression to see if - all of the variables that determine its value are - read-only, but we don't bother. */ - if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value)) - { - /* If this is a declaration, wrap it a NOP_EXPR so that - we don't try to put the VALUE on the list of - BLOCK_VARS. */ - if (DECL_P (value)) - value = build1 (NOP_EXPR, TREE_TYPE (value), value); - - splay_tree_insert (id->decl_map, - (splay_tree_key) p, - (splay_tree_value) value); - continue; - } - } - - /* Make an equivalent VAR_DECL. */ - var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0)); - /* Register the VAR_DECL as the equivalent for the PARM_DECL; - that way, when the PARM_DECL is encountered, it will be - automatically replaced by the VAR_DECL. */ - splay_tree_insert (id->decl_map, - (splay_tree_key) p, - (splay_tree_value) var); - - /* Declare this new variable. */ - init_stmt = build_stmt (DECL_STMT, var); - TREE_CHAIN (init_stmt) = init_stmts; - init_stmts = init_stmt; - - /* Initialize this VAR_DECL from the equivalent argument. If - the argument is an object, created via a constructor or copy, - this will not result in an extra copy: the TARGET_EXPR - representing the argument will be bound to VAR, and the - object will be constructed in VAR. */ - if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p))) - DECL_INITIAL (var) = value; - else - { - /* Even if P was TREE_READONLY, the new VAR should not be. - In the original code, we would have constructed a - temporary, and then the function body would have never - changed the value of P. However, now, we will be - constructing VAR directly. The constructor body may - change its value multiple times as it is being - constructed. Therefore, it must not be TREE_READONLY; - the back-end assumes that TREE_READONLY variable is - assigned to only once. */ - TREE_READONLY (var) = 0; - - /* Build a run-time initialization. */ - init_stmt = build_stmt (EXPR_STMT, - build (INIT_EXPR, TREE_TYPE (p), - var, value)); - /* Add this initialization to the list. Note that we want the - declaration *after* the initialization because we are going - to reverse all the initialization statements below. */ - TREE_CHAIN (init_stmt) = init_stmts; - init_stmts = init_stmt; - } - } - - /* The initialization statements have been built up in reverse - order. Straighten them out now. */ - return nreverse (init_stmts); - } - - /* Declare a return variable to replace the RESULT_DECL for the - function we are calling. An appropriate DECL_STMT is returned. - The USE_STMT is filled in to contain a use of the declaration to - indicate the return value of the function. */ - - static tree - declare_return_variable (id, use_stmt) - struct inline_data *id; - tree *use_stmt; - { - tree fn = VARRAY_TOP_TREE (id->fns); - tree result = DECL_RESULT (fn); - tree var; - int aggregate_return_p; - - /* We don't need to do anything for functions that don't return - anything. */ - if (!result || VOID_TYPE_P (TREE_TYPE (result))) - { - *use_stmt = NULL_TREE; - return NULL_TREE; - } - - /* Figure out whether or not FN returns an aggregate. */ - aggregate_return_p = IS_AGGR_TYPE (TREE_TYPE (result)); - - /* If FN returns an aggregate then the caller will always create the - temporary (using a TARGET_EXPR) and the call will be the - initializing expression for the TARGET_EXPR. If we were just to - create a new VAR_DECL here, then the result of this function - would be copied (bitwise) into the variable initialized by the - TARGET_EXPR. That's incorrect, so we must transform any - references to the RESULT into references to the target. */ - if (aggregate_return_p) - { - my_friendly_assert (VARRAY_ACTIVE_SIZE (id->target_exprs) != 0, - 20000430); - var = TREE_OPERAND (VARRAY_TOP_TREE (id->target_exprs), 0); - my_friendly_assert - (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (var), - TREE_TYPE (result)), - 20000430); - } - /* Otherwise, make an appropriate copy. */ - else - var = copy_decl_for_inlining (result, fn, VARRAY_TREE (id->fns, 0)); - - /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that - way, when the RESULT_DECL is encountered, it will be - automatically replaced by the VAR_DECL. */ - splay_tree_insert (id->decl_map, - (splay_tree_key) result, - (splay_tree_value) var); - - /* Build the USE_STMT. */ - *use_stmt = build_stmt (EXPR_STMT, var); - - /* Build the declaration statement if FN does not return an - aggregate. */ - if (!aggregate_return_p) - return build_stmt (DECL_STMT, var); - /* If FN does return an aggregate, there's no need to declare the - return variable; we're using a variable in our caller's frame. */ - else - return NULL_TREE; - } - - /* Returns non-zero if FN is a function that can be inlined. */ - - static int - inlinable_function_p (fn, id) - tree fn; - inline_data *id; - { - int inlinable; - - /* If we've already decided this function shouldn't be inlined, - there's no need to check again. */ - if (DECL_UNINLINABLE (fn)) - return 0; - - /* Assume it is not inlinable. */ - inlinable = 0; - - /* If we're not inlining things, then nothing is inlinable. */ - if (!flag_inline_trees) - ; - /* If the function was not declared `inline', then we don't inline - it. */ - else if (!DECL_INLINE (fn)) - ; - /* We can't inline varargs functions. */ - else if (varargs_function_p (fn)) - ; - /* We can't inline functions that are too big. - * Only allow a single function to eat up half of our budget. */ - else if (DECL_NUM_STMTS (fn) * INSNS_PER_STMT > MAX_INLINE_INSNS / 2) - ; - /* All is well. We can inline this function. Traditionally, GCC - has refused to inline functions using alloca, or functions whose - values are returned in a PARALLEL, and a few other such obscure - conditions. We are not equally constrained at the tree level. */ - else - inlinable = 1; - - /* Squirrel away the result so that we don't have to check again. */ - DECL_UNINLINABLE (fn) = !inlinable; - - /* Even if this function is not itself too big to inline, it might - be that we've done so much inlining already that we don't want to - risk too much inlining any more and thus halve the acceptable size. */ - if ((DECL_NUM_STMTS (fn) + id->inlined_stmts) * INSNS_PER_STMT - > MAX_INLINE_INSNS - && DECL_NUM_STMTS (fn) * INSNS_PER_STMT > MAX_INLINE_INSNS / 4) - inlinable = 0; - - /* We can inline a template instantiation only if it's fully - instantiated. */ - if (inlinable - && DECL_TEMPLATE_INFO (fn) - && TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn))) - { - fn = instantiate_decl (fn, /*defer_ok=*/0); - inlinable = !TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)); - } - - /* If we don't have the function body available, we can't inline - it. */ - if (!DECL_SAVED_TREE (fn)) - inlinable = 0; - - /* Don't do recursive inlining, either. We don't record this in - DECL_UNINLINABLE; we may be able to inline this function later. */ - if (inlinable) - { - size_t i; - - for (i = 0; i < VARRAY_ACTIVE_SIZE (id->fns); ++i) - if (VARRAY_TREE (id->fns, i) == fn) - return 0; - - if (inlinable && DECL_LANG_SPECIFIC (fn) && DECL_INLINED_FNS (fn)) - { - int j; - tree inlined_fns = DECL_INLINED_FNS (fn); - - for (j = 0; j < TREE_VEC_LENGTH (inlined_fns); ++j) - if (TREE_VEC_ELT (inlined_fns, j) == VARRAY_TREE (id->fns, 0)) - return 0; - } - } - - /* Return the result. */ - return inlinable; - } - - /* If *TP is a CALL_EXPR, replace it with its inline expansion. */ - - static tree - expand_call_inline (tp, walk_subtrees, data) - tree *tp; - int *walk_subtrees; - void *data; - { - inline_data *id; - tree t; - tree expr; - tree chain; - tree fn; - tree scope_stmt; - tree use_stmt; - tree arg_inits; - tree *inlined_body; - splay_tree st; - - /* See what we've got. */ - id = (inline_data *) data; - t = *tp; - - /* Recurse, but letting recursive invocations know that we are - inside the body of a TARGET_EXPR. */ - if (TREE_CODE (*tp) == TARGET_EXPR) - { - int i, len = first_rtl_op (TARGET_EXPR); - - /* We're walking our own subtrees. */ - *walk_subtrees = 0; - - /* Push *TP on the stack of pending TARGET_EXPRs. */ - VARRAY_PUSH_TREE (id->target_exprs, *tp); - - /* Actually walk over them. This loop is the body of - walk_trees, omitting the case where the TARGET_EXPR - itself is handled. */ - for (i = 0; i < len; ++i) - { - if (i == 2) - ++id->in_target_cleanup_p; - walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data, - id->tree_pruner); - if (i == 2) - --id->in_target_cleanup_p; - } - - /* We're done with this TARGET_EXPR now. */ - VARRAY_POP (id->target_exprs); - - return NULL_TREE; - } - - if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') - /* Because types were not copied in copy_body, CALL_EXPRs beneath - them should not be expanded. This can happen if the type is a - dynamic array type, for example. */ - *walk_subtrees = 0; - - /* From here on, we're only interested in CALL_EXPRs. */ - if (TREE_CODE (t) != CALL_EXPR) - return NULL_TREE; - - /* First, see if we can figure out what function is being called. - If we cannot, then there is no hope of inlining the function. */ - fn = get_callee_fndecl (t); - if (!fn) - return NULL_TREE; - - /* Don't try to inline functions that are not well-suited to - inlining. */ - if (!inlinable_function_p (fn, id)) - return NULL_TREE; - - if (DECL_TEMPLATE_INSTANTIATION (fn) - && ! push_tinst_level (fn)) - return NULL_TREE; - - /* Set the current filename and line number to the function we are - inlining so that when we create new _STMT nodes here they get - line numbers corresponding to the function we are calling. We - wrap the whole inlined body in an EXPR_WITH_FILE_AND_LINE as well - because individual statements don't record the filename. */ - push_srcloc (fn->decl.filename, fn->decl.linenum); - - /* Build a statement-expression containing code to initialize the - arguments, the actual inline expansion of the body, and a label - for the return statements within the function to jump to. The - type of the statement expression is the return type of the - function call. */ - expr = build_min (STMT_EXPR, TREE_TYPE (TREE_TYPE (fn)), NULL_TREE); - - /* Local declarations will be replaced by their equivalents in this - map. */ - st = id->decl_map; - id->decl_map = splay_tree_new (splay_tree_compare_pointers, - NULL, NULL); - - /* Initialize the parameters. */ - arg_inits = initialize_inlined_parameters (id, TREE_OPERAND (t, 1), fn); - /* Expand any inlined calls in the initializers. Do this before we - push FN on the stack of functions we are inlining; we want to - inline calls to FN that appear in the initializers for the - parameters. */ - expand_calls_inline (&arg_inits, id); - /* And add them to the tree. */ - STMT_EXPR_STMT (expr) = chainon (STMT_EXPR_STMT (expr), arg_inits); - - /* Record the function we are about to inline so that we can avoid - recursing into it. */ - VARRAY_PUSH_TREE (id->fns, fn); - - /* Record the function we are about to inline if optimize_function - has not been called on it yet and we don't have it in the list. */ - if (DECL_LANG_SPECIFIC (fn) && !DECL_INLINED_FNS (fn)) - { - int i; - - for (i = VARRAY_ACTIVE_SIZE (id->inlined_fns) - 1; i >= 0; i--) - if (VARRAY_TREE (id->inlined_fns, i) == fn) - break; - if (i < 0) - VARRAY_PUSH_TREE (id->inlined_fns, fn); - } - - /* Return statements in the function body will be replaced by jumps - to the RET_LABEL. */ - id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0); - - /* Create a block to put the parameters in. We have to do this - after the parameters have been remapped because remapping - parameters is different from remapping ordinary variables. */ - scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn)); - SCOPE_BEGIN_P (scope_stmt) = 1; - SCOPE_NO_CLEANUPS_P (scope_stmt) = 1; - remap_block (scope_stmt, DECL_ARGUMENTS (fn), id); - TREE_CHAIN (scope_stmt) = STMT_EXPR_STMT (expr); - STMT_EXPR_STMT (expr) = scope_stmt; - - /* Tell the debugging backends that this block represents the - outermost scope of the inlined function. */ - if (SCOPE_STMT_BLOCK (scope_stmt)) - BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope_stmt)) = DECL_ORIGIN (fn); - - /* Declare the return variable for the function. */ - STMT_EXPR_STMT (expr) - = chainon (STMT_EXPR_STMT (expr), - declare_return_variable (id, &use_stmt)); - - /* After we've initialized the parameters, we insert the body of the - function itself. */ - inlined_body = &STMT_EXPR_STMT (expr); - while (*inlined_body) - inlined_body = &TREE_CHAIN (*inlined_body); - *inlined_body = copy_body (id); - - /* Close the block for the parameters. */ - scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn)); - SCOPE_NO_CLEANUPS_P (scope_stmt) = 1; - my_friendly_assert (DECL_INITIAL (fn) - && TREE_CODE (DECL_INITIAL (fn)) == BLOCK, - 19991203); - remap_block (scope_stmt, NULL_TREE, id); - STMT_EXPR_STMT (expr) - = chainon (STMT_EXPR_STMT (expr), scope_stmt); - - /* After the body of the function comes the RET_LABEL. This must come - before we evaluate the returned value below, because that evalulation - may cause RTL to be generated. */ - STMT_EXPR_STMT (expr) - = chainon (STMT_EXPR_STMT (expr), - build_stmt (LABEL_STMT, id->ret_label)); - - /* Finally, mention the returned value so that the value of the - statement-expression is the returned value of the function. */ - STMT_EXPR_STMT (expr) = chainon (STMT_EXPR_STMT (expr), use_stmt); - - /* Clean up. */ - splay_tree_delete (id->decl_map); - id->decl_map = st; - - /* The new expression has side-effects if the old one did. */ - TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t); - - /* Replace the call by the inlined body. Wrap it in an - EXPR_WITH_FILE_LOCATION so that we'll get debugging line notes - pointing to the right place. */ - chain = TREE_CHAIN (*tp); - *tp = build_expr_wfl (expr, DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn), - /*col=*/0); - EXPR_WFL_EMIT_LINE_NOTE (*tp) = 1; - TREE_CHAIN (*tp) = chain; - pop_srcloc (); - - /* If the value of the new expression is ignored, that's OK. We - don't warn about this for CALL_EXPRs, so we shouldn't warn about - the equivalent inlined version either. */ - TREE_USED (*tp) = 1; - - /* Our function now has more statements than it did before. */ - DECL_NUM_STMTS (VARRAY_TREE (id->fns, 0)) += DECL_NUM_STMTS (fn); - id->inlined_stmts += DECL_NUM_STMTS (fn); - - /* Recurse into the body of the just inlined function. */ - expand_calls_inline (inlined_body, id); - VARRAY_POP (id->fns); - - /* If we've returned to the top level, clear out the record of how - much inlining has been done. */ - if (VARRAY_ACTIVE_SIZE (id->fns) == id->first_inlined_fn) - id->inlined_stmts = 0; - - /* Don't walk into subtrees. We've already handled them above. */ - *walk_subtrees = 0; - - if (DECL_TEMPLATE_INSTANTIATION (fn)) - pop_tinst_level (); - - /* Keep iterating. */ - return NULL_TREE; - } - - /* Walk over the entire tree *TP, replacing CALL_EXPRs with inline - expansions as appropriate. */ - - static void - expand_calls_inline (tp, id) - tree *tp; - inline_data *id; - { - /* Search through *TP, replacing all calls to inline functions by - appropriate equivalents. Use walk_tree in no-duplicates mode - to avoid exponential time complexity. (We can't just use - walk_tree_without_duplicates, because of the special TARGET_EXPR - handling in expand_calls. The hash table is set up in - optimize_function. */ - walk_tree (tp, expand_call_inline, id, id->tree_pruner); - } - /* Optimize the body of FN. */ void --- 32,46 ---- #include "ggc.h" #include "params.h" #include "hashtab.h" ! #include "debug.h" ! #include "tree-inline.h" /* Prototypes. */ static tree calls_setjmp_r PARAMS ((tree *, int *, void *)); static void update_cloned_parm PARAMS ((tree, tree)); static void dump_function PARAMS ((enum tree_dump_index, tree)); /* Optimize the body of FN. */ void *************** optimize_function (fn) *** 962,1025 **** of the function. */ ++function_depth; ! /* Expand calls to inline functions. */ ! if (flag_inline_trees) { ! inline_data id; ! tree prev_fn; ! struct saved_scope *s; ! ! /* Clear out ID. */ ! memset (&id, 0, sizeof (id)); ! ! /* Don't allow recursion into FN. */ ! VARRAY_TREE_INIT (id.fns, 32, "fns"); ! VARRAY_PUSH_TREE (id.fns, fn); ! /* Or any functions that aren't finished yet. */ ! prev_fn = NULL_TREE; ! if (current_function_decl) ! { ! VARRAY_PUSH_TREE (id.fns, current_function_decl); ! prev_fn = current_function_decl; ! } ! for (s = scope_chain; s; s = s->prev) ! if (s->function_decl && s->function_decl != prev_fn) ! { ! VARRAY_PUSH_TREE (id.fns, s->function_decl); ! prev_fn = s->function_decl; ! } ! ! /* Create the stack of TARGET_EXPRs. */ ! VARRAY_TREE_INIT (id.target_exprs, 32, "target_exprs"); ! ! /* Create the list of functions this call will inline. */ ! VARRAY_TREE_INIT (id.inlined_fns, 32, "inlined_fns"); ! ! /* Keep track of the low-water mark, i.e., the point where ! the first real inlining is represented in ID.FNS. */ ! id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns); ! ! /* Replace all calls to inline functions with the bodies of those ! functions. */ ! id.tree_pruner = htab_create (37, htab_hash_pointer, ! htab_eq_pointer, NULL); ! expand_calls_inline (&DECL_SAVED_TREE (fn), &id); ! ! /* Clean up. */ ! htab_delete (id.tree_pruner); ! VARRAY_FREE (id.fns); ! VARRAY_FREE (id.target_exprs); ! if (DECL_LANG_SPECIFIC (fn)) ! { ! tree ifn = make_tree_vec (VARRAY_ACTIVE_SIZE (id.inlined_fns)); ! memcpy (&TREE_VEC_ELT (ifn, 0), &VARRAY_TREE (id.inlined_fns, 0), ! VARRAY_ACTIVE_SIZE (id.inlined_fns) * sizeof (tree)); ! DECL_INLINED_FNS (fn) = ifn; ! } ! VARRAY_FREE (id.inlined_fns); } ! /* Undo the call to ggc_push_context above. */ --function_depth; --- 60,77 ---- of the function. */ ++function_depth; ! if (flag_inline_trees ! /* We do not inline thunks, as (a) the backend tries to optimize ! the call to the thunkee, (b) tree based inlining breaks that ! optimization, (c) virtual functions are rarely inlineable, ! and (d) ASM_OUTPUT_MI_THUNK is there to DTRT anyway. */ ! && !DECL_THUNK_P (fn)) { ! optimize_inline_calls (fn); ! dump_function (TDI_inlined, fn); } ! /* Undo the call to ggc_push_context above. */ --function_depth; *************** update_cloned_parm (parm, cloned_parm) *** 1066,1075 **** tree cloned_parm; { DECL_ABSTRACT_ORIGIN (cloned_parm) = parm; ! /* We may have taken its address. */ TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm); ! /* The definition might have different constness. */ TREE_READONLY (cloned_parm) = TREE_READONLY (parm); --- 118,127 ---- tree cloned_parm; { DECL_ABSTRACT_ORIGIN (cloned_parm) = parm; ! /* We may have taken its address. */ TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm); ! /* The definition might have different constness. */ TREE_READONLY (cloned_parm) = TREE_READONLY (parm); *************** update_cloned_parm (parm, cloned_parm) *** 1079,1085 **** DECL_NAME (cloned_parm) = DECL_NAME (parm); DECL_SOURCE_FILE (cloned_parm) = DECL_SOURCE_FILE (parm); DECL_SOURCE_LINE (cloned_parm) = DECL_SOURCE_LINE (parm); - } /* FN is a function that has a complete body. Clone the body as --- 131,136 ---- *************** int *** 1090,1096 **** maybe_clone_body (fn) tree fn; { - inline_data id; tree clone; int first = 1; --- 141,146 ---- *************** maybe_clone_body (fn) *** 1100,1106 **** return 0; /* Emit the DWARF1 abstract instance. */ ! note_deferral_of_defined_inline_function (fn); /* We know that any clones immediately follow FN in the TYPE_METHODS list. */ --- 150,156 ---- return 0; /* Emit the DWARF1 abstract instance. */ ! (*debug_hooks->deferred_inline_function) (fn); /* We know that any clones immediately follow FN in the TYPE_METHODS list. */ *************** maybe_clone_body (fn) *** 1111,1116 **** --- 161,167 ---- tree parm; tree clone_parm; int parmno; + splay_tree decl_map; /* Update CLONE's source position information to match FN's. */ DECL_SOURCE_FILE (clone) = DECL_SOURCE_FILE (fn); *************** maybe_clone_body (fn) *** 1143,1149 **** for (; parm; parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm)) { ! /* Update this paramter. */ update_cloned_parm (parm, clone_parm); /* We should only give unused information for one clone. */ if (!first) --- 194,200 ---- for (; parm; parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm)) { ! /* Update this parameter. */ update_cloned_parm (parm, clone_parm); /* We should only give unused information for one clone. */ if (!first) *************** maybe_clone_body (fn) *** 1154,1175 **** push_to_top_level (); start_function (NULL_TREE, clone, NULL_TREE, SF_PRE_PARSED); - /* Just clone the body, as if we were making an inline call. - But, remap the parameters in the callee to the parameters of - caller. If there's an in-charge parameter, map it to an - appropriate constant. */ - memset (&id, 0, sizeof (id)); - VARRAY_TREE_INIT (id.fns, 2, "fns"); - VARRAY_PUSH_TREE (id.fns, clone); - VARRAY_PUSH_TREE (id.fns, fn); - - /* Cloning is treated slightly differently from inlining. Set - CLONING_P so that its clear which operation we're performing. */ - id.cloning_p = true; - /* Remap the parameters. */ ! id.decl_map = splay_tree_new (splay_tree_compare_pointers, ! NULL, NULL); for (parmno = 0, parm = DECL_ARGUMENTS (fn), clone_parm = DECL_ARGUMENTS (clone); --- 205,212 ---- push_to_top_level (); start_function (NULL_TREE, clone, NULL_TREE, SF_PRE_PARSED); /* Remap the parameters. */ ! decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL); for (parmno = 0, parm = DECL_ARGUMENTS (fn), clone_parm = DECL_ARGUMENTS (clone); *************** maybe_clone_body (fn) *** 1182,1188 **** { tree in_charge; in_charge = in_charge_arg_for_name (DECL_NAME (clone)); ! splay_tree_insert (id.decl_map, (splay_tree_key) parm, (splay_tree_value) in_charge); } --- 219,225 ---- { tree in_charge; in_charge = in_charge_arg_for_name (DECL_NAME (clone)); ! splay_tree_insert (decl_map, (splay_tree_key) parm, (splay_tree_value) in_charge); } *************** maybe_clone_body (fn) *** 1195,1201 **** if (DECL_HAS_VTT_PARM_P (clone)) { DECL_ABSTRACT_ORIGIN (clone_parm) = parm; ! splay_tree_insert (id.decl_map, (splay_tree_key) parm, (splay_tree_value) clone_parm); clone_parm = TREE_CHAIN (clone_parm); --- 232,238 ---- if (DECL_HAS_VTT_PARM_P (clone)) { DECL_ABSTRACT_ORIGIN (clone_parm) = parm; ! splay_tree_insert (decl_map, (splay_tree_key) parm, (splay_tree_value) clone_parm); clone_parm = TREE_CHAIN (clone_parm); *************** maybe_clone_body (fn) *** 1203,1209 **** /* Otherwise, map the VTT parameter to `NULL'. */ else { ! splay_tree_insert (id.decl_map, (splay_tree_key) parm, (splay_tree_value) null_pointer_node); } --- 240,246 ---- /* Otherwise, map the VTT parameter to `NULL'. */ else { ! splay_tree_insert (decl_map, (splay_tree_key) parm, (splay_tree_value) null_pointer_node); } *************** maybe_clone_body (fn) *** 1212,1237 **** function. */ else { ! splay_tree_insert (id.decl_map, (splay_tree_key) parm, (splay_tree_value) clone_parm); clone_parm = TREE_CHAIN (clone_parm); } } ! /* Actually copy the body. */ ! TREE_CHAIN (DECL_SAVED_TREE (clone)) = copy_body (&id); /* There are as many statements in the clone as in the original. */ DECL_NUM_STMTS (clone) = DECL_NUM_STMTS (fn); /* Clean up. */ ! splay_tree_delete (id.decl_map); ! VARRAY_FREE (id.fns); /* Now, expand this function into RTL, if appropriate. */ - function_name_declared_p = 1; finish_function (0); BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn); expand_body (clone); --- 249,272 ---- function. */ else { ! splay_tree_insert (decl_map, (splay_tree_key) parm, (splay_tree_value) clone_parm); clone_parm = TREE_CHAIN (clone_parm); } } ! /* Clone the body. */ ! clone_body (clone, fn, decl_map); /* There are as many statements in the clone as in the original. */ DECL_NUM_STMTS (clone) = DECL_NUM_STMTS (fn); /* Clean up. */ ! splay_tree_delete (decl_map); /* Now, expand this function into RTL, if appropriate. */ finish_function (0); BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn); expand_body (clone); *************** dump_function (phase, fn) *** 1257,1264 **** { fprintf (stream, "\n;; Function %s", decl_as_string (fn, TFF_DECL_SPECIFIERS)); ! fprintf (stream, " (%s)", decl_as_string (DECL_ASSEMBLER_NAME (fn), 0)); ! fprintf (stream, "\n\n"); dump_node (fn, TDF_SLIM | flags, stream); dump_end (phase, stream); --- 292,301 ---- { fprintf (stream, "\n;; Function %s", decl_as_string (fn, TFF_DECL_SPECIFIERS)); ! fprintf (stream, " (%s)\n", ! decl_as_string (DECL_ASSEMBLER_NAME (fn), 0)); ! fprintf (stream, ";; enabled by -%s\n", dump_flag_name (phase)); ! fprintf (stream, "\n"); dump_node (fn, TDF_SLIM | flags, stream); dump_end (phase, stream); diff -Nrc3pad gcc-3.0.4/gcc/cp/parse.c gcc-3.1/gcc/cp/parse.c *** gcc-3.0.4/gcc/cp/parse.c Wed Feb 20 19:42:14 2002 --- gcc-3.1/gcc/cp/parse.c Wed May 15 02:55:47 2002 *************** *** 12,95 **** #define TYPESPEC 262 #define CV_QUALIFIER 263 #define CONSTANT 264 ! #define STRING 265 ! #define ELLIPSIS 266 ! #define SIZEOF 267 ! #define ENUM 268 ! #define IF 269 ! #define ELSE 270 ! #define WHILE 271 ! #define DO 272 ! #define FOR 273 ! #define SWITCH 274 ! #define CASE 275 ! #define DEFAULT 276 ! #define BREAK 277 ! #define CONTINUE 278 ! #define RETURN_KEYWORD 279 ! #define GOTO 280 ! #define ASM_KEYWORD 281 ! #define TYPEOF 282 ! #define ALIGNOF 283 ! #define SIGOF 284 ! #define ATTRIBUTE 285 ! #define EXTENSION 286 ! #define LABEL 287 ! #define REALPART 288 ! #define IMAGPART 289 ! #define VA_ARG 290 ! #define AGGR 291 ! #define VISSPEC 292 ! #define DELETE 293 ! #define NEW 294 ! #define THIS 295 ! #define OPERATOR 296 ! #define CXX_TRUE 297 ! #define CXX_FALSE 298 ! #define NAMESPACE 299 ! #define TYPENAME_KEYWORD 300 ! #define USING 301 ! #define LEFT_RIGHT 302 ! #define TEMPLATE 303 ! #define TYPEID 304 ! #define DYNAMIC_CAST 305 ! #define STATIC_CAST 306 ! #define REINTERPRET_CAST 307 ! #define CONST_CAST 308 ! #define SCOPE 309 ! #define EXPORT 310 ! #define EMPTY 311 ! #define PTYPENAME 312 ! #define NSNAME 313 ! #define THROW 314 ! #define ASSIGN 315 ! #define OROR 316 ! #define ANDAND 317 ! #define MIN_MAX 318 ! #define EQCOMPARE 319 ! #define ARITHCOMPARE 320 ! #define LSHIFT 321 ! #define RSHIFT 322 ! #define POINTSAT_STAR 323 ! #define DOT_STAR 324 ! #define UNARY 325 ! #define PLUSPLUS 326 ! #define MINUSMINUS 327 ! #define HYPERUNARY 328 ! #define POINTSAT 329 ! #define TRY 330 ! #define CATCH 331 ! #define EXTERN_LANG_STRING 332 ! #define ALL 333 ! #define PRE_PARSED_CLASS_DECL 334 ! #define DEFARG 335 ! #define DEFARG_MARKER 336 ! #define PRE_PARSED_FUNCTION_DECL 337 ! #define TYPENAME_DEFN 338 ! #define IDENTIFIER_DEFN 339 ! #define PTYPENAME_DEFN 340 ! #define END_OF_LINE 341 ! #define END_OF_SAVED_INPUT 342 #line 30 "parse.y" --- 12,96 ---- #define TYPESPEC 262 #define CV_QUALIFIER 263 #define CONSTANT 264 ! #define VAR_FUNC_NAME 265 ! #define STRING 266 ! #define ELLIPSIS 267 ! #define SIZEOF 268 ! #define ENUM 269 ! #define IF 270 ! #define ELSE 271 ! #define WHILE 272 ! #define DO 273 ! #define FOR 274 ! #define SWITCH 275 ! #define CASE 276 ! #define DEFAULT 277 ! #define BREAK 278 ! #define CONTINUE 279 ! #define RETURN_KEYWORD 280 ! #define GOTO 281 ! #define ASM_KEYWORD 282 ! #define TYPEOF 283 ! #define ALIGNOF 284 ! #define SIGOF 285 ! #define ATTRIBUTE 286 ! #define EXTENSION 287 ! #define LABEL 288 ! #define REALPART 289 ! #define IMAGPART 290 ! #define VA_ARG 291 ! #define AGGR 292 ! #define VISSPEC 293 ! #define DELETE 294 ! #define NEW 295 ! #define THIS 296 ! #define OPERATOR 297 ! #define CXX_TRUE 298 ! #define CXX_FALSE 299 ! #define NAMESPACE 300 ! #define TYPENAME_KEYWORD 301 ! #define USING 302 ! #define LEFT_RIGHT 303 ! #define TEMPLATE 304 ! #define TYPEID 305 ! #define DYNAMIC_CAST 306 ! #define STATIC_CAST 307 ! #define REINTERPRET_CAST 308 ! #define CONST_CAST 309 ! #define SCOPE 310 ! #define EXPORT 311 ! #define EMPTY 312 ! #define PTYPENAME 313 ! #define NSNAME 314 ! #define THROW 315 ! #define ASSIGN 316 ! #define OROR 317 ! #define ANDAND 318 ! #define MIN_MAX 319 ! #define EQCOMPARE 320 ! #define ARITHCOMPARE 321 ! #define LSHIFT 322 ! #define RSHIFT 323 ! #define POINTSAT_STAR 324 ! #define DOT_STAR 325 ! #define UNARY 326 ! #define PLUSPLUS 327 ! #define MINUSMINUS 328 ! #define HYPERUNARY 329 ! #define POINTSAT 330 ! #define TRY 331 ! #define CATCH 332 ! #define EXTERN_LANG_STRING 333 ! #define ALL 334 ! #define PRE_PARSED_CLASS_DECL 335 ! #define DEFARG 336 ! #define DEFARG_MARKER 337 ! #define PRE_PARSED_FUNCTION_DECL 338 ! #define TYPENAME_DEFN 339 ! #define IDENTIFIER_DEFN 340 ! #define PTYPENAME_DEFN 341 ! #define END_OF_LINE 342 ! #define END_OF_SAVED_INPUT 343 #line 30 "parse.y" *************** *** 110,119 **** #include "toplev.h" #include "ggc.h" - /* Since parsers are distinct for each language, put the language string - definition here. (fnf) */ - const char * const language_string = "GNU C++"; - extern struct obstack permanent_obstack; /* Like YYERROR but do call yyerror. */ --- 111,116 ---- *************** static tree parse_field PARAMS ((tree, t *** 156,162 **** static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree)); static tree parse_bitfield PARAMS ((tree, tree, tree)); static tree parse_method PARAMS ((tree, tree, tree)); ! static void frob_specs PARAMS ((tree, tree)); /* Cons up an empty parameter list. */ static inline tree --- 153,160 ---- static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree)); static tree parse_bitfield PARAMS ((tree, tree, tree)); static tree parse_method PARAMS ((tree, tree, tree)); ! static void frob_specs PARAMS ((tree, tree)); ! static void check_class_key PARAMS ((tree, tree)); /* Cons up an empty parameter list. */ static inline tree *************** frob_specs (specs_attrs, lookups) *** 188,194 **** current_declspecs = build_tree_list (NULL_TREE, current_declspecs); if (have_extern_spec && !used_extern_spec) { ! current_declspecs = tree_cons (NULL_TREE, get_identifier ("extern"), current_declspecs); used_extern_spec = 1; --- 186,198 ---- current_declspecs = build_tree_list (NULL_TREE, current_declspecs); if (have_extern_spec && !used_extern_spec) { ! /* We have to indicate that there is an "extern", but that it ! was part of a language specifier. For instance, ! ! extern "C" typedef int (*Ptr) (); ! ! is well formed. */ ! current_declspecs = tree_cons (error_mark_node, get_identifier ("extern"), current_declspecs); used_extern_spec = 1; *************** parse_field (declarator, attributes, asm *** 229,235 **** tree declarator, attributes, asmspec, init; { tree d = grokfield (declarator, current_declspecs, init, asmspec, ! build_tree_list (attributes, prefix_attributes)); decl_type_access_control (d); return d; } --- 233,239 ---- tree declarator, attributes, asmspec, init; { tree d = grokfield (declarator, current_declspecs, init, asmspec, ! chainon (attributes, prefix_attributes)); decl_type_access_control (d); return d; } *************** parse_bitfield (declarator, attributes, *** 247,253 **** tree declarator, attributes, width; { tree d = grokbitfield (declarator, current_declspecs, width); ! cplus_decl_attributes (d, attributes, prefix_attributes); decl_type_access_control (d); return d; } --- 251,257 ---- tree declarator, attributes, width; { tree d = grokbitfield (declarator, current_declspecs, width); ! cplus_decl_attributes (&d, chainon (attributes, prefix_attributes), 0); decl_type_access_control (d); return d; } *************** parse_method (declarator, specs_attrs, l *** 271,276 **** --- 275,293 ---- return d; } + static void + check_class_key (key, aggr) + tree key; + tree aggr; + { + if (TREE_CODE (key) == TREE_LIST) + key = TREE_VALUE (key); + if ((key == union_type_node) != (TREE_CODE (aggr) == UNION_TYPE)) + pedwarn ("`%s' tag used in naming `%#T'", + key == union_type_node ? "union" + : key == record_type_node ? "struct" : "class", aggr); + } + void cp_parse_init () { *************** cp_parse_init () *** 283,289 **** /* Rename the "yyparse" function so that we can override it elsewhere. */ #define yyparse yyparse_1 ! #line 224 "parse.y" typedef union { long itype; tree ttype; --- 300,306 ---- /* Rename the "yyparse" function so that we can override it elsewhere. */ #define yyparse yyparse_1 ! #line 240 "parse.y" typedef union { long itype; tree ttype; *************** typedef union { *** 292,298 **** flagged_type_tree ftype; struct unparsed_text *pi; } YYSTYPE; ! #line 430 "parse.y" /* Tell yyparse how to print a token's value, if yydebug is set. */ #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) --- 309,315 ---- flagged_type_tree ftype; struct unparsed_text *pi; } YYSTYPE; ! #line 447 "parse.y" /* Tell yyparse how to print a token's value, if yydebug is set. */ #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) *************** extern void yyprint PARAMS ((FILE *, i *** 307,332 **** ! #define YYFINAL 1790 #define YYFLAG -32768 ! #define YYNTBASE 113 ! #define YYTRANSLATE(x) ((unsigned)(x) <= 342 ? yytranslate[x] : 406) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 2, 2, 111, 2, 2, 2, 84, 72, 2, 94, ! 109, 82, 80, 61, 81, 93, 83, 2, 2, 2, ! 2, 2, 2, 2, 2, 2, 2, 64, 62, 76, ! 66, 77, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 95, 2, 112, 71, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 2, 2, 60, 70, 110, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, --- 324,349 ---- ! #define YYFINAL 1830 #define YYFLAG -32768 ! #define YYNTBASE 114 ! #define YYTRANSLATE(x) ((unsigned)(x) <= 343 ? yytranslate[x] : 404) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 2, 2, 112, 2, 2, 2, 85, 73, 2, 95, ! 110, 83, 81, 62, 82, 94, 84, 2, 2, 2, ! 2, 2, 2, 2, 2, 2, 2, 65, 63, 77, ! 67, 78, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 96, 2, 113, 72, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 2, 2, 61, 71, 111, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, *************** static const char yytranslate[] = { *** 345,354 **** 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ! 57, 58, 59, 63, 65, 68, 69, 73, 74, 75, ! 78, 79, 85, 86, 87, 88, 89, 91, 92, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, ! 107, 108 }; #if YYDEBUG != 0 --- 362,371 ---- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ! 57, 58, 59, 60, 64, 66, 69, 70, 74, 75, ! 76, 79, 80, 86, 87, 88, 89, 90, 92, 93, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, ! 107, 108, 109 }; #if YYDEBUG != 0 *************** static const short yyprhs[] = { 0, *** 361,854 **** 150, 154, 156, 158, 160, 164, 166, 167, 170, 173, 177, 179, 183, 185, 189, 191, 195, 198, 201, 204, 206, 208, 214, 219, 222, 225, 229, 233, 236, 239, ! 243, 247, 250, 253, 256, 259, 262, 264, 266, 268, ! 270, 271, 273, 276, 277, 279, 284, 288, 292, 293, ! 302, 308, 309, 319, 326, 327, 336, 342, 343, 353, ! 360, 363, 366, 368, 371, 373, 380, 385, 392, 397, ! 400, 402, 405, 408, 410, 413, 415, 418, 421, 426, ! 429, 433, 434, 435, 437, 441, 444, 448, 450, 455, ! 458, 463, 466, 471, 474, 476, 478, 480, 482, 484, ! 486, 488, 490, 492, 494, 496, 498, 499, 506, 507, ! 514, 515, 521, 522, 528, 529, 537, 538, 546, 547, ! 554, 555, 562, 563, 564, 570, 576, 578, 580, 586, ! 592, 593, 595, 597, 598, 600, 602, 606, 608, 610, ! 613, 615, 617, 619, 621, 623, 625, 627, 629, 631, ! 635, 637, 641, 642, 644, 646, 647, 655, 657, 659, ! 663, 668, 672, 673, 678, 681, 685, 689, 693, 697, ! 699, 701, 703, 706, 709, 712, 715, 718, 721, 724, ! 729, 732, 737, 740, 744, 748, 753, 758, 764, 770, ! 777, 780, 785, 791, 794, 797, 801, 805, 809, 811, ! 815, 818, 822, 827, 829, 832, 838, 840, 844, 848, ! 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, ! 892, 896, 900, 904, 908, 912, 916, 922, 926, 930, ! 932, 935, 937, 941, 945, 949, 953, 957, 961, 965, ! 969, 973, 977, 981, 985, 989, 993, 997, 1001, 1005, ! 1009, 1015, 1019, 1023, 1025, 1028, 1032, 1036, 1038, 1040, ! 1042, 1044, 1046, 1047, 1053, 1059, 1065, 1071, 1077, 1079, ! 1081, 1083, 1085, 1088, 1090, 1093, 1096, 1100, 1105, 1110, ! 1112, 1114, 1116, 1120, 1122, 1124, 1126, 1128, 1132, 1136, ! 1140, 1141, 1146, 1151, 1154, 1159, 1162, 1169, 1174, 1177, ! 1180, 1182, 1187, 1189, 1197, 1205, 1213, 1221, 1226, 1231, ! 1234, 1237, 1240, 1242, 1247, 1250, 1253, 1259, 1263, 1266, ! 1269, 1275, 1279, 1285, 1289, 1294, 1301, 1304, 1306, 1309, ! 1311, 1314, 1316, 1318, 1320, 1323, 1324, 1327, 1330, 1334, ! 1338, 1342, 1345, 1348, 1351, 1353, 1355, 1357, 1360, 1363, ! 1366, 1369, 1371, 1373, 1375, 1377, 1380, 1383, 1387, 1391, ! 1395, 1400, 1402, 1405, 1408, 1411, 1413, 1415, 1417, 1420, ! 1423, 1426, 1428, 1430, 1433, 1436, 1440, 1442, 1445, 1447, ! 1449, 1451, 1456, 1461, 1466, 1471, 1473, 1475, 1477, 1479, ! 1483, 1485, 1489, 1491, 1495, 1496, 1501, 1502, 1509, 1513, ! 1514, 1519, 1521, 1525, 1529, 1530, 1535, 1539, 1540, 1542, ! 1544, 1547, 1554, 1556, 1560, 1561, 1563, 1568, 1575, 1580, ! 1582, 1584, 1586, 1588, 1590, 1594, 1595, 1598, 1600, 1603, ! 1607, 1612, 1614, 1616, 1620, 1625, 1629, 1635, 1640, 1644, ! 1648, 1649, 1653, 1657, 1661, 1662, 1665, 1668, 1669, 1676, ! 1677, 1683, 1686, 1689, 1692, 1693, 1694, 1695, 1706, 1708, ! 1709, 1711, 1712, 1714, 1716, 1719, 1722, 1725, 1728, 1731, ! 1734, 1737, 1740, 1743, 1747, 1752, 1756, 1759, 1763, 1765, ! 1766, 1770, 1773, 1776, 1778, 1780, 1781, 1784, 1788, 1790, ! 1795, 1797, 1801, 1803, 1805, 1808, 1811, 1815, 1819, 1820, ! 1822, 1826, 1829, 1832, 1834, 1837, 1840, 1843, 1846, 1849, ! 1852, 1855, 1857, 1860, 1863, 1867, 1869, 1872, 1875, 1880, ! 1885, 1888, 1890, 1896, 1901, 1903, 1904, 1906, 1910, 1911, ! 1913, 1917, 1919, 1921, 1923, 1925, 1930, 1935, 1940, 1945, ! 1950, 1954, 1959, 1964, 1969, 1974, 1978, 1981, 1983, 1985, ! 1989, 1991, 1995, 1998, 2000, 2007, 2008, 2011, 2013, 2016, ! 2020, 2024, 2026, 2030, 2032, 2035, 2039, 2043, 2046, 2049, ! 2053, 2055, 2060, 2065, 2069, 2073, 2076, 2078, 2080, 2083, ! 2085, 2087, 2090, 2093, 2095, 2098, 2102, 2106, 2109, 2112, ! 2116, 2118, 2122, 2126, 2129, 2132, 2136, 2138, 2143, 2147, ! 2152, 2156, 2158, 2161, 2164, 2167, 2170, 2173, 2176, 2179, ! 2181, 2184, 2189, 2194, 2197, 2199, 2201, 2203, 2205, 2208, ! 2213, 2216, 2219, 2222, 2225, 2227, 2230, 2233, 2236, 2239, ! 2243, 2245, 2248, 2252, 2257, 2260, 2263, 2266, 2269, 2272, ! 2275, 2280, 2283, 2285, 2288, 2291, 2295, 2297, 2301, 2304, ! 2308, 2311, 2314, 2318, 2320, 2324, 2329, 2331, 2334, 2338, ! 2341, 2344, 2346, 2350, 2353, 2356, 2358, 2361, 2365, 2367, ! 2371, 2378, 2383, 2388, 2392, 2398, 2402, 2406, 2410, 2413, ! 2415, 2417, 2420, 2423, 2426, 2427, 2429, 2431, 2434, 2438, ! 2440, 2443, 2444, 2449, 2450, 2451, 2457, 2459, 2460, 2464, ! 2466, 2469, 2471, 2474, 2475, 2480, 2482, 2483, 2484, 2490, ! 2491, 2492, 2500, 2501, 2502, 2503, 2504, 2517, 2518, 2519, ! 2527, 2528, 2534, 2535, 2543, 2544, 2549, 2552, 2555, 2558, ! 2562, 2569, 2578, 2589, 2598, 2611, 2622, 2633, 2638, 2642, ! 2645, 2648, 2650, 2652, 2654, 2656, 2658, 2659, 2660, 2667, ! 2668, 2669, 2675, 2677, 2680, 2681, 2682, 2688, 2690, 2692, ! 2696, 2700, 2703, 2706, 2709, 2712, 2715, 2717, 2720, 2721, ! 2723, 2724, 2726, 2728, 2729, 2731, 2733, 2737, 2742, 2744, ! 2748, 2749, 2751, 2753, 2755, 2758, 2761, 2764, 2766, 2769, ! 2772, 2773, 2777, 2779, 2781, 2783, 2786, 2789, 2792, 2797, ! 2800, 2803, 2806, 2809, 2812, 2815, 2817, 2820, 2822, 2825, ! 2827, 2829, 2830, 2831, 2833, 2839, 2843, 2844, 2848, 2849, ! 2850, 2855, 2858, 2860, 2862, 2866, 2867, 2871, 2875, 2879, ! 2881, 2882, 2886, 2890, 2894, 2898, 2902, 2906, 2910, 2914, ! 2918, 2922, 2926, 2930, 2934, 2938, 2942, 2946, 2950, 2954, ! 2958, 2962, 2966, 2970, 2974, 2979, 2983, 2987, 2991, 2995, ! 3000, 3004, 3008, 3014, 3020, 3025, 3029 }; static const short yyrhs[] = { -1, ! 114, 0, 0, 115, 121, 0, 114, 121, 0, 114, ! 0, 0, 0, 0, 32, 0, 27, 0, 0, 122, ! 123, 0, 152, 151, 0, 148, 0, 0, 56, 124, ! 145, 0, 145, 0, 120, 94, 222, 109, 62, 0, ! 135, 60, 116, 110, 0, 135, 117, 152, 118, 151, ! 0, 135, 117, 148, 118, 0, 0, 45, 167, 60, ! 125, 116, 110, 0, 0, 45, 60, 126, 116, 110, ! 0, 127, 0, 129, 62, 0, 131, 0, 119, 123, ! 0, 0, 45, 167, 66, 128, 134, 62, 0, 47, ! 314, 0, 47, 328, 314, 0, 47, 328, 212, 0, ! 47, 133, 167, 0, 47, 328, 167, 0, 47, 328, ! 133, 167, 0, 0, 47, 45, 132, 134, 62, 0, ! 59, 55, 0, 133, 59, 55, 0, 212, 0, 314, ! 0, 328, 314, 0, 328, 212, 0, 98, 0, 135, ! 98, 0, 0, 49, 76, 137, 140, 77, 0, 49, ! 76, 77, 0, 136, 0, 138, 0, 144, 0, 140, ! 61, 144, 0, 167, 0, 0, 271, 141, 0, 46, ! 141, 0, 136, 271, 141, 0, 142, 0, 142, 66, ! 228, 0, 392, 0, 392, 66, 207, 0, 143, 0, ! 143, 66, 188, 0, 139, 146, 0, 139, 1, 0, ! 152, 151, 0, 147, 0, 145, 0, 135, 117, 152, ! 118, 151, 0, 135, 117, 147, 118, 0, 119, 146, ! 0, 239, 62, 0, 232, 238, 62, 0, 229, 237, ! 62, 0, 263, 62, 0, 239, 62, 0, 232, 238, ! 62, 0, 229, 237, 62, 0, 232, 62, 0, 170, ! 62, 0, 229, 62, 0, 1, 62, 0, 1, 110, ! 0, 62, 0, 395, 0, 223, 0, 163, 0, 0, ! 162, 0, 162, 62, 0, 0, 108, 0, 158, 150, ! 149, 339, 0, 158, 150, 363, 0, 158, 150, 1, ! 0, 0, 319, 5, 94, 154, 383, 109, 301, 398, ! 0, 319, 5, 48, 301, 398, 0, 0, 328, 319, ! 5, 94, 155, 383, 109, 301, 398, 0, 328, 319, ! 5, 48, 301, 398, 0, 0, 319, 183, 94, 156, ! 383, 109, 301, 398, 0, 319, 183, 48, 301, 398, ! 0, 0, 328, 319, 183, 94, 157, 383, 109, 301, ! 398, 0, 328, 319, 183, 48, 301, 398, 0, 229, ! 226, 0, 232, 311, 0, 311, 0, 232, 153, 0, ! 153, 0, 5, 94, 383, 109, 301, 398, 0, 5, ! 48, 301, 398, 0, 183, 94, 383, 109, 301, 398, ! 0, 183, 48, 301, 398, 0, 232, 159, 0, 159, ! 0, 229, 226, 0, 232, 311, 0, 311, 0, 232, ! 153, 0, 153, 0, 25, 3, 0, 161, 256, 0, ! 161, 94, 200, 109, 0, 161, 48, 0, 64, 164, ! 165, 0, 0, 0, 166, 0, 165, 61, 166, 0, ! 165, 1, 0, 94, 200, 109, 0, 48, 0, 168, ! 94, 200, 109, 0, 168, 48, 0, 307, 94, 200, ! 109, 0, 307, 48, 0, 321, 94, 200, 109, 0, ! 321, 48, 0, 1, 0, 3, 0, 4, 0, 5, ! 0, 58, 0, 59, 0, 3, 0, 58, 0, 59, ! 0, 105, 0, 104, 0, 106, 0, 0, 49, 179, ! 235, 62, 171, 180, 0, 0, 49, 179, 229, 226, ! 172, 180, 0, 0, 49, 179, 311, 173, 180, 0, ! 0, 49, 179, 153, 174, 180, 0, 0, 7, 49, ! 179, 235, 62, 175, 180, 0, 0, 7, 49, 179, ! 229, 226, 176, 180, 0, 0, 7, 49, 179, 311, ! 177, 180, 0, 0, 7, 49, 179, 153, 178, 180, ! 0, 0, 0, 58, 76, 186, 185, 184, 0, 4, ! 76, 186, 185, 184, 0, 183, 0, 181, 0, 167, ! 76, 186, 77, 184, 0, 5, 76, 186, 185, 184, ! 0, 0, 77, 0, 79, 0, 0, 187, 0, 188, ! 0, 187, 61, 188, 0, 228, 0, 58, 0, 328, ! 58, 0, 207, 0, 81, 0, 80, 0, 88, 0, ! 89, 0, 111, 0, 199, 0, 206, 0, 48, 0, ! 94, 190, 109, 0, 48, 0, 94, 194, 109, 0, ! 0, 194, 0, 1, 0, 0, 373, 226, 240, 249, ! 66, 195, 257, 0, 190, 0, 110, 0, 336, 334, ! 110, 0, 336, 334, 1, 110, 0, 336, 1, 110, ! 0, 0, 405, 60, 198, 196, 0, 405, 348, 0, ! 206, 61, 206, 0, 206, 61, 1, 0, 199, 61, ! 206, 0, 199, 61, 1, 0, 206, 0, 199, 0, ! 217, 0, 119, 205, 0, 82, 205, 0, 72, 205, ! 0, 90, 205, 0, 189, 205, 0, 69, 167, 0, ! 13, 201, 0, 13, 94, 228, 109, 0, 29, 201, ! 0, 29, 94, 228, 109, 0, 219, 300, 0, 219, ! 300, 203, 0, 219, 202, 300, 0, 219, 202, 300, ! 203, 0, 219, 94, 228, 109, 0, 219, 94, 228, ! 109, 203, 0, 219, 202, 94, 228, 109, 0, 219, ! 202, 94, 228, 109, 203, 0, 220, 205, 0, 220, ! 95, 112, 205, 0, 220, 95, 190, 112, 205, 0, ! 34, 205, 0, 35, 205, 0, 94, 200, 109, 0, ! 60, 200, 110, 0, 94, 200, 109, 0, 48, 0, ! 94, 235, 109, 0, 66, 257, 0, 94, 228, 109, ! 0, 204, 94, 228, 109, 0, 201, 0, 204, 201, ! 0, 204, 60, 258, 269, 110, 0, 205, 0, 206, ! 85, 206, 0, 206, 86, 206, 0, 206, 80, 206, ! 0, 206, 81, 206, 0, 206, 82, 206, 0, 206, ! 83, 206, 0, 206, 84, 206, 0, 206, 78, 206, ! 0, 206, 79, 206, 0, 206, 75, 206, 0, 206, ! 76, 206, 0, 206, 77, 206, 0, 206, 74, 206, ! 0, 206, 73, 206, 0, 206, 72, 206, 0, 206, ! 70, 206, 0, 206, 71, 206, 0, 206, 69, 206, ! 0, 206, 68, 206, 0, 206, 67, 378, 64, 206, ! 0, 206, 66, 206, 0, 206, 65, 206, 0, 63, ! 0, 63, 206, 0, 205, 0, 207, 85, 207, 0, ! 207, 86, 207, 0, 207, 80, 207, 0, 207, 81, ! 207, 0, 207, 82, 207, 0, 207, 83, 207, 0, ! 207, 84, 207, 0, 207, 78, 207, 0, 207, 79, ! 207, 0, 207, 75, 207, 0, 207, 76, 207, 0, ! 207, 74, 207, 0, 207, 73, 207, 0, 207, 72, ! 207, 0, 207, 70, 207, 0, 207, 71, 207, 0, ! 207, 69, 207, 0, 207, 68, 207, 0, 207, 67, ! 378, 64, 207, 0, 207, 66, 207, 0, 207, 65, ! 207, 0, 63, 0, 63, 207, 0, 90, 393, 167, ! 0, 90, 393, 181, 0, 210, 0, 404, 0, 3, ! 0, 58, 0, 59, 0, 0, 6, 76, 209, 186, ! 185, 0, 404, 76, 209, 186, 185, 0, 49, 167, ! 76, 186, 185, 0, 49, 6, 76, 186, 185, 0, ! 49, 404, 76, 186, 185, 0, 208, 0, 4, 0, ! 5, 0, 214, 0, 250, 214, 0, 208, 0, 82, ! 213, 0, 72, 213, 0, 94, 213, 109, 0, 3, ! 76, 186, 185, 0, 59, 76, 187, 185, 0, 313, ! 0, 208, 0, 215, 0, 94, 213, 109, 0, 208, ! 0, 10, 0, 221, 0, 222, 0, 94, 190, 109, ! 0, 94, 213, 109, 0, 94, 1, 109, 0, 0, ! 94, 218, 340, 109, 0, 208, 94, 200, 109, 0, ! 208, 48, 0, 217, 94, 200, 109, 0, 217, 48, ! 0, 36, 94, 206, 61, 228, 109, 0, 217, 95, ! 190, 112, 0, 217, 88, 0, 217, 89, 0, 41, ! 0, 9, 94, 200, 109, 0, 317, 0, 51, 76, ! 228, 77, 94, 190, 109, 0, 52, 76, 228, 77, ! 94, 190, 109, 0, 53, 76, 228, 77, 94, 190, ! 109, 0, 54, 76, 228, 77, 94, 190, 109, 0, ! 50, 94, 190, 109, 0, 50, 94, 228, 109, 0, ! 328, 3, 0, 328, 210, 0, 328, 404, 0, 316, ! 0, 316, 94, 200, 109, 0, 316, 48, 0, 224, ! 211, 0, 224, 211, 94, 200, 109, 0, 224, 211, ! 48, 0, 224, 212, 0, 224, 316, 0, 224, 212, ! 94, 200, 109, 0, 224, 212, 48, 0, 224, 316, ! 94, 200, 109, 0, 224, 316, 48, 0, 224, 90, ! 8, 48, 0, 224, 8, 55, 90, 8, 48, 0, ! 224, 1, 0, 40, 0, 328, 40, 0, 39, 0, ! 328, 220, 0, 43, 0, 44, 0, 11, 0, 222, ! 11, 0, 0, 217, 93, 0, 217, 92, 0, 235, ! 237, 62, 0, 229, 237, 62, 0, 232, 238, 62, ! 0, 229, 62, 0, 232, 62, 0, 119, 225, 0, ! 305, 0, 311, 0, 48, 0, 227, 48, 0, 233, ! 332, 0, 302, 332, 0, 235, 332, 0, 233, 0, ! 302, 0, 233, 0, 230, 0, 232, 235, 0, 235, ! 231, 0, 235, 234, 231, 0, 232, 235, 231, 0, ! 232, 235, 234, 0, 232, 235, 234, 231, 0, 7, ! 0, 231, 236, 0, 231, 7, 0, 231, 250, 0, ! 250, 0, 302, 0, 7, 0, 232, 9, 0, 232, ! 7, 0, 232, 250, 0, 250, 0, 235, 0, 302, ! 235, 0, 235, 234, 0, 302, 235, 234, 0, 236, ! 0, 234, 236, 0, 263, 0, 8, 0, 308, 0, ! 28, 94, 190, 109, 0, 28, 94, 228, 109, 0, ! 30, 94, 190, 109, 0, 30, 94, 228, 109, 0, ! 8, 0, 9, 0, 263, 0, 245, 0, 237, 61, ! 241, 0, 246, 0, 238, 61, 241, 0, 247, 0, ! 239, 61, 241, 0, 0, 120, 94, 222, 109, 0, ! 0, 226, 240, 249, 66, 242, 257, 0, 226, 240, ! 249, 0, 0, 249, 66, 244, 257, 0, 249, 0, ! 226, 240, 243, 0, 311, 240, 243, 0, 0, 311, ! 240, 248, 243, 0, 153, 240, 249, 0, 0, 250, ! 0, 251, 0, 250, 251, 0, 31, 94, 94, 252, ! 109, 109, 0, 253, 0, 252, 61, 253, 0, 0, ! 254, 0, 254, 94, 3, 109, 0, 254, 94, 3, ! 61, 200, 109, 0, 254, 94, 200, 109, 0, 167, ! 0, 7, 0, 8, 0, 9, 0, 167, 0, 255, ! 61, 167, 0, 0, 66, 257, 0, 206, 0, 60, ! 110, 0, 60, 258, 110, 0, 60, 258, 61, 110, ! 0, 1, 0, 257, 0, 258, 61, 257, 0, 95, ! 206, 112, 257, 0, 167, 64, 257, 0, 258, 61, ! 167, 64, 257, 0, 103, 150, 149, 339, 0, 103, ! 150, 363, 0, 103, 150, 1, 0, 0, 260, 259, ! 151, 0, 102, 206, 108, 0, 102, 1, 108, 0, ! 0, 262, 261, 0, 262, 1, 0, 0, 14, 167, ! 60, 264, 297, 110, 0, 0, 14, 60, 265, 297, ! 110, 0, 14, 167, 0, 14, 326, 0, 46, 321, ! 0, 0, 0, 0, 278, 60, 266, 284, 110, 249, ! 267, 262, 268, 260, 0, 278, 0, 0, 61, 0, ! 0, 61, 0, 37, 0, 271, 7, 0, 271, 8, ! 0, 271, 9, 0, 271, 37, 0, 271, 250, 0, ! 271, 167, 0, 271, 169, 0, 272, 60, 0, 272, ! 64, 0, 271, 319, 167, 0, 271, 328, 319, 167, ! 0, 271, 328, 167, 0, 271, 182, 0, 271, 319, ! 182, 0, 272, 0, 0, 273, 276, 279, 0, 274, ! 279, 0, 271, 60, 0, 277, 0, 275, 0, 0, ! 64, 393, 0, 64, 393, 280, 0, 281, 0, 280, ! 61, 393, 281, 0, 282, 0, 283, 393, 282, 0, ! 321, 0, 307, 0, 38, 393, 0, 7, 393, 0, ! 283, 38, 393, 0, 283, 7, 393, 0, 0, 286, ! 0, 284, 285, 286, 0, 284, 285, 0, 38, 64, ! 0, 287, 0, 286, 287, 0, 288, 62, 0, 288, ! 110, 0, 160, 64, 0, 160, 96, 0, 160, 25, ! 0, 160, 60, 0, 62, 0, 119, 287, 0, 139, ! 287, 0, 139, 229, 62, 0, 395, 0, 229, 289, ! 0, 232, 290, 0, 311, 240, 249, 256, 0, 153, ! 240, 249, 256, 0, 64, 206, 0, 1, 0, 232, ! 159, 240, 249, 256, 0, 159, 240, 249, 256, 0, ! 129, 0, 0, 291, 0, 289, 61, 292, 0, 0, ! 294, 0, 290, 61, 296, 0, 293, 0, 294, 0, ! 295, 0, 296, 0, 305, 240, 249, 256, 0, 4, ! 64, 206, 249, 0, 311, 240, 249, 256, 0, 153, ! 240, 249, 256, 0, 3, 64, 206, 249, 0, 64, ! 206, 249, 0, 305, 240, 249, 256, 0, 4, 64, ! 206, 249, 0, 311, 240, 249, 256, 0, 3, 64, ! 206, 249, 0, 64, 206, 249, 0, 298, 270, 0, ! 270, 0, 299, 0, 298, 61, 299, 0, 167, 0, ! 167, 66, 206, 0, 373, 329, 0, 373, 0, 94, ! 228, 109, 95, 190, 112, 0, 0, 301, 9, 0, ! 9, 0, 302, 9, 0, 94, 200, 109, 0, 94, ! 383, 109, 0, 48, 0, 94, 1, 109, 0, 305, ! 0, 250, 305, 0, 82, 302, 304, 0, 72, 302, ! 304, 0, 82, 304, 0, 72, 304, 0, 327, 301, ! 304, 0, 306, 0, 306, 303, 301, 398, 0, 306, ! 95, 190, 112, 0, 306, 95, 112, 0, 94, 304, ! 109, 0, 319, 318, 0, 318, 0, 318, 0, 328, ! 318, 0, 307, 0, 309, 0, 328, 309, 0, 319, ! 318, 0, 311, 0, 250, 311, 0, 82, 302, 310, ! 0, 72, 302, 310, 0, 82, 310, 0, 72, 310, ! 0, 327, 301, 310, 0, 216, 0, 82, 302, 310, ! 0, 72, 302, 310, 0, 82, 312, 0, 72, 312, ! 0, 327, 301, 310, 0, 313, 0, 216, 303, 301, ! 398, 0, 94, 312, 109, 0, 216, 95, 190, 112, ! 0, 216, 95, 112, 0, 315, 0, 328, 315, 0, ! 328, 208, 0, 319, 215, 0, 319, 212, 0, 319, ! 211, 0, 319, 208, 0, 319, 211, 0, 315, 0, ! 328, 315, 0, 235, 94, 200, 109, 0, 235, 94, ! 213, 109, 0, 235, 227, 0, 4, 0, 5, 0, ! 181, 0, 320, 0, 319, 320, 0, 319, 49, 325, ! 55, 0, 4, 55, 0, 5, 55, 0, 59, 55, ! 0, 181, 55, 0, 322, 0, 328, 322, 0, 323, ! 167, 0, 323, 181, 0, 323, 325, 0, 323, 49, ! 325, 0, 324, 0, 323, 324, 0, 323, 325, 55, ! 0, 323, 49, 325, 55, 0, 4, 55, 0, 5, ! 55, 0, 181, 55, 0, 58, 55, 0, 3, 55, ! 0, 59, 55, 0, 167, 76, 186, 185, 0, 328, ! 318, 0, 309, 0, 328, 309, 0, 319, 82, 0, ! 328, 319, 82, 0, 55, 0, 82, 301, 329, 0, ! 82, 301, 0, 72, 301, 329, 0, 72, 301, 0, ! 327, 301, 0, 327, 301, 329, 0, 330, 0, 95, ! 190, 112, 0, 330, 95, 190, 112, 0, 332, 0, ! 250, 332, 0, 82, 302, 331, 0, 82, 331, 0, ! 82, 302, 0, 82, 0, 72, 302, 331, 0, 72, ! 331, 0, 72, 302, 0, 72, 0, 327, 301, 0, ! 327, 301, 331, 0, 333, 0, 94, 331, 109, 0, ! 333, 94, 383, 109, 301, 398, 0, 333, 48, 301, ! 398, 0, 333, 95, 190, 112, 0, 333, 95, 112, ! 0, 94, 384, 109, 301, 398, 0, 204, 301, 398, ! 0, 227, 301, 398, 0, 95, 190, 112, 0, 95, ! 112, 0, 347, 0, 335, 0, 334, 347, 0, 334, ! 335, 0, 1, 62, 0, 0, 337, 0, 338, 0, ! 337, 338, 0, 33, 255, 62, 0, 340, 0, 1, ! 340, 0, 0, 405, 60, 341, 196, 0, 0, 0, ! 15, 343, 192, 344, 345, 0, 340, 0, 0, 346, ! 405, 348, 0, 340, 0, 405, 348, 0, 225, 0, ! 190, 62, 0, 0, 342, 16, 349, 345, 0, 342, ! 0, 0, 0, 17, 350, 192, 351, 197, 0, 0, ! 0, 18, 352, 345, 17, 353, 191, 62, 0, 0, ! 0, 0, 0, 19, 354, 94, 376, 355, 193, 62, ! 356, 378, 109, 357, 197, 0, 0, 0, 20, 358, ! 94, 194, 109, 359, 345, 0, 0, 21, 206, 64, ! 360, 347, 0, 0, 21, 206, 12, 206, 64, 361, ! 347, 0, 0, 22, 64, 362, 347, 0, 23, 62, ! 0, 24, 62, 0, 25, 62, 0, 25, 190, 62, ! 0, 120, 377, 94, 222, 109, 62, 0, 120, 377, ! 94, 222, 64, 379, 109, 62, 0, 120, 377, 94, ! 222, 64, 379, 64, 379, 109, 62, 0, 120, 377, ! 94, 222, 55, 379, 109, 62, 0, 120, 377, 94, ! 222, 64, 379, 64, 379, 64, 382, 109, 62, 0, ! 120, 377, 94, 222, 55, 379, 64, 382, 109, 62, ! 0, 120, 377, 94, 222, 64, 379, 55, 382, 109, ! 62, 0, 26, 82, 190, 62, 0, 26, 167, 62, ! 0, 375, 347, 0, 375, 110, 0, 62, 0, 366, ! 0, 131, 0, 130, 0, 127, 0, 0, 0, 96, ! 364, 149, 340, 365, 369, 0, 0, 0, 96, 367, ! 340, 368, 369, 0, 370, 0, 369, 370, 0, 0, ! 0, 97, 371, 374, 372, 340, 0, 233, 0, 302, ! 0, 94, 12, 109, 0, 94, 392, 109, 0, 3, ! 64, 0, 58, 64, 0, 4, 64, 0, 5, 64, ! 0, 378, 62, 0, 225, 0, 60, 196, 0, 0, ! 9, 0, 0, 190, 0, 1, 0, 0, 380, 0, ! 381, 0, 380, 61, 381, 0, 11, 94, 190, 109, ! 0, 222, 0, 382, 61, 222, 0, 0, 384, 0, ! 228, 0, 388, 0, 389, 12, 0, 388, 12, 0, ! 228, 12, 0, 12, 0, 388, 64, 0, 228, 64, ! 0, 0, 66, 386, 387, 0, 101, 0, 257, 0, ! 390, 0, 392, 385, 0, 389, 391, 0, 389, 394, ! 0, 389, 394, 66, 257, 0, 388, 61, 0, 228, ! 61, 0, 230, 226, 0, 233, 226, 0, 235, 226, ! 0, 230, 332, 0, 230, 0, 232, 311, 0, 392, ! 0, 392, 385, 0, 390, 0, 228, 0, 0, 0, ! 311, 0, 3, 396, 3, 397, 62, 0, 76, 186, ! 185, 0, 0, 94, 200, 109, 0, 0, 0, 63, ! 94, 400, 109, 0, 63, 48, 0, 228, 0, 399, ! 0, 400, 61, 399, 0, 0, 82, 301, 401, 0, ! 72, 301, 401, 0, 327, 301, 401, 0, 42, 0, ! 0, 402, 82, 403, 0, 402, 83, 403, 0, 402, ! 84, 403, 0, 402, 80, 403, 0, 402, 81, 403, ! 0, 402, 72, 403, 0, 402, 70, 403, 0, 402, ! 71, 403, 0, 402, 90, 403, 0, 402, 61, 403, ! 0, 402, 75, 403, 0, 402, 76, 403, 0, 402, ! 77, 403, 0, 402, 74, 403, 0, 402, 65, 403, ! 0, 402, 66, 403, 0, 402, 78, 403, 0, 402, ! 79, 403, 0, 402, 88, 403, 0, 402, 89, 403, ! 0, 402, 69, 403, 0, 402, 68, 403, 0, 402, ! 111, 403, 0, 402, 67, 64, 403, 0, 402, 73, ! 403, 0, 402, 92, 403, 0, 402, 85, 403, 0, ! 402, 48, 403, 0, 402, 95, 112, 403, 0, 402, ! 40, 403, 0, 402, 39, 403, 0, 402, 40, 95, ! 112, 403, 0, 402, 39, 95, 112, 403, 0, 402, ! 373, 401, 403, 0, 402, 1, 403, 0, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, ! 437, 440, 448, 451, 452, 456, 458, 461, 466, 470, ! 476, 480, 484, 488, 491, 494, 497, 498, 500, 503, ! 505, 507, 509, 511, 513, 515, 517, 518, 520, 521, ! 525, 528, 537, 540, 542, 546, 549, 551, 555, 558, ! 570, 577, 585, 587, 588, 590, 594, 597, 603, 606, ! 610, 616, 618, 621, 624, 628, 631, 634, 637, 641, ! 646, 656, 658, 660, 662, 664, 677, 680, 684, 687, ! 689, 691, 694, 697, 701, 703, 705, 707, 717, 719, ! 721, 723, 725, 726, 733, 734, 735, 736, 739, 742, ! 746, 748, 749, 752, 754, 757, 760, 762, 766, 769, ! 771, 775, 777, 779, 783, 785, 787, 791, 793, 795, ! 801, 806, 809, 812, 815, 820, 823, 825, 827, 833, ! 842, 845, 847, 849, 852, 854, 859, 866, 869, 871, ! 875, 885, 898, 904, 909, 920, 923, 930, 938, 940, ! 943, 945, 948, 950, 953, 957, 959, 960, 961, 962, ! 965, 967, 968, 971, 973, 974, 977, 982, 982, 986, ! 986, 989, 989, 992, 992, 996, 996, 1001, 1001, 1004, ! 1004, 1007, 1009, 1012, 1019, 1023, 1026, 1029, 1031, 1035, ! 1041, 1050, 1052, 1060, 1063, 1066, 1069, 1073, 1076, 1082, ! 1088, 1091, 1094, 1096, 1098, 1100, 1104, 1107, 1110, 1115, ! 1119, 1124, 1128, 1131, 1132, 1136, 1153, 1159, 1162, 1164, ! 1165, 1166, 1169, 1173, 1175, 1179, 1183, 1186, 1188, 1192, ! 1195, 1198, 1202, 1205, 1207, 1209, 1211, 1214, 1218, 1220, ! 1223, 1225, 1231, 1234, 1237, 1240, 1243, 1248, 1251, 1254, ! 1258, 1260, 1264, 1268, 1270, 1274, 1277, 1282, 1285, 1287, ! 1297, 1311, 1316, 1322, 1324, 1326, 1339, 1342, 1344, 1346, ! 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, ! 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1386, 1388, ! 1390, 1394, 1397, 1399, 1401, 1403, 1405, 1407, 1409, 1411, ! 1413, 1415, 1417, 1419, 1421, 1423, 1425, 1427, 1429, 1431, ! 1433, 1435, 1439, 1441, 1443, 1447, 1450, 1452, 1453, 1454, ! 1455, 1456, 1459, 1471, 1474, 1478, 1481, 1483, 1488, 1490, ! 1491, 1494, 1496, 1504, 1506, 1508, 1510, 1514, 1517, 1521, ! 1525, 1526, 1527, 1531, 1539, 1540, 1541, 1551, 1553, 1556, ! 1558, 1569, 1574, 1576, 1578, 1580, 1582, 1585, 1587, 1589, ! 1592, 1594, 1605, 1606, 1610, 1614, 1618, 1622, 1624, 1628, ! 1630, 1632, 1640, 1642, 1644, 1646, 1650, 1652, 1654, 1656, ! 1661, 1663, 1665, 1667, 1670, 1672, 1674, 1718, 1721, 1725, ! 1728, 1732, 1735, 1740, 1742, 1746, 1753, 1756, 1763, 1769, ! 1773, 1775, 1780, 1782, 1789, 1791, 1795, 1799, 1805, 1809, ! 1812, 1816, 1819, 1829, 1832, 1836, 1840, 1843, 1846, 1849, ! 1852, 1858, 1864, 1866, 1871, 1873, 1891, 1894, 1899, 1904, ! 1912, 1914, 1927, 1931, 1934, 1937, 1942, 1945, 1953, 1956, ! 1958, 1960, 1963, 1966, 1981, 2000, 2003, 2005, 2008, 2010, ! 2014, 2016, 2020, 2022, 2026, 2029, 2033, 2038, 2039, 2052, ! 2059, 2060, 2066, 2071, 2076, 2084, 2085, 2092, 2095, 2099, ! 2102, 2106, 2111, 2114, 2118, 2121, 2123, 2125, 2127, 2134, ! 2136, 2137, 2138, 2142, 2145, 2149, 2152, 2158, 2160, 2163, ! 2166, 2169, 2175, 2178, 2181, 2183, 2185, 2189, 2195, 2200, ! 2206, 2208, 2213, 2216, 2219, 2221, 2223, 2227, 2231, 2237, ! 2240, 2246, 2249, 2252, 2258, 2261, 2281, 2286, 2291, 2317, ! 2319, 2322, 2324, 2329, 2331, 2333, 2335, 2337, 2339, 2343, ! 2351, 2354, 2356, 2360, 2367, 2373, 2379, 2385, 2394, 2400, ! 2404, 2411, 2445, 2455, 2461, 2464, 2467, 2469, 2473, 2475, ! 2479, 2482, 2486, 2490, 2494, 2496, 2500, 2511, 2525, 2526, ! 2527, 2528, 2531, 2540, 2546, 2553, 2555, 2560, 2562, 2564, ! 2566, 2568, 2570, 2573, 2583, 2588, 2592, 2617, 2623, 2626, ! 2629, 2631, 2642, 2647, 2650, 2655, 2658, 2665, 2675, 2678, ! 2685, 2695, 2697, 2700, 2702, 2705, 2709, 2714, 2718, 2721, ! 2724, 2729, 2732, 2736, 2739, 2741, 2745, 2747, 2754, 2756, ! 2759, 2762, 2767, 2771, 2776, 2786, 2789, 2793, 2797, 2806, ! 2809, 2811, 2813, 2819, 2821, 2830, 2833, 2835, 2837, 2839, ! 2843, 2846, 2849, 2851, 2853, 2855, 2859, 2862, 2873, 2883, ! 2885, 2886, 2890, 2898, 2900, 2908, 2911, 2913, 2915, 2917, ! 2921, 2924, 2927, 2929, 2931, 2933, 2937, 2940, 2943, 2945, ! 2947, 2949, 2951, 2953, 2957, 2964, 2968, 2973, 2977, 2982, ! 2984, 2988, 2991, 2993, 2997, 2999, 3000, 3003, 3005, 3007, ! 3014, 3025, 3031, 3037, 3051, 3053, 3057, 3071, 3073, 3075, ! 3079, 3087, 3100, 3103, 3110, 3123, 3129, 3131, 3132, 3133, ! 3141, 3146, 3155, 3156, 3160, 3163, 3169, 3175, 3178, 3180, ! 3182, 3184, 3188, 3192, 3196, 3199, 3203, 3205, 3214, 3217, ! 3219, 3221, 3223, 3225, 3227, 3229, 3231, 3235, 3239, 3243, ! 3247, 3249, 3251, 3253, 3255, 3257, 3259, 3261, 3263, 3271, ! 3273, 3274, 3275, 3278, 3284, 3286, 3291, 3293, 3296, 3309, ! 3311, 3314, 3318, 3322, 3327, 3329, 3333, 3335, 3337, 3343, ! 3345, 3349, 3353, 3355, 3358, 3363, 3366, 3372, 3374, 3376, ! 3378, 3383, 3386, 3388, 3390, 3392, 3395, 3397, 3399, 3402, ! 3404, 3407, 3408, 3411, 3412, 3415, 3416, 3418, 3420, 3422, ! 3424, 3429, 3432, 3435, 3438, 3441, 3444, 3447, 3453, 3455, ! 3457, 3461, 3464, 3466, 3468, 3471, 3475, 3478, 3481, 3487, ! 3491, 3493, 3496, 3498, 3501, 3505, 3507, 3510, 3512, 3515, ! 3532, 3540, 3543, 3545, 3547, 3551, 3554, 3555, 3563, 3566, ! 3569, 3572, 3573, 3579, 3582, 3585, 3587, 3591, 3596, 3599, ! 3609, 3614, 3615, 3622, 3625, 3628, 3630, 3633, 3635, 3645, ! 3659, 3663, 3666, 3668, 3672, 3676, 3679, 3682, 3684, 3688, ! 3690, 3697, 3704, 3707, 3711, 3715, 3719, 3725, 3729, 3734, ! 3736, 3739, 3744, 3750, 3761, 3769, 3772, 3775, 3778, 3781, ! 3784, 3786, 3790, 3798, 3801, 3805, 3808, 3810, 3812, 3818, ! 3831, 3839, 3842, 3844, 3846, 3848, 3850, 3852, 3854, 3856, ! 3858, 3860, 3862, 3864, 3866, 3868, 3870, 3872, 3874, 3876, ! 3878, 3880, 3882, 3884, 3886, 3888, 3890, 3892, 3894, 3896, ! 3898, 3900, 3902, 3904, 3906, 3908, 3915 }; #endif --- 378,878 ---- 150, 154, 156, 158, 160, 164, 166, 167, 170, 173, 177, 179, 183, 185, 189, 191, 195, 198, 201, 204, 206, 208, 214, 219, 222, 225, 229, 233, 236, 239, ! 243, 247, 250, 253, 256, 259, 262, 265, 267, 269, ! 271, 273, 274, 276, 279, 280, 282, 283, 290, 294, ! 298, 302, 303, 312, 318, 319, 329, 336, 337, 346, ! 352, 353, 363, 370, 373, 376, 378, 381, 383, 390, ! 399, 404, 411, 418, 423, 426, 428, 431, 434, 436, ! 439, 441, 444, 447, 452, 455, 458, 459, 460, 462, ! 466, 469, 473, 475, 480, 483, 488, 491, 496, 499, ! 501, 503, 505, 507, 509, 511, 513, 515, 517, 519, ! 521, 523, 524, 531, 532, 539, 540, 546, 547, 553, ! 554, 562, 563, 571, 572, 579, 580, 587, 588, 589, ! 595, 601, 603, 605, 611, 617, 618, 620, 622, 623, ! 625, 627, 631, 633, 635, 638, 640, 644, 646, 648, ! 650, 652, 654, 656, 658, 660, 664, 666, 670, 671, ! 673, 675, 676, 684, 686, 688, 692, 697, 701, 705, ! 709, 713, 717, 719, 721, 723, 726, 729, 732, 735, ! 738, 741, 744, 749, 752, 757, 760, 764, 768, 773, ! 778, 784, 790, 797, 800, 805, 811, 814, 817, 821, ! 825, 829, 831, 835, 838, 842, 847, 849, 852, 858, ! 860, 864, 868, 872, 876, 880, 884, 888, 892, 896, ! 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, ! 942, 946, 950, 952, 955, 957, 961, 965, 969, 973, ! 977, 981, 985, 989, 993, 997, 1001, 1005, 1009, 1013, ! 1017, 1021, 1025, 1029, 1035, 1039, 1043, 1045, 1048, 1052, ! 1056, 1058, 1060, 1062, 1064, 1066, 1067, 1073, 1079, 1085, ! 1091, 1097, 1099, 1101, 1103, 1105, 1108, 1110, 1113, 1116, ! 1120, 1125, 1130, 1132, 1134, 1136, 1140, 1142, 1144, 1146, ! 1148, 1150, 1154, 1158, 1162, 1163, 1168, 1173, 1176, 1181, ! 1184, 1191, 1196, 1199, 1202, 1204, 1209, 1211, 1219, 1227, ! 1235, 1243, 1248, 1253, 1256, 1259, 1262, 1264, 1269, 1272, ! 1275, 1281, 1285, 1288, 1291, 1297, 1301, 1307, 1311, 1316, ! 1323, 1326, 1328, 1331, 1333, 1336, 1338, 1340, 1342, 1345, ! 1346, 1349, 1352, 1356, 1360, 1364, 1367, 1370, 1373, 1375, ! 1377, 1379, 1382, 1385, 1388, 1391, 1393, 1395, 1397, 1399, ! 1402, 1405, 1409, 1413, 1417, 1422, 1424, 1427, 1430, 1432, ! 1434, 1437, 1440, 1443, 1445, 1448, 1451, 1455, 1457, 1460, ! 1463, 1465, 1467, 1469, 1471, 1476, 1481, 1486, 1491, 1493, ! 1495, 1497, 1499, 1503, 1505, 1509, 1511, 1515, 1516, 1521, ! 1522, 1529, 1533, 1534, 1539, 1541, 1545, 1549, 1550, 1555, ! 1559, 1560, 1562, 1564, 1567, 1574, 1576, 1580, 1581, 1583, ! 1588, 1595, 1600, 1602, 1604, 1606, 1608, 1610, 1614, 1615, ! 1618, 1620, 1623, 1627, 1632, 1634, 1636, 1640, 1645, 1649, ! 1655, 1659, 1663, 1667, 1668, 1672, 1676, 1680, 1681, 1684, ! 1687, 1688, 1695, 1696, 1702, 1705, 1708, 1711, 1712, 1713, ! 1714, 1726, 1728, 1729, 1731, 1732, 1734, 1736, 1739, 1742, ! 1745, 1748, 1751, 1754, 1758, 1763, 1767, 1770, 1774, 1779, ! 1781, 1784, 1786, 1789, 1792, 1795, 1798, 1802, 1806, 1809, ! 1810, 1813, 1817, 1819, 1824, 1826, 1830, 1832, 1834, 1837, ! 1840, 1844, 1848, 1849, 1851, 1855, 1858, 1861, 1863, 1866, ! 1869, 1872, 1875, 1878, 1881, 1884, 1886, 1889, 1892, 1896, ! 1898, 1901, 1904, 1909, 1914, 1917, 1919, 1925, 1930, 1932, ! 1933, 1935, 1939, 1940, 1942, 1946, 1948, 1950, 1952, 1954, ! 1959, 1964, 1969, 1974, 1979, 1983, 1988, 1993, 1998, 2003, ! 2007, 2010, 2012, 2014, 2018, 2020, 2024, 2027, 2029, 2036, ! 2037, 2040, 2042, 2045, 2047, 2050, 2054, 2058, 2060, 2064, ! 2066, 2069, 2073, 2077, 2080, 2083, 2087, 2089, 2094, 2099, ! 2103, 2107, 2110, 2112, 2114, 2117, 2119, 2121, 2124, 2127, ! 2129, 2132, 2136, 2140, 2143, 2146, 2150, 2152, 2156, 2160, ! 2163, 2166, 2170, 2172, 2177, 2181, 2186, 2190, 2192, 2195, ! 2198, 2201, 2204, 2207, 2210, 2213, 2215, 2218, 2223, 2228, ! 2231, 2233, 2235, 2237, 2239, 2242, 2247, 2251, 2255, 2258, ! 2261, 2264, 2267, 2269, 2272, 2275, 2278, 2281, 2285, 2287, ! 2290, 2294, 2299, 2302, 2305, 2308, 2311, 2314, 2317, 2322, ! 2325, 2327, 2330, 2333, 2337, 2339, 2343, 2346, 2350, 2353, ! 2356, 2360, 2362, 2366, 2371, 2373, 2376, 2380, 2383, 2386, ! 2388, 2392, 2395, 2398, 2400, 2403, 2407, 2409, 2413, 2420, ! 2425, 2430, 2434, 2440, 2444, 2448, 2452, 2455, 2457, 2459, ! 2462, 2465, 2468, 2469, 2471, 2473, 2476, 2480, 2481, 2486, ! 2488, 2489, 2490, 2496, 2498, 2499, 2503, 2505, 2508, 2510, ! 2513, 2514, 2519, 2521, 2522, 2523, 2529, 2530, 2531, 2539, ! 2540, 2541, 2542, 2543, 2556, 2557, 2558, 2566, 2567, 2573, ! 2574, 2582, 2583, 2588, 2591, 2594, 2597, 2601, 2608, 2617, ! 2628, 2637, 2650, 2661, 2672, 2677, 2681, 2684, 2687, 2689, ! 2691, 2693, 2695, 2697, 2698, 2699, 2705, 2706, 2707, 2713, ! 2715, 2718, 2719, 2720, 2721, 2727, 2729, 2731, 2735, 2739, ! 2742, 2745, 2748, 2751, 2754, 2756, 2759, 2760, 2762, 2763, ! 2765, 2767, 2768, 2770, 2772, 2776, 2781, 2789, 2791, 2795, ! 2796, 2798, 2800, 2802, 2805, 2808, 2811, 2813, 2816, 2819, ! 2820, 2824, 2826, 2828, 2830, 2833, 2836, 2839, 2844, 2847, ! 2850, 2853, 2856, 2859, 2862, 2864, 2867, 2869, 2872, 2874, ! 2876, 2877, 2878, 2880, 2886, 2890, 2891, 2895, 2896, 2897, ! 2902, 2905, 2907, 2909, 2911, 2915, 2916, 2920, 2924, 2928, ! 2930, 2931, 2935, 2939, 2943, 2947, 2951, 2955, 2959, 2963, ! 2967, 2971, 2975, 2979, 2983, 2987, 2991, 2995, 2999, 3003, ! 3007, 3011, 3015, 3019, 3023, 3028, 3032, 3036, 3040, 3044, ! 3049, 3053, 3057, 3063, 3069, 3074, 3078 }; static const short yyrhs[] = { -1, ! 115, 0, 0, 116, 122, 0, 115, 122, 0, 115, ! 0, 0, 0, 0, 33, 0, 28, 0, 0, 123, ! 124, 0, 155, 152, 0, 149, 0, 0, 57, 125, ! 146, 0, 146, 0, 121, 95, 223, 110, 63, 0, ! 136, 61, 117, 111, 0, 136, 118, 155, 119, 152, ! 0, 136, 118, 149, 119, 0, 0, 46, 170, 61, ! 126, 117, 111, 0, 0, 46, 61, 127, 117, 111, ! 0, 128, 0, 130, 63, 0, 132, 0, 120, 124, ! 0, 0, 46, 170, 67, 129, 135, 63, 0, 48, ! 312, 0, 48, 326, 312, 0, 48, 326, 213, 0, ! 48, 134, 170, 0, 48, 326, 170, 0, 48, 326, ! 134, 170, 0, 0, 48, 46, 133, 135, 63, 0, ! 60, 56, 0, 134, 60, 56, 0, 213, 0, 312, ! 0, 326, 312, 0, 326, 213, 0, 99, 0, 136, ! 99, 0, 0, 50, 77, 138, 141, 78, 0, 50, ! 77, 78, 0, 137, 0, 139, 0, 145, 0, 141, ! 62, 145, 0, 170, 0, 0, 272, 142, 0, 47, ! 142, 0, 137, 272, 142, 0, 143, 0, 143, 67, ! 229, 0, 390, 0, 390, 67, 208, 0, 144, 0, ! 144, 67, 191, 0, 140, 147, 0, 140, 1, 0, ! 155, 152, 0, 148, 0, 146, 0, 136, 118, 155, ! 119, 152, 0, 136, 118, 148, 119, 0, 120, 147, ! 0, 240, 63, 0, 233, 239, 63, 0, 230, 238, ! 63, 0, 264, 63, 0, 240, 63, 0, 233, 239, ! 63, 0, 230, 238, 63, 0, 233, 63, 0, 173, ! 63, 0, 230, 63, 0, 1, 63, 0, 1, 111, ! 0, 1, 109, 0, 63, 0, 393, 0, 224, 0, ! 166, 0, 0, 165, 0, 165, 63, 0, 0, 109, ! 0, 0, 167, 150, 403, 61, 154, 199, 0, 161, ! 151, 153, 0, 161, 151, 361, 0, 161, 151, 1, ! 0, 0, 317, 5, 95, 157, 381, 110, 299, 396, ! 0, 317, 5, 49, 299, 396, 0, 0, 326, 317, ! 5, 95, 158, 381, 110, 299, 396, 0, 326, 317, ! 5, 49, 299, 396, 0, 0, 317, 186, 95, 159, ! 381, 110, 299, 396, 0, 317, 186, 49, 299, 396, ! 0, 0, 326, 317, 186, 95, 160, 381, 110, 299, ! 396, 0, 326, 317, 186, 49, 299, 396, 0, 230, ! 227, 0, 233, 309, 0, 309, 0, 233, 156, 0, ! 156, 0, 5, 95, 381, 110, 299, 396, 0, 95, ! 5, 110, 95, 381, 110, 299, 396, 0, 5, 49, ! 299, 396, 0, 95, 5, 110, 49, 299, 396, 0, ! 186, 95, 381, 110, 299, 396, 0, 186, 49, 299, ! 396, 0, 233, 162, 0, 162, 0, 230, 227, 0, ! 233, 309, 0, 309, 0, 233, 156, 0, 156, 0, ! 26, 3, 0, 164, 257, 0, 164, 95, 201, 110, ! 0, 164, 49, 0, 65, 168, 0, 0, 0, 169, ! 0, 168, 62, 169, 0, 168, 1, 0, 95, 201, ! 110, 0, 49, 0, 171, 95, 201, 110, 0, 171, ! 49, 0, 305, 95, 201, 110, 0, 305, 49, 0, ! 319, 95, 201, 110, 0, 319, 49, 0, 1, 0, ! 3, 0, 4, 0, 5, 0, 59, 0, 60, 0, ! 3, 0, 59, 0, 60, 0, 106, 0, 105, 0, ! 107, 0, 0, 50, 182, 236, 63, 174, 183, 0, ! 0, 50, 182, 230, 227, 175, 183, 0, 0, 50, ! 182, 309, 176, 183, 0, 0, 50, 182, 156, 177, ! 183, 0, 0, 7, 50, 182, 236, 63, 178, 183, ! 0, 0, 7, 50, 182, 230, 227, 179, 183, 0, ! 0, 7, 50, 182, 309, 180, 183, 0, 0, 7, ! 50, 182, 156, 181, 183, 0, 0, 0, 59, 77, ! 189, 188, 187, 0, 4, 77, 189, 188, 187, 0, ! 186, 0, 184, 0, 170, 77, 189, 78, 187, 0, ! 5, 77, 189, 188, 187, 0, 0, 78, 0, 80, ! 0, 0, 190, 0, 191, 0, 190, 62, 191, 0, ! 229, 0, 59, 0, 326, 59, 0, 208, 0, 317, ! 50, 170, 0, 82, 0, 81, 0, 89, 0, 90, ! 0, 112, 0, 200, 0, 207, 0, 49, 0, 95, ! 193, 110, 0, 49, 0, 95, 197, 110, 0, 0, ! 197, 0, 1, 0, 0, 371, 227, 241, 250, 67, ! 198, 258, 0, 193, 0, 111, 0, 334, 332, 111, ! 0, 334, 332, 1, 111, 0, 334, 1, 111, 0, ! 207, 62, 207, 0, 207, 62, 1, 0, 200, 62, ! 207, 0, 200, 62, 1, 0, 207, 0, 200, 0, ! 218, 0, 120, 206, 0, 83, 206, 0, 73, 206, ! 0, 91, 206, 0, 192, 206, 0, 70, 170, 0, ! 14, 202, 0, 14, 95, 229, 110, 0, 30, 202, ! 0, 30, 95, 229, 110, 0, 220, 298, 0, 220, ! 298, 204, 0, 220, 203, 298, 0, 220, 203, 298, ! 204, 0, 220, 95, 229, 110, 0, 220, 95, 229, ! 110, 204, 0, 220, 203, 95, 229, 110, 0, 220, ! 203, 95, 229, 110, 204, 0, 221, 206, 0, 221, ! 96, 113, 206, 0, 221, 96, 193, 113, 206, 0, ! 35, 206, 0, 36, 206, 0, 95, 201, 110, 0, ! 61, 201, 111, 0, 95, 201, 110, 0, 49, 0, ! 95, 236, 110, 0, 67, 258, 0, 95, 229, 110, ! 0, 205, 95, 229, 110, 0, 202, 0, 205, 202, ! 0, 205, 61, 259, 270, 111, 0, 206, 0, 207, ! 86, 207, 0, 207, 87, 207, 0, 207, 81, 207, ! 0, 207, 82, 207, 0, 207, 83, 207, 0, 207, ! 84, 207, 0, 207, 85, 207, 0, 207, 79, 207, ! 0, 207, 80, 207, 0, 207, 76, 207, 0, 207, ! 77, 207, 0, 207, 78, 207, 0, 207, 75, 207, ! 0, 207, 74, 207, 0, 207, 73, 207, 0, 207, ! 71, 207, 0, 207, 72, 207, 0, 207, 70, 207, ! 0, 207, 69, 207, 0, 207, 68, 376, 65, 207, ! 0, 207, 67, 207, 0, 207, 66, 207, 0, 64, ! 0, 64, 207, 0, 206, 0, 208, 86, 208, 0, ! 208, 87, 208, 0, 208, 81, 208, 0, 208, 82, ! 208, 0, 208, 83, 208, 0, 208, 84, 208, 0, ! 208, 85, 208, 0, 208, 79, 208, 0, 208, 80, ! 208, 0, 208, 76, 208, 0, 208, 77, 208, 0, ! 208, 75, 208, 0, 208, 74, 208, 0, 208, 73, ! 208, 0, 208, 71, 208, 0, 208, 72, 208, 0, ! 208, 70, 208, 0, 208, 69, 208, 0, 208, 68, ! 376, 65, 208, 0, 208, 67, 208, 0, 208, 66, ! 208, 0, 64, 0, 64, 208, 0, 91, 391, 170, ! 0, 91, 391, 184, 0, 211, 0, 402, 0, 3, ! 0, 59, 0, 60, 0, 0, 6, 77, 210, 189, ! 188, 0, 402, 77, 210, 189, 188, 0, 50, 170, ! 77, 189, 188, 0, 50, 6, 77, 189, 188, 0, ! 50, 402, 77, 189, 188, 0, 209, 0, 4, 0, ! 5, 0, 215, 0, 251, 215, 0, 209, 0, 83, ! 214, 0, 73, 214, 0, 95, 214, 110, 0, 3, ! 77, 189, 188, 0, 60, 77, 190, 188, 0, 311, ! 0, 209, 0, 216, 0, 95, 214, 110, 0, 209, ! 0, 10, 0, 222, 0, 223, 0, 11, 0, 95, ! 193, 110, 0, 95, 214, 110, 0, 95, 1, 110, ! 0, 0, 95, 219, 337, 110, 0, 209, 95, 201, ! 110, 0, 209, 49, 0, 218, 95, 201, 110, 0, ! 218, 49, 0, 37, 95, 207, 62, 229, 110, 0, ! 218, 96, 193, 113, 0, 218, 89, 0, 218, 90, ! 0, 42, 0, 9, 95, 201, 110, 0, 315, 0, ! 52, 77, 229, 78, 95, 193, 110, 0, 53, 77, ! 229, 78, 95, 193, 110, 0, 54, 77, 229, 78, ! 95, 193, 110, 0, 55, 77, 229, 78, 95, 193, ! 110, 0, 51, 95, 193, 110, 0, 51, 95, 229, ! 110, 0, 326, 3, 0, 326, 211, 0, 326, 402, ! 0, 314, 0, 314, 95, 201, 110, 0, 314, 49, ! 0, 225, 212, 0, 225, 212, 95, 201, 110, 0, ! 225, 212, 49, 0, 225, 213, 0, 225, 314, 0, ! 225, 213, 95, 201, 110, 0, 225, 213, 49, 0, ! 225, 314, 95, 201, 110, 0, 225, 314, 49, 0, ! 225, 91, 8, 49, 0, 225, 8, 56, 91, 8, ! 49, 0, 225, 1, 0, 41, 0, 326, 41, 0, ! 40, 0, 326, 221, 0, 44, 0, 45, 0, 12, ! 0, 223, 12, 0, 0, 218, 94, 0, 218, 93, ! 0, 236, 238, 63, 0, 230, 238, 63, 0, 233, ! 239, 63, 0, 230, 63, 0, 233, 63, 0, 120, ! 226, 0, 303, 0, 309, 0, 49, 0, 228, 49, ! 0, 234, 330, 0, 300, 330, 0, 236, 330, 0, ! 234, 0, 300, 0, 234, 0, 231, 0, 233, 236, ! 0, 236, 232, 0, 236, 235, 232, 0, 233, 236, ! 232, 0, 233, 236, 235, 0, 233, 236, 235, 232, ! 0, 7, 0, 232, 237, 0, 232, 7, 0, 300, ! 0, 7, 0, 233, 9, 0, 233, 7, 0, 233, ! 251, 0, 236, 0, 300, 236, 0, 236, 235, 0, ! 300, 236, 235, 0, 237, 0, 235, 237, 0, 235, ! 251, 0, 251, 0, 264, 0, 8, 0, 306, 0, ! 29, 95, 193, 110, 0, 29, 95, 229, 110, 0, ! 31, 95, 193, 110, 0, 31, 95, 229, 110, 0, ! 8, 0, 9, 0, 264, 0, 246, 0, 238, 62, ! 242, 0, 247, 0, 239, 62, 242, 0, 248, 0, ! 240, 62, 242, 0, 0, 121, 95, 223, 110, 0, ! 0, 227, 241, 250, 67, 243, 258, 0, 227, 241, ! 250, 0, 0, 250, 67, 245, 258, 0, 250, 0, ! 227, 241, 244, 0, 309, 241, 244, 0, 0, 309, ! 241, 249, 244, 0, 156, 241, 250, 0, 0, 251, ! 0, 252, 0, 251, 252, 0, 32, 95, 95, 253, ! 110, 110, 0, 254, 0, 253, 62, 254, 0, 0, ! 255, 0, 255, 95, 3, 110, 0, 255, 95, 3, ! 62, 201, 110, 0, 255, 95, 201, 110, 0, 170, ! 0, 7, 0, 8, 0, 9, 0, 170, 0, 256, ! 62, 170, 0, 0, 67, 258, 0, 207, 0, 61, ! 111, 0, 61, 259, 111, 0, 61, 259, 62, 111, ! 0, 1, 0, 258, 0, 259, 62, 258, 0, 96, ! 207, 113, 258, 0, 170, 65, 258, 0, 259, 62, ! 170, 65, 258, 0, 104, 151, 153, 0, 104, 151, ! 361, 0, 104, 151, 1, 0, 0, 261, 260, 152, ! 0, 103, 207, 109, 0, 103, 1, 109, 0, 0, ! 263, 262, 0, 263, 1, 0, 0, 15, 170, 61, ! 265, 295, 111, 0, 0, 15, 61, 266, 295, 111, ! 0, 15, 170, 0, 15, 324, 0, 47, 319, 0, ! 0, 0, 0, 276, 277, 61, 267, 282, 111, 250, ! 268, 263, 269, 261, 0, 275, 0, 0, 62, 0, ! 0, 62, 0, 38, 0, 272, 7, 0, 272, 8, ! 0, 272, 9, 0, 272, 38, 0, 272, 251, 0, ! 272, 170, 0, 272, 317, 170, 0, 272, 326, 317, ! 170, 0, 272, 326, 170, 0, 272, 185, 0, 272, ! 317, 185, 0, 272, 326, 317, 185, 0, 273, 0, ! 272, 172, 0, 274, 0, 273, 61, 0, 273, 65, ! 0, 274, 61, 0, 274, 65, 0, 272, 172, 61, ! 0, 272, 172, 65, 0, 272, 61, 0, 0, 65, ! 391, 0, 65, 391, 278, 0, 279, 0, 278, 62, ! 391, 279, 0, 280, 0, 281, 391, 280, 0, 319, ! 0, 305, 0, 39, 391, 0, 7, 391, 0, 281, ! 39, 391, 0, 281, 7, 391, 0, 0, 284, 0, ! 282, 283, 284, 0, 282, 283, 0, 39, 65, 0, ! 285, 0, 284, 285, 0, 286, 63, 0, 286, 111, ! 0, 163, 65, 0, 163, 97, 0, 163, 26, 0, ! 163, 61, 0, 63, 0, 120, 285, 0, 140, 285, ! 0, 140, 230, 63, 0, 393, 0, 230, 287, 0, ! 233, 288, 0, 309, 241, 250, 257, 0, 156, 241, ! 250, 257, 0, 65, 207, 0, 1, 0, 233, 162, ! 241, 250, 257, 0, 162, 241, 250, 257, 0, 130, ! 0, 0, 289, 0, 287, 62, 290, 0, 0, 292, ! 0, 288, 62, 294, 0, 291, 0, 292, 0, 293, ! 0, 294, 0, 303, 241, 250, 257, 0, 4, 65, ! 207, 250, 0, 309, 241, 250, 257, 0, 156, 241, ! 250, 257, 0, 3, 65, 207, 250, 0, 65, 207, ! 250, 0, 303, 241, 250, 257, 0, 4, 65, 207, ! 250, 0, 309, 241, 250, 257, 0, 3, 65, 207, ! 250, 0, 65, 207, 250, 0, 296, 271, 0, 271, ! 0, 297, 0, 296, 62, 297, 0, 170, 0, 170, ! 67, 207, 0, 371, 327, 0, 371, 0, 95, 229, ! 110, 96, 193, 113, 0, 0, 299, 9, 0, 9, ! 0, 300, 9, 0, 251, 0, 300, 251, 0, 95, ! 201, 110, 0, 95, 381, 110, 0, 49, 0, 95, ! 1, 110, 0, 303, 0, 251, 303, 0, 83, 300, ! 302, 0, 73, 300, 302, 0, 83, 302, 0, 73, ! 302, 0, 325, 299, 302, 0, 304, 0, 304, 301, ! 299, 396, 0, 304, 96, 193, 113, 0, 304, 96, ! 113, 0, 95, 302, 110, 0, 317, 316, 0, 316, ! 0, 316, 0, 326, 316, 0, 305, 0, 307, 0, ! 326, 307, 0, 317, 316, 0, 309, 0, 251, 309, ! 0, 83, 300, 308, 0, 73, 300, 308, 0, 83, ! 308, 0, 73, 308, 0, 325, 299, 308, 0, 217, ! 0, 83, 300, 308, 0, 73, 300, 308, 0, 83, ! 310, 0, 73, 310, 0, 325, 299, 308, 0, 311, ! 0, 217, 301, 299, 396, 0, 95, 310, 110, 0, ! 217, 96, 193, 113, 0, 217, 96, 113, 0, 313, ! 0, 326, 313, 0, 326, 209, 0, 317, 216, 0, ! 317, 213, 0, 317, 212, 0, 317, 209, 0, 317, ! 212, 0, 313, 0, 326, 313, 0, 236, 95, 201, ! 110, 0, 236, 95, 214, 110, 0, 236, 228, 0, ! 4, 0, 5, 0, 184, 0, 318, 0, 317, 318, ! 0, 317, 50, 323, 56, 0, 317, 3, 56, 0, ! 317, 59, 56, 0, 4, 56, 0, 5, 56, 0, ! 60, 56, 0, 184, 56, 0, 320, 0, 326, 320, ! 0, 321, 170, 0, 321, 184, 0, 321, 323, 0, ! 321, 50, 323, 0, 322, 0, 321, 322, 0, 321, ! 323, 56, 0, 321, 50, 323, 56, 0, 4, 56, ! 0, 5, 56, 0, 184, 56, 0, 59, 56, 0, ! 3, 56, 0, 60, 56, 0, 170, 77, 189, 188, ! 0, 326, 316, 0, 307, 0, 326, 307, 0, 317, ! 83, 0, 326, 317, 83, 0, 56, 0, 83, 299, ! 327, 0, 83, 299, 0, 73, 299, 327, 0, 73, ! 299, 0, 325, 299, 0, 325, 299, 327, 0, 328, ! 0, 96, 193, 113, 0, 328, 96, 193, 113, 0, ! 330, 0, 251, 330, 0, 83, 300, 329, 0, 83, ! 329, 0, 83, 300, 0, 83, 0, 73, 300, 329, ! 0, 73, 329, 0, 73, 300, 0, 73, 0, 325, ! 299, 0, 325, 299, 329, 0, 331, 0, 95, 329, ! 110, 0, 331, 95, 381, 110, 299, 396, 0, 331, ! 49, 299, 396, 0, 331, 96, 193, 113, 0, 331, ! 96, 113, 0, 95, 382, 110, 299, 396, 0, 205, ! 299, 396, 0, 228, 299, 396, 0, 96, 193, 113, ! 0, 96, 113, 0, 345, 0, 333, 0, 332, 345, ! 0, 332, 333, 0, 1, 63, 0, 0, 335, 0, ! 336, 0, 335, 336, 0, 34, 256, 63, 0, 0, ! 403, 61, 338, 199, 0, 337, 0, 0, 0, 16, ! 341, 195, 342, 343, 0, 339, 0, 0, 344, 403, ! 346, 0, 339, 0, 403, 346, 0, 226, 0, 193, ! 63, 0, 0, 340, 17, 347, 343, 0, 340, 0, ! 0, 0, 18, 348, 195, 349, 343, 0, 0, 0, ! 19, 350, 343, 18, 351, 194, 63, 0, 0, 0, ! 0, 0, 20, 352, 95, 374, 353, 196, 63, 354, ! 376, 110, 355, 343, 0, 0, 0, 21, 356, 95, ! 197, 110, 357, 343, 0, 0, 22, 207, 65, 358, ! 345, 0, 0, 22, 207, 13, 207, 65, 359, 345, ! 0, 0, 23, 65, 360, 345, 0, 24, 63, 0, ! 25, 63, 0, 26, 63, 0, 26, 193, 63, 0, ! 121, 375, 95, 223, 110, 63, 0, 121, 375, 95, ! 223, 65, 377, 110, 63, 0, 121, 375, 95, 223, ! 65, 377, 65, 377, 110, 63, 0, 121, 375, 95, ! 223, 56, 377, 110, 63, 0, 121, 375, 95, 223, ! 65, 377, 65, 377, 65, 380, 110, 63, 0, 121, ! 375, 95, 223, 56, 377, 65, 380, 110, 63, 0, ! 121, 375, 95, 223, 65, 377, 56, 380, 110, 63, ! 0, 27, 83, 193, 63, 0, 27, 170, 63, 0, ! 373, 345, 0, 373, 111, 0, 63, 0, 364, 0, ! 132, 0, 131, 0, 128, 0, 0, 0, 97, 362, ! 153, 363, 367, 0, 0, 0, 97, 365, 339, 366, ! 367, 0, 368, 0, 367, 368, 0, 0, 0, 0, ! 98, 369, 372, 370, 339, 0, 234, 0, 300, 0, ! 95, 13, 110, 0, 95, 390, 110, 0, 3, 65, ! 0, 59, 65, 0, 4, 65, 0, 5, 65, 0, ! 376, 63, 0, 226, 0, 61, 199, 0, 0, 9, ! 0, 0, 193, 0, 1, 0, 0, 378, 0, 379, ! 0, 378, 62, 379, 0, 12, 95, 193, 110, 0, ! 96, 170, 113, 12, 95, 193, 110, 0, 223, 0, ! 380, 62, 223, 0, 0, 382, 0, 229, 0, 386, ! 0, 387, 13, 0, 386, 13, 0, 229, 13, 0, ! 13, 0, 386, 65, 0, 229, 65, 0, 0, 67, ! 384, 385, 0, 102, 0, 258, 0, 388, 0, 390, ! 383, 0, 387, 389, 0, 387, 392, 0, 387, 392, ! 67, 258, 0, 386, 62, 0, 229, 62, 0, 231, ! 227, 0, 234, 227, 0, 236, 227, 0, 231, 330, ! 0, 231, 0, 233, 309, 0, 390, 0, 390, 383, ! 0, 388, 0, 229, 0, 0, 0, 309, 0, 3, ! 394, 3, 395, 63, 0, 77, 189, 188, 0, 0, ! 95, 201, 110, 0, 0, 0, 64, 95, 398, 110, ! 0, 64, 49, 0, 229, 0, 1, 0, 397, 0, ! 398, 62, 397, 0, 0, 83, 299, 399, 0, 73, ! 299, 399, 0, 325, 299, 399, 0, 43, 0, 0, ! 400, 83, 401, 0, 400, 84, 401, 0, 400, 85, ! 401, 0, 400, 81, 401, 0, 400, 82, 401, 0, ! 400, 73, 401, 0, 400, 71, 401, 0, 400, 72, ! 401, 0, 400, 91, 401, 0, 400, 62, 401, 0, ! 400, 76, 401, 0, 400, 77, 401, 0, 400, 78, ! 401, 0, 400, 75, 401, 0, 400, 66, 401, 0, ! 400, 67, 401, 0, 400, 79, 401, 0, 400, 80, ! 401, 0, 400, 89, 401, 0, 400, 90, 401, 0, ! 400, 70, 401, 0, 400, 69, 401, 0, 400, 112, ! 401, 0, 400, 68, 65, 401, 0, 400, 74, 401, ! 0, 400, 93, 401, 0, 400, 86, 401, 0, 400, ! 49, 401, 0, 400, 96, 113, 401, 0, 400, 41, ! 401, 0, 400, 40, 401, 0, 400, 41, 96, 113, ! 401, 0, 400, 40, 96, 113, 401, 0, 400, 371, ! 399, 401, 0, 400, 1, 401, 0, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, ! 454, 457, 465, 468, 469, 473, 475, 478, 483, 487, ! 493, 497, 501, 505, 508, 511, 514, 515, 517, 520, ! 522, 524, 526, 528, 530, 532, 534, 535, 537, 538, ! 542, 545, 554, 557, 559, 563, 566, 568, 572, 575, ! 587, 594, 603, 605, 606, 608, 612, 615, 621, 624, ! 628, 634, 636, 639, 642, 646, 649, 653, 656, 660, ! 665, 675, 677, 679, 681, 683, 697, 700, 704, 707, ! 709, 711, 714, 717, 721, 723, 725, 727, 737, 739, ! 741, 743, 745, 746, 753, 754, 755, 757, 758, 761, ! 763, 766, 768, 769, 772, 774, 780, 784, 791, 794, ! 796, 800, 803, 805, 809, 811, 813, 817, 819, 821, ! 825, 827, 829, 835, 840, 843, 846, 849, 857, 860, ! 863, 865, 867, 869, 875, 884, 887, 889, 891, 894, ! 896, 901, 908, 911, 913, 917, 929, 936, 942, 947, ! 958, 961, 968, 976, 978, 981, 983, 986, 988, 991, ! 995, 997, 998, 999, 1000, 1003, 1005, 1006, 1009, 1011, ! 1012, 1015, 1020, 1020, 1024, 1024, 1027, 1027, 1030, 1030, ! 1034, 1034, 1039, 1039, 1042, 1042, 1045, 1047, 1051, 1059, ! 1063, 1066, 1069, 1071, 1076, 1082, 1092, 1094, 1102, 1105, ! 1108, 1111, 1115, 1118, 1124, 1130, 1131, 1143, 1146, 1148, ! 1150, 1152, 1156, 1159, 1162, 1167, 1171, 1176, 1180, 1183, ! 1184, 1188, 1205, 1211, 1214, 1216, 1217, 1218, 1221, 1225, ! 1228, 1230, 1234, 1237, 1240, 1244, 1247, 1249, 1251, 1253, ! 1256, 1258, 1260, 1263, 1265, 1271, 1274, 1277, 1280, 1283, ! 1288, 1291, 1294, 1298, 1300, 1304, 1308, 1310, 1314, 1317, ! 1322, 1325, 1327, 1337, 1351, 1356, 1362, 1364, 1366, 1379, ! 1382, 1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, ! 1402, 1404, 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420, ! 1422, 1426, 1428, 1430, 1434, 1437, 1439, 1441, 1443, 1445, ! 1447, 1449, 1451, 1453, 1455, 1457, 1459, 1461, 1463, 1465, ! 1467, 1469, 1471, 1473, 1475, 1479, 1481, 1483, 1487, 1490, ! 1492, 1493, 1494, 1495, 1496, 1499, 1512, 1515, 1519, 1522, ! 1524, 1529, 1531, 1532, 1535, 1537, 1545, 1547, 1549, 1551, ! 1555, 1558, 1562, 1566, 1567, 1568, 1572, 1580, 1581, 1582, ! 1592, 1598, 1600, 1603, 1605, 1616, 1621, 1623, 1625, 1627, ! 1629, 1632, 1634, 1636, 1639, 1641, 1652, 1653, 1657, 1661, ! 1665, 1669, 1671, 1675, 1677, 1679, 1687, 1689, 1691, 1693, ! 1697, 1699, 1701, 1703, 1708, 1710, 1712, 1714, 1717, 1719, ! 1721, 1765, 1768, 1772, 1775, 1779, 1782, 1787, 1789, 1793, ! 1801, 1804, 1811, 1817, 1821, 1823, 1828, 1830, 1837, 1839, ! 1843, 1847, 1853, 1857, 1860, 1864, 1867, 1877, 1880, 1884, ! 1888, 1891, 1894, 1897, 1900, 1906, 1912, 1914, 1935, 1938, ! 1943, 1948, 1956, 1966, 1970, 1973, 1976, 1981, 1984, 1986, ! 1988, 1996, 1999, 2001, 2003, 2006, 2009, 2024, 2043, 2046, ! 2048, 2051, 2053, 2057, 2059, 2063, 2065, 2069, 2072, 2076, ! 2081, 2082, 2095, 2102, 2103, 2109, 2114, 2119, 2127, 2128, ! 2135, 2138, 2142, 2145, 2149, 2154, 2157, 2161, 2164, 2166, ! 2168, 2170, 2177, 2179, 2180, 2181, 2185, 2188, 2192, 2195, ! 2202, 2204, 2207, 2210, 2213, 2219, 2222, 2225, 2227, 2229, ! 2233, 2239, 2244, 2250, 2252, 2257, 2260, 2264, 2266, 2268, ! 2272, 2276, 2282, 2285, 2291, 2294, 2297, 2303, 2320, 2339, ! 2344, 2349, 2357, 2359, 2362, 2364, 2369, 2371, 2373, 2375, ! 2377, 2379, 2383, 2389, 2394, 2399, 2406, 2412, 2417, 2424, ! 2431, 2437, 2444, 2452, 2459, 2470, 2481, 2489, 2497, 2506, ! 2509, 2512, 2516, 2518, 2522, 2525, 2529, 2533, 2537, 2539, ! 2543, 2554, 2568, 2569, 2570, 2571, 2574, 2583, 2590, 2598, ! 2600, 2605, 2607, 2609, 2611, 2613, 2615, 2618, 2628, 2633, ! 2637, 2662, 2668, 2670, 2672, 2674, 2685, 2690, 2692, 2698, ! 2701, 2708, 2718, 2721, 2728, 2738, 2740, 2743, 2745, 2748, ! 2752, 2757, 2761, 2764, 2767, 2772, 2775, 2779, 2782, 2784, ! 2788, 2790, 2797, 2799, 2802, 2805, 2810, 2814, 2819, 2829, ! 2832, 2836, 2840, 2843, 2846, 2855, 2858, 2860, 2862, 2868, ! 2870, 2879, 2882, 2884, 2886, 2888, 2892, 2895, 2898, 2900, ! 2902, 2904, 2908, 2911, 2922, 2932, 2934, 2935, 2939, 2947, ! 2949, 2957, 2960, 2962, 2964, 2966, 2970, 2973, 2976, 2978, ! 2980, 2982, 2986, 2989, 2992, 2994, 2996, 2998, 3000, 3002, ! 3006, 3013, 3017, 3022, 3026, 3031, 3033, 3037, 3040, 3042, ! 3046, 3048, 3049, 3052, 3054, 3056, 3060, 3063, 3070, 3081, ! 3087, 3093, 3097, 3099, 3103, 3117, 3119, 3121, 3125, 3133, ! 3146, 3149, 3156, 3169, 3175, 3177, 3178, 3179, 3187, 3192, ! 3201, 3202, 3206, 3209, 3215, 3221, 3224, 3226, 3228, 3230, ! 3234, 3238, 3242, 3245, 3249, 3251, 3260, 3263, 3265, 3267, ! 3269, 3271, 3273, 3275, 3277, 3281, 3285, 3289, 3293, 3295, ! 3297, 3299, 3301, 3303, 3305, 3307, 3309, 3317, 3319, 3320, ! 3321, 3324, 3330, 3332, 3337, 3339, 3342, 3353, 3357, 3361, ! 3366, 3371, 3373, 3377, 3379, 3381, 3387, 3389, 3393, 3397, ! 3399, 3402, 3407, 3410, 3416, 3418, 3420, 3422, 3427, 3430, ! 3432, 3434, 3436, 3439, 3441, 3443, 3446, 3448, 3451, 3452, ! 3455, 3456, 3459, 3460, 3462, 3464, 3466, 3468, 3473, 3476, ! 3479, 3482, 3485, 3488, 3491, 3497, 3499, 3501, 3505, 3508, ! 3510, 3512, 3515, 3519, 3523, 3525, 3528, 3532, 3534, 3537, ! 3539, 3540, 3551, 3555, 3557, 3560, 3562, 3565, 3582, 3590, ! 3593, 3595, 3597, 3601, 3604, 3605, 3613, 3616, 3619, 3622, ! 3623, 3629, 3632, 3635, 3637, 3641, 3644, 3648, 3651, 3661, ! 3666, 3667, 3674, 3677, 3680, 3682, 3685, 3687, 3697, 3711, ! 3715, 3718, 3720, 3724, 3728, 3731, 3734, 3736, 3740, 3742, ! 3749, 3755, 3758, 3762, 3765, 3768, 3773, 3777, 3782, 3784, ! 3787, 3792, 3798, 3814, 3822, 3825, 3828, 3831, 3834, 3837, ! 3839, 3843, 3849, 3853, 3856, 3860, 3863, 3865, 3867, 3873, ! 3886, 3894, 3897, 3899, 3901, 3903, 3905, 3907, 3909, 3911, ! 3913, 3915, 3917, 3919, 3921, 3923, 3925, 3927, 3929, 3931, ! 3933, 3935, 3937, 3939, 3941, 3943, 3945, 3947, 3949, 3951, ! 3953, 3955, 3957, 3959, 3961, 3963, 3970 }; #endif *************** static const short yyrline[] = { 0, *** 857,872 **** static const char * const yytname[] = { "$","error","$undefined.","IDENTIFIER", "TYPENAME","SELFNAME","PFUNCNAME","SCSPEC","TYPESPEC","CV_QUALIFIER","CONSTANT", ! "STRING","ELLIPSIS","SIZEOF","ENUM","IF","ELSE","WHILE","DO","FOR","SWITCH", ! "CASE","DEFAULT","BREAK","CONTINUE","RETURN_KEYWORD","GOTO","ASM_KEYWORD","TYPEOF", ! "ALIGNOF","SIGOF","ATTRIBUTE","EXTENSION","LABEL","REALPART","IMAGPART","VA_ARG", ! "AGGR","VISSPEC","DELETE","NEW","THIS","OPERATOR","CXX_TRUE","CXX_FALSE","NAMESPACE", ! "TYPENAME_KEYWORD","USING","LEFT_RIGHT","TEMPLATE","TYPEID","DYNAMIC_CAST","STATIC_CAST", ! "REINTERPRET_CAST","CONST_CAST","SCOPE","EXPORT","EMPTY","PTYPENAME","NSNAME", ! "'{'","','","';'","THROW","':'","ASSIGN","'='","'?'","OROR","ANDAND","'|'","'^'", ! "'&'","MIN_MAX","EQCOMPARE","ARITHCOMPARE","'<'","'>'","LSHIFT","RSHIFT","'+'", ! "'-'","'*'","'/'","'%'","POINTSAT_STAR","DOT_STAR","UNARY","PLUSPLUS","MINUSMINUS", ! "'~'","HYPERUNARY","POINTSAT","'.'","'('","'['","TRY","CATCH","EXTERN_LANG_STRING", "ALL","PRE_PARSED_CLASS_DECL","DEFARG","DEFARG_MARKER","PRE_PARSED_FUNCTION_DECL", "TYPENAME_DEFN","IDENTIFIER_DEFN","PTYPENAME_DEFN","END_OF_LINE","END_OF_SAVED_INPUT", "')'","'}'","'!'","']'","program","extdefs","@1","extdefs_opt",".hush_warning", --- 881,896 ---- static const char * const yytname[] = { "$","error","$undefined.","IDENTIFIER", "TYPENAME","SELFNAME","PFUNCNAME","SCSPEC","TYPESPEC","CV_QUALIFIER","CONSTANT", ! "VAR_FUNC_NAME","STRING","ELLIPSIS","SIZEOF","ENUM","IF","ELSE","WHILE","DO", ! "FOR","SWITCH","CASE","DEFAULT","BREAK","CONTINUE","RETURN_KEYWORD","GOTO","ASM_KEYWORD", ! "TYPEOF","ALIGNOF","SIGOF","ATTRIBUTE","EXTENSION","LABEL","REALPART","IMAGPART", ! "VA_ARG","AGGR","VISSPEC","DELETE","NEW","THIS","OPERATOR","CXX_TRUE","CXX_FALSE", ! "NAMESPACE","TYPENAME_KEYWORD","USING","LEFT_RIGHT","TEMPLATE","TYPEID","DYNAMIC_CAST", ! "STATIC_CAST","REINTERPRET_CAST","CONST_CAST","SCOPE","EXPORT","EMPTY","PTYPENAME", ! "NSNAME","'{'","','","';'","THROW","':'","ASSIGN","'='","'?'","OROR","ANDAND", ! "'|'","'^'","'&'","MIN_MAX","EQCOMPARE","ARITHCOMPARE","'<'","'>'","LSHIFT", ! "RSHIFT","'+'","'-'","'*'","'/'","'%'","POINTSAT_STAR","DOT_STAR","UNARY","PLUSPLUS", ! "MINUSMINUS","'~'","HYPERUNARY","POINTSAT","'.'","'('","'['","TRY","CATCH","EXTERN_LANG_STRING", "ALL","PRE_PARSED_CLASS_DECL","DEFARG","DEFARG_MARKER","PRE_PARSED_FUNCTION_DECL", "TYPENAME_DEFN","IDENTIFIER_DEFN","PTYPENAME_DEFN","END_OF_LINE","END_OF_SAVED_INPUT", "')'","'}'","'!'","']'","program","extdefs","@1","extdefs_opt",".hush_warning", *************** static const char * const yytname[] = { *** 876,893 **** "@8","template_spec_header","template_header","template_parm_list","maybe_identifier", "template_type_parm","template_template_parm","template_parm","template_def", "template_extdef","template_datadef","datadef","ctor_initializer_opt","maybe_return_init", ! "eat_saved_input","fndef","constructor_declarator","@9","@10","@11","@12","fn.def1", ! "component_constructor_declarator","fn.def2","return_id","return_init","base_init", ! ".set_base_init","member_init_list","member_init","identifier","notype_identifier", ! "identifier_defn","explicit_instantiation","@13","@14","@15","@16","@17","@18", ! "@19","@20","begin_explicit_instantiation","end_explicit_instantiation","template_type", ! "apparent_template_type","self_template_type",".finish_template_type","template_close_bracket", ! "template_arg_list_opt","template_arg_list","template_arg","unop","expr","paren_expr_or_null", ! "paren_cond_or_null","xcond","condition","@21","compstmtend","already_scoped_stmt", ! "@22","nontrivial_exprlist","nonnull_exprlist","unary_expr","new_placement", ! "new_initializer","regcast_or_absdcl","cast_expr","expr_no_commas","expr_no_comma_rangle", ! "notype_unqualified_id","do_id","template_id","object_template_id","unqualified_id", ! "expr_or_declarator_intern","expr_or_declarator","notype_template_declarator", "direct_notype_declarator","primary","@23","new","delete","boolean.literal", "string","nodecls","object","decl","declarator","fcast_or_absdcl","type_id", "typed_declspecs","typed_declspecs1","reserved_declspecs","declmods","typed_typespecs", --- 900,917 ---- "@8","template_spec_header","template_header","template_parm_list","maybe_identifier", "template_type_parm","template_template_parm","template_parm","template_def", "template_extdef","template_datadef","datadef","ctor_initializer_opt","maybe_return_init", ! "eat_saved_input","function_body","@9","fndef","constructor_declarator","@10", ! "@11","@12","@13","fn.def1","component_constructor_declarator","fn.def2","return_id", ! "return_init","base_init",".begin_function_body","member_init_list","member_init", ! "identifier","notype_identifier","identifier_defn","explicit_instantiation", ! "@14","@15","@16","@17","@18","@19","@20","@21","begin_explicit_instantiation", ! "end_explicit_instantiation","template_type","apparent_template_type","self_template_type", ! ".finish_template_type","template_close_bracket","template_arg_list_opt","template_arg_list", ! "template_arg","unop","expr","paren_expr_or_null","paren_cond_or_null","xcond", ! "condition","@22","compstmtend","nontrivial_exprlist","nonnull_exprlist","unary_expr", ! "new_placement","new_initializer","regcast_or_absdcl","cast_expr","expr_no_commas", ! "expr_no_comma_rangle","notype_unqualified_id","do_id","template_id","object_template_id", ! "unqualified_id","expr_or_declarator_intern","expr_or_declarator","notype_template_declarator", "direct_notype_declarator","primary","@23","new","delete","boolean.literal", "string","nodecls","object","decl","declarator","fcast_or_absdcl","type_id", "typed_declspecs","typed_declspecs1","reserved_declspecs","declmods","typed_typespecs", *************** static const char * const yytname[] = { *** 897,924 **** "attribute_list","attrib","any_word","identifiers_or_typenames","maybe_init", "init","initlist","pending_inline","pending_inlines","defarg_again","pending_defargs", "structsp","@27","@28","@29","@30","@31","maybecomma","maybecomma_warn","aggr", ! "named_class_head_sans_basetype","named_class_head_sans_basetype_defn","named_complex_class_head_sans_basetype", ! "named_class_head","@32","unnamed_class_head","class_head","maybe_base_class_list", ! "base_class_list","base_class","base_class.1","base_class_access_list","opt.component_decl_list", ! "access_specifier","component_decl_list","component_decl","component_decl_1", ! "components","notype_components","component_declarator0","component_declarator", ! "after_type_component_declarator0","notype_component_declarator0","after_type_component_declarator", ! "notype_component_declarator","enumlist_opt","enumlist","enumerator","new_type_id", ! "cv_qualifiers","nonempty_cv_qualifiers","maybe_parmlist","after_type_declarator_intern", ! "after_type_declarator","direct_after_type_declarator","nonnested_type","complete_type_name", ! "nested_type","notype_declarator_intern","notype_declarator","complex_notype_declarator", ! "complex_direct_notype_declarator","qualified_id","notype_qualified_id","overqualified_id", ! "functional_cast","type_name","nested_name_specifier","nested_name_specifier_1", ! "typename_sub","typename_sub0","typename_sub1","typename_sub2","explicit_template_type", ! "complex_type_name","ptr_to_mem","global_scope","new_declarator","direct_new_declarator", ! "absdcl_intern","absdcl","direct_abstract_declarator","stmts","errstmt","maybe_label_decls", ! "label_decls","label_decl","compstmt_or_error","compstmt","@33","simple_if", ! "@34","@35","implicitly_scoped_stmt","@36","stmt","simple_stmt","@37","@38", ! "@39","@40","@41","@42","@43","@44","@45","@46","@47","@48","@49","@50","function_try_block", ! "@51","@52","try_block","@53","@54","handler_seq","handler","@55","@56","type_specifier_seq", "handler_args","label_colon","for.init.statement","maybe_cv_qualifier","xexpr", "asm_operands","nonnull_asm_operands","asm_operand","asm_clobbers","parmlist", ! "complex_parmlist","defarg","@57","defarg1","parms","parms_comma","named_parm", "full_parm","parm","see_typename","bad_parm","bad_decl","template_arg_list_ignore", "arg_list_ignore","exception_specification_opt","ansi_raise_identifier","ansi_raise_identifiers", "conversion_declarator","operator","unoperator","operator_name","save_lineno", NULL --- 921,948 ---- "attribute_list","attrib","any_word","identifiers_or_typenames","maybe_init", "init","initlist","pending_inline","pending_inlines","defarg_again","pending_defargs", "structsp","@27","@28","@29","@30","@31","maybecomma","maybecomma_warn","aggr", ! "class_head","class_head_apparent_template","class_head_decl","class_head_defn", ! "maybe_base_class_list","base_class_list","base_class","base_class.1","base_class_access_list", ! "opt.component_decl_list","access_specifier","component_decl_list","component_decl", ! "component_decl_1","components","notype_components","component_declarator0", ! "component_declarator","after_type_component_declarator0","notype_component_declarator0", ! "after_type_component_declarator","notype_component_declarator","enumlist_opt", ! "enumlist","enumerator","new_type_id","cv_qualifiers","nonempty_cv_qualifiers", ! "maybe_parmlist","after_type_declarator_intern","after_type_declarator","direct_after_type_declarator", ! "nonnested_type","complete_type_name","nested_type","notype_declarator_intern", ! "notype_declarator","complex_notype_declarator","complex_direct_notype_declarator", ! "qualified_id","notype_qualified_id","overqualified_id","functional_cast","type_name", ! "nested_name_specifier","nested_name_specifier_1","typename_sub","typename_sub0", ! "typename_sub1","typename_sub2","explicit_template_type","complex_type_name", ! "ptr_to_mem","global_scope","new_declarator","direct_new_declarator","absdcl_intern", ! "absdcl","direct_abstract_declarator","stmts","errstmt","maybe_label_decls", ! "label_decls","label_decl","compstmt_or_stmtexpr","@32","compstmt","simple_if", ! "@33","@34","implicitly_scoped_stmt","@35","stmt","simple_stmt","@36","@37", ! "@38","@39","@40","@41","@42","@43","@44","@45","@46","@47","@48","@49","function_try_block", ! "@50","@51","try_block","@52","@53","handler_seq","handler","@54","@55","type_specifier_seq", "handler_args","label_colon","for.init.statement","maybe_cv_qualifier","xexpr", "asm_operands","nonnull_asm_operands","asm_operand","asm_clobbers","parmlist", ! "complex_parmlist","defarg","@56","defarg1","parms","parms_comma","named_parm", "full_parm","parm","see_typename","bad_parm","bad_decl","template_arg_list_ignore", "arg_list_ignore","exception_specification_opt","ansi_raise_identifier","ansi_raise_identifiers", "conversion_declarator","operator","unoperator","operator_name","save_lineno", NULL *************** static const char * const yytname[] = { *** 926,1023 **** #endif static const short yyr1[] = { 0, ! 113, 113, 115, 114, 114, 116, 116, 117, 118, 119, ! 120, 122, 121, 123, 123, 124, 123, 123, 123, 123, ! 123, 123, 125, 123, 126, 123, 123, 123, 123, 123, ! 128, 127, 129, 129, 129, 130, 130, 130, 132, 131, ! 133, 133, 134, 134, 134, 134, 135, 135, 137, 136, ! 138, 139, 139, 140, 140, 141, 141, 142, 142, 143, ! 144, 144, 144, 144, 144, 144, 145, 145, 146, 146, ! 146, 146, 146, 146, 147, 147, 147, 147, 148, 148, ! 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, ! 150, 150, 150, 151, 151, 152, 152, 152, 154, 153, ! 153, 155, 153, 153, 156, 153, 153, 157, 153, 153, ! 158, 158, 158, 158, 158, 159, 159, 159, 159, 160, ! 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, ! 163, 164, 165, 165, 165, 165, 166, 166, 166, 166, ! 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, ! 168, 168, 168, 169, 169, 169, 171, 170, 172, 170, ! 173, 170, 174, 170, 175, 170, 176, 170, 177, 170, ! 178, 170, 179, 180, 181, 181, 181, 182, 182, 183, ! 184, 185, 185, 186, 186, 187, 187, 188, 188, 188, ! 188, 189, 189, 189, 189, 189, 190, 190, 191, 191, ! 192, 192, 193, 193, 193, 195, 194, 194, 196, 196, ! 196, 196, 198, 197, 197, 199, 199, 199, 199, 200, ! 200, 201, 201, 201, 201, 201, 201, 201, 201, 201, ! 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, ! 201, 201, 201, 201, 201, 202, 202, 203, 203, 203, ! 203, 204, 204, 205, 205, 205, 206, 206, 206, 206, ! 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, ! 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, ! 206, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, ! 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, ! 208, 208, 209, 210, 210, 211, 211, 211, 212, 212, ! 212, 213, 213, 214, 214, 214, 214, 215, 215, 216, ! 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, ! 218, 217, 217, 217, 217, 217, 217, 217, 217, 217, ! 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, ! 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, ! 217, 217, 217, 217, 217, 217, 217, 219, 219, 220, ! 220, 221, 221, 222, 222, 223, 224, 224, 225, 225, ! 225, 225, 225, 225, 226, 226, 227, 227, 228, 228, ! 228, 228, 228, 229, 229, 230, 230, 230, 230, 230, ! 230, 231, 231, 231, 231, 231, 232, 232, 232, 232, ! 232, 232, 233, 233, 233, 233, 234, 234, 235, 235, ! 235, 235, 235, 235, 235, 236, 236, 236, 237, 237, ! 238, 238, 239, 239, 240, 240, 242, 241, 241, 244, ! 243, 243, 245, 246, 248, 247, 247, 249, 249, 250, ! 250, 251, 252, 252, 253, 253, 253, 253, 253, 254, ! 254, 254, 254, 255, 255, 256, 256, 257, 257, 257, ! 257, 257, 258, 258, 258, 258, 258, 259, 259, 259, ! 260, 260, 261, 261, 262, 262, 262, 264, 263, 265, ! 263, 263, 263, 263, 266, 267, 268, 263, 263, 269, ! 269, 270, 270, 271, 271, 271, 271, 271, 271, 272, ! 273, 273, 273, 274, 274, 274, 274, 274, 275, 276, ! 275, 275, 277, 278, 278, 279, 279, 279, 280, 280, ! 281, 281, 282, 282, 283, 283, 283, 283, 284, 284, ! 284, 284, 285, 286, 286, 287, 287, 287, 287, 287, ! 287, 287, 287, 287, 287, 287, 288, 288, 288, 288, ! 288, 288, 288, 288, 288, 289, 289, 289, 290, 290, ! 290, 291, 291, 292, 292, 293, 293, 294, 294, 294, ! 294, 295, 295, 296, 296, 296, 297, 297, 298, 298, ! 299, 299, 300, 300, 300, 301, 301, 302, 302, 303, ! 303, 303, 303, 304, 304, 305, 305, 305, 305, 305, ! 305, 306, 306, 306, 306, 306, 306, 307, 307, 308, ! 308, 308, 309, 310, 310, 311, 311, 311, 311, 311, ! 311, 312, 312, 312, 312, 312, 312, 313, 313, 313, ! 313, 313, 313, 313, 313, 314, 314, 315, 315, 316, ! 316, 317, 317, 317, 318, 318, 318, 319, 319, 319, ! 320, 320, 320, 320, 321, 321, 322, 322, 322, 322, ! 323, 323, 323, 323, 324, 324, 324, 324, 324, 324, ! 325, 326, 326, 326, 327, 327, 328, 329, 329, 329, ! 329, 329, 329, 329, 330, 330, 331, 331, 332, 332, ! 332, 332, 332, 332, 332, 332, 332, 332, 332, 333, ! 333, 333, 333, 333, 333, 333, 333, 333, 333, 334, ! 334, 334, 334, 335, 336, 336, 337, 337, 338, 339, ! 339, 341, 340, 343, 344, 342, 345, 346, 345, 347, ! 347, 348, 348, 349, 348, 348, 350, 351, 348, 352, ! 353, 348, 354, 355, 356, 357, 348, 358, 359, 348, ! 360, 348, 361, 348, 362, 348, 348, 348, 348, 348, ! 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, ! 348, 348, 348, 348, 348, 348, 364, 365, 363, 367, ! 368, 366, 369, 369, 371, 372, 370, 373, 373, 374, ! 374, 375, 375, 375, 375, 376, 376, 376, 377, 377, ! 378, 378, 378, 379, 379, 380, 380, 381, 382, 382, ! 383, 383, 383, 384, 384, 384, 384, 384, 384, 384, ! 386, 385, 387, 387, 388, 388, 388, 388, 388, 389, ! 389, 390, 390, 390, 390, 390, 390, 391, 391, 392, ! 392, 393, 394, 394, 395, 396, 396, 397, 397, 398, ! 398, 398, 399, 400, 400, 401, 401, 401, 401, 402, ! 403, 404, 404, 404, 404, 404, 404, 404, 404, 404, ! 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, ! 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, ! 404, 404, 404, 404, 404, 404, 405 }; static const short yyr2[] = { 0, --- 950,1048 ---- #endif static const short yyr1[] = { 0, ! 114, 114, 116, 115, 115, 117, 117, 118, 119, 120, ! 121, 123, 122, 124, 124, 125, 124, 124, 124, 124, ! 124, 124, 126, 124, 127, 124, 124, 124, 124, 124, ! 129, 128, 130, 130, 130, 131, 131, 131, 133, 132, ! 134, 134, 135, 135, 135, 135, 136, 136, 138, 137, ! 139, 140, 140, 141, 141, 142, 142, 143, 143, 144, ! 145, 145, 145, 145, 145, 145, 146, 146, 147, 147, ! 147, 147, 147, 147, 148, 148, 148, 148, 149, 149, ! 149, 149, 149, 149, 149, 149, 149, 149, 149, 150, ! 150, 151, 151, 151, 152, 152, 154, 153, 155, 155, ! 155, 157, 156, 156, 158, 156, 156, 159, 156, 156, ! 160, 156, 156, 161, 161, 161, 161, 161, 162, 162, ! 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, ! 163, 164, 165, 165, 165, 166, 167, 168, 168, 168, ! 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, ! 170, 170, 170, 170, 170, 171, 171, 171, 172, 172, ! 172, 174, 173, 175, 173, 176, 173, 177, 173, 178, ! 173, 179, 173, 180, 173, 181, 173, 182, 183, 184, ! 184, 184, 185, 185, 186, 187, 188, 188, 189, 189, ! 190, 190, 191, 191, 191, 191, 191, 192, 192, 192, ! 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, ! 196, 198, 197, 197, 199, 199, 199, 199, 200, 200, ! 200, 200, 201, 201, 202, 202, 202, 202, 202, 202, ! 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, ! 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, ! 204, 204, 204, 204, 205, 205, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, ! 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, ! 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, ! 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, ! 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, ! 209, 209, 209, 209, 209, 210, 211, 211, 212, 212, ! 212, 213, 213, 213, 214, 214, 215, 215, 215, 215, ! 216, 216, 217, 217, 217, 217, 218, 218, 218, 218, ! 218, 218, 218, 218, 219, 218, 218, 218, 218, 218, ! 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, ! 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, ! 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, ! 218, 220, 220, 221, 221, 222, 222, 223, 223, 224, ! 225, 225, 226, 226, 226, 226, 226, 226, 227, 227, ! 228, 228, 229, 229, 229, 229, 229, 230, 230, 231, ! 231, 231, 231, 231, 231, 232, 232, 232, 233, 233, ! 233, 233, 233, 234, 234, 234, 234, 235, 235, 235, ! 235, 236, 236, 236, 236, 236, 236, 236, 237, 237, ! 237, 238, 238, 239, 239, 240, 240, 241, 241, 243, ! 242, 242, 245, 244, 244, 246, 247, 249, 248, 248, ! 250, 250, 251, 251, 252, 253, 253, 254, 254, 254, ! 254, 254, 255, 255, 255, 255, 256, 256, 257, 257, ! 258, 258, 258, 258, 258, 259, 259, 259, 259, 259, ! 260, 260, 260, 261, 261, 262, 262, 263, 263, 263, ! 265, 264, 266, 264, 264, 264, 264, 267, 268, 269, ! 264, 264, 270, 270, 271, 271, 272, 272, 272, 272, ! 272, 272, 273, 273, 273, 273, 274, 274, 274, 275, ! 275, 275, 276, 276, 276, 276, 276, 276, 276, 277, ! 277, 277, 278, 278, 279, 279, 280, 280, 281, 281, ! 281, 281, 282, 282, 282, 282, 283, 284, 284, 285, ! 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, ! 286, 286, 286, 286, 286, 286, 286, 286, 286, 287, ! 287, 287, 288, 288, 288, 289, 289, 290, 290, 291, ! 291, 292, 292, 292, 292, 293, 293, 294, 294, 294, ! 295, 295, 296, 296, 297, 297, 298, 298, 298, 299, ! 299, 300, 300, 300, 300, 301, 301, 301, 301, 302, ! 302, 303, 303, 303, 303, 303, 303, 304, 304, 304, ! 304, 304, 304, 305, 305, 306, 306, 306, 307, 308, ! 308, 309, 309, 309, 309, 309, 309, 310, 310, 310, ! 310, 310, 310, 311, 311, 311, 311, 311, 311, 311, ! 311, 312, 312, 313, 313, 314, 314, 315, 315, 315, ! 316, 316, 316, 317, 317, 317, 317, 317, 318, 318, ! 318, 318, 319, 319, 320, 320, 320, 320, 321, 321, ! 321, 321, 322, 322, 322, 322, 322, 322, 323, 324, ! 324, 324, 325, 325, 326, 327, 327, 327, 327, 327, ! 327, 327, 328, 328, 329, 329, 330, 330, 330, 330, ! 330, 330, 330, 330, 330, 330, 330, 331, 331, 331, ! 331, 331, 331, 331, 331, 331, 331, 332, 332, 332, ! 332, 333, 334, 334, 335, 335, 336, 338, 337, 339, ! 341, 342, 340, 343, 344, 343, 345, 345, 346, 346, ! 347, 346, 346, 348, 349, 346, 350, 351, 346, 352, ! 353, 354, 355, 346, 356, 357, 346, 358, 346, 359, ! 346, 360, 346, 346, 346, 346, 346, 346, 346, 346, ! 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, ! 346, 346, 346, 362, 363, 361, 365, 366, 364, 367, ! 367, 367, 369, 370, 368, 371, 371, 372, 372, 373, ! 373, 373, 373, 374, 374, 374, 375, 375, 376, 376, ! 376, 377, 377, 378, 378, 379, 379, 380, 380, 381, ! 381, 381, 382, 382, 382, 382, 382, 382, 382, 384, ! 383, 385, 385, 386, 386, 386, 386, 386, 387, 387, ! 388, 388, 388, 388, 388, 388, 389, 389, 390, 390, ! 391, 392, 392, 393, 394, 394, 395, 395, 396, 396, ! 396, 397, 397, 398, 398, 399, 399, 399, 399, 400, ! 401, 402, 402, 402, 402, 402, 402, 402, 402, 402, ! 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, ! 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, ! 402, 402, 402, 402, 402, 402, 403 }; static const short yyr2[] = { 0, *************** static const short yyr2[] = { 0, *** 1029,1114 **** 3, 1, 1, 1, 3, 1, 0, 2, 2, 3, 1, 3, 1, 3, 1, 3, 2, 2, 2, 1, 1, 5, 4, 2, 2, 3, 3, 2, 2, 3, ! 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, ! 0, 1, 2, 0, 1, 4, 3, 3, 0, 8, ! 5, 0, 9, 6, 0, 8, 5, 0, 9, 6, ! 2, 2, 1, 2, 1, 6, 4, 6, 4, 2, ! 1, 2, 2, 1, 2, 1, 2, 2, 4, 2, ! 3, 0, 0, 1, 3, 2, 3, 1, 4, 2, ! 4, 2, 4, 2, 1, 1, 1, 1, 1, 1, ! 1, 1, 1, 1, 1, 1, 0, 6, 0, 6, ! 0, 5, 0, 5, 0, 7, 0, 7, 0, 6, ! 0, 6, 0, 0, 5, 5, 1, 1, 5, 5, ! 0, 1, 1, 0, 1, 1, 3, 1, 1, 2, ! 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, ! 1, 3, 0, 1, 1, 0, 7, 1, 1, 3, ! 4, 3, 0, 4, 2, 3, 3, 3, 3, 1, ! 1, 1, 2, 2, 2, 2, 2, 2, 2, 4, ! 2, 4, 2, 3, 3, 4, 4, 5, 5, 6, ! 2, 4, 5, 2, 2, 3, 3, 3, 1, 3, ! 2, 3, 4, 1, 2, 5, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 3, 3, 3, 3, 3, 3, 5, 3, 3, 1, ! 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 5, 3, 3, 1, 2, 3, 3, 1, 1, 1, ! 1, 1, 0, 5, 5, 5, 5, 5, 1, 1, ! 1, 1, 2, 1, 2, 2, 3, 4, 4, 1, ! 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, ! 0, 4, 4, 2, 4, 2, 6, 4, 2, 2, ! 1, 4, 1, 7, 7, 7, 7, 4, 4, 2, ! 2, 2, 1, 4, 2, 2, 5, 3, 2, 2, ! 5, 3, 5, 3, 4, 6, 2, 1, 2, 1, ! 2, 1, 1, 1, 2, 0, 2, 2, 3, 3, ! 3, 2, 2, 2, 1, 1, 1, 2, 2, 2, ! 2, 1, 1, 1, 1, 2, 2, 3, 3, 3, ! 4, 1, 2, 2, 2, 1, 1, 1, 2, 2, ! 2, 1, 1, 2, 2, 3, 1, 2, 1, 1, ! 1, 4, 4, 4, 4, 1, 1, 1, 1, 3, ! 1, 3, 1, 3, 0, 4, 0, 6, 3, 0, ! 4, 1, 3, 3, 0, 4, 3, 0, 1, 1, ! 2, 6, 1, 3, 0, 1, 4, 6, 4, 1, ! 1, 1, 1, 1, 3, 0, 2, 1, 2, 3, ! 4, 1, 1, 3, 4, 3, 5, 4, 3, 3, ! 0, 3, 3, 3, 0, 2, 2, 0, 6, 0, ! 5, 2, 2, 2, 0, 0, 0, 10, 1, 0, ! 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, ! 2, 2, 2, 3, 4, 3, 2, 3, 1, 0, ! 3, 2, 2, 1, 1, 0, 2, 3, 1, 4, ! 1, 3, 1, 1, 2, 2, 3, 3, 0, 1, ! 3, 2, 2, 1, 2, 2, 2, 2, 2, 2, ! 2, 1, 2, 2, 3, 1, 2, 2, 4, 4, ! 2, 1, 5, 4, 1, 0, 1, 3, 0, 1, ! 3, 1, 1, 1, 1, 4, 4, 4, 4, 4, ! 3, 4, 4, 4, 4, 3, 2, 1, 1, 3, ! 1, 3, 2, 1, 6, 0, 2, 1, 2, 3, ! 3, 1, 3, 1, 2, 3, 3, 2, 2, 3, ! 1, 4, 4, 3, 3, 2, 1, 1, 2, 1, ! 1, 2, 2, 1, 2, 3, 3, 2, 2, 3, ! 1, 3, 3, 2, 2, 3, 1, 4, 3, 4, ! 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, ! 2, 4, 4, 2, 1, 1, 1, 1, 2, 4, ! 2, 2, 2, 2, 1, 2, 2, 2, 2, 3, ! 1, 2, 3, 4, 2, 2, 2, 2, 2, 2, ! 4, 2, 1, 2, 2, 3, 1, 3, 2, 3, ! 2, 2, 3, 1, 3, 4, 1, 2, 3, 2, ! 2, 1, 3, 2, 2, 1, 2, 3, 1, 3, ! 6, 4, 4, 3, 5, 3, 3, 3, 2, 1, ! 1, 2, 2, 2, 0, 1, 1, 2, 3, 1, ! 2, 0, 4, 0, 0, 5, 1, 0, 3, 1, ! 2, 1, 2, 0, 4, 1, 0, 0, 5, 0, ! 0, 7, 0, 0, 0, 0, 12, 0, 0, 7, ! 0, 5, 0, 7, 0, 4, 2, 2, 2, 3, ! 6, 8, 10, 8, 12, 10, 10, 4, 3, 2, ! 2, 1, 1, 1, 1, 1, 0, 0, 6, 0, ! 0, 5, 1, 2, 0, 0, 5, 1, 1, 3, ! 3, 2, 2, 2, 2, 2, 1, 2, 0, 1, ! 0, 1, 1, 0, 1, 1, 3, 4, 1, 3, ! 0, 1, 1, 1, 2, 2, 2, 1, 2, 2, ! 0, 3, 1, 1, 1, 2, 2, 2, 4, 2, ! 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, ! 1, 0, 0, 1, 5, 3, 0, 3, 0, 0, ! 4, 2, 1, 1, 3, 0, 3, 3, 3, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, --- 1054,1140 ---- 3, 1, 1, 1, 3, 1, 0, 2, 2, 3, 1, 3, 1, 3, 1, 3, 2, 2, 2, 1, 1, 5, 4, 2, 2, 3, 3, 2, 2, 3, ! 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, ! 1, 0, 1, 2, 0, 1, 0, 6, 3, 3, ! 3, 0, 8, 5, 0, 9, 6, 0, 8, 5, ! 0, 9, 6, 2, 2, 1, 2, 1, 6, 8, ! 4, 6, 6, 4, 2, 1, 2, 2, 1, 2, ! 1, 2, 2, 4, 2, 2, 0, 0, 1, 3, ! 2, 3, 1, 4, 2, 4, 2, 4, 2, 1, ! 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 1, 0, 6, 0, 6, 0, 5, 0, 5, 0, ! 7, 0, 7, 0, 6, 0, 6, 0, 0, 5, ! 5, 1, 1, 5, 5, 0, 1, 1, 0, 1, ! 1, 3, 1, 1, 2, 1, 3, 1, 1, 1, ! 1, 1, 1, 1, 1, 3, 1, 3, 0, 1, ! 1, 0, 7, 1, 1, 3, 4, 3, 3, 3, ! 3, 3, 1, 1, 1, 2, 2, 2, 2, 2, ! 2, 2, 4, 2, 4, 2, 3, 3, 4, 4, ! 5, 5, 6, 2, 4, 5, 2, 2, 3, 3, ! 3, 1, 3, 2, 3, 4, 1, 2, 5, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, ! 3, 3, 1, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 3, 3, 3, 5, 3, 3, 1, 2, 3, 3, ! 1, 1, 1, 1, 1, 0, 5, 5, 5, 5, ! 5, 1, 1, 1, 1, 2, 1, 2, 2, 3, ! 4, 4, 1, 1, 1, 3, 1, 1, 1, 1, ! 1, 3, 3, 3, 0, 4, 4, 2, 4, 2, ! 6, 4, 2, 2, 1, 4, 1, 7, 7, 7, ! 7, 4, 4, 2, 2, 2, 1, 4, 2, 2, ! 5, 3, 2, 2, 5, 3, 5, 3, 4, 6, ! 2, 1, 2, 1, 2, 1, 1, 1, 2, 0, ! 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, ! 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, ! 2, 3, 3, 3, 4, 1, 2, 2, 1, 1, ! 2, 2, 2, 1, 2, 2, 3, 1, 2, 2, ! 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, ! 1, 1, 3, 1, 3, 1, 3, 0, 4, 0, ! 6, 3, 0, 4, 1, 3, 3, 0, 4, 3, ! 0, 1, 1, 2, 6, 1, 3, 0, 1, 4, ! 6, 4, 1, 1, 1, 1, 1, 3, 0, 2, ! 1, 2, 3, 4, 1, 1, 3, 4, 3, 5, ! 3, 3, 3, 0, 3, 3, 3, 0, 2, 2, ! 0, 6, 0, 5, 2, 2, 2, 0, 0, 0, ! 11, 1, 0, 1, 0, 1, 1, 2, 2, 2, ! 2, 2, 2, 3, 4, 3, 2, 3, 4, 1, ! 2, 1, 2, 2, 2, 2, 3, 3, 2, 0, ! 2, 3, 1, 4, 1, 3, 1, 1, 2, 2, ! 3, 3, 0, 1, 3, 2, 2, 1, 2, 2, ! 2, 2, 2, 2, 2, 1, 2, 2, 3, 1, ! 2, 2, 4, 4, 2, 1, 5, 4, 1, 0, ! 1, 3, 0, 1, 3, 1, 1, 1, 1, 4, ! 4, 4, 4, 4, 3, 4, 4, 4, 4, 3, ! 2, 1, 1, 3, 1, 3, 2, 1, 6, 0, ! 2, 1, 2, 1, 2, 3, 3, 1, 3, 1, ! 2, 3, 3, 2, 2, 3, 1, 4, 4, 3, ! 3, 2, 1, 1, 2, 1, 1, 2, 2, 1, ! 2, 3, 3, 2, 2, 3, 1, 3, 3, 2, ! 2, 3, 1, 4, 3, 4, 3, 1, 2, 2, ! 2, 2, 2, 2, 2, 1, 2, 4, 4, 2, ! 1, 1, 1, 1, 2, 4, 3, 3, 2, 2, ! 2, 2, 1, 2, 2, 2, 2, 3, 1, 2, ! 3, 4, 2, 2, 2, 2, 2, 2, 4, 2, ! 1, 2, 2, 3, 1, 3, 2, 3, 2, 2, ! 3, 1, 3, 4, 1, 2, 3, 2, 2, 1, ! 3, 2, 2, 1, 2, 3, 1, 3, 6, 4, ! 4, 3, 5, 3, 3, 3, 2, 1, 1, 2, ! 2, 2, 0, 1, 1, 2, 3, 0, 4, 1, ! 0, 0, 5, 1, 0, 3, 1, 2, 1, 2, ! 0, 4, 1, 0, 0, 5, 0, 0, 7, 0, ! 0, 0, 0, 12, 0, 0, 7, 0, 5, 0, ! 7, 0, 4, 2, 2, 2, 3, 6, 8, 10, ! 8, 12, 10, 10, 4, 3, 2, 2, 1, 1, ! 1, 1, 1, 0, 0, 5, 0, 0, 5, 1, ! 2, 0, 0, 0, 5, 1, 1, 3, 3, 2, ! 2, 2, 2, 2, 1, 2, 0, 1, 0, 1, ! 1, 0, 1, 1, 3, 4, 7, 1, 3, 0, ! 1, 1, 1, 2, 2, 2, 1, 2, 2, 0, ! 3, 1, 1, 1, 2, 2, 2, 4, 2, 2, ! 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, ! 0, 0, 1, 5, 3, 0, 3, 0, 0, 4, ! 2, 1, 1, 1, 3, 0, 3, 3, 3, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 4, *************** static const short yyr2[] = { 0, *** 1116,4134 **** }; static const short yydefact[] = { 3, ! 12, 12, 5, 0, 4, 0, 310, 665, 666, 0, ! 418, 430, 608, 0, 11, 0, 0, 0, 10, 514, ! 880, 0, 0, 0, 173, 697, 16, 311, 312, 87, ! 0, 0, 862, 0, 47, 0, 0, 13, 27, 0, ! 29, 8, 52, 53, 0, 18, 15, 94, 115, 91, ! 0, 667, 177, 331, 308, 332, 641, 0, 405, 0, ! 404, 423, 0, 443, 422, 460, 429, 0, 529, 530, ! 536, 535, 534, 509, 417, 630, 431, 631, 113, 330, ! 652, 628, 0, 668, 606, 0, 88, 0, 309, 85, ! 86, 184, 0, 671, 184, 672, 184, 313, 173, 146, ! 147, 148, 149, 150, 500, 502, 0, 693, 0, 503, ! 0, 0, 0, 0, 147, 148, 149, 150, 25, 0, ! 0, 0, 0, 0, 0, 0, 504, 675, 0, 681, ! 0, 0, 0, 39, 0, 0, 33, 0, 0, 49, ! 0, 0, 184, 673, 0, 310, 0, 0, 639, 634, ! 0, 0, 0, 638, 0, 0, 0, 0, 331, 0, ! 322, 0, 0, 0, 330, 606, 30, 0, 28, 3, ! 48, 0, 68, 418, 0, 0, 8, 71, 67, 70, ! 94, 0, 0, 0, 429, 95, 14, 0, 458, 0, ! 0, 476, 92, 83, 674, 612, 0, 0, 606, 84, ! 0, 0, 0, 111, 0, 439, 395, 621, 396, 627, ! 0, 606, 420, 419, 82, 114, 406, 0, 441, 421, ! 112, 412, 436, 437, 407, 425, 427, 416, 438, 0, ! 79, 461, 515, 516, 517, 518, 533, 155, 154, 156, ! 520, 521, 178, 527, 519, 0, 0, 522, 523, 536, ! 862, 532, 505, 609, 424, 0, 455, 666, 0, 695, ! 177, 658, 659, 655, 633, 669, 0, 310, 312, 654, ! 632, 653, 629, 0, 881, 881, 881, 881, 881, 881, ! 881, 0, 881, 881, 881, 881, 881, 881, 881, 881, ! 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, ! 881, 881, 881, 881, 0, 881, 808, 423, 809, 876, ! 313, 608, 335, 384, 0, 0, 0, 0, 0, 380, ! 378, 351, 382, 383, 0, 0, 0, 0, 0, 311, ! 304, 0, 0, 193, 192, 0, 194, 195, 0, 0, ! 196, 0, 0, 185, 186, 0, 254, 0, 282, 191, ! 334, 222, 0, 0, 336, 337, 0, 188, 402, 423, ! 403, 660, 363, 353, 0, 0, 869, 0, 0, 184, ! 0, 512, 498, 0, 694, 692, 280, 0, 197, 257, ! 198, 0, 0, 0, 0, 465, 3, 23, 31, 689, ! 685, 686, 688, 690, 687, 146, 147, 148, 0, 149, ! 150, 677, 678, 682, 679, 676, 0, 320, 321, 319, ! 657, 656, 35, 34, 51, 0, 163, 0, 0, 423, ! 161, 17, 0, 0, 184, 635, 637, 0, 636, 147, ! 148, 306, 307, 326, 0, 645, 325, 0, 644, 0, ! 333, 311, 312, 0, 0, 0, 324, 323, 649, 0, ! 0, 12, 0, 173, 9, 9, 74, 0, 69, 0, ! 0, 75, 78, 0, 457, 459, 127, 98, 132, 797, ! 0, 90, 89, 97, 130, 0, 0, 128, 93, 0, ! 838, 221, 0, 220, 833, 856, 0, 402, 423, 403, ! 0, 832, 834, 863, 845, 0, 0, 651, 0, 0, ! 870, 0, 0, 619, 614, 0, 618, 0, 0, 0, ! 0, 0, 606, 458, 0, 81, 0, 606, 626, 0, ! 409, 410, 0, 80, 458, 414, 413, 415, 408, 428, ! 445, 444, 184, 524, 528, 526, 0, 531, 537, 0, ! 426, 458, 606, 99, 0, 0, 0, 0, 606, 105, ! 607, 640, 666, 696, 177, 916, 0, 912, 0, 911, ! 909, 891, 896, 897, 881, 903, 902, 888, 889, 887, ! 906, 895, 892, 893, 894, 898, 899, 885, 886, 882, ! 883, 884, 908, 900, 901, 890, 907, 881, 904, 425, ! 606, 606, 0, 606, 0, 881, 184, 0, 0, 229, ! 0, 231, 244, 245, 0, 0, 0, 0, 0, 0, ! 305, 228, 225, 224, 226, 0, 0, 0, 0, 0, ! 334, 0, 917, 0, 223, 182, 183, 328, 0, 227, ! 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 344, 0, 346, 349, 350, 388, ! 387, 0, 0, 0, 0, 0, 233, 604, 0, 241, ! 385, 377, 0, 0, 862, 366, 369, 370, 0, 0, ! 397, 716, 712, 0, 0, 606, 606, 606, 399, 719, ! 0, 664, 401, 0, 0, 400, 365, 0, 360, 379, ! 190, 361, 381, 661, 0, 362, 0, 0, 181, 181, ! 0, 171, 0, 423, 169, 513, 601, 598, 0, 512, ! 599, 512, 0, 281, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, ! 434, 435, 471, 472, 473, 470, 0, 463, 466, 0, ! 3, 0, 680, 184, 683, 0, 43, 44, 0, 57, ! 0, 0, 0, 61, 65, 54, 861, 423, 57, 860, ! 63, 174, 159, 157, 174, 181, 329, 0, 643, 642, ! 333, 0, 646, 0, 20, 22, 94, 9, 9, 77, ! 76, 0, 0, 386, 917, 96, 740, 0, 482, 0, ! 478, 477, 0, 613, 610, 837, 851, 840, 716, 712, ! 0, 852, 606, 855, 857, 0, 0, 853, 0, 854, ! 611, 836, 850, 839, 835, 864, 847, 858, 848, 841, ! 846, 650, 0, 664, 0, 648, 615, 617, 616, 0, ! 0, 0, 0, 0, 0, 606, 625, 0, 453, 452, ! 440, 624, 0, 870, 620, 411, 442, 454, 458, 0, ! 525, 665, 666, 862, 862, 667, 538, 539, 541, 862, ! 544, 543, 0, 572, 666, 0, 562, 0, 0, 575, ! 0, 126, 121, 0, 177, 576, 579, 0, 0, 554, ! 0, 124, 566, 456, 870, 831, 184, 184, 670, 184, ! 870, 831, 606, 102, 606, 108, 881, 881, 905, 910, ! 876, 876, 876, 0, 915, 0, 0, 0, 0, 0, ! 0, 0, 0, 423, 0, 0, 0, 340, 0, 338, ! 339, 0, 252, 187, 310, 665, 666, 311, 312, 0, ! 0, 483, 510, 0, 303, 302, 823, 822, 0, 300, ! 299, 297, 298, 296, 295, 294, 292, 293, 290, 291, ! 285, 286, 287, 288, 289, 283, 284, 0, 0, 0, ! 0, 0, 0, 0, 235, 249, 0, 0, 234, 606, ! 606, 0, 606, 603, 704, 0, 0, 0, 0, 0, ! 368, 0, 372, 0, 374, 0, 0, 715, 714, 707, ! 711, 710, 861, 422, 0, 0, 729, 0, 0, 870, ! 398, 870, 717, 606, 831, 0, 716, 712, 0, 0, ! 606, 0, 422, 0, 0, 0, 0, 0, 865, 176, ! 180, 314, 174, 167, 165, 174, 0, 501, 513, 597, ! 0, 219, 218, 217, 216, 279, 278, 0, 276, 275, ! 273, 274, 272, 271, 270, 267, 268, 269, 265, 266, ! 260, 261, 262, 263, 264, 258, 259, 465, 0, 0, ! 26, 0, 0, 684, 0, 40, 46, 45, 59, 56, ! 49, 57, 0, 50, 0, 0, 58, 520, 0, 164, ! 174, 174, 162, 175, 328, 327, 19, 21, 73, 94, ! 446, 145, 151, 138, 152, 153, 0, 131, 134, 0, ! 0, 0, 917, 741, 742, 479, 0, 129, 0, 715, ! 711, 716, 712, 0, 422, 628, 0, 606, 717, 0, ! 716, 712, 0, 334, 0, 660, 0, 859, 0, 0, ! 872, 0, 0, 0, 0, 450, 623, 622, 449, 181, ! 546, 545, 862, 862, 862, 0, 606, 831, 571, 563, ! 576, 564, 458, 458, 560, 561, 558, 559, 606, 831, ! 310, 665, 0, 445, 122, 567, 577, 582, 583, 445, ! 445, 0, 0, 445, 120, 568, 580, 445, 0, 458, ! 0, 555, 556, 557, 458, 101, 0, 0, 0, 0, ! 107, 0, 870, 831, 870, 831, 914, 913, 878, 877, ! 879, 315, 352, 230, 232, 0, 358, 359, 0, 0, ! 0, 0, 339, 342, 0, 0, 0, 0, 253, 0, ! 343, 345, 348, 247, 246, 237, 0, 236, 251, 0, ! 0, 701, 699, 0, 702, 0, 242, 0, 0, 184, ! 375, 0, 0, 0, 708, 713, 709, 720, 606, 728, ! 726, 727, 718, 870, 0, 724, 0, 0, 662, 663, ! 716, 712, 0, 364, 868, 172, 174, 174, 170, 602, ! 600, 499, 0, 464, 462, 310, 0, 24, 32, 691, ! 60, 55, 62, 66, 64, 160, 158, 72, 0, 136, ! 0, 140, 0, 142, 0, 144, 0, 798, 735, 0, ! 480, 0, 715, 711, 716, 712, 0, 606, 633, 717, ! 0, 663, 360, 361, 661, 362, 849, 843, 844, 842, ! 873, 874, 0, 0, 0, 0, 0, 0, 447, 179, ! 0, 548, 547, 542, 870, 0, 565, 476, 476, 870, ! 0, 0, 0, 458, 458, 0, 458, 458, 0, 458, ! 0, 553, 506, 0, 476, 606, 317, 316, 318, 606, ! 104, 0, 110, 0, 0, 0, 0, 0, 0, 0, ! 486, 0, 484, 256, 301, 0, 238, 239, 248, 250, ! 700, 698, 705, 703, 0, 243, 0, 0, 367, 371, ! 373, 870, 722, 606, 723, 168, 166, 277, 0, 467, ! 469, 137, 135, 0, 0, 0, 0, 0, 209, 743, ! 0, 736, 737, 481, 715, 711, 0, 717, 339, 0, ! 871, 451, 0, 540, 117, 606, 570, 574, 119, 606, ! 458, 458, 591, 476, 310, 665, 0, 578, 584, 585, ! 445, 445, 476, 476, 0, 476, 581, 495, 569, 870, ! 870, 606, 606, 347, 0, 0, 0, 0, 485, 0, ! 0, 240, 706, 376, 316, 725, 870, 0, 139, 141, ! 143, 805, 799, 803, 474, 0, 0, 0, 731, 750, ! 730, 0, 738, 716, 712, 0, 0, 875, 448, 870, ! 870, 590, 587, 589, 0, 0, 458, 458, 458, 586, ! 588, 573, 0, 100, 106, 870, 870, 354, 355, 356, ! 357, 487, 605, 721, 468, 0, 804, 0, 739, 734, ! 212, 0, 210, 733, 732, 310, 665, 666, 744, 757, ! 760, 763, 768, 0, 0, 0, 0, 0, 0, 0, ! 0, 311, 792, 800, 0, 819, 796, 795, 794, 0, ! 752, 0, 0, 423, 756, 751, 793, 917, 422, 116, ! 118, 458, 458, 596, 476, 476, 497, 0, 496, 491, ! 103, 109, 0, 806, 475, 211, 812, 814, 815, 0, ! 0, 748, 0, 0, 0, 775, 777, 778, 779, 0, ! 0, 0, 0, 0, 0, 0, 813, 917, 394, 820, ! 0, 753, 392, 445, 0, 393, 0, 445, 0, 0, ! 754, 791, 790, 595, 593, 592, 594, 0, 0, 508, ! 0, 0, 917, 201, 0, 745, 758, 747, 0, 917, ! 0, 0, 0, 771, 917, 780, 0, 789, 41, 150, ! 36, 150, 0, 37, 801, 0, 390, 391, 0, 0, ! 0, 389, 748, 494, 493, 91, 94, 810, 811, 807, ! 208, 0, 423, 0, 748, 917, 761, 0, 735, 817, ! 764, 0, 0, 0, 917, 776, 788, 42, 38, 0, ! 0, 755, 0, 492, 202, 445, 746, 759, 0, 0, ! 749, 818, 0, 816, 769, 773, 772, 802, 824, 824, ! 0, 490, 0, 489, 458, 213, 215, 199, 0, 0, ! 205, 0, 204, 748, 917, 0, 0, 825, 826, 0, ! 781, 488, 0, 735, 0, 762, 765, 770, 774, 0, ! 0, 0, 0, 0, 824, 0, 206, 214, 200, 0, ! 0, 829, 0, 784, 827, 0, 0, 782, 0, 0, ! 828, 0, 0, 0, 0, 0, 207, 766, 830, 786, ! 787, 0, 783, 917, 0, 767, 785, 0, 0, 0 }; ! static const short yydefgoto[] = { 1788, ! 452, 2, 453, 172, 796, 342, 188, 3, 4, 38, ! 142, 761, 387, 1567, 762, 890, 1568, 1569, 407, 1615, ! 766, 42, 43, 416, 44, 891, 773, 1089, 774, 775, ! 776, 46, 179, 180, 47, 471, 191, 187, 48, 49, ! 906, 1214, 912, 1216, 50, 893, 894, 192, 193, 472, ! 803, 1118, 1119, 717, 1120, 242, 51, 1102, 1101, 785, ! 782, 1288, 1287, 1046, 1043, 141, 1100, 52, 244, 53, ! 1040, 628, 343, 344, 345, 346, 620, 1730, 1646, 1732, ! 1682, 1769, 1430, 1708, 1744, 379, 1030, 347, 666, 989, ! 348, 380, 381, 350, 351, 370, 55, 263, 767, 434, ! 161, 56, 57, 352, 623, 353, 354, 355, 356, 473, ! 357, 1571, 531, 687, 358, 896, 486, 225, 487, 359, ! 226, 500, 227, 205, 218, 63, 514, 532, 1443, 859, ! 1348, 206, 219, 64, 542, 860, 65, 66, 757, 758, ! 759, 1496, 478, 952, 953, 1677, 1640, 1589, 1523, 67, ! 722, 372, 540, 1468, 1590, 1238, 718, 68, 69, 70, ! 71, 72, 250, 73, 74, 252, 877, 878, 879, 880, ! 898, 1201, 899, 900, 901, 1186, 1196, 1187, 1458, 1188, ! 1189, 1459, 1460, 719, 720, 721, 667, 1020, 361, 199, ! 512, 505, 208, 76, 77, 78, 149, 150, 164, 80, ! 137, 362, 363, 364, 82, 365, 84, 882, 128, 129, ! 130, 547, 110, 85, 383, 994, 995, 1015, 1010, 690, ! 1498, 1499, 1431, 1432, 1433, 806, 1500, 1319, 1575, 1600, ! 1685, 1649, 1650, 1501, 1576, 1673, 1601, 1686, 1602, 1710, ! 1603, 1713, 1760, 1784, 1604, 1734, 1695, 1735, 1655, 474, ! 804, 1427, 1577, 1618, 1700, 1493, 1494, 1536, 1643, 1684, ! 1594, 1578, 1691, 1621, 959, 1737, 1738, 1739, 1763, 491, ! 1016, 841, 1150, 1340, 493, 494, 495, 837, 496, 155, ! 839, 903, 93, 708, 846, 1342, 1343, 596, 88, 556, ! 89, 808 }; ! static const short yypact[] = { 133, ! 255,-32768,-32768, 6967,-32768, 51, 109, 73, 487, 259, ! 271,-32768,-32768, 1839,-32768, 254, 312, 320,-32768,-32768, ! -32768, 945, 825, 1743, 363,-32768,-32768, 382, 502,-32768, ! 1256, 1256,-32768, 4065,-32768, 6967, 374,-32768,-32768, 412, ! -32768, 62,-32768,-32768, 4769,-32768,-32768, 400, 749, 466, ! 500, 492,-32768,-32768,-32768,-32768, 347, 3740,-32768, 5156, ! -32768, 1608, 813,-32768, 536,-32768,-32768, 506, 693,-32768, ! 517,-32768,-32768, 556, 5264,-32768,-32768,-32768, 1071,-32768, ! -32768,-32768, 1748,-32768,-32768, 2257,-32768, 8489, 546,-32768, ! -32768, 11663, 638,-32768, 11663,-32768, 11663,-32768,-32768,-32768, ! 73, 487, 382, 596,-32768, 617, 492,-32768, 473,-32768, ! 297, 11755, 11755, 597,-32768,-32768,-32768,-32768,-32768, 186, ! 667, 504, 659, 691, 678, 684,-32768,-32768, 1063,-32768, ! 744, 73, 487,-32768, 382, 596,-32768, 965, 2557, 681, ! 7720, 666, 11663,-32768, 11663, 668, 6604, 2339,-32768,-32768, ! 1932, 3301, 2339,-32768, 1361, 4084, 4084, 4065, 679, 682, ! -32768, 347, 576, 698, 726,-32768,-32768, 764,-32768, 740, ! -32768, 3612,-32768,-32768, 363, 5009, 799,-32768,-32768,-32768, ! 400, 1994, 7932, 827, 851,-32768,-32768, 768, 536, 913, ! 88, 560, 867,-32768,-32768,-32768, 8681, 10161,-32768,-32768, ! 4126, 4126, 6986, 1071, 877,-32768,-32768, 683,-32768,-32768, ! 2268,-32768,-32768,-32768,-32768,-32768, 1608, 916,-32768, 536, ! 1071,-32768,-32768,-32768, 1987, 1608,-32768, 536,-32768, 1994, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 876,-32768, 492,-32768, 536, 1189, 1448,-32768,-32768, 517, ! -32768,-32768,-32768,-32768, 1404, 297,-32768, 797, 1913,-32768, ! 331,-32768,-32768,-32768,-32768,-32768, 4749,-32768, 596,-32768, ! -32768,-32768,-32768, 2872,-32768, 864, 872,-32768,-32768,-32768, ! -32768, 908,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 878,-32768,-32768, 1404, 5264, 1213, ! -32768, 917,-32768,-32768, 12492, 12584, 12676, 12676, 922,-32768, ! -32768,-32768,-32768,-32768, 943, 966, 977, 988, 993, 915, ! 11847, 1715, 12676,-32768,-32768, 12676,-32768,-32768, 12676, 8960, ! -32768, 12676, 1037, 1019,-32768, 12676,-32768, 11939,-32768, 5481, ! 431, 1584, 1402, 12031,-32768, 1079, 1379,-32768, 1015, 2889, ! 1549,-32768, 446,-32768, 2762, 4315, 1010, 1037, 1037, 11663, ! 7720, 514,-32768, 1715,-32768,-32768, 12124, 1031, 1070,-32768, ! 8213, 1040, 4342, 1048, 1056, 2368, 740,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 667, 504, 659, 1715, 691, ! 678, 1091, 684,-32768, 1120,-32768, 443, 73, 487,-32768, ! -32768,-32768,-32768,-32768,-32768, 4532,-32768, 1994, 6699, 1092, ! -32768,-32768, 1037, 874, 11663,-32768,-32768, 3546,-32768, 1125, ! 1130,-32768,-32768,-32768, 2339,-32768,-32768, 2339,-32768, 1068, ! -32768,-32768,-32768, 576, 576, 576,-32768,-32768,-32768, 4749, ! 89, 1089, 1097,-32768,-32768,-32768,-32768, 7720,-32768, 999, ! 1032,-32768,-32768, 764,-32768, 536,-32768,-32768,-32768,-32768, ! 221,-32768,-32768,-32768,-32768, 9517, 12124,-32768,-32768, 1100, ! -32768, 1070, 1106, 8213, 586, 2620, 7932, 2620, 2194, 3938, ! 1111,-32768, 399, 5720, 1157, 1165, 917,-32768, 1129, 520, ! 208, 7288, 6129,-32768,-32768, 6129,-32768, 6260, 6260, 6986, ! 7317, 1133,-32768, 536, 1994,-32768, 10253,-32768,-32768, 6318, ! 1987, 1608, 1994,-32768, 536,-32768,-32768, 536, 1987,-32768, ! 1219,-32768, 11663, 876,-32768,-32768, 1189,-32768, 1657, 4613, ! 1404, 536,-32768,-32768, 1174, 1175, 1200, 1181,-32768,-32768, ! -32768,-32768, 879,-32768, 544,-32768, 1151,-32768, 1152,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1404, ! -32768,-32768, 369,-32768, 1131,-32768, 11663, 12124, 8960,-32768, ! 8960,-32768,-32768,-32768, 12124, 11755, 5853, 5853, 5853, 5853, ! 5481,-32768,-32768,-32768,-32768, 1158, 12216, 12216, 8960, 1160, ! 141, 1179,-32768, 1180,-32768,-32768,-32768, 1287, 11663,-32768, ! 9052, 8960,-32768, 11847, 11847, 9609, 11847, 11847, 11847, 11847, ! 11847, 11847, 11847, 11847, 11847, 11847, 11847, 11847, 11847, 11847, ! 11847, 11847, 11847, 11847,-32768, 12124,-32768,-32768,-32768,-32768, ! -32768, 12124, 12124, 12124, 11755, 5371, 888, 940, 10345,-32768, ! -32768,-32768, 1241, 1913, 1289, 589, 601, 634, 3043, 1131, ! -32768, 2391, 2391, 3079, 10437, 1208, 1255,-32768,-32768, 721, ! 10923, 195,-32768, 959, 297,-32768,-32768, 12124,-32768,-32768, ! 382,-32768,-32768,-32768, 267, 546, 12124, 1243,-32768,-32768, ! 1037,-32768, 1994, 2475,-32768,-32768, 1244,-32768, 1197, 1248, ! -32768, 514, 1091, 12768,-32768, 9885, 9977, 12124, 12124, 9609, ! 12124, 12124, 12124, 12124, 12124, 12124, 12124, 12124, 12124, 12124, ! 12124, 12124, 12124, 12124, 12124, 12124, 12124, 12124, 12124,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 214,-32768, 1226, 1203, ! 740, 443, 1267, 11663,-32768, 1262,-32768,-32768, 2557, 1422, ! 1257, 1297, 273, 1271, 1273,-32768,-32768, 3176, 506,-32768, ! 1274,-32768,-32768,-32768,-32768,-32768,-32768, 1037,-32768,-32768, ! 1233, 1247,-32768, 1291,-32768,-32768, 400,-32768,-32768,-32768, ! -32768, 100, 585, 1304,-32768,-32768,-32768, 1301,-32768, 8865, ! 12768,-32768, 1260,-32768,-32768,-32768,-32768,-32768, 1023, 1023, ! 4872,-32768,-32768,-32768,-32768, 2268, 2257,-32768, 11016,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 1165, 1308,-32768, ! -32768,-32768, 11295, 1255, 660,-32768,-32768,-32768,-32768, 6129, ! 6129, 6861, 6861, 7317, 959,-32768,-32768, 6318,-32768, 1310, ! -32768,-32768, 1266, 208,-32768, 1987,-32768,-32768, 536, 1302, ! -32768, 504, 659,-32768,-32768, 684, 1320,-32768,-32768, 211, ! -32768,-32768, 1725,-32768, 958, 1385,-32768, 12124, 6448,-32768, ! 6448, 198, 198, 366, 665, 1973, 6868, 81, 5253,-32768, ! 299, 198,-32768,-32768, 208, 4933, 11663, 11663,-32768, 11663, ! 208, 4933,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 800, 800, 800, 1235,-32768, 1037, 1282, 1288, 1292, 12723, ! 1293, 1296, 1323, 3844, 1345, 1347, 1352,-32768, 1322,-32768, ! -32768, 1324,-32768,-32768, 1371, 610, 846, 54, 173, 12124, ! 1378,-32768, 1388, 1349, 5481, 5481,-32768,-32768, 1401, 5151, ! 7548, 3429, 7188, 6340, 3640, 2923, 1618, 1618, 1807, 1807, ! 1191, 1191, 991, 991, 991,-32768,-32768, 1359, 1362, 1366, ! 1375, 1377, 1380, 5853, 888,-32768, 9517, 12124,-32768,-32768, ! -32768, 12124,-32768,-32768, 1393, 12676, 1383, 1400, 1415, 1449, ! -32768, 12124,-32768, 12124,-32768, 12124, 2721, 2740,-32768,-32768, ! 2740,-32768, 105, 2721, 1390, 1392,-32768, 1396, 5853, 208, ! -32768, 208, 3836,-32768, 4933, 10529, 11109, 11109, 8116, 1403, ! 11939, 1405, 1898, 4485, 4342, 1551, 1407, 1408,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 12124,-32768, 1715,-32768, ! 1411,-32768, 12768,-32768, 12768, 12768, 12768, 1446, 8004, 12785, ! 7570, 10552, 5360, 5623, 4211, 2908, 2908, 2908, 2458, 2458, ! 1683, 1683, 1022, 1022, 1022,-32768,-32768, 2368, 1417, 12308, ! -32768, 1423, 1470,-32768, 1037,-32768,-32768,-32768,-32768,-32768, ! -32768, 2545, 4532,-32768, 5853, 11663,-32768, 1338, 11847,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 400, ! -32768,-32768, 667,-32768, 691, 678, 12124, 1473,-32768, 671, ! 676, 746,-32768,-32768,-32768,-32768, 92,-32768, 1999, 1277, ! 1277, 2587, 2587, 4872, 3959, 138, 2268,-32768, 3291, 4607, ! 11202, 11202, 8585, 476, 1426, 482, 398,-32768, 9517, 9147, ! -32768, 5853, 2157, 2157, 2358,-32768,-32768,-32768, 1474,-32768, ! -32768,-32768,-32768,-32768,-32768, 1489,-32768, 4933, 12768,-32768, ! 2069,-32768, 536, 536,-32768,-32768,-32768,-32768,-32768, 4933, ! 178, 910, 12124, 1219,-32768, 1478,-32768,-32768,-32768, 107, ! 213, 1748, 3301, 294, 198, 1480,-32768, 439, 1482, 536, ! 6148,-32768,-32768,-32768, 536,-32768, 1433, 1037, 1037, 1037, ! -32768, 1441, 208, 4933, 208, 4933,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 5853,-32768,-32768, 1465, 1466, ! 1471, 1476, 1233,-32768, 7358, 9517, 9241, 1454,-32768, 11847, ! -32768,-32768,-32768,-32768,-32768, 244, 1458,-32768,-32768, 1459, ! 209, 541, 541, 1460, 541, 12124,-32768, 12676, 1565, 11663, ! -32768, 1469, 1481, 1492,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768, 208, 1496,-32768, 1475, 1898,-32768,-32768, ! 3392, 3392, 5444,-32768,-32768,-32768,-32768,-32768,-32768, 12768, ! -32768,-32768, 12124,-32768,-32768, 327, 1503,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 5481,-32768,-32768,-32768, 1504,-32768, ! 737,-32768, 12124,-32768, 12124,-32768, 12124,-32768, 117, 9333, ! -32768, 3959, 1277, 1277, 3485, 3485, 5838,-32768, 569, 3291, ! 1505, 251, 581, 677, 688, 235,-32768,-32768,-32768,-32768, ! -32768,-32768, 358, 3384, 3384, 338, 338, 9517,-32768,-32768, ! 1657,-32768,-32768,-32768, 208, 1511,-32768, 1519, 1519, 208, ! 1514, 12124, 12124, 7764, 536, 6758, 536, 536, 4994, 536, ! 7223,-32768,-32768, 7499, 1519,-32768,-32768, 1536,-32768,-32768, ! -32768, 1516,-32768, 1517, 1525, 12124, 12124, 12124, 12124, 9517, ! -32768, 1534,-32768,-32768, 5481, 12124,-32768, 244,-32768,-32768, ! -32768,-32768,-32768,-32768, 1523,-32768, 1588, 1037,-32768,-32768, ! -32768, 208,-32768,-32768,-32768,-32768,-32768, 12768, 12124,-32768, ! -32768,-32768,-32768, 1528, 1533, 1537, 1552, 1715,-32768,-32768, ! 8419, 1617,-32768,-32768, 4470, 4470, 959, 4575, 704, 5853, ! -32768,-32768, 9517,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 7764, 7764,-32768, 1519, 480, 911, 12124,-32768,-32768,-32768, ! 1219, 1219, 1519, 1519, 879, 1519,-32768,-32768,-32768, 208, ! 208,-32768,-32768,-32768, 1542, 1544, 1547, 1548,-32768, 9517, ! 1546,-32768,-32768,-32768,-32768,-32768, 208, 1550,-32768,-32768, ! -32768,-32768, 1552,-32768,-32768, 1085, 383, 4404,-32768,-32768, ! -32768, 10639,-32768, 4687, 4687, 5572, 3310,-32768,-32768, 208, ! 208,-32768,-32768,-32768, 12124, 12124, 7764, 536, 536,-32768, ! -32768,-32768, 8309,-32768,-32768, 208, 208,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 1571,-32768, 1715,-32768,-32768, ! -32768, 390,-32768,-32768,-32768, 1604, 1020, 1150,-32768,-32768, ! -32768,-32768,-32768, 12124, 1607, 1613, 1629, 11387, 652, 1715, ! 1003, 686,-32768,-32768, 11479, 1684,-32768,-32768,-32768, 1630, ! -32768, 4145, 7089, 6008, 1698,-32768,-32768, 1611, 3310,-32768, ! -32768, 7764, 7764,-32768, 1519, 1519,-32768, 10069,-32768,-32768, ! -32768,-32768, 5776,-32768,-32768,-32768,-32768,-32768,-32768, 771, ! 771, 1663, 1631, 1632, 6486,-32768,-32768,-32768,-32768, 1662, ! 12124, 1671, 1668, 1681, 1791, 2098,-32768,-32768,-32768,-32768, ! 1643,-32768,-32768, 1219, 1101,-32768, 1119, 1219, 11571, 1123, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 1636, 7964, 1646, ! 1647, 1649,-32768,-32768, 11755,-32768,-32768,-32768, 1722,-32768, ! 8773, 11755, 12124,-32768,-32768,-32768, 1701,-32768,-32768, 1705, ! -32768, 1681, 1791,-32768,-32768, 764,-32768,-32768, 12400, 12400, ! 9425,-32768, 1663,-32768,-32768, 466, 400,-32768,-32768,-32768, ! -32768, 1670, 718, 1994, 1663,-32768,-32768, 10829, 117,-32768, ! -32768, 1727, 1682, 12746,-32768,-32768,-32768,-32768,-32768, 1552, ! 99,-32768, 128,-32768,-32768, 1219,-32768,-32768, 10734, 785, ! -32768,-32768, 9701,-32768,-32768,-32768,-32768, 1552, 1766, 1766, ! 1730,-32768, 221,-32768, 536,-32768,-32768,-32768, 12124, 1731, ! -32768, 1738,-32768, 1663,-32768, 1710, 341, 1744,-32768, 175, ! -32768,-32768, 1742, 117, 1700,-32768,-32768,-32768,-32768, 12124, ! 764, 1754, 1766, 764, 1766, 1760,-32768,-32768,-32768, 9793, ! 1717, 1079, 411,-32768,-32768, 414, 485,-32768, 9517, 1718, ! -32768, 764, 1762, 1769, 764, 1771,-32768,-32768, 1079,-32768, ! -32768, 419,-32768,-32768, 1775,-32768,-32768, 1810, 1828,-32768 }; static const short yypgoto[] = {-32768, ! 1845,-32768, -345, 1675, -375, 34, -2, 1837,-32768, 1818, ! -32768,-32768,-32768, 328,-32768, 381,-32768, 547,-32768, 242, ! 1098, 58, -400,-32768,-32768, 69,-32768, -724,-32768,-32768, ! 766, 45, 1685, 1406, 1697, -791, 190, -173, 24, -43, ! -32768,-32768,-32768,-32768,-32768, 974,-32768,-32768,-32768,-32768, ! -32768,-32768, 563, 792,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 1780, -749, 7330, 1634, -48, ! -665, -267, -44, 1736, -589,-32768, 519,-32768, 282,-32768, ! -1501,-32768, -1582, 101,-32768, 2763, 2162, -268,-32768, -976, ! 6167, 3688, 6508, 2423, 4974, 1589, -323, -66, -77, 1877, ! -152, -65, 111,-32768,-32768,-32768, -354,-32768, -148,-32768, ! -32768, -1438, 66, -353, 1699, 23, 1, -139, 29, 90, ! -216, -4, -159, -179, -177, 7, 157, 371,-32768, -387, ! -32768,-32768,-32768,-32768,-32768, 508, 1326, 1694,-32768, 817, ! -32768,-32768, -1178, -360, 1099,-32768,-32768,-32768,-32768, 279, ! -32768,-32768,-32768,-32768,-32768,-32768, 1190, -388,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 1673,-32768, 561, 747,-32768, ! -32768,-32768, 719, -814,-32768,-32768,-32768,-32768,-32768,-32768, ! 1024,-32768, 553, 1204,-32768, 882, 1268, 5346, 18, 1720, ! 967, 183,-32768, -524,-32768, 9, 1427, 685, -132, 313, ! -109, 5538, 1575,-32768, 6564, 3703, 2463, -19, -110,-32768, ! 1812, -72,-32768, 5459, 2430, -167,-32768, 2846, 1850,-32768, ! -32768, 450,-32768,-32768, 518, 226, -407,-32768,-32768,-32768, ! -32768, -1348,-32768, -1402, -810,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 248, ! -32768,-32768,-32768,-32768,-32768, 252, -1411,-32768,-32768, -57, ! -32768,-32768,-32768,-32768, -720, -1597,-32768, 201, -849, -781, ! -183, 1126,-32768,-32768,-32768,-32768, -397,-32768, -390, -207, ! -32768, 79,-32768,-32768, 608, 521,-32768, 306,-32768, 3970, ! -201, -1355 }; ! #define YYLAST 12871 ! static const short yytable[] = { 62, ! 522, 37, 460, 127, 59, 461, 692, 459, 1248, 1058, ! 448, 703, 1123, 492, 881, 772, 216, 264, 780, 451, ! 406, 75, 108, 436, 439, 781, 58, 779, 703, 414, ! 310, 62, 60, 37, 261, 1103, 59, 36, 541, 944, ! 62, 760, 702, 539, 1041, 59, 600, 602, 148, 153, ! 368, 184, 369, 75, 1097, 217, 405, 548, 58, 702, ! 412, 413, 75, 807, 60, 527, 530, 182, 181, 36, ! 255, 411, 45, 183, 1170, 1502, 1172, 521, 176, 633, ! 797, 1537, 87, 308, 1202, 264, 529, 360, 468, 178, ! 360, 590, 360, 61, 271, 1545, 780, 417, 423, 671, ! 709, 710, 177, 838, 45, 309, 1712, 360, 360, 671, ! 671, -867, 90, 45, 87, 812, 816, -149, 1199, 375, ! 1104, 170, 1740, 204, 1207, 61, 1619, 94, 1722, 143, ! 1212, -395, -1, 15, 61, 692, 420, 868, 360, 216, ! 360, 59, 1502, 590, 162, 264, 844, -386, 95, 1428, ! 1693, 469, 1320, 1719, 904, 786, 787, 1767, 75, 171, ! 91, 1758, 1720, 418, 706, 817, -395, 62, 818, 419, ! -395, 62, 59, 435, 438, 1633, 59, 307, 217, 1447, ! 1448, 706, 184, 470, 92, -627, 422, -386, 655, 75, ! 1200, 469, 489, 75, 58, 456, 1469, 794, 182, 181, ! 60, 1321, -395, -606, 183, 189, -606, 1721, 1111, 176, ! 45, 1733, 1690, 943, 490, 942, 551, 1164, 503, 506, ! 178, 805, 1502, 470, 15, 555, 1429, 144, -445, 1754, ! 61, -627, -627, 177, 656, 257, -150, -396, 1755, 15, ! 207, 1362, 1021, 1275, 45, 388, -627, 204, 1165, -324, ! 87, 389, 1696, 425, -2, -606, 681, -606, -606, -445, ! -606, 61, -333, -445, 271, 61, 162, 162, 162, 1397, ! 845, -606, -396, -606, 1078, 1514, -396, -333, 1121, 677, ! -917, -333, -309, 1756, 1520, 1521, 488, 1522, -606, -606, ! 676, 986, 1717, 1286, 1688, 668, 1289, 768, -333, 1502, ! 8, 9, 843, -606, 255, 320, 1537, -445, -396, 987, ! 311, -333, -333, 162, -333, 802, -333, 1400, -125, 99, ! 15, 26, 1079, 185, 1702, 711, 763, 712, -309, -309, ! 1709, 39, 1749, 1093, 98, 360, 1707, 988, 1396, 1502, ! 229, 8, 9, -309, -333, -333, 165, 112, 308, 1094, ! 703, 1306, 1307, -125, 135, 136, 255, -125, 448, -333, ! 1203, 527, 530, 39, 207, 360, 714, 1301, 18, 527, ! 309, 59, 132, 133, 271, 436, 439, 525, 549, 1502, ! 788, 530, 866, 1092, 40, 1748, 1356, 1419, 75, -125, ! 1175, 271, 26, 713, 196, 135, 136, 1124, 1361, 419, ! 1333, 8, 9, 10, 1751, 113, 1636, 1637, 1204, 1344, ! 832, 778, 207, 114, 217, 1082, 40, 374, 1440, 1345, ! 360, 1482, 1109, 1110, 550, 1176, 135, 136, 1709, 1177, ! 530, 1346, 1382, 490, 1384, 1420, 320, 700, 140, 21, ! 197, 198, 307, 1042, 1540, 268, 408, 409, 10, 1752, ! 260, 1540, 26, 62, 185, 28, 269, 143, 59, 833, ! 61, 1178, 834, -123, 184, 15, 1441, 168, 165, 165, ! 165, 1772, 548, 169, 1772, 75, 8, 9, 655, 1772, ! 182, 799, 217, 783, 21, 255, 183, 33, 870, 778, ! 190, 895, 1541, 697, 1350, 229, 892, 26, -123, 1596, ! 28, 269, -123, 229, 229, 488, 1304, 186, 100, 101, ! 102, 490, 233, 234, 235, 165, 100, 115, 116, 1773, ! 1105, 374, 1774, -331, 656, 850, 851, 1785, 360, -652, ! 135, 136, 33, 229, -123, 62, 18, 1416, 1417, 698, ! 59, 96, 236, 1515, 132, 133, 195, 61, 1775, 551, ! 41, 822, 926, 828, 830, 425, 144, 75, 391, 1202, ! 26, 194, 97, 103, 104, 237, 18, 681, 897, -331, ! -331, 117, 118, 889, 716, -652, -652, 145, 268, 95, ! 251, 10, 41, 488, -324, 1112, 229, 1113, 872, 873, ! -652, 915, 360, 1776, 360, 26, 360, 816, 135, 136, ! 207, 360, 934, 934, 934, 934, 18, 475, 668, 238, ! 239, 240, 990, 843, 360, 253, -626, 21, 162, 162, ! 162, 311, 991, 1108, 360, 476, 1249, 360, -310, 61, ! 378, 384, 1114, 442, 443, 992, 1001, 916, 229, 26, ! 367, 881, 1115, 1116, -133, -133, 817, 444, 1003, 818, ! 144, -861, 768, 477, 100, 115, 116, 445, 1222, 1088, ! 360, 308, -626, -626, 94, 33, 1161, 1162, 207, 446, ! 207, 207, 1166, -147, -310, -310, 373, -626, 1117, 778, ! 703, 1005, 1002, 309, 847, 95, 489, 869, 79, -310, ! 386, 1087, 772, 847, 1004, 780, 465, 207, 229, 1008, ! 1011, 490, 781, 271, 779, 207, 527, 1151, 490, 117, ! 118, 702, 1179, 392, 175, 1318, 499, 590, 1312, 1085, ! 79, 390, 492, 1314, -308, 223, 224, 1006, 492, 79, ! 196, 14, 394, 1611, 97, -653, 185, 1112, 395, 1113, ! 872, 873, 209, 425, 221, 393, 121, 122, 123, 1617, ! 127, -333, 248, 1152, 20, 307, 249, 415, 1180, 360, ! 264, 143, 633, 23, 1313, 681, 143, 229, 1024, 1315, ! -308, -308, 406, 488, 314, 15, 197, 517, 1044, -445, ! 488, -653, -653, 1122, 1114, -308, 1121, -324, 1337, 1339, ! 441, 26, 703, 1316, 1115, 1116, -653, -333, -333, 229, ! 229, 124, 125, 132, 133, 106, 449, 229, 551, -445, ! -445, 843, -327, 120, 1025, 1026, 778, 1300, 1644, 229, ! 165, 165, 165, 1334, 489, 421, 881, 121, 122, 123, ! 1117, 426, 1728, 706, -647, 271, 1130, 1131, 490, 1317, ! 895, 492, 895, 830, 543, 892, 490, 892, 895, -7, ! 895, 96, 1184, 1194, 26, 892, 79, 135, 136, 241, ! 79, 464, 1208, 1209, 1645, 1210, 209, 221, 229, 1153, ! 1154, 591, 97, 230, 231, 1391, 1393, 1711, 1729, 26, ! 448, 592, 124, 125, 62, 861, 62, 230, 462, 59, ! 544, 59, 217, 867, 62, 207, 171, 844, 1727, 59, ! 96, 778, 360, 360, 1766, 360, 75, 778, 75, -148, ! 488, 1723, 463, 1171, 209, 467, 75, 897, 488, 897, ! 402, 97, 889, 490, 889, 1782, 913, 897, 479, 490, ! 1692, 162, 889, 96, 629, 986, 1308, 515, 516, 162, ! 1377, 1378, 1379, 132, 133, 1336, 432, 100, 115, 116, ! 626, 533, 627, 987, 97, 1351, 1352, 1353, 557, 1393, ! 207, 1185, 8, 9, 94, 94, 559, 268, 408, 409, ! 10, 565, 914, 1363, 1516, -189, 523, 524, 61, 934, ! 61, 988, 448, 1251, 492, 95, 95, 1442, 61, 588, ! 143, -189, 229, -189, 26, 488, 492, 135, 136, 436, ! 439, 488, 117, 118, 119, 1167, 21, 374, 436, 439, ! 598, 990, 96, 259, 934, 605, 135, 136, 132, 133, ! 778, 991, 28, 269, 489, 146, 8, 9, 10, 1479, ! 492, 13, 492, 97, 992, 863, 606, 534, 536, 1770, ! 260, 607, 490, 271, 1008, 1011, 490, 134, 1173, 1174, ! 546, 1168, 608, 18, 33, 715, 229, 26, 1205, 515, ! 800, 1614, 681, 609, 21, 396, 397, 398, 610, 26, ! 681, 264, 135, 136, 94, 653, 654, 26, 1190, 629, ! 28, 29, 1509, 1598, 1401, 1402, 682, 1404, 778, 671, ! 934, 360, 523, 801, 819, 95, 683, 15, 222, 223, ! 224, -445, 209, 707, 820, 14, 748, 749, 684, 685, ! 490, 399, 33, 626, 488, 627, 821, 685, 488, 1532, ! 400, 401, 18, 612, 931, 448, 264, 1184, 20, 778, ! 726, -445, -445, 165, 132, 133, -445, 23, 489, 725, ! 1485, 165, 79, 261, 229, 1538, 1539, 934, 750, 1323, ! 1324, 490, 895, 784, 958, 271, 751, 892, 1323, 1324, ! 490, 515, 1667, 778, 752, 723, 764, 504, 507, 448, ! 209, 825, 209, 209, 765, 778, 791, 756, 836, 523, ! 1668, 980, 488, 515, 1672, 490, 426, 997, 135, 136, ! 723, 100, 101, 102, 1648, 780, 62, 490, -6, 209, ! 95, 59, 1642, 1018, 96, 97, 795, 209, 814, 778, ! 1665, 778, 229, 1599, 815, 1408, 132, 133, 75, 831, ! 844, 934, -860, 488, 902, 97, 1219, 1220, 1221, 897, ! 840, 490, 488, 490, 889, 1680, 1185, 374, 132, 133, ! 842, 857, 162, 162, 162, 15, 103, 104, 958, 907, ! 908, 162, 162, 162, 909, 360, 910, 488, 146, 132, ! 133, 10, 917, 918, 13, 1648, 938, 26, 940, 488, ! 135, 136, 650, 651, 652, 653, 654, 1648, 778, 146, ! 8, 9, 10, 374, 591, 254, 18, 941, 943, -866, ! 61, 1122, 135, 136, 592, 998, 1000, 21, 1008, 1011, ! 490, 1019, 1021, 488, 1039, 488, 1048, 18, 1049, 1047, ! 26, 847, 1081, 28, 29, 807, 554, 847, 21, 1080, ! 555, 1084, 778, 1086, 681, 895, 1648, 31, 871, 844, ! 892, 26, 1091, 20, 28, 29, 1095, 32, 1096, 1099, ! 1365, -327, 1435, 1436, 490, 33, 1367, 1368, 819, 34, ! 1365, 1370, 1107, 1190, 1368, 1106, 147, 147, 820, 163, ! 1125, 1153, 1154, 100, 430, 431, 33, 469, 1128, 62, ! 821, 685, 488, 1149, 59, 1156, 1159, 1157, 1160, 672, ! 1163, 268, 408, 409, 10, 220, 673, 228, 132, 133, ! 1223, 75, 1625, 245, 1630, 1627, 1224, 209, -56, 1229, ! 1225, 1227, 897, -56, 1228, 8, 9, 889, 1777, 12, ! 13, 223, 224, 533, -56, 14, 488, 14, 103, 118, ! 21, 1230, 951, 1231, 396, 397, 398, 674, 1232, 16, ! 1233, 17, 1234, 26, -146, 934, 28, 269, 20, 26, ! 20, 1236, 135, 136, 165, 165, 165, 23, 1237, 23, ! 100, 101, 102, 165, 165, 165, 26, 1239, 154, 135, ! 136, 664, 209, 61, 1240, 999, 590, 1241, 675, 848, ! 1242, 1158, 849, 147, 504, 507, 26, 1243, 147, 400, ! 401, 163, 163, 163, 1244, 1245, 865, 1256, 1246, 1259, ! 1260, 121, 872, 873, 1258, 665, 1261, 1574, 1268, 1566, ! 1269, 778, 59, 1704, 847, 103, 104, 1270, 220, 1293, ! 1254, 1279, 1206, 1280, 466, 1284, 1285, 1701, 1211, 75, ! 1292, 1435, 1436, 490, 1572, 1295, 502, 502, 511, 847, ! 1573, 1299, 1298, 1311, 1332, 1565, 436, 439, 1366, 1349, ! 1371, 1376, 228, 26, 1277, 1372, 124, 125, 1461, 1380, ! 528, 228, 8, 9, 8, 9, 12, 254, 1386, 1387, ! 1574, 1090, 14, 1394, 1388, 59, 1398, 1399, 217, 1389, ! 1098, 1403, 1407, 902, 427, 902, 16, 1409, 17, 429, ! 1191, 1198, 75, 902, 476, 20, 1415, 1572, 778, 1410, ! -691, 61, 147, 1573, 23, 488, 681, 1480, 1565, 374, ! 1411, 951, 1762, 26, 1414, 1762, 135, 136, 135, 136, ! 490, 1421, 1422, 1439, 222, 223, 224, 1518, 1519, 1446, ! 682, 14, 1450, 1779, 1472, 1473, 1762, 1271, 154, 1272, ! 683, 657, 554, 1474, 1483, 1484, 1489, 1624, 18, 1624, ! 1683, 1490, 684, 685, 20, 1491, 1574, 1683, 1492, 1428, ! 1528, 59, 1529, 23, 61, 1530, 1531, 1533, 1535, 121, ! 872, 873, 309, 874, 1593, 163, 360, 1597, 75, 309, ! 1606, 658, 659, 1572, 1607, 660, 661, 662, 663, 1573, ! 1358, 1359, 488, 1574, 1565, 1566, 850, 851, 59, 847, ! 1608, 1622, 1620, 552, 875, 646, 647, 648, 649, 650, ! 651, 652, 653, 654, 1574, 75, 1566, 1373, 1683, 59, ! 1572, 26, 1375, 1631, 124, 125, 1573, 100, 115, 116, ! 1632, 1565, -917, 1656, 1651, 1652, 75, 121, 872, 873, ! 309, 1572, 1658, 389, 307, 1659, 1666, 1573, 1687, 162, ! 61, 307, 1565, 1674, 220, 228, 132, 133, 1676, 1706, ! 146, 8, 258, 10, 207, 1678, 207, 1679, 232, 1698, ! 147, 847, 1697, 147, 745, 746, 747, 748, 749, 163, ! 163, 163, 117, 118, 1405, 147, 1736, 61, 1705, 162, ! 162, 162, 124, 125, 525, 504, 507, 134, 1714, 21, ! 1715, 1741, 1746, 100, 115, 116, 259, 26, 61, 1747, ! 135, 136, 307, 1750, 1753, 28, 29, 1757, 1759, 1789, ! 382, 385, 220, 426, 228, 1764, 848, 849, 504, 507, ! 1381, 1768, 1383, 1780, 865, 1771, 1778, 1790, 502, 260, ! 1781, 502, 1783, 511, 511, 511, 1787, 33, 5, 466, ! 232, 100, 101, 102, 1, 502, 528, 228, 117, 1660, ! 466, 458, 229, 167, 528, 1191, 232, 1663, 1302, 1083, ! 457, 789, 1725, 798, 790, 1703, 207, 466, 455, 756, ! 1195, 1453, 1454, 1423, 1463, 1464, 793, 1466, 371, 535, ! 424, 1413, 1647, 1090, 1786, 902, 648, 649, 650, 651, ! 652, 653, 654, 26, 1294, 485, 103, 104, 105, 597, ! 268, 132, 133, 10, 1475, 1476, 1477, 1478, 1127, 1050, ! 160, 1444, 1354, 232, 1481, 100, 115, 116, 545, 1374, ! 1197, 232, 538, 1467, 163, 1051, 163, 518, 18, 427, ! 1291, 678, 429, 985, 146, 132, 133, 10, 232, 21, ! 404, 165, 163, 163, 163, 681, 552, 1544, 1742, 1503, ! 1724, 1718, 26, 1765, 21, 28, 269, 163, 1512, 1513, ! 1508, 229, 1445, 1148, 0, 0, 0, 1449, 0, 1281, ! 117, 118, 0, 21, 0, 1181, 1182, 9, 10, 1282, ! 259, 165, 165, 165, 0, 0, 0, 33, 0, 28, ! 29, 1283, 685, 526, 223, 224, 146, 8, 9, 10, ! 14, 146, 8, 9, 10, 0, 0, 1007, 1007, 1014, ! 0, 0, 0, 260, 21, 0, 1033, 18, 0, 1486, ! 1570, 33, 0, 20, 1584, 1585, 1586, 26, 1392, 18, ! 28, 29, 23, 437, 440, 21, 1183, 0, 624, 228, ! 21, 0, 0, 0, 201, 0, 681, 0, 26, 0, ! 1462, 28, 29, 26, 202, 1462, 28, 29, 902, 0, ! 0, 0, 33, 0, 0, 201, 203, 0, 0, 0, ! 819, 1181, 1182, 9, 10, 202, 1610, 1524, 1525, 160, ! 820, 0, 0, 33, 0, 0, 0, 203, 33, 1634, ! 1635, 0, 821, 685, 1534, 0, 848, 849, 504, 507, ! 100, 115, 116, 228, 245, 865, 0, 504, 507, 0, ! 21, 1392, 0, 0, 777, 0, 0, 1580, 1581, 848, ! 849, 865, 0, 26, 0, 0, 28, 29, 0, 1657, ! 1357, 0, 1183, 1591, 1592, 0, 0, 0, 0, 0, ! 201, 0, 0, 0, 1129, 1129, 1135, 0, 0, 0, ! 202, 0, 0, 0, 1135, 117, 1662, 0, 33, 232, ! 8, 9, 203, 1681, 0, 254, 0, 0, 163, 958, ! 1681, 0, 0, 0, 0, 502, 502, 511, 511, 511, ! 0, 0, 0, 502, 0, 0, 0, 18, 0, 0, ! 0, 528, 777, 0, 466, 232, 146, 8, 9, 10, ! 222, 223, 224, 0, 232, 0, 1570, 14, 689, 693, ! 696, 26, 0, 0, 135, 136, 622, 0, 0, 1495, ! 0, 232, 220, 0, 18, 0, 0, 1570, 1344, 0, ! 20, 1681, 1743, 0, 0, 21, 0, 0, 1345, 23, ! 0, 681, 0, 0, 0, 0, 154, 1745, 26, 0, ! 1346, 28, 29, 0, 0, 0, 209, 1628, 209, 268, ! 8, 9, 10, 0, 0, 819, 0, 0, 1761, 0, ! 146, 8, 9, 10, 0, 820, 789, 790, 958, 0, ! 0, 0, 0, 33, 793, 0, 0, 829, 685, 848, ! 849, 504, 507, 0, 0, 0, 865, 928, 21, 929, ! 0, 0, 0, 0, 932, 933, 935, 936, 937, 21, ! 504, 507, 0, 0, 28, 269, 259, 624, 0, 0, ! 0, 437, 792, 0, 0, 28, 29, 0, 0, 1595, ! 954, 0, 0, 1007, 0, 824, 1007, 689, 693, 696, ! 0, 146, 132, 133, 10, 0, 33, 254, 1007, 260, ! 1612, 1613, 1278, 1278, 1033, 0, 0, 33, 483, 0, ! 0, 8, 9, 983, 0, 0, 551, 0, 209, 18, ! 100, 115, 116, 0, 753, 754, 755, 0, 0, 0, ! 21, 0, 1013, 0, 0, 437, 440, 0, 18, 1013, ! 0, 0, 0, 26, 132, 133, 28, 29, 0, 13, ! 0, 848, 849, 0, 865, 0, 1661, 1664, 0, 0, ! 31, 0, 26, 0, 0, 135, 136, 245, 0, 0, ! 32, 18, 0, 0, 0, 117, 118, 0, 33, 1344, ! 0, 0, 34, 86, 0, 0, 0, 0, 681, 1345, ! 0, 0, 0, 111, 0, 26, 0, 0, 135, 136, ! 0, 1346, 131, 139, 1699, 1129, 1129, 1322, 1322, 1135, ! 152, 152, 682, 152, 1129, 86, 1322, 1322, 1135, 0, ! 504, 507, 683, 0, 86, 622, 0, 622, 1347, 1347, ! 1347, 222, 223, 224, 684, 685, 0, 152, 14, 86, ! 0, 0, 0, 0, 437, 939, 0, 247, 466, 466, ! 0, 0, 0, 0, 256, 18, 0, 0, 622, 0, ! 0, 20, 0, 0, 0, 0, 0, 256, 0, 1013, ! 23, 366, 0, 0, 366, 466, 366, 1013, 0, 0, ! 466, 0, 0, 0, 0, 0, 1045, 743, 744, 745, ! 746, 747, 748, 749, 0, 266, 0, 100, 115, 116, ! 0, 233, 234, 235, 0, 0, 427, 429, 0, 268, ! 408, 409, 10, 0, 0, 552, 0, 1032, 0, 0, ! 86, 266, 366, 0, 366, 18, 152, 152, 0, 0, ! 0, 236, 152, 0, 0, 152, 152, 152, 0, 146, ! 8, 9, 10, 0, 0, 13, 0, 0, 21, 0, ! 266, 86, 117, 118, 485, 86, 1278, 1278, 1033, 0, ! 485, 152, 86, 266, 28, 269, 0, 18, 0, 0, ! 0, 0, 146, 8, 9, 10, 0, 693, 21, 0, ! 152, 152, 152, 0, 681, 504, 507, 0, 813, 0, ! 0, 26, 0, 0, 28, 29, 33, 0, 1129, 1129, ! 1322, 1322, 1135, 0, 0, 1129, 0, 0, 1132, 152, ! 0, 21, 0, 0, 0, 0, 0, 681, 1133, 1347, ! 1347, 1347, 0, 266, 26, 0, 33, 28, 29, 0, ! 1134, 685, 1247, 0, 0, 0, 0, 0, 0, 466, ! 466, 819, 466, 466, 0, 466, 152, 160, 0, 0, ! 232, 820, 0, 0, 0, 1145, 0, 232, 266, 33, ! 0, 0, 0, 821, 685, 0, 0, 954, 0, 1032, ! 0, 0, 0, 485, 132, 133, 232, 1013, 0, 437, ! 792, 0, 0, 0, 0, 0, 266, 0, 256, 595, ! 0, 0, 0, 132, 133, 0, 0, 0, 254, 789, ! 790, 18, 0, 611, 0, 0, 793, 0, 0, 927, ! 1507, 1507, 0, 1507, 268, 8, 9, 10, 681, 0, ! 18, 0, 0, 0, 0, 26, 466, 466, 135, 136, ! 0, 0, 256, 693, 0, 0, 680, 681, 595, 595, ! 695, 777, 682, 1303, 26, 705, 0, 135, 136, 366, ! 86, 0, 683, 21, 0, 0, 0, 0, 0, 0, ! 259, 682, 705, 0, 684, 685, 0, 978, 0, 28, ! 269, 683, 232, 979, 0, 981, 982, 266, 232, 1507, ! 1507, 1579, 1013, 684, 685, 0, 769, 0, 0, 0, ! 0, 1013, 466, 466, 466, 256, 0, 152, 256, 0, ! 1341, 33, 0, 0, 366, 0, 1265, 0, 0, 1037, ! 0, 0, 0, 1265, 152, 0, 485, 152, 1038, 0, ! 0, 0, 0, 0, 268, 8, 553, 10, 485, 152, ! 0, 0, 1265, 0, 0, 0, 0, 86, 0, 0, ! 266, 0, 132, 133, 0, 0, 223, 224, 220, 228, ! 0, 0, 14, 0, 437, 939, 0, 466, 466, 0, ! 0, 0, 485, 21, 485, 152, 827, 152, 152, 695, ! 259, 0, 0, 827, 1385, 20, 0, 0, 0, 28, ! 269, 152, 152, 0, 23, 152, 681, 152, 152, 152, ! 595, 0, 0, 26, 152, 0, 135, 136, 0, 152, ! 0, 0, 152, 554, 511, 0, 0, 0, 0, 482, ! 682, 33, 366, 0, 0, 0, 0, 0, 883, 86, ! 683, 232, 0, 0, 0, 0, 0, 0, 1265, 0, ! 0, 1013, 691, 685, 1265, 741, 742, 743, 744, 745, ! 746, 747, 748, 749, 511, 511, 511, 644, 645, 266, ! 646, 647, 648, 649, 650, 651, 652, 653, 654, 437, ! 440, 0, 0, 0, 0, 232, 0, 0, 437, 1331, ! 0, 0, 0, 0, 0, 1013, 366, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 256, 256, 256, 256, ! 232, 0, 0, 0, 0, 268, 132, 133, 10, 0, ! 466, 0, 0, 0, 0, 266, 955, 956, 366, 960, ! 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, ! 971, 972, 973, 974, 975, 976, 977, 0, 0, 0, ! 0, 0, 8, 9, 21, 174, 12, 13, 0, 0, ! 481, 259, 14, 0, 0, 256, 0, 595, 0, 0, ! 28, 269, 0, 0, 0, 0, 16, 0, 17, 18, ! 0, 595, 595, 695, 0, 20, 0, 0, 0, 0, ! 1035, 0, 0, 0, 23, 0, 681, 1265, 0, 0, ! 0, 0, 33, 26, 705, 0, 135, 136, 1341, 0, ! 0, 266, 152, 0, 0, 0, 0, 0, 0, 1250, ! 682, 0, 0, 0, 0, 0, 266, 0, 437, 792, ! 683, 0, 0, 1262, 0, 1263, 0, 1264, 0, 0, ! 0, 1265, 684, 685, 0, 0, 0, 0, 146, 8, ! 9, 10, 222, 223, 224, 0, 0, 0, 0, 14, ! 0, 769, 0, 366, 0, 0, 0, 0, 0, 131, ! 232, 0, 437, 792, 1013, 0, 18, 152, 247, 0, ! 0, 0, 20, 0, 0, 0, 0, 21, 0, 0, ! 0, 23, 0, 681, 0, 0, 0, 0, 0, 0, ! 26, 0, 883, 28, 29, 0, 0, 0, 0, 482, ! 0, 1297, 0, 0, 0, 0, 0, 819, 152, 152, ! 827, 0, 0, 0, 0, 0, 0, 820, 1147, 0, ! 0, 0, 0, 0, 0, 33, 0, 0, 0, 821, ! 685, 0, 232, 0, 0, 0, 0, 0, 1309, 152, ! 152, 595, 595, 595, 0, 0, 0, 152, 266, 0, ! 0, 777, 0, 146, 8, 9, 10, 0, 0, 551, ! 0, 0, 0, 268, 132, 133, 10, 0, 0, 0, ! 0, 0, 0, 8, 9, 139, 0, 266, 86, 0, ! 86, 18, 0, 0, 0, 1193, 86, 0, 86, 0, ! 0, 0, 21, 0, 0, 256, 366, 366, 681, 366, ! 18, 256, 21, 0, 0, 26, 0, 0, 28, 29, ! 595, 595, 595, 0, 0, 0, 1265, 681, 28, 269, ! 482, 0, 819, 595, 26, 0, 0, 135, 136, 624, ! 0, 0, 820, 0, 0, 0, 0, 0, 0, 0, ! 33, 1504, 0, 0, 821, 685, 266, 8, 9, 0, ! 33, 1505, 13, 0, 268, 132, 133, 10, 0, 0, ! 13, 0, 0, 1506, 685, 0, 0, 0, 0, 0, ! 0, 0, 0, 256, 18, 0, 0, 0, 482, 0, ! 0, 0, 18, 0, 482, 0, 482, 482, 1265, 0, ! 0, 0, 0, 21, 0, 0, 595, 595, 26, 681, ! 595, 135, 136, 595, 0, 0, 26, 0, 256, 28, ! 269, 0, 595, 482, 256, 1344, 1035, 1035, 1035, 0, ! 482, 0, 595, 1281, 705, 1345, 0, 0, 0, 482, ! 0, 0, 0, 1282, 1424, 0, 1425, 1346, 1426, 0, ! 0, 33, 0, 0, 0, 1283, 685, 268, 8, 9, ! 10, 0, 0, 13, 0, 0, 266, 0, 266, 640, ! 641, 642, 643, 644, 645, 1145, 646, 647, 648, 649, ! 650, 651, 652, 653, 654, 18, 0, 0, 0, 0, ! 0, 1305, 256, 0, 256, 366, 21, 1009, 1012, 0, ! 0, 0, 681, 0, 0, 0, 0, 0, 0, 26, ! 0, 0, 28, 269, 0, 0, 437, 1331, 268, 132, ! 133, 10, 0, 0, 0, 0, 1325, 0, 152, 152, ! 152, 152, 152, 827, 595, 0, 1326, 0, 152, 0, ! 1147, 1147, 1147, 0, 33, 0, 705, 0, 1327, 685, ! 1488, 256, 595, 595, 595, 0, 0, 21, 0, 0, ! 0, 482, 0, 0, 259, 883, 0, 256, 0, 266, ! 1193, 0, 266, 28, 269, 482, 0, 0, 0, 256, ! 0, 0, 6, 0, 7, 8, 9, 10, 11, 12, ! 13, 0, 0, 0, 0, 14, 0, 554, 0, 0, ! 86, 0, 0, 0, 0, 33, 0, 0, 0, 16, ! 0, 17, 18, 256, 0, 256, 0, 0, 20, 0, ! 0, 0, 0, 21, 266, 256, 0, 23, 0, 0, ! 454, 0, 1395, 0, 1009, 1012, 26, 0, 0, 28, ! 29, 0, 0, 30, 0, 0, 0, 0, 0, 0, ! 0, 595, 595, 31, 595, 0, 0, 0, 0, 366, ! 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, ! 0, 33, 0, 0, 0, 34, 83, 595, 0, 0, ! 595, 595, 695, 643, 644, 645, 109, 646, 647, 648, ! 649, 650, 651, 652, 653, 654, 138, 0, 0, 0, ! 0, 0, 0, 151, 151, 0, 151, 0, 83, 0, ! 883, 0, 146, 8, 9, 10, 0, 83, 0, 0, ! 482, 595, 152, 152, 595, 595, 695, 0, 0, 152, ! 211, 0, 83, 0, 482, 0, 482, 0, 482, 0, ! 246, 0, 0, 595, 595, 595, 595, 109, 0, 349, ! 883, 21, 349, 0, 349, 0, 0, 0, 274, 0, ! 109, 0, 0, 0, 26, 152, 0, 28, 29, 0, ! 152, 200, 0, 86, 0, 0, 0, 0, 0, 0, ! 0, 201, 0, 109, 0, 0, 0, 0, 0, 0, ! 0, 202, 0, 0, 0, 0, 0, 0, 0, 33, ! 349, 266, 349, 203, 0, 0, 0, 0, 0, 132, ! 133, 138, 482, 83, 551, 0, 0, 132, 133, 151, ! 151, 223, 224, 1266, 428, 151, 1267, 14, 151, 151, ! 151, 0, 0, 0, 595, 595, 18, 595, 1273, 256, ! 0, 0, 1009, 1012, 83, 0, 0, 0, 83, 482, ! 20, 0, 0, 681, 211, 83, 0, 0, 0, 23, ! 26, 681, 0, 135, 136, 0, 0, 0, 26, 266, ! 0, 135, 136, 211, 211, 211, 0, 682, 0, 0, ! 0, 0, 0, 0, 0, 682, 0, 683, 0, 0, ! 0, 0, 0, 0, 0, 683, 0, 0, 0, 684, ! 685, 0, 211, 595, 595, 695, 595, 684, 685, 0, ! -417, 8, 9, -417, -417, 12, 254, 0, 0, 537, ! 0, 14, 0, 0, 0, 0, 0, 0, 109, 0, ! 0, 268, 8, 9, 10, 16, 0, 17, -417, 151, ! 0, 0, 0, 0, 20, 1266, 1267, 1009, 1012, -417, ! 0, 0, 0, 23, 1273, 681, 1009, 1012, 0, 18, ! 1616, 0, 26, 0, 0, 135, 136, 0, 0, 0, ! 21, 152, 827, 152, 603, 604, 681, 0, 595, 682, ! 0, 109, 593, 26, 0, 0, 28, 269, 349, 683, ! 613, 0, 256, 614, 0, 0, 615, -417, 0, 625, ! 1325, 684, 685, 630, 0, 0, 0, 0, 0, 0, ! 1326, 670, 0, 0, 0, 0, 0, 0, 33, 0, ! 0, 0, 1327, 685, 0, 109, 0, 349, 1147, 679, ! 0, 593, 593, 694, 0, 0, 0, 146, 132, 133, ! 10, 0, 0, 83, 0, 482, 0, 482, 0, 482, ! 0, 0, 0, 0, 0, 0, 146, 132, 133, 10, ! 0, 0, 13, 0, 0, 18, 0, 0, 1147, 1147, ! 1147, 0, 0, 0, 0, 0, 21, 0, 0, 138, ! 0, 0, 349, 152, 18, 0, 0, 0, 109, 26, ! 211, 109, 28, 29, 0, 21, 1009, 1012, 146, 8, ! 9, 10, 0, 0, 13, 0, 156, 151, 26, 0, ! 151, 28, 29, 0, 0, 0, 157, 146, 8, 9, ! 10, 0, 151, 0, 33, 156, 18, 0, 158, 0, ! 83, 0, 0, 0, 0, 157, 0, 21, 1266, 1267, ! 1009, 1012, 0, 33, 0, 1273, 0, 158, 0, 0, ! 26, 482, 0, 28, 29, 0, 21, 0, 211, 826, ! 211, 211, 694, 0, 0, 0, 826, 201, 0, 26, ! 0, 0, 28, 29, 211, 211, 1623, 202, 211, 0, ! 211, 211, 211, 855, 0, 33, 201, 211, 0, 203, ! 349, 0, 211, 0, 0, 211, 202, 0, 0, 0, ! 0, 0, 0, 0, 33, 0, 0, 0, 203, 0, ! 0, 0, 83, 0, 0, 558, 560, 561, 562, 563, ! 564, 0, 566, 567, 568, 569, 570, 571, 572, 573, ! 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, ! 584, 585, 586, 587, 0, 589, 0, 0, 0, 0, ! 1266, 1267, 0, 1273, 349, 738, 739, 740, 741, 742, ! 743, 744, 745, 746, 747, 748, 749, 924, 0, 0, ! 0, 0, 0, 0, 613, 614, 0, 0, 0, 109, ! 109, 109, 109, 0, 0, 0, 349, 699, 8, 9, ! 10, 349, 349, 0, 349, 349, 349, 349, 349, 349, ! 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, ! 349, 349, 0, 0, 699, 8, 9, 10, 0, 1009, ! 1012, 0, 0, 320, 700, 0, 21, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 109, 26, ! 593, 0, 701, 136, 0, 0, 0, 0, 0, 0, ! 320, 700, 679, 21, 593, 593, 694, 0, 0, 0, ! 0, 482, 0, 1034, 0, 0, 26, 1036, 0, 135, ! 136, 0, 0, 0, 1542, 0, -917, -917, -917, -917, ! -917, -917, -917, -917, -917, 211, -917, -917, -917, 0, ! -917, -917, -917, -917, -917, -917, -917, -917, -917, -917, ! -917, -917, -917, -917, -917, -917, 0, -917, -917, -917, ! -917, 0, -917, -917, -917, -917, -917, -917, -917, -917, ! -917, 349, 0, -917, -917, -917, -917, -917, -917, 0, ! 0, -917, -917, -917, 138, -917, -917, 0, 0, 0, ! 0, 138, -917, 8, 9, -917, 0, 0, 254, 0, ! 211, 246, 0, -917, -917, -917, 0, 268, 8, 9, ! 10, -917, -917, -917, 0, 0, 0, -917, 0, -917, ! 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 1543, -917, 0, 0, 681, 0, 0, ! 0, 211, 211, 1137, 26, 0, 21, 135, 136, 1140, ! 0, 1137, 0, 259, 919, 8, 9, 0, 174, 12, ! 13, 1504, 28, 269, 0, 14, 0, 0, 0, 0, ! 0, 1505, 211, 211, 855, 855, 855, 920, 0, 16, ! 211, 17, 18, 1506, 685, 925, 260, 0, 20, 0, ! 0, 0, 0, 0, 33, 0, 0, 770, 8, 9, ! 771, 0, 0, 551, 0, 0, 26, 0, 138, 135, ! 136, 83, 0, 83, 349, 349, 0, 349, 1192, 83, ! 0, 83, 0, 0, 0, 18, 0, 0, 109, 268, ! 8, 9, 10, 884, 109, 7, 8, 885, 10, 174, ! 12, 13, 681, 593, 593, 593, 14, 0, 0, 26, ! 0, 0, 135, 136, 0, 0, 593, 0, 0, 0, ! 16, 0, 17, 18, 19, 0, 1504, 0, 21, 20, ! -549, 0, 0, 0, 21, 259, 1505, 0, 23, 886, ! 0, 175, 0, 0, 28, 269, 0, 26, 1506, 685, ! 28, 29, 0, 0, 887, 0, 888, 0, 0, 0, ! 0, 0, 0, 1257, 31, 0, 109, 0, 554, 0, ! 8, 9, 0, 0, 32, 13, 33, 0, 0, 0, ! 0, 0, 33, 0, 0, 0, 34, 0, 0, 593, ! 593, 0, 0, 593, 613, 614, 593, 18, 0, 0, ! 0, 109, -549, 0, 0, 593, 0, 109, 0, 1034, ! 1034, 1034, 0, 0, 681, 593, 0, 1140, 0, 0, ! 0, 26, 0, 0, 135, 136, 0, 0, 0, 0, ! 0, 146, 132, 133, 10, 0, 0, 551, 1504, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 1505, 173, ! 0, 146, 8, 9, 10, 174, 12, 13, 0, 18, ! 1506, 685, 14, 349, 0, 0, 349, 0, 0, 0, ! 21, 0, 0, 0, 0, 109, 16, 109, 17, 18, ! 19, 0, 0, 26, 0, 20, 28, 29, 0, 0, ! 21, 0, 0, 0, 23, 0, 0, 175, 0, 0, ! 31, 0, 0, 26, 0, 0, 28, 29, 613, 614, ! 32, 211, 211, 211, 211, 211, 1137, 855, 33, 0, ! 31, 211, 34, 1137, 1137, 1137, 0, 0, 0, 1140, ! 32, 0, 0, 0, 109, 855, 855, 855, 33, 0, ! 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, ! 109, 0, 0, 1192, 146, 8, 9, 10, 174, 12, ! 13, 0, 109, 481, 0, 14, 1217, 1218, 0, 0, ! 0, 0, 0, 0, 0, 1369, 0, 0, 0, 16, ! 0, 17, 18, 83, 0, 0, 0, 0, 20, 0, ! 0, 0, 0, 21, 0, 0, 109, 23, 109, 681, ! 0, 0, 0, 0, 0, 0, 26, 349, 109, 28, ! 29, 0, 0, 0, 0, 0, 8, 9, 0, 174, ! 12, 13, 0, 1132, 481, 1406, 14, 349, 0, 0, ! 0, 0, 0, 1133, 593, 593, 0, 593, 0, 0, ! 16, 33, 17, 18, 0, 1134, 685, 0, 0, 20, ! 0, 0, 0, 0, 0, 0, 0, 54, 23, 0, ! 593, 0, 0, 593, 593, 694, 0, 26, 0, 0, ! 135, 136, 0, 0, 0, 0, 268, 132, 1465, 10, ! 0, 0, 0, 0, 54, 54, 0, 159, 0, 54, ! 0, 146, 8, 9, 10, 174, 12, 13, 54, 0, ! 0, 0, 14, 0, 855, 211, 211, 855, 855, 1437, ! 0, 54, 211, 54, 0, 21, 16, 0, 17, 18, ! 19, 0, 259, 0, 0, 20, 855, 855, 855, 855, ! 21, 28, 269, 0, 23, 0, 262, 175, 0, 270, ! 0, 0, 0, 26, 0, 0, 28, 29, 211, 0, ! 0, 0, 0, 151, 0, 554, 83, 0, 0, 0, ! 31, 0, 0, 33, 0, 0, 0, 0, 0, 0, ! 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, ! 0, 410, 410, 0, 54, 0, 0, 0, 0, 0, ! 54, 54, 0, 0, 262, 270, 54, 0, 0, 159, ! 159, 159, 0, 0, 0, 0, 447, 855, 855, 0, ! 855, 0, 109, 0, 0, 54, 0, 0, 0, 54, ! 0, 0, 0, 0, 0, 54, 54, 0, 146, 8, ! 9, 10, 213, 12, 214, 0, 0, 0, 0, 14, ! 0, 0, 0, 0, 54, 54, 159, 0, 0, 0, ! 0, 0, 0, 16, 262, 17, 18, 0, 0, 0, ! 0, 0, 20, 0, 0, 0, 0, 21, 0, 0, ! 0, 23, 0, 54, 0, 0, 855, 855, 1437, 855, ! 26, 0, 0, 28, 29, 0, 0, 215, 0, 638, ! 639, 640, 641, 642, 643, 644, 645, 31, 646, 647, ! 648, 649, 650, 651, 652, 653, 654, 32, 0, 0, ! 54, 0, 0, 0, 0, 33, 0, 262, 0, 34, ! 0, 0, 625, 884, 0, 7, 8, 885, 10, 174, ! 12, 13, 0, 0, 0, 0, 14, 8, 9, 0, ! 0, 12, 254, 0, 211, 826, 211, 14, 0, 0, ! 16, 855, 17, 18, 19, 0, 0, 0, 0, 20, ! -550, 16, 0, 17, 21, 109, 0, 0, 23, 886, ! 20, 175, 0, 0, 0, 0, 0, 26, 0, 23, ! 28, 29, 0, 621, 887, 0, 888, 0, 26, 0, ! 0, 135, 136, 0, 31, 0, 0, 0, 0, 0, ! 410, 1137, 0, 0, 32, 0, 0, 0, 262, 0, ! 0, 0, 33, 0, 54, 0, 34, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 613, 614, 0, 0, ! 0, 0, -550, 0, 0, 0, 0, 0, 0, 0, ! 0, 1137, 1137, 1137, 8, 9, 0, 0, 12, 13, ! 410, 0, 0, 0, 14, 0, 211, 0, 0, 0, ! 0, 54, 0, 0, 0, 0, 0, 0, 16, 0, ! 17, 262, 0, 0, 0, 0, 0, 20, 54, 0, ! 0, 54, 0, 0, 0, 0, 23, 447, 447, 447, ! 0, 0, 0, 54, 0, 26, 0, 0, 135, 136, ! 267, 54, 736, 737, 738, 739, 740, 741, 742, 743, ! 744, 745, 746, 747, 748, 749, 268, 8, 9, 10, ! 174, 12, 13, 0, 0, 481, 0, 14, 0, 54, ! 54, 54, 54, 0, 984, 0, 0, 54, 0, 0, ! 0, 16, 0, 17, 18, 54, 54, 0, 0, 54, ! 20, 159, 159, 159, 447, 21, 0, 0, 54, 23, ! 0, 681, 166, 54, 0, 0, 54, 0, 26, 0, ! 0, 28, 269, 0, 0, 0, 0, 0, 0, 0, ! 0, 450, 0, 54, 0, 1281, 212, 0, 0, 0, ! 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, ! 0, 0, 0, 33, 0, 0, 0, 1283, 685, 0, ! 0, 81, 0, 0, 501, 634, 635, 636, 637, 638, ! 639, 640, 641, 642, 643, 644, 645, 520, 646, 647, ! 648, 649, 650, 651, 652, 653, 654, 0, 81, 81, ! 0, 81, 621, 81, 621, 8, 9, 0, 174, 12, ! 13, 0, 81, 481, 0, 14, 0, 0, 0, 0, ! 621, 621, 621, 0, 0, 81, 0, 81, 0, 16, ! 0, 17, 18, 0, 0, 621, 0, 0, 20, 0, ! 0, 0, 0, 0, 166, 166, 166, 23, 0, 681, ! 0, 0, 0, 272, 0, 0, 26, 0, 0, 135, ! 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 212, 0, 0, 1504, 0, 0, 0, 0, 0, 0, ! 0, 0, 262, 1505, 0, 0, 0, 0, 0, 212, ! 212, 513, 0, 0, 621, 1506, 685, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, ! 0, 0, 0, 0, 81, 81, 54, 0, 212, 272, ! 81, 0, 0, 81, 81, 81, 737, 738, 739, 740, ! 741, 742, 743, 744, 745, 746, 747, 748, 749, 81, ! 0, 0, 0, 81, 0, 0, 0, 0, 0, 81, ! 81, 0, 146, 8, 9, 10, 174, 12, 13, 0, ! 0, 835, 0, 14, 0, 410, 0, 0, 81, 81, ! 81, 0, 410, 0, 0, 0, 0, 16, 0, 17, ! 18, 54, 0, 0, 0, 0, 20, 0, 0, 0, ! 0, 21, 0, 0, 0, 23, 0, 81, 594, 0, ! 0, 0, 0, 0, 26, 0, 0, 28, 29, 8, ! 9, 0, 174, 12, 13, 0, 0, 1641, 0, 14, ! 0, 31, 54, 54, 159, 0, 0, 0, 0, 262, ! 270, 32, 1144, 16, 81, 17, 18, 0, 0, 33, ! 0, 0, 20, 34, 0, 0, 621, 688, 688, 688, ! 0, 23, 0, 54, 54, 447, 447, 447, 0, 0, ! 26, 54, 0, 135, 136, 0, 0, 0, 0, 0, ! 268, 8, 9, 10, 174, 12, 13, 0, 0, 481, ! 0, 14, 0, 0, 0, 0, 8, 9, 858, 0, ! 12, 13, 54, 864, 54, 16, 14, 17, 18, 54, ! 54, 0, 54, 0, 20, 0, 212, 0, 0, 21, ! 16, 0, 17, 23, 0, 681, 0, 0, 905, 20, ! 0, 0, 26, 0, 911, 28, 269, 0, 23, 0, ! 0, 0, 0, 704, 0, 0, 0, 26, 81, 1325, ! 135, 136, 0, 0, 0, 0, 0, 0, 0, 1326, ! 704, 0, 0, 0, 0, 0, 0, 33, 0, 0, ! 0, 1327, 685, 0, 0, 0, 921, 922, 0, 923, ! 0, 0, 0, 0, 823, 0, 823, 823, 688, 0, ! 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, ! 212, 212, 0, 0, 212, 0, 513, 513, 513, 856, ! 0, 0, 81, 212, 0, 81, 0, 0, 212, 0, ! 0, 212, 0, 0, 0, 0, 0, 81, 0, 0, ! 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, ! 621, 621, 621, 0, 0, 0, 447, 262, 0, 0, ! 146, 8, 9, 10, 222, 223, 224, 0, 0, 0, ! 0, 14, 0, 81, 81, 81, 81, 0, 0, 0, ! 0, 81, 1022, 1023, 0, 0, 0, 1022, 18, 81, ! 81, 0, 0, 81, 20, 81, 81, 81, 0, 21, ! 0, 0, 81, 23, 0, 681, 0, 81, 0, 0, ! 81, 0, 26, 0, 0, 28, 29, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 81, 0, 201, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 1629, 54, 54, 54, 159, 159, 159, 447, 0, - 262, 0, 54, 262, 1144, 1144, 1144, 0, 0, 0, - 270, 0, 0, 0, 0, 0, 993, 0, 0, 0, - 0, 146, 8, 9, 10, 0, 0, 254, 0, 0, - 688, 688, 688, 0, 54, 0, 0, 0, 884, 688, - 7, 8, 885, 10, 174, 12, 13, 0, 0, 18, - 0, 14, 0, 0, 0, 262, 270, 0, 1139, 0, - 21, 212, 0, 0, 54, 16, 0, 17, 18, 19, - 0, 0, 0, 26, 20, -552, 28, 29, 0, 21, - 0, 0, 0, 23, 886, 0, 175, 0, 0, 0, - 201, 1155, 26, 0, 0, 28, 29, 0, 0, 887, - 202, 888, 0, 0, 0, 0, 0, 704, 33, 31, - 0, 0, 203, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 0, 823, 33, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, ! 81, 447, 0, 0, 447, 447, 447, -552, 1213, 0, ! 1215, 0, 146, 8, 9, 10, 0, 0, 13, 0, ! 0, 0, 0, 0, 0, 0, 0, 823, 823, 1138, ! 0, 0, 0, 0, 0, 0, 0, 1138, 0, 0, ! 18, 0, 0, 0, 0, 447, 54, 54, 447, 447, ! 447, 21, 0, 54, 0, 0, 0, 0, 212, 212, ! 856, 856, 856, 0, 26, 81, 212, 28, 29, 0, ! 146, 8, 9, 10, 0, 0, 551, 0, 0, 0, ! 0, 508, 0, 0, 0, 1252, 1253, 0, 1255, 54, ! 0, 509, 262, 0, 54, 0, 0, 54, 18, 33, ! 0, 0, 0, 510, 212, 0, 81, 81, 81, 21, ! 0, 0, 0, 0, 272, 0, 1146, 0, 0, 1274, ! 0, 0, 26, 0, 0, 28, 29, 0, 0, 594, ! 594, 594, 0, 0, 0, 0, 0, 81, 81, 201, ! 0, 0, 688, 0, 0, 81, 0, 0, 0, 202, ! 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, ! 0, 203, 642, 643, 644, 645, 0, 646, 647, 648, ! 649, 650, 651, 652, 653, 654, 81, 0, 81, 0, ! 0, 0, 0, 81, 81, 0, 81, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 884, 0, ! 7, 8, 885, 10, 174, 12, 13, 0, 0, 0, ! 0, 14, 0, 0, 0, 688, 688, 0, 0, 688, ! 0, 0, 688, 0, 0, 16, 0, 17, 18, 19, ! 0, 688, 0, 1330, 20, 688, 688, 688, 0, 21, ! 0, 688, 0, 23, 886, 0, 175, 1653, 0, 0, ! 0, 0, 26, 0, 0, 28, 29, 0, 0, 887, ! 0, 888, 1355, 0, 0, 0, 0, 0, 0, 31, ! 0, 0, 0, 0, 1360, 686, 686, 686, 0, 32, ! 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, ! 0, 34, 0, 0, 0, 54, 54, 54, 0, 1654, ! 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, ! 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, ! 748, 749, 704, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 823, 823, 823, ! 1138, 1138, 1138, 1328, 0, 0, 0, 823, 0, 1138, ! 1138, 1138, 1144, 0, 0, 0, 146, 132, 133, 10, ! 0, 856, 856, 856, 1412, 0, 0, 0, 0, 0, ! 0, 210, 0, 0, 0, 0, 0, 0, 0, 212, ! 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, ! 0, 0, 1144, 1144, 1144, 21, 265, 0, 0, 273, ! 0, 0, 686, 0, 686, 686, 686, 54, 26, 0, ! 0, 28, 29, 0, 0, 0, 81, 81, 81, 81, ! 81, 81, 265, 1438, 376, 31, 81, 0, 1146, 1146, ! 1146, 0, 0, 0, 1335, 32, 0, 0, 0, 0, ! 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, ! 0, 0, 8, 9, 484, 213, 12, 214, 81, 0, ! 993, 993, 14, 993, 0, 0, 0, 0, 0, 0, ! 0, 1470, 0, 0, 0, 1471, 16, 0, 17, 18, ! 272, 0, 0, 0, 0, 20, 688, 0, 81, 688, ! 688, 688, 0, 0, 23, 210, 0, 0, 0, 0, ! 0, 0, 0, 26, 0, 0, 135, 136, 0, 1487, ! 1455, 1456, 9, 10, 210, 210, 210, 0, 0, 0, ! 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, ! 1328, 823, 823, 1328, 1328, 1328, 0, 0, 823, 0, ! 0, 1510, 0, 210, 0, 1511, 0, 0, 0, 21, ! 0, 0, 856, 856, 856, 856, 0, 0, 0, 0, ! 0, 0, 26, 0, 0, 28, 29, 1526, 1527, 273, ! 0, 1457, 0, 0, 212, 0, 0, 0, 0, 201, ! 0, 0, 0, 0, 0, 0, 0, 265, 0, 202, ! 0, 0, 0, 0, 0, 0, 0, 33, 686, 686, ! 686, 203, 0, 0, 0, 0, 0, 1031, 0, 0, ! 81, 81, 0, 268, 8, 9, 10, 81, 0, 13, ! 1181, 8, 885, 10, 213, 12, 214, 0, 0, 0, ! 0, 14, 0, 0, 724, 0, 0, 0, 0, 0, ! 0, 18, 0, 1328, 1328, 16, 1328, 17, 18, 0, ! 0, 0, 21, 81, 20, 0, 0, 0, 81, 21, ! 0, 81, 0, 23, 0, 26, 0, 0, 28, 269, ! 0, 0, 26, 0, 0, 28, 29, 0, 265, 273, ! 0, 1183, 852, 0, 0, 0, 0, 0, 0, 31, ! 0, 0, 853, 0, 686, 0, 273, 0, 0, 32, ! 33, 0, 0, 0, 854, 0, 0, 33, 0, 0, ! 0, 34, 1328, 1328, 1328, 1328, 0, 6, 0, 7, ! 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, ! 14, 210, 0, 811, 484, 686, 686, 686, 146, 8, ! 9, 10, 0, 15, 16, 1031, 17, 18, 19, 0, ! 0, 0, 0, 20, 0, 0, 0, 0, 21, 0, ! 0, 22, 23, 24, 0, 25, 18, 0, 0, 0, ! 0, 26, 27, 0, 28, 29, 0, 21, 30, 0, ! 212, 0, 212, 0, 0, 0, 0, 1328, 31, 0, ! 26, 0, 0, 28, 29, 0, 0, 0, 32, 210, ! 0, 210, 210, 0, 0, 0, 33, 508, 0, 0, ! 34, 0, 0, 0, 35, 210, 210, 509, 0, 210, ! 0, 210, 210, 210, 210, 33, 0, 0, 210, 510, ! 0, 0, 0, 210, 0, 0, 210, 513, 0, 0, ! 0, 146, 8, 9, 10, 213, 12, 214, 0, 0, ! 686, 0, 14, 0, 0, 484, 0, 0, 0, 81, ! 81, 81, 930, 0, 0, 0, 16, 0, 17, 18, ! 0, 0, 0, 0, 0, 20, 0, 513, 513, 513, ! 21, 0, 0, 0, 23, 0, 0, 0, 811, 0, ! 0, 0, 212, 26, 0, 0, 28, 29, 0, 0, ! 1626, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 31, 0, 0, 484, 0, 0, 1146, 0, 0, 484, ! 32, 484, 484, 686, 686, 0, 0, 686, 33, 0, ! 686, 0, 34, 0, 0, 0, 0, 0, 0, 686, ! 0, 0, 0, 1031, 1031, 1031, 0, 0, 484, 686, ! 0, 0, 0, 0, 0, 484, 1146, 1146, 1146, 0, ! 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, ! 0, 81, 0, 0, 0, 1455, 132, 133, 10, 0, ! 0, 0, 0, 1053, 1055, 1056, 1057, 0, 1059, 1060, ! 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, ! 1071, 1072, 1073, 1074, 1075, 1076, 1077, 265, 273, 641, ! 642, 643, 644, 645, 21, 646, 647, 648, 649, 650, ! 651, 652, 653, 654, 0, 0, 210, 26, 0, 0, ! 28, 29, 0, 0, 0, 0, 1457, 0, 0, 0, ! 146, 8, 9, 10, 31, 686, 686, 686, 686, 686, ! 686, 686, 0, 0, 32, 686, 0, 1031, 1031, 1031, ! 0, 0, 33, 0, 0, 0, 34, 811, 18, 268, ! 8, 9, 10, 0, 0, 0, 0, 0, 0, 21, ! 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, ! 0, 210, 26, 107, 0, 28, 29, 18, 0, 0, ! 484, 0, 126, 107, 0, 0, 0, 0, 21, 201, ! 107, 107, 0, 107, 0, 0, 0, 0, 0, 202, ! 0, 26, 0, 0, 28, 269, 0, 33, 0, 0, ! 0, 203, 210, 210, 1136, 0, 0, 0, 852, 265, ! 273, 0, 1136, 0, 0, 1169, 0, 243, 853, 0, ! 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, ! 854, 0, 0, 210, 210, 210, 210, 210, 519, 0, ! 0, 210, 728, 729, 730, 731, 732, 733, 734, 735, ! 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, ! 746, 747, 748, 749, 686, 0, 273, 686, 686, 686, ! 0, 0, 0, 0, 0, 0, 0, 1235, 403, 210, ! 126, 0, 0, 0, 0, 0, 0, 107, 107, 1390, ! 0, 0, 0, 0, 0, 0, 107, 107, 0, 0, ! 107, 107, 107, 0, 433, 107, 107, 107, 686, 686, ! 686, 686, 686, 686, 811, 484, 686, 0, 0, 884, ! 0, 7, 8, 885, 10, 174, 12, 13, 0, 484, ! 0, 484, 14, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 18, ! 19, 0, 0, 0, 0, 20, -551, 0, 0, 0, ! 21, 0, 0, 0, 23, 886, 0, 175, 0, 0, ! 0, 0, 0, 26, 1290, 0, 28, 29, 0, 0, ! 887, 0, 888, 0, 0, 0, 0, 0, 0, 0, ! 31, 0, 0, 0, 0, 243, 107, 0, 0, 0, ! 32, 0, 0, 0, 0, 0, 0, 484, 33, 0, ! 0, 0, 34, 0, 0, 0, 107, 265, 273, 265, ! 0, 686, 686, 0, 686, 0, 0, 0, -551, 0, ! 0, 0, 0, 0, 0, 0, 0, 639, 640, 641, ! 642, 643, 644, 645, 484, 646, 647, 648, 649, 650, ! 651, 652, 653, 654, 0, 0, 0, 0, 0, 107, ! 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, ! 744, 745, 746, 747, 748, 749, 811, 811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 686, 686, 686, 686, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 107, 0, 107, 107, ! 1364, 0, 210, 210, 210, 210, 210, 1136, 210, 0, ! 1329, 0, 210, 265, 1136, 1136, 1136, 0, 0, 0, ! 273, 0, 0, 0, 0, 0, 210, 210, 210, 0, ! 0, 0, 146, 8, 9, 10, 174, 12, 13, 0, ! 0, 0, 0, 14, 210, 0, 107, 0, 0, 0, ! 0, 0, 0, 811, 811, 686, 0, 16, 0, 17, ! 18, 0, 0, 0, 0, 519, 20, 107, 0, 0, ! 0, 21, 0, 0, 107, 23, 0, 107, 0, 0, ! 0, 0, 0, 0, 26, 0, 0, 28, 29, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 31, 0, 0, 18, 0, 0, 0, 0, 0, ! 1418, 32, 0, 0, 0, 0, 0, 0, 0, 33, ! 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, ! 484, 0, 484, 0, 484, 0, 0, 811, 728, 729, ! 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, ! 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, ! 0, 0, 0, 0, 0, 811, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 107, 0, 876, 1451, ! 1452, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 210, 210, 210, 210, 210, ! 1136, 0, 0, 210, 0, 0, 0, 811, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 210, 210, 210, ! 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 107, 0, 107, 0, 484, 0, 0, 210, ! 0, 0, 0, 0, 146, 8, 9, 10, 213, 12, ! 214, 0, 0, 0, 0, 14, 0, 0, 0, 0, ! 811, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 0, 17, 18, 0, 1517, 0, 0, 0, 20, 0, ! 0, 0, 0, 21, 0, 0, 0, 23, 0, 0, ! 0, 0, 0, 0, 0, 0, 26, 811, 0, 28, ! 29, 0, 0, 0, 0, 0, 0, 107, 210, 210, ! 1329, 210, 0, 31, 0, 0, 0, 0, 107, 107, ! 0, 107, 107, 32, 0, 0, 0, 0, 0, 0, ! 0, 33, 1582, 1583, 0, 34, 0, 0, 728, 729, ! 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, ! 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 1605, 0, 0, 0, 0, 0, 210, 210, 1136, ! 210, 1675, 732, 733, 734, 735, 736, 737, 738, 739, ! 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, ! 0, 107, 0, 0, 0, 1639, 0, 0, 107, 126, ! 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, ! 0, 0, 0, 0, 0, 0, 616, 0, 268, 8, ! 9, 10, 174, 12, 312, 313, 314, 481, 315, 14, ! 0, 0, 876, 0, 0, 210, 484, 210, 0, 0, ! 0, 0, 210, 16, 316, 17, 18, 19, 0, 317, ! 318, 319, 20, 0, 320, 321, 322, 21, 323, 324, ! 1694, 23, 0, 681, 0, 325, 326, 327, 328, 329, ! 26, 0, 0, 28, 269, -341, 0, 0, 377, 0, ! 0, 0, 0, 0, 332, 0, 0, 1027, 0, 0, ! 0, 0, 1136, 0, 0, 334, 335, 1028, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 1029, ! 685, 0, 876, 0, 0, 107, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 341, 0, 0, 0, ! 0, 0, 1136, 1136, 1136, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, ! 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 727, 0, 0, 811, 728, 729, 730, ! 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, ! 741, 742, 743, 744, 745, 746, 747, 748, 749, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 1587, ! 0, -507, -507, -507, -507, -507, -507, -507, 0, 0, ! -507, 0, -507, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, -507, 0, -507, 107, 107, 0, -507, ! 107, 0, 0, 107, 0, -507, 0, 0, 0, 0, ! -507, 0, 107, 0, -507, 0, -507, 0, 0, 0, ! 0, 0, 107, -507, 0, 0, -507, -507, -507, -507, ! -507, 0, -507, -507, -507, -507, -507, -507, -507, -507, ! -507, -507, -507, -507, -507, -507, -507, -507, -507, -507, ! -507, -507, -507, -507, -507, 0, -507, -507, -507, 0, ! -507, -507, -507, -507, -507, 0, 0, 0, 0, 0, ! 1588, -507, 0, 0, 0, 0, -507, -507, -507, 1497, ! -507, -917, -917, -917, -917, -917, -917, -917, -917, -917, ! 0, -917, -917, -917, 0, -917, -917, -917, -917, -917, ! -917, -917, -917, -917, -917, -917, -917, -917, -917, -917, ! -917, 0, -917, -917, -917, -917, 0, -917, -917, -917, ! -917, -917, -917, -917, -917, -917, 0, 0, -917, -917, ! -917, -917, -917, -917, 0, 0, -917, -917, -917, 0, ! -917, -917, 0, 0, 0, 0, 0, -917, 0, 275, ! -917, 0, 8, 9, 0, 876, 12, 13, -917, -917, ! -917, 0, 14, 0, 0, 0, -917, -917, -917, 0, ! 0, 0, -917, 0, -917, 0, 16, 0, 17, 0, ! 0, 0, 107, 0, 0, 20, 0, 276, 277, -917, ! 0, 0, 0, 0, 23, 0, 278, 0, 0, 0, ! 0, 0, 0, 26, 0, 0, 135, 136, 0, 279, ! 0, 0, 0, 280, 281, 282, 283, 284, 285, 286, ! 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, ! 297, 298, 299, 300, 0, 0, 301, 302, 303, 0, ! 304, 107, 107, 305, 107, 616, 0, 146, 8, 9, ! 10, 174, 12, 312, 313, 314, 481, 315, 14, 306, ! 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, ! 107, 107, 16, 316, 17, 18, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 681, 0, 325, 326, 327, 328, 329, 26, ! 876, 0, 28, 29, -341, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 1141, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 1142, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 1143, 685, ! 876, 480, 0, 268, 8, 9, 10, 174, 12, 312, ! 313, 314, 481, 315, 14, 341, 0, 0, 107, 0, ! 107, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 18, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 28, 269, ! 0, 0, 0, 377, 0, 0, 0, 0, 0, 332, ! 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 957, 340, 268, 8, 9, 10, 174, ! 12, 312, 313, 314, 0, 315, 14, 0, 0, -831, ! 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 18, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 0, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 28, 269, 1689, 0, -821, 377, 0, 0, 0, 0, ! 0, 332, 0, 0, 333, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 809, 340, 945, 946, 947, ! 10, 0, 12, 497, 313, 314, 0, 315, 14, 0, ! 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 0, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 948, 949, 810, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 333, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 340, 950, ! 616, 0, 268, 8, 9, 10, 0, 12, 312, 313, ! 314, 0, 315, 14, 1126, 341, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 316, 17, ! 18, 19, 0, 317, 318, 319, 20, 0, 320, 321, ! 322, 21, 323, 324, 0, 23, 0, 0, 0, 325, ! 326, 327, 328, 329, 26, 0, 0, 28, 269, -341, ! 0, 0, 377, 0, 0, 0, 0, 0, 332, 0, ! 0, 617, 0, 0, 0, 0, 0, 0, 0, 334, ! 335, 618, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 809, 619, 945, 946, 947, 10, 0, 12, ! 497, 313, 314, 0, 315, 14, 0, 0, 0, 0, ! 341, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 316, 17, 0, 19, 0, 317, 318, 319, 20, 0, ! 320, 321, 322, 21, 323, 324, 0, 23, 0, 0, ! 0, 325, 326, 327, 328, 329, 26, 0, 0, 948, ! 949, 810, 0, 0, 377, 0, 0, 0, 0, 0, ! 332, 0, 0, 333, 0, 0, 0, 0, 0, 0, ! 0, 334, 335, 336, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 340, 950, 809, 0, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 341, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 810, 0, 0, 377, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, ! 0, 0, 0, 0, 337, 338, 339, 0, 0, 0, ! 340, 809, 0, 945, 946, 947, 10, 1338, 12, 497, ! 313, 314, 0, 315, 14, 0, 0, 341, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 0, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 948, 949, ! 810, 0, 0, 377, 0, 0, 0, 0, 0, 332, ! 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 809, 340, 945, 946, 947, 10, 0, ! 12, 497, 313, 314, 0, 315, 14, 0, 0, 0, ! -511, 341, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 0, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 0, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 948, 949, 810, 0, 0, 377, 0, 0, 0, 0, ! 0, 332, 0, 0, 333, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 616, 340, 146, 8, 9, ! 10, 0, 12, 312, 313, 314, 0, 315, 14, 0, ! 0, 0, 1434, 341, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 18, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 28, 29, -341, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 1669, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 1670, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 809, 1671, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 0, 0, 0, 341, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 810, 0, 0, 377, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, ! 0, 0, 0, 0, 337, 338, 339, 0, 0, 957, ! 340, 268, 8, 9, 10, 0, 12, 497, 313, 314, ! 0, 315, 14, 0, 0, 0, 0, 341, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 0, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 0, 0, ! 0, 377, -821, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 1731, 340, 268, 8, 9, 10, 0, 12, 312, ! 313, 314, 0, 315, 14, 0, 0, 0, 0, 341, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 0, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 28, 269, ! 0, 0, -203, 377, 0, 0, 0, 0, 0, 332, ! 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 957, 340, 268, 8, 9, 10, 0, ! 12, 497, 313, 314, 0, 315, 14, 0, 0, 0, ! 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 0, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 0, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 28, 269, 0, 0, 0, 377, 0, 0, 0, 0, ! 0, 332, 0, 0, 333, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 1052, 340, 268, 8, 9, ! 10, 0, 12, 497, 313, 314, 0, 315, 14, 0, ! 0, -821, 0, 341, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 0, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 28, 269, 0, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 333, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 1054, 340, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 0, 0, 0, 341, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 0, 0, 0, 377, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, ! 0, 0, 0, 0, 337, 338, 339, 0, 0, 1638, ! 340, 268, 8, 9, 10, 0, 12, 497, 313, 314, ! 0, 315, 14, 0, 0, 0, 0, 341, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 0, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 0, 0, ! 0, 377, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 340, 268, 8, 9, 10, 0, 12, 497, ! 313, 314, 0, 315, 14, 0, 0, 0, 0, 341, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 0, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 28, 269, ! 0, 0, 0, 377, 0, 0, 0, 0, 0, 332, ! 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 340, 268, 8, 9, 10, 0, ! 12, 497, 313, 314, 0, 315, 14, 0, 0, 0, ! 0, 341, 498, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 0, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 0, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 28, 269, 0, 0, 0, 377, 0, 0, 0, 0, ! 0, 332, 0, 0, 333, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 340, 268, 8, 9, ! 10, 0, 12, 497, 313, 314, 0, 315, 14, 0, ! 0, 0, 0, 341, 862, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 0, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 28, 269, 0, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 333, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 340, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 0, 0, 0, 341, 996, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 0, 0, 0, 377, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, ! 0, 0, 0, 0, 337, 338, 339, 0, 0, 0, ! 340, 268, 8, 9, 10, 0, 12, 497, 313, 314, ! 0, 315, 14, 0, 0, 0, 0, 341, 1017, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 0, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 0, 0, ! 0, 377, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 340, 735, 736, 737, 738, 739, 740, 741, ! 742, 743, 744, 745, 746, 747, 748, 749, 0, 341, ! 1276, 1546, 1547, 1548, 10, 174, 12, 312, 313, 314, ! 0, 315, 14, 1549, 0, 1550, 1551, 1552, 1553, 1554, ! 1555, 1556, 1557, 1558, 1559, 15, 16, 316, 17, 18, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 1560, 23, 1561, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 1562, 269, 1125, 0, ! 1563, 377, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 340, 0, 1564, 0, 1546, 1547, 1548, 10, ! 174, 12, 312, 313, 314, 0, 315, 14, 1549, 341, ! 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, ! 15, 16, 316, 17, 18, 19, 0, 317, 318, 319, ! 20, 0, 320, 321, 322, 21, 323, 324, 1560, 23, ! 1561, 0, 0, 325, 326, 327, 328, 329, 26, 0, ! 0, 1562, 269, 1726, 0, 1563, 377, 0, 0, 0, ! 0, 0, 332, 0, 0, 333, 0, 0, 0, 0, ! 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 340, 0, 1564, ! 0, 1546, 1547, 1548, 10, 174, 12, 312, 313, 314, ! 0, 315, 14, 1549, 341, 1550, 1551, 1552, 1553, 1554, ! 1555, 1556, 1557, 1558, 1559, 15, 16, 316, 17, 18, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 1560, 23, 1561, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 1562, 269, 0, 0, ! 1563, 377, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 340, 0, 1564, 268, 8, 9, 10, 174, ! 12, 312, 313, 314, 481, 315, 14, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 18, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 681, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 28, 269, 0, 0, 0, 377, 0, 0, 0, 0, ! 0, 332, 0, 0, 1027, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 1028, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 1029, 685, 146, 8, ! 9, 10, 174, 12, 312, 313, 314, 481, 315, 14, ! 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 316, 17, 18, 19, 0, 317, ! 318, 319, 20, 0, 320, 321, 322, 21, 323, 324, ! 0, 23, 0, 681, 0, 325, 326, 327, 328, 329, ! 26, 0, 0, 28, 29, 0, 0, 0, 377, 0, ! 0, 0, 0, 0, 332, 0, 0, 1141, 0, 0, ! 0, 0, 0, 0, 0, 334, 335, 1142, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 1143, ! 685, 268, 8, 9, 10, 0, 12, 312, 313, 314, ! 0, 315, 14, 0, 0, 0, 341, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 18, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 681, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, ! 1027, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 1028, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 1029, 685, 146, 8, 9, 10, 0, 12, ! 312, 313, 314, 0, 315, 14, 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 316, 17, 18, 19, 0, 317, 318, 319, 20, 0, ! 320, 321, 322, 21, 323, 324, 0, 23, 0, 681, ! 0, 325, 326, 327, 328, 329, 26, 0, 0, 28, ! 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 332, 0, 0, 1141, 0, 0, 0, 0, 0, 0, ! 0, 334, 335, 1142, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 1143, 685, 268, 8, 9, ! 10, 0, 12, 497, 313, 314, 0, 315, 14, 0, ! 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 18, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 28, 269, 0, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 617, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 618, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 619, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 0, 0, 0, 341, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 0, 0, 1609, 377, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, ! 0, 0, 0, 0, 337, 338, 339, 0, 0, 0, ! 340, 268, 8, 9, 10, 174, 12, 312, 313, 314, ! 0, 315, 14, 0, 0, 0, 0, 341, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 18, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 340, 146, 8, 9, 10, 0, 12, 497, ! 313, 314, 0, 315, 14, 0, 0, 0, 0, 341, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 18, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 28, 29, ! 0, 0, 0, 377, 0, 0, 0, 0, 0, 332, ! 0, 0, 1669, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 1670, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 1671, 268, 8, 9, 10, 0, ! 12, 312, 313, 314, 0, 315, 14, 0, 0, 0, ! 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 316, 17, 0, 19, 0, 317, 318, 319, 20, ! 0, 320, 321, 322, 21, 323, 324, 0, 23, 0, ! 0, 0, 325, 326, 327, 328, 329, 26, 0, 0, ! 330, 269, 0, 0, 0, 331, 0, 0, 0, 0, ! 0, 332, 0, 0, 333, 0, 0, 0, 0, 0, ! 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 340, 268, 8, 9, ! 10, 0, 12, 312, 313, 314, 0, 315, 14, 0, ! 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 316, 17, 0, 19, 0, 317, 318, ! 319, 20, 0, 320, 321, 322, 21, 323, 324, 0, ! 23, 0, 0, 0, 325, 326, 327, 328, 329, 26, ! 0, 0, 28, 269, 0, 0, 0, 377, 0, 0, ! 0, 0, 0, 332, 0, 0, 333, 0, 0, 0, ! 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 340, 268, ! 8, 9, 10, 0, 12, 497, 313, 314, 0, 315, ! 14, 0, 0, 0, 0, 341, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 316, 17, 0, 19, 0, ! 317, 318, 319, 20, 0, 320, 321, 322, 21, 323, ! 324, 0, 23, 0, 0, 0, 325, 326, 327, 328, ! 329, 26, 0, 0, 28, 269, 0, 0, 0, 331, ! 0, 0, 0, 0, 0, 332, 0, 0, 333, 0, ! 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, 0, ! 340, 268, 8, 9, 10, 0, 12, 497, 313, 314, ! 0, 315, 14, 0, 0, 0, 0, 341, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 316, 17, 0, ! 19, 0, 317, 318, 319, 20, 0, 320, 321, 322, ! 21, 323, 324, 0, 23, 0, 0, 0, 325, 326, ! 327, 328, 329, 26, 0, 0, 28, 269, 631, 0, ! 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, ! 333, 0, 0, 0, 0, 0, 0, 0, 334, 335, ! 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 632, 268, 8, 9, 10, 0, 12, 497, ! 313, 314, 0, 315, 14, 0, 0, 0, 0, 341, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 316, ! 17, 0, 19, 0, 317, 318, 319, 20, 0, 320, ! 321, 322, 21, 323, 324, 0, 23, 0, 0, 0, ! 325, 326, 327, 328, 329, 26, 0, 0, 28, 269, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, ! 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, ! 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 340, 669, 268, 8, 9, 10, ! 0, 12, 497, 313, 314, 0, 315, 14, 0, 0, ! 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 316, 17, 0, 19, 0, 317, 318, 319, ! 20, 0, 320, 321, 322, 21, 323, 324, 0, 23, ! 0, 0, 0, 325, 326, 327, 328, 329, 26, 0, ! 0, 28, 269, 0, 0, 0, 377, 0, 0, 0, ! 0, 0, 332, 0, 0, 333, 0, 0, 0, 0, ! 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 340, 268, 8, ! 9, 10, 0, 12, 497, 313, 314, 0, 315, 14, ! 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 316, 17, 18, 19, 0, 317, ! 318, 319, 20, 0, 320, 321, 322, 21, 323, 324, ! 0, 23, 0, 0, 0, 325, 326, 327, 328, 329, ! 26, 0, 0, 28, 269, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 332, 0, 0, 617, 0, 0, ! 0, 0, 0, 0, 0, 334, 335, 618, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 619, ! 1296, 8, 9, 10, 0, 12, 497, 313, 314, 0, ! 315, 14, 0, 0, 0, 0, 341, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 316, 17, 0, 19, ! 0, 317, 318, 319, 20, 0, 320, 321, 322, 21, ! 323, 324, 0, 23, 0, 0, 0, 325, 326, 327, ! 328, 329, 26, 0, 0, 28, 269, 0, 0, 0, ! 377, 0, 0, 0, 0, 0, 332, 0, 0, 333, ! 0, 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, ! 0, 340, 146, 8, 9, 10, 0, 12, 312, 313, ! 314, 0, 315, 14, 0, 0, 0, 0, 341, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 316, 17, ! 18, 19, 0, 317, 318, 319, 20, 0, 320, 321, ! 322, 21, 323, 324, 0, 23, 0, 0, 0, 325, ! 326, 327, 328, 329, 26, 0, 0, 28, 29, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, ! 0, 1669, 0, 0, 0, 0, 0, 0, 0, 334, ! 335, 1670, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 1671, 268, 8, 9, 10, 0, 12, ! 497, 313, 314, 0, 315, 14, 0, 0, 0, 0, ! 341, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 316, 17, 0, 19, 0, 317, 318, 319, 20, 0, ! 320, 321, 322, 21, 323, 324, 0, 23, 0, 0, ! 0, 325, 326, 327, 328, 329, 26, 0, 0, 28, ! 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 332, 0, 0, 333, 0, 0, 0, 0, 0, 0, ! 0, 334, 335, 336, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 599, 268, 8, 9, 10, ! 0, 12, 497, 313, 314, 0, 315, 14, 0, 0, ! 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 316, 17, 0, 19, 0, 317, 318, 319, ! 20, 0, 320, 321, 322, 21, 323, 324, 0, 23, ! 0, 0, 0, 325, 326, 327, 328, 329, 26, 0, ! 0, 28, 269, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 332, 0, 0, 333, 0, 0, 0, 0, ! 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 601, 268, 8, ! 9, 10, 0, 12, 497, 313, 314, 0, 315, 14, ! 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 316, 17, 0, 19, 0, 317, ! 318, 319, 20, 0, 320, 321, 322, 21, 323, 324, ! 0, 23, 0, 0, 0, 325, 326, 327, 328, 329, ! 26, 0, 0, 28, 269, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 332, 0, 0, 333, 0, 0, ! 0, 0, 0, 0, 0, 334, 335, 336, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 1226, 0, 0, 341, 728, 729, 730, ! 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, ! 741, 742, 743, 744, 745, 746, 747, 748, 749, 1716, ! 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, ! 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, ! 748, 749, 728, 729, 730, 731, 732, 733, 734, 735, ! 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, ! 746, 747, 748, 749, 733, 734, 735, 736, 737, 738, ! 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, ! 749 }; ! static const short yycheck[] = { 4, ! 217, 4, 182, 23, 4, 183, 360, 181, 985, 730, ! 163, 366, 804, 197, 539, 416, 60, 83, 416, 168, ! 131, 4, 14, 156, 157, 416, 4, 416, 383, 139, ! 88, 36, 4, 36, 83, 785, 36, 4, 255, 629, ! 45, 387, 366, 251, 710, 45, 315, 316, 31, 32, ! 95, 45, 97, 36, 779, 60, 129, 259, 36, 383, ! 138, 139, 45, 471, 36, 225, 226, 45, 45, 36, ! 75, 138, 4, 45, 889, 1431, 891, 217, 45, 348, ! 456, 1493, 4, 88, 899, 151, 226, 92, 1, 45, ! 95, 308, 97, 4, 86, 1498, 494, 141, 143, 11, ! 368, 369, 45, 494, 36, 88, 1689, 112, 113, 11, ! 11, 3, 62, 45, 36, 476, 12, 64, 38, 111, ! 786, 60, 1720, 58, 906, 36, 1565, 55, 1, 76, ! 912, 25, 0, 27, 45, 489, 141, 525, 143, 183, ! 145, 141, 1498, 360, 34, 211, 500, 60, 76, 33, ! 1652, 64, 61, 55, 542, 423, 424, 1755, 141, 98, ! 110, 1744, 64, 141, 366, 61, 60, 172, 64, 141, ! 64, 176, 172, 156, 157, 1578, 176, 88, 183, 1358, ! 1359, 383, 176, 96, 76, 48, 142, 60, 48, 172, ! 110, 64, 197, 176, 172, 172, 1375, 109, 176, 176, ! 172, 110, 96, 9, 176, 49, 12, 109, 109, 176, ! 142, 1713, 1651, 109, 197, 623, 9, 7, 201, 202, ! 176, 1, 1578, 96, 27, 274, 110, 55, 31, 55, ! 141, 94, 95, 176, 94, 79, 64, 25, 64, 27, ! 58, 64, 48, 1025, 176, 60, 109, 182, 38, 109, ! 172, 66, 1655, 76, 0, 61, 48, 63, 64, 62, ! 66, 172, 12, 66, 256, 176, 156, 157, 158, 1246, ! 63, 77, 60, 79, 61, 1454, 64, 27, 803, 357, ! 60, 31, 48, 109, 1463, 1464, 197, 1466, 94, 95, ! 357, 48, 1695, 1043, 1650, 353, 1046, 407, 48, 1655, ! 4, 5, 94, 109, 309, 39, 1718, 110, 96, 66, ! 76, 61, 62, 203, 64, 464, 66, 109, 25, 49, ! 27, 55, 109, 45, 1673, 370, 399, 371, 94, 95, ! 1686, 4, 1735, 61, 76, 340, 1685, 94, 95, 1695, ! 62, 4, 5, 109, 94, 95, 34, 94, 353, 77, ! 705, 1101, 1102, 60, 58, 59, 361, 64, 511, 109, ! 62, 521, 522, 36, 182, 370, 371, 1092, 31, 529, ! 353, 371, 4, 5, 366, 508, 509, 221, 48, 1735, ! 425, 541, 522, 772, 4, 1734, 1168, 61, 371, 96, ! 25, 383, 55, 371, 48, 58, 59, 805, 1180, 371, ! 3, 4, 5, 6, 64, 94, 1585, 1586, 110, 72, ! 12, 416, 230, 94, 419, 761, 36, 49, 61, 82, ! 425, 1398, 798, 799, 94, 60, 58, 59, 1784, 64, ! 590, 94, 1214, 416, 1216, 109, 39, 40, 76, 42, ! 94, 95, 353, 711, 62, 3, 4, 5, 6, 109, ! 82, 62, 55, 458, 176, 58, 59, 76, 458, 61, ! 371, 96, 64, 25, 458, 27, 109, 94, 156, 157, ! 158, 61, 674, 62, 61, 458, 4, 5, 48, 61, ! 458, 458, 487, 418, 42, 490, 458, 90, 533, 494, ! 25, 540, 110, 48, 1160, 217, 540, 55, 60, 110, ! 58, 59, 64, 225, 226, 416, 1096, 108, 3, 4, ! 5, 494, 7, 8, 9, 203, 3, 4, 5, 109, ! 788, 49, 109, 48, 94, 508, 509, 109, 533, 48, ! 58, 59, 90, 255, 96, 540, 31, 1287, 1288, 94, ! 540, 55, 37, 64, 4, 5, 55, 458, 64, 9, ! 4, 486, 597, 488, 489, 76, 55, 540, 55, 1374, ! 55, 62, 76, 58, 59, 60, 31, 48, 540, 94, ! 95, 58, 59, 540, 61, 94, 95, 76, 3, 76, ! 64, 6, 36, 494, 109, 1, 308, 3, 4, 5, ! 109, 48, 597, 109, 599, 55, 601, 12, 58, 59, ! 418, 606, 607, 608, 609, 610, 31, 48, 666, 104, ! 105, 106, 72, 94, 619, 60, 48, 42, 508, 509, ! 510, 76, 82, 797, 629, 66, 987, 632, 48, 540, ! 112, 113, 48, 58, 59, 95, 48, 94, 360, 55, ! 3, 1166, 58, 59, 60, 61, 61, 72, 48, 64, ! 55, 66, 762, 94, 3, 4, 5, 82, 926, 769, ! 665, 666, 94, 95, 55, 90, 874, 875, 486, 94, ! 488, 489, 880, 64, 94, 95, 60, 109, 94, 684, ! 1035, 48, 94, 666, 502, 76, 691, 531, 4, 109, ! 94, 769, 1093, 511, 94, 1093, 189, 515, 420, 682, ! 683, 684, 1093, 695, 1093, 523, 866, 48, 691, 58, ! 59, 1035, 48, 55, 49, 1123, 198, 934, 48, 764, ! 36, 55, 906, 48, 48, 8, 9, 94, 912, 45, ! 48, 14, 55, 82, 76, 48, 458, 1, 55, 3, ! 4, 5, 58, 76, 60, 55, 3, 4, 5, 64, ! 770, 48, 60, 94, 37, 666, 64, 77, 94, 764, ! 826, 76, 1031, 46, 94, 48, 76, 489, 48, 94, ! 94, 95, 883, 684, 11, 27, 94, 95, 713, 31, ! 691, 94, 95, 803, 48, 109, 1311, 109, 1149, 1150, ! 109, 55, 1147, 48, 58, 59, 109, 94, 95, 521, ! 522, 58, 59, 4, 5, 14, 109, 529, 9, 61, ! 62, 94, 109, 22, 94, 95, 821, 1085, 48, 541, ! 508, 509, 510, 1147, 829, 141, 1351, 3, 4, 5, ! 94, 147, 48, 1035, 109, 827, 819, 820, 821, 94, ! 889, 1025, 891, 778, 48, 889, 829, 891, 897, 110, ! 899, 55, 896, 897, 55, 899, 172, 58, 59, 68, ! 176, 94, 907, 908, 94, 910, 182, 183, 590, 852, ! 853, 72, 76, 61, 62, 1236, 1237, 1688, 94, 55, ! 1033, 82, 58, 59, 889, 515, 891, 61, 62, 889, ! 94, 891, 897, 523, 899, 713, 98, 1251, 1709, 899, ! 55, 906, 907, 908, 1754, 910, 889, 912, 891, 64, ! 821, 1703, 62, 891, 230, 3, 899, 889, 829, 891, ! 129, 76, 889, 906, 891, 1775, 48, 899, 62, 912, ! 1651, 821, 899, 55, 61, 48, 1110, 61, 62, 829, ! 1208, 1209, 1210, 4, 5, 1147, 155, 3, 4, 5, ! 77, 76, 79, 66, 76, 1163, 1164, 1165, 95, 1320, ! 778, 896, 4, 5, 55, 55, 95, 3, 4, 5, ! 6, 64, 94, 64, 64, 61, 61, 62, 889, 984, ! 891, 94, 1135, 988, 1168, 76, 76, 1348, 899, 112, ! 76, 77, 714, 79, 55, 906, 1180, 58, 59, 1132, ! 1133, 912, 58, 59, 60, 48, 42, 49, 1141, 1142, ! 94, 72, 55, 49, 1019, 94, 58, 59, 4, 5, ! 1025, 82, 58, 59, 1029, 3, 4, 5, 6, 1390, ! 1214, 9, 1216, 76, 95, 517, 94, 246, 247, 1760, ! 82, 76, 1025, 1035, 1027, 1028, 1029, 45, 892, 893, ! 259, 94, 76, 31, 90, 371, 778, 55, 902, 61, ! 62, 59, 48, 76, 42, 3, 4, 5, 76, 55, ! 48, 1137, 58, 59, 55, 85, 86, 55, 896, 61, ! 58, 59, 1443, 64, 1252, 1253, 72, 1255, 1093, 11, ! 1095, 1096, 61, 62, 72, 76, 82, 27, 7, 8, ! 9, 31, 418, 94, 82, 14, 85, 86, 94, 95, ! 1093, 49, 90, 77, 1025, 79, 94, 95, 1029, 1480, ! 58, 59, 31, 332, 606, 1278, 1192, 1171, 37, 1134, ! 61, 61, 62, 821, 4, 5, 66, 46, 1143, 109, ! 1408, 829, 458, 1192, 866, 61, 62, 1152, 109, 1132, ! 1133, 1134, 1201, 62, 636, 1147, 109, 1201, 1141, 1142, ! 1143, 61, 62, 1168, 109, 374, 76, 201, 202, 1322, ! 486, 487, 488, 489, 55, 1180, 109, 386, 494, 61, ! 62, 663, 1093, 61, 62, 1168, 502, 669, 58, 59, ! 399, 3, 4, 5, 1602, 1593, 1201, 1180, 110, 515, ! 76, 1201, 1593, 685, 55, 76, 110, 523, 109, 1214, ! 1618, 1216, 934, 64, 109, 1260, 4, 5, 1201, 109, ! 1574, 1226, 66, 1134, 540, 76, 921, 922, 923, 1201, ! 66, 1214, 1143, 1216, 1201, 1643, 1171, 49, 4, 5, ! 112, 109, 1132, 1133, 1134, 27, 58, 59, 730, 76, ! 76, 1141, 1142, 1143, 55, 1260, 76, 1168, 3, 4, ! 5, 6, 112, 112, 9, 1673, 109, 55, 109, 1180, ! 58, 59, 82, 83, 84, 85, 86, 1685, 1283, 3, ! 4, 5, 6, 49, 72, 9, 31, 109, 109, 3, ! 1201, 1311, 58, 59, 82, 55, 8, 42, 1281, 1282, ! 1283, 94, 48, 1214, 62, 1216, 110, 31, 61, 66, ! 55, 1129, 110, 58, 59, 1723, 82, 1135, 42, 94, ! 1369, 55, 1327, 62, 48, 1374, 1734, 72, 537, 1683, ! 1374, 55, 76, 37, 58, 59, 66, 82, 66, 66, ! 1184, 109, 1325, 1326, 1327, 90, 1190, 1191, 72, 94, ! 1194, 1195, 62, 1171, 1198, 109, 31, 32, 82, 34, ! 60, 1344, 1345, 3, 4, 5, 90, 64, 109, 1374, ! 94, 95, 1283, 66, 1374, 66, 869, 112, 77, 1, ! 61, 3, 4, 5, 6, 60, 8, 62, 4, 5, ! 109, 1374, 1572, 68, 1574, 1573, 109, 713, 61, 77, ! 109, 109, 1374, 66, 109, 4, 5, 1374, 1769, 8, ! 9, 8, 9, 76, 77, 14, 1327, 14, 58, 59, ! 42, 77, 631, 77, 3, 4, 5, 49, 77, 28, ! 109, 30, 109, 55, 64, 1440, 58, 59, 37, 55, ! 37, 64, 58, 59, 1132, 1133, 1134, 46, 61, 46, ! 3, 4, 5, 1141, 1142, 1143, 55, 109, 32, 58, ! 59, 60, 778, 1374, 64, 674, 1683, 109, 90, 503, ! 109, 864, 506, 148, 508, 509, 55, 112, 153, 58, ! 59, 156, 157, 158, 110, 109, 520, 95, 109, 90, ! 76, 3, 4, 5, 112, 94, 48, 1502, 109, 1502, ! 109, 1506, 1502, 1677, 1322, 58, 59, 112, 183, 64, ! 992, 109, 905, 109, 189, 109, 109, 1666, 911, 1502, ! 110, 1504, 1505, 1506, 1502, 109, 201, 202, 203, 1347, ! 1502, 62, 110, 61, 109, 1502, 1669, 1670, 61, 66, ! 61, 109, 217, 55, 1026, 64, 58, 59, 1366, 109, ! 225, 226, 4, 5, 4, 5, 8, 9, 94, 94, ! 1565, 770, 14, 110, 94, 1565, 109, 109, 1573, 94, ! 779, 112, 8, 889, 148, 891, 28, 109, 30, 153, ! 896, 897, 1565, 899, 66, 37, 112, 1565, 1593, 109, ! 55, 1502, 267, 1565, 46, 1506, 48, 64, 1565, 49, ! 109, 810, 1751, 55, 109, 1754, 58, 59, 58, 59, ! 1593, 109, 109, 109, 7, 8, 9, 1461, 1462, 109, ! 72, 14, 109, 1772, 109, 109, 1775, 1020, 202, 1022, ! 82, 48, 82, 109, 112, 48, 109, 1572, 31, 1574, ! 1645, 109, 94, 95, 37, 109, 1651, 1652, 97, 33, ! 109, 1651, 109, 46, 1565, 109, 109, 112, 109, 3, ! 4, 5, 1645, 7, 94, 340, 1671, 64, 1651, 1652, ! 64, 88, 89, 1651, 62, 92, 93, 94, 95, 1651, ! 1173, 1174, 1593, 1688, 1651, 1688, 1669, 1670, 1688, 1507, ! 62, 62, 9, 267, 38, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, 1709, 1688, 1709, 1200, 1713, 1709, ! 1688, 55, 1205, 16, 58, 59, 1688, 3, 4, 5, ! 110, 1688, 60, 62, 94, 94, 1709, 3, 4, 5, ! 1713, 1709, 62, 66, 1645, 55, 94, 1709, 17, 1629, ! 1651, 1652, 1709, 108, 419, 420, 4, 5, 103, 1684, ! 3, 4, 5, 6, 1572, 109, 1574, 109, 65, 55, ! 435, 1579, 62, 438, 82, 83, 84, 85, 86, 444, ! 445, 446, 58, 59, 1256, 450, 11, 1688, 109, 1669, ! 1670, 1671, 58, 59, 1628, 819, 820, 45, 62, 42, ! 109, 62, 62, 3, 4, 5, 49, 55, 1709, 62, ! 58, 59, 1713, 94, 61, 58, 59, 66, 109, 0, ! 112, 113, 487, 1129, 489, 62, 850, 851, 852, 853, ! 1213, 62, 1215, 62, 858, 109, 109, 0, 503, 82, ! 62, 506, 62, 508, 509, 510, 62, 90, 2, 514, ! 147, 3, 4, 5, 0, 520, 521, 522, 58, 59, ! 525, 177, 1574, 36, 529, 1171, 163, 1616, 1093, 762, ! 176, 435, 1706, 458, 438, 1676, 1684, 542, 172, 1078, ! 897, 1364, 1365, 1311, 1367, 1368, 450, 1370, 99, 246, ! 145, 1274, 1601, 1092, 1784, 1201, 80, 81, 82, 83, ! 84, 85, 86, 55, 1078, 197, 58, 59, 60, 311, ! 3, 4, 5, 6, 1386, 1387, 1388, 1389, 810, 720, ! 34, 1351, 1166, 220, 1396, 3, 4, 5, 6, 1201, ! 897, 228, 250, 1371, 599, 722, 601, 208, 31, 503, ! 1049, 357, 506, 666, 3, 4, 5, 6, 245, 42, ! 129, 1629, 617, 618, 619, 48, 520, 1498, 1723, 1432, ! 1703, 1700, 55, 1753, 42, 58, 59, 632, 1451, 1452, ! 1440, 1683, 1355, 838, -1, -1, -1, 1360, -1, 72, ! 58, 59, -1, 42, -1, 3, 4, 5, 6, 82, ! 49, 1669, 1670, 1671, -1, -1, -1, 90, -1, 58, ! 59, 94, 95, 7, 8, 9, 3, 4, 5, 6, ! 14, 3, 4, 5, 6, -1, -1, 682, 683, 684, ! -1, -1, -1, 82, 42, -1, 691, 31, -1, 1412, ! 1502, 90, -1, 37, 1517, 1518, 1519, 55, 1237, 31, ! 58, 59, 46, 157, 158, 42, 64, -1, 340, 714, ! 42, -1, -1, -1, 72, -1, 48, -1, 55, -1, ! 1366, 58, 59, 55, 82, 1371, 58, 59, 1374, -1, ! -1, -1, 90, -1, -1, 72, 94, -1, -1, -1, ! 72, 3, 4, 5, 6, 82, 1558, 1470, 1471, 203, ! 82, -1, -1, 90, -1, -1, -1, 94, 90, 1582, ! 1583, -1, 94, 95, 1487, -1, 1130, 1131, 1132, 1133, ! 3, 4, 5, 778, 779, 1139, -1, 1141, 1142, -1, ! 42, 1320, -1, -1, 416, -1, -1, 1510, 1511, 1153, ! 1154, 1155, -1, 55, -1, -1, 58, 59, -1, 1611, ! 62, -1, 64, 1526, 1527, -1, -1, -1, -1, -1, ! 72, -1, -1, -1, 819, 820, 821, -1, -1, -1, ! 82, -1, -1, -1, 829, 58, 59, -1, 90, 466, ! 4, 5, 94, 1645, -1, 9, -1, -1, 843, 1651, ! 1652, -1, -1, -1, -1, 850, 851, 852, 853, 854, ! -1, -1, -1, 858, -1, -1, -1, 31, -1, -1, ! -1, 866, 494, -1, 869, 502, 3, 4, 5, 6, ! 7, 8, 9, -1, 511, -1, 1688, 14, 359, 360, ! 361, 55, -1, -1, 58, 59, 340, -1, -1, 1428, ! -1, 528, 897, -1, 31, -1, -1, 1709, 72, -1, ! 37, 1713, 1725, -1, -1, 42, -1, -1, 82, 46, ! -1, 48, -1, -1, -1, -1, 820, 1729, 55, -1, ! 94, 58, 59, -1, -1, -1, 1572, 1573, 1574, 3, ! 4, 5, 6, -1, -1, 72, -1, -1, 1750, -1, ! 3, 4, 5, 6, -1, 82, 850, 851, 1760, -1, ! -1, -1, -1, 90, 858, -1, -1, 94, 95, 1323, ! 1324, 1325, 1326, -1, -1, -1, 1330, 599, 42, 601, ! -1, -1, -1, -1, 606, 607, 608, 609, 610, 42, ! 1344, 1345, -1, -1, 58, 59, 49, 619, -1, -1, ! -1, 445, 446, -1, -1, 58, 59, -1, -1, 1538, ! 632, -1, -1, 1008, -1, 486, 1011, 488, 489, 490, ! -1, 3, 4, 5, 6, -1, 90, 9, 1023, 82, ! 1559, 1560, 1027, 1028, 1029, -1, -1, 90, 197, -1, ! -1, 4, 5, 665, -1, -1, 9, -1, 1684, 31, ! 3, 4, 5, -1, 7, 8, 9, -1, -1, -1, ! 42, -1, 684, -1, -1, 509, 510, -1, 31, 691, ! -1, -1, -1, 55, 4, 5, 58, 59, -1, 9, ! -1, 1435, 1436, -1, 1438, -1, 1615, 1616, -1, -1, ! 72, -1, 55, -1, -1, 58, 59, 1092, -1, -1, ! 82, 31, -1, -1, -1, 58, 59, -1, 90, 72, ! -1, -1, 94, 4, -1, -1, -1, -1, 48, 82, ! -1, -1, -1, 14, -1, 55, -1, -1, 58, 59, ! -1, 94, 23, 24, 1663, 1130, 1131, 1132, 1133, 1134, ! 31, 32, 72, 34, 1139, 36, 1141, 1142, 1143, -1, ! 1504, 1505, 82, -1, 45, 599, -1, 601, 1153, 1154, ! 1155, 7, 8, 9, 94, 95, -1, 58, 14, 60, ! -1, -1, -1, -1, 618, 619, -1, 68, 1173, 1174, ! -1, -1, -1, -1, 75, 31, -1, -1, 632, -1, ! -1, 37, -1, -1, -1, -1, -1, 88, -1, 821, ! 46, 92, -1, -1, 95, 1200, 97, 829, -1, -1, ! 1205, -1, -1, -1, -1, -1, 62, 80, 81, 82, ! 83, 84, 85, 86, -1, 83, -1, 3, 4, 5, ! -1, 7, 8, 9, -1, -1, 1130, 1131, -1, 3, ! 4, 5, 6, -1, -1, 1139, -1, 691, -1, -1, ! 141, 109, 143, -1, 145, 31, 147, 148, -1, -1, ! -1, 37, 153, -1, -1, 156, 157, 158, -1, 3, ! 4, 5, 6, -1, -1, 9, -1, -1, 42, -1, ! 138, 172, 58, 59, 906, 176, 1281, 1282, 1283, -1, ! 912, 182, 183, 151, 58, 59, -1, 31, -1, -1, ! -1, -1, 3, 4, 5, 6, -1, 778, 42, -1, ! 201, 202, 203, -1, 48, 1669, 1670, -1, 477, -1, ! -1, 55, -1, -1, 58, 59, 90, -1, 1323, 1324, ! 1325, 1326, 1327, -1, -1, 1330, -1, -1, 72, 230, ! -1, 42, -1, -1, -1, -1, -1, 48, 82, 1344, ! 1345, 1346, -1, 211, 55, -1, 90, 58, 59, -1, ! 94, 95, 984, -1, -1, -1, -1, -1, -1, 1364, ! 1365, 72, 1367, 1368, -1, 1370, 267, 821, -1, -1, ! 1007, 82, -1, -1, -1, 829, -1, 1014, 246, 90, ! -1, -1, -1, 94, 95, -1, -1, 1019, -1, 843, ! -1, -1, -1, 1025, 4, 5, 1033, 1029, -1, 853, ! 854, -1, -1, -1, -1, -1, 274, -1, 309, 310, ! -1, -1, -1, 4, 5, -1, -1, -1, 9, 1323, ! 1324, 31, -1, 331, -1, -1, 1330, -1, -1, 598, ! 1435, 1436, -1, 1438, 3, 4, 5, 6, 48, -1, ! 31, -1, -1, -1, -1, 55, 1451, 1452, 58, 59, ! -1, -1, 353, 934, -1, -1, 357, 48, 359, 360, ! 361, 1093, 72, 1095, 55, 366, -1, 58, 59, 370, ! 371, -1, 82, 42, -1, -1, -1, -1, -1, -1, ! 49, 72, 383, -1, 94, 95, -1, 656, -1, 58, ! 59, 82, 1129, 662, -1, 664, 665, 365, 1135, 1504, ! 1505, 1506, 1134, 94, 95, -1, 407, -1, -1, -1, ! -1, 1143, 1517, 1518, 1519, 416, -1, 418, 419, -1, ! 1152, 90, -1, -1, 425, -1, 1007, -1, -1, 698, ! -1, -1, -1, 1014, 435, -1, 1168, 438, 707, -1, ! -1, -1, -1, -1, 3, 4, 5, 6, 1180, 450, ! -1, -1, 1033, -1, -1, -1, -1, 458, -1, -1, ! 428, -1, 4, 5, -1, -1, 8, 9, 1573, 1574, ! -1, -1, 14, -1, 1028, 1029, -1, 1582, 1583, -1, ! -1, -1, 1214, 42, 1216, 486, 487, 488, 489, 490, ! 49, -1, -1, 494, 1226, 37, -1, -1, -1, 58, ! 59, 502, 503, -1, 46, 506, 48, 508, 509, 510, ! 511, -1, -1, 55, 515, -1, 58, 59, -1, 520, ! -1, -1, 523, 82, 1629, -1, -1, -1, -1, 197, ! 72, 90, 533, -1, -1, -1, -1, -1, 539, 540, ! 82, 1278, -1, -1, -1, -1, -1, -1, 1129, -1, ! -1, 1283, 94, 95, 1135, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, 1669, 1670, 1671, 75, 76, 537, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 1133, ! 1134, -1, -1, -1, -1, 1322, -1, -1, 1142, 1143, ! -1, -1, -1, -1, -1, 1327, 597, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 607, 608, 609, 610, ! 1347, -1, -1, -1, -1, 3, 4, 5, 6, -1, ! 1725, -1, -1, -1, -1, 593, 634, 635, 629, 637, ! 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, ! 648, 649, 650, 651, 652, 653, 654, -1, -1, -1, ! -1, -1, 4, 5, 42, 7, 8, 9, -1, -1, ! 12, 49, 14, -1, -1, 666, -1, 668, -1, -1, ! 58, 59, -1, -1, -1, -1, 28, -1, 30, 31, ! -1, 682, 683, 684, -1, 37, -1, -1, -1, -1, ! 691, -1, -1, -1, 46, -1, 48, 1278, -1, -1, ! -1, -1, 90, 55, 705, -1, 58, 59, 1440, -1, ! -1, 679, 713, -1, -1, -1, -1, -1, -1, 988, ! 72, -1, -1, -1, -1, -1, 694, -1, 1282, 1283, ! 82, -1, -1, 1002, -1, 1004, -1, 1006, -1, -1, ! -1, 1322, 94, 95, -1, -1, -1, -1, 3, 4, ! 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, ! -1, 762, -1, 764, -1, -1, -1, -1, -1, 770, ! 1507, -1, 1326, 1327, 1506, -1, 31, 778, 779, -1, ! -1, -1, 37, -1, -1, -1, -1, 42, -1, -1, ! -1, 46, -1, 48, -1, -1, -1, -1, -1, -1, ! 55, -1, 803, 58, 59, -1, -1, -1, -1, 477, ! -1, 1080, -1, -1, -1, -1, -1, 72, 819, 820, ! 821, -1, -1, -1, -1, -1, -1, 82, 829, -1, ! -1, -1, -1, -1, -1, 90, -1, -1, -1, 94, ! 95, -1, 1579, -1, -1, -1, -1, -1, 1117, 850, ! 851, 852, 853, 854, -1, -1, -1, 858, 826, -1, ! -1, 1593, -1, 3, 4, 5, 6, -1, -1, 9, ! -1, -1, -1, 3, 4, 5, 6, -1, -1, -1, ! -1, -1, -1, 4, 5, 886, -1, 855, 889, -1, ! 891, 31, -1, -1, -1, 896, 897, -1, 899, -1, ! -1, -1, 42, -1, -1, 906, 907, 908, 48, 910, ! 31, 912, 42, -1, -1, 55, -1, -1, 58, 59, ! 921, 922, 923, -1, -1, -1, 1507, 48, 58, 59, ! 598, -1, 72, 934, 55, -1, -1, 58, 59, 1671, ! -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, ! 90, 72, -1, -1, 94, 95, 924, 4, 5, -1, ! 90, 82, 9, -1, 3, 4, 5, 6, -1, -1, ! 9, -1, -1, 94, 95, -1, -1, -1, -1, -1, ! -1, -1, -1, 984, 31, -1, -1, -1, 656, -1, ! -1, -1, 31, -1, 662, -1, 664, 665, 1579, -1, ! -1, -1, -1, 42, -1, -1, 1007, 1008, 55, 48, ! 1011, 58, 59, 1014, -1, -1, 55, -1, 1019, 58, ! 59, -1, 1023, 691, 1025, 72, 1027, 1028, 1029, -1, ! 698, -1, 1033, 72, 1035, 82, -1, -1, -1, 707, ! -1, -1, -1, 82, 1313, -1, 1315, 94, 1317, -1, ! -1, 90, -1, -1, -1, 94, 95, 3, 4, 5, ! 6, -1, -1, 9, -1, -1, 1034, -1, 1036, 71, ! 72, 73, 74, 75, 76, 1629, 78, 79, 80, 81, ! 82, 83, 84, 85, 86, 31, -1, -1, -1, -1, ! -1, 1099, 1093, -1, 1095, 1096, 42, 682, 683, -1, ! -1, -1, 48, -1, -1, -1, -1, -1, -1, 55, ! -1, -1, 58, 59, -1, -1, 1670, 1671, 3, 4, ! 5, 6, -1, -1, -1, -1, 72, -1, 1129, 1130, ! 1131, 1132, 1133, 1134, 1135, -1, 82, -1, 1139, -1, ! 1141, 1142, 1143, -1, 90, -1, 1147, -1, 94, 95, ! 1419, 1152, 1153, 1154, 1155, -1, -1, 42, -1, -1, ! -1, 829, -1, -1, 49, 1166, -1, 1168, -1, 1137, ! 1171, -1, 1140, 58, 59, 843, -1, -1, -1, 1180, ! -1, -1, 1, -1, 3, 4, 5, 6, 7, 8, ! 9, -1, -1, -1, -1, 14, -1, 82, -1, -1, ! 1201, -1, -1, -1, -1, 90, -1, -1, -1, 28, ! -1, 30, 31, 1214, -1, 1216, -1, -1, 37, -1, ! -1, -1, -1, 42, 1192, 1226, -1, 46, -1, -1, ! 49, -1, 1240, -1, 819, 820, 55, -1, -1, 58, ! 59, -1, -1, 62, -1, -1, -1, -1, -1, -1, ! -1, 1252, 1253, 72, 1255, -1, -1, -1, -1, 1260, ! -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, ! -1, 90, -1, -1, -1, 94, 4, 1278, -1, -1, ! 1281, 1282, 1283, 74, 75, 76, 14, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 24, -1, -1, -1, ! -1, -1, -1, 31, 32, -1, 34, -1, 36, -1, ! 1311, -1, 3, 4, 5, 6, -1, 45, -1, -1, ! 988, 1322, 1323, 1324, 1325, 1326, 1327, -1, -1, 1330, ! 58, -1, 60, -1, 1002, -1, 1004, -1, 1006, -1, ! 68, -1, -1, 1344, 1345, 1346, 1347, 75, -1, 92, ! 1351, 42, 95, -1, 97, -1, -1, -1, 86, -1, ! 88, -1, -1, -1, 55, 1366, -1, 58, 59, -1, ! 1371, 62, -1, 1374, -1, -1, -1, -1, -1, -1, ! -1, 72, -1, 111, -1, -1, -1, -1, -1, -1, ! -1, 82, -1, -1, -1, -1, -1, -1, -1, 90, ! 143, 1369, 145, 94, -1, -1, -1, -1, -1, 4, ! 5, 139, 1080, 141, 9, -1, -1, 4, 5, 147, ! 148, 8, 9, 1008, 152, 153, 1011, 14, 156, 157, ! 158, -1, -1, -1, 1435, 1436, 31, 1438, 1023, 1440, ! -1, -1, 1027, 1028, 172, -1, -1, -1, 176, 1117, ! 37, -1, -1, 48, 182, 183, -1, -1, -1, 46, ! 55, 48, -1, 58, 59, -1, -1, -1, 55, 1437, ! -1, 58, 59, 201, 202, 203, -1, 72, -1, -1, ! -1, -1, -1, -1, -1, 72, -1, 82, -1, -1, ! -1, -1, -1, -1, -1, 82, -1, -1, -1, 94, ! 95, -1, 230, 1504, 1505, 1506, 1507, 94, 95, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, 247, ! -1, 14, -1, -1, -1, -1, -1, -1, 256, -1, ! -1, 3, 4, 5, 6, 28, -1, 30, 31, 267, ! -1, -1, -1, -1, 37, 1130, 1131, 1132, 1133, 42, ! -1, -1, -1, 46, 1139, 48, 1141, 1142, -1, 31, ! 1561, -1, 55, -1, -1, 58, 59, -1, -1, -1, ! 42, 1572, 1573, 1574, 317, 318, 48, -1, 1579, 72, ! -1, 309, 310, 55, -1, -1, 58, 59, 331, 82, ! 333, -1, 1593, 336, -1, -1, 339, 90, -1, 342, ! 72, 94, 95, 346, -1, -1, -1, -1, -1, -1, ! 82, 354, -1, -1, -1, -1, -1, -1, 90, -1, ! -1, -1, 94, 95, -1, 353, -1, 370, 1629, 357, ! -1, 359, 360, 361, -1, -1, -1, 3, 4, 5, ! 6, -1, -1, 371, -1, 1313, -1, 1315, -1, 1317, ! -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, ! -1, -1, 9, -1, -1, 31, -1, -1, 1669, 1670, ! 1671, -1, -1, -1, -1, -1, 42, -1, -1, 407, ! -1, -1, 425, 1684, 31, -1, -1, -1, 416, 55, ! 418, 419, 58, 59, -1, 42, 1281, 1282, 3, 4, ! 5, 6, -1, -1, 9, -1, 72, 435, 55, -1, ! 438, 58, 59, -1, -1, -1, 82, 3, 4, 5, ! 6, -1, 450, -1, 90, 72, 31, -1, 94, -1, ! 458, -1, -1, -1, -1, 82, -1, 42, 1323, 1324, ! 1325, 1326, -1, 90, -1, 1330, -1, 94, -1, -1, ! 55, 1419, -1, 58, 59, -1, 42, -1, 486, 487, ! 488, 489, 490, -1, -1, -1, 494, 72, -1, 55, ! -1, -1, 58, 59, 502, 503, 62, 82, 506, -1, ! 508, 509, 510, 511, -1, 90, 72, 515, -1, 94, ! 533, -1, 520, -1, -1, 523, 82, -1, -1, -1, ! -1, -1, -1, -1, 90, -1, -1, -1, 94, -1, ! -1, -1, 540, -1, -1, 276, 277, 278, 279, 280, ! 281, -1, 283, 284, 285, 286, 287, 288, 289, 290, ! 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, ! 301, 302, 303, 304, -1, 306, -1, -1, -1, -1, ! 1435, 1436, -1, 1438, 597, 75, 76, 77, 78, 79, ! 80, 81, 82, 83, 84, 85, 86, 595, -1, -1, ! -1, -1, -1, -1, 617, 618, -1, -1, -1, 607, ! 608, 609, 610, -1, -1, -1, 629, 3, 4, 5, ! 6, 634, 635, -1, 637, 638, 639, 640, 641, 642, ! 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, ! 653, 654, -1, -1, 3, 4, 5, 6, -1, 1504, ! 1505, -1, -1, 39, 40, -1, 42, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 666, 55, ! 668, -1, 58, 59, -1, -1, -1, -1, -1, -1, ! 39, 40, 680, 42, 682, 683, 684, -1, -1, -1, ! -1, 1629, -1, 691, -1, -1, 55, 695, -1, 58, ! 59, -1, -1, -1, 1, -1, 3, 4, 5, 6, ! 7, 8, 9, 10, 11, 713, 13, 14, 15, -1, ! 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ! 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, ! 37, -1, 39, 40, 41, 42, 43, 44, 45, 46, ! 47, 764, -1, 50, 51, 52, 53, 54, 55, -1, ! -1, 58, 59, 60, 762, 62, 63, -1, -1, -1, ! -1, 769, 69, 4, 5, 72, -1, -1, 9, -1, ! 778, 779, -1, 80, 81, 82, -1, 3, 4, 5, ! 6, 88, 89, 90, -1, -1, -1, 94, -1, 96, ! 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 110, 111, -1, -1, 48, -1, -1, ! -1, 819, 820, 821, 55, -1, 42, 58, 59, 827, ! -1, 829, -1, 49, 565, 4, 5, -1, 7, 8, ! 9, 72, 58, 59, -1, 14, -1, -1, -1, -1, ! -1, 82, 850, 851, 852, 853, 854, 588, -1, 28, ! 858, 30, 31, 94, 95, 596, 82, -1, 37, -1, ! -1, -1, -1, -1, 90, -1, -1, 46, 4, 5, ! 49, -1, -1, 9, -1, -1, 55, -1, 886, 58, ! 59, 889, -1, 891, 907, 908, -1, 910, 896, 897, ! -1, 899, -1, -1, -1, 31, -1, -1, 906, 3, ! 4, 5, 6, 1, 912, 3, 4, 5, 6, 7, ! 8, 9, 48, 921, 922, 923, 14, -1, -1, 55, ! -1, -1, 58, 59, -1, -1, 934, -1, -1, -1, ! 28, -1, 30, 31, 32, -1, 72, -1, 42, 37, ! 38, -1, -1, -1, 42, 49, 82, -1, 46, 47, ! -1, 49, -1, -1, 58, 59, -1, 55, 94, 95, ! 58, 59, -1, -1, 62, -1, 64, -1, -1, -1, ! -1, -1, -1, 996, 72, -1, 984, -1, 82, -1, ! 4, 5, -1, -1, 82, 9, 90, -1, -1, -1, ! -1, -1, 90, -1, -1, -1, 94, -1, -1, 1007, ! 1008, -1, -1, 1011, 1027, 1028, 1014, 31, -1, -1, ! -1, 1019, 110, -1, -1, 1023, -1, 1025, -1, 1027, ! 1028, 1029, -1, -1, 48, 1033, -1, 1035, -1, -1, ! -1, 55, -1, -1, 58, 59, -1, -1, -1, -1, ! -1, 3, 4, 5, 6, -1, -1, 9, 72, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 82, 1, ! -1, 3, 4, 5, 6, 7, 8, 9, -1, 31, ! 94, 95, 14, 1096, -1, -1, 1099, -1, -1, -1, ! 42, -1, -1, -1, -1, 1093, 28, 1095, 30, 31, ! 32, -1, -1, 55, -1, 37, 58, 59, -1, -1, ! 42, -1, -1, -1, 46, -1, -1, 49, -1, -1, ! 72, -1, -1, 55, -1, -1, 58, 59, 1141, 1142, ! 82, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 90, -1, ! 72, 1139, 94, 1141, 1142, 1143, -1, -1, -1, 1147, ! 82, -1, -1, -1, 1152, 1153, 1154, 1155, 90, -1, ! -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, ! 1168, -1, -1, 1171, 3, 4, 5, 6, 7, 8, ! 9, -1, 1180, 12, -1, 14, 917, 918, -1, -1, ! -1, -1, -1, -1, -1, 1193, -1, -1, -1, 28, ! -1, 30, 31, 1201, -1, -1, -1, -1, 37, -1, ! -1, -1, -1, 42, -1, -1, 1214, 46, 1216, 48, ! -1, -1, -1, -1, -1, -1, 55, 1240, 1226, 58, ! 59, -1, -1, -1, -1, -1, 4, 5, -1, 7, ! 8, 9, -1, 72, 12, 1258, 14, 1260, -1, -1, ! -1, -1, -1, 82, 1252, 1253, -1, 1255, -1, -1, ! 28, 90, 30, 31, -1, 94, 95, -1, -1, 37, ! -1, -1, -1, -1, -1, -1, -1, 4, 46, -1, ! 1278, -1, -1, 1281, 1282, 1283, -1, 55, -1, -1, ! 58, 59, -1, -1, -1, -1, 3, 4, 5, 6, ! -1, -1, -1, -1, 31, 32, -1, 34, -1, 36, ! -1, 3, 4, 5, 6, 7, 8, 9, 45, -1, ! -1, -1, 14, -1, 1322, 1323, 1324, 1325, 1326, 1327, ! -1, 58, 1330, 60, -1, 42, 28, -1, 30, 31, ! 32, -1, 49, -1, -1, 37, 1344, 1345, 1346, 1347, ! 42, 58, 59, -1, 46, -1, 83, 49, -1, 86, ! -1, -1, -1, 55, -1, -1, 58, 59, 1366, -1, ! -1, -1, -1, 1371, -1, 82, 1374, -1, -1, -1, ! 72, -1, -1, 90, -1, -1, -1, -1, -1, -1, ! 82, -1, -1, -1, -1, -1, -1, -1, 90, -1, ! -1, -1, 94, -1, -1, -1, 98, -1, -1, -1, ! -1, 138, 139, -1, 141, -1, -1, -1, -1, -1, ! 147, 148, -1, -1, 151, 152, 153, -1, -1, 156, ! 157, 158, -1, -1, -1, -1, 163, 1435, 1436, -1, ! 1438, -1, 1440, -1, -1, 172, -1, -1, -1, 176, ! -1, -1, -1, -1, -1, 182, 183, -1, 3, 4, ! 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, ! -1, -1, -1, -1, 201, 202, 203, -1, -1, -1, ! -1, -1, -1, 28, 211, 30, 31, -1, -1, -1, ! -1, -1, 37, -1, -1, -1, -1, 42, -1, -1, ! -1, 46, -1, 230, -1, -1, 1504, 1505, 1506, 1507, ! 55, -1, -1, 58, 59, -1, -1, 62, -1, 69, ! 70, 71, 72, 73, 74, 75, 76, 72, 78, 79, ! 80, 81, 82, 83, 84, 85, 86, 82, -1, -1, ! 267, -1, -1, -1, -1, 90, -1, 274, -1, 94, ! -1, -1, 1565, 1, -1, 3, 4, 5, 6, 7, ! 8, 9, -1, -1, -1, -1, 14, 4, 5, -1, ! -1, 8, 9, -1, 1572, 1573, 1574, 14, -1, -1, ! 28, 1579, 30, 31, 32, -1, -1, -1, -1, 37, ! 38, 28, -1, 30, 42, 1593, -1, -1, 46, 47, ! 37, 49, -1, -1, -1, -1, -1, 55, -1, 46, ! 58, 59, -1, 340, 62, -1, 64, -1, 55, -1, ! -1, 58, 59, -1, 72, -1, -1, -1, -1, -1, ! 357, 1629, -1, -1, 82, -1, -1, -1, 365, -1, ! -1, -1, 90, -1, 371, -1, 94, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 1669, 1670, -1, -1, ! -1, -1, 110, -1, -1, -1, -1, -1, -1, -1, ! -1, 1669, 1670, 1671, 4, 5, -1, -1, 8, 9, ! 407, -1, -1, -1, 14, -1, 1684, -1, -1, -1, ! -1, 418, -1, -1, -1, -1, -1, -1, 28, -1, ! 30, 428, -1, -1, -1, -1, -1, 37, 435, -1, ! -1, 438, -1, -1, -1, -1, 46, 444, 445, 446, ! -1, -1, -1, 450, -1, 55, -1, -1, 58, 59, ! 85, 458, 73, 74, 75, 76, 77, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 3, 4, 5, 6, ! 7, 8, 9, -1, -1, 12, -1, 14, -1, 486, ! 487, 488, 489, -1, 94, -1, -1, 494, -1, -1, ! -1, 28, -1, 30, 31, 502, 503, -1, -1, 506, ! 37, 508, 509, 510, 511, 42, -1, -1, 515, 46, ! -1, 48, 34, 520, -1, -1, 523, -1, 55, -1, ! -1, 58, 59, -1, -1, -1, -1, -1, -1, -1, ! -1, 166, -1, 540, -1, 72, 58, -1, -1, -1, ! -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, ! -1, -1, -1, 90, -1, -1, -1, 94, 95, -1, ! -1, 4, -1, -1, 199, 65, 66, 67, 68, 69, ! 70, 71, 72, 73, 74, 75, 76, 212, 78, 79, ! 80, 81, 82, 83, 84, 85, 86, -1, 31, 32, ! -1, 34, 599, 36, 601, 4, 5, -1, 7, 8, ! 9, -1, 45, 12, -1, 14, -1, -1, -1, -1, ! 617, 618, 619, -1, -1, 58, -1, 60, -1, 28, ! -1, 30, 31, -1, -1, 632, -1, -1, 37, -1, ! -1, -1, -1, -1, 156, 157, 158, 46, -1, 48, ! -1, -1, -1, 86, -1, -1, 55, -1, -1, 58, ! 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 182, -1, -1, 72, -1, -1, -1, -1, -1, -1, ! -1, -1, 679, 82, -1, -1, -1, -1, -1, 201, ! 202, 203, -1, -1, 691, 94, 95, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 141, -1, ! -1, -1, -1, -1, 147, 148, 713, -1, 230, 152, ! 153, -1, -1, 156, 157, 158, 74, 75, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 172, ! -1, -1, -1, 176, -1, -1, -1, -1, -1, 182, ! 183, -1, 3, 4, 5, 6, 7, 8, 9, -1, ! -1, 12, -1, 14, -1, 762, -1, -1, 201, 202, ! 203, -1, 769, -1, -1, -1, -1, 28, -1, 30, ! 31, 778, -1, -1, -1, -1, 37, -1, -1, -1, ! -1, 42, -1, -1, -1, 46, -1, 230, 310, -1, ! -1, -1, -1, -1, 55, -1, -1, 58, 59, 4, ! 5, -1, 7, 8, 9, -1, -1, 12, -1, 14, ! -1, 72, 819, 820, 821, -1, -1, -1, -1, 826, ! 827, 82, 829, 28, 267, 30, 31, -1, -1, 90, ! -1, -1, 37, 94, -1, -1, 843, 359, 360, 361, ! -1, 46, -1, 850, 851, 852, 853, 854, -1, -1, ! 55, 858, -1, 58, 59, -1, -1, -1, -1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, 12, ! -1, 14, -1, -1, -1, -1, 4, 5, 513, -1, ! 8, 9, 889, 518, 891, 28, 14, 30, 31, 896, ! 897, -1, 899, -1, 37, -1, 418, -1, -1, 42, ! 28, -1, 30, 46, -1, 48, -1, -1, 543, 37, ! -1, -1, 55, -1, 549, 58, 59, -1, 46, -1, ! -1, -1, -1, 366, -1, -1, -1, 55, 371, 72, ! 58, 59, -1, -1, -1, -1, -1, -1, -1, 82, ! 383, -1, -1, -1, -1, -1, -1, 90, -1, -1, ! -1, 94, 95, -1, -1, -1, 591, 592, -1, 594, ! -1, -1, -1, -1, 486, -1, 488, 489, 490, -1, ! -1, -1, -1, -1, -1, 418, -1, -1, -1, -1, ! 502, 503, -1, -1, 506, -1, 508, 509, 510, 511, ! -1, -1, 435, 515, -1, 438, -1, -1, 520, -1, ! -1, 523, -1, -1, -1, -1, -1, 450, -1, -1, ! -1, -1, -1, -1, -1, 458, -1, -1, -1, -1, ! 1027, 1028, 1029, -1, -1, -1, 1033, 1034, -1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, ! -1, 14, -1, 486, 487, 488, 489, -1, -1, -1, ! -1, 494, 687, 688, -1, -1, -1, 692, 31, 502, ! 503, -1, -1, 506, 37, 508, 509, 510, -1, 42, ! -1, -1, 515, 46, -1, 48, -1, 520, -1, -1, ! 523, -1, 55, -1, -1, 58, 59, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 540, -1, 72, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, ! -1, -1, -1, -1, -1, -1, -1, 90, -1, -1, ! -1, 94, 1129, 1130, 1131, 1132, 1133, 1134, 1135, -1, ! 1137, -1, 1139, 1140, 1141, 1142, 1143, -1, -1, -1, ! 1147, -1, -1, -1, -1, -1, 668, -1, -1, -1, ! -1, 3, 4, 5, 6, -1, -1, 9, -1, -1, ! 682, 683, 684, -1, 1171, -1, -1, -1, 1, 691, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, 31, ! -1, 14, -1, -1, -1, 1192, 1193, -1, 823, -1, ! 42, 713, -1, -1, 1201, 28, -1, 30, 31, 32, ! -1, -1, -1, 55, 37, 38, 58, 59, -1, 42, ! -1, -1, -1, 46, 47, -1, 49, -1, -1, -1, ! 72, 856, 55, -1, -1, 58, 59, -1, -1, 62, ! 82, 64, -1, -1, -1, -1, -1, 680, 90, 72, ! -1, -1, 94, -1, -1, -1, -1, -1, -1, 82, ! -1, -1, -1, -1, -1, -1, 778, 90, -1, -1, ! -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, ! 713, 1278, -1, -1, 1281, 1282, 1283, 110, 913, -1, ! 915, -1, 3, 4, 5, 6, -1, -1, 9, -1, ! -1, -1, -1, -1, -1, -1, -1, 819, 820, 821, ! -1, -1, -1, -1, -1, -1, -1, 829, -1, -1, ! 31, -1, -1, -1, -1, 1322, 1323, 1324, 1325, 1326, ! 1327, 42, -1, 1330, -1, -1, -1, -1, 850, 851, ! 852, 853, 854, -1, 55, 778, 858, 58, 59, -1, ! 3, 4, 5, 6, -1, -1, 9, -1, -1, -1, ! -1, 72, -1, -1, -1, 990, 991, -1, 993, 1366, ! -1, 82, 1369, -1, 1371, -1, -1, 1374, 31, 90, ! -1, -1, -1, 94, 896, -1, 819, 820, 821, 42, ! -1, -1, -1, -1, 827, -1, 829, -1, -1, 1024, ! -1, -1, 55, -1, -1, 58, 59, -1, -1, 921, ! 922, 923, -1, -1, -1, -1, -1, 850, 851, 72, ! -1, -1, 934, -1, -1, 858, -1, -1, -1, 82, ! -1, -1, -1, -1, -1, -1, -1, 90, -1, -1, ! -1, 94, 73, 74, 75, 76, -1, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 889, -1, 891, -1, ! -1, -1, -1, 896, 897, -1, 899, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, ! -1, 14, -1, -1, -1, 1007, 1008, -1, -1, 1011, ! -1, -1, 1014, -1, -1, 28, -1, 30, 31, 32, ! -1, 1023, -1, 1138, 37, 1027, 1028, 1029, -1, 42, ! -1, 1033, -1, 46, 47, -1, 49, 12, -1, -1, ! -1, -1, 55, -1, -1, 58, 59, -1, -1, 62, ! -1, 64, 1167, -1, -1, -1, -1, -1, -1, 72, ! -1, -1, -1, -1, 1179, 359, 360, 361, -1, 82, ! -1, -1, -1, -1, -1, -1, -1, 90, -1, -1, ! -1, 94, -1, -1, -1, 1572, 1573, 1574, -1, 64, ! 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ! 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, ! 85, 86, 1035, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1129, 1130, 1131, ! 1132, 1133, 1134, 1135, -1, -1, -1, 1139, -1, 1141, ! 1142, 1143, 1629, -1, -1, -1, 3, 4, 5, 6, ! -1, 1153, 1154, 1155, 1269, -1, -1, -1, -1, -1, ! -1, 58, -1, -1, -1, -1, -1, -1, -1, 1171, ! -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, ! -1, -1, 1669, 1670, 1671, 42, 83, -1, -1, 86, ! -1, -1, 486, -1, 488, 489, 490, 1684, 55, -1, ! -1, 58, 59, -1, -1, -1, 1129, 1130, 1131, 1132, ! 1133, 1134, 109, 1328, 111, 72, 1139, -1, 1141, 1142, ! 1143, -1, -1, -1, 1147, 82, -1, -1, -1, -1, ! -1, -1, -1, 90, -1, -1, -1, 94, -1, -1, ! -1, -1, 4, 5, 197, 7, 8, 9, 1171, -1, ! 1252, 1253, 14, 1255, -1, -1, -1, -1, -1, -1, ! -1, 1376, -1, -1, -1, 1380, 28, -1, 30, 31, ! 1193, -1, -1, -1, -1, 37, 1278, -1, 1201, 1281, ! 1282, 1283, -1, -1, 46, 182, -1, -1, -1, -1, ! -1, -1, -1, 55, -1, -1, 58, 59, -1, 1414, ! 3, 4, 5, 6, 201, 202, 203, -1, -1, -1, ! -1, -1, -1, -1, 211, -1, -1, -1, -1, -1, ! 1322, 1323, 1324, 1325, 1326, 1327, -1, -1, 1330, -1, ! -1, 1446, -1, 230, -1, 1450, -1, -1, -1, 42, ! -1, -1, 1344, 1345, 1346, 1347, -1, -1, -1, -1, ! -1, -1, 55, -1, -1, 58, 59, 1472, 1473, 256, ! -1, 64, -1, -1, 1366, -1, -1, -1, -1, 72, ! -1, -1, -1, -1, -1, -1, -1, 274, -1, 82, ! -1, -1, -1, -1, -1, -1, -1, 90, 682, 683, ! 684, 94, -1, -1, -1, -1, -1, 691, -1, -1, ! 1323, 1324, -1, 3, 4, 5, 6, 1330, -1, 9, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, ! -1, 14, -1, -1, 377, -1, -1, -1, -1, -1, ! -1, 31, -1, 1435, 1436, 28, 1438, 30, 31, -1, ! -1, -1, 42, 1366, 37, -1, -1, -1, 1371, 42, ! -1, 1374, -1, 46, -1, 55, -1, -1, 58, 59, ! -1, -1, 55, -1, -1, 58, 59, -1, 365, 366, ! -1, 64, 72, -1, -1, -1, -1, -1, -1, 72, ! -1, -1, 82, -1, 778, -1, 383, -1, -1, 82, ! 90, -1, -1, -1, 94, -1, -1, 90, -1, -1, ! -1, 94, 1504, 1505, 1506, 1507, -1, 1, -1, 3, ! 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, ! 14, 418, -1, 476, 477, 819, 820, 821, 3, 4, ! 5, 6, -1, 27, 28, 829, 30, 31, 32, -1, ! -1, -1, -1, 37, -1, -1, -1, -1, 42, -1, ! -1, 45, 46, 47, -1, 49, 31, -1, -1, -1, ! -1, 55, 56, -1, 58, 59, -1, 42, 62, -1, ! 1572, -1, 1574, -1, -1, -1, -1, 1579, 72, -1, ! 55, -1, -1, 58, 59, -1, -1, -1, 82, 486, ! -1, 488, 489, -1, -1, -1, 90, 72, -1, -1, ! 94, -1, -1, -1, 98, 502, 503, 82, -1, 506, ! -1, 508, 509, 510, 511, 90, -1, -1, 515, 94, ! -1, -1, -1, 520, -1, -1, 523, 1629, -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! 934, -1, 14, -1, -1, 598, -1, -1, -1, 1572, ! 1573, 1574, 605, -1, -1, -1, 28, -1, 30, 31, ! -1, -1, -1, -1, -1, 37, -1, 1669, 1670, 1671, ! 42, -1, -1, -1, 46, -1, -1, -1, 631, -1, ! -1, -1, 1684, 55, -1, -1, 58, 59, -1, -1, ! 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 72, -1, -1, 656, -1, -1, 1629, -1, -1, 662, ! 82, 664, 665, 1007, 1008, -1, -1, 1011, 90, -1, ! 1014, -1, 94, -1, -1, -1, -1, -1, -1, 1023, ! -1, -1, -1, 1027, 1028, 1029, -1, -1, 691, 1033, ! -1, -1, -1, -1, -1, 698, 1669, 1670, 1671, -1, ! -1, -1, -1, -1, 707, -1, -1, -1, -1, -1, ! -1, 1684, -1, -1, -1, 3, 4, 5, 6, -1, ! -1, -1, -1, 726, 727, 728, 729, -1, 731, 732, ! 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, ! 743, 744, 745, 746, 747, 748, 749, 694, 695, 72, ! 73, 74, 75, 76, 42, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, -1, -1, 713, 55, -1, -1, ! 58, 59, -1, -1, -1, -1, 64, -1, -1, -1, ! 3, 4, 5, 6, 72, 1129, 1130, 1131, 1132, 1133, ! 1134, 1135, -1, -1, 82, 1139, -1, 1141, 1142, 1143, ! -1, -1, 90, -1, -1, -1, 94, 810, 31, 3, ! 4, 5, 6, -1, -1, -1, -1, -1, -1, 42, ! -1, -1, -1, -1, -1, -1, 829, -1, -1, -1, ! -1, 778, 55, 14, -1, 58, 59, 31, -1, -1, ! 843, -1, 23, 24, -1, -1, -1, -1, 42, 72, ! 31, 32, -1, 34, -1, -1, -1, -1, -1, 82, ! -1, 55, -1, -1, 58, 59, -1, 90, -1, -1, ! -1, 94, 819, 820, 821, -1, -1, -1, 72, 826, ! 827, -1, 829, -1, -1, 888, -1, 68, 82, -1, ! -1, -1, -1, -1, -1, -1, 90, -1, -1, -1, ! 94, -1, -1, 850, 851, 852, 853, 854, 855, -1, ! -1, 858, 65, 66, 67, 68, 69, 70, 71, 72, ! 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, 1278, -1, 883, 1281, 1282, 1283, ! -1, -1, -1, -1, -1, -1, -1, 950, 129, 896, ! 131, -1, -1, -1, -1, -1, -1, 138, 139, 112, ! -1, -1, -1, -1, -1, -1, 147, 148, -1, -1, ! 151, 152, 153, -1, 155, 156, 157, 158, 1322, 1323, ! 1324, 1325, 1326, 1327, 987, 988, 1330, -1, -1, 1, ! -1, 3, 4, 5, 6, 7, 8, 9, -1, 1002, ! -1, 1004, 14, 1006, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, -1, 30, 31, ! 32, -1, -1, -1, -1, 37, 38, -1, -1, -1, ! 42, -1, -1, -1, 46, 47, -1, 49, -1, -1, ! -1, -1, -1, 55, 1047, -1, 58, 59, -1, -1, ! 62, -1, 64, -1, -1, -1, -1, -1, -1, -1, ! 72, -1, -1, -1, -1, 246, 247, -1, -1, -1, ! 82, -1, -1, -1, -1, -1, -1, 1080, 90, -1, ! -1, -1, 94, -1, -1, -1, 267, 1034, 1035, 1036, ! -1, 1435, 1436, -1, 1438, -1, -1, -1, 110, -1, ! -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, ! 73, 74, 75, 76, 1117, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, -1, -1, -1, -1, -1, 310, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 1149, 1150, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 1504, 1505, 1506, 1507, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 357, -1, 359, 360, ! 1183, -1, 1129, 1130, 1131, 1132, 1133, 1134, 1135, -1, ! 1137, -1, 1139, 1140, 1141, 1142, 1143, -1, -1, -1, ! 1147, -1, -1, -1, -1, -1, 1153, 1154, 1155, -1, ! -1, -1, 3, 4, 5, 6, 7, 8, 9, -1, ! -1, -1, -1, 14, 1171, -1, 407, -1, -1, -1, ! -1, -1, -1, 1236, 1237, 1579, -1, 28, -1, 30, ! 31, -1, -1, -1, -1, 1192, 37, 428, -1, -1, ! -1, 42, -1, -1, 435, 46, -1, 438, -1, -1, ! -1, -1, -1, -1, 55, -1, -1, 58, 59, 450, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 72, -1, -1, 31, -1, -1, -1, -1, -1, ! 1293, 82, -1, -1, -1, -1, -1, -1, -1, 90, ! -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, ! 1313, -1, 1315, -1, 1317, -1, -1, 1320, 65, 66, ! 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ! 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, ! -1, -1, -1, -1, -1, 1348, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 537, -1, 539, 1362, ! 1363, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 1322, 1323, 1324, 1325, 1326, ! 1327, -1, -1, 1330, -1, -1, -1, 1390, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1344, 1345, 1346, ! 1347, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 593, -1, 595, -1, 1419, -1, -1, 1366, ! -1, -1, -1, -1, 3, 4, 5, 6, 7, 8, ! 9, -1, -1, -1, -1, 14, -1, -1, -1, -1, ! 1443, -1, -1, -1, -1, -1, -1, -1, -1, 28, ! -1, 30, 31, -1, 1457, -1, -1, -1, 37, -1, ! -1, -1, -1, 42, -1, -1, -1, 46, -1, -1, ! -1, -1, -1, -1, -1, -1, 55, 1480, -1, 58, ! 59, -1, -1, -1, -1, -1, -1, 668, 1435, 1436, ! 1437, 1438, -1, 72, -1, -1, -1, -1, 679, 680, ! -1, 682, 683, 82, -1, -1, -1, -1, -1, -1, ! -1, 90, 1515, 1516, -1, 94, -1, -1, 65, 66, ! 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ! 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 1554, -1, -1, -1, -1, -1, 1504, 1505, 1506, ! 1507, 108, 69, 70, 71, 72, 73, 74, 75, 76, ! 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, ! -1, 762, -1, -1, -1, 1588, -1, -1, 769, 770, ! -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, ! -1, -1, -1, -1, -1, -1, 1, -1, 3, 4, ! 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ! -1, -1, 803, -1, -1, 1572, 1629, 1574, -1, -1, ! -1, -1, 1579, 28, 29, 30, 31, 32, -1, 34, ! 35, 36, 37, -1, 39, 40, 41, 42, 43, 44, ! 1653, 46, -1, 48, -1, 50, 51, 52, 53, 54, ! 55, -1, -1, 58, 59, 60, -1, -1, 63, -1, ! -1, -1, -1, -1, 69, -1, -1, 72, -1, -1, ! -1, -1, 1629, -1, -1, 80, 81, 82, -1, -1, ! -1, -1, -1, 88, 89, 90, -1, -1, -1, 94, ! 95, -1, 883, -1, -1, 886, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, ! -1, -1, 1669, 1670, 1671, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1684, -1, -1, ! 921, 922, 923, 924, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 934, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 61, -1, -1, 1769, 65, 66, 67, ! 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, ! -1, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! 12, -1, 14, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 25, -1, 27, 1007, 1008, -1, 31, ! 1011, -1, -1, 1014, -1, 37, -1, -1, -1, -1, ! 42, -1, 1023, -1, 46, -1, 48, -1, -1, -1, ! -1, -1, 1033, 55, -1, -1, 58, 59, 60, 61, ! 62, -1, 64, 65, 66, 67, 68, 69, 70, 71, ! 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ! 82, 83, 84, 85, 86, -1, 88, 89, 90, -1, ! 92, 93, 94, 95, 96, -1, -1, -1, -1, -1, ! 102, 103, -1, -1, -1, -1, 108, 109, 110, 1, ! 112, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! -1, 13, 14, 15, -1, 17, 18, 19, 20, 21, ! 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, 45, 46, 47, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, 60, -1, ! 62, 63, -1, -1, -1, -1, -1, 69, -1, 1, ! 72, -1, 4, 5, -1, 1166, 8, 9, 80, 81, ! 82, -1, 14, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, -1, 96, -1, 28, -1, 30, -1, ! -1, -1, 1193, -1, -1, 37, -1, 39, 40, 111, ! -1, -1, -1, -1, 46, -1, 48, -1, -1, -1, ! -1, -1, -1, 55, -1, -1, 58, 59, -1, 61, ! -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, ! 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ! 82, 83, 84, 85, -1, -1, 88, 89, 90, -1, ! 92, 1252, 1253, 95, 1255, 1, -1, 3, 4, 5, ! 6, 7, 8, 9, 10, 11, 12, 13, 14, 111, ! -1, -1, -1, -1, -1, -1, -1, 1278, -1, -1, ! 1281, 1282, 28, 29, 30, 31, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, 48, -1, 50, 51, 52, 53, 54, 55, ! 1311, -1, 58, 59, 60, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, -1, 94, 95, ! 1351, 1, -1, 3, 4, 5, 6, 7, 8, 9, ! 10, 11, 12, 13, 14, 111, -1, -1, 1369, -1, ! 1371, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, 31, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! -1, -1, -1, 63, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, 1, 94, 3, 4, 5, 6, 7, ! 8, 9, 10, 11, -1, 13, 14, -1, -1, 109, ! -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, 31, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, 60, -1, 62, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, 1, 94, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, 60, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, -1, 94, 95, ! 1, -1, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, -1, 13, 14, 110, 111, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, ! 31, 32, -1, 34, 35, 36, 37, -1, 39, 40, ! 41, 42, 43, 44, -1, 46, -1, -1, -1, 50, ! 51, 52, 53, 54, 55, -1, -1, 58, 59, 60, ! -1, -1, 63, -1, -1, -1, -1, -1, 69, -1, ! -1, 72, -1, -1, -1, -1, -1, -1, -1, 80, ! 81, 82, -1, -1, -1, -1, -1, 88, 89, 90, ! -1, -1, 1, 94, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, -1, 13, 14, -1, -1, -1, -1, ! 111, -1, -1, -1, -1, -1, -1, -1, -1, 28, ! 29, 30, -1, 32, -1, 34, 35, 36, 37, -1, ! 39, 40, 41, 42, 43, 44, -1, 46, -1, -1, ! -1, 50, 51, 52, 53, 54, 55, -1, -1, 58, ! 59, 60, -1, -1, 63, -1, -1, -1, -1, -1, ! 69, -1, -1, 72, -1, -1, -1, -1, -1, -1, ! -1, 80, 81, 82, -1, -1, -1, -1, -1, 88, ! 89, 90, -1, -1, -1, 94, 95, 1, -1, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, 111, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, 60, -1, -1, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, ! 94, 1, -1, 3, 4, 5, 6, 101, 8, 9, ! 10, 11, -1, 13, 14, -1, -1, 111, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, -1, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! 60, -1, -1, 63, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, 1, 94, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, -1, 13, 14, -1, -1, -1, ! 110, 111, -1, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, -1, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, 60, -1, -1, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, 1, 94, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, -1, 110, 111, -1, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, 60, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, 1, 94, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, -1, -1, -1, 111, -1, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, 60, -1, -1, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, 1, ! 94, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, -1, 111, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! -1, 63, 64, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, 1, 94, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, -1, 13, 14, -1, -1, -1, -1, 111, ! -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, -1, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! -1, -1, 62, 63, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, 1, 94, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, -1, 13, 14, -1, -1, -1, ! -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, -1, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, 1, 94, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, 109, -1, 111, -1, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, 1, 94, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, -1, -1, -1, 111, -1, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, -1, -1, -1, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, 1, ! 94, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, -1, 111, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! -1, 63, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, -1, 13, 14, -1, -1, -1, -1, 111, ! -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, -1, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! -1, -1, -1, 63, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, -1, 94, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, -1, 13, 14, -1, -1, -1, ! -1, 111, 112, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, -1, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, -1, 94, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, -1, -1, 111, 112, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, -1, 94, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, -1, -1, -1, 111, 112, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, -1, -1, -1, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, ! 94, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, -1, 111, 112, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! -1, 63, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, 72, 73, 74, 75, 76, 77, 78, ! 79, 80, 81, 82, 83, 84, 85, 86, -1, 111, ! 112, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! -1, 13, 14, 15, -1, 17, 18, 19, 20, 21, ! 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, 45, 46, 47, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, 60, -1, ! 62, 63, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, -1, 96, -1, 3, 4, 5, 6, ! 7, 8, 9, 10, 11, -1, 13, 14, 15, 111, ! 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ! 27, 28, 29, 30, 31, 32, -1, 34, 35, 36, ! 37, -1, 39, 40, 41, 42, 43, 44, 45, 46, ! 47, -1, -1, 50, 51, 52, 53, 54, 55, -1, ! -1, 58, 59, 60, -1, 62, 63, -1, -1, -1, ! -1, -1, 69, -1, -1, 72, -1, -1, -1, -1, ! -1, -1, -1, 80, 81, 82, -1, -1, -1, -1, ! -1, 88, 89, 90, -1, -1, -1, 94, -1, 96, ! -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! -1, 13, 14, 15, 111, 17, 18, 19, 20, 21, ! 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, 45, 46, 47, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! 62, 63, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, -1, 96, 3, 4, 5, 6, 7, ! 8, 9, 10, 11, 12, 13, 14, -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, 31, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! 48, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, -1, 94, 95, 3, 4, ! 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ! -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 28, 29, 30, 31, 32, -1, 34, ! 35, 36, 37, -1, 39, 40, 41, 42, 43, 44, ! -1, 46, -1, 48, -1, 50, 51, 52, 53, 54, ! 55, -1, -1, 58, 59, -1, -1, -1, 63, -1, ! -1, -1, -1, -1, 69, -1, -1, 72, -1, -1, ! -1, -1, -1, -1, -1, 80, 81, 82, -1, -1, ! -1, -1, -1, 88, 89, 90, -1, -1, -1, 94, ! 95, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, 111, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, 48, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, 95, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, -1, 13, 14, -1, -1, -1, 111, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, ! 29, 30, 31, 32, -1, 34, 35, 36, 37, -1, ! 39, 40, 41, 42, 43, 44, -1, 46, -1, 48, ! -1, 50, 51, 52, 53, 54, 55, -1, -1, 58, ! 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 69, -1, -1, 72, -1, -1, -1, -1, -1, -1, ! -1, 80, 81, 82, -1, -1, -1, -1, -1, 88, ! 89, 90, -1, -1, -1, 94, 95, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, -1, 94, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, -1, -1, -1, 111, -1, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, -1, -1, 62, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, ! 94, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, -1, 111, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, -1, 13, 14, -1, -1, -1, -1, 111, ! -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, 31, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! -1, -1, -1, 63, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, -1, 94, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, -1, 13, 14, -1, -1, -1, ! -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, ! 28, 29, 30, -1, 32, -1, 34, 35, 36, 37, ! -1, 39, 40, 41, 42, 43, 44, -1, 46, -1, ! -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, ! 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, ! -1, 69, -1, -1, 72, -1, -1, -1, -1, -1, ! -1, -1, 80, 81, 82, -1, -1, -1, -1, -1, ! 88, 89, 90, -1, -1, -1, 94, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, ! -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, ! -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, ! 36, 37, -1, 39, 40, 41, 42, 43, 44, -1, ! 46, -1, -1, -1, 50, 51, 52, 53, 54, 55, ! -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, ! -1, -1, -1, 69, -1, -1, 72, -1, -1, -1, ! -1, -1, -1, -1, 80, 81, 82, -1, -1, -1, ! -1, -1, 88, 89, 90, -1, -1, -1, 94, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, ! 14, -1, -1, -1, -1, 111, -1, -1, -1, -1, ! -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, ! 34, 35, 36, 37, -1, 39, 40, 41, 42, 43, ! 44, -1, 46, -1, -1, -1, 50, 51, 52, 53, ! 54, 55, -1, -1, 58, 59, -1, -1, -1, 63, ! -1, -1, -1, -1, -1, 69, -1, -1, 72, -1, ! -1, -1, -1, -1, -1, -1, 80, 81, 82, -1, ! -1, -1, -1, -1, 88, 89, 90, -1, -1, -1, ! 94, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! -1, 13, 14, -1, -1, -1, -1, 111, -1, -1, ! -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, ! 32, -1, 34, 35, 36, 37, -1, 39, 40, 41, ! 42, 43, 44, -1, 46, -1, -1, -1, 50, 51, ! 52, 53, 54, 55, -1, -1, 58, 59, 60, -1, ! -1, -1, -1, -1, -1, -1, -1, 69, -1, -1, ! 72, -1, -1, -1, -1, -1, -1, -1, 80, 81, ! 82, -1, -1, -1, -1, -1, 88, 89, 90, -1, ! -1, -1, 94, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, -1, 13, 14, -1, -1, -1, -1, 111, ! -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, ! 30, -1, 32, -1, 34, 35, 36, 37, -1, 39, ! 40, 41, 42, 43, 44, -1, 46, -1, -1, -1, ! 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, ! -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, ! 80, 81, 82, -1, -1, -1, -1, -1, 88, 89, ! 90, -1, -1, -1, 94, 95, 3, 4, 5, 6, ! -1, 8, 9, 10, 11, -1, 13, 14, -1, -1, ! -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, ! 37, -1, 39, 40, 41, 42, 43, 44, -1, 46, ! -1, -1, -1, 50, 51, 52, 53, 54, 55, -1, ! -1, 58, 59, -1, -1, -1, 63, -1, -1, -1, ! -1, -1, 69, -1, -1, 72, -1, -1, -1, -1, ! -1, -1, -1, 80, 81, 82, -1, -1, -1, -1, ! -1, 88, 89, 90, -1, -1, -1, 94, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, -1, 13, 14, ! -1, -1, -1, -1, 111, -1, -1, -1, -1, -1, ! -1, -1, -1, 28, 29, 30, 31, 32, -1, 34, ! 35, 36, 37, -1, 39, 40, 41, 42, 43, 44, ! -1, 46, -1, -1, -1, 50, 51, 52, 53, 54, ! 55, -1, -1, 58, 59, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 69, -1, -1, 72, -1, -1, ! -1, -1, -1, -1, -1, 80, 81, 82, -1, -1, ! -1, -1, -1, 88, 89, 90, -1, -1, -1, 94, ! 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, ! 13, 14, -1, -1, -1, -1, 111, -1, -1, -1, ! -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, ! -1, 34, 35, 36, 37, -1, 39, 40, 41, 42, ! 43, 44, -1, 46, -1, -1, -1, 50, 51, 52, ! 53, 54, 55, -1, -1, 58, 59, -1, -1, -1, ! 63, -1, -1, -1, -1, -1, 69, -1, -1, 72, ! -1, -1, -1, -1, -1, -1, -1, 80, 81, 82, ! -1, -1, -1, -1, -1, 88, 89, 90, -1, -1, ! -1, 94, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, -1, 13, 14, -1, -1, -1, -1, 111, -1, ! -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, ! 31, 32, -1, 34, 35, 36, 37, -1, 39, 40, ! 41, 42, 43, 44, -1, 46, -1, -1, -1, 50, ! 51, 52, 53, 54, 55, -1, -1, 58, 59, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, ! -1, 72, -1, -1, -1, -1, -1, -1, -1, 80, ! 81, 82, -1, -1, -1, -1, -1, 88, 89, 90, ! -1, -1, -1, 94, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, -1, 13, 14, -1, -1, -1, -1, ! 111, -1, -1, -1, -1, -1, -1, -1, -1, 28, ! 29, 30, -1, 32, -1, 34, 35, 36, 37, -1, ! 39, 40, 41, 42, 43, 44, -1, 46, -1, -1, ! -1, 50, 51, 52, 53, 54, 55, -1, -1, 58, ! 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 69, -1, -1, 72, -1, -1, -1, -1, -1, -1, ! -1, 80, 81, 82, -1, -1, -1, -1, -1, 88, ! 89, 90, -1, -1, -1, 94, 3, 4, 5, 6, ! -1, 8, 9, 10, 11, -1, 13, 14, -1, -1, ! -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, ! -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, ! 37, -1, 39, 40, 41, 42, 43, 44, -1, 46, ! -1, -1, -1, 50, 51, 52, 53, 54, 55, -1, ! -1, 58, 59, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 69, -1, -1, 72, -1, -1, -1, -1, ! -1, -1, -1, 80, 81, 82, -1, -1, -1, -1, ! -1, 88, 89, 90, -1, -1, -1, 94, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, -1, 13, 14, ! -1, -1, -1, -1, 111, -1, -1, -1, -1, -1, ! -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, ! 35, 36, 37, -1, 39, 40, 41, 42, 43, 44, ! -1, 46, -1, -1, -1, 50, 51, 52, 53, 54, ! 55, -1, -1, 58, 59, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 69, -1, -1, 72, -1, -1, ! -1, -1, -1, -1, -1, 80, 81, 82, -1, -1, ! -1, -1, -1, 88, 89, 90, -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 61, -1, -1, 111, 65, 66, 67, ! 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, ! 85, 86, 65, 66, 67, 68, 69, 70, 71, 72, ! 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, 70, 71, 72, 73, 74, 75, ! 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ! 86 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/lib/bison.simple" --- 1142,4362 ---- }; static const short yydefact[] = { 3, ! 12, 12, 5, 0, 4, 0, 313, 671, 672, 0, ! 420, 433, 612, 0, 11, 0, 0, 0, 10, 517, ! 890, 0, 0, 0, 178, 705, 16, 314, 315, 88, ! 0, 0, 871, 0, 47, 0, 0, 13, 27, 0, ! 29, 8, 52, 53, 0, 18, 15, 95, 118, 92, ! 0, 673, 182, 334, 311, 335, 647, 0, 409, 0, ! 408, 424, 0, 446, 614, 463, 432, 0, 530, 532, ! 512, 540, 419, 636, 434, 637, 116, 333, 658, 634, ! 0, 674, 610, 0, 89, 0, 312, 85, 87, 86, ! 189, 0, 679, 189, 680, 189, 316, 178, 151, 152, ! 153, 154, 155, 503, 505, 0, 701, 0, 506, 0, ! 0, 0, 0, 152, 153, 154, 155, 25, 0, 0, ! 0, 0, 0, 0, 0, 507, 683, 0, 689, 0, ! 0, 0, 39, 0, 0, 33, 0, 0, 49, 0, ! 0, 189, 681, 0, 313, 614, 0, 645, 640, 0, ! 0, 0, 644, 0, 0, 0, 0, 334, 0, 325, ! 0, 0, 0, 333, 610, 30, 0, 28, 3, 48, ! 0, 68, 420, 0, 0, 8, 71, 67, 70, 95, ! 0, 0, 0, 432, 96, 14, 0, 461, 0, 0, ! 479, 93, 83, 682, 618, 0, 0, 610, 84, 0, ! 0, 0, 114, 0, 442, 399, 627, 400, 633, 0, ! 610, 422, 421, 82, 117, 410, 0, 444, 423, 115, ! 416, 439, 440, 411, 426, 428, 431, 441, 0, 79, ! 464, 518, 519, 520, 521, 539, 160, 159, 161, 523, ! 531, 183, 527, 522, 0, 0, 533, 534, 535, 536, ! 871, 0, 613, 425, 615, 0, 458, 313, 672, 0, ! 314, 703, 182, 664, 665, 661, 639, 675, 0, 313, ! 315, 660, 638, 659, 635, 0, 891, 891, 891, 891, ! 891, 891, 891, 0, 891, 891, 891, 891, 891, 891, ! 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, ! 891, 891, 891, 891, 891, 891, 0, 891, 816, 424, ! 817, 886, 316, 612, 338, 341, 388, 0, 0, 0, ! 0, 0, 384, 382, 355, 386, 387, 0, 0, 0, ! 0, 0, 314, 307, 0, 0, 199, 198, 0, 200, ! 201, 0, 0, 202, 0, 0, 190, 191, 0, 257, ! 0, 285, 196, 337, 225, 0, 0, 339, 340, 0, ! 193, 406, 424, 407, 666, 367, 357, 0, 0, 878, ! 0, 0, 189, 0, 515, 501, 0, 0, 0, 702, ! 700, 283, 0, 203, 260, 204, 0, 0, 0, 0, ! 0, 468, 3, 23, 31, 697, 693, 694, 696, 698, ! 695, 151, 152, 153, 0, 154, 155, 685, 686, 690, ! 687, 684, 0, 313, 323, 324, 322, 663, 662, 35, ! 34, 51, 0, 168, 0, 0, 424, 166, 17, 0, ! 0, 189, 641, 615, 643, 0, 642, 152, 153, 309, ! 310, 329, 614, 0, 651, 328, 0, 650, 0, 336, ! 314, 315, 0, 0, 0, 327, 326, 655, 0, 0, ! 12, 0, 178, 9, 9, 74, 0, 69, 0, 0, ! 75, 78, 0, 460, 462, 132, 101, 804, 99, 390, ! 100, 135, 0, 0, 133, 94, 0, 847, 224, 0, ! 223, 842, 865, 0, 406, 424, 407, 0, 841, 843, ! 872, 854, 0, 0, 657, 0, 0, 879, 614, 0, ! 625, 620, 0, 624, 0, 0, 0, 0, 0, 610, ! 461, 0, 81, 0, 610, 632, 0, 413, 414, 0, ! 80, 461, 418, 417, 412, 429, 430, 448, 447, 189, ! 537, 538, 151, 154, 524, 528, 526, 0, 541, 508, ! 427, 461, 677, 610, 102, 0, 0, 0, 0, 678, ! 610, 108, 611, 0, 646, 672, 704, 182, 926, 0, ! 922, 0, 921, 919, 901, 906, 907, 891, 913, 912, ! 898, 899, 897, 916, 905, 902, 903, 904, 908, 909, ! 895, 896, 892, 893, 894, 918, 910, 911, 900, 917, ! 891, 914, 426, 610, 610, 0, 610, 0, 891, 189, ! 0, 0, 232, 0, 234, 247, 248, 0, 0, 0, ! 0, 0, 0, 308, 231, 228, 227, 229, 0, 0, ! 0, 0, 0, 337, 0, 927, 0, 226, 187, 188, ! 331, 0, 230, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 348, 0, 350, ! 353, 354, 392, 391, 0, 0, 0, 0, 0, 236, ! 608, 0, 244, 389, 381, 0, 0, 871, 370, 373, ! 374, 0, 0, 401, 724, 720, 0, 0, 610, 610, ! 610, 403, 727, 0, 670, 405, 0, 0, 404, 369, ! 0, 0, 364, 383, 195, 365, 385, 667, 0, 366, ! 0, 0, 186, 186, 0, 176, 0, 424, 174, 516, ! 605, 602, 0, 515, 603, 515, 0, 284, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 436, 437, 438, 474, 475, 476, 473, ! 0, 466, 469, 0, 3, 0, 688, 189, 691, 0, ! 43, 44, 0, 57, 0, 0, 0, 61, 65, 54, ! 870, 424, 57, 869, 63, 179, 164, 162, 179, 186, ! 332, 0, 649, 648, 336, 0, 652, 0, 20, 22, ! 95, 9, 9, 77, 76, 0, 137, 0, 927, 91, ! 90, 485, 0, 481, 480, 0, 619, 616, 846, 860, ! 849, 724, 720, 0, 861, 610, 864, 866, 0, 0, ! 862, 0, 863, 617, 845, 859, 848, 844, 873, 856, ! 867, 857, 850, 855, 656, 0, 670, 0, 654, 621, ! 615, 623, 622, 614, 0, 0, 0, 0, 0, 0, ! 610, 631, 0, 456, 455, 443, 630, 0, 879, 0, ! 626, 415, 445, 457, 461, 0, 525, 529, 671, 672, ! 871, 871, 673, 542, 543, 545, 871, 548, 547, 0, ! 0, 459, 879, 840, 189, 189, 676, 189, 879, 840, ! 610, 105, 610, 111, 891, 891, 915, 920, 886, 886, ! 886, 0, 925, 0, 0, 0, 0, 0, 0, 0, ! 0, 424, 0, 0, 0, 344, 0, 342, 343, 0, ! 0, 255, 192, 313, 671, 672, 314, 315, 0, 0, ! 486, 513, 0, 306, 305, 831, 830, 0, 303, 302, ! 300, 301, 299, 298, 297, 295, 296, 293, 294, 288, ! 289, 290, 291, 292, 286, 287, 0, 0, 0, 0, ! 0, 0, 0, 238, 252, 0, 0, 237, 610, 610, ! 0, 610, 607, 712, 0, 0, 0, 0, 0, 372, ! 0, 376, 0, 378, 0, 614, 723, 722, 715, 719, ! 718, 870, 0, 0, 737, 0, 0, 879, 402, 879, ! 725, 610, 840, 0, 724, 720, 0, 0, 610, 0, ! 614, 0, 0, 0, 0, 197, 0, 874, 181, 185, ! 317, 179, 172, 170, 179, 0, 504, 516, 601, 0, ! 222, 221, 220, 219, 282, 281, 0, 279, 278, 276, ! 277, 275, 274, 273, 270, 271, 272, 268, 269, 263, ! 264, 265, 266, 267, 261, 262, 468, 0, 0, 26, ! 0, 0, 692, 0, 40, 46, 45, 59, 56, 49, ! 57, 0, 50, 0, 0, 58, 523, 0, 169, 179, ! 179, 167, 180, 331, 330, 19, 21, 73, 95, 449, ! 805, 150, 156, 143, 157, 158, 0, 0, 139, 0, ! 0, 0, 0, 482, 0, 134, 614, 723, 719, 724, ! 720, 0, 614, 634, 0, 610, 725, 0, 724, 720, ! 0, 337, 0, 666, 0, 868, 0, 0, 881, 0, ! 0, 0, 0, 453, 629, 628, 452, 186, 550, 549, ! 871, 871, 871, 0, 576, 672, 0, 566, 0, 0, ! 0, 579, 0, 131, 126, 0, 182, 580, 583, 0, ! 0, 558, 0, 129, 570, 104, 0, 0, 0, 0, ! 110, 0, 879, 840, 879, 840, 924, 923, 888, 887, ! 889, 318, 356, 233, 235, 0, 362, 363, 0, 0, ! 0, 0, 343, 346, 748, 0, 0, 0, 0, 256, ! 0, 347, 349, 352, 250, 249, 240, 0, 239, 254, ! 0, 0, 709, 707, 0, 710, 0, 245, 0, 0, ! 189, 379, 0, 0, 0, 716, 615, 721, 717, 728, ! 610, 736, 734, 735, 0, 726, 879, 0, 732, 0, ! 668, 669, 724, 720, 0, 368, 877, 177, 179, 179, ! 175, 606, 604, 502, 0, 467, 465, 313, 0, 24, ! 32, 699, 60, 55, 62, 66, 64, 165, 163, 72, ! 812, 0, 141, 0, 145, 0, 147, 0, 149, 0, ! 97, 0, 483, 615, 723, 719, 724, 720, 0, 610, ! 639, 725, 0, 0, 669, 364, 365, 667, 366, 858, ! 852, 853, 851, 883, 882, 884, 0, 0, 0, 0, ! 615, 0, 0, 450, 184, 0, 552, 551, 546, 610, ! 840, 575, 0, 567, 580, 568, 461, 461, 564, 565, ! 562, 563, 610, 840, 313, 671, 0, 448, 127, 571, ! 581, 586, 587, 448, 448, 0, 0, 448, 125, 572, ! 584, 448, 0, 461, 0, 559, 560, 561, 461, 610, ! 320, 319, 321, 610, 107, 0, 113, 0, 0, 0, ! 0, 0, 0, 743, 0, 489, 0, 487, 259, 304, ! 0, 241, 242, 251, 253, 708, 706, 713, 711, 0, ! 246, 0, 0, 371, 375, 377, 879, 730, 610, 731, ! 173, 171, 280, 0, 470, 472, 813, 806, 810, 142, ! 140, 0, 0, 0, 743, 484, 723, 719, 0, 725, ! 343, 0, 880, 614, 454, 0, 544, 879, 0, 0, ! 569, 479, 479, 879, 0, 0, 0, 461, 461, 0, ! 461, 461, 0, 461, 0, 557, 509, 0, 479, 879, ! 879, 610, 610, 351, 0, 0, 0, 0, 0, 215, ! 749, 0, 744, 745, 488, 0, 0, 243, 714, 380, ! 319, 733, 879, 0, 0, 811, 144, 146, 148, 98, ! 724, 720, 0, 615, 0, 885, 451, 121, 610, 610, ! 840, 574, 578, 124, 610, 461, 461, 595, 479, 313, ! 671, 0, 582, 588, 589, 448, 448, 479, 479, 0, ! 479, 585, 498, 573, 103, 109, 879, 879, 358, 359, ! 360, 361, 477, 0, 0, 0, 739, 750, 757, 738, ! 0, 746, 490, 609, 729, 471, 0, 814, 614, 879, ! 879, 0, 879, 594, 591, 593, 0, 0, 461, 461, ! 461, 590, 592, 577, 0, 106, 112, 0, 747, 742, ! 218, 0, 216, 741, 740, 313, 671, 672, 751, 764, ! 767, 770, 775, 0, 0, 0, 0, 0, 0, 0, ! 0, 314, 799, 807, 0, 827, 803, 802, 801, 0, ! 759, 0, 0, 424, 763, 758, 800, 927, 0, 0, ! 927, 119, 122, 610, 123, 461, 461, 600, 479, 479, ! 500, 0, 499, 494, 478, 217, 820, 822, 823, 0, ! 0, 755, 0, 0, 0, 782, 784, 785, 786, 0, ! 0, 0, 0, 0, 0, 0, 821, 927, 398, 828, ! 0, 760, 396, 448, 0, 397, 0, 448, 0, 0, ! 761, 798, 797, 818, 819, 815, 879, 599, 597, 596, ! 598, 0, 0, 511, 207, 0, 752, 765, 754, 0, ! 927, 0, 0, 0, 778, 927, 787, 0, 796, 41, ! 155, 36, 155, 0, 37, 808, 0, 394, 395, 0, ! 0, 0, 393, 755, 120, 497, 496, 92, 95, 214, ! 0, 424, 0, 755, 755, 768, 0, 743, 825, 771, ! 0, 0, 0, 927, 783, 795, 42, 38, 812, 0, ! 762, 0, 495, 208, 448, 753, 766, 0, 756, 826, ! 0, 824, 776, 780, 779, 809, 832, 832, 0, 493, ! 491, 492, 461, 205, 0, 0, 211, 0, 210, 755, ! 927, 0, 0, 0, 833, 834, 0, 788, 0, 0, ! 769, 772, 777, 781, 0, 0, 0, 0, 0, 0, ! 832, 0, 212, 206, 0, 0, 0, 838, 0, 791, ! 835, 0, 0, 789, 0, 0, 836, 0, 0, 0, ! 0, 0, 0, 213, 773, 0, 839, 793, 794, 0, ! 790, 755, 0, 0, 774, 837, 792, 0, 0, 0 }; ! static const short yydefgoto[] = { 1828, ! 461, 2, 462, 171, 810, 345, 187, 3, 4, 38, ! 141, 775, 393, 39, 776, 1172, 1608, 41, 413, 1655, ! 780, 42, 43, 423, 44, 1173, 787, 1088, 788, 789, ! 790, 46, 178, 179, 47, 819, 190, 186, 479, 1435, ! 48, 49, 904, 1194, 910, 1196, 50, 1175, 1176, 191, ! 192, 820, 480, 1118, 1119, 731, 1120, 241, 51, 1101, ! 1100, 799, 796, 1270, 1269, 1045, 1042, 140, 1099, 52, ! 243, 53, 1039, 641, 346, 347, 348, 349, 633, 1766, ! 1687, 1768, 1721, 1805, 1481, 384, 1028, 350, 679, 988, ! 351, 385, 386, 353, 354, 373, 55, 265, 781, 442, ! 160, 56, 57, 355, 636, 356, 357, 358, 359, 821, ! 360, 1611, 538, 700, 361, 1178, 493, 224, 494, 362, ! 225, 507, 226, 204, 217, 63, 521, 539, 1446, 874, ! 1333, 205, 218, 64, 552, 875, 65, 66, 771, 772, ! 773, 1544, 485, 951, 952, 1719, 1684, 1633, 1575, 67, ! 736, 375, 901, 1533, 1634, 1219, 732, 68, 69, 70, ! 71, 72, 252, 894, 895, 896, 897, 1180, 1375, 1181, ! 1182, 1183, 1360, 1370, 1361, 1523, 1362, 1363, 1524, 1525, ! 733, 734, 735, 680, 1018, 364, 198, 519, 512, 207, ! 74, 75, 76, 148, 149, 163, 78, 136, 365, 366, ! 367, 80, 388, 82, 899, 127, 128, 129, 558, 109, ! 83, 389, 993, 994, 1013, 1009, 703, 1546, 1547, 1482, ! 1483, 1484, 1548, 1394, 1549, 1615, 1640, 1724, 1690, 1691, ! 1550, 1616, 1714, 1641, 1725, 1642, 1748, 1643, 1751, 1795, ! 1822, 1644, 1770, 1734, 1771, 1696, 481, 817, 1291, 1617, ! 1658, 1739, 1428, 1429, 1495, 1621, 1723, 1558, 1618, 1730, ! 1661, 958, 1774, 1775, 1776, 1799, 498, 1014, 854, 1148, ! 1323, 500, 501, 502, 850, 503, 154, 852, 1185, 92, ! 722, 859, 1326, 1327, 609, 86, 569, 87, 941 }; ! static const short yypact[] = { 328, ! 341,-32768,-32768, 3488,-32768, 234, 133, 67, 529, 17, ! 83,-32768,-32768, 1705,-32768, 124, 270, 335,-32768,-32768, ! -32768, 1478, 1390, 915, 350,-32768,-32768, 408, 678,-32768, ! 2285, 2285,-32768, 3932,-32768, 3488, 343,-32768,-32768, 446, ! -32768, 469,-32768,-32768, 2227,-32768,-32768, 418, 1135, 509, ! 475, 544,-32768,-32768,-32768,-32768, 650, 2982,-32768, 5910, ! -32768, 2501, 196,-32768, 576,-32768,-32768, 1262, 707, 871, ! -32768, 560, 8070,-32768,-32768,-32768, 1292,-32768,-32768,-32768, ! 1614,-32768,-32768, 611,-32768, 3619, 573,-32768,-32768,-32768, ! 12299, 637,-32768, 12299,-32768, 12299,-32768,-32768,-32768, 67, ! 529, 408, 591,-32768, 594, 544,-32768, 1470,-32768, 357, ! 12392, 12392, 562,-32768,-32768,-32768,-32768,-32768, 443, 616, ! 679, 774, 787, 626, 641,-32768,-32768, 2047,-32768, 1675, ! 67, 529,-32768, 408, 591,-32768, 757, 1030, 653, 6664, ! 654, 12299,-32768, 12299, 638, 5665, 2687,-32768,-32768, 1847, ! 1634, 2687,-32768, 1749, 4985, 4985, 3932, 630, 643,-32768, ! 650, 997, 649, 655,-32768,-32768, 770,-32768, 686,-32768, ! 5499,-32768,-32768, 350, 3028, 728,-32768,-32768,-32768, 418, ! 5219, 6757, 601, 743,-32768,-32768, 739, 576, 834, 165, ! 59, 779,-32768,-32768,-32768, 9925, 11344,-32768,-32768, 5849, ! 5849, 6738, 1292, 1037,-32768,-32768, 772,-32768,-32768, 2163, ! -32768,-32768,-32768,-32768,-32768, 2501, 1064,-32768, 576, 1292, ! -32768,-32768,-32768, 1971, 2501,-32768, 576,-32768, 5219,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 773, ! 878, 544,-32768, 576, 2088, 1812,-32768,-32768,-32768,-32768, ! -32768, 786,-32768, 1087, 576, 357,-32768, 913, 775, 1374, ! 932,-32768, 180,-32768,-32768,-32768,-32768,-32768, 6161,-32768, ! 591,-32768,-32768,-32768,-32768, 2482,-32768, 760, 765,-32768, ! -32768,-32768,-32768, 810,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 780,-32768,-32768, 1087, ! 8070, 1275,-32768, 788,-32768,-32768,-32768, 13509, 13602, 13695, ! 13695, 790,-32768,-32768,-32768,-32768,-32768, 807, 844, 847, ! 872, 877, 1161, 12857, 1823, 13695,-32768,-32768, 13695,-32768, ! -32768, 13695, 10223,-32768, 13695, 176, 846,-32768, 13695,-32768, ! 12950,-32768, 13764, 193, 1140, 6509, 13043,-32768, 944, 3722, ! -32768, 2845, 6234, 5296,-32768, 309,-32768, 1105, 3550, 867, ! 176, 176, 12299, 6664, 1586,-32768, 909, 1823, 932,-32768, ! -32768, 13137, 862, 918,-32768, 8947, 884, 1779, 3953, 885, ! 908, 1784, 686,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768, 616, 679, 774, 1823, 787, 626, 910, 641,-32768, ! 968,-32768, 3235, 909, 67, 529,-32768,-32768,-32768,-32768, ! -32768,-32768, 4576,-32768, 5219, 7127, 2506,-32768,-32768, 176, ! 612, 12299,-32768, 5665,-32768, 2967,-32768, 950, 954,-32768, ! -32768,-32768, 997, 2687,-32768,-32768, 2687,-32768, 927,-32768, ! -32768,-32768, 997, 997, 997,-32768,-32768,-32768, 6161, 90, ! 931, 934,-32768,-32768,-32768,-32768, 6664,-32768, 1095, 1123, ! -32768,-32768, 770,-32768, 576,-32768,-32768,-32768,-32768, 987, ! -32768,-32768, 10786, 13137,-32768,-32768, 952,-32768, 918, 964, ! 8947, 527, 2491, 6757, 2491, 2551, 5791, 993,-32768, 394, ! 6068, 1011, 1040, 788,-32768, 1023, 344, 94, 7400, 7134, ! -32768,-32768, 7134,-32768, 7255, 7255, 6738, 7511, 1014,-32768, ! 576, 5219,-32768, 11437,-32768,-32768, 7264, 1971, 2501, 5219, ! -32768, 576,-32768,-32768, 1971,-32768, 576, 1111,-32768, 12299, ! -32768,-32768, 909, 932, 773,-32768,-32768, 2088, 2185,-32768, ! 1087, 576,-32768,-32768,-32768, 1070, 1073, 1098, 1096,-32768, ! -32768,-32768,-32768, 5665,-32768, 896,-32768, 369,-32768, 1066, ! -32768, 1069,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768, 1087,-32768,-32768, 277,-32768, 664,-32768, 12299, ! 13137, 10223,-32768, 10223,-32768,-32768,-32768, 13137, 12392, 8184, ! 8184, 8184, 8184, 13764,-32768,-32768,-32768,-32768, 1067, 13230, ! 13230, 10223, 1077, 139, 1090,-32768, 1093,-32768,-32768,-32768, ! 1203, 12299,-32768, 10316, 10223,-32768, 12857, 12857, 10879, 12857, ! 12857, 12857, 12857, 12857, 12857, 12857, 12857, 12857, 12857, 12857, ! 12857, 12857, 12857, 12857, 12857, 12857, 12857,-32768, 13137,-32768, ! -32768,-32768,-32768,-32768, 13137, 13137, 13137, 12392, 6402, 531, ! 364, 11530,-32768,-32768,-32768, 1152, 1374, 1208, 380, 392, ! 396, 3365, 664,-32768, 2894, 2894, 4282, 11623, 1116, 1170, ! -32768,-32768, 777, 12017, 419,-32768, 430, 357,-32768,-32768, ! 13137, 1374,-32768,-32768, 408,-32768,-32768,-32768, 462, 573, ! 13137, 1169,-32768,-32768, 176,-32768, 5219, 2900,-32768,-32768, ! 1157,-32768, 1126, 1186,-32768, 1586, 910, 13742,-32768, 11065, ! 11158, 13137, 13137, 10879, 13137, 13137, 13137, 13137, 13137, 13137, ! 13137, 13137, 13137, 13137, 13137, 13137, 13137, 13137, 13137, 13137, ! 13137, 13137, 13137,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 62,-32768, 1155, 1147, 686, 3235, 1212, 12299,-32768, 1211, ! -32768,-32768, 1030, 1511, 1210, 1251, 505, 1229, 1232,-32768, ! -32768, 4013, 1262,-32768, 1240,-32768,-32768,-32768,-32768,-32768, ! -32768, 176,-32768,-32768, 1196, 1200,-32768, 1249,-32768,-32768, ! 418,-32768,-32768,-32768,-32768, 97,-32768, 600,-32768,-32768, ! -32768,-32768, 10111, 13742,-32768, 1209,-32768,-32768,-32768,-32768, ! -32768, 2645, 2645, 2829,-32768,-32768,-32768,-32768, 2163, 611, ! -32768, 12111,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 1040, 1258,-32768,-32768,-32768, 12485, 1170, 477,-32768,-32768, ! 7400,-32768,-32768, 7511, 7134, 7134, 7358, 7358, 7511, 430, ! -32768,-32768, 7264,-32768, 1260,-32768,-32768, 1219, 94, 7400, ! -32768, 1971,-32768,-32768, 576, 1255, 773,-32768, 679, 774, ! -32768,-32768, 641, 1274,-32768,-32768, 332,-32768,-32768, 1998, ! 3281,-32768, 94, 7790, 12299, 12299,-32768, 12299, 94, 7790, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1932, 1932, ! 1932, 799,-32768, 176, 1227, 1236, 1246, 9008, 1247, 1253, ! 1286, 6593, 1287, 1288, 1294,-32768, 1263,-32768,-32768, 1266, ! 1320,-32768,-32768, 1317, 677, 710, 447, 266, 13137, 1322, ! -32768, 1326, 1281, 13764, 13764,-32768,-32768, 1332, 5100, 5905, ! 6882, 4134, 3314, 5301, 5516, 2347, 2347, 2166, 2166, 998, ! 998, 546, 546, 546,-32768,-32768, 1295, 1298, 1291, 1310, ! 1313, 1314, 8184, 531,-32768, 10786, 13137,-32768,-32768,-32768, ! 13137,-32768,-32768, 1334, 13695, 1318, 1348, 1366, 1395,-32768, ! 13137,-32768, 13137,-32768, 13137, 2325, 3715,-32768,-32768, 3715, ! -32768, 207, 1335, 1337,-32768, 1341, 8184, 94,-32768, 94, ! 4901,-32768, 7790, 11716, 9408, 9408, 9733, 1338, 12950, 1349, ! 2039, 3130, 3953, 1339, 1350, 1073, 1354,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 13137,-32768, 1823,-32768, 1357, ! -32768, 13742,-32768, 13742, 13742, 13742, 1406, 4423, 7809, 8235, ! 8315, 5343, 5559, 5973, 2589, 2589, 2589, 2715, 2715, 2087, ! 2087, 733, 733, 733,-32768,-32768, 1784, 1362, 13323,-32768, ! 1365, 1414,-32768, 176,-32768,-32768,-32768,-32768,-32768,-32768, ! 2264, 4576,-32768, 8184, 12299,-32768, 1055, 12857,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 418,-32768, ! -32768,-32768, 616,-32768, 787, 626, 13137, 272,-32768, 479, ! 539, 550, 1418,-32768, 102,-32768, 4087, 3378, 3378, 3890, ! 3890, 2829, 5156, 188, 2163,-32768, 4482, 3399, 12205, 12205, ! 9829, 362, 1378, 421, 2120,-32768, 10786, 10412,-32768, 4197, ! 1222, 1222, 1397,-32768,-32768,-32768, 1423,-32768,-32768,-32768, ! -32768,-32768,-32768, 1554,-32768, 1002, 1009,-32768, 13137, 7526, ! 3788,-32768, 3788, 287, 287, 147, 558, 7560, 6194, 80, ! 4379,-32768, 200, 287,-32768,-32768, 1381, 176, 176, 176, ! -32768, 1385, 94, 7790, 94, 7790,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 8184,-32768,-32768, 1405, 1411, ! 1417, 1422, 1196,-32768,-32768, 8790, 10786, 10507, 1402,-32768, ! 12857,-32768,-32768,-32768,-32768,-32768, 652, 1409,-32768,-32768, ! 1415, 191, 1045, 1045, 1408, 1045, 13137,-32768, 13695, 1518, ! 12299,-32768, 1426, 1431, 1436,-32768, 2325,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 2325,-32768, 94, 1437,-32768, 1420, ! -32768,-32768, 4697, 4697, 4829,-32768,-32768,-32768,-32768,-32768, ! -32768, 13742,-32768,-32768, 13137,-32768,-32768, 204, 1439,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 13764,-32768,-32768,-32768, ! 1453, 1445,-32768, 835,-32768, 13137,-32768, 13137,-32768, 13137, ! -32768, 10600,-32768, 4087, 3378, 3378, 4943, 4943, 5618,-32768, ! 474, 4482, 4087, 1455, 976, 533, 617, 750, 359,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 208, 1916, 1916, 592, ! 592, 592, 10786,-32768,-32768, 2185,-32768,-32768,-32768,-32768, ! 7790, 13742, 243,-32768, 3442,-32768, 576, 576,-32768,-32768, ! -32768,-32768,-32768, 7790, 525, 813, 13137, 1111,-32768, 1501, ! -32768,-32768,-32768, 713, 873, 1614, 1634, 886, 287, 1504, ! -32768, 920, 1509, 576, 4758,-32768,-32768,-32768, 576,-32768, ! -32768, 1524,-32768,-32768,-32768, 1473,-32768, 1474, 1477, 13137, ! 13137, 13137, 13137, 98, 10786,-32768, 1523,-32768,-32768, 13764, ! 13137,-32768, 652,-32768,-32768,-32768,-32768,-32768,-32768, 1479, ! -32768, 1548, 176,-32768,-32768,-32768, 94,-32768,-32768,-32768, ! -32768,-32768, 13742, 13137,-32768,-32768,-32768, 1453,-32768,-32768, ! -32768, 1488, 1489, 1491, 98,-32768, 5095, 5095, 430, 6030, ! 831, 4197,-32768, 592,-32768, 10786,-32768, 94, 1492, 563, ! -32768, 1536, 1536, 94, 1495, 13137, 13137, 8701, 576, 7655, ! 576, 576, 4182, 576, 7666,-32768,-32768, 5058, 1536, 94, ! 94,-32768,-32768,-32768, 1498, 1499, 1513, 1514, 1823,-32768, ! -32768, 9638, 1573,-32768,-32768, 10786, 1517,-32768,-32768,-32768, ! -32768,-32768, 94, 1521, 1516,-32768,-32768,-32768,-32768,-32768, ! 7222, 7222, 6887, 3139, 3139,-32768,-32768,-32768,-32768,-32768, ! 7790,-32768,-32768,-32768,-32768, 8701, 8701,-32768, 1536, 692, ! 928, 13137,-32768,-32768,-32768, 1111, 1111, 1536, 1536, 896, ! 1536,-32768,-32768,-32768,-32768,-32768, 94, 94,-32768,-32768, ! -32768,-32768,-32768, 1151, 229, 9526,-32768,-32768,-32768,-32768, ! 11827,-32768,-32768,-32768,-32768,-32768, 7918,-32768, 3139, 94, ! 94, 1522, 94,-32768,-32768,-32768, 13137, 13137, 8701, 576, ! 576,-32768,-32768,-32768, 9257,-32768,-32768, 1823,-32768,-32768, ! -32768, 285,-32768,-32768,-32768, 1569, 999, 1010,-32768,-32768, ! -32768,-32768,-32768, 13137, 1570, 1580, 1588, 12578, 503, 1823, ! 1237, 809,-32768,-32768, 12671, 1640,-32768,-32768,-32768, 1589, ! -32768, 3220, 6460, 7050, 1648,-32768,-32768, 1555, 1557, 1558, ! -32768,-32768,-32768,-32768,-32768, 8701, 8701,-32768, 1536, 1536, ! -32768, 11251,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 688, ! 688, 1609, 1576, 1577, 7950,-32768,-32768,-32768,-32768, 1612, ! 13137, 1613, 1615, 1627, 2056, 2073,-32768,-32768,-32768,-32768, ! 1593,-32768,-32768, 1111, 1181,-32768, 1193, 1111, 12764, 1239, ! -32768,-32768,-32768,-32768,-32768,-32768, 94,-32768,-32768,-32768, ! -32768, 1587, 8812, 1585,-32768, 12392,-32768,-32768,-32768, 1680, ! -32768, 10018, 12392, 13137,-32768,-32768,-32768, 1637,-32768,-32768, ! 1645,-32768, 1627, 2056,-32768,-32768, 770,-32768,-32768, 13416, ! 13416, 10693,-32768, 1609,-32768,-32768,-32768, 509, 418,-32768, ! 1596, 776, 5219, 1609, 1609,-32768, 11922, 98,-32768,-32768, ! 1649, 1607, 9046,-32768,-32768,-32768,-32768,-32768, 1453, 104, ! -32768, 192,-32768,-32768, 1111,-32768,-32768, 703,-32768,-32768, ! 9155,-32768,-32768,-32768,-32768, 1453, 106, 106, 1658,-32768, ! -32768,-32768, 576,-32768, 13137, 1660,-32768, 1664,-32768, 1609, ! -32768, 1638, 1823, 336, 1667,-32768, 247,-32768, 1669, 1629, ! -32768,-32768,-32768,-32768, 13137, 1628, 770, 1677, 106, 770, ! 106, 1682,-32768,-32768, 10972, 1633, 1735, 944, 273,-32768, ! -32768, 304, 361,-32768, 10786, 1639,-32768, 1656, 770, 1693, ! 1694, 770, 1697,-32768,-32768, 13137, 944,-32768,-32768, 330, ! -32768, 1609, 1652, 1700,-32768,-32768,-32768, 1767, 1769,-32768 }; static const short yypgoto[] = {-32768, ! 1771,-32768, -332, 1598, -403, 10, -3, 1773,-32768, 1741, ! -32768,-32768,-32768, -1462,-32768, 587,-32768, -1459,-32768, 125, ! 1018, 61, -387,-32768,-32768, 92,-32768, -715,-32768,-32768, ! 694, 60, 1635, 1346, 1631,-32768, 86, -176, -800,-32768, ! 0, -36,-32768,-32768,-32768,-32768,-32768, 635,-32768,-32768, ! -32768,-32768,-32768,-32768, 524, -14,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 1723, -749, 8141, ! -159, -5, -666, -192, -29, 1679, -601,-32768, 268,-32768, ! 184,-32768, -1562,-32768, -1361, 111, 741, -300,-32768, -942, ! 7969, 4024, 7158, -106, 5315, 1528, -340, -54, -69, 1497, ! -134, -68, 121,-32768,-32768,-32768, -349,-32768, -165,-32768, ! -32768, -1508, -19, -351, 7501, 11, 28, -141, 76, 219, ! -211, -1, -154, -174, -171, 15, 129, -198,-32768, -385, ! -32768,-32768,-32768,-32768,-32768, 570, 1352, 3403,-32768, 753, ! -32768,-32768, -1304, -467, 1012,-32768,-32768,-32768,-32768, 36, ! -32768,-32768,-32768,-32768,-32768,-32768, 1100, -386,-32768,-32768, ! -32768,-32768,-32768,-32768, 500, 673,-32768,-32768,-32768, 467, ! -1056,-32768,-32768,-32768,-32768,-32768,-32768, 668,-32768, 389, ! 1119,-32768, 808, 1178, 5568, 21, 1653, 1285, 1874,-32768, ! -518,-32768, 73, 763, 1841, -129, 296, -100, 5866, 1503, ! -32768, 6920, 2735, 137, -17, -107,-32768, 1736, -49,-32768, ! 6371, 4103, -213,-32768, 1272, 214,-32768,-32768, 329,-32768, ! -32768, 393, 1242,-32768, -1520,-32768,-32768,-32768, -1527,-32768, ! -1455, 153,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 143,-32768,-32768,-32768, ! -32768,-32768, 148, -1351,-32768,-32768, -52,-32768,-32768,-32768, ! -32768, -735, -1638,-32768, 99, -1311, -775, -166, 1038,-32768, ! -32768,-32768,-32768, -413,-32768, -401, -203,-32768, 123,-32768, ! -32768, 666, 451,-32768, 395,-32768, 2167, -239, -756 }; ! #define YYLAST 13851 ! static const short yytable[] = { 105, ! 37, 460, 62, 468, 529, 126, 469, 119, 1057, 794, ! 470, 705, 266, 36, 58, 825, 1111, 613, 615, 717, ! 559, 795, 412, 215, 73, 445, 448, 457, 716, 499, ! 898, 59, 37, 312, 62, 786, 793, 421, 203, 717, ! 943, 1229, 551, 62, 180, 36, 58, 549, 716, 1102, ! 646, 147, 152, 240, 175, 181, 73, 1040, 216, 183, ! 774, 811, 1123, 59, 371, 73, 372, 419, 420, 534, ! 536, 254, 59, 1500, 528, 263, 1496, 1096, 411, 60, ! 184, 266, 418, 535, 310, 546, 107, 794, 1607, 363, ! 1585, 1609, 363, 97, 363, 45, 1659, 228, 603, 851, ! 1676, 684, 563, 424, 177, 176, 311, 482, 684, 363, ! 363, 60, 430, 408, 1344, 684, 1346, 1772, 1373, 1777, ! 182, 1689, 93, 1077, 1376, 483, 85, 45, 1187, 720, ! 1732, 1479, 98, 1103, 1192, -876, 45, 1706, 427, 440, ! 363, 266, 363, 94, 705, 215, 884, 1512, 1513, 720, ! 425, 603, 1803, 484, 161, 857, 273, 858, 85, 1757, ! 73, 203, 1673, 1302, 1534, 477, 902, 59, 1758, 62, ! 465, 1078, 1349, 62, 180, 444, 447, 188, 723, 724, ! 216, 58, 380, 1729, 175, 181, 1741, 668, 1769, 183, ! 1374, 73, 1760, 1689, 496, 73, 1746, 1747, 59, 808, ! 429, 1773, 59, 1689, 1689, 257, 1110, 1350, 1480, 91, ! 184, 1351, 1303, 1759, 1566, 426, 497, 268, 111, 829, ! 510, 513, 61, 1572, 1573, -137, 1574, 624, 561, -137, ! 545, 547, 45, 669, 177, 176, -633, 800, 801, 694, ! 1735, 668, 1783, 1352, 268, 557, 60, 1258, -327, 1689, ! 182, 228, -137, 639, 61, 640, -137, 229, 230, 228, ! 228, 478, 1377, 61, 1607, 1424, 45, 1609, 830, 1442, ! 568, 831, 1293, 268, 562, 161, 161, 161, 1755, 377, ! 131, 132, -633, -633, 1402, 856, 268, 669, 478, 228, ! 690, 1580, 1268, 85, 1825, 1271, 88, -633, 95, 1121, ! 1405, 1689, 1790, 681, 309, 689, 489, 816, 457, 254, ! 1378, 1791, 782, 1425, 15, 1784, 942, 1443, -448, 96, ! 625, 143, 161, 876, 1680, 1681, 378, -1, 273, 164, ! -155, 883, -136, 1294, 1809, 379, 135, 726, 1162, 1581, ! -2, 363, 89, 725, 90, 228, 268, 1580, 532, -448, ! 1288, 1289, 1450, -448, 310, 777, 1792, 710, 61, 262, ! 8, 9, 254, 737, 112, 1809, 1750, 131, 132, 717, ! 1163, 363, 728, 534, 536, 1283, 311, 770, 383, 390, ! 534, 268, 1810, 457, 727, 445, 448, 882, 888, 61, ! 737, 1809, 694, 61, 73, 1636, 536, -448, 228, 1091, ! 1787, 59, 802, 711, 1496, 797, 845, -312, 1108, 1109, ! -334, 1376, 268, 1811, 495, 134, 135, 913, 1386, 26, ! 1388, 792, 134, 135, 216, 1812, 139, -610, 1000, 113, ! 363, -610, 377, 8, 9, 313, 989, 167, 856, 1824, ! 1002, 273, 1081, 497, 1004, 1788, 990, 559, 536, 426, ! 164, 164, 164, -312, -312, 846, -334, -334, 847, 991, ! 1488, 273, 228, 914, 506, 62, 813, 1019, -312, -658, ! 1813, -327, 559, 835, 1001, 841, 843, 181, 1802, 378, ! -610, 183, -610, -610, 142, -610, 1003, 73, 379, 135, ! 1005, 1335, 216, 1286, 59, 254, -610, 164, -610, 792, ! 1820, 323, 184, 394, 268, 99, 114, 115, 168, 395, ! 886, -154, 262, -610, -610, -658, -658, 26, 1230, 1421, ! 1422, 497, -632, 142, 268, 1149, 185, 1295, -610, 169, ! -658, 228, 1041, 887, 189, 865, 866, 193, 363, 829, ! 954, 955, 182, 959, 960, 961, 962, 963, 964, 965, ! 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, ! 976, 116, 117, 228, 228, 1449, 1092, 170, -632, -632, ! 228, 1150, 268, 1296, 309, 702, 706, 709, 1455, 985, ! 924, -313, 1093, -632, 95, 1651, 228, 1297, 830, 1456, ! 40, 831, 61, -870, 489, 8, 9, 986, 1299, 194, ! 1112, 432, 1113, 889, 890, 96, 1353, 18, 363, 1104, ! 363, 1510, 363, 270, 8, 9, 10, 363, 932, 932, ! 932, 932, 40, 18, 251, 987, 681, -313, -313, 950, ! 363, 666, 667, 1298, 1107, 161, 161, 161, 228, 370, ! 363, 495, -313, 363, 1300, 898, 143, 26, 1114, 313, ! 134, 135, 1354, 21, 376, 26, 392, 1511, 1115, 1116, ! -138, -138, 229, 471, 1328, -311, 885, 131, 132, 28, ! 271, 396, 998, 642, 1329, 782, 363, 310, 794, 1320, ! 1322, 400, 1087, 717, 268, 61, 1330, 1159, 1160, 639, ! 795, 640, 716, 1164, 1117, 792, 401, 1036, 195, 311, ! 985, 33, 496, 174, 786, 793, 837, 1043, 702, 706, ! 709, -311, -311, 1086, 432, 1007, 1010, 497, 986, 495, ! 603, 489, 134, 135, 497, 1551, -311, 534, 646, 457, ! 422, 1202, 93, 143, 397, 1562, 1685, 499, -399, -327, ! 15, -152, 268, 499, 196, 197, 987, 1401, 1084, 1396, ! 1398, 1764, 450, 94, 144, 94, 1567, 474, 458, 414, ! 415, 416, 10, 228, -653, 95, 126, 247, 432, 1089, ! 266, 248, 843, -399, -153, 1121, 363, -399, 1097, 489, ! 273, 317, 1686, 222, 223, 489, 96, 489, 489, 1551, ! 14, 878, 412, 720, 153, 717, -7, 1765, -659, 21, ! 1122, 377, 131, 132, 1317, 472, 260, 18, 950, -399, ! 164, 164, 164, 20, 489, 261, 271, 898, 762, 763, ! 195, 489, 23, 554, 694, 1022, 170, 228, 268, 398, ! 95, 489, 792, 473, 1398, 1112, 476, 1113, 889, 890, ! 496, 486, 399, 268, -659, -659, 550, 33, 378, 540, ! 96, 96, 1128, 1129, 497, 570, 499, 379, 135, -659, ! 572, 1551, 497, 142, 1174, 1445, 196, 524, 93, 555, ! 856, 1023, 1024, 1657, 578, 1188, 1189, 1457, 1190, -336, ! 857, 567, 611, 1114, 618, 142, 929, 1151, 1152, 94, ! 26, 1282, 601, 1115, 1116, 1177, 457, 309, -400, 62, ! 15, 619, 792, 363, 363, 1319, 363, 642, 792, 435, ! 1171, -130, 273, 15, 437, 495, 957, 228, 131, 132, ! 620, 73, 495, 621, 497, -336, -336, 1485, 59, 1117, ! 497, 249, 1290, -400, 1727, 250, 490, -400, 541, 1551, ! -330, 1761, 542, 979, 911, -128, -130, 15, 622, 996, ! -130, 95, 489, 623, 161, 684, 1731, 1336, 1337, 1338, ! 133, 721, 161, 153, 553, 1016, 489, 228, 553, -400, ! 26, 739, 96, 134, 135, 268, 1179, 1551, 1507, 740, ! -128, 932, -130, 93, -128, 1232, 778, 560, -336, 432, ! 912, 1287, 1568, 764, 765, 1381, 1382, 1383, 457, 270, ! 445, 448, 10, -336, 94, 706, 268, -336, 142, 445, ! 448, 957, 131, 132, 1551, 932, -128, 766, 1553, 1406, ! 1407, 792, 1409, 779, -336, 496, 94, 499, 18, 499, ! 96, 565, 270, 415, 416, 10, 805, -336, -336, 21, ! -336, -6, -336, 497, 809, 1007, 1010, 497, 131, 132, ! 1340, 818, 495, 563, 93, 451, 452, 95, 268, 1806, ! 495, 827, 770, 1638, 26, 95, 266, 134, 135, 453, ! -336, -336, 21, 828, 1639, 94, 1089, -869, 96, 454, ! 663, 664, 665, 666, 667, -336, 96, 33, 28, 271, ! 792, 455, 932, 363, 222, 223, 1341, 489, 522, 523, ! 26, 14, 844, 134, 135, 273, 853, 414, 8, 9, ! 10, 489, 497, 489, 1400, 489, -56, 989, 18, 61, ! 33, -56, 495, 872, 20, 530, 531, 990, 495, 164, ! 792, 540, -56, 23, 1174, 855, 1174, 164, 15, 496, ! 991, 1358, 1368, 794, 1174, 706, 905, 21, 932, 906, ! 1305, 1306, 497, 907, 712, 1620, 522, 814, 1359, 1305, ! 1306, 497, 15, 261, 271, 1177, -448, 1177, 268, 62, ! 268, 62, 908, 1177, 499, 1177, 936, 216, 915, 62, ! 1171, 916, 1171, 1345, 530, 815, 938, 499, 670, 489, ! 1171, 73, 792, 73, 792, 33, -448, -448, 59, 939, ! 59, 73, 942, 1397, 932, -875, 803, 997, 59, 804, ! 1017, 1413, 1578, 1579, 497, 999, 497, 273, 1019, 1246, ! 1491, 807, -194, 1046, 826, 8, 9, 489, 671, 672, ! 253, 1038, 673, 674, 675, 676, 1047, 142, -194, 363, ! -194, 495, 522, 1708, 1246, 495, 1179, 1048, 1179, 1079, ! 161, 161, 161, 18, 530, 1709, 1179, 1080, 1235, 161, ! 161, 161, 857, 792, 99, 100, 101, 1083, 232, 233, ! 234, 268, 435, 1085, 268, 437, 1122, 26, 131, 132, ! 134, 135, 133, 1007, 1010, 497, 1090, 1397, 20, 565, ! 161, 1260, 26, 18, 1328, 1094, 1654, 266, 1095, 235, ! 522, 1713, 1347, 1348, 1329, -330, 1098, 792, 1358, 1105, ! 495, 1106, 1379, 1199, 1200, 1201, 1330, 26, 1126, 15, ! 102, 103, 236, -448, 1147, 1359, 1154, 1437, 1438, 497, ! 26, 1155, 1158, 134, 135, 1161, 1203, 1814, 1174, 792, ! 1246, 377, 8, 9, 499, 1204, 1246, 604, 1151, 1152, ! 495, 925, 792, -448, -448, 1205, 1207, 605, -448, 495, ! 263, 497, 1208, 1209, 1210, 1211, 237, 238, 239, 1177, ! 857, 1212, 1213, 62, 497, 1214, 99, 114, 115, 556, ! 1215, -151, 146, 146, 1171, 162, 1217, 1218, 378, 61, ! 1220, 61, 120, 121, 122, 73, 1221, 379, 135, 61, ! 8, 9, 59, 1224, 1222, 563, 489, 1223, 489, 977, ! 489, 219, 495, 227, 495, 978, 21, 980, 981, 244, ! 1225, 567, 1226, 1227, 255, 164, 164, 164, 18, 1237, ! 1239, 1174, 116, 117, 164, 164, 164, 1665, 1240, 1670, ! 932, 1667, 1241, 1242, 1250, 26, 1251, 1261, 123, 124, ! 1179, 1035, 26, 1252, 1157, 134, 135, 568, 1262, 1266, ! 1246, 1037, 1177, 1267, 1543, 164, 62, 1274, 1246, 1328, ! 1275, 1277, 377, 8, 9, 1280, 1281, 1171, 1301, 1329, ! 99, 114, 115, 495, 511, 514, 1459, 1315, 73, 1334, ! 1380, 1330, 1461, 1462, 1384, 59, 1459, 1464, 434, 1390, ! 1462, 792, 268, 434, 1410, 1391, 443, 443, 162, 792, ! 603, 1392, 1399, 402, 403, 404, 1393, 1246, 1403, 378, ! 1408, 1437, 1438, 497, 1404, 1412, 1246, 495, 379, 135, ! 159, 497, 1420, 219, 489, 1414, 116, 117, 118, 475, ! 1415, 1740, 1743, 1179, 1156, 1416, 1419, 1606, 1426, 1614, ! 1427, 509, 509, 518, 1430, 792, 120, 889, 890, 495, ! 1605, 1612, 1460, 1635, 1441, 1465, 26, 227, 1186, 406, ! 407, 73, 495, 1466, 1191, 268, 537, 497, 59, -699, ! 445, 448, 1472, 1473, 1652, 1653, 1474, 1486, 99, 114, ! 115, 1489, 1664, 61, 1664, 153, 1490, 1497, 1498, 268, ! 1499, 1509, 483, 1614, 1515, 227, 1479, 1539, 1540, 26, ! 1557, 216, 123, 124, 1605, 1612, 258, 8, 259, 10, ! 564, 1798, 1541, 1542, 1798, 73, 1613, 803, 804, 1554, ! 1556, 1624, 59, 1637, 1646, 807, 270, 131, 132, 10, ! 1702, 1705, 1647, 1817, 116, 117, 1798, 730, 1660, 228, ! 1648, 1662, 446, 449, 1570, 1571, 21, 1475, 1476, 1477, ! 1478, 227, 255, 260, 1671, 1672, 1674, 1675, 1487, -927, ! 1692, 1693, 261, 29, 1697, 1699, 21, 120, 121, 122, ! 1613, 395, 1700, 1253, 1722, 1254, 61, 1707, 1718, 1738, ! 1614, 1722, 28, 271, 443, 1716, 262, 1726, 159, 1736, ! 1737, 1605, 1612, 1745, 33, 1744, 311, 99, 100, 101, ! 363, 1752, 73, 311, 227, 255, 1753, 1246, 1246, 59, ! 1778, 495, 1781, 1606, 33, 1614, 1782, 1231, 1789, 495, ! 865, 866, 1785, 123, 124, 1793, 1605, 1612, 1794, 1800, ! 1797, 1243, 1807, 1244, 1804, 1245, 1808, 73, 1815, 1722, ! 1816, 99, 438, 439, 59, 1818, 1819, 228, 1786, 1821, ! 26, 1826, 1827, 102, 103, 104, 1829, 1613, 1830, 61, ! 1, 311, 1246, 467, 5, 495, 166, 219, 227, 489, ! 1704, 414, 8, 9, 10, 1284, 99, 114, 115, 161, ! 767, 768, 769, 1082, 862, 434, 532, 863, 434, 511, ! 514, 464, 1613, 1742, 162, 162, 162, 102, 117, 466, ! 564, 881, 812, 1369, 99, 100, 101, 1431, 1610, 1279, ! 374, 21, 431, 61, 1688, 99, 114, 115, 260, 1276, ! 161, 161, 161, 1049, 1125, 1447, 1339, 261, 271, 635, ! 610, 1468, 116, 117, 77, 219, 1371, 227, 255, 258, ! 131, 132, 10, 1532, 1050, 1273, 984, 1292, 1385, 525, ! 1387, 861, 691, 410, 861, 1650, 864, 864, 518, 33, ! 102, 103, 475, 1763, 1584, 1552, 77, 940, 880, 1749, ! 537, 116, 117, 475, 1762, 77, 1756, 1801, 1146, 21, ! 435, 437, 1506, 0, 0, 0, 260, 0, 208, 565, ! 220, 0, 537, 475, 309, 261, 29, 0, 0, 0, ! 61, 309, 0, 0, 0, 0, 1452, 1453, 1698, 8, ! 9, 0, 1418, 0, 13, 0, 0, 0, 0, 262, ! 0, 206, 0, 0, 0, 131, 132, 33, 0, 0, ! 563, 0, 0, 1467, 0, 61, 0, 18, 1469, 0, ! 446, 806, 0, 1720, 537, 0, 0, 0, 0, 957, ! 1720, 0, 0, 443, 164, 443, 1008, 1011, 0, 309, ! 0, 26, 0, 0, 134, 135, 0, 533, 222, 223, ! 428, 162, 162, 443, 0, 14, 433, 26, 1328, 0, ! 134, 135, 0, 0, 1610, 0, 443, 0, 1329, 0, ! 120, 889, 890, 0, 604, 164, 164, 164, 20, 0, ! 1330, 77, 446, 449, 605, 77, 0, 23, 1720, 0, ! 0, 208, 220, 0, 0, 0, 0, 1518, 1519, 0, ! 1528, 1529, 1780, 1531, 0, 0, 1432, 0, 1433, 0, ! 1434, 270, 131, 132, 10, 0, 1006, 1006, 1006, 402, ! 403, 404, 1796, 0, 206, 1031, 123, 124, 99, 114, ! 115, 0, 957, 0, 0, 0, 0, 803, 804, 208, ! 18, 0, 0, 0, 807, 99, 114, 115, 0, 227, ! 0, 21, 1492, 1823, 0, 1564, 1565, 694, 0, 0, ! 543, 100, 101, 0, 26, 0, 405, 28, 271, 0, ! 0, 0, 206, 1008, 1011, 406, 407, 0, 635, 0, ! 635, 1263, 0, 1508, 116, 1701, 511, 514, 0, 1514, ! 0, 1264, 1316, 8, 9, 10, 0, 446, 937, 33, ! 0, 116, 1703, 1265, 698, 1535, 1536, 378, 1628, 1629, ! 1630, 635, 0, 227, 244, 0, 544, 103, 0, 862, ! 863, 511, 514, 0, 0, 0, 0, 881, 1555, 323, ! 714, 0, 21, 0, 1494, 258, 8, 9, 10, 759, ! 760, 761, 762, 763, 0, 26, 0, 0, 28, 271, ! 0, 0, 0, 1127, 1127, 1133, 0, 120, 889, 890, ! 0, 891, 0, 1133, 0, 1678, 1679, 0, 0, 0, ! 1030, 0, 1576, 1577, 0, 21, 0, 162, 0, 0, ! 33, 0, 260, 0, 729, 0, 861, 861, 864, 864, ! 518, 261, 29, 892, 880, 1622, 1623, 172, 1625, 145, ! 8, 9, 10, 173, 12, 13, 475, 0, 0, 0, ! 26, 14, 0, 123, 124, 262, 661, 662, 663, 664, ! 665, 666, 667, 33, 0, 16, 0, 17, 18, 19, ! 0, 0, 0, 0, 20, 208, 99, 114, 115, 21, ! 232, 233, 234, 23, 433, 0, 174, 0, 1248, 0, ! 0, 1249, 26, 227, 0, 28, 29, 145, 131, 132, ! 10, 0, 1256, 13, 0, 18, 1008, 1011, 206, 31, ! 0, 235, 0, 0, 0, 0, 0, 77, 0, 32, ! 0, 0, 0, 0, 0, 0, 18, 33, 0, 0, ! 0, 34, 116, 117, 0, 35, 0, 21, 131, 132, ! 159, 0, 1779, 208, 838, 208, 208, 0, 1143, 0, ! 26, 849, 1715, 28, 29, 0, 0, 0, 0, 433, ! 0, 0, 1030, 0, 0, 0, 18, 31, 1247, 0, ! 0, 1247, 208, 0, 446, 806, 206, 32, 206, 206, ! 208, 0, 1255, 694, 0, 33, 1031, 1031, 1031, 34, ! 26, 0, 860, 134, 135, 0, 0, 0, 0, 0, ! 0, 860, 0, 0, 0, 206, 0, 695, 0, 1248, ! 1249, 1008, 1011, 206, 433, 0, 0, 696, 1256, 0, ! 1008, 1011, 862, 863, 511, 514, 0, 0, 0, 697, ! 698, 881, 0, 511, 514, 659, 660, 661, 662, 663, ! 664, 665, 666, 667, 0, 862, 863, 881, 0, 0, ! 0, 0, 244, 0, 571, 573, 574, 575, 576, 577, ! 0, 579, 580, 581, 582, 583, 584, 585, 586, 587, ! 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, ! 598, 599, 600, 0, 602, 0, 0, 0, 0, 1304, ! 1304, 1133, 1133, 1133, 414, 8, 566, 10, 1313, 0, ! 1133, 1133, 1133, 145, 8, 9, 10, 0, 0, 0, ! 0, 0, 1331, 1331, 1332, 0, 0, 221, 222, 223, ! 0, 0, 221, 222, 223, 14, 0, 0, 0, 0, ! 14, 162, 446, 937, 21, 0, 0, 0, 0, 0, ! 219, 260, 18, 21, 1008, 1011, 0, 18, 20, 694, ! 261, 271, 0, 20, 0, 0, 26, 23, 0, 28, ! 29, 0, 23, 145, 8, 9, 10, 221, 222, 223, ! 0, 0, 0, 832, 567, 14, 0, 208, 798, 0, ! 0, 0, 33, 833, 0, 0, 1248, 1249, 1008, 1011, ! 0, 33, 18, 1256, 0, 834, 698, 0, 20, 862, ! 863, 511, 514, 21, 0, 0, 881, 23, 0, 694, ! 206, 0, 0, 0, 0, 0, 26, 0, 0, 28, ! 29, 0, 511, 514, 1031, 1031, 1031, 0, 0, 0, ! 0, 0, 0, 832, 0, 0, 0, 446, 449, 0, ! 0, 0, 208, 833, 0, 0, 446, 1314, 0, 0, ! 0, 33, 0, 0, 0, 842, 698, 145, 8, 9, ! 10, 0, 0, 13, 0, 0, 1304, 1304, 1133, 1133, ! 1133, 0, 0, 1313, 0, 206, 159, 755, 756, 757, ! 758, 759, 760, 761, 762, 763, 18, 0, 0, 1444, ! 1444, 1332, 0, 0, 0, 0, 0, 21, 0, 145, ! 131, 132, 10, 694, 0, 253, 0, 0, 475, 475, ! 26, 433, 0, 28, 29, 0, 0, 0, 1248, 1249, ! 0, 1256, 0, 0, 0, 0, 0, 832, 18, 0, ! 433, 862, 863, 0, 881, 475, 0, 833, 0, 21, ! 475, 0, 0, 0, 860, 33, 0, 860, 81, 834, ! 698, 1184, 26, 0, 917, 28, 29, 0, 108, 0, ! 0, 0, 0, 860, 0, 0, 0, 0, 137, 31, ! 446, 806, 0, 0, 0, 150, 150, 918, 150, 32, ! 81, 0, 1008, 1011, 0, 923, 0, 33, 0, 81, ! 0, 34, 0, 0, 0, 511, 514, 0, 1504, 1504, ! 0, 1505, 210, 0, 81, 757, 758, 759, 760, 761, ! 762, 763, 245, 0, 446, 806, 0, 108, 0, 475, ! 475, 0, 475, 475, 0, 475, 0, 0, 276, 0, ! 108, 0, 0, 0, 0, 368, 0, 0, 368, 0, ! 368, 145, 8, 9, 10, 173, 12, 13, 0, 0, ! 0, 488, 0, 14, 108, 0, 0, 0, 131, 132, ! 0, 0, 1559, 1559, 1559, 0, 0, 16, 0, 17, ! 18, 0, 0, 0, 0, 0, 20, 475, 475, 0, ! 0, 21, 137, 0, 81, 23, 368, 694, 368, 0, ! 150, 150, 0, 0, 26, 436, 150, 28, 29, 150, ! 150, 150, 0, 694, 0, 0, 0, 131, 132, 0, ! 26, 1130, 13, 134, 135, 81, 221, 222, 223, 81, ! 0, 1131, 0, 0, 14, 210, 81, 695, 0, 33, ! 475, 475, 475, 1132, 698, 18, 0, 696, 0, 0, ! 0, 18, 0, 0, 210, 210, 210, 20, 0, 697, ! 698, 0, 694, 0, 0, 0, 23, 0, 0, 26, ! 0, 0, 134, 135, 0, 0, 0, 0, 0, 0, ! 0, 0, 1044, 210, 219, 227, 695, 433, 0, 414, ! 131, 132, 10, 0, 0, 0, 696, 475, 475, 0, ! 548, 0, 0, 0, 145, 8, 9, 10, 697, 698, ! 108, 0, 0, 0, 511, 514, 0, 0, 0, 0, ! 860, 0, 0, 150, 0, 0, 860, 0, 0, 21, ! 0, 1184, 0, 1184, 0, 0, 260, 0, 1365, 1372, ! 518, 1184, 0, 0, 21, 261, 271, 0, 0, 0, ! 145, 8, 9, 10, 173, 12, 13, 26, 0, 0, ! 28, 29, 14, 0, 199, 108, 606, 0, 0, 567, ! 0, 1364, 0, 0, 200, 0, 16, 33, 17, 18, ! 19, 864, 864, 864, 201, 20, 0, 0, 0, 0, ! 21, 0, 33, 227, 23, 0, 202, 174, 0, 0, ! 0, 1197, 1198, 26, 0, 0, 28, 29, 0, 0, ! 108, 0, 0, 0, 692, 0, 606, 606, 707, 0, ! 31, 0, 0, 0, 0, 0, 0, 368, 81, 0, ! 32, 0, 0, 0, 475, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, ! 0, 0, 414, 8, 9, 10, 0, 0, 0, 0, ! 0, 0, 8, 9, 433, 0, 0, 137, 0, 0, ! 0, 0, 0, 433, 0, 0, 0, 108, 0, 210, ! 108, 0, 0, 0, 0, 1143, 368, 0, 150, 0, ! 18, 0, 21, 0, 0, 0, 0, 860, 150, 260, ! 0, 150, 0, 0, 0, 1365, 860, 694, 261, 271, ! 0, 0, 0, 150, 26, 0, 0, 134, 135, 0, ! 0, 81, 0, 0, 860, 860, 0, 446, 1314, 0, ! 0, 1501, 262, 0, 0, 1184, 0, 0, 1364, 0, ! 33, 1502, 145, 8, 9, 10, 0, 210, 839, 210, ! 210, 707, 0, 1503, 698, 839, 0, 270, 415, 416, ! 10, 0, 0, 210, 210, 0, 0, 210, 0, 210, ! 210, 210, 870, 0, 0, 0, 210, 0, 0, 0, ! 0, 210, 21, 0, 210, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 368, 26, 0, 21, 28, 29, ! 0, 1165, 1663, 7, 8, 1166, 10, 173, 12, 13, ! 26, 0, 200, 28, 271, 14, 0, 0, 150, 0, ! 1527, 0, 201, 0, 0, 1527, 0, 0, 1184, 16, ! 33, 17, 18, 19, 202, 0, 0, 860, 20, -553, ! 0, 0, 0, 21, 0, 33, 0, 23, 1167, 0, ! 174, 0, 0, 1526, 0, 0, 26, 0, 0, 28, ! 29, 0, 922, 1168, 368, 1169, 0, 0, 0, 0, ! 0, 0, 0, 31, 108, 108, 108, 108, 0, 0, ! 0, 0, 0, 32, 0, 0, 0, 414, 131, 132, ! 10, 33, 0, 0, 0, 1170, 368, 860, 860, 0, ! 145, 8, 9, 10, 0, 0, 253, 655, 656, 657, ! 658, -553, 659, 660, 661, 662, 663, 664, 665, 666, ! 667, 414, 8, 9, 10, 0, 0, 21, 0, 18, ! 0, 0, 0, 108, 260, 606, 0, 0, 0, 0, ! 21, 0, 0, 261, 271, 0, 694, 692, 0, 606, ! 606, 707, 860, 26, 0, 0, 28, 29, 1032, 0, ! 0, 21, 1034, 0, 1355, 1356, 9, 10, 260, 0, ! 832, 0, 208, 1668, 208, 33, 0, 261, 271, 0, ! 833, 210, 0, 0, 0, 0, 0, 231, 33, 0, ! 0, 0, 834, 698, 0, 0, 0, 0, 0, 0, ! 0, 567, 0, 0, 21, 206, 0, 206, 6, 33, ! 7, 8, 9, 10, 11, 12, 13, 26, 0, 0, ! 28, 29, 14, 0, 1451, 0, 1357, 0, 0, 0, ! 137, 0, 368, 0, 200, 15, 16, 137, 17, 18, ! 19, 0, 0, 0, 201, 20, 210, 245, 0, 0, ! 21, 0, 33, 22, 23, 24, 202, 25, 0, 0, ! 0, 0, 0, 26, 27, 0, 28, 29, 231, 0, ! 30, 0, 713, 8, 9, 10, 0, 0, 0, 0, ! 31, 0, 0, 208, 231, 0, 210, 210, 1135, 0, ! 32, 0, 0, 0, 1138, 0, 1135, 0, 33, 0, ! 0, 0, 34, 0, 0, 0, 35, 0, 0, 323, ! 714, 0, 21, 0, 0, 210, 206, 0, 870, 210, ! 210, 870, 870, 870, 0, 26, 0, 210, 715, 135, ! 0, 0, 0, 0, 210, 0, 0, 0, 0, 277, ! 0, 231, 8, 9, 0, 0, 12, 13, 0, 231, ! 0, 0, 0, 14, 0, 81, 0, 0, 108, 368, ! 368, 0, 368, 0, 108, 0, 231, 16, 0, 17, ! 18, 0, 0, 606, 606, 606, 20, 231, 278, 279, ! 0, 0, 0, 0, 0, 23, 606, 280, 0, 0, ! 0, 0, 0, 0, 26, 0, 0, 134, 135, 0, ! 281, 0, 0, 0, 282, 283, 284, 285, 286, 287, ! 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, ! 298, 299, 300, 301, 302, 0, 0, 303, 304, 305, ! 0, 306, 0, 0, 307, 0, 0, 108, 131, 132, ! 0, 0, 685, 253, 270, 415, 416, 10, 0, 686, ! 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 606, 606, 0, 0, 606, 0, 18, 0, 0, 0, ! 0, 108, 0, 0, 0, 606, 0, 108, 0, 1032, ! 1032, 1032, 0, 694, 21, 606, 0, 1138, 0, 0, ! 26, 687, 0, 134, 135, 0, 0, 26, 0, 0, ! 28, 271, 0, 0, 0, 0, 0, 695, 1165, 0, ! 7, 8, 1166, 10, 173, 12, 13, 696, 0, 0, ! 0, 0, 14, 0, 0, 0, 0, 0, 0, 697, ! 698, 0, 688, 0, 0, 0, 16, 0, 17, 18, ! 19, 0, 0, 0, 0, 20, 108, 0, 108, 368, ! 21, 0, 0, 0, 23, 1167, 231, 174, 0, 0, ! 0, 0, 0, 26, 0, 231, 28, 29, 0, 0, ! 1168, 0, 1169, 0, 0, 0, 0, 0, 0, 0, ! 31, 210, 210, 210, 210, 210, 1135, 870, 0, 0, ! 32, 210, 0, 1135, 1135, 1135, 0, 231, 33, 1138, ! 0, 0, 1170, 0, 108, 870, 870, 870, 0, 0, ! 0, 0, 145, 8, 9, 10, 0, 0, 13, 0, ! 0, 137, 0, 0, 150, 81, 0, 81, 0, 0, ! 0, 231, 1366, 81, 0, 81, 0, 0, 0, 0, ! 231, 18, 0, 0, 0, 0, 0, 0, 108, 0, ! 108, 0, 21, 0, 145, 131, 132, 10, 694, 231, ! 108, 0, 0, 0, 0, 26, 0, 0, 28, 29, ! 0, 0, 0, 0, 0, 713, 8, 9, 10, 0, ! 0, 0, 1130, 18, 0, 0, 231, 606, 606, 0, ! 606, 0, 1131, 0, 21, 368, 0, 0, 0, 0, ! 33, 606, 0, 0, 1132, 698, 0, 26, 0, 606, ! 28, 29, 323, 714, 0, 21, 0, 606, 606, 707, ! 0, 0, 0, 0, 155, 0, 0, 0, 26, 0, ! 0, 134, 135, 0, 156, 145, 8, 9, 10, 221, ! 222, 223, 33, 0, 0, 0, 157, 14, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 210, 210, ! 210, 870, 870, 1439, 18, 0, 210, 210, 0, 0, ! 20, 0, 0, 0, 0, 21, 0, 0, 0, 23, ! 0, 694, 870, 870, 870, 870, 870, 0, 26, 0, ! 0, 28, 29, 0, 0, 108, 0, 0, 0, 1366, ! 0, 0, 0, 0, 0, 832, 0, 0, 108, 145, ! 8, 9, 10, 0, 0, 833, 0, 0, 0, 0, ! 0, 1463, 0, 33, 0, 0, 84, 834, 698, 81, ! 0, 0, 0, 0, 352, 0, 110, 352, 18, 352, ! 0, 0, 0, 0, 0, 130, 138, 0, 0, 21, ! 0, 0, 0, 151, 151, 694, 151, 0, 84, 0, ! 0, 0, 26, 0, 0, 28, 29, 84, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, ! 151, 0, 84, 0, 0, 352, 0, 352, 0, 833, ! 246, 870, 870, 0, 870, 256, 108, 33, 870, 0, ! 0, 834, 698, 0, 414, 131, 1530, 10, 256, 0, ! 0, 0, 0, 369, 210, 0, 369, 1324, 369, 150, ! 8, 9, 81, 0, 12, 13, 654, 655, 656, 657, ! 658, 14, 659, 660, 661, 662, 663, 664, 665, 666, ! 667, 0, 0, 0, 21, 16, 0, 17, 18, 0, ! 0, 260, 0, 0, 20, 870, 870, 1439, 870, 870, ! 261, 271, 84, 23, 369, 108, 369, 0, 151, 151, ! 0, 0, 26, 0, 151, 134, 135, 151, 151, 151, ! 0, 0, 0, 231, 567, 0, 231, 0, 0, 0, ! 0, 0, 33, 84, 0, 0, 0, 84, 0, 0, ! 0, 0, 231, 151, 84, 8, 9, 0, 173, 12, ! 13, 108, 0, 870, 488, 0, 14, 0, 0, 0, ! 0, 0, 151, 151, 151, 0, 0, 0, 0, 0, ! 16, 0, 17, 18, 0, 0, 0, 0, 0, 20, ! 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, ! 694, 151, 0, 0, 0, 0, 0, 26, 0, 0, ! 134, 135, 0, 616, 617, 0, 210, 839, 210, 0, ! 0, 0, 0, 0, 695, 0, 0, 352, 0, 626, ! 0, 0, 627, 0, 696, 628, 0, 0, 638, 0, ! 0, 151, 643, 0, 0, 0, 697, 698, 0, 1165, ! 683, 7, 8, 1166, 10, 173, 12, 13, 0, 0, ! 0, 0, 0, 14, 0, 0, 352, 0, 0, 0, ! 0, 0, 0, 1135, 0, 0, 0, 16, 231, 17, ! 18, 19, 0, 256, 608, 0, 20, -554, 0, 0, ! 0, 21, 0, 0, 0, 23, 1167, 0, 174, 0, ! 0, 0, 0, 231, 26, 0, 0, 28, 29, 0, ! 0, 1168, 0, 1169, 1135, 1135, 1135, 0, 0, 0, ! 0, 31, 0, 0, 0, 352, 0, 210, 256, 0, ! 0, 32, 693, 0, 608, 608, 708, 0, 0, 33, ! 0, 719, 0, 1170, 0, 369, 84, 0, 0, 0, ! 0, 0, 0, 0, 145, 8, 9, 10, 0, -554, ! 563, 719, 746, 747, 748, 749, 750, 751, 752, 753, ! 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, ! 0, 0, 0, 18, 0, 783, 0, 0, 0, 0, ! 0, 0, 0, 0, 21, 256, 0, 151, 256, 231, ! 694, 0, 0, 0, 369, 231, 151, 26, 0, 0, ! 28, 29, 0, 0, 0, 0, 151, 0, 0, 151, ! 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, ! 0, 151, 0, 352, 833, 0, 0, 0, 0, 84, ! 0, 0, 33, 0, 0, 0, 834, 698, 0, 8, ! 9, 0, 173, 12, 13, 0, 0, 0, 0, 0, ! 14, 0, 0, 0, 0, 151, 840, 151, 151, 708, ! 0, 0, 0, 840, 16, 0, 17, 18, 0, 0, ! 0, 151, 151, 20, 0, 151, 0, 151, 151, 151, ! 608, 0, 784, 0, 151, 785, 0, 0, 0, 151, ! 0, 26, 151, 352, 134, 135, 0, 0, 0, 0, ! 0, 0, 369, 0, 0, 0, 0, 0, 0, 231, ! 0, 900, 0, 626, 627, 0, 0, 231, 0, 0, ! 0, 0, 0, 0, 0, 352, 151, 0, 0, 0, ! 352, 352, 0, 352, 352, 352, 352, 352, 352, 352, ! 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, ! 352, 0, 0, 0, 0, 0, 0, 0, 0, 270, ! 131, 132, 10, 0, 0, 13, 231, 0, 0, 0, ! 0, 0, 369, 0, 0, 231, 0, 0, 0, 0, ! 0, 0, 256, 256, 256, 256, 0, 0, 18, 0, ! 0, 0, 0, 231, 231, 0, 0, 0, 0, 21, ! 0, 0, 0, 0, 369, 694, 0, 0, 0, 0, ! 0, 0, 26, 0, 0, 28, 271, 0, 1165, 0, ! 7, 8, 1166, 10, 173, 12, 13, 0, 0, 1263, ! 0, 0, 14, 0, 0, 0, 0, 0, 0, 1264, ! 0, 256, 0, 608, 0, 0, 16, 33, 17, 18, ! 19, 1265, 698, 0, 0, 20, -556, 608, 608, 708, ! 21, 352, 0, 0, 23, 1167, 1033, 174, 0, 0, ! 0, 0, 0, 26, 0, 0, 28, 29, 0, 0, ! 1168, 719, 1169, 0, 0, 0, 0, 0, 0, 151, ! 31, 270, 8, 9, 10, 173, 12, 13, 0, 0, ! 32, 488, 0, 14, 0, 0, 231, 0, 33, 0, ! 0, 0, 1170, 0, 0, 0, 0, 16, 0, 17, ! 18, 0, 0, 0, 0, 0, 20, 0, -556, 0, ! 0, 21, 0, 0, 0, 23, 0, 694, 783, 0, ! 369, 0, 0, 0, 26, 0, 130, 28, 271, 0, ! 0, 0, 0, 0, 151, 246, 0, 0, 0, 0, ! 0, 1263, 0, 0, 131, 132, 231, 231, 0, 563, ! 0, 1264, 0, 0, 0, 0, 0, 0, 0, 33, ! 900, 0, 0, 1265, 698, 0, 0, 0, 352, 352, ! 0, 352, 18, 0, 151, 151, 840, 0, 0, 0, ! 0, 0, 0, 0, 1145, 270, 8, 9, 10, 694, ! 0, 13, 0, 0, 0, 0, 26, 0, 0, 134, ! 135, 231, 0, 151, 0, 0, 608, 151, 151, 608, ! 608, 608, 0, 695, 18, 151, 0, 0, 0, 0, ! 0, 0, 151, 696, 0, 21, 0, 145, 131, 132, ! 10, 694, 0, 13, 0, 697, 698, 0, 26, 0, ! 0, 28, 271, 84, 0, 0, 256, 369, 369, 0, ! 369, 0, 256, 0, 0, 1307, 18, 0, 1238, 0, ! 0, 608, 608, 608, 0, 1308, 0, 21, 0, 0, ! 0, 0, 0, 33, 608, 0, 0, 1309, 698, 0, ! 26, 0, 0, 28, 29, 0, 0, 0, 626, 627, ! 0, 0, 0, 0, 0, 0, 0, 155, 1165, 0, ! 7, 8, 1166, 10, 173, 12, 13, 156, 0, 0, ! 0, 0, 14, 0, 0, 33, 0, 0, 0, 157, ! 0, 0, 0, 0, 0, 256, 16, 0, 17, 18, ! 19, 0, 0, 0, 0, 20, -555, 0, 8, 9, ! 21, 0, 0, 253, 23, 1167, 0, 174, 608, 608, ! 0, 0, 608, 26, 0, 0, 28, 29, 352, 256, ! 1168, 352, 1169, 608, 0, 256, 18, 1033, 1033, 1033, ! 31, 0, 0, 608, 0, 719, 0, 0, 0, 0, ! 32, 0, 0, 694, 0, 0, 0, 0, 33, 0, ! 26, 0, 1170, 134, 135, 0, 0, 0, 270, 8, ! 9, 10, 626, 627, 0, 0, 0, 1501, -555, 651, ! 652, 653, 654, 655, 656, 657, 658, 1502, 659, 660, ! 661, 662, 663, 664, 665, 666, 667, 18, 0, 1503, ! 698, 0, 0, 0, 256, 0, 256, 369, 21, 0, ! 0, 0, 0, 0, 694, 0, 0, 0, 0, 0, ! 0, 26, 0, 0, 28, 271, 0, 0, 0, 0, ! 0, 145, 8, 9, 10, 0, 0, 0, 1307, 151, ! 151, 151, 151, 151, 840, 608, 0, 0, 1308, 151, ! 0, 1145, 1145, 1145, 352, 0, 33, 719, 0, 0, ! 1309, 698, 256, 608, 608, 608, 0, 0, 0, 0, ! 0, 21, 1411, 0, 352, 0, 900, 0, 0, 138, ! 0, 0, 151, 84, 26, 84, 0, 28, 29, 0, ! 1367, 84, 0, 84, 0, 0, 0, 0, 0, 0, ! 0, 200, 0, 0, 0, 0, 256, 0, 256, 8, ! 9, 201, 0, 12, 253, 0, 0, 0, 256, 33, ! 14, 0, 0, 202, 0, 0, 0, 0, 54, 0, ! 0, 0, 0, 0, 16, 0, 17, 18, 0, 0, ! 0, 0, 0, 20, 0, 608, 608, 0, 608, 0, ! 0, 0, 23, 369, 694, 54, 54, 0, 158, 608, ! 54, 26, 0, 0, 134, 135, 0, 608, 0, 54, ! 0, 0, 0, 0, 0, 608, 608, 708, 695, 0, ! 0, 0, 54, 0, 54, 656, 657, 658, 696, 659, ! 660, 661, 662, 663, 664, 665, 666, 667, 0, 0, ! 697, 698, 0, 0, 0, 264, 900, 0, 272, 0, ! 0, 0, 0, 0, 0, 0, 151, 151, 151, 608, ! 608, 708, 0, 0, 151, 151, 750, 751, 752, 753, ! 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, ! 608, 608, 608, 608, 608, 0, 0, 0, 900, 0, ! 0, 0, 0, 256, 0, 0, 0, 1367, 0, 0, ! 0, 417, 417, 0, 54, 0, 256, 0, 0, 0, ! 54, 54, 0, 0, 264, 272, 54, 0, 0, 158, ! 158, 158, 0, 0, 0, 0, 456, 84, 0, 0, ! 0, 0, 0, 0, 0, 54, 0, 0, 0, 54, ! 0, 0, 0, 0, 0, 54, 54, 0, 0, 6, ! 0, 7, 8, 9, 10, 11, 12, 13, 0, 0, ! 0, 0, 0, 14, 54, 54, 158, 0, 0, 0, ! 0, 0, 0, 0, 264, 0, 0, 16, 0, 17, ! 18, 0, 0, 0, 0, 0, 20, 0, 0, 608, ! 608, 21, 608, 54, 256, 23, 608, 0, 463, 0, ! 0, 0, 0, 0, 26, 0, 0, 28, 29, 0, ! 0, 30, 151, 0, 0, 0, 0, 151, 0, 0, ! 84, 31, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 32, 0, 54, 0, 0, 0, 0, 0, 33, ! 264, 657, 658, 34, 659, 660, 661, 662, 663, 664, ! 665, 666, 667, 608, 608, 708, 608, 608, 0, 0, ! 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, ! 270, 8, 9, 10, 173, 12, 13, 0, 638, 0, ! 488, 0, 14, 751, 752, 753, 754, 755, 756, 757, ! 758, 759, 760, 761, 762, 763, 16, 0, 17, 18, ! 269, 0, 0, 0, 0, 20, 0, 634, 0, 256, ! 21, 608, 0, 0, 23, 0, 694, 145, 131, 132, ! 10, 0, 0, 26, 417, 0, 28, 271, 0, 0, ! 0, 0, 264, 0, 0, 0, 0, 0, 54, 0, ! 1307, 0, 0, 0, 0, 0, 18, 0, 0, 0, ! 1308, 0, 264, 1656, 0, 0, 0, 21, 33, 0, ! 0, 0, 1309, 698, 151, 840, 151, 0, 0, 0, ! 26, 0, 0, 28, 29, 0, 0, 417, 0, 0, ! 0, 0, 459, 626, 627, 0, 0, 31, 0, 54, ! 0, 0, 0, 0, 0, 0, 0, 32, 54, 0, ! 264, 0, 0, 0, 0, 33, 0, 456, 54, 34, ! 0, 54, 0, 0, 0, 508, 0, 456, 456, 456, ! 0, 1145, 0, 54, 0, 0, 0, 0, 527, 0, ! 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, -419, 8, 9, -419, -419, 12, 253, ! 0, 0, 0, 0, 0, 14, 0, 54, 54, 54, ! 54, 0, 1145, 1145, 1145, 54, 0, 0, 0, 16, ! 0, 17, 18, 54, 54, 151, 0, 54, 20, 158, ! 158, 158, 456, -419, 0, 0, 54, 23, 0, 694, ! 0, 54, 0, 0, 54, 0, 26, 0, 0, 134, ! 135, 145, 8, 9, 10, 0, 0, 13, 0, 0, ! 0, 0, 0, 695, 0, 0, 0, 0, 0, 79, ! 0, 0, 0, 696, 0, 0, 0, 0, 54, 0, ! 18, -419, 0, 0, 0, 697, 698, 0, 0, 0, ! 0, 21, 0, 0, 0, 0, 79, 79, 0, 79, ! 0, 79, 0, 0, 26, 0, 0, 28, 29, 0, ! 79, 0, 145, 8, 9, 10, 212, 12, 213, 0, ! 0, 200, 0, 79, 14, 79, 634, 0, 634, 0, ! 0, 201, 0, 0, 0, 0, 0, 0, 16, 33, ! 17, 18, 0, 202, 634, 634, 634, 20, 0, 274, ! 0, 0, 21, 0, 0, 0, 23, 0, 0, 634, ! 0, 0, 0, 0, 0, 26, 0, 0, 28, 29, ! 0, 0, 214, 0, 0, 652, 653, 654, 655, 656, ! 657, 658, 31, 659, 660, 661, 662, 663, 664, 665, ! 666, 667, 32, 0, 0, 0, 0, 0, 0, 0, ! 33, 0, 0, 0, 34, 79, 264, 0, 0, 0, ! 0, 79, 79, 0, 0, 0, 274, 79, 634, 0, ! 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 8, 9, 0, 79, 0, 563, 0, ! 79, 54, 0, 0, 0, 0, 79, 79, 752, 753, ! 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, ! 0, 18, 0, 0, 0, 79, 79, 79, 0, 0, ! 145, 8, 9, 10, 173, 12, 13, 0, 694, 0, ! 848, 0, 14, 0, 0, 26, 0, 873, 134, 135, ! 417, 0, 879, 0, 79, 0, 16, 417, 17, 18, ! 0, 0, 1501, 0, 0, 20, 54, 0, 0, 0, ! 21, 0, 1502, 0, 23, 0, 0, 0, 0, 0, ! 0, 903, 0, 26, 1503, 698, 28, 29, 909, 0, ! 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, ! 31, 0, 0, 0, 0, 0, 54, 54, 158, 0, ! 32, 0, 0, 264, 272, 0, 1142, 0, 33, 0, ! 0, 0, 34, 145, 131, 132, 10, 0, 0, 563, ! 634, 919, 920, 0, 921, 54, 0, 0, 456, 54, ! 54, 456, 456, 456, 0, 0, 0, 54, 0, 0, ! 0, 0, 18, 0, 54, 0, 1355, 8, 1166, 10, ! 212, 12, 213, 21, 0, 0, 0, 0, 14, 0, ! 0, 0, 0, 0, 0, 54, 26, 0, 0, 28, ! 29, 0, 16, 0, 17, 18, 0, 0, 0, 0, ! 0, 20, 0, 31, 718, 0, 21, 131, 132, 79, ! 23, 222, 223, 32, 0, 0, 0, 0, 14, 26, ! 0, 33, 28, 29, 718, 34, 0, 0, 1357, 0, ! 0, 0, 0, 0, 0, 18, 31, 1020, 1021, 0, ! 0, 20, 1020, 0, 0, 0, 32, 0, 0, 0, ! 23, 0, 694, 0, 33, 0, 0, 0, 1170, 26, ! 79, 0, 134, 135, 0, 0, 0, 0, 0, 79, ! 0, 0, 0, 0, 0, 0, 695, 0, 0, 79, ! 0, 0, 79, 0, 0, 0, 696, 0, 0, 0, ! 0, 0, 0, 0, 79, 0, 0, 0, 704, 698, ! 0, 0, 79, 0, 0, 0, 0, 0, 0, 634, ! 634, 634, 0, 0, 0, 456, 264, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, ! 79, 79, 0, 0, 0, 0, 79, 0, 0, 0, ! 0, 0, 0, 0, 79, 79, 0, 0, 79, 0, ! 79, 79, 79, 0, 0, 0, 0, 79, 0, 0, ! 0, 0, 79, 0, 0, 79, 0, 0, 0, 0, ! 0, 0, 0, 1137, 165, 8, 9, 0, 0, 12, ! 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 211, 79, ! 16, 0, 17, 18, 0, 0, 0, 0, 1153, 20, ! 0, 54, 54, 54, 158, 158, 158, 456, 23, 264, ! 0, 54, 264, 1142, 1142, 1142, 0, 26, 0, 272, ! 134, 135, 145, 8, 9, 10, 212, 12, 213, 0, ! 0, 0, 0, 0, 14, 0, 0, 0, 1193, 0, ! 1195, 0, 0, 0, 158, 54, 0, 54, 16, 0, ! 17, 18, 54, 54, 0, 54, 983, 20, 0, 0, ! 0, 0, 21, 0, 0, 0, 23, 0, 0, 0, ! 0, 0, 8, 9, 0, 26, 12, 13, 28, 29, ! 0, 0, 1666, 14, 0, 165, 165, 165, 0, 0, ! 0, 0, 31, 0, 0, 0, 0, 16, 0, 17, ! 18, 0, 32, 0, 0, 0, 20, 0, 0, 0, ! 33, 211, 0, 0, 34, 23, 1233, 1234, 718, 1236, ! 0, 0, 0, 0, 26, 0, 0, 134, 135, 677, ! 211, 211, 520, 0, 0, 0, 0, 456, 456, 456, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 1257, ! 0, 0, 79, 0, 0, 0, 131, 132, 0, 211, ! 222, 223, 0, 678, 0, 0, 0, 14, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, ! 54, 456, 456, 456, 18, 0, 54, 54, 0, 0, ! 20, 0, 0, 0, 0, 0, 0, 0, 0, 23, ! 0, 694, 0, 0, 0, 0, 0, 0, 26, 0, ! 0, 134, 135, 0, 0, 0, 0, 79, 0, 54, ! 0, 0, 0, 0, 0, 695, 145, 8, 9, 10, ! 173, 12, 13, 0, 0, 696, 0, 0, 14, 0, ! 264, 272, 607, 0, 0, 0, 0, 697, 698, 54, ! 0, 0, 16, 0, 17, 18, 0, 79, 79, 79, ! 0, 20, 0, 1312, 0, 274, 21, 1144, 0, 0, ! 23, 0, 0, 0, 0, 0, 0, 0, 0, 26, ! 0, 0, 28, 29, 0, 0, 79, 0, 0, 0, ! 79, 79, 701, 701, 701, 0, 31, 0, 79, 0, ! 145, 8, 9, 10, 0, 79, 32, 0, 0, 0, ! 0, 0, 0, 0, 33, 0, 0, 0, 34, 145, ! 8, 9, 10, 212, 12, 213, 79, 0, 0, 18, ! 0, 14, 0, 0, 54, 0, 0, 264, 0, 54, ! 21, 0, 54, 0, 0, 16, 0, 17, 18, 0, ! 0, 0, 0, 26, 20, 211, 28, 29, 0, 21, ! 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, ! 515, 0, 26, 0, 0, 28, 29, 0, 1417, 0, ! 516, 0, 0, 0, 0, 0, 0, 0, 33, 31, ! 0, 0, 517, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 836, 0, 836, 836, 701, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 1440, 0, 211, ! 211, 0, 0, 211, 0, 520, 520, 520, 871, 0, ! 8, 9, 211, 173, 12, 13, 0, 211, 718, 488, ! 211, 14, 0, 0, 0, 0, 0, 1448, 0, 0, ! 0, 0, 0, 0, 0, 16, 0, 17, 18, 0, ! 1454, 0, 0, 0, 20, 0, 54, 54, 54, 0, ! 0, 0, 0, 23, 0, 694, 0, 0, 0, 0, ! 0, 0, 26, 0, 0, 134, 135, 1470, 0, 0, ! 0, 1471, 0, 653, 654, 655, 656, 657, 658, 1501, ! 659, 660, 661, 662, 663, 664, 665, 666, 667, 1502, ! 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, ! 0, 1503, 698, 1142, 0, 0, 1493, 0, 0, 0, ! 0, 0, 79, 79, 79, 79, 79, 79, 0, 0, ! 267, 0, 79, 275, 1144, 1144, 1144, 0, 0, 0, ! 1318, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1142, 1142, 1142, 267, 0, 381, ! 0, 0, 0, 0, 0, 79, 79, 54, 79, 1537, ! 1538, 0, 0, 79, 79, 0, 79, 0, 0, 0, ! 0, 992, 145, 8, 9, 10, 221, 222, 223, 0, ! 0, 0, 0, 0, 14, 701, 701, 701, 0, 0, ! 0, 0, 0, 0, 701, 0, 1560, 1561, 0, 0, ! 0, 18, 1563, 0, 0, 0, 0, 20, 0, 0, ! 0, 0, 21, 0, 0, 0, 23, 211, 694, 0, ! 209, 0, 0, 0, 0, 26, 0, 0, 28, 29, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, ! 209, 209, 200, 0, 0, 0, 0, 0, 0, 526, ! 8, 9, 201, 212, 12, 213, 145, 8, 9, 10, ! 33, 14, 253, 0, 1669, 0, 0, 0, 209, 0, ! 0, 0, 0, 0, 0, 16, 0, 17, 18, 0, ! 0, 0, 836, 0, 20, 18, 0, 0, 0, 79, ! 79, 79, 0, 23, 0, 275, 21, 79, 79, 0, ! 0, 0, 26, 0, 0, 134, 135, 0, 0, 26, ! 0, 1677, 28, 29, 0, 267, 0, 0, 0, 0, ! 0, 0, 836, 836, 1136, 0, 200, 0, 0, 0, ! 79, 0, 1136, 0, 0, 0, 201, 0, 0, 0, ! 0, 0, 0, 0, 33, 8, 9, 0, 202, 0, ! 13, 211, 274, 0, 871, 211, 211, 871, 871, 871, ! 79, 0, 0, 211, 0, 0, 0, 0, 0, 0, ! 211, 0, 0, 18, 0, 0, 0, 145, 8, 9, ! 10, 0, 0, 13, 0, 0, 145, 8, 9, 10, ! 694, 0, 563, 0, 0, 0, 0, 26, 0, 0, ! 134, 135, 0, 0, 0, 0, 18, 267, 275, 607, ! 607, 607, 0, 0, 1501, 18, 0, 21, 0, 0, ! 0, 0, 701, 0, 1502, 0, 21, 267, 275, 0, ! 26, 0, 0, 28, 29, 0, 1503, 698, 0, 26, ! 0, 0, 28, 29, 0, 79, 0, 515, 0, 0, ! 79, 0, 0, 79, 0, 0, 200, 516, 0, 0, ! 0, 0, 0, 0, 209, 33, 201, 0, 0, 517, ! 0, 0, 0, 491, 33, 0, 0, 0, 202, 0, ! 270, 8, 9, 10, 0, 0, 13, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 701, 701, 0, 0, ! 701, 0, 0, 0, 0, 0, 0, 0, 0, 18, ! 0, 701, 0, 0, 0, 701, 701, 701, 0, 0, ! 21, 701, 145, 8, 9, 10, 0, 0, 0, 0, ! 0, 0, 209, 26, 209, 209, 28, 271, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 209, 209, ! 867, 18, 209, 0, 209, 209, 209, 209, 0, 0, ! 868, 209, 21, 0, 0, 0, 209, 0, 33, 209, ! 0, 0, 869, 0, 0, 26, 0, 0, 28, 29, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 200, 0, 0, 0, 0, 79, 79, 79, ! 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, ! 33, 0, 0, 0, 202, 0, 0, 836, 836, 836, ! 1136, 1136, 1136, 1310, 0, 0, 0, 836, 0, 1136, ! 1136, 1136, 0, 270, 8, 9, 10, 0, 0, 0, ! 0, 871, 871, 871, 0, 0, 0, 0, 145, 131, ! 1343, 10, 0, 0, 1144, 0, 0, 0, 0, 738, ! 165, 0, 18, 0, 0, 0, 0, 0, 211, 0, ! 0, 0, 0, 21, 0, 0, 0, 18, 0, 0, ! 0, 0, 1355, 1356, 9, 10, 26, 0, 21, 28, ! 271, 0, 0, 0, 0, 1144, 1144, 1144, 0, 0, ! 0, 26, 0, 867, 28, 29, 0, 0, 79, 0, ! 0, 0, 0, 868, 0, 0, 0, 0, 155, 0, ! 0, 33, 21, 992, 992, 869, 992, 0, 156, 0, ! 0, 387, 391, 0, 0, 26, 33, 701, 28, 29, ! 157, 0, 0, 0, 1357, 701, 267, 275, 0, 0, ! 0, 0, 200, 701, 701, 701, 0, 0, 0, 0, ! 824, 491, 201, 0, 0, 0, 209, 0, 0, 0, ! 33, 0, 0, 0, 202, 0, 0, 1520, 1521, 9, ! 10, 0, 0, 0, 0, 0, 0, 0, 1520, 131, ! 132, 10, 0, 0, 836, 836, 836, 1310, 1310, 1310, ! 0, 0, 836, 836, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 492, 21, 871, 871, ! 871, 871, 871, 0, 0, 0, 0, 0, 21, 0, ! 26, 209, 0, 28, 29, 211, 0, 0, 0, 1522, ! 0, 26, 0, 0, 28, 29, 0, 200, 0, 0, ! 1522, 0, 0, 0, 0, 0, 0, 201, 31, 0, ! 0, 0, 0, 0, 0, 33, 0, 0, 32, 202, ! 0, 209, 209, 1134, 0, 0, 33, 0, 267, 275, ! 34, 1134, 0, 0, 0, 0, 0, 0, 491, 0, ! 0, 0, 0, 0, 0, 928, 0, 0, 0, 0, ! 209, 0, 0, 209, 209, 209, 209, 209, 209, 526, ! 0, 0, 209, 8, 9, 0, 173, 12, 13, 209, ! 0, 824, 488, 0, 14, 0, 0, 1310, 1310, 0, ! 1310, 0, 0, 0, 871, 0, 0, 0, 16, 275, ! 17, 18, 0, 0, 0, 0, 491, 20, 0, 0, ! 211, 0, 491, 0, 491, 491, 23, 0, 0, 0, ! 0, 0, 0, 637, 0, 26, 0, 0, 134, 135, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 491, 0, 0, 0, 0, 0, 0, 491, 0, ! 0, 1310, 1310, 1310, 1310, 1310, 0, 0, 491, 747, ! 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, ! 758, 759, 760, 761, 762, 763, 0, 1052, 1054, 1055, ! 1056, 0, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, ! 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, ! 1076, 8, 9, 791, 173, 12, 13, 0, 0, 1310, ! 1619, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 17, 18, ! 0, 267, 275, 267, 0, 20, 0, 0, 0, 0, ! 0, 0, 1694, 0, 23, 0, 0, 0, 0, 0, ! 0, 0, 0, 26, 0, 0, 134, 135, 0, 0, ! 824, 0, 211, 0, 211, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, ! 0, 791, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 491, 1695, 742, 743, 744, 745, 746, ! 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, ! 757, 758, 759, 760, 761, 762, 763, 0, 0, 520, ! 0, 0, 0, 0, 0, 0, 209, 209, 209, 209, ! 209, 1134, 209, 0, 1311, 0, 209, 267, 1134, 1134, ! 1134, 0, 0, 0, 275, 0, 0, 0, 0, 0, ! 209, 209, 209, 8, 9, 0, 0, 12, 253, 0, ! 520, 520, 520, 0, 14, 0, 0, 0, 0, 0, ! 0, 0, 0, 211, 0, 0, 0, 209, 16, 0, ! 17, 18, 0, 0, 0, 0, 1216, 20, 0, 0, ! 0, 0, 926, 0, 927, 0, 23, 0, 0, 930, ! 931, 933, 934, 935, 0, 26, 0, 0, 134, 135, ! 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 824, 491, 953, 0, 0, 0, 0, ! 0, 0, 0, 0, 106, 0, 0, 0, 491, 0, ! 491, 0, 491, 125, 106, 0, 0, 0, 0, 0, ! 0, 106, 106, 0, 106, 0, 0, 0, 982, 0, ! 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, ! 0, 12, 13, 0, 0, 0, 0, 1012, 14, 0, ! 0, 0, 0, 1272, 1012, 0, 0, 0, 242, 0, ! 0, 0, 16, 0, 17, 18, 0, 0, 0, 0, ! 0, 20, 0, 209, 209, 209, 209, 209, 1134, 0, ! 23, 209, 209, 0, 0, 0, 491, 0, 0, 26, ! 0, 0, 134, 135, 0, 0, 0, 209, 209, 209, ! 209, 209, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 209, 0, 0, 0, 409, 0, ! 125, 0, 0, 0, 491, 0, 0, 106, 106, 0, ! 0, 0, 0, 0, 0, 526, 106, 106, 0, 0, ! 106, 106, 106, 0, 441, 106, 106, 106, 0, 0, ! 0, 0, 0, 0, 824, 824, 748, 749, 750, 751, ! 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, ! 762, 763, 0, 0, 0, 0, 1342, 0, 0, 0, ! 699, 699, 699, 0, 1012, 0, 0, 0, 0, 0, ! 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 209, 209, 1311, 209, ! 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 824, 824, 0, 0, 0, 209, ! 0, 0, 0, 0, 0, 242, 106, 749, 750, 751, ! 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, ! 762, 763, 0, 0, 492, 0, 0, 0, 0, 106, ! 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 209, 209, 1134, 209, 209, 0, 0, 0, 0, 0, ! 0, 0, 1423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 106, 491, 0, 491, 0, 491, 0, 824, ! 0, 699, 0, 699, 699, 699, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 209, 0, ! 0, 0, 0, 1228, 0, 0, 0, 0, 0, 0, ! 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 106, 0, 106, 106, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1458, 0, 0, 953, 0, 0, ! 0, 0, 0, 492, 0, 0, 0, 1012, 0, 0, ! 0, 209, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 824, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 106, 0, 106, 0, 0, 0, ! 0, 491, 0, 0, 106, 0, 0, 106, 1134, 0, ! 0, 0, 791, 0, 1285, 0, 0, 0, 0, 106, ! 0, 0, 0, 824, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 1516, 1517, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134, ! 1134, 1134, 1012, 0, 0, 0, 0, 0, 0, 0, ! 0, 1012, 209, 824, 0, 0, 0, 0, 0, 0, ! 1325, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 699, 699, 699, 0, 0, 0, 0, ! 0, 0, 1029, 0, 0, 0, 0, 0, 0, 1569, ! 0, 0, 0, 0, 0, 0, 0, 0, 242, 893, ! 0, 0, 0, 0, 492, 0, 492, 0, 0, 0, ! 0, 0, 0, 0, 106, 0, 1389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1626, 1627, 0, 0, 0, 0, ! 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 106, 0, 106, 0, ! 0, 1645, 0, 0, 0, 0, 0, 0, 0, 0, ! 699, 0, 0, 0, 0, 1012, 742, 743, 744, 745, ! 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, ! 756, 757, 758, 759, 760, 761, 762, 763, 0, 1683, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 699, 699, 699, 0, 0, 0, 0, 0, 0, 1012, ! 1029, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 106, 0, 0, 0, 0, 491, 0, 0, 0, ! 0, 0, 106, 106, 0, 106, 106, 0, 0, 0, ! 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 1733, 0, 0, 492, 742, 743, 744, 745, 746, ! 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, ! 757, 758, 759, 760, 761, 762, 763, 742, 743, 744, ! 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, ! 755, 756, 757, 758, 759, 760, 761, 762, 763, 0, ! 699, 0, 1395, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, ! 1717, 0, 0, 106, 125, 0, 0, 0, 0, 0, ! 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, ! 0, 0, 1325, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 893, 0, ! 0, 0, 824, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 699, 699, 0, 0, 699, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 699, ! 0, 0, 0, 1029, 1029, 1029, 0, 0, 0, 699, ! 0, 0, 0, 1012, 0, 0, 0, 0, 741, 0, ! 0, 492, 742, 743, 744, 745, 746, 747, 748, 749, ! 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, ! 760, 761, 762, 763, 0, 0, 0, 0, 0, 0, ! 893, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 791, 0, 106, ! 106, 106, 106, 0, 0, 0, 0, 0, 0, 1206, ! 0, 0, 106, 742, 743, 744, 745, 746, 747, 748, ! 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, ! 759, 760, 761, 762, 763, 699, 699, 699, 699, 699, ! 699, 699, 0, 0, 0, 699, 0, 1029, 1029, 1029, ! 1754, 742, 743, 744, 745, 746, 747, 748, 749, 750, ! 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, ! 761, 762, 763, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 106, 106, 0, 0, ! 106, 0, 0, 0, 0, 1767, 0, 270, 8, 9, ! 10, 106, 12, 314, 315, 316, 317, 0, 318, 14, ! 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 18, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 0, 0, 328, 329, 330, 331, 332, ! 26, 0, 637, 28, 271, 699, 0, -209, 382, 0, ! 0, 0, 0, 699, 335, 0, 0, 336, 0, 0, ! 0, 699, 699, 699, 0, 337, 338, 339, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 0, 343, ! 0, 0, 0, 0, 0, 0, 0, 1631, 0, -510, ! -510, -510, -510, -510, -510, -510, 344, 0, 0, -510, ! 0, -510, 699, 699, 699, 699, 699, 699, 0, 0, ! 699, 699, -510, 0, -510, 0, 0, 0, -510, 0, ! 0, 0, 0, 0, -510, 0, 0, 0, 0, -510, ! 0, 0, 0, -510, 893, -510, 0, 106, 0, 0, ! 106, 0, -510, 0, 0, -510, -510, -510, -510, -510, ! 0, -510, -510, -510, -510, -510, -510, -510, -510, -510, ! -510, -510, -510, -510, -510, -510, -510, -510, -510, -510, ! -510, -510, -510, -510, 0, -510, -510, -510, 0, -510, ! -510, -510, -510, -510, 0, 0, 0, 0, 0, 1632, ! -510, 0, 0, 0, 0, -510, -510, -510, 0, -510, ! 0, 0, 0, 106, 106, 0, 106, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, ! 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, ! 0, 0, 0, 106, 106, 699, 699, 0, 699, 0, ! 270, 8, 9, 10, 0, 12, 314, 315, 316, 317, ! 0, 318, 14, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 893, 0, 16, 319, 17, 18, ! 19, 0, 320, 321, 322, 20, 0, 323, 324, 325, ! 21, 326, 327, 0, 23, 0, 694, 0, 328, 329, ! 330, 331, 332, 26, 0, 0, 28, 271, 0, 699, ! 699, 699, 699, 699, 0, 0, 893, 335, 0, 0, ! 1025, 0, 0, 0, 0, 0, 0, 0, 337, 338, ! 1026, 0, 0, 0, 0, 0, 340, 341, 342, 0, ! 0, 0, 1027, 698, 0, 0, 0, 106, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, ! 0, 0, 0, 0, 0, 0, 1582, 699, -927, -927, ! -927, -927, -927, -927, -927, -927, -927, -927, 0, -927, ! -927, -927, 0, -927, -927, -927, -927, -927, -927, -927, ! -927, -927, -927, -927, -927, -927, -927, -927, -927, 0, ! -927, -927, -927, -927, 0, -927, -927, -927, -927, -927, ! -927, -927, -927, -927, 0, 0, -927, -927, -927, -927, ! -927, -927, 0, 0, -927, -927, -927, 0, -927, -927, ! 0, 0, 0, 0, 0, -927, 0, 0, -927, 0, ! 0, 0, 0, 106, 0, 106, -927, -927, -927, 0, ! 0, 0, 0, 0, -927, -927, -927, 0, 0, 0, ! -927, 0, -927, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 1583, -927, 1545, 0, ! -927, -927, -927, -927, -927, -927, -927, -927, -927, -927, ! 0, -927, -927, -927, 0, -927, -927, -927, -927, -927, ! -927, -927, -927, -927, -927, -927, -927, -927, -927, -927, ! -927, 0, -927, -927, -927, -927, 0, -927, -927, -927, ! -927, -927, -927, -927, -927, -927, 0, 0, -927, -927, ! -927, -927, -927, -927, 0, 0, -927, -927, -927, 0, ! -927, -927, 0, 0, 0, 0, 0, -927, 0, 0, ! -927, 0, 0, 0, 0, 0, 0, 0, -927, -927, ! -927, 0, 0, 0, 0, 0, -927, -927, -927, 0, ! 0, 0, -927, 629, -927, 270, 8, 9, 10, 173, ! 12, 314, 315, 316, 317, 488, 318, 14, 0, -927, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 18, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 694, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 271, -345, 0, 0, 382, 0, 0, 0, ! 0, 0, 335, 0, 0, 1025, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 1026, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 0, 1027, 698, 629, ! 0, 145, 8, 9, 10, 173, 12, 314, 315, 316, ! 317, 488, 318, 14, 344, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 319, 17, ! 18, 19, 0, 320, 321, 322, 20, 0, 323, 324, ! 325, 21, 326, 327, 0, 23, 0, 694, 0, 328, ! 329, 330, 331, 332, 26, 0, 0, 28, 29, -345, ! 0, 0, 382, 0, 0, 0, 0, 0, 335, 0, ! 0, 1139, 0, 0, 0, 0, 0, 0, 0, 337, ! 338, 1140, 0, 0, 0, 0, 0, 340, 341, 342, ! 0, 0, 0, 1141, 698, 487, 0, 270, 8, 9, ! 10, 173, 12, 314, 315, 316, 317, 488, 318, 14, ! 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 18, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 0, 0, 328, 329, 330, 331, 332, ! 26, 0, 0, 28, 271, 0, 0, 0, 382, 0, ! 0, 0, 0, 0, 335, 0, 0, 336, 0, 0, ! 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 956, 343, ! 270, 8, 9, 10, 173, 12, 314, 315, 316, 317, ! 0, 318, 14, 0, -840, 0, 344, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 319, 17, 18, ! 19, 0, 320, 321, 322, 20, 0, 323, 324, 325, ! 21, 326, 327, 0, 23, 0, 0, 0, 328, 329, ! 330, 331, 332, 26, 0, 0, 28, 271, 1728, 0, ! -829, 382, 0, 0, 0, 0, 0, 335, 0, 0, ! 336, 0, 0, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 0, 0, 340, 341, 342, 0, ! 0, 822, 343, 944, 945, 946, 10, 0, 12, 504, ! 315, 316, 317, 0, 318, 14, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 319, 17, 0, 19, 0, 320, 321, 322, 20, 0, ! 323, 324, 325, 21, 326, 327, 0, 23, 0, 0, ! 0, 328, 329, 330, 331, 332, 26, 0, 0, 947, ! 948, 823, 0, 0, 382, 0, 0, 0, 0, 0, ! 335, 0, 0, 336, 0, 0, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 0, 0, 340, ! 341, 342, 0, 0, 0, 343, 949, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 1124, 344, 629, 0, 270, 8, 9, 10, 0, ! 12, 314, 315, 316, 317, 0, 318, 14, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 18, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 0, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 271, -345, 0, 0, 382, 0, 0, 0, ! 0, 0, 335, 0, 0, 630, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 631, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 822, 632, 944, 945, ! 946, 10, 0, 12, 504, 315, 316, 317, 0, 318, ! 14, 0, 0, 0, 344, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 319, 17, 0, 19, 0, ! 320, 321, 322, 20, 0, 323, 324, 325, 21, 326, ! 327, 0, 23, 0, 0, 0, 328, 329, 330, 331, ! 332, 26, 0, 0, 947, 948, 823, 0, 0, 382, ! 0, 0, 0, 0, 0, 335, 0, 0, 336, 0, ! 0, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 0, 0, 340, 341, 342, 0, 0, 0, ! 343, 949, 822, 0, 270, 8, 9, 10, 0, 12, ! 504, 315, 316, 317, 0, 318, 14, 344, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 319, 17, 0, 19, 0, 320, 321, 322, 20, ! 0, 323, 324, 325, 21, 326, 327, 0, 23, 0, ! 0, 0, 328, 329, 330, 331, 332, 26, 0, 0, ! 28, 271, 823, 0, 0, 382, 0, 0, 0, 0, ! 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 0, 0, ! 340, 341, 342, 0, 0, 0, 343, 822, 0, 944, ! 945, 946, 10, 1321, 12, 504, 315, 316, 317, 0, ! 318, 14, 0, 344, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 319, 17, 0, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 0, 23, 0, 0, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 947, 948, 823, 0, 0, ! 382, 0, 0, 0, 0, 0, 335, 0, 0, 336, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 822, 343, 944, 945, 946, 10, 0, 12, 504, 315, ! 316, 317, 0, 318, 14, 0, 0, -514, 344, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 319, ! 17, 0, 19, 0, 320, 321, 322, 20, 0, 323, ! 324, 325, 21, 326, 327, 0, 23, 0, 0, 0, ! 328, 329, 330, 331, 332, 26, 0, 0, 947, 948, ! 823, 0, 0, 382, 0, 0, 0, 0, 0, 335, ! 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 0, 0, 340, 341, ! 342, 0, 0, 629, 343, 145, 8, 9, 10, 0, ! 12, 314, 315, 316, 317, 0, 318, 14, 0, 0, ! 1436, 344, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 18, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 0, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 29, -345, 0, 0, 382, 0, 0, 0, ! 0, 0, 335, 0, 0, 1710, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 1711, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 822, 1712, 270, 8, ! 9, 10, 0, 12, 504, 315, 316, 317, 0, 318, ! 14, 0, 0, 0, 344, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 319, 17, 0, 19, 0, ! 320, 321, 322, 20, 0, 323, 324, 325, 21, 326, ! 327, 0, 23, 0, 0, 0, 328, 329, 330, 331, ! 332, 26, 0, 0, 28, 271, 823, 0, 0, 382, ! 0, 0, 0, 0, 0, 335, 0, 0, 336, 0, ! 0, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 0, 0, 340, 341, 342, 0, 0, 956, ! 343, 270, 8, 9, 10, 0, 12, 504, 315, 316, ! 317, 0, 318, 14, 0, 0, 0, 344, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 319, 17, ! 0, 19, 0, 320, 321, 322, 20, 0, 323, 324, ! 325, 21, 326, 327, 0, 23, 0, 0, 0, 328, ! 329, 330, 331, 332, 26, 0, 0, 28, 271, 0, ! 0, 0, 382, -829, 0, 0, 0, 0, 335, 0, ! 0, 336, 0, 0, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 0, 0, 340, 341, 342, ! 0, 0, 956, 343, 270, 8, 9, 10, 0, 12, ! 504, 315, 316, 317, 0, 318, 14, 0, 0, 0, ! 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 319, 17, 0, 19, 0, 320, 321, 322, 20, ! 0, 323, 324, 325, 21, 326, 327, 0, 23, 0, ! 0, 0, 328, 329, 330, 331, 332, 26, 0, 0, ! 28, 271, 0, 0, 0, 382, 0, 0, 0, 0, ! 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 0, 0, ! 340, 341, 342, 0, 0, 1051, 343, 270, 8, 9, ! 10, 0, 12, 504, 315, 316, 317, 0, 318, 14, ! 0, -829, 0, 344, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 0, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 0, 0, 328, 329, 330, 331, 332, ! 26, 0, 0, 28, 271, 0, 0, 0, 382, 0, ! 0, 0, 0, 0, 335, 0, 0, 336, 0, 0, ! 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 1053, 343, ! 270, 8, 9, 10, 0, 12, 504, 315, 316, 317, ! 0, 318, 14, 0, 0, 0, 344, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 319, 17, 0, ! 19, 0, 320, 321, 322, 20, 0, 323, 324, 325, ! 21, 326, 327, 0, 23, 0, 0, 0, 328, 329, ! 330, 331, 332, 26, 0, 0, 28, 271, 0, 0, ! 0, 382, 0, 0, 0, 0, 0, 335, 0, 0, ! 336, 0, 0, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 0, 0, 340, 341, 342, 0, ! 0, 1682, 343, 270, 8, 9, 10, 0, 12, 504, ! 315, 316, 317, 0, 318, 14, 0, 0, 0, 344, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 319, 17, 0, 19, 0, 320, 321, 322, 20, 0, ! 323, 324, 325, 21, 326, 327, 0, 23, 0, 0, ! 0, 328, 329, 330, 331, 332, 26, 0, 0, 28, ! 271, 0, 0, 0, 382, 0, 0, 0, 0, 0, ! 335, 0, 0, 336, 0, 0, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 0, 0, 340, ! 341, 342, 0, 0, 0, 343, 270, 8, 9, 10, ! 0, 12, 504, 315, 316, 317, 0, 318, 14, 0, ! 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 319, 17, 0, 19, 0, 320, 321, ! 322, 20, 0, 323, 324, 325, 21, 326, 327, 0, ! 23, 0, 0, 0, 328, 329, 330, 331, 332, 26, ! 0, 0, 28, 271, 0, 0, 0, 382, 0, 0, ! 0, 0, 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, 0, ! 0, 0, 340, 341, 342, 0, 0, 0, 343, 270, ! 8, 9, 10, 0, 12, 504, 315, 316, 317, 0, ! 318, 14, 0, 0, 0, 344, 505, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 319, 17, 0, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 0, 23, 0, 0, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 28, 271, 0, 0, 0, ! 382, 0, 0, 0, 0, 0, 335, 0, 0, 336, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 0, 343, 270, 8, 9, 10, 0, 12, 504, 315, ! 316, 317, 0, 318, 14, 0, 0, 0, 344, 877, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 319, ! 17, 0, 19, 0, 320, 321, 322, 20, 0, 323, ! 324, 325, 21, 326, 327, 0, 23, 0, 0, 0, ! 328, 329, 330, 331, 332, 26, 0, 0, 28, 271, ! 0, 0, 0, 382, 0, 0, 0, 0, 0, 335, ! 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 0, 0, 340, 341, ! 342, 0, 0, 0, 343, 270, 8, 9, 10, 0, ! 12, 504, 315, 316, 317, 0, 318, 14, 0, 0, ! 0, 344, 995, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 0, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 0, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 271, 0, 0, 0, 382, 0, 0, 0, ! 0, 0, 335, 0, 0, 336, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 0, 343, 270, 8, ! 9, 10, 0, 12, 504, 315, 316, 317, 0, 318, ! 14, 0, 0, 0, 344, 1015, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 319, 17, 0, 19, 0, ! 320, 321, 322, 20, 0, 323, 324, 325, 21, 326, ! 327, 0, 23, 0, 0, 0, 328, 329, 330, 331, ! 332, 26, 0, 0, 28, 271, 0, 0, 0, 382, ! 0, 0, 0, 0, 0, 335, 0, 0, 336, 0, ! 0, 0, 0, 0, 0, 0, 337, 338, 339, 0, ! 0, 0, 0, 0, 340, 341, 342, 0, 0, 0, ! 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 344, 1259, 1586, ! 1587, 1588, 10, 173, 12, 314, 315, 316, 317, 0, ! 318, 14, 1589, 0, 1590, 1591, 1592, 1593, 1594, 1595, ! 1596, 1597, 1598, 1599, 15, 16, 319, 17, 18, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 1600, 23, 1601, 0, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 1602, 271, 1215, 0, 1603, ! 382, 0, 0, 0, 0, 0, 335, 0, 0, 336, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 0, 343, 0, 1604, 1586, 1587, 1588, 10, 173, 12, ! 314, 315, 316, 317, 0, 318, 14, 1589, 344, 1590, ! 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 15, ! 16, 319, 17, 18, 19, 0, 320, 321, 322, 20, ! 0, 323, 324, 325, 21, 326, 327, 1600, 23, 1601, ! 0, 0, 328, 329, 330, 331, 332, 26, 0, 0, ! 1602, 271, 0, 0, 1603, 382, 0, 0, 0, 0, ! 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 0, 0, ! 340, 341, 342, 0, 0, 0, 343, 0, 1604, 270, ! 8, 9, 10, 173, 12, 314, 315, 316, 317, 488, ! 318, 14, 0, 344, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 319, 17, 18, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 0, 23, 0, 694, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 28, 271, 0, 0, 0, ! 382, 0, 0, 0, 0, 0, 335, 0, 0, 1025, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 1026, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 0, 1027, 698, 145, 8, 9, 10, 173, 12, 314, ! 315, 316, 317, 488, 318, 14, 0, 0, 344, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 319, 17, 18, 19, 0, 320, 321, 322, 20, 0, ! 323, 324, 325, 21, 326, 327, 0, 23, 0, 694, ! 0, 328, 329, 330, 331, 332, 26, 0, 0, 28, ! 29, 0, 0, 0, 382, 0, 0, 0, 0, 0, ! 335, 0, 0, 1139, 0, 0, 0, 0, 0, 0, ! 0, 337, 338, 1140, 0, 0, 0, 0, 0, 340, ! 341, 342, 0, 0, 0, 1141, 698, 145, 8, 9, ! 10, 0, 12, 314, 315, 316, 317, 0, 318, 14, ! 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 18, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 694, 0, 328, 329, 330, 331, 332, ! 26, 0, 0, 28, 29, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 335, 0, 0, 1139, 0, 0, ! 0, 0, 0, 0, 0, 337, 338, 1140, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 0, 1141, ! 698, 270, 8, 9, 10, 0, 12, 314, 315, 316, ! 317, 0, 318, 14, 0, 0, 344, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 319, 17, ! 18, 19, 0, 320, 321, 322, 20, 0, 323, 324, ! 325, 21, 326, 327, 0, 23, 0, 0, 0, 328, ! 329, 330, 331, 332, 26, 0, 0, 333, 271, 0, ! 0, 0, 334, 0, 0, 0, 0, 0, 335, 0, ! 0, 336, 0, 0, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 0, 0, 340, 341, 342, ! 0, 0, 0, 343, 270, 8, 9, 10, 0, 12, ! 314, 315, 316, 317, 0, 318, 14, 0, 0, 0, ! 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 319, 17, 18, 19, 0, 320, 321, 322, 20, ! 0, 323, 324, 325, 21, 326, 327, 0, 23, 0, ! 0, 0, 328, 329, 330, 331, 332, 26, 0, 0, ! 28, 271, 0, 0, 0, 382, 0, 0, 0, 0, ! 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 0, 0, ! 340, 341, 342, 0, 0, 0, 343, 270, 8, 9, ! 10, 0, 12, 504, 315, 316, 317, 0, 318, 14, ! 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 18, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 0, 0, 328, 329, 330, 331, 332, ! 26, 0, 0, 28, 271, 0, 0, 0, 382, 0, ! 0, 0, 0, 0, 335, 0, 0, 630, 0, 0, ! 0, 0, 0, 0, 0, 337, 338, 631, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 0, 632, ! 270, 8, 9, 10, 0, 12, 504, 315, 316, 317, ! 0, 318, 14, 0, 0, 0, 344, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 16, 319, 17, 0, ! 19, 0, 320, 321, 322, 20, 0, 323, 324, 325, ! 21, 326, 327, 0, 23, 0, 0, 0, 328, 329, ! 330, 331, 332, 26, 0, 0, 28, 271, 0, 0, ! 1649, 382, 0, 0, 0, 0, 0, 335, 0, 0, ! 336, 0, 0, 0, 0, 0, 0, 0, 337, 338, ! 339, 0, 0, 0, 0, 0, 340, 341, 342, 0, ! 0, 0, 343, 270, 8, 9, 10, 173, 12, 314, ! 315, 316, 317, 0, 318, 14, 0, 0, 0, 344, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, ! 319, 17, 18, 19, 0, 320, 321, 322, 20, 0, ! 323, 324, 325, 21, 326, 327, 0, 23, 0, 0, ! 0, 328, 329, 330, 331, 332, 26, 0, 0, 28, ! 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 335, 0, 0, 336, 0, 0, 0, 0, 0, 0, ! 0, 337, 338, 339, 0, 0, 0, 0, 0, 340, ! 341, 342, 0, 0, 0, 343, 145, 8, 9, 10, ! 0, 12, 504, 315, 316, 317, 0, 318, 14, 0, ! 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 16, 319, 17, 18, 19, 0, 320, 321, ! 322, 20, 0, 323, 324, 325, 21, 326, 327, 0, ! 23, 0, 0, 0, 328, 329, 330, 331, 332, 26, ! 0, 0, 28, 29, 0, 0, 0, 382, 0, 0, ! 0, 0, 0, 335, 0, 0, 1710, 0, 0, 0, ! 0, 0, 0, 0, 337, 338, 1711, 0, 0, 0, ! 0, 0, 340, 341, 342, 0, 0, 0, 1712, 270, ! 8, 9, 10, 0, 12, 504, 315, 316, 317, 0, ! 318, 14, 0, 0, 0, 344, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 319, 17, 0, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 0, 23, 0, 0, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 28, 271, 0, 0, 0, ! 334, 0, 0, 0, 0, 0, 335, 0, 0, 336, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 0, 343, 270, 8, 9, 10, 0, 12, 504, 315, ! 316, 317, 0, 318, 14, 0, 0, 0, 344, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 319, ! 17, 0, 19, 0, 320, 321, 322, 20, 0, 323, ! 324, 325, 21, 326, 327, 0, 23, 0, 0, 0, ! 328, 329, 330, 331, 332, 26, 0, 0, 28, 271, ! 644, 0, 0, 0, 0, 0, 0, 0, 0, 335, ! 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, ! 337, 338, 339, 0, 0, 0, 0, 0, 340, 341, ! 342, 0, 0, 0, 645, 270, 8, 9, 10, 0, ! 12, 504, 315, 316, 317, 0, 318, 14, 0, 0, ! 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 0, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 0, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 271, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 335, 0, 0, 336, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 0, 343, 682, 270, ! 8, 9, 10, 0, 12, 504, 315, 316, 317, 0, ! 318, 14, 0, 0, 344, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 16, 319, 17, 0, 19, ! 0, 320, 321, 322, 20, 0, 323, 324, 325, 21, ! 326, 327, 0, 23, 0, 0, 0, 328, 329, 330, ! 331, 332, 26, 0, 0, 28, 271, 0, 0, 0, ! 382, 0, 0, 0, 0, 0, 335, 0, 0, 336, ! 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, ! 0, 0, 0, 0, 0, 340, 341, 342, 0, 0, ! 0, 343, 270, 8, 9, 10, 0, 12, 504, 315, ! 316, 317, 0, 318, 14, 0, 0, 0, 344, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 16, 319, ! 17, 18, 19, 0, 320, 321, 322, 20, 0, 323, ! 324, 325, 21, 326, 327, 0, 23, 0, 0, 0, ! 328, 329, 330, 331, 332, 26, 0, 0, 28, 271, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, ! 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, ! 337, 338, 631, 0, 0, 0, 0, 0, 340, 341, ! 342, 0, 0, 0, 632, 1278, 8, 9, 10, 0, ! 12, 504, 315, 316, 317, 0, 318, 14, 0, 0, ! 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 16, 319, 17, 0, 19, 0, 320, 321, 322, ! 20, 0, 323, 324, 325, 21, 326, 327, 0, 23, ! 0, 0, 0, 328, 329, 330, 331, 332, 26, 0, ! 0, 28, 271, 0, 0, 0, 382, 0, 0, 0, ! 0, 0, 335, 0, 0, 336, 0, 0, 0, 0, ! 0, 0, 0, 337, 338, 339, 0, 0, 0, 0, ! 0, 340, 341, 342, 0, 0, 0, 343, 145, 8, ! 9, 10, 0, 12, 314, 315, 316, 317, 0, 318, ! 14, 0, 0, 0, 344, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 16, 319, 17, 18, 19, 0, ! 320, 321, 322, 20, 0, 323, 324, 325, 21, 326, ! 327, 0, 23, 0, 0, 0, 328, 329, 330, 331, ! 332, 26, 0, 0, 28, 29, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 335, 0, 0, 1710, 0, ! 0, 0, 0, 0, 0, 0, 337, 338, 1711, 0, ! 0, 0, 0, 0, 340, 341, 342, 0, 0, 0, ! 1712, 270, 8, 9, 10, 0, 12, 504, 315, 316, ! 317, 0, 318, 14, 0, 0, 0, 344, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 16, 319, 17, ! 0, 19, 0, 320, 321, 322, 20, 0, 323, 324, ! 325, 21, 326, 327, 0, 23, 0, 0, 0, 328, ! 329, 330, 331, 332, 26, 0, 0, 28, 271, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, ! 0, 336, 0, 0, 0, 0, 0, 0, 0, 337, ! 338, 339, 0, 0, 0, 0, 0, 340, 341, 342, ! 0, 0, 0, 612, 270, 8, 9, 10, 0, 12, ! 504, 315, 316, 317, 0, 318, 14, 0, 0, 0, ! 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 16, 319, 17, 0, 19, 0, 320, 321, 322, 20, ! 0, 323, 324, 325, 21, 326, 327, 0, 23, 0, ! 0, 0, 328, 329, 330, 331, 332, 26, 0, 0, ! 28, 271, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 338, 339, 0, 0, 0, 0, 0, ! 340, 341, 342, 0, 0, 0, 614, 270, 8, 9, ! 10, 0, 12, 504, 315, 316, 317, 0, 318, 14, ! 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 16, 319, 17, 0, 19, 0, 320, ! 321, 322, 20, 0, 323, 324, 325, 21, 326, 327, ! 0, 23, 0, 0, 0, 328, 329, 330, 331, 332, ! 26, 0, 0, 28, 271, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 335, 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, 337, 338, 339, 0, 0, ! 0, 0, 0, 340, 341, 342, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 344, 742, 743, 744, ! 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, ! 755, 756, 757, 758, 759, 760, 761, 762, 763, 647, ! 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, ! 658, 0, 659, 660, 661, 662, 663, 664, 665, 666, ! 667 }; ! static const short yycheck[] = { 14, ! 4, 167, 4, 180, 216, 23, 181, 22, 744, 423, ! 182, 363, 81, 4, 4, 483, 817, 318, 319, 369, ! 260, 423, 130, 60, 4, 155, 156, 162, 369, 196, ! 549, 4, 36, 86, 36, 423, 423, 138, 58, 389, ! 642, 984, 254, 45, 45, 36, 36, 251, 389, 799, ! 351, 31, 32, 68, 45, 45, 36, 724, 60, 45, ! 393, 465, 819, 36, 94, 45, 96, 137, 138, 224, ! 225, 73, 45, 1435, 216, 81, 1428, 793, 128, 4, ! 45, 150, 137, 225, 86, 245, 14, 501, 1551, 91, ! 1546, 1551, 94, 77, 96, 4, 1605, 62, 310, 501, ! 1621, 12, 9, 140, 45, 45, 86, 49, 12, 111, ! 112, 36, 142, 128, 1171, 12, 1173, 12, 39, 1758, ! 45, 1642, 56, 62, 1181, 67, 4, 36, 904, 369, ! 1693, 34, 50, 800, 910, 3, 45, 1658, 140, 154, ! 142, 210, 144, 77, 496, 182, 532, 1452, 1453, 389, ! 140, 363, 1791, 95, 34, 507, 84, 64, 36, 56, ! 140, 181, 1618, 62, 1469, 1, 552, 140, 65, 171, ! 171, 110, 26, 175, 175, 155, 156, 49, 371, 372, ! 182, 171, 110, 1692, 175, 175, 1714, 49, 1751, 175, ! 111, 171, 1, 1714, 196, 175, 1724, 1725, 171, 110, ! 141, 96, 175, 1724, 1725, 77, 110, 61, 111, 77, ! 175, 65, 111, 110, 1519, 140, 196, 81, 95, 13, ! 200, 201, 4, 1528, 1529, 61, 1531, 334, 49, 65, ! 245, 246, 141, 95, 175, 175, 49, 430, 431, 49, ! 1696, 49, 1770, 97, 108, 260, 171, 1023, 110, 1770, ! 175, 216, 61, 78, 36, 80, 65, 62, 63, 224, ! 225, 97, 63, 45, 1727, 62, 175, 1727, 62, 62, ! 276, 65, 1, 137, 95, 155, 156, 157, 1734, 3, ! 4, 5, 95, 96, 1227, 95, 150, 95, 97, 254, ! 360, 63, 1042, 171, 1822, 1045, 63, 110, 56, 818, ! 110, 1822, 56, 356, 86, 360, 196, 473, 443, 311, ! 111, 65, 413, 110, 28, 1771, 110, 110, 32, 77, ! 335, 56, 202, 522, 1629, 1630, 50, 0, 256, 34, ! 65, 530, 61, 62, 62, 59, 60, 374, 7, 111, ! 0, 343, 109, 373, 111, 310, 210, 63, 220, 63, ! 1100, 1101, 110, 67, 356, 405, 110, 49, 140, 83, ! 4, 5, 364, 378, 95, 62, 1728, 4, 5, 719, ! 39, 373, 374, 528, 529, 1091, 356, 392, 111, 112, ! 535, 245, 110, 518, 374, 515, 516, 529, 548, 171, ! 405, 62, 49, 175, 374, 111, 551, 111, 363, 786, ! 65, 374, 432, 95, 1756, 425, 13, 49, 812, 813, ! 49, 1468, 276, 110, 196, 59, 60, 49, 1194, 56, ! 1196, 423, 59, 60, 426, 65, 77, 9, 49, 95, ! 432, 13, 3, 4, 5, 77, 73, 95, 95, 110, ! 49, 369, 775, 423, 49, 110, 83, 687, 603, 374, ! 155, 156, 157, 95, 96, 62, 95, 96, 65, 96, ! 1403, 389, 427, 95, 197, 467, 467, 49, 110, 49, ! 110, 110, 712, 493, 95, 495, 496, 467, 1790, 50, ! 62, 467, 64, 65, 77, 67, 95, 467, 59, 60, ! 95, 1158, 494, 1095, 467, 497, 78, 202, 80, 501, ! 1812, 40, 467, 61, 368, 3, 4, 5, 63, 67, ! 540, 65, 83, 95, 96, 95, 96, 56, 986, 1269, ! 1270, 501, 49, 77, 388, 49, 109, 49, 110, 61, ! 110, 496, 725, 548, 26, 515, 516, 63, 540, 13, ! 647, 648, 467, 650, 651, 652, 653, 654, 655, 656, ! 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, ! 667, 59, 60, 528, 529, 1341, 62, 99, 95, 96, ! 535, 95, 436, 95, 356, 362, 363, 364, 1354, 49, ! 610, 49, 78, 110, 56, 83, 551, 49, 62, 65, ! 4, 65, 374, 67, 484, 4, 5, 67, 49, 56, ! 1, 77, 3, 4, 5, 77, 49, 32, 610, 802, ! 612, 49, 614, 3, 4, 5, 6, 619, 620, 621, ! 622, 623, 36, 32, 65, 95, 679, 95, 96, 644, ! 632, 86, 87, 95, 811, 515, 516, 517, 603, 3, ! 642, 423, 110, 645, 95, 1164, 56, 56, 49, 77, ! 59, 60, 95, 43, 61, 56, 95, 95, 59, 60, ! 61, 62, 62, 63, 73, 49, 538, 4, 5, 59, ! 60, 56, 687, 62, 83, 776, 678, 679, 1092, 1147, ! 1148, 56, 783, 1033, 548, 467, 95, 891, 892, 78, ! 1092, 80, 1033, 897, 95, 697, 56, 712, 49, 679, ! 49, 91, 704, 50, 1092, 1092, 493, 727, 495, 496, ! 497, 95, 96, 783, 77, 695, 696, 697, 67, 501, ! 932, 611, 59, 60, 704, 1482, 110, 882, 1029, 864, ! 78, 924, 56, 56, 56, 1511, 49, 904, 26, 110, ! 28, 65, 606, 910, 95, 96, 95, 96, 778, 1217, ! 1218, 49, 110, 77, 77, 77, 65, 188, 110, 3, ! 4, 5, 6, 728, 110, 56, 784, 61, 77, 784, ! 839, 65, 792, 61, 65, 1294, 778, 65, 793, 669, ! 708, 12, 95, 8, 9, 675, 77, 677, 678, 1546, ! 15, 524, 900, 1033, 32, 1145, 111, 95, 49, 43, ! 818, 3, 4, 5, 1145, 63, 50, 32, 823, 97, ! 515, 516, 517, 38, 704, 59, 60, 1336, 86, 87, ! 49, 711, 47, 49, 49, 49, 99, 792, 692, 56, ! 56, 721, 834, 95, 1302, 1, 3, 3, 4, 5, ! 842, 63, 56, 707, 95, 96, 61, 91, 50, 77, ! 77, 77, 832, 833, 834, 96, 1023, 59, 60, 110, ! 96, 1618, 842, 77, 901, 1333, 95, 96, 56, 95, ! 95, 95, 96, 65, 65, 905, 906, 65, 908, 49, ! 1232, 83, 95, 49, 95, 77, 619, 867, 868, 77, ! 56, 1084, 113, 59, 60, 901, 1031, 679, 26, 901, ! 28, 95, 904, 905, 906, 1145, 908, 62, 910, 147, ! 901, 26, 840, 28, 152, 697, 649, 882, 4, 5, ! 77, 901, 704, 77, 904, 95, 96, 1395, 901, 95, ! 910, 61, 1109, 61, 1691, 65, 196, 65, 61, 1696, ! 110, 1742, 65, 676, 49, 26, 61, 28, 77, 682, ! 65, 56, 842, 77, 834, 12, 1692, 1161, 1162, 1163, ! 46, 95, 842, 201, 56, 698, 856, 932, 56, 97, ! 56, 110, 77, 59, 60, 839, 901, 1734, 1446, 62, ! 61, 983, 97, 56, 65, 987, 77, 56, 13, 77, ! 95, 1098, 65, 110, 110, 1188, 1189, 1190, 1133, 3, ! 1130, 1131, 6, 28, 77, 792, 870, 32, 77, 1139, ! 1140, 744, 4, 5, 1771, 1017, 97, 110, 1486, 1233, ! 1234, 1023, 1236, 56, 49, 1027, 77, 1194, 32, 1196, ! 77, 269, 3, 4, 5, 6, 110, 62, 63, 43, ! 65, 111, 67, 1023, 111, 1025, 1026, 1027, 4, 5, ! 49, 65, 834, 9, 56, 59, 60, 56, 922, 1795, ! 842, 110, 1077, 65, 56, 56, 1135, 59, 60, 73, ! 95, 96, 43, 110, 65, 77, 1091, 67, 77, 83, ! 83, 84, 85, 86, 87, 110, 77, 91, 59, 60, ! 1092, 95, 1094, 1095, 8, 9, 95, 987, 62, 63, ! 56, 15, 110, 59, 60, 1033, 67, 3, 4, 5, ! 6, 1001, 1092, 1003, 1221, 1005, 62, 73, 32, 901, ! 91, 67, 904, 110, 38, 62, 63, 83, 910, 834, ! 1132, 77, 78, 47, 1171, 113, 1173, 842, 28, 1141, ! 96, 1178, 1179, 1557, 1181, 932, 77, 43, 1150, 77, ! 1130, 1131, 1132, 56, 50, 1557, 62, 63, 1178, 1139, ! 1140, 1141, 28, 59, 60, 1171, 32, 1173, 1032, 1171, ! 1034, 1173, 77, 1179, 1341, 1181, 110, 1179, 113, 1181, ! 1171, 113, 1173, 1173, 62, 63, 110, 1354, 49, 1079, ! 1181, 1171, 1194, 1173, 1196, 91, 62, 63, 1171, 110, ! 1173, 1181, 110, 1218, 1206, 3, 444, 56, 1181, 447, ! 95, 1241, 62, 63, 1194, 8, 1196, 1145, 49, 1006, ! 1413, 459, 62, 67, 484, 4, 5, 1117, 89, 90, ! 9, 63, 93, 94, 95, 96, 111, 77, 78, 1241, ! 80, 1023, 62, 63, 1031, 1027, 1171, 62, 1173, 95, ! 1130, 1131, 1132, 32, 62, 63, 1181, 111, 991, 1139, ! 1140, 1141, 1614, 1265, 3, 4, 5, 56, 7, 8, ! 9, 1135, 510, 63, 1138, 513, 1294, 56, 4, 5, ! 59, 60, 46, 1263, 1264, 1265, 77, 1302, 38, 527, ! 1170, 1024, 56, 32, 73, 67, 60, 1366, 67, 38, ! 62, 63, 1174, 1175, 83, 110, 67, 1309, 1345, 110, ! 1092, 63, 1184, 919, 920, 921, 95, 56, 110, 28, ! 59, 60, 61, 32, 67, 1345, 67, 1307, 1308, 1309, ! 56, 113, 78, 59, 60, 62, 110, 1805, 1375, 1341, ! 1127, 3, 4, 5, 1511, 110, 1133, 73, 1328, 1329, ! 1132, 611, 1354, 62, 63, 110, 110, 83, 67, 1141, ! 1366, 1341, 110, 78, 78, 78, 105, 106, 107, 1375, ! 1722, 78, 110, 1375, 1354, 110, 3, 4, 5, 6, ! 61, 65, 31, 32, 1375, 34, 65, 62, 50, 1171, ! 110, 1173, 3, 4, 5, 1375, 65, 59, 60, 1181, ! 4, 5, 1375, 113, 110, 9, 1296, 110, 1298, 669, ! 1300, 60, 1194, 62, 1196, 675, 43, 677, 678, 68, ! 111, 83, 110, 110, 73, 1130, 1131, 1132, 32, 96, ! 113, 1468, 59, 60, 1139, 1140, 1141, 1612, 91, 1614, ! 1442, 1613, 77, 49, 110, 56, 110, 110, 59, 60, ! 1375, 711, 56, 113, 885, 59, 60, 1463, 110, 110, ! 1247, 721, 1468, 110, 1479, 1170, 1468, 111, 1255, 73, ! 65, 110, 3, 4, 5, 111, 63, 1468, 61, 83, ! 3, 4, 5, 1265, 200, 201, 1358, 110, 1468, 67, ! 110, 95, 1364, 1365, 110, 1468, 1368, 1369, 147, 95, ! 1372, 1503, 1366, 152, 1237, 95, 155, 156, 157, 1511, ! 1722, 95, 111, 3, 4, 5, 95, 1304, 110, 50, ! 113, 1501, 1502, 1503, 110, 8, 1313, 1309, 59, 60, ! 34, 1511, 113, 182, 1424, 110, 59, 60, 61, 188, ! 110, 1707, 1719, 1468, 879, 110, 110, 1551, 110, 1551, ! 98, 200, 201, 202, 110, 1557, 3, 4, 5, 1341, ! 1551, 1551, 62, 1578, 110, 62, 56, 216, 903, 59, ! 60, 1551, 1354, 65, 909, 1439, 225, 1557, 1551, 56, ! 1710, 1711, 110, 110, 1599, 1600, 110, 65, 3, 4, ! 5, 113, 1612, 1375, 1614, 833, 49, 110, 110, 1463, ! 110, 110, 67, 1605, 110, 254, 34, 110, 110, 56, ! 95, 1613, 59, 60, 1605, 1605, 3, 4, 5, 6, ! 269, 1787, 110, 110, 1790, 1605, 1551, 865, 866, 113, ! 110, 110, 1605, 65, 65, 873, 3, 4, 5, 6, ! 1655, 1656, 63, 1809, 59, 60, 1812, 62, 9, 1614, ! 63, 63, 156, 157, 1526, 1527, 43, 1390, 1391, 1392, ! 1393, 310, 311, 50, 17, 111, 110, 110, 1401, 61, ! 95, 95, 59, 60, 63, 63, 43, 3, 4, 5, ! 1605, 67, 56, 1018, 1686, 1020, 1468, 95, 104, 1704, ! 1692, 1693, 59, 60, 343, 109, 83, 18, 202, 63, ! 56, 1692, 1692, 1723, 91, 110, 1686, 3, 4, 5, ! 1712, 63, 1692, 1693, 363, 364, 110, 1504, 1505, 1692, ! 63, 1503, 63, 1727, 91, 1727, 63, 987, 62, 1511, ! 1710, 1711, 95, 59, 60, 67, 1727, 1727, 110, 63, ! 113, 1001, 110, 1003, 63, 1005, 12, 1727, 110, 1751, ! 95, 3, 4, 5, 1727, 63, 63, 1722, 1773, 63, ! 56, 110, 63, 59, 60, 61, 0, 1692, 0, 1551, ! 0, 1751, 1559, 176, 2, 1557, 36, 426, 427, 1669, ! 1656, 3, 4, 5, 6, 1092, 3, 4, 5, 1669, ! 7, 8, 9, 776, 510, 444, 1668, 513, 447, 515, ! 516, 171, 1727, 1718, 453, 454, 455, 59, 60, 175, ! 459, 527, 467, 1179, 3, 4, 5, 1294, 1551, 1079, ! 98, 43, 144, 1605, 1641, 3, 4, 5, 50, 1077, ! 1710, 1711, 1712, 734, 823, 1336, 1164, 59, 60, 343, ! 313, 1375, 59, 60, 4, 494, 1179, 496, 497, 3, ! 4, 5, 6, 1465, 736, 1048, 679, 1117, 1193, 207, ! 1195, 510, 360, 128, 513, 1598, 515, 516, 517, 91, ! 59, 60, 521, 1745, 1546, 1483, 36, 636, 527, 1727, ! 529, 59, 60, 532, 1742, 45, 1739, 1789, 851, 43, ! 1128, 1129, 1442, -1, -1, -1, 50, -1, 58, 1137, ! 60, -1, 551, 552, 1686, 59, 60, -1, -1, -1, ! 1692, 1693, -1, -1, -1, -1, 1347, 1348, 1651, 4, ! 5, -1, 1257, -1, 9, -1, -1, -1, -1, 83, ! -1, 58, -1, -1, -1, 4, 5, 91, -1, -1, ! 9, -1, -1, 1374, -1, 1727, -1, 32, 1379, -1, ! 454, 455, -1, 1686, 603, -1, -1, -1, -1, 1692, ! 1693, -1, -1, 612, 1669, 614, 695, 696, -1, 1751, ! -1, 56, -1, -1, 59, 60, -1, 7, 8, 9, ! 140, 630, 631, 632, -1, 15, 146, 56, 73, -1, ! 59, 60, -1, -1, 1727, -1, 645, -1, 83, -1, ! 3, 4, 5, -1, 73, 1710, 1711, 1712, 38, -1, ! 95, 171, 516, 517, 83, 175, -1, 47, 1751, -1, ! -1, 181, 182, -1, -1, -1, -1, 1458, 1459, -1, ! 1461, 1462, 1765, 1464, -1, -1, 1296, -1, 1298, -1, ! 1300, 3, 4, 5, 6, -1, 695, 696, 697, 3, ! 4, 5, 1785, -1, 181, 704, 59, 60, 3, 4, ! 5, -1, 1795, -1, -1, -1, -1, 1305, 1306, 229, ! 32, -1, -1, -1, 1312, 3, 4, 5, -1, 728, ! -1, 43, 1417, 1816, -1, 1516, 1517, 49, -1, -1, ! 3, 4, 5, -1, 56, -1, 50, 59, 60, -1, ! -1, -1, 229, 832, 833, 59, 60, -1, 612, -1, ! 614, 73, -1, 1448, 59, 60, 832, 833, -1, 1454, ! -1, 83, 3, 4, 5, 6, -1, 631, 632, 91, ! -1, 59, 60, 95, 96, 1470, 1471, 50, 1569, 1570, ! 1571, 645, -1, 792, 793, -1, 59, 60, -1, 865, ! 866, 867, 868, -1, -1, -1, -1, 873, 1493, 40, ! 41, -1, 43, -1, 1424, 3, 4, 5, 6, 83, ! 84, 85, 86, 87, -1, 56, -1, -1, 59, 60, ! -1, -1, -1, 832, 833, 834, -1, 3, 4, 5, ! -1, 7, -1, 842, -1, 1626, 1627, -1, -1, -1, ! 704, -1, 1537, 1538, -1, 43, -1, 856, -1, -1, ! 91, -1, 50, -1, 374, -1, 865, 866, 867, 868, ! 869, 59, 60, 39, 873, 1560, 1561, 1, 1563, 3, ! 4, 5, 6, 7, 8, 9, 885, -1, -1, -1, ! 56, 15, -1, 59, 60, 83, 81, 82, 83, 84, ! 85, 86, 87, 91, -1, 29, -1, 31, 32, 33, ! -1, -1, -1, -1, 38, 425, 3, 4, 5, 43, ! 7, 8, 9, 47, 434, -1, 50, -1, 1007, -1, ! -1, 1010, 56, 932, -1, 59, 60, 3, 4, 5, ! 6, -1, 1021, 9, -1, 32, 1025, 1026, 425, 73, ! -1, 38, -1, -1, -1, -1, -1, 467, -1, 83, ! -1, -1, -1, -1, -1, -1, 32, 91, -1, -1, ! -1, 95, 59, 60, -1, 99, -1, 43, 4, 5, ! 834, -1, 1763, 493, 494, 495, 496, -1, 842, -1, ! 56, 501, 1677, 59, 60, -1, -1, -1, -1, 509, ! -1, -1, 856, -1, -1, -1, 32, 73, 1007, -1, ! -1, 1010, 522, -1, 868, 869, 493, 83, 495, 496, ! 530, -1, 1021, 49, -1, 91, 1025, 1026, 1027, 95, ! 56, -1, 509, 59, 60, -1, -1, -1, -1, -1, ! -1, 518, -1, -1, -1, 522, -1, 73, -1, 1128, ! 1129, 1130, 1131, 530, 564, -1, -1, 83, 1137, -1, ! 1139, 1140, 1128, 1129, 1130, 1131, -1, -1, -1, 95, ! 96, 1137, -1, 1139, 1140, 79, 80, 81, 82, 83, ! 84, 85, 86, 87, -1, 1151, 1152, 1153, -1, -1, ! -1, -1, 1091, -1, 278, 279, 280, 281, 282, 283, ! -1, 285, 286, 287, 288, 289, 290, 291, 292, 293, ! 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, ! 304, 305, 306, -1, 308, -1, -1, -1, -1, 1128, ! 1129, 1130, 1131, 1132, 3, 4, 5, 6, 1137, -1, ! 1139, 1140, 1141, 3, 4, 5, 6, -1, -1, -1, ! -1, -1, 1151, 1152, 1153, -1, -1, 7, 8, 9, ! -1, -1, 7, 8, 9, 15, -1, -1, -1, -1, ! 15, 1170, 1026, 1027, 43, -1, -1, -1, -1, -1, ! 1179, 50, 32, 43, 1263, 1264, -1, 32, 38, 49, ! 59, 60, -1, 38, -1, -1, 56, 47, -1, 59, ! 60, -1, 47, 3, 4, 5, 6, 7, 8, 9, ! -1, -1, -1, 73, 83, 15, -1, 727, 63, -1, ! -1, -1, 91, 83, -1, -1, 1305, 1306, 1307, 1308, ! -1, 91, 32, 1312, -1, 95, 96, -1, 38, 1305, ! 1306, 1307, 1308, 43, -1, -1, 1312, 47, -1, 49, ! 727, -1, -1, -1, -1, -1, 56, -1, -1, 59, ! 60, -1, 1328, 1329, 1263, 1264, 1265, -1, -1, -1, ! -1, -1, -1, 73, -1, -1, -1, 1131, 1132, -1, ! -1, -1, 792, 83, -1, -1, 1140, 1141, -1, -1, ! -1, 91, -1, -1, -1, 95, 96, 3, 4, 5, ! 6, -1, -1, 9, -1, -1, 1305, 1306, 1307, 1308, ! 1309, -1, -1, 1312, -1, 792, 1170, 79, 80, 81, ! 82, 83, 84, 85, 86, 87, 32, -1, -1, 1328, ! 1329, 1330, -1, -1, -1, -1, -1, 43, -1, 3, ! 4, 5, 6, 49, -1, 9, -1, -1, 1347, 1348, ! 56, 861, -1, 59, 60, -1, -1, -1, 1437, 1438, ! -1, 1440, -1, -1, -1, -1, -1, 73, 32, -1, ! 880, 1437, 1438, -1, 1440, 1374, -1, 83, -1, 43, ! 1379, -1, -1, -1, 861, 91, -1, 864, 4, 95, ! 96, 901, 56, -1, 578, 59, 60, -1, 14, -1, ! -1, -1, -1, 880, -1, -1, -1, -1, 24, 73, ! 1264, 1265, -1, -1, -1, 31, 32, 601, 34, 83, ! 36, -1, 1501, 1502, -1, 609, -1, 91, -1, 45, ! -1, 95, -1, -1, -1, 1501, 1502, -1, 1437, 1438, ! -1, 1440, 58, -1, 60, 81, 82, 83, 84, 85, ! 86, 87, 68, -1, 1308, 1309, -1, 73, -1, 1458, ! 1459, -1, 1461, 1462, -1, 1464, -1, -1, 84, -1, ! 86, -1, -1, -1, -1, 91, -1, -1, 94, -1, ! 96, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! -1, 13, -1, 15, 110, -1, -1, -1, 4, 5, ! -1, -1, 1501, 1502, 1503, -1, -1, 29, -1, 31, ! 32, -1, -1, -1, -1, -1, 38, 1516, 1517, -1, ! -1, 43, 138, -1, 140, 47, 142, 49, 144, -1, ! 146, 147, -1, -1, 56, 151, 152, 59, 60, 155, ! 156, 157, -1, 49, -1, -1, -1, 4, 5, -1, ! 56, 73, 9, 59, 60, 171, 7, 8, 9, 175, ! -1, 83, -1, -1, 15, 181, 182, 73, -1, 91, ! 1569, 1570, 1571, 95, 96, 32, -1, 83, -1, -1, ! -1, 32, -1, -1, 200, 201, 202, 38, -1, 95, ! 96, -1, 49, -1, -1, -1, 47, -1, -1, 56, ! -1, -1, 59, 60, -1, -1, -1, -1, -1, -1, ! -1, -1, 63, 229, 1613, 1614, 73, 1127, -1, 3, ! 4, 5, 6, -1, -1, -1, 83, 1626, 1627, -1, ! 246, -1, -1, -1, 3, 4, 5, 6, 95, 96, ! 256, -1, -1, -1, 1710, 1711, -1, -1, -1, -1, ! 1127, -1, -1, 269, -1, -1, 1133, -1, -1, 43, ! -1, 1171, -1, 1173, -1, -1, 50, -1, 1178, 1179, ! 1669, 1181, -1, -1, 43, 59, 60, -1, -1, -1, ! 3, 4, 5, 6, 7, 8, 9, 56, -1, -1, ! 59, 60, 15, -1, 63, 311, 312, -1, -1, 83, ! -1, 1178, -1, -1, 73, -1, 29, 91, 31, 32, ! 33, 1710, 1711, 1712, 83, 38, -1, -1, -1, -1, ! 43, -1, 91, 1722, 47, -1, 95, 50, -1, -1, ! -1, 915, 916, 56, -1, -1, 59, 60, -1, -1, ! 356, -1, -1, -1, 360, -1, 362, 363, 364, -1, ! 73, -1, -1, -1, -1, -1, -1, 373, 374, -1, ! 83, -1, -1, -1, 1763, -1, -1, -1, 91, -1, ! -1, -1, 95, -1, -1, -1, 99, -1, -1, -1, ! -1, -1, 3, 4, 5, 6, -1, -1, -1, -1, ! -1, -1, 4, 5, 1304, -1, -1, 413, -1, -1, ! -1, -1, -1, 1313, -1, -1, -1, 423, -1, 425, ! 426, -1, -1, -1, -1, 1669, 432, -1, 434, -1, ! 32, -1, 43, -1, -1, -1, -1, 1304, 444, 50, ! -1, 447, -1, -1, -1, 1345, 1313, 49, 59, 60, ! -1, -1, -1, 459, 56, -1, -1, 59, 60, -1, ! -1, 467, -1, -1, 1331, 1332, -1, 1711, 1712, -1, ! -1, 73, 83, -1, -1, 1375, -1, -1, 1345, -1, ! 91, 83, 3, 4, 5, 6, -1, 493, 494, 495, ! 496, 497, -1, 95, 96, 501, -1, 3, 4, 5, ! 6, -1, -1, 509, 510, -1, -1, 513, -1, 515, ! 516, 517, 518, -1, -1, -1, 522, -1, -1, -1, ! -1, 527, 43, -1, 530, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 540, 56, -1, 43, 59, 60, ! -1, 1, 63, 3, 4, 5, 6, 7, 8, 9, ! 56, -1, 73, 59, 60, 15, -1, -1, 564, -1, ! 1460, -1, 83, -1, -1, 1465, -1, -1, 1468, 29, ! 91, 31, 32, 33, 95, -1, -1, 1444, 38, 39, ! -1, -1, -1, 43, -1, 91, -1, 47, 48, -1, ! 50, -1, -1, 1460, -1, -1, 56, -1, -1, 59, ! 60, -1, 608, 63, 610, 65, -1, -1, -1, -1, ! -1, -1, -1, 73, 620, 621, 622, 623, -1, -1, ! -1, -1, -1, 83, -1, -1, -1, 3, 4, 5, ! 6, 91, -1, -1, -1, 95, 642, 1504, 1505, -1, ! 3, 4, 5, 6, -1, -1, 9, 74, 75, 76, ! 77, 111, 79, 80, 81, 82, 83, 84, 85, 86, ! 87, 3, 4, 5, 6, -1, -1, 43, -1, 32, ! -1, -1, -1, 679, 50, 681, -1, -1, -1, -1, ! 43, -1, -1, 59, 60, -1, 49, 693, -1, 695, ! 696, 697, 1559, 56, -1, -1, 59, 60, 704, -1, ! -1, 43, 708, -1, 3, 4, 5, 6, 50, -1, ! 73, -1, 1612, 1613, 1614, 91, -1, 59, 60, -1, ! 83, 727, -1, -1, -1, -1, -1, 65, 91, -1, ! -1, -1, 95, 96, -1, -1, -1, -1, -1, -1, ! -1, 83, -1, -1, 43, 1612, -1, 1614, 1, 91, ! 3, 4, 5, 6, 7, 8, 9, 56, -1, -1, ! 59, 60, 15, -1, 63, -1, 65, -1, -1, -1, ! 776, -1, 778, -1, 73, 28, 29, 783, 31, 32, ! 33, -1, -1, -1, 83, 38, 792, 793, -1, -1, ! 43, -1, 91, 46, 47, 48, 95, 50, -1, -1, ! -1, -1, -1, 56, 57, -1, 59, 60, 146, -1, ! 63, -1, 3, 4, 5, 6, -1, -1, -1, -1, ! 73, -1, -1, 1723, 162, -1, 832, 833, 834, -1, ! 83, -1, -1, -1, 840, -1, 842, -1, 91, -1, ! -1, -1, 95, -1, -1, -1, 99, -1, -1, 40, ! 41, -1, 43, -1, -1, 861, 1723, -1, 864, 865, ! 866, 867, 868, 869, -1, 56, -1, 873, 59, 60, ! -1, -1, -1, -1, 880, -1, -1, -1, -1, 1, ! -1, 219, 4, 5, -1, -1, 8, 9, -1, 227, ! -1, -1, -1, 15, -1, 901, -1, -1, 904, 905, ! 906, -1, 908, -1, 910, -1, 244, 29, -1, 31, ! 32, -1, -1, 919, 920, 921, 38, 255, 40, 41, ! -1, -1, -1, -1, -1, 47, 932, 49, -1, -1, ! -1, -1, -1, -1, 56, -1, -1, 59, 60, -1, ! 62, -1, -1, -1, 66, 67, 68, 69, 70, 71, ! 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ! 82, 83, 84, 85, 86, -1, -1, 89, 90, 91, ! -1, 93, -1, -1, 96, -1, -1, 983, 4, 5, ! -1, -1, 1, 9, 3, 4, 5, 6, -1, 8, ! 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 1006, 1007, -1, -1, 1010, -1, 32, -1, -1, -1, ! -1, 1017, -1, -1, -1, 1021, -1, 1023, -1, 1025, ! 1026, 1027, -1, 49, 43, 1031, -1, 1033, -1, -1, ! 56, 50, -1, 59, 60, -1, -1, 56, -1, -1, ! 59, 60, -1, -1, -1, -1, -1, 73, 1, -1, ! 3, 4, 5, 6, 7, 8, 9, 83, -1, -1, ! -1, -1, 15, -1, -1, -1, -1, -1, -1, 95, ! 96, -1, 91, -1, -1, -1, 29, -1, 31, 32, ! 33, -1, -1, -1, -1, 38, 1092, -1, 1094, 1095, ! 43, -1, -1, -1, 47, 48, 434, 50, -1, -1, ! -1, -1, -1, 56, -1, 443, 59, 60, -1, -1, ! 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, ! 73, 1127, 1128, 1129, 1130, 1131, 1132, 1133, -1, -1, ! 83, 1137, -1, 1139, 1140, 1141, -1, 475, 91, 1145, ! -1, -1, 95, -1, 1150, 1151, 1152, 1153, -1, -1, ! -1, -1, 3, 4, 5, 6, -1, -1, 9, -1, ! -1, 1167, -1, -1, 1170, 1171, -1, 1173, -1, -1, ! -1, 509, 1178, 1179, -1, 1181, -1, -1, -1, -1, ! 518, 32, -1, -1, -1, -1, -1, -1, 1194, -1, ! 1196, -1, 43, -1, 3, 4, 5, 6, 49, 537, ! 1206, -1, -1, -1, -1, 56, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, 3, 4, 5, 6, -1, ! -1, -1, 73, 32, -1, -1, 564, 1233, 1234, -1, ! 1236, -1, 83, -1, 43, 1241, -1, -1, -1, -1, ! 91, 1247, -1, -1, 95, 96, -1, 56, -1, 1255, ! 59, 60, 40, 41, -1, 43, -1, 1263, 1264, 1265, ! -1, -1, -1, -1, 73, -1, -1, -1, 56, -1, ! -1, 59, 60, -1, 83, 3, 4, 5, 6, 7, ! 8, 9, 91, -1, -1, -1, 95, 15, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 1304, 1305, ! 1306, 1307, 1308, 1309, 32, -1, 1312, 1313, -1, -1, ! 38, -1, -1, -1, -1, 43, -1, -1, -1, 47, ! -1, 49, 1328, 1329, 1330, 1331, 1332, -1, 56, -1, ! -1, 59, 60, -1, -1, 1341, -1, -1, -1, 1345, ! -1, -1, -1, -1, -1, 73, -1, -1, 1354, 3, ! 4, 5, 6, -1, -1, 83, -1, -1, -1, -1, ! -1, 1367, -1, 91, -1, -1, 4, 95, 96, 1375, ! -1, -1, -1, -1, 91, -1, 14, 94, 32, 96, ! -1, -1, -1, -1, -1, 23, 24, -1, -1, 43, ! -1, -1, -1, 31, 32, 49, 34, -1, 36, -1, ! -1, -1, 56, -1, -1, 59, 60, 45, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, ! 58, -1, 60, -1, -1, 142, -1, 144, -1, 83, ! 68, 1437, 1438, -1, 1440, 73, 1442, 91, 1444, -1, ! -1, 95, 96, -1, 3, 4, 5, 6, 86, -1, ! -1, -1, -1, 91, 1460, -1, 94, 1, 96, 1465, ! 4, 5, 1468, -1, 8, 9, 73, 74, 75, 76, ! 77, 15, 79, 80, 81, 82, 83, 84, 85, 86, ! 87, -1, -1, -1, 43, 29, -1, 31, 32, -1, ! -1, 50, -1, -1, 38, 1501, 1502, 1503, 1504, 1505, ! 59, 60, 140, 47, 142, 1511, 144, -1, 146, 147, ! -1, -1, 56, -1, 152, 59, 60, 155, 156, 157, ! -1, -1, -1, 861, 83, -1, 864, -1, -1, -1, ! -1, -1, 91, 171, -1, -1, -1, 175, -1, -1, ! -1, -1, 880, 181, 182, 4, 5, -1, 7, 8, ! 9, 1557, -1, 1559, 13, -1, 15, -1, -1, -1, ! -1, -1, 200, 201, 202, -1, -1, -1, -1, -1, ! 29, -1, 31, 32, -1, -1, -1, -1, -1, 38, ! -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, ! 49, 229, -1, -1, -1, -1, -1, 56, -1, -1, ! 59, 60, -1, 320, 321, -1, 1612, 1613, 1614, -1, ! -1, -1, -1, -1, 73, -1, -1, 334, -1, 336, ! -1, -1, 339, -1, 83, 342, -1, -1, 345, -1, ! -1, 269, 349, -1, -1, -1, 95, 96, -1, 1, ! 357, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! -1, -1, -1, 15, -1, -1, 373, -1, -1, -1, ! -1, -1, -1, 1669, -1, -1, -1, 29, 1006, 31, ! 32, 33, -1, 311, 312, -1, 38, 39, -1, -1, ! -1, 43, -1, -1, -1, 47, 48, -1, 50, -1, ! -1, -1, -1, 1031, 56, -1, -1, 59, 60, -1, ! -1, 63, -1, 65, 1710, 1711, 1712, -1, -1, -1, ! -1, 73, -1, -1, -1, 432, -1, 1723, 356, -1, ! -1, 83, 360, -1, 362, 363, 364, -1, -1, 91, ! -1, 369, -1, 95, -1, 373, 374, -1, -1, -1, ! -1, -1, -1, -1, 3, 4, 5, 6, -1, 111, ! 9, 389, 70, 71, 72, 73, 74, 75, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ! -1, -1, -1, 32, -1, 413, -1, -1, -1, -1, ! -1, -1, -1, -1, 43, 423, -1, 425, 426, 1127, ! 49, -1, -1, -1, 432, 1133, 434, 56, -1, -1, ! 59, 60, -1, -1, -1, -1, 444, -1, -1, 447, ! -1, -1, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, 459, -1, 540, 83, -1, -1, -1, -1, 467, ! -1, -1, 91, -1, -1, -1, 95, 96, -1, 4, ! 5, -1, 7, 8, 9, -1, -1, -1, -1, -1, ! 15, -1, -1, -1, -1, 493, 494, 495, 496, 497, ! -1, -1, -1, 501, 29, -1, 31, 32, -1, -1, ! -1, 509, 510, 38, -1, 513, -1, 515, 516, 517, ! 518, -1, 47, -1, 522, 50, -1, -1, -1, 527, ! -1, 56, 530, 610, 59, 60, -1, -1, -1, -1, ! -1, -1, 540, -1, -1, -1, -1, -1, -1, 1247, ! -1, 549, -1, 630, 631, -1, -1, 1255, -1, -1, ! -1, -1, -1, -1, -1, 642, 564, -1, -1, -1, ! 647, 648, -1, 650, 651, 652, 653, 654, 655, 656, ! 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, ! 667, -1, -1, -1, -1, -1, -1, -1, -1, 3, ! 4, 5, 6, -1, -1, 9, 1304, -1, -1, -1, ! -1, -1, 610, -1, -1, 1313, -1, -1, -1, -1, ! -1, -1, 620, 621, 622, 623, -1, -1, 32, -1, ! -1, -1, -1, 1331, 1332, -1, -1, -1, -1, 43, ! -1, -1, -1, -1, 642, 49, -1, -1, -1, -1, ! -1, -1, 56, -1, -1, 59, 60, -1, 1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, -1, 73, ! -1, -1, 15, -1, -1, -1, -1, -1, -1, 83, ! -1, 679, -1, 681, -1, -1, 29, 91, 31, 32, ! 33, 95, 96, -1, -1, 38, 39, 695, 696, 697, ! 43, 778, -1, -1, 47, 48, 704, 50, -1, -1, ! -1, -1, -1, 56, -1, -1, 59, 60, -1, -1, ! 63, 719, 65, -1, -1, -1, -1, -1, -1, 727, ! 73, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! 83, 13, -1, 15, -1, -1, 1444, -1, 91, -1, ! -1, -1, 95, -1, -1, -1, -1, 29, -1, 31, ! 32, -1, -1, -1, -1, -1, 38, -1, 111, -1, ! -1, 43, -1, -1, -1, 47, -1, 49, 776, -1, ! 778, -1, -1, -1, 56, -1, 784, 59, 60, -1, ! -1, -1, -1, -1, 792, 793, -1, -1, -1, -1, ! -1, 73, -1, -1, 4, 5, 1504, 1505, -1, 9, ! -1, 83, -1, -1, -1, -1, -1, -1, -1, 91, ! 818, -1, -1, 95, 96, -1, -1, -1, 905, 906, ! -1, 908, 32, -1, 832, 833, 834, -1, -1, -1, ! -1, -1, -1, -1, 842, 3, 4, 5, 6, 49, ! -1, 9, -1, -1, -1, -1, 56, -1, -1, 59, ! 60, 1559, -1, 861, -1, -1, 864, 865, 866, 867, ! 868, 869, -1, 73, 32, 873, -1, -1, -1, -1, ! -1, -1, 880, 83, -1, 43, -1, 3, 4, 5, ! 6, 49, -1, 9, -1, 95, 96, -1, 56, -1, ! -1, 59, 60, 901, -1, -1, 904, 905, 906, -1, ! 908, -1, 910, -1, -1, 73, 32, -1, 995, -1, ! -1, 919, 920, 921, -1, 83, -1, 43, -1, -1, ! -1, -1, -1, 91, 932, -1, -1, 95, 96, -1, ! 56, -1, -1, 59, 60, -1, -1, -1, 1025, 1026, ! -1, -1, -1, -1, -1, -1, -1, 73, 1, -1, ! 3, 4, 5, 6, 7, 8, 9, 83, -1, -1, ! -1, -1, 15, -1, -1, 91, -1, -1, -1, 95, ! -1, -1, -1, -1, -1, 983, 29, -1, 31, 32, ! 33, -1, -1, -1, -1, 38, 39, -1, 4, 5, ! 43, -1, -1, 9, 47, 48, -1, 50, 1006, 1007, ! -1, -1, 1010, 56, -1, -1, 59, 60, 1095, 1017, ! 63, 1098, 65, 1021, -1, 1023, 32, 1025, 1026, 1027, ! 73, -1, -1, 1031, -1, 1033, -1, -1, -1, -1, ! 83, -1, -1, 49, -1, -1, -1, -1, 91, -1, ! 56, -1, 95, 59, 60, -1, -1, -1, 3, 4, ! 5, 6, 1139, 1140, -1, -1, -1, 73, 111, 70, ! 71, 72, 73, 74, 75, 76, 77, 83, 79, 80, ! 81, 82, 83, 84, 85, 86, 87, 32, -1, 95, ! 96, -1, -1, -1, 1092, -1, 1094, 1095, 43, -1, ! -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, ! -1, 56, -1, -1, 59, 60, -1, -1, -1, -1, ! -1, 3, 4, 5, 6, -1, -1, -1, 73, 1127, ! 1128, 1129, 1130, 1131, 1132, 1133, -1, -1, 83, 1137, ! -1, 1139, 1140, 1141, 1221, -1, 91, 1145, -1, -1, ! 95, 96, 1150, 1151, 1152, 1153, -1, -1, -1, -1, ! -1, 43, 1239, -1, 1241, -1, 1164, -1, -1, 1167, ! -1, -1, 1170, 1171, 56, 1173, -1, 59, 60, -1, ! 1178, 1179, -1, 1181, -1, -1, -1, -1, -1, -1, ! -1, 73, -1, -1, -1, -1, 1194, -1, 1196, 4, ! 5, 83, -1, 8, 9, -1, -1, -1, 1206, 91, ! 15, -1, -1, 95, -1, -1, -1, -1, 4, -1, ! -1, -1, -1, -1, 29, -1, 31, 32, -1, -1, ! -1, -1, -1, 38, -1, 1233, 1234, -1, 1236, -1, ! -1, -1, 47, 1241, 49, 31, 32, -1, 34, 1247, ! 36, 56, -1, -1, 59, 60, -1, 1255, -1, 45, ! -1, -1, -1, -1, -1, 1263, 1264, 1265, 73, -1, ! -1, -1, 58, -1, 60, 75, 76, 77, 83, 79, ! 80, 81, 82, 83, 84, 85, 86, 87, -1, -1, ! 95, 96, -1, -1, -1, 81, 1294, -1, 84, -1, ! -1, -1, -1, -1, -1, -1, 1304, 1305, 1306, 1307, ! 1308, 1309, -1, -1, 1312, 1313, 74, 75, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ! 1328, 1329, 1330, 1331, 1332, -1, -1, -1, 1336, -1, ! -1, -1, -1, 1341, -1, -1, -1, 1345, -1, -1, ! -1, 137, 138, -1, 140, -1, 1354, -1, -1, -1, ! 146, 147, -1, -1, 150, 151, 152, -1, -1, 155, ! 156, 157, -1, -1, -1, -1, 162, 1375, -1, -1, ! -1, -1, -1, -1, -1, 171, -1, -1, -1, 175, ! -1, -1, -1, -1, -1, 181, 182, -1, -1, 1, -1, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! -1, -1, -1, 15, 200, 201, 202, -1, -1, -1, ! -1, -1, -1, -1, 210, -1, -1, 29, -1, 31, ! 32, -1, -1, -1, -1, -1, 38, -1, -1, 1437, ! 1438, 43, 1440, 229, 1442, 47, 1444, -1, 50, -1, ! -1, -1, -1, -1, 56, -1, -1, 59, 60, -1, ! -1, 63, 1460, -1, -1, -1, -1, 1465, -1, -1, ! 1468, 73, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 83, -1, 269, -1, -1, -1, -1, -1, 91, ! 276, 76, 77, 95, 79, 80, 81, 82, 83, 84, ! 85, 86, 87, 1501, 1502, 1503, 1504, 1505, -1, -1, ! -1, -1, -1, 1511, -1, -1, -1, -1, -1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, 1605, -1, ! 13, -1, 15, 75, 76, 77, 78, 79, 80, 81, ! 82, 83, 84, 85, 86, 87, 29, -1, 31, 32, ! 83, -1, -1, -1, -1, 38, -1, 343, -1, 1557, ! 43, 1559, -1, -1, 47, -1, 49, 3, 4, 5, ! 6, -1, -1, 56, 360, -1, 59, 60, -1, -1, ! -1, -1, 368, -1, -1, -1, -1, -1, 374, -1, ! 73, -1, -1, -1, -1, -1, 32, -1, -1, -1, ! 83, -1, 388, 1601, -1, -1, -1, 43, 91, -1, ! -1, -1, 95, 96, 1612, 1613, 1614, -1, -1, -1, ! 56, -1, -1, 59, 60, -1, -1, 413, -1, -1, ! -1, -1, 165, 1710, 1711, -1, -1, 73, -1, 425, ! -1, -1, -1, -1, -1, -1, -1, 83, 434, -1, ! 436, -1, -1, -1, -1, 91, -1, 443, 444, 95, ! -1, 447, -1, -1, -1, 198, -1, 453, 454, 455, ! -1, 1669, -1, 459, -1, -1, -1, -1, 211, -1, ! -1, 467, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, ! -1, -1, -1, -1, -1, 15, -1, 493, 494, 495, ! 496, -1, 1710, 1711, 1712, 501, -1, -1, -1, 29, ! -1, 31, 32, 509, 510, 1723, -1, 513, 38, 515, ! 516, 517, 518, 43, -1, -1, 522, 47, -1, 49, ! -1, 527, -1, -1, 530, -1, 56, -1, -1, 59, ! 60, 3, 4, 5, 6, -1, -1, 9, -1, -1, ! -1, -1, -1, 73, -1, -1, -1, -1, -1, 4, ! -1, -1, -1, 83, -1, -1, -1, -1, 564, -1, ! 32, 91, -1, -1, -1, 95, 96, -1, -1, -1, ! -1, 43, -1, -1, -1, -1, 31, 32, -1, 34, ! -1, 36, -1, -1, 56, -1, -1, 59, 60, -1, ! 45, -1, 3, 4, 5, 6, 7, 8, 9, -1, ! -1, 73, -1, 58, 15, 60, 612, -1, 614, -1, ! -1, 83, -1, -1, -1, -1, -1, -1, 29, 91, ! 31, 32, -1, 95, 630, 631, 632, 38, -1, 84, ! -1, -1, 43, -1, -1, -1, 47, -1, -1, 645, ! -1, -1, -1, -1, -1, 56, -1, -1, 59, 60, ! -1, -1, 63, -1, -1, 71, 72, 73, 74, 75, ! 76, 77, 73, 79, 80, 81, 82, 83, 84, 85, ! 86, 87, 83, -1, -1, -1, -1, -1, -1, -1, ! 91, -1, -1, -1, 95, 140, 692, -1, -1, -1, ! -1, 146, 147, -1, -1, -1, 151, 152, 704, -1, ! 155, 156, 157, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 4, 5, -1, 171, -1, 9, -1, ! 175, 727, -1, -1, -1, -1, 181, 182, 76, 77, ! 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, ! -1, 32, -1, -1, -1, 200, 201, 202, -1, -1, ! 3, 4, 5, 6, 7, 8, 9, -1, 49, -1, ! 13, -1, 15, -1, -1, 56, -1, 520, 59, 60, ! 776, -1, 525, -1, 229, -1, 29, 783, 31, 32, ! -1, -1, 73, -1, -1, 38, 792, -1, -1, -1, ! 43, -1, 83, -1, 47, -1, -1, -1, -1, -1, ! -1, 554, -1, 56, 95, 96, 59, 60, 561, -1, ! -1, -1, -1, -1, 269, -1, -1, -1, -1, -1, ! 73, -1, -1, -1, -1, -1, 832, 833, 834, -1, ! 83, -1, -1, 839, 840, -1, 842, -1, 91, -1, ! -1, -1, 95, 3, 4, 5, 6, -1, -1, 9, ! 856, 604, 605, -1, 607, 861, -1, -1, 864, 865, ! 866, 867, 868, 869, -1, -1, -1, 873, -1, -1, ! -1, -1, 32, -1, 880, -1, 3, 4, 5, 6, ! 7, 8, 9, 43, -1, -1, -1, -1, 15, -1, ! -1, -1, -1, -1, -1, 901, 56, -1, -1, 59, ! 60, -1, 29, -1, 31, 32, -1, -1, -1, -1, ! -1, 38, -1, 73, 369, -1, 43, 4, 5, 374, ! 47, 8, 9, 83, -1, -1, -1, -1, 15, 56, ! -1, 91, 59, 60, 389, 95, -1, -1, 65, -1, ! -1, -1, -1, -1, -1, 32, 73, 700, 701, -1, ! -1, 38, 705, -1, -1, -1, 83, -1, -1, -1, ! 47, -1, 49, -1, 91, -1, -1, -1, 95, 56, ! 425, -1, 59, 60, -1, -1, -1, -1, -1, 434, ! -1, -1, -1, -1, -1, -1, 73, -1, -1, 444, ! -1, -1, 447, -1, -1, -1, 83, -1, -1, -1, ! -1, -1, -1, -1, 459, -1, -1, -1, 95, 96, ! -1, -1, 467, -1, -1, -1, -1, -1, -1, 1025, ! 1026, 1027, -1, -1, -1, 1031, 1032, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 493, 494, ! 495, 496, -1, -1, -1, -1, 501, -1, -1, -1, ! -1, -1, -1, -1, 509, 510, -1, -1, 513, -1, ! 515, 516, 517, -1, -1, -1, -1, 522, -1, -1, ! -1, -1, 527, -1, -1, 530, -1, -1, -1, -1, ! -1, -1, -1, 836, 34, 4, 5, -1, -1, 8, ! 9, -1, -1, -1, -1, -1, 15, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 58, 564, ! 29, -1, 31, 32, -1, -1, -1, -1, 871, 38, ! -1, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 47, 1135, ! -1, 1137, 1138, 1139, 1140, 1141, -1, 56, -1, 1145, ! 59, 60, 3, 4, 5, 6, 7, 8, 9, -1, ! -1, -1, -1, -1, 15, -1, -1, -1, 911, -1, ! 913, -1, -1, -1, 1170, 1171, -1, 1173, 29, -1, ! 31, 32, 1178, 1179, -1, 1181, 95, 38, -1, -1, ! -1, -1, 43, -1, -1, -1, 47, -1, -1, -1, ! -1, -1, 4, 5, -1, 56, 8, 9, 59, 60, ! -1, -1, 63, 15, -1, 155, 156, 157, -1, -1, ! -1, -1, 73, -1, -1, -1, -1, 29, -1, 31, ! 32, -1, 83, -1, -1, -1, 38, -1, -1, -1, ! 91, 181, -1, -1, 95, 47, 989, 990, 693, 992, ! -1, -1, -1, -1, 56, -1, -1, 59, 60, 61, ! 200, 201, 202, -1, -1, -1, -1, 1263, 1264, 1265, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 1022, ! -1, -1, 727, -1, -1, -1, 4, 5, -1, 229, ! 8, 9, -1, 95, -1, -1, -1, 15, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 1304, 1305, ! 1306, 1307, 1308, 1309, 32, -1, 1312, 1313, -1, -1, ! 38, -1, -1, -1, -1, -1, -1, -1, -1, 47, ! -1, 49, -1, -1, -1, -1, -1, -1, 56, -1, ! -1, 59, 60, -1, -1, -1, -1, 792, -1, 1345, ! -1, -1, -1, -1, -1, 73, 3, 4, 5, 6, ! 7, 8, 9, -1, -1, 83, -1, -1, 15, -1, ! 1366, 1367, 312, -1, -1, -1, -1, 95, 96, 1375, ! -1, -1, 29, -1, 31, 32, -1, 832, 833, 834, ! -1, 38, -1, 1136, -1, 840, 43, 842, -1, -1, ! 47, -1, -1, -1, -1, -1, -1, -1, -1, 56, ! -1, -1, 59, 60, -1, -1, 861, -1, -1, -1, ! 865, 866, 362, 363, 364, -1, 73, -1, 873, -1, ! 3, 4, 5, 6, -1, 880, 83, -1, -1, -1, ! -1, -1, -1, -1, 91, -1, -1, -1, 95, 3, ! 4, 5, 6, 7, 8, 9, 901, -1, -1, 32, ! -1, 15, -1, -1, 1460, -1, -1, 1463, -1, 1465, ! 43, -1, 1468, -1, -1, 29, -1, 31, 32, -1, ! -1, -1, -1, 56, 38, 425, 59, 60, -1, 43, ! -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, ! 73, -1, 56, -1, -1, 59, 60, -1, 1251, -1, ! 83, -1, -1, -1, -1, -1, -1, -1, 91, 73, ! -1, -1, 95, -1, -1, -1, -1, -1, -1, 83, ! -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, ! -1, 95, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 493, -1, 495, 496, 497, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1310, -1, 509, ! 510, -1, -1, 513, -1, 515, 516, 517, 518, -1, ! 4, 5, 522, 7, 8, 9, -1, 527, 1033, 13, ! 530, 15, -1, -1, -1, -1, -1, 1340, -1, -1, ! -1, -1, -1, -1, -1, 29, -1, 31, 32, -1, ! 1353, -1, -1, -1, 38, -1, 1612, 1613, 1614, -1, ! -1, -1, -1, 47, -1, 49, -1, -1, -1, -1, ! -1, -1, 56, -1, -1, 59, 60, 1380, -1, -1, ! -1, 1384, -1, 72, 73, 74, 75, 76, 77, 73, ! 79, 80, 81, 82, 83, 84, 85, 86, 87, 83, ! -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, ! -1, 95, 96, 1669, -1, -1, 1419, -1, -1, -1, ! -1, -1, 1127, 1128, 1129, 1130, 1131, 1132, -1, -1, ! 81, -1, 1137, 84, 1139, 1140, 1141, -1, -1, -1, ! 1145, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1710, 1711, 1712, 108, -1, 110, ! -1, -1, -1, -1, -1, 1170, 1171, 1723, 1173, 1472, ! 1473, -1, -1, 1178, 1179, -1, 1181, -1, -1, -1, ! -1, 681, 3, 4, 5, 6, 7, 8, 9, -1, ! -1, -1, -1, -1, 15, 695, 696, 697, -1, -1, ! -1, -1, -1, -1, 704, -1, 1509, 1510, -1, -1, ! -1, 32, 1515, -1, -1, -1, -1, 38, -1, -1, ! -1, -1, 43, -1, -1, -1, 47, 727, 49, -1, ! 181, -1, -1, -1, -1, 56, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 200, ! 201, 202, 73, -1, -1, -1, -1, -1, -1, 210, ! 4, 5, 83, 7, 8, 9, 3, 4, 5, 6, ! 91, 15, 9, -1, 95, -1, -1, -1, 229, -1, ! -1, -1, -1, -1, -1, 29, -1, 31, 32, -1, ! -1, -1, 792, -1, 38, 32, -1, -1, -1, 1304, ! 1305, 1306, -1, 47, -1, 256, 43, 1312, 1313, -1, ! -1, -1, 56, -1, -1, 59, 60, -1, -1, 56, ! -1, 1624, 59, 60, -1, 276, -1, -1, -1, -1, ! -1, -1, 832, 833, 834, -1, 73, -1, -1, -1, ! 1345, -1, 842, -1, -1, -1, 83, -1, -1, -1, ! -1, -1, -1, -1, 91, 4, 5, -1, 95, -1, ! 9, 861, 1367, -1, 864, 865, 866, 867, 868, 869, ! 1375, -1, -1, 873, -1, -1, -1, -1, -1, -1, ! 880, -1, -1, 32, -1, -1, -1, 3, 4, 5, ! 6, -1, -1, 9, -1, -1, 3, 4, 5, 6, ! 49, -1, 9, -1, -1, -1, -1, 56, -1, -1, ! 59, 60, -1, -1, -1, -1, 32, 368, 369, 919, ! 920, 921, -1, -1, 73, 32, -1, 43, -1, -1, ! -1, -1, 932, -1, 83, -1, 43, 388, 389, -1, ! 56, -1, -1, 59, 60, -1, 95, 96, -1, 56, ! -1, -1, 59, 60, -1, 1460, -1, 73, -1, -1, ! 1465, -1, -1, 1468, -1, -1, 73, 83, -1, -1, ! -1, -1, -1, -1, 425, 91, 83, -1, -1, 95, ! -1, -1, -1, 196, 91, -1, -1, -1, 95, -1, ! 3, 4, 5, 6, -1, -1, 9, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 1006, 1007, -1, -1, ! 1010, -1, -1, -1, -1, -1, -1, -1, -1, 32, ! -1, 1021, -1, -1, -1, 1025, 1026, 1027, -1, -1, ! 43, 1031, 3, 4, 5, 6, -1, -1, -1, -1, ! -1, -1, 493, 56, 495, 496, 59, 60, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 509, 510, ! 73, 32, 513, -1, 515, 516, 517, 518, -1, -1, ! 83, 522, 43, -1, -1, -1, 527, -1, 91, 530, ! -1, -1, 95, -1, -1, 56, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 73, -1, -1, -1, -1, 1612, 1613, 1614, ! -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, ! 91, -1, -1, -1, 95, -1, -1, 1127, 1128, 1129, ! 1130, 1131, 1132, 1133, -1, -1, -1, 1137, -1, 1139, ! 1140, 1141, -1, 3, 4, 5, 6, -1, -1, -1, ! -1, 1151, 1152, 1153, -1, -1, -1, -1, 3, 4, ! 5, 6, -1, -1, 1669, -1, -1, -1, -1, 382, ! 1170, -1, 32, -1, -1, -1, -1, -1, 1178, -1, ! -1, -1, -1, 43, -1, -1, -1, 32, -1, -1, ! -1, -1, 3, 4, 5, 6, 56, -1, 43, 59, ! 60, -1, -1, -1, -1, 1710, 1711, 1712, -1, -1, ! -1, 56, -1, 73, 59, 60, -1, -1, 1723, -1, ! -1, -1, -1, 83, -1, -1, -1, -1, 73, -1, ! -1, 91, 43, 1233, 1234, 95, 1236, -1, 83, -1, ! -1, 111, 112, -1, -1, 56, 91, 1247, 59, 60, ! 95, -1, -1, -1, 65, 1255, 707, 708, -1, -1, ! -1, -1, 73, 1263, 1264, 1265, -1, -1, -1, -1, ! 483, 484, 83, -1, -1, -1, 727, -1, -1, -1, ! 91, -1, -1, -1, 95, -1, -1, 3, 4, 5, ! 6, -1, -1, -1, -1, -1, -1, -1, 3, 4, ! 5, 6, -1, -1, 1304, 1305, 1306, 1307, 1308, 1309, ! -1, -1, 1312, 1313, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 196, 43, 1328, 1329, ! 1330, 1331, 1332, -1, -1, -1, -1, -1, 43, -1, ! 56, 792, -1, 59, 60, 1345, -1, -1, -1, 65, ! -1, 56, -1, -1, 59, 60, -1, 73, -1, -1, ! 65, -1, -1, -1, -1, -1, -1, 83, 73, -1, ! -1, -1, -1, -1, -1, 91, -1, -1, 83, 95, ! -1, 832, 833, 834, -1, -1, 91, -1, 839, 840, ! 95, 842, -1, -1, -1, -1, -1, -1, 611, -1, ! -1, -1, -1, -1, -1, 618, -1, -1, -1, -1, ! 861, -1, -1, 864, 865, 866, 867, 868, 869, 870, ! -1, -1, 873, 4, 5, -1, 7, 8, 9, 880, ! -1, 644, 13, -1, 15, -1, -1, 1437, 1438, -1, ! 1440, -1, -1, -1, 1444, -1, -1, -1, 29, 900, ! 31, 32, -1, -1, -1, -1, 669, 38, -1, -1, ! 1460, -1, 675, -1, 677, 678, 47, -1, -1, -1, ! -1, -1, -1, 343, -1, 56, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 704, -1, -1, -1, -1, -1, -1, 711, -1, ! -1, 1501, 1502, 1503, 1504, 1505, -1, -1, 721, 71, ! 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, ! 82, 83, 84, 85, 86, 87, -1, 740, 741, 742, ! 743, -1, 745, 746, 747, 748, 749, 750, 751, 752, ! 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, ! 763, 4, 5, 423, 7, 8, 9, -1, -1, 1559, ! 13, -1, 15, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 29, -1, 31, 32, ! -1, 1032, 1033, 1034, -1, 38, -1, -1, -1, -1, ! -1, -1, 13, -1, 47, -1, -1, -1, -1, -1, ! -1, -1, -1, 56, -1, -1, 59, 60, -1, -1, ! 823, -1, 1612, -1, 1614, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 842, ! -1, 501, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 856, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 87, -1, -1, 1669, ! -1, -1, -1, -1, -1, -1, 1127, 1128, 1129, 1130, ! 1131, 1132, 1133, -1, 1135, -1, 1137, 1138, 1139, 1140, ! 1141, -1, -1, -1, 1145, -1, -1, -1, -1, -1, ! 1151, 1152, 1153, 4, 5, -1, -1, 8, 9, -1, ! 1710, 1711, 1712, -1, 15, -1, -1, -1, -1, -1, ! -1, -1, -1, 1723, -1, -1, -1, 1178, 29, -1, ! 31, 32, -1, -1, -1, -1, 949, 38, -1, -1, ! -1, -1, 612, -1, 614, -1, 47, -1, -1, 619, ! 620, 621, 622, 623, -1, 56, -1, -1, 59, 60, ! -1, -1, 632, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 986, 987, 645, -1, -1, -1, -1, ! -1, -1, -1, -1, 14, -1, -1, -1, 1001, -1, ! 1003, -1, 1005, 23, 24, -1, -1, -1, -1, -1, ! -1, 31, 32, -1, 34, -1, -1, -1, 678, -1, ! -1, -1, -1, -1, -1, -1, -1, 4, 5, -1, ! -1, 8, 9, -1, -1, -1, -1, 697, 15, -1, ! -1, -1, -1, 1046, 704, -1, -1, -1, 68, -1, ! -1, -1, 29, -1, 31, 32, -1, -1, -1, -1, ! -1, 38, -1, 1304, 1305, 1306, 1307, 1308, 1309, -1, ! 47, 1312, 1313, -1, -1, -1, 1079, -1, -1, 56, ! -1, -1, 59, 60, -1, -1, -1, 1328, 1329, 1330, ! 1331, 1332, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1345, -1, -1, -1, 128, -1, ! 130, -1, -1, -1, 1117, -1, -1, 137, 138, -1, ! -1, -1, -1, -1, -1, 1366, 146, 147, -1, -1, ! 150, 151, 152, -1, 154, 155, 156, 157, -1, -1, ! -1, -1, -1, -1, 1147, 1148, 72, 73, 74, 75, ! 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ! 86, 87, -1, -1, -1, -1, 1169, -1, -1, -1, ! 362, 363, 364, -1, 834, -1, -1, -1, -1, -1, ! -1, -1, 842, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 1437, 1438, 1439, 1440, ! -1, -1, -1, 1444, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1217, 1218, -1, -1, -1, 1460, ! -1, -1, -1, -1, -1, 245, 246, 73, 74, 75, ! 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, ! 86, 87, -1, -1, 904, -1, -1, -1, -1, 269, ! 910, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 1501, 1502, 1503, 1504, 1505, -1, -1, -1, -1, -1, ! -1, -1, 1275, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 312, 1296, -1, 1298, -1, 1300, -1, 1302, ! -1, 493, -1, 495, 496, 497, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 1559, -1, ! -1, -1, -1, 983, -1, -1, -1, -1, -1, -1, ! 1333, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 360, -1, 362, 363, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1357, -1, -1, 1017, -1, -1, ! -1, -1, -1, 1023, -1, -1, -1, 1027, -1, -1, ! -1, 1612, -1, 1614, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 1395, 413, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 434, -1, 436, -1, -1, -1, ! -1, 1424, -1, -1, 444, -1, -1, 447, 1669, -1, ! -1, -1, 1092, -1, 1094, -1, -1, -1, -1, 459, ! -1, -1, -1, 1446, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 1456, 1457, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 1710, ! 1711, 1712, 1132, -1, -1, -1, -1, -1, -1, -1, ! -1, 1141, 1723, 1486, -1, -1, -1, -1, -1, -1, ! 1150, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 695, 696, 697, -1, -1, -1, -1, ! -1, -1, 704, -1, -1, -1, -1, -1, -1, 1522, ! -1, -1, -1, -1, -1, -1, -1, -1, 548, 549, ! -1, -1, -1, -1, 1194, -1, 1196, -1, -1, -1, ! -1, -1, -1, -1, 564, -1, 1206, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1567, 1568, -1, -1, -1, -1, ! -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 606, -1, 608, -1, ! -1, 1594, -1, -1, -1, -1, -1, -1, -1, -1, ! 792, -1, -1, -1, -1, 1265, 66, 67, 68, 69, ! 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, ! 80, 81, 82, 83, 84, 85, 86, 87, -1, 1632, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 832, 833, 834, -1, -1, -1, -1, -1, -1, 1309, ! 842, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 681, -1, -1, -1, -1, 1669, -1, -1, -1, ! -1, -1, 692, 693, -1, 695, 696, -1, -1, -1, ! -1, 1341, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 1694, -1, -1, 1354, 66, 67, 68, 69, 70, ! 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, ! 81, 82, 83, 84, 85, 86, 87, 66, 67, 68, ! 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, ! 79, 80, 81, 82, 83, 84, 85, 86, 87, -1, ! 932, -1, 113, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 776, -1, -1, -1, ! 109, -1, -1, 783, 784, -1, -1, -1, -1, -1, ! -1, -1, -1, 793, -1, -1, -1, -1, -1, -1, ! -1, -1, 1442, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 818, -1, ! -1, -1, 1805, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1006, 1007, -1, -1, 1010, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 1021, ! -1, -1, -1, 1025, 1026, 1027, -1, -1, -1, 1031, ! -1, -1, -1, 1503, -1, -1, -1, -1, 62, -1, ! -1, 1511, 66, 67, 68, 69, 70, 71, 72, 73, ! 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ! 84, 85, 86, 87, -1, -1, -1, -1, -1, -1, ! 900, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1557, -1, 919, ! 920, 921, 922, -1, -1, -1, -1, -1, -1, 62, ! -1, -1, 932, 66, 67, 68, 69, 70, 71, 72, ! 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, ! 83, 84, 85, 86, 87, 1127, 1128, 1129, 1130, 1131, ! 1132, 1133, -1, -1, -1, 1137, -1, 1139, 1140, 1141, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, ! 85, 86, 87, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 1006, 1007, -1, -1, ! 1010, -1, -1, -1, -1, 1, -1, 3, 4, 5, ! 6, 1021, 8, 9, 10, 11, 12, -1, 14, 15, ! -1, 1031, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, 32, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, -1, -1, 51, 52, 53, 54, 55, ! 56, -1, 1712, 59, 60, 1247, -1, 63, 64, -1, ! -1, -1, -1, 1255, 70, -1, -1, 73, -1, -1, ! -1, 1263, 1264, 1265, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, -1, 95, ! -1, -1, -1, -1, -1, -1, -1, 1, -1, 3, ! 4, 5, 6, 7, 8, 9, 112, -1, -1, 13, ! -1, 15, 1304, 1305, 1306, 1307, 1308, 1309, -1, -1, ! 1312, 1313, 26, -1, 28, -1, -1, -1, 32, -1, ! -1, -1, -1, -1, 38, -1, -1, -1, -1, 43, ! -1, -1, -1, 47, 1164, 49, -1, 1167, -1, -1, ! 1170, -1, 56, -1, -1, 59, 60, 61, 62, 63, ! -1, 65, 66, 67, 68, 69, 70, 71, 72, 73, ! 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, ! 84, 85, 86, 87, -1, 89, 90, 91, -1, 93, ! 94, 95, 96, 97, -1, -1, -1, -1, -1, 103, ! 104, -1, -1, -1, -1, 109, 110, 111, -1, 113, ! -1, -1, -1, 1233, 1234, -1, 1236, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 1247, -1, -1, ! -1, -1, -1, -1, -1, 1255, -1, -1, -1, -1, ! -1, -1, -1, 1263, 1264, 1437, 1438, -1, 1440, -1, ! 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, ! -1, 14, 15, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 1294, -1, 29, 30, 31, 32, ! 33, -1, 35, 36, 37, 38, -1, 40, 41, 42, ! 43, 44, 45, -1, 47, -1, 49, -1, 51, 52, ! 53, 54, 55, 56, -1, -1, 59, 60, -1, 1501, ! 1502, 1503, 1504, 1505, -1, -1, 1336, 70, -1, -1, ! 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, ! 83, -1, -1, -1, -1, -1, 89, 90, 91, -1, ! -1, -1, 95, 96, -1, -1, -1, 1367, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 112, ! -1, -1, -1, -1, -1, -1, 1, 1559, 3, 4, ! 5, 6, 7, 8, 9, 10, 11, 12, -1, 14, ! 15, 16, -1, 18, 19, 20, 21, 22, 23, 24, ! 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, ! 35, 36, 37, 38, -1, 40, 41, 42, 43, 44, ! 45, 46, 47, 48, -1, -1, 51, 52, 53, 54, ! 55, 56, -1, -1, 59, 60, 61, -1, 63, 64, ! -1, -1, -1, -1, -1, 70, -1, -1, 73, -1, ! -1, -1, -1, 1463, -1, 1465, 81, 82, 83, -1, ! -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, ! 95, -1, 97, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 111, 112, 1, -1, ! 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ! -1, 14, 15, 16, -1, 18, 19, 20, 21, 22, ! 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, ! 33, -1, 35, 36, 37, 38, -1, 40, 41, 42, ! 43, 44, 45, 46, 47, 48, -1, -1, 51, 52, ! 53, 54, 55, 56, -1, -1, 59, 60, 61, -1, ! 63, 64, -1, -1, -1, -1, -1, 70, -1, -1, ! 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, ! 83, -1, -1, -1, -1, -1, 89, 90, 91, -1, ! -1, -1, 95, 1, 97, 3, 4, 5, 6, 7, ! 8, 9, 10, 11, 12, 13, 14, 15, -1, 112, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, 32, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, 49, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, 61, -1, -1, 64, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, -1, 95, 96, 1, ! -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! 12, 13, 14, 15, 112, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 29, 30, 31, ! 32, 33, -1, 35, 36, 37, 38, -1, 40, 41, ! 42, 43, 44, 45, -1, 47, -1, 49, -1, 51, ! 52, 53, 54, 55, 56, -1, -1, 59, 60, 61, ! -1, -1, 64, -1, -1, -1, -1, -1, 70, -1, ! -1, 73, -1, -1, -1, -1, -1, -1, -1, 81, ! 82, 83, -1, -1, -1, -1, -1, 89, 90, 91, ! -1, -1, -1, 95, 96, 1, -1, 3, 4, 5, ! 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ! 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, 32, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, -1, -1, 51, 52, 53, 54, 55, ! 56, -1, -1, 59, 60, -1, -1, -1, 64, -1, ! -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, ! -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, 1, 95, ! 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ! -1, 14, 15, -1, 110, -1, 112, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 29, 30, 31, 32, ! 33, -1, 35, 36, 37, 38, -1, 40, 41, 42, ! 43, 44, 45, -1, 47, -1, -1, -1, 51, 52, ! 53, 54, 55, 56, -1, -1, 59, 60, 61, -1, ! 63, 64, -1, -1, -1, -1, -1, 70, -1, -1, ! 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, ! 83, -1, -1, -1, -1, -1, 89, 90, 91, -1, ! -1, 1, 95, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, 12, -1, 14, 15, -1, -1, -1, 112, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, ! 30, 31, -1, 33, -1, 35, 36, 37, 38, -1, ! 40, 41, 42, 43, 44, 45, -1, 47, -1, -1, ! -1, 51, 52, 53, 54, 55, 56, -1, -1, 59, ! 60, 61, -1, -1, 64, -1, -1, -1, -1, -1, ! 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, ! -1, 81, 82, 83, -1, -1, -1, -1, -1, 89, ! 90, 91, -1, -1, -1, 95, 96, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 111, 112, 1, -1, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, 12, -1, 14, 15, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, 32, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, -1, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, 61, -1, -1, 64, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, 1, 95, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, 12, -1, 14, ! 15, -1, -1, -1, 112, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 29, 30, 31, -1, 33, -1, ! 35, 36, 37, 38, -1, 40, 41, 42, 43, 44, ! 45, -1, 47, -1, -1, -1, 51, 52, 53, 54, ! 55, 56, -1, -1, 59, 60, 61, -1, -1, 64, ! -1, -1, -1, -1, -1, 70, -1, -1, 73, -1, ! -1, -1, -1, -1, -1, -1, 81, 82, 83, -1, ! -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, ! 95, 96, 1, -1, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, 12, -1, 14, 15, 112, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 29, 30, 31, -1, 33, -1, 35, 36, 37, 38, ! -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, ! -1, -1, 51, 52, 53, 54, 55, 56, -1, -1, ! 59, 60, 61, -1, -1, 64, -1, -1, -1, -1, ! -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, ! 89, 90, 91, -1, -1, -1, 95, 1, -1, 3, ! 4, 5, 6, 102, 8, 9, 10, 11, 12, -1, ! 14, 15, -1, 112, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 29, 30, 31, -1, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, -1, 47, -1, -1, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, 61, -1, -1, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! 1, 95, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, 12, -1, 14, 15, -1, -1, 111, 112, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 29, 30, ! 31, -1, 33, -1, 35, 36, 37, 38, -1, 40, ! 41, 42, 43, 44, 45, -1, 47, -1, -1, -1, ! 51, 52, 53, 54, 55, 56, -1, -1, 59, 60, ! 61, -1, -1, 64, -1, -1, -1, -1, -1, 70, ! -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, ! 81, 82, 83, -1, -1, -1, -1, -1, 89, 90, ! 91, -1, -1, 1, 95, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, 12, -1, 14, 15, -1, -1, ! 111, 112, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, 32, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, -1, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, 61, -1, -1, 64, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, 1, 95, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, 12, -1, 14, ! 15, -1, -1, -1, 112, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 29, 30, 31, -1, 33, -1, ! 35, 36, 37, 38, -1, 40, 41, 42, 43, 44, ! 45, -1, 47, -1, -1, -1, 51, 52, 53, 54, ! 55, 56, -1, -1, 59, 60, 61, -1, -1, 64, ! -1, -1, -1, -1, -1, 70, -1, -1, 73, -1, ! -1, -1, -1, -1, -1, -1, 81, 82, 83, -1, ! -1, -1, -1, -1, 89, 90, 91, -1, -1, 1, ! 95, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! 12, -1, 14, 15, -1, -1, -1, 112, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 29, 30, 31, ! -1, 33, -1, 35, 36, 37, 38, -1, 40, 41, ! 42, 43, 44, 45, -1, 47, -1, -1, -1, 51, ! 52, 53, 54, 55, 56, -1, -1, 59, 60, -1, ! -1, -1, 64, 65, -1, -1, -1, -1, 70, -1, ! -1, 73, -1, -1, -1, -1, -1, -1, -1, 81, ! 82, 83, -1, -1, -1, -1, -1, 89, 90, 91, ! -1, -1, 1, 95, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, 12, -1, 14, 15, -1, -1, -1, ! 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 29, 30, 31, -1, 33, -1, 35, 36, 37, 38, ! -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, ! -1, -1, 51, 52, 53, 54, 55, 56, -1, -1, ! 59, 60, -1, -1, -1, 64, -1, -1, -1, -1, ! -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, ! 89, 90, 91, -1, -1, 1, 95, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, 12, -1, 14, 15, ! -1, 110, -1, 112, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, -1, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, -1, -1, 51, 52, 53, 54, 55, ! 56, -1, -1, 59, 60, -1, -1, -1, 64, -1, ! -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, ! -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, 1, 95, ! 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, ! -1, 14, 15, -1, -1, -1, 112, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 29, 30, 31, -1, ! 33, -1, 35, 36, 37, 38, -1, 40, 41, 42, ! 43, 44, 45, -1, 47, -1, -1, -1, 51, 52, ! 53, 54, 55, 56, -1, -1, 59, 60, -1, -1, ! -1, 64, -1, -1, -1, -1, -1, 70, -1, -1, ! 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, ! 83, -1, -1, -1, -1, -1, 89, 90, 91, -1, ! -1, 1, 95, 3, 4, 5, 6, -1, 8, 9, ! 10, 11, 12, -1, 14, 15, -1, -1, -1, 112, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, ! 30, 31, -1, 33, -1, 35, 36, 37, 38, -1, ! 40, 41, 42, 43, 44, 45, -1, 47, -1, -1, ! -1, 51, 52, 53, 54, 55, 56, -1, -1, 59, ! 60, -1, -1, -1, 64, -1, -1, -1, -1, -1, ! 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, ! -1, 81, 82, 83, -1, -1, -1, -1, -1, 89, ! 90, 91, -1, -1, -1, 95, 3, 4, 5, 6, ! -1, 8, 9, 10, 11, 12, -1, 14, 15, -1, ! -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 29, 30, 31, -1, 33, -1, 35, 36, ! 37, 38, -1, 40, 41, 42, 43, 44, 45, -1, ! 47, -1, -1, -1, 51, 52, 53, 54, 55, 56, ! -1, -1, 59, 60, -1, -1, -1, 64, -1, -1, ! -1, -1, -1, 70, -1, -1, 73, -1, -1, -1, ! -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, ! -1, -1, 89, 90, 91, -1, -1, -1, 95, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, ! 14, 15, -1, -1, -1, 112, 113, -1, -1, -1, ! -1, -1, -1, -1, -1, 29, 30, 31, -1, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, -1, 47, -1, -1, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, -1, -1, -1, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! -1, 95, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, 12, -1, 14, 15, -1, -1, -1, 112, 113, ! -1, -1, -1, -1, -1, -1, -1, -1, 29, 30, ! 31, -1, 33, -1, 35, 36, 37, 38, -1, 40, ! 41, 42, 43, 44, 45, -1, 47, -1, -1, -1, ! 51, 52, 53, 54, 55, 56, -1, -1, 59, 60, ! -1, -1, -1, 64, -1, -1, -1, -1, -1, 70, ! -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, ! 81, 82, 83, -1, -1, -1, -1, -1, 89, 90, ! 91, -1, -1, -1, 95, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, 12, -1, 14, 15, -1, -1, ! -1, 112, 113, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, -1, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, -1, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, -1, -1, -1, 64, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, -1, 95, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, 12, -1, 14, ! 15, -1, -1, -1, 112, 113, -1, -1, -1, -1, ! -1, -1, -1, -1, 29, 30, 31, -1, 33, -1, ! 35, 36, 37, 38, -1, 40, 41, 42, 43, 44, ! 45, -1, 47, -1, -1, -1, 51, 52, 53, 54, ! 55, 56, -1, -1, 59, 60, -1, -1, -1, 64, ! -1, -1, -1, -1, -1, 70, -1, -1, 73, -1, ! -1, -1, -1, -1, -1, -1, 81, 82, 83, -1, ! -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, ! 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 112, 113, 3, ! 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, ! 14, 15, 16, -1, 18, 19, 20, 21, 22, 23, ! 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, 46, 47, 48, -1, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, 61, -1, 63, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! -1, 95, -1, 97, 3, 4, 5, 6, 7, 8, ! 9, 10, 11, 12, -1, 14, 15, 16, 112, 18, ! 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, ! 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, ! -1, 40, 41, 42, 43, 44, 45, 46, 47, 48, ! -1, -1, 51, 52, 53, 54, 55, 56, -1, -1, ! 59, 60, -1, -1, 63, 64, -1, -1, -1, -1, ! -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, ! 89, 90, 91, -1, -1, -1, 95, -1, 97, 3, ! 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ! 14, 15, -1, 112, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 29, 30, 31, 32, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, -1, 47, -1, 49, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, -1, -1, -1, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! -1, 95, 96, 3, 4, 5, 6, 7, 8, 9, ! 10, 11, 12, 13, 14, 15, -1, -1, 112, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, ! 30, 31, 32, 33, -1, 35, 36, 37, 38, -1, ! 40, 41, 42, 43, 44, 45, -1, 47, -1, 49, ! -1, 51, 52, 53, 54, 55, 56, -1, -1, 59, ! 60, -1, -1, -1, 64, -1, -1, -1, -1, -1, ! 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, ! -1, 81, 82, 83, -1, -1, -1, -1, -1, 89, ! 90, 91, -1, -1, -1, 95, 96, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, 12, -1, 14, 15, ! -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, 32, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, 49, -1, 51, 52, 53, 54, 55, ! 56, -1, -1, 59, 60, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, ! -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, -1, 95, ! 96, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! 12, -1, 14, 15, -1, -1, 112, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 29, 30, 31, ! 32, 33, -1, 35, 36, 37, 38, -1, 40, 41, ! 42, 43, 44, 45, -1, 47, -1, -1, -1, 51, ! 52, 53, 54, 55, 56, -1, -1, 59, 60, -1, ! -1, -1, 64, -1, -1, -1, -1, -1, 70, -1, ! -1, 73, -1, -1, -1, -1, -1, -1, -1, 81, ! 82, 83, -1, -1, -1, -1, -1, 89, 90, 91, ! -1, -1, -1, 95, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, 12, -1, 14, 15, -1, -1, -1, ! 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, ! -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, ! -1, -1, 51, 52, 53, 54, 55, 56, -1, -1, ! 59, 60, -1, -1, -1, 64, -1, -1, -1, -1, ! -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, ! 89, 90, 91, -1, -1, -1, 95, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, 12, -1, 14, 15, ! -1, -1, -1, 112, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, 32, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, -1, -1, 51, 52, 53, 54, 55, ! 56, -1, -1, 59, 60, -1, -1, -1, 64, -1, ! -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, ! -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, -1, 95, ! 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, ! -1, 14, 15, -1, -1, -1, 112, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 29, 30, 31, -1, ! 33, -1, 35, 36, 37, 38, -1, 40, 41, 42, ! 43, 44, 45, -1, 47, -1, -1, -1, 51, 52, ! 53, 54, 55, 56, -1, -1, 59, 60, -1, -1, ! 63, 64, -1, -1, -1, -1, -1, 70, -1, -1, ! 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, ! 83, -1, -1, -1, -1, -1, 89, 90, 91, -1, ! -1, -1, 95, 3, 4, 5, 6, 7, 8, 9, ! 10, 11, 12, -1, 14, 15, -1, -1, -1, 112, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, ! 30, 31, 32, 33, -1, 35, 36, 37, 38, -1, ! 40, 41, 42, 43, 44, 45, -1, 47, -1, -1, ! -1, 51, 52, 53, 54, 55, 56, -1, -1, 59, ! 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, ! -1, 81, 82, 83, -1, -1, -1, -1, -1, 89, ! 90, 91, -1, -1, -1, 95, 3, 4, 5, 6, ! -1, 8, 9, 10, 11, 12, -1, 14, 15, -1, ! -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 29, 30, 31, 32, 33, -1, 35, 36, ! 37, 38, -1, 40, 41, 42, 43, 44, 45, -1, ! 47, -1, -1, -1, 51, 52, 53, 54, 55, 56, ! -1, -1, 59, 60, -1, -1, -1, 64, -1, -1, ! -1, -1, -1, 70, -1, -1, 73, -1, -1, -1, ! -1, -1, -1, -1, 81, 82, 83, -1, -1, -1, ! -1, -1, 89, 90, 91, -1, -1, -1, 95, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, ! 14, 15, -1, -1, -1, 112, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 29, 30, 31, -1, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, -1, 47, -1, -1, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, -1, -1, -1, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! -1, 95, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, 12, -1, 14, 15, -1, -1, -1, 112, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 29, 30, ! 31, -1, 33, -1, 35, 36, 37, 38, -1, 40, ! 41, 42, 43, 44, 45, -1, 47, -1, -1, -1, ! 51, 52, 53, 54, 55, 56, -1, -1, 59, 60, ! 61, -1, -1, -1, -1, -1, -1, -1, -1, 70, ! -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, ! 81, 82, 83, -1, -1, -1, -1, -1, 89, 90, ! 91, -1, -1, -1, 95, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, 12, -1, 14, 15, -1, -1, ! -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, -1, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, -1, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, -1, 95, 96, 3, ! 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, ! 14, 15, -1, -1, 112, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 29, 30, 31, -1, 33, ! -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, ! 44, 45, -1, 47, -1, -1, -1, 51, 52, 53, ! 54, 55, 56, -1, -1, 59, 60, -1, -1, -1, ! 64, -1, -1, -1, -1, -1, 70, -1, -1, 73, ! -1, -1, -1, -1, -1, -1, -1, 81, 82, 83, ! -1, -1, -1, -1, -1, 89, 90, 91, -1, -1, ! -1, 95, 3, 4, 5, 6, -1, 8, 9, 10, ! 11, 12, -1, 14, 15, -1, -1, -1, 112, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 29, 30, ! 31, 32, 33, -1, 35, 36, 37, 38, -1, 40, ! 41, 42, 43, 44, 45, -1, 47, -1, -1, -1, ! 51, 52, 53, 54, 55, 56, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, ! -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, ! 81, 82, 83, -1, -1, -1, -1, -1, 89, 90, ! 91, -1, -1, -1, 95, 3, 4, 5, 6, -1, ! 8, 9, 10, 11, 12, -1, 14, 15, -1, -1, ! -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 29, 30, 31, -1, 33, -1, 35, 36, 37, ! 38, -1, 40, 41, 42, 43, 44, 45, -1, 47, ! -1, -1, -1, 51, 52, 53, 54, 55, 56, -1, ! -1, 59, 60, -1, -1, -1, 64, -1, -1, -1, ! -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, ! -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, ! -1, 89, 90, 91, -1, -1, -1, 95, 3, 4, ! 5, 6, -1, 8, 9, 10, 11, 12, -1, 14, ! 15, -1, -1, -1, 112, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 29, 30, 31, 32, 33, -1, ! 35, 36, 37, 38, -1, 40, 41, 42, 43, 44, ! 45, -1, 47, -1, -1, -1, 51, 52, 53, 54, ! 55, 56, -1, -1, 59, 60, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 70, -1, -1, 73, -1, ! -1, -1, -1, -1, -1, -1, 81, 82, 83, -1, ! -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, ! 95, 3, 4, 5, 6, -1, 8, 9, 10, 11, ! 12, -1, 14, 15, -1, -1, -1, 112, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 29, 30, 31, ! -1, 33, -1, 35, 36, 37, 38, -1, 40, 41, ! 42, 43, 44, 45, -1, 47, -1, -1, -1, 51, ! 52, 53, 54, 55, 56, -1, -1, 59, 60, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, ! -1, 73, -1, -1, -1, -1, -1, -1, -1, 81, ! 82, 83, -1, -1, -1, -1, -1, 89, 90, 91, ! -1, -1, -1, 95, 3, 4, 5, 6, -1, 8, ! 9, 10, 11, 12, -1, 14, 15, -1, -1, -1, ! 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 29, 30, 31, -1, 33, -1, 35, 36, 37, 38, ! -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, ! -1, -1, 51, 52, 53, 54, 55, 56, -1, -1, ! 59, 60, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, ! -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, ! 89, 90, 91, -1, -1, -1, 95, 3, 4, 5, ! 6, -1, 8, 9, 10, 11, 12, -1, 14, 15, ! -1, -1, -1, 112, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, 29, 30, 31, -1, 33, -1, 35, ! 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, ! -1, 47, -1, -1, -1, 51, 52, 53, 54, 55, ! 56, -1, -1, 59, 60, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, ! -1, -1, -1, -1, -1, 81, 82, 83, -1, -1, ! -1, -1, -1, 89, 90, 91, -1, -1, -1, 95, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, 112, 66, 67, 68, ! 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, ! 79, 80, 81, 82, 83, 84, 85, 86, 87, 66, ! 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ! 77, -1, 79, 80, 81, 82, 83, 84, 85, 86, ! 87 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/lib/bison.simple" *************** yyreduce: *** 4674,4790 **** switch (yyn) { case 1: ! #line 439 "parse.y" { finish_translation_unit (); ; break;} case 2: ! #line 441 "parse.y" { finish_translation_unit (); ; break;} case 3: ! #line 449 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 4: ! #line 451 "parse.y" { yyval.ttype = NULL_TREE; ggc_collect (); ; break;} case 5: ! #line 453 "parse.y" { yyval.ttype = NULL_TREE; ggc_collect (); ; break;} case 8: ! #line 462 "parse.y" { have_extern_spec = 1; used_extern_spec = 0; yyval.ttype = NULL_TREE; ; break;} case 9: ! #line 467 "parse.y" { have_extern_spec = 0; ; break;} case 10: ! #line 472 "parse.y" { yyval.itype = pedantic; pedantic = 0; ; break;} case 12: ! #line 481 "parse.y" { if (pending_lang_change) do_pending_lang_change(); type_lookups = NULL_TREE; ; break;} case 13: ! #line 484 "parse.y" { if (! toplevel_bindings_p ()) pop_everything (); ; break;} case 14: ! #line 490 "parse.y" { do_pending_inlines (); ; break;} case 15: ! #line 492 "parse.y" { do_pending_inlines (); ; break;} case 16: ! #line 495 "parse.y" ! { cp_warning ("keyword `export' not implemented, and will be ignored"); ; break;} case 17: ! #line 497 "parse.y" { do_pending_inlines (); ; break;} case 18: ! #line 499 "parse.y" { do_pending_inlines (); ; break;} case 19: ! #line 501 "parse.y" { if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); assemble_asm (yyvsp[-2].ttype); ; break;} case 20: ! #line 504 "parse.y" { pop_lang_context (); ; break;} case 21: ! #line 506 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 22: ! #line 508 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 23: ! #line 510 "parse.y" { push_namespace (yyvsp[-1].ttype); ; break;} case 24: ! #line 512 "parse.y" { pop_namespace (); ; break;} case 25: ! #line 514 "parse.y" { push_namespace (NULL_TREE); ; break;} case 26: ! #line 516 "parse.y" { pop_namespace (); ; break;} case 28: ! #line 519 "parse.y" { do_toplevel_using_decl (yyvsp[-1].ttype); ; break;} case 30: ! #line 522 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} case 31: ! #line 527 "parse.y" { begin_only_namespace_names (); ; break;} case 32: ! #line 529 "parse.y" { end_only_namespace_names (); if (lastiddecl) --- 4902,5018 ---- switch (yyn) { case 1: ! #line 456 "parse.y" { finish_translation_unit (); ; break;} case 2: ! #line 458 "parse.y" { finish_translation_unit (); ; break;} case 3: ! #line 466 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 4: ! #line 468 "parse.y" { yyval.ttype = NULL_TREE; ggc_collect (); ; break;} case 5: ! #line 470 "parse.y" { yyval.ttype = NULL_TREE; ggc_collect (); ; break;} case 8: ! #line 479 "parse.y" { have_extern_spec = 1; used_extern_spec = 0; yyval.ttype = NULL_TREE; ; break;} case 9: ! #line 484 "parse.y" { have_extern_spec = 0; ; break;} case 10: ! #line 489 "parse.y" { yyval.itype = pedantic; pedantic = 0; ; break;} case 12: ! #line 498 "parse.y" { if (pending_lang_change) do_pending_lang_change(); type_lookups = NULL_TREE; ; break;} case 13: ! #line 501 "parse.y" { if (! toplevel_bindings_p ()) pop_everything (); ; break;} case 14: ! #line 507 "parse.y" { do_pending_inlines (); ; break;} case 15: ! #line 509 "parse.y" { do_pending_inlines (); ; break;} case 16: ! #line 512 "parse.y" ! { warning ("keyword `export' not implemented, and will be ignored"); ; break;} case 17: ! #line 514 "parse.y" { do_pending_inlines (); ; break;} case 18: ! #line 516 "parse.y" { do_pending_inlines (); ; break;} case 19: ! #line 518 "parse.y" { if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); assemble_asm (yyvsp[-2].ttype); ; break;} case 20: ! #line 521 "parse.y" { pop_lang_context (); ; break;} case 21: ! #line 523 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 22: ! #line 525 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 23: ! #line 527 "parse.y" { push_namespace (yyvsp[-1].ttype); ; break;} case 24: ! #line 529 "parse.y" { pop_namespace (); ; break;} case 25: ! #line 531 "parse.y" { push_namespace (NULL_TREE); ; break;} case 26: ! #line 533 "parse.y" { pop_namespace (); ; break;} case 28: ! #line 536 "parse.y" { do_toplevel_using_decl (yyvsp[-1].ttype); ; break;} case 30: ! #line 539 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} case 31: ! #line 544 "parse.y" { begin_only_namespace_names (); ; break;} case 32: ! #line 546 "parse.y" { end_only_namespace_names (); if (lastiddecl) *************** case 32: *** 4793,4827 **** ; break;} case 33: ! #line 539 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 34: ! #line 541 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 35: ! #line 543 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 36: ! #line 548 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 37: ! #line 550 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, global_namespace, yyvsp[0].ttype); ; break;} case 38: ! #line 552 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 39: ! #line 557 "parse.y" { begin_only_namespace_names (); ; break;} case 40: ! #line 559 "parse.y" { end_only_namespace_names (); /* If no declaration was found, the using-directive is --- 5021,5055 ---- ; break;} case 33: ! #line 556 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 34: ! #line 558 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 35: ! #line 560 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 36: ! #line 565 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 37: ! #line 567 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, global_namespace, yyvsp[0].ttype); ; break;} case 38: ! #line 569 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 39: ! #line 574 "parse.y" { begin_only_namespace_names (); ; break;} case 40: ! #line 576 "parse.y" { end_only_namespace_names (); /* If no declaration was found, the using-directive is *************** case 40: *** 4833,4839 **** ; break;} case 41: ! #line 572 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; --- 5061,5067 ---- ; break;} case 41: ! #line 589 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; *************** case 41: *** 4841,4847 **** ; break;} case 42: ! #line 578 "parse.y" { yyval.ttype = yyvsp[-1].ttype; if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) --- 5069,5075 ---- ; break;} case 42: ! #line 595 "parse.y" { yyval.ttype = yyvsp[-1].ttype; if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) *************** case 42: *** 4850,4939 **** ; break;} case 45: ! #line 589 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 46: ! #line 591 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 47: ! #line 596 "parse.y" { push_lang_context (yyvsp[0].ttype); ; break;} case 48: ! #line 598 "parse.y" { if (current_lang_name != yyvsp[0].ttype) ! cp_error ("use of linkage spec `%D' is different from previous spec `%D'", yyvsp[0].ttype, current_lang_name); pop_lang_context (); push_lang_context (yyvsp[0].ttype); ; break;} case 49: ! #line 605 "parse.y" { begin_template_parm_list (); ; break;} case 50: ! #line 607 "parse.y" { yyval.ttype = end_template_parm_list (yyvsp[-1].ttype); ; break;} case 51: ! #line 612 "parse.y" { begin_specialization(); yyval.ttype = NULL_TREE; ; break;} case 54: ! #line 623 "parse.y" { yyval.ttype = process_template_parm (NULL_TREE, yyvsp[0].ttype); ; break;} case 55: ! #line 625 "parse.y" { yyval.ttype = process_template_parm (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 56: ! #line 630 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 57: ! #line 632 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 58: ! #line 636 "parse.y" { yyval.ttype = finish_template_type_parm (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 59: ! #line 638 "parse.y" { yyval.ttype = finish_template_type_parm (class_type_node, yyvsp[0].ttype); ; break;} case 60: ! #line 643 "parse.y" { yyval.ttype = finish_template_template_parm (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 61: ! #line 655 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 62: ! #line 657 "parse.y" { yyval.ttype = build_tree_list (groktypename (yyvsp[0].ftype.t), yyvsp[-2].ttype); ; break;} case 63: ! #line 659 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} case 64: ! #line 661 "parse.y" { yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-2].ftype.t); ; break;} case 65: ! #line 663 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 66: ! #line 665 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) != TEMPLATE_DECL && TREE_CODE (yyvsp[0].ttype) != TEMPLATE_TEMPLATE_PARM ! && TREE_CODE (yyvsp[0].ttype) != TYPE_DECL) { error ("invalid default template argument"); yyvsp[0].ttype = error_mark_node; --- 5078,5168 ---- ; break;} case 45: ! #line 607 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 46: ! #line 609 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 47: ! #line 614 "parse.y" { push_lang_context (yyvsp[0].ttype); ; break;} case 48: ! #line 616 "parse.y" { if (current_lang_name != yyvsp[0].ttype) ! error ("use of linkage spec `%D' is different from previous spec `%D'", yyvsp[0].ttype, current_lang_name); pop_lang_context (); push_lang_context (yyvsp[0].ttype); ; break;} case 49: ! #line 623 "parse.y" { begin_template_parm_list (); ; break;} case 50: ! #line 625 "parse.y" { yyval.ttype = end_template_parm_list (yyvsp[-1].ttype); ; break;} case 51: ! #line 630 "parse.y" { begin_specialization(); yyval.ttype = NULL_TREE; ; break;} case 54: ! #line 641 "parse.y" { yyval.ttype = process_template_parm (NULL_TREE, yyvsp[0].ttype); ; break;} case 55: ! #line 643 "parse.y" { yyval.ttype = process_template_parm (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 56: ! #line 648 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} case 57: ! #line 650 "parse.y" { yyval.ttype = NULL_TREE; ; break;} case 58: ! #line 655 "parse.y" { yyval.ttype = finish_template_type_parm (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 59: ! #line 657 "parse.y" { yyval.ttype = finish_template_type_parm (class_type_node, yyvsp[0].ttype); ; break;} case 60: ! #line 662 "parse.y" { yyval.ttype = finish_template_template_parm (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 61: ! #line 674 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 62: ! #line 676 "parse.y" { yyval.ttype = build_tree_list (groktypename (yyvsp[0].ftype.t), yyvsp[-2].ttype); ; break;} case 63: ! #line 678 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} case 64: ! #line 680 "parse.y" { yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-2].ftype.t); ; break;} case 65: ! #line 682 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} case 66: ! #line 684 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) != TEMPLATE_DECL && TREE_CODE (yyvsp[0].ttype) != TEMPLATE_TEMPLATE_PARM ! && TREE_CODE (yyvsp[0].ttype) != TYPE_DECL ! && TREE_CODE (yyvsp[0].ttype) != UNBOUND_CLASS_TEMPLATE) { error ("invalid default template argument"); yyvsp[0].ttype = error_mark_node; *************** case 66: *** 4942,4990 **** ; break;} case 67: ! #line 679 "parse.y" { finish_template_decl (yyvsp[-1].ttype); ; break;} case 68: ! #line 681 "parse.y" { finish_template_decl (yyvsp[-1].ttype); ; break;} case 69: ! #line 686 "parse.y" { do_pending_inlines (); ; break;} case 70: ! #line 688 "parse.y" { do_pending_inlines (); ; break;} case 71: ! #line 690 "parse.y" { do_pending_inlines (); ; break;} case 72: ! #line 692 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 73: ! #line 695 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 74: ! #line 698 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} case 76: ! #line 704 "parse.y" {; break;} case 77: ! #line 706 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} case 78: ! #line 708 "parse.y" { if (yyvsp[-1].ftype.t != error_mark_node) { --- 5171,5219 ---- ; break;} case 67: ! #line 699 "parse.y" { finish_template_decl (yyvsp[-1].ttype); ; break;} case 68: ! #line 701 "parse.y" { finish_template_decl (yyvsp[-1].ttype); ; break;} case 69: ! #line 706 "parse.y" { do_pending_inlines (); ; break;} case 70: ! #line 708 "parse.y" { do_pending_inlines (); ; break;} case 71: ! #line 710 "parse.y" { do_pending_inlines (); ; break;} case 72: ! #line 712 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 73: ! #line 715 "parse.y" { do_pending_inlines (); pop_lang_context (); ; break;} case 74: ! #line 718 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} case 76: ! #line 724 "parse.y" {; break;} case 77: ! #line 726 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} case 78: ! #line 728 "parse.y" { if (yyvsp[-1].ftype.t != error_mark_node) { *************** case 78: *** 4994,5012 **** ; break;} case 80: ! #line 720 "parse.y" {; break;} case 81: ! #line 722 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} case 82: ! #line 724 "parse.y" { pedwarn ("empty declaration"); ; break;} case 84: ! #line 727 "parse.y" { tree t, attrs; split_specs_attrs (yyvsp[-1].ftype.t, &t, &attrs); --- 5223,5241 ---- ; break;} case 80: ! #line 740 "parse.y" {; break;} case 81: ! #line 742 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} case 82: ! #line 744 "parse.y" { pedwarn ("empty declaration"); ; break;} case 84: ! #line 747 "parse.y" { tree t, attrs; split_specs_attrs (yyvsp[-1].ftype.t, &t, &attrs); *************** case 84: *** 5014,5139 **** note_list_got_semicolon (yyvsp[-1].ftype.t); ; break;} ! case 89: ! #line 741 "parse.y" ! { yyval.itype = 0; ; ! break;} ! case 90: ! #line 743 "parse.y" ! { yyval.itype = 1; ; ! break;} ! case 96: ! #line 759 "parse.y" ! { expand_body (finish_function ((int)yyvsp[-1].itype)); ; break;} case 97: ! #line 761 "parse.y" ! { expand_body (finish_function ((int)yyvsp[0].itype)); ; break;} case 98: ! #line 763 "parse.y" ! { ; break;} case 99: ! #line 768 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 100: ! #line 770 "parse.y" ! { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 101: ! #line 772 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); ! yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ! ; break;} case 102: ! #line 776 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 103: ! #line 778 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 104: ! #line 780 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 105: ! #line 784 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 106: ! #line 786 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 107: ! #line 788 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 108: ! #line 792 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 109: ! #line 794 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 110: ! #line 796 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 111: ! #line 803 "parse.y" { check_for_new_type ("return type", yyvsp[-1].ftype); if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 112: ! #line 807 "parse.y" { if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 113: ! #line 810 "parse.y" { if (!begin_function_definition (NULL_TREE, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 114: ! #line 813 "parse.y" { if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 115: ! #line 816 "parse.y" { if (!begin_function_definition (NULL_TREE, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 116: ! #line 822 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 117: ! #line 824 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 118: ! #line 826 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 119: ! #line 828 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 120: ! #line 835 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); rest_of_mdef: if (! yyval.ttype) --- 5243,5384 ---- note_list_got_semicolon (yyvsp[-1].ftype.t); ; break;} ! case 87: ! #line 756 "parse.y" ! { end_input (); ; break;} case 97: ! #line 782 "parse.y" ! { yyval.ttype = begin_compound_stmt (/*has_no_scope=*/1); ; break;} case 98: ! #line 784 "parse.y" ! { ! STMT_LINENO (yyvsp[-1].ttype) = yyvsp[-3].itype; ! finish_compound_stmt (/*has_no_scope=*/1, yyvsp[-1].ttype); ! finish_function_body (yyvsp[-5].ttype); ! ; break;} case 99: ! #line 793 "parse.y" ! { expand_body (finish_function (0)); ; break;} case 100: ! #line 795 "parse.y" ! { expand_body (finish_function (0)); ; break;} case 101: ! #line 797 "parse.y" ! { ; break;} case 102: ! #line 802 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 103: ! #line 804 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 104: ! #line 806 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 105: ! #line 810 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 106: ! #line 812 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 107: ! #line 814 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 108: ! #line 818 "parse.y" { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} case 109: ! #line 820 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 110: ! #line 822 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 111: ! #line 826 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-2].ttype, yyvsp[-1].ttype); ; ! break;} ! case 112: ! #line 828 "parse.y" ! { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; ! break;} ! case 113: ! #line 830 "parse.y" ! { yyval.ttype = begin_constructor_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype); ! yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ! ; ! break;} ! case 114: ! #line 837 "parse.y" { check_for_new_type ("return type", yyvsp[-1].ftype); if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 115: ! #line 841 "parse.y" { if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 116: ! #line 844 "parse.y" { if (!begin_function_definition (NULL_TREE, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 117: ! #line 847 "parse.y" { if (!begin_function_definition (yyvsp[-1].ftype.t, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 118: ! #line 850 "parse.y" { if (!begin_function_definition (NULL_TREE, yyvsp[0].ttype)) YYERROR1; ; break;} ! case 119: ! #line 859 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 120: ! #line 862 "parse.y" ! { yyval.ttype = make_call_declarator (yyvsp[-6].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; ! break;} ! case 121: ! #line 864 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 122: ! #line 866 "parse.y" ! { yyval.ttype = make_call_declarator (yyvsp[-4].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; ! break;} ! case 123: ! #line 868 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 124: ! #line 870 "parse.y" { yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 125: ! #line 877 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); rest_of_mdef: if (! yyval.ttype) *************** case 120: *** 5142,5229 **** yychar = YYLEX; snarf_method (yyval.ttype); ; break;} ! case 121: ! #line 843 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 122: ! #line 846 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 123: ! #line 848 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 124: ! #line 850 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 125: ! #line 853 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 126: ! #line 855 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 127: ! #line 861 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 128: ! #line 868 "parse.y" { finish_named_return_value (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 129: ! #line 870 "parse.y" { finish_named_return_value (yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 130: ! #line 872 "parse.y" { finish_named_return_value (yyval.ttype, NULL_TREE); ; break;} ! case 131: ! #line 877 "parse.y" { ! if (yyvsp[0].ftype.new_type_flag == 0) error ("no base or member initializers given following ':'"); finish_mem_initializers (yyvsp[0].ftype.t); ; break;} ! case 132: ! #line 887 "parse.y" { ! if (DECL_CONSTRUCTOR_P (current_function_decl)) ! /* Make a contour for the initializer list. */ ! do_pushlevel (); ! else if (current_class_type == NULL_TREE) ! error ("base initializers not allowed for non-member functions"); ! else if (! DECL_CONSTRUCTOR_P (current_function_decl)) ! error ("only constructors take base initializers"); ; break;} ! case 133: ! #line 900 "parse.y" { yyval.ftype.new_type_flag = 0; yyval.ftype.t = NULL_TREE; ; break;} ! case 134: ! #line 905 "parse.y" { yyval.ftype.new_type_flag = 1; yyval.ftype.t = yyvsp[0].ttype; ; break;} ! case 135: ! #line 910 "parse.y" { if (yyvsp[0].ttype) { --- 5387,5470 ---- yychar = YYLEX; snarf_method (yyval.ttype); ; break;} ! case 126: ! #line 885 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 127: ! #line 888 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 128: ! #line 890 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 129: ! #line 892 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 130: ! #line 895 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, yyvsp[-1].ftype.t, yyvsp[-1].ftype.lookups); goto rest_of_mdef;; break;} ! case 131: ! #line 897 "parse.y" { yyval.ttype = parse_method (yyvsp[0].ttype, NULL_TREE, NULL_TREE); goto rest_of_mdef; ; break;} ! case 132: ! #line 903 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 133: ! #line 910 "parse.y" { finish_named_return_value (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 134: ! #line 912 "parse.y" { finish_named_return_value (yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 135: ! #line 914 "parse.y" { finish_named_return_value (yyval.ttype, NULL_TREE); ; break;} ! case 136: ! #line 919 "parse.y" { ! if (! DECL_CONSTRUCTOR_P (current_function_decl)) ! error ("only constructors take base initializers"); ! else if (yyvsp[0].ftype.new_type_flag == 0) error ("no base or member initializers given following ':'"); finish_mem_initializers (yyvsp[0].ftype.t); ; break;} ! case 137: ! #line 931 "parse.y" { ! yyval.ttype = begin_function_body (); ; break;} ! case 138: ! #line 938 "parse.y" { yyval.ftype.new_type_flag = 0; yyval.ftype.t = NULL_TREE; ; break;} ! case 139: ! #line 943 "parse.y" { yyval.ftype.new_type_flag = 1; yyval.ftype.t = yyvsp[0].ttype; ; break;} ! case 140: ! #line 948 "parse.y" { if (yyvsp[0].ttype) { *************** case 135: *** 5235,5250 **** yyval.ftype = yyvsp[-2].ftype; ; break;} ! case 137: ! #line 925 "parse.y" { if (current_class_name) pedwarn ("anachronistic old style base class initializer"); yyval.ttype = expand_member_init (current_class_ref, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 138: ! #line 931 "parse.y" { if (current_class_name) pedwarn ("anachronistic old style base class initializer"); --- 5476,5491 ---- yyval.ftype = yyvsp[-2].ftype; ; break;} ! case 142: ! #line 963 "parse.y" { if (current_class_name) pedwarn ("anachronistic old style base class initializer"); yyval.ttype = expand_member_init (current_class_ref, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 143: ! #line 969 "parse.y" { if (current_class_name) pedwarn ("anachronistic old style base class initializer"); *************** case 138: *** 5253,5351 **** void_type_node); ; break;} ! case 139: ! #line 939 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 140: ! #line 941 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 141: ! #line 944 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 142: ! #line 946 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 143: ! #line 949 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 144: ! #line 951 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 145: ! #line 954 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 157: ! #line 979 "parse.y" { do_type_instantiation (yyvsp[-1].ftype.t, NULL_TREE, 1); yyungetc (';', 1); ; break;} ! case 159: ! #line 983 "parse.y" { tree specs = strip_attrs (yyvsp[-1].ftype.t); do_decl_instantiation (specs, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 161: ! #line 987 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 163: ! #line 990 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 165: ! #line 993 "parse.y" { do_type_instantiation (yyvsp[-1].ftype.t, yyvsp[-4].ttype, 1); yyungetc (';', 1); ; break;} ! case 167: ! #line 998 "parse.y" { tree specs = strip_attrs (yyvsp[-1].ftype.t); do_decl_instantiation (specs, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 169: ! #line 1002 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-3].ttype); ; break;} ! case 171: ! #line 1005 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-3].ttype); ; break;} ! case 173: ! #line 1010 "parse.y" { begin_explicit_instantiation(); ; break;} ! case 174: ! #line 1013 "parse.y" { end_explicit_instantiation(); ; break;} ! case 175: ! #line 1022 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 176: ! #line 1025 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 179: ! #line 1033 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 180: ! #line 1038 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 181: ! #line 1042 "parse.y" { if (yychar == YYEMPTY) yychar = YYLEX; --- 5494,5592 ---- void_type_node); ; break;} ! case 144: ! #line 977 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 145: ! #line 979 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 146: ! #line 982 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 147: ! #line 984 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 148: ! #line 987 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 149: ! #line 989 "parse.y" { yyval.ttype = expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; break;} ! case 150: ! #line 992 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 162: ! #line 1017 "parse.y" { do_type_instantiation (yyvsp[-1].ftype.t, NULL_TREE, 1); yyungetc (';', 1); ; break;} ! case 164: ! #line 1021 "parse.y" { tree specs = strip_attrs (yyvsp[-1].ftype.t); do_decl_instantiation (specs, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 166: ! #line 1025 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 168: ! #line 1028 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 170: ! #line 1031 "parse.y" { do_type_instantiation (yyvsp[-1].ftype.t, yyvsp[-4].ttype, 1); yyungetc (';', 1); ; break;} ! case 172: ! #line 1036 "parse.y" { tree specs = strip_attrs (yyvsp[-1].ftype.t); do_decl_instantiation (specs, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 174: ! #line 1040 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-3].ttype); ; break;} ! case 176: ! #line 1043 "parse.y" { do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-3].ttype); ; break;} ! case 178: ! #line 1048 "parse.y" { begin_explicit_instantiation(); ; break;} ! case 179: ! #line 1052 "parse.y" { end_explicit_instantiation(); ; break;} ! case 180: ! #line 1062 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 181: ! #line 1065 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 184: ! #line 1073 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 185: ! #line 1079 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 186: ! #line 1083 "parse.y" { if (yychar == YYEMPTY) yychar = YYLEX; *************** case 181: *** 5354,5652 **** yychar == SCOPE); ; break;} ! case 183: ! #line 1053 "parse.y" { /* Handle `Class>' without space in the `>>' */ pedwarn ("`>>' should be `> >' in template class name"); yyungetc ('>', 1); ; break;} ! case 184: ! #line 1062 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 186: ! #line 1068 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 187: ! #line 1070 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 188: ! #line 1075 "parse.y" { yyval.ttype = groktypename (yyvsp[0].ftype.t); ; break;} ! case 189: ! #line 1077 "parse.y" { yyval.ttype = lastiddecl; if (DECL_TEMPLATE_TEMPLATE_PARM_P (yyval.ttype)) yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 190: ! #line 1083 "parse.y" { yyval.ttype = lastiddecl; if (DECL_TEMPLATE_TEMPLATE_PARM_P (yyval.ttype)) yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 192: ! #line 1093 "parse.y" { yyval.code = NEGATE_EXPR; ; break;} ! case 193: ! #line 1095 "parse.y" { yyval.code = CONVERT_EXPR; ; break;} ! case 194: ! #line 1097 "parse.y" { yyval.code = PREINCREMENT_EXPR; ; break;} ! case 195: ! #line 1099 "parse.y" { yyval.code = PREDECREMENT_EXPR; ; break;} ! case 196: ! #line 1101 "parse.y" { yyval.code = TRUTH_NOT_EXPR; ; break;} ! case 197: ! #line 1106 "parse.y" { yyval.ttype = build_x_compound_expr (yyval.ttype); ; break;} ! case 199: ! #line 1112 "parse.y" { error ("ISO C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} ! case 200: ! #line 1116 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 201: ! #line 1121 "parse.y" { error ("ISO C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} ! case 202: ! #line 1125 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 203: ! #line 1130 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 205: ! #line 1133 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 206: ! #line 1138 "parse.y" { { tree d; for (d = getdecls (); d; d = TREE_CHAIN (d)) if (TREE_CODE (d) == TYPE_DECL) { tree s = TREE_TYPE (d); if (TREE_CODE (s) == RECORD_TYPE) ! cp_error ("definition of class `%T' in condition", s); else if (TREE_CODE (s) == ENUMERAL_TYPE) ! cp_error ("definition of enum `%T' in condition", s); } } current_declspecs = yyvsp[-4].ftype.t; yyval.ttype = parse_decl (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 207: ! #line 1153 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); yyval.ttype = convert_from_reference (yyvsp[-1].ttype); if (TREE_CODE (TREE_TYPE (yyval.ttype)) == ARRAY_TYPE) ! cp_error ("definition of array `%#D' in condition", yyval.ttype); ; break;} ! case 213: ! #line 1171 "parse.y" ! { yyval.ttype = begin_compound_stmt (1); ; ! break;} ! case 214: ! #line 1173 "parse.y" ! { STMT_LINENO (yyvsp[-1].ttype) = yyvsp[-3].itype; ! finish_compound_stmt (1, yyvsp[-1].ttype); ; ! break;} ! case 215: ! #line 1176 "parse.y" ! { if (yyvsp[0].ttype) STMT_LINENO (yyvsp[0].ttype) = yyvsp[-1].itype; ; ! break;} ! case 216: ! #line 1181 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 217: ! #line 1184 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} ! case 218: ! #line 1187 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 219: ! #line 1189 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} ! case 220: ! #line 1194 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 222: ! #line 1200 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 223: ! #line 1203 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-1].itype; ; break;} ! case 224: ! #line 1206 "parse.y" { yyval.ttype = build_x_indirect_ref (yyvsp[0].ttype, "unary *"); ; break;} ! case 225: ! #line 1208 "parse.y" { yyval.ttype = build_x_unary_op (ADDR_EXPR, yyvsp[0].ttype); ; break;} ! case 226: ! #line 1210 "parse.y" { yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 227: ! #line 1212 "parse.y" { yyval.ttype = finish_unary_op_expr (yyvsp[-1].code, yyvsp[0].ttype); ; break;} ! case 228: ! #line 1215 "parse.y" ! { if (pedantic) ! pedwarn ("ISO C++ forbids `&&'"); ! yyval.ttype = finish_label_address_expr (yyvsp[0].ttype); ; break;} ! case 229: ! #line 1219 "parse.y" ! { yyval.ttype = expr_sizeof (yyvsp[0].ttype); ; break;} ! case 230: ! #line 1221 "parse.y" ! { yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("sizeof", yyvsp[-1].ftype); ; break;} ! case 231: ! #line 1224 "parse.y" ! { yyval.ttype = grok_alignof (yyvsp[0].ttype); ; break;} ! case 232: ! #line 1226 "parse.y" ! { yyval.ttype = c_alignof (groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("alignof", yyvsp[-1].ftype); ; break;} ! case 233: ! #line 1232 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-1].itype); check_for_new_type ("new", yyvsp[0].ftype); ; break;} ! case 234: ! #line 1235 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-2].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 235: ! #line 1238 "parse.y" { yyval.ttype = build_new (yyvsp[-1].ttype, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-2].itype); check_for_new_type ("new", yyvsp[0].ftype); ; break;} ! case 236: ! #line 1241 "parse.y" { yyval.ttype = build_new (yyvsp[-2].ttype, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-3].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 237: ! #line 1245 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-1].ftype.t), NULL_TREE, yyvsp[-3].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 238: ! #line 1249 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-4].itype); check_for_new_type ("new", yyvsp[-2].ftype); ; break;} ! case 239: ! #line 1252 "parse.y" { yyval.ttype = build_new (yyvsp[-3].ttype, groktypename(yyvsp[-1].ftype.t), NULL_TREE, yyvsp[-4].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 240: ! #line 1255 "parse.y" { yyval.ttype = build_new (yyvsp[-4].ttype, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-5].itype); check_for_new_type ("new", yyvsp[-2].ftype); ; break;} ! case 241: ! #line 1259 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 0, yyvsp[-1].itype); ; break;} ! case 242: ! #line 1261 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 1, yyvsp[-3].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} ! case 243: ! #line 1265 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, yyvsp[-2].ttype, 2, yyvsp[-4].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} ! case 244: ! #line 1269 "parse.y" { yyval.ttype = build_x_unary_op (REALPART_EXPR, yyvsp[0].ttype); ; break;} ! case 245: ! #line 1271 "parse.y" { yyval.ttype = build_x_unary_op (IMAGPART_EXPR, yyvsp[0].ttype); ; break;} ! case 246: ! #line 1276 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 247: ! #line 1278 "parse.y" ! { cp_pedwarn ("old style placement syntax, use () instead"); yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 248: ! #line 1284 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 249: ! #line 1286 "parse.y" { yyval.ttype = void_zero_node; ; break;} ! case 250: ! #line 1288 "parse.y" { ! cp_error ("`%T' is not a valid expression", yyvsp[-1].ftype.t); yyval.ttype = error_mark_node; ; break;} ! case 251: ! #line 1298 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids initialization of new expression with `='"); --- 5595,5890 ---- yychar == SCOPE); ; break;} ! case 188: ! #line 1095 "parse.y" { /* Handle `Class>' without space in the `>>' */ pedwarn ("`>>' should be `> >' in template class name"); yyungetc ('>', 1); ; break;} ! case 189: ! #line 1104 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 191: ! #line 1110 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 192: ! #line 1112 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 193: ! #line 1117 "parse.y" { yyval.ttype = groktypename (yyvsp[0].ftype.t); ; break;} ! case 194: ! #line 1119 "parse.y" { yyval.ttype = lastiddecl; if (DECL_TEMPLATE_TEMPLATE_PARM_P (yyval.ttype)) yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 195: ! #line 1125 "parse.y" { yyval.ttype = lastiddecl; if (DECL_TEMPLATE_TEMPLATE_PARM_P (yyval.ttype)) yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 197: ! #line 1132 "parse.y" ! { ! if (!processing_template_decl) ! { ! error ("use of template qualifier outside template"); ! yyval.ttype = error_mark_node; ! } ! else ! yyval.ttype = make_unbound_class_template (yyvsp[-2].ttype, yyvsp[0].ttype, 1); ! ; ! break;} ! case 198: ! #line 1145 "parse.y" { yyval.code = NEGATE_EXPR; ; break;} ! case 199: ! #line 1147 "parse.y" { yyval.code = CONVERT_EXPR; ; break;} ! case 200: ! #line 1149 "parse.y" { yyval.code = PREINCREMENT_EXPR; ; break;} ! case 201: ! #line 1151 "parse.y" { yyval.code = PREDECREMENT_EXPR; ; break;} ! case 202: ! #line 1153 "parse.y" { yyval.code = TRUTH_NOT_EXPR; ; break;} ! case 203: ! #line 1158 "parse.y" { yyval.ttype = build_x_compound_expr (yyval.ttype); ; break;} ! case 205: ! #line 1164 "parse.y" { error ("ISO C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} ! case 206: ! #line 1168 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 207: ! #line 1173 "parse.y" { error ("ISO C++ forbids an empty condition for `%s'", cond_stmt_keyword); yyval.ttype = integer_zero_node; ; break;} ! case 208: ! #line 1177 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 209: ! #line 1182 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 211: ! #line 1185 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 212: ! #line 1190 "parse.y" { { tree d; for (d = getdecls (); d; d = TREE_CHAIN (d)) if (TREE_CODE (d) == TYPE_DECL) { tree s = TREE_TYPE (d); if (TREE_CODE (s) == RECORD_TYPE) ! error ("definition of class `%T' in condition", s); else if (TREE_CODE (s) == ENUMERAL_TYPE) ! error ("definition of enum `%T' in condition", s); } } current_declspecs = yyvsp[-4].ftype.t; yyval.ttype = parse_decl (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 213: ! #line 1205 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].ttype); yyval.ttype = convert_from_reference (yyvsp[-1].ttype); if (TREE_CODE (TREE_TYPE (yyval.ttype)) == ARRAY_TYPE) ! error ("definition of array `%#D' in condition", yyval.ttype); ; break;} ! case 219: ! #line 1223 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 220: ! #line 1226 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} ! case 221: ! #line 1229 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 222: ! #line 1231 "parse.y" { chainon (yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; break;} ! case 223: ! #line 1236 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 225: ! #line 1242 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 226: ! #line 1245 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-1].itype; ; break;} ! case 227: ! #line 1248 "parse.y" { yyval.ttype = build_x_indirect_ref (yyvsp[0].ttype, "unary *"); ; break;} ! case 228: ! #line 1250 "parse.y" { yyval.ttype = build_x_unary_op (ADDR_EXPR, yyvsp[0].ttype); ; break;} ! case 229: ! #line 1252 "parse.y" { yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 230: ! #line 1254 "parse.y" { yyval.ttype = finish_unary_op_expr (yyvsp[-1].code, yyvsp[0].ttype); ; break;} ! case 231: ! #line 1257 "parse.y" ! { yyval.ttype = finish_label_address_expr (yyvsp[0].ttype); ; break;} ! case 232: ! #line 1259 "parse.y" ! { yyval.ttype = finish_sizeof (yyvsp[0].ttype); ; break;} ! case 233: ! #line 1261 "parse.y" ! { yyval.ttype = finish_sizeof (groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("sizeof", yyvsp[-1].ftype); ; break;} ! case 234: ! #line 1264 "parse.y" ! { yyval.ttype = finish_alignof (yyvsp[0].ttype); ; break;} ! case 235: ! #line 1266 "parse.y" ! { yyval.ttype = finish_alignof (groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("alignof", yyvsp[-1].ftype); ; break;} ! case 236: ! #line 1272 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-1].itype); check_for_new_type ("new", yyvsp[0].ftype); ; break;} ! case 237: ! #line 1275 "parse.y" { yyval.ttype = build_new (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-2].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 238: ! #line 1278 "parse.y" { yyval.ttype = build_new (yyvsp[-1].ttype, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-2].itype); check_for_new_type ("new", yyvsp[0].ftype); ; break;} ! case 239: ! #line 1281 "parse.y" { yyval.ttype = build_new (yyvsp[-2].ttype, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-3].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 240: ! #line 1285 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-1].ftype.t), NULL_TREE, yyvsp[-3].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 241: ! #line 1289 "parse.y" { yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-4].itype); check_for_new_type ("new", yyvsp[-2].ftype); ; break;} ! case 242: ! #line 1292 "parse.y" { yyval.ttype = build_new (yyvsp[-3].ttype, groktypename(yyvsp[-1].ftype.t), NULL_TREE, yyvsp[-4].itype); check_for_new_type ("new", yyvsp[-1].ftype); ; break;} ! case 243: ! #line 1295 "parse.y" { yyval.ttype = build_new (yyvsp[-4].ttype, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-5].itype); check_for_new_type ("new", yyvsp[-2].ftype); ; break;} ! case 244: ! #line 1299 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 0, yyvsp[-1].itype); ; break;} ! case 245: ! #line 1301 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 1, yyvsp[-3].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} ! case 246: ! #line 1305 "parse.y" { yyval.ttype = delete_sanity (yyvsp[0].ttype, yyvsp[-2].ttype, 2, yyvsp[-4].itype); if (yychar == YYEMPTY) yychar = YYLEX; ; break;} ! case 247: ! #line 1309 "parse.y" { yyval.ttype = build_x_unary_op (REALPART_EXPR, yyvsp[0].ttype); ; break;} ! case 248: ! #line 1311 "parse.y" { yyval.ttype = build_x_unary_op (IMAGPART_EXPR, yyvsp[0].ttype); ; break;} ! case 249: ! #line 1316 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 250: ! #line 1318 "parse.y" ! { pedwarn ("old style placement syntax, use () instead"); yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 251: ! #line 1324 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 252: ! #line 1326 "parse.y" { yyval.ttype = void_zero_node; ; break;} ! case 253: ! #line 1328 "parse.y" { ! error ("`%T' is not a valid expression", yyvsp[-1].ftype.t); yyval.ttype = error_mark_node; ; break;} ! case 254: ! #line 1338 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids initialization of new expression with `='"); *************** case 251: *** 5658,5681 **** yyval.ttype = yyvsp[0].ttype; ; break;} ! case 252: ! #line 1313 "parse.y" { yyvsp[-1].ftype.t = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 0); yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); check_for_new_type ("cast", yyvsp[-1].ftype); ; break;} ! case 253: ! #line 1317 "parse.y" { yyvsp[-1].ftype.t = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 0); yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); check_for_new_type ("cast", yyvsp[-1].ftype); ; break;} ! case 255: ! #line 1325 "parse.y" { yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 256: ! #line 1327 "parse.y" { tree init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); --- 5896,5919 ---- yyval.ttype = yyvsp[0].ttype; ; break;} ! case 255: ! #line 1353 "parse.y" { yyvsp[-1].ftype.t = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 0); yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); check_for_new_type ("cast", yyvsp[-1].ftype); ; break;} ! case 256: ! #line 1357 "parse.y" { yyvsp[-1].ftype.t = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 0); yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); check_for_new_type ("cast", yyvsp[-1].ftype); ; break;} ! case 258: ! #line 1365 "parse.y" { yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 259: ! #line 1367 "parse.y" { tree init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); *************** case 256: *** 5687,5894 **** yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, init); ; break;} - case 258: - #line 1343 "parse.y" - { yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; - break;} - case 259: - #line 1345 "parse.y" - { yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; - break;} - case 260: - #line 1347 "parse.y" - { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} case 261: ! #line 1349 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 262: ! #line 1351 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 263: ! #line 1353 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 264: ! #line 1355 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 265: ! #line 1357 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 266: ! #line 1359 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 267: ! #line 1361 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 268: ! #line 1363 "parse.y" ! { yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 269: ! #line 1365 "parse.y" ! { yyval.ttype = build_x_binary_op (GT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 270: ! #line 1367 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 271: ! #line 1369 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 272: ! #line 1371 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 273: ! #line 1373 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 274: ! #line 1375 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 275: ! #line 1377 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 276: ! #line 1379 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 277: ! #line 1381 "parse.y" ! { yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 278: ! #line 1383 "parse.y" ! { yyval.ttype = build_x_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); ! if (yyval.ttype != error_mark_node) ! C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; break;} case 279: ! #line 1387 "parse.y" ! { yyval.ttype = build_x_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; break;} case 280: ! #line 1389 "parse.y" ! { yyval.ttype = build_throw (NULL_TREE); ; break;} case 281: ! #line 1391 "parse.y" ! { yyval.ttype = build_throw (yyvsp[0].ttype); ; break;} case 283: ! #line 1398 "parse.y" ! { yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 284: ! #line 1400 "parse.y" ! { yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; ! break;} ! case 285: ! #line 1402 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 286: ! #line 1404 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 287: ! #line 1406 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 288: ! #line 1408 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 289: ! #line 1410 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 290: ! #line 1412 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 291: ! #line 1414 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 292: ! #line 1416 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 293: ! #line 1418 "parse.y" ! { yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 294: ! #line 1420 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 295: ! #line 1422 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 296: ! #line 1424 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 297: ! #line 1426 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 298: ! #line 1428 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 299: ! #line 1430 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 300: ! #line 1432 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 301: ! #line 1434 "parse.y" ! { yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 302: ! #line 1436 "parse.y" { yyval.ttype = build_x_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); if (yyval.ttype != error_mark_node) C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; break;} ! case 303: ! #line 1440 "parse.y" { yyval.ttype = build_x_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; break;} ! case 304: ! #line 1442 "parse.y" { yyval.ttype = build_throw (NULL_TREE); ; break;} ! case 305: ! #line 1444 "parse.y" { yyval.ttype = build_throw (yyvsp[0].ttype); ; break;} ! case 306: ! #line 1449 "parse.y" { yyval.ttype = build_nt (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 307: ! #line 1451 "parse.y" { yyval.ttype = build_nt (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 313: ! #line 1460 "parse.y" { /* If lastiddecl is a TREE_LIST, it's a baselink, which means that we're in an expression like S::f, so --- 5925,6132 ---- yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, init); ; break;} case 261: ! #line 1383 "parse.y" ! { yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 262: ! #line 1385 "parse.y" ! { yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; break;} case 263: ! #line 1387 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 264: ! #line 1389 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 265: ! #line 1391 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 266: ! #line 1393 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 267: ! #line 1395 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 268: ! #line 1397 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 269: ! #line 1399 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 270: ! #line 1401 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 271: ! #line 1403 "parse.y" ! { yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 272: ! #line 1405 "parse.y" ! { yyval.ttype = build_x_binary_op (GT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 273: ! #line 1407 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 274: ! #line 1409 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 275: ! #line 1411 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 276: ! #line 1413 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 277: ! #line 1415 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 278: ! #line 1417 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 279: ! #line 1419 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 280: ! #line 1421 "parse.y" ! { yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} case 281: ! #line 1423 "parse.y" ! { yyval.ttype = build_x_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); ! if (yyval.ttype != error_mark_node) ! C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; ! break;} ! case 282: ! #line 1427 "parse.y" ! { yyval.ttype = build_x_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; break;} case 283: ! #line 1429 "parse.y" ! { yyval.ttype = build_throw (NULL_TREE); ; break;} case 284: ! #line 1431 "parse.y" ! { yyval.ttype = build_throw (yyvsp[0].ttype); ; break;} case 286: ! #line 1438 "parse.y" ! { yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; break;} case 287: ! #line 1440 "parse.y" ! { yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; break;} case 288: ! #line 1442 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 289: ! #line 1444 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 290: ! #line 1446 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 291: ! #line 1448 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 292: ! #line 1450 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 293: ! #line 1452 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 294: ! #line 1454 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 295: ! #line 1456 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 296: ! #line 1458 "parse.y" ! { yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; break;} case 297: ! #line 1460 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 298: ! #line 1462 "parse.y" { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 299: ! #line 1464 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 300: ! #line 1466 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 301: ! #line 1468 "parse.y" ! { yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; break;} case 302: ! #line 1470 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; ! break;} ! case 303: ! #line 1472 "parse.y" ! { yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; ! break;} ! case 304: ! #line 1474 "parse.y" ! { yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; ! break;} ! case 305: ! #line 1476 "parse.y" { yyval.ttype = build_x_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); if (yyval.ttype != error_mark_node) C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; break;} ! case 306: ! #line 1480 "parse.y" { yyval.ttype = build_x_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; break;} ! case 307: ! #line 1482 "parse.y" { yyval.ttype = build_throw (NULL_TREE); ; break;} ! case 308: ! #line 1484 "parse.y" { yyval.ttype = build_throw (yyvsp[0].ttype); ; break;} ! case 309: ! #line 1489 "parse.y" { yyval.ttype = build_nt (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 310: ! #line 1491 "parse.y" { yyval.ttype = build_nt (BIT_NOT_EXPR, yyvsp[0].ttype); ; break;} ! case 316: ! #line 1500 "parse.y" { /* If lastiddecl is a TREE_LIST, it's a baselink, which means that we're in an expression like S::f, so *************** case 313: *** 5900,5959 **** yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 314: ! #line 1473 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 315: ! #line 1475 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 316: ! #line 1480 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 317: ! #line 1482 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 318: ! #line 1485 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 323: ! #line 1497 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 325: ! #line 1507 "parse.y" { yyval.ttype = build_nt (INDIRECT_REF, yyvsp[0].ttype); ; break;} ! case 326: ! #line 1509 "parse.y" { yyval.ttype = build_nt (ADDR_EXPR, yyvsp[0].ttype); ; break;} ! case 327: ! #line 1511 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 328: ! #line 1516 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 329: ! #line 1518 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 333: ! #line 1528 "parse.y" { yyval.ttype = finish_decl_parsing (yyvsp[-1].ttype); ; break;} ! case 334: ! #line 1533 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == BIT_NOT_EXPR) yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (yyvsp[0].ttype, 0)); --- 6138,6197 ---- yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 317: ! #line 1514 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 318: ! #line 1516 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 319: ! #line 1521 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 320: ! #line 1523 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 321: ! #line 1526 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 326: ! #line 1538 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 328: ! #line 1548 "parse.y" { yyval.ttype = build_nt (INDIRECT_REF, yyvsp[0].ttype); ; break;} ! case 329: ! #line 1550 "parse.y" { yyval.ttype = build_nt (ADDR_EXPR, yyvsp[0].ttype); ; break;} ! case 330: ! #line 1552 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 331: ! #line 1557 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 332: ! #line 1559 "parse.y" { yyval.ttype = lookup_template_function (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 336: ! #line 1569 "parse.y" { yyval.ttype = finish_decl_parsing (yyvsp[-1].ttype); ; break;} ! case 337: ! #line 1574 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == BIT_NOT_EXPR) yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (yyvsp[0].ttype, 0)); *************** case 334: *** 5961,5968 **** yyval.ttype = finish_id_expr (yyvsp[0].ttype); ; break;} ! case 337: ! #line 1542 "parse.y" { yyval.ttype = combine_strings (yyval.ttype); /* combine_strings doesn't set up TYPE_MAIN_VARIANT of --- 6199,6206 ---- yyval.ttype = finish_id_expr (yyvsp[0].ttype); ; break;} ! case 340: ! #line 1583 "parse.y" { yyval.ttype = combine_strings (yyval.ttype); /* combine_strings doesn't set up TYPE_MAIN_VARIANT of *************** case 337: *** 5973,5993 **** TYPE_DOMAIN (TREE_TYPE (yyval.ttype))); ; break;} ! case 338: ! #line 1552 "parse.y" { yyval.ttype = finish_parenthesized_expr (yyvsp[-1].ttype); ; break;} ! case 339: ! #line 1554 "parse.y" { yyvsp[-1].ttype = reparse_decl_as_expr (NULL_TREE, yyvsp[-1].ttype); yyval.ttype = finish_parenthesized_expr (yyvsp[-1].ttype); ; break;} ! case 340: ! #line 1557 "parse.y" { yyval.ttype = error_mark_node; ; break;} ! case 341: ! #line 1559 "parse.y" { tree scope = current_scope (); if (!scope || TREE_CODE (scope) != FUNCTION_DECL) { --- 6211,6239 ---- TYPE_DOMAIN (TREE_TYPE (yyval.ttype))); ; break;} ! case 341: ! #line 1593 "parse.y" ! { ! yyval.ttype = fname_decl (C_RID_CODE (yyval.ttype), yyval.ttype); ! if (processing_template_decl) ! yyval.ttype = build_min_nt (LOOKUP_EXPR, DECL_NAME (yyval.ttype)); ! ; ! break;} ! case 342: ! #line 1599 "parse.y" { yyval.ttype = finish_parenthesized_expr (yyvsp[-1].ttype); ; break;} ! case 343: ! #line 1601 "parse.y" { yyvsp[-1].ttype = reparse_decl_as_expr (NULL_TREE, yyvsp[-1].ttype); yyval.ttype = finish_parenthesized_expr (yyvsp[-1].ttype); ; break;} ! case 344: ! #line 1604 "parse.y" { yyval.ttype = error_mark_node; ; break;} ! case 345: ! #line 1606 "parse.y" { tree scope = current_scope (); if (!scope || TREE_CODE (scope) != FUNCTION_DECL) { *************** case 341: *** 5999,6047 **** yyval.ttype = begin_stmt_expr (); ; break;} ! case 342: ! #line 1570 "parse.y" { yyval.ttype = finish_stmt_expr (yyvsp[-2].ttype); ; break;} ! case 343: ! #line 1575 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 344: ! #line 1577 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-1].ttype, NULL_TREE, 1); ; break;} ! case 345: ! #line 1579 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype, 0); ; break;} ! case 346: ! #line 1581 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-1].ttype, NULL_TREE, 0); ; break;} ! case 347: ! #line 1583 "parse.y" { yyval.ttype = build_x_va_arg (yyvsp[-3].ttype, groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("__builtin_va_arg", yyvsp[-1].ftype); ; break;} ! case 348: ! #line 1586 "parse.y" { yyval.ttype = grok_array_decl (yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 349: ! #line 1588 "parse.y" { yyval.ttype = finish_increment_expr (yyvsp[-1].ttype, POSTINCREMENT_EXPR); ; break;} ! case 350: ! #line 1590 "parse.y" { yyval.ttype = finish_increment_expr (yyvsp[-1].ttype, POSTDECREMENT_EXPR); ; break;} ! case 351: ! #line 1593 "parse.y" { yyval.ttype = finish_this_expr (); ; break;} ! case 352: ! #line 1595 "parse.y" { /* This is a C cast in C++'s `functional' notation using the "implicit int" extension so that: --- 6245,6293 ---- yyval.ttype = begin_stmt_expr (); ; break;} ! case 346: ! #line 1617 "parse.y" { yyval.ttype = finish_stmt_expr (yyvsp[-2].ttype); ; break;} ! case 347: ! #line 1622 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 348: ! #line 1624 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-1].ttype, NULL_TREE, 1); ; break;} ! case 349: ! #line 1626 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype, 0); ; break;} ! case 350: ! #line 1628 "parse.y" { yyval.ttype = finish_call_expr (yyvsp[-1].ttype, NULL_TREE, 0); ; break;} ! case 351: ! #line 1630 "parse.y" { yyval.ttype = build_x_va_arg (yyvsp[-3].ttype, groktypename (yyvsp[-1].ftype.t)); check_for_new_type ("__builtin_va_arg", yyvsp[-1].ftype); ; break;} ! case 352: ! #line 1633 "parse.y" { yyval.ttype = grok_array_decl (yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 353: ! #line 1635 "parse.y" { yyval.ttype = finish_increment_expr (yyvsp[-1].ttype, POSTINCREMENT_EXPR); ; break;} ! case 354: ! #line 1637 "parse.y" { yyval.ttype = finish_increment_expr (yyvsp[-1].ttype, POSTDECREMENT_EXPR); ; break;} ! case 355: ! #line 1640 "parse.y" { yyval.ttype = finish_this_expr (); ; break;} ! case 356: ! #line 1642 "parse.y" { /* This is a C cast in C++'s `functional' notation using the "implicit int" extension so that: *************** case 352: *** 6053,6102 **** yyval.ttype = build_functional_cast (type, yyvsp[-1].ttype); ; break;} ! case 354: ! #line 1607 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("dynamic_cast", yyvsp[-4].ftype); yyval.ttype = build_dynamic_cast (type, yyvsp[-1].ttype); ; break;} ! case 355: ! #line 1611 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("static_cast", yyvsp[-4].ftype); yyval.ttype = build_static_cast (type, yyvsp[-1].ttype); ; break;} ! case 356: ! #line 1615 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("reinterpret_cast", yyvsp[-4].ftype); yyval.ttype = build_reinterpret_cast (type, yyvsp[-1].ttype); ; break;} ! case 357: ! #line 1619 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("const_cast", yyvsp[-4].ftype); yyval.ttype = build_const_cast (type, yyvsp[-1].ttype); ; break;} ! case 358: ! #line 1623 "parse.y" { yyval.ttype = build_typeid (yyvsp[-1].ttype); ; break;} ! case 359: ! #line 1625 "parse.y" { tree type = groktypename (yyvsp[-1].ftype.t); check_for_new_type ("typeid", yyvsp[-1].ftype); ! yyval.ttype = get_typeid (TYPE_MAIN_VARIANT (type)); ; break;} ! case 360: ! #line 1629 "parse.y" { yyval.ttype = do_scoped_id (yyvsp[0].ttype, 1); ; break;} ! case 361: ! #line 1631 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 362: ! #line 1633 "parse.y" { got_scope = NULL_TREE; if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) --- 6299,6348 ---- yyval.ttype = build_functional_cast (type, yyvsp[-1].ttype); ; break;} ! case 358: ! #line 1654 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("dynamic_cast", yyvsp[-4].ftype); yyval.ttype = build_dynamic_cast (type, yyvsp[-1].ttype); ; break;} ! case 359: ! #line 1658 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("static_cast", yyvsp[-4].ftype); yyval.ttype = build_static_cast (type, yyvsp[-1].ttype); ; break;} ! case 360: ! #line 1662 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("reinterpret_cast", yyvsp[-4].ftype); yyval.ttype = build_reinterpret_cast (type, yyvsp[-1].ttype); ; break;} ! case 361: ! #line 1666 "parse.y" { tree type = groktypename (yyvsp[-4].ftype.t); check_for_new_type ("const_cast", yyvsp[-4].ftype); yyval.ttype = build_const_cast (type, yyvsp[-1].ttype); ; break;} ! case 362: ! #line 1670 "parse.y" { yyval.ttype = build_typeid (yyvsp[-1].ttype); ; break;} ! case 363: ! #line 1672 "parse.y" { tree type = groktypename (yyvsp[-1].ftype.t); check_for_new_type ("typeid", yyvsp[-1].ftype); ! yyval.ttype = get_typeid (type); ; break;} ! case 364: ! #line 1676 "parse.y" { yyval.ttype = do_scoped_id (yyvsp[0].ttype, 1); ; break;} ! case 365: ! #line 1678 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 366: ! #line 1680 "parse.y" { got_scope = NULL_TREE; if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) *************** case 362: *** 6105,6375 **** yyval.ttype = yyvsp[0].ttype; ; break;} ! case 363: ! #line 1641 "parse.y" { yyval.ttype = build_offset_ref (OP0 (yyval.ttype), OP1 (yyval.ttype)); ; break;} ! case 364: ! #line 1643 "parse.y" { yyval.ttype = finish_qualified_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 365: ! #line 1645 "parse.y" { yyval.ttype = finish_qualified_call_expr (yyvsp[-1].ttype, NULL_TREE); ; break;} ! case 366: ! #line 1647 "parse.y" { yyval.ttype = build_x_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; break;} ! case 367: ! #line 1651 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 368: ! #line 1653 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 369: ! #line 1655 "parse.y" { yyval.ttype = build_x_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; break;} ! case 370: ! #line 1657 "parse.y" { if (processing_template_decl) yyval.ttype = build_min_nt (COMPONENT_REF, yyvsp[-1].ttype, yyvsp[0].ttype); else yyval.ttype = build_object_ref (yyval.ttype, OP0 (yyvsp[0].ttype), OP1 (yyvsp[0].ttype)); ; break;} ! case 371: ! #line 1662 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 372: ! #line 1664 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 373: ! #line 1666 "parse.y" { yyval.ttype = finish_qualified_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 374: ! #line 1668 "parse.y" { yyval.ttype = finish_qualified_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 375: ! #line 1671 "parse.y" { yyval.ttype = finish_pseudo_destructor_call_expr (yyvsp[-3].ttype, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 376: ! #line 1673 "parse.y" { yyval.ttype = finish_pseudo_destructor_call_expr (yyvsp[-5].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 377: ! #line 1675 "parse.y" { yyval.ttype = error_mark_node; ; break;} ! case 378: ! #line 1720 "parse.y" { yyval.itype = 0; ; break;} ! case 379: ! #line 1722 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} ! case 380: ! #line 1727 "parse.y" { yyval.itype = 0; ; break;} ! case 381: ! #line 1729 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} ! case 382: ! #line 1734 "parse.y" { yyval.ttype = boolean_true_node; ; break;} ! case 383: ! #line 1736 "parse.y" { yyval.ttype = boolean_false_node; ; break;} ! case 385: ! #line 1743 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 386: ! #line 1748 "parse.y" { ! setup_vtbl_ptr (NULL_TREE, NULL_TREE); ; break;} ! case 387: ! #line 1755 "parse.y" { got_object = TREE_TYPE (yyval.ttype); ; break;} ! case 388: ! #line 1757 "parse.y" { yyval.ttype = build_x_arrow (yyval.ttype); got_object = TREE_TYPE (yyval.ttype); ; break;} ! case 389: ! #line 1765 "parse.y" { if (yyvsp[-2].ftype.t && IS_AGGR_TYPE_CODE (TREE_CODE (yyvsp[-2].ftype.t))) note_got_semicolon (yyvsp[-2].ftype.t); ; break;} ! case 390: ! #line 1770 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} ! case 391: ! #line 1774 "parse.y" {; break;} ! case 392: ! #line 1776 "parse.y" { shadow_tag (yyvsp[-1].ftype.t); note_list_got_semicolon (yyvsp[-1].ftype.t); ; break;} ! case 393: ! #line 1781 "parse.y" { warning ("empty declaration"); ; break;} ! case 394: ! #line 1783 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} ! case 397: ! #line 1797 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, empty_parms (), NULL_TREE, NULL_TREE); ; break;} ! case 398: ! #line 1800 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), NULL_TREE, NULL_TREE); ; break;} ! case 399: ! #line 1807 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 400: ! #line 1810 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 401: ! #line 1813 "parse.y" { yyval.ftype.t = build_tree_list (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 402: ! #line 1817 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 403: ! #line 1820 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 404: ! #line 1831 "parse.y" { yyval.ftype.lookups = type_lookups; ; break;} ! case 405: ! #line 1833 "parse.y" { yyval.ftype.lookups = type_lookups; ; break;} ! case 406: ! #line 1838 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 407: ! #line 1841 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 408: ! #line 1844 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-2].ftype.t, chainon (yyvsp[-1].ttype, yyvsp[0].ttype)); yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; break;} ! case 409: ! #line 1847 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 410: ! #line 1850 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 411: ! #line 1853 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-2].ftype.t, chainon (yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyvsp[-3].ftype.t))); yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; break;} ! case 412: ! #line 1860 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyval.ttype)); yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 413: ! #line 1865 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyval.ttype); ; break;} ! case 414: ! #line 1867 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyvsp[0].ttype)); yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 415: ! #line 1872 "parse.y" ! { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; ! break;} ! case 416: ! #line 1874 "parse.y" ! { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; ! break;} ! case 417: ! #line 1893 "parse.y" { yyval.ftype.lookups = NULL_TREE; TREE_STATIC (yyval.ftype.t) = 1; ; break;} ! case 418: ! #line 1895 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 419: ! #line 1900 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); TREE_STATIC (yyval.ftype.t) = 1; ; break;} ! case 420: ! #line 1905 "parse.y" { if (extra_warnings && TREE_STATIC (yyval.ftype.t)) warning ("`%s' is not at beginning of declaration", --- 6351,6614 ---- yyval.ttype = yyvsp[0].ttype; ; break;} ! case 367: ! #line 1688 "parse.y" { yyval.ttype = build_offset_ref (OP0 (yyval.ttype), OP1 (yyval.ttype)); ; break;} ! case 368: ! #line 1690 "parse.y" { yyval.ttype = finish_qualified_call_expr (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 369: ! #line 1692 "parse.y" { yyval.ttype = finish_qualified_call_expr (yyvsp[-1].ttype, NULL_TREE); ; break;} ! case 370: ! #line 1694 "parse.y" { yyval.ttype = build_x_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; break;} ! case 371: ! #line 1698 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 372: ! #line 1700 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 373: ! #line 1702 "parse.y" { yyval.ttype = build_x_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; break;} ! case 374: ! #line 1704 "parse.y" { if (processing_template_decl) yyval.ttype = build_min_nt (COMPONENT_REF, yyvsp[-1].ttype, yyvsp[0].ttype); else yyval.ttype = build_object_ref (yyval.ttype, OP0 (yyvsp[0].ttype), OP1 (yyvsp[0].ttype)); ; break;} ! case 375: ! #line 1709 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 376: ! #line 1711 "parse.y" { yyval.ttype = finish_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 377: ! #line 1713 "parse.y" { yyval.ttype = finish_qualified_object_call_expr (yyvsp[-3].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 378: ! #line 1715 "parse.y" { yyval.ttype = finish_qualified_object_call_expr (yyvsp[-1].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 379: ! #line 1718 "parse.y" { yyval.ttype = finish_pseudo_destructor_call_expr (yyvsp[-3].ttype, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 380: ! #line 1720 "parse.y" { yyval.ttype = finish_pseudo_destructor_call_expr (yyvsp[-5].ttype, yyvsp[-4].ttype, yyvsp[-1].ttype); ; break;} ! case 381: ! #line 1722 "parse.y" { yyval.ttype = error_mark_node; ; break;} ! case 382: ! #line 1767 "parse.y" { yyval.itype = 0; ; break;} ! case 383: ! #line 1769 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} ! case 384: ! #line 1774 "parse.y" { yyval.itype = 0; ; break;} ! case 385: ! #line 1776 "parse.y" { got_scope = NULL_TREE; yyval.itype = 1; ; break;} ! case 386: ! #line 1781 "parse.y" { yyval.ttype = boolean_true_node; ; break;} ! case 387: ! #line 1783 "parse.y" { yyval.ttype = boolean_false_node; ; break;} ! case 389: ! #line 1790 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 390: ! #line 1795 "parse.y" { ! if (DECL_CONSTRUCTOR_P (current_function_decl)) ! finish_mem_initializers (NULL_TREE); ; break;} ! case 391: ! #line 1803 "parse.y" { got_object = TREE_TYPE (yyval.ttype); ; break;} ! case 392: ! #line 1805 "parse.y" { yyval.ttype = build_x_arrow (yyval.ttype); got_object = TREE_TYPE (yyval.ttype); ; break;} ! case 393: ! #line 1813 "parse.y" { if (yyvsp[-2].ftype.t && IS_AGGR_TYPE_CODE (TREE_CODE (yyvsp[-2].ftype.t))) note_got_semicolon (yyvsp[-2].ftype.t); ; break;} ! case 394: ! #line 1818 "parse.y" { note_list_got_semicolon (yyvsp[-2].ftype.t); ; break;} ! case 395: ! #line 1822 "parse.y" {; break;} ! case 396: ! #line 1824 "parse.y" { shadow_tag (yyvsp[-1].ftype.t); note_list_got_semicolon (yyvsp[-1].ftype.t); ; break;} ! case 397: ! #line 1829 "parse.y" { warning ("empty declaration"); ; break;} ! case 398: ! #line 1831 "parse.y" { pedantic = yyvsp[-1].itype; ; break;} ! case 401: ! #line 1845 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, empty_parms (), NULL_TREE, NULL_TREE); ; break;} ! case 402: ! #line 1848 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), NULL_TREE, NULL_TREE); ; break;} ! case 403: ! #line 1855 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 404: ! #line 1858 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 405: ! #line 1861 "parse.y" { yyval.ftype.t = build_tree_list (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 406: ! #line 1865 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 407: ! #line 1868 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 408: ! #line 1879 "parse.y" { yyval.ftype.lookups = type_lookups; ; break;} ! case 409: ! #line 1881 "parse.y" { yyval.ftype.lookups = type_lookups; ; break;} ! case 410: ! #line 1886 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 411: ! #line 1889 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 412: ! #line 1892 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-2].ftype.t, chainon (yyvsp[-1].ttype, yyvsp[0].ttype)); yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; break;} ! case 413: ! #line 1895 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 414: ! #line 1898 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 415: ! #line 1901 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-2].ftype.t, chainon (yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyvsp[-3].ftype.t))); yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; break;} ! case 416: ! #line 1908 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyval.ttype)); yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 417: ! #line 1913 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyval.ttype); ; break;} ! case 418: ! #line 1915 "parse.y" { if (extra_warnings) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER (yyvsp[0].ttype)); yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 419: ! #line 1937 "parse.y" { yyval.ftype.lookups = NULL_TREE; TREE_STATIC (yyval.ftype.t) = 1; ; break;} ! case 420: ! #line 1939 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 421: ! #line 1944 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); TREE_STATIC (yyval.ftype.t) = 1; ; break;} ! case 422: ! #line 1949 "parse.y" { if (extra_warnings && TREE_STATIC (yyval.ftype.t)) warning ("`%s' is not at beginning of declaration", *************** case 420: *** 6378,6446 **** TREE_STATIC (yyval.ftype.t) = TREE_STATIC (yyvsp[-1].ftype.t); ; break;} ! case 421: ! #line 1913 "parse.y" { yyval.ftype.t = hash_tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ftype.t); ; break;} ! case 422: ! #line 1915 "parse.y" ! { ! yyval.ftype.t = hash_tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ! yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ! ; ! break;} ! case 423: ! #line 1929 "parse.y" { yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 424: ! #line 1932 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 425: ! #line 1935 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 426: ! #line 1938 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 427: ! #line 1944 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} ! case 428: ! #line 1946 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ttype); ; break;} ! case 429: ! #line 1955 "parse.y" { yyval.ftype.lookups = NULL_TREE; ; break;} ! case 430: ! #line 1957 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 431: ! #line 1959 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 432: ! #line 1961 "parse.y" { yyval.ftype.t = finish_typeof (yyvsp[-1].ttype); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 433: ! #line 1964 "parse.y" { yyval.ftype.t = groktypename (yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 434: ! #line 1967 "parse.y" { tree type = TREE_TYPE (yyvsp[-1].ttype); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; --- 6617,6686 ---- TREE_STATIC (yyval.ftype.t) = TREE_STATIC (yyvsp[-1].ftype.t); ; break;} ! case 423: ! #line 1957 "parse.y" { yyval.ftype.t = hash_tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ftype.t); ; break;} ! case 424: ! #line 1968 "parse.y" { yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 425: ! #line 1971 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 426: ! #line 1974 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 427: ! #line 1977 "parse.y" { yyval.ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 428: ! #line 1983 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} ! case 429: ! #line 1985 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ttype); ; break;} ! case 430: ! #line 1987 "parse.y" ! { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; ! break;} ! case 431: ! #line 1989 "parse.y" ! { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; ! break;} ! case 432: ! #line 1998 "parse.y" { yyval.ftype.lookups = NULL_TREE; ; break;} ! case 433: ! #line 2000 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 434: ! #line 2002 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 435: ! #line 2004 "parse.y" { yyval.ftype.t = finish_typeof (yyvsp[-1].ttype); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 436: ! #line 2007 "parse.y" { yyval.ftype.t = groktypename (yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; ; break;} ! case 437: ! #line 2010 "parse.y" { tree type = TREE_TYPE (yyvsp[-1].ttype); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; *************** case 434: *** 6456,6463 **** } ; break;} ! case 435: ! #line 1982 "parse.y" { tree type = groktypename (yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; --- 6696,6703 ---- } ; break;} ! case 438: ! #line 2025 "parse.y" { tree type = groktypename (yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = 0; yyval.ftype.lookups = NULL_TREE; *************** case 435: *** 6473,6750 **** } ; break;} ! case 436: ! #line 2002 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} ! case 437: ! #line 2004 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} ! case 440: ! #line 2011 "parse.y" { check_multiple_declarators (); ; break;} ! case 442: ! #line 2017 "parse.y" { check_multiple_declarators (); ; break;} ! case 444: ! #line 2023 "parse.y" { check_multiple_declarators (); ; break;} ! case 445: ! #line 2028 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 446: ! #line 2030 "parse.y" { if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 447: ! #line 2035 "parse.y" { yyval.ttype = parse_decl (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 448: ! #line 2038 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 449: ! #line 2040 "parse.y" { yyval.ttype = parse_decl (yyvsp[-2].ttype, yyvsp[0].ttype, 0); parse_end_decl (yyval.ttype, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 450: ! #line 2054 "parse.y" { yyval.ttype = parse_decl0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, 1); ; break;} ! case 451: ! #line 2059 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 452: ! #line 2061 "parse.y" { tree d = parse_decl0 (yyvsp[-2].ttype, yyvsp[-3].ftype.t, yyvsp[-3].ftype.lookups, yyvsp[0].ttype, 0); parse_end_decl (d, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 453: ! #line 2068 "parse.y" {; break;} ! case 454: ! #line 2073 "parse.y" {; break;} ! case 455: ! #line 2078 "parse.y" { /* Set things up as initdcl0_innards expects. */ ! yyvsp[1].ttype = yyvsp[0].ttype; yyvsp[0].ttype = yyvsp[-1].ttype; yyvsp[-1].ftype.t = NULL_TREE; yyvsp[-1].ftype.lookups = NULL_TREE; ; break;} ! case 456: ! #line 2084 "parse.y" {; break;} ! case 457: ! #line 2086 "parse.y" { tree d = parse_decl0 (yyvsp[-2].ttype, NULL_TREE, NULL_TREE, yyvsp[0].ttype, 0); parse_end_decl (d, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 458: ! #line 2094 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 459: ! #line 2096 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 460: ! #line 2101 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 461: ! #line 2103 "parse.y" { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 462: ! #line 2108 "parse.y" { yyval.ttype = yyvsp[-2].ttype; ; break;} ! case 463: ! #line 2113 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 464: ! #line 2115 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 465: ! #line 2120 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 466: ! #line 2122 "parse.y" { yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 467: ! #line 2124 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; break;} ! case 468: ! #line 2126 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; break;} ! case 469: ! #line 2128 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 474: ! #line 2144 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 475: ! #line 2146 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 476: ! #line 2151 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 477: ! #line 2153 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 479: ! #line 2161 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 480: ! #line 2164 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-1].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 481: ! #line 2167 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 482: ! #line 2170 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 483: ! #line 2177 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 484: ! #line 2179 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 485: ! #line 2182 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 486: ! #line 2184 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 487: ! #line 2186 "parse.y" { yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 488: ! #line 2191 "parse.y" { ! expand_body (finish_function ((int)yyvsp[-1].itype | 2)); ! process_next_inline (yyvsp[-3].pi); ; break;} ! case 489: ! #line 2196 "parse.y" { ! expand_body (finish_function ((int)yyvsp[0].itype | 2)); process_next_inline (yyvsp[-2].pi); ; break;} ! case 490: ! #line 2201 "parse.y" { finish_function (2); process_next_inline (yyvsp[-2].pi); ; break;} ! case 493: ! #line 2215 "parse.y" { replace_defarg (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 494: ! #line 2217 "parse.y" { replace_defarg (yyvsp[-2].ttype, error_mark_node); ; break;} ! case 496: ! #line 2222 "parse.y" { do_pending_defargs (); ; break;} ! case 497: ! #line 2224 "parse.y" { do_pending_defargs (); ; break;} ! case 498: ! #line 2229 "parse.y" { yyval.ttype = current_enum_type; current_enum_type = start_enum (yyvsp[-1].ttype); ; break;} ! case 499: ! #line 2232 "parse.y" { yyval.ftype.t = current_enum_type; finish_enum (current_enum_type); yyval.ftype.new_type_flag = 1; current_enum_type = yyvsp[-2].ttype; check_for_missing_semicolon (yyval.ftype.t); ; break;} ! case 500: ! #line 2238 "parse.y" { yyval.ttype = current_enum_type; current_enum_type = start_enum (make_anon_name ()); ; break;} ! case 501: ! #line 2241 "parse.y" { yyval.ftype.t = current_enum_type; finish_enum (current_enum_type); yyval.ftype.new_type_flag = 1; current_enum_type = yyvsp[-2].ttype; check_for_missing_semicolon (yyval.ftype.t); ; break;} ! case 502: ! #line 2247 "parse.y" { yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, 1); yyval.ftype.new_type_flag = 0; ; break;} ! case 503: ! #line 2250 "parse.y" { yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, 1); yyval.ftype.new_type_flag = 0; ; break;} ! case 504: ! #line 2253 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; if (!processing_template_decl) ! cp_pedwarn ("using `typename' outside of template"); ; break;} ! case 505: ! #line 2259 "parse.y" ! { yyvsp[-1].ftype.t = begin_class_definition (yyvsp[-1].ftype.t); current_aggr = NULL_TREE; ; break;} ! case 506: ! #line 2262 "parse.y" { int semi; tree t; --- 6713,7004 ---- } ; break;} ! case 439: ! #line 2045 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} ! case 440: ! #line 2047 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} ! case 443: ! #line 2054 "parse.y" { check_multiple_declarators (); ; break;} ! case 445: ! #line 2060 "parse.y" { check_multiple_declarators (); ; break;} ! case 447: ! #line 2066 "parse.y" { check_multiple_declarators (); ; break;} ! case 448: ! #line 2071 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 449: ! #line 2073 "parse.y" { if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 450: ! #line 2078 "parse.y" { yyval.ttype = parse_decl (yyvsp[-3].ttype, yyvsp[-1].ttype, 1); ; break;} ! case 451: ! #line 2081 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 452: ! #line 2083 "parse.y" { yyval.ttype = parse_decl (yyvsp[-2].ttype, yyvsp[0].ttype, 0); parse_end_decl (yyval.ttype, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 453: ! #line 2097 "parse.y" { yyval.ttype = parse_decl0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, 1); ; break;} ! case 454: ! #line 2102 "parse.y" { parse_end_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; break;} ! case 455: ! #line 2104 "parse.y" { tree d = parse_decl0 (yyvsp[-2].ttype, yyvsp[-3].ftype.t, yyvsp[-3].ftype.lookups, yyvsp[0].ttype, 0); parse_end_decl (d, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 456: ! #line 2111 "parse.y" {; break;} ! case 457: ! #line 2116 "parse.y" {; break;} ! case 458: ! #line 2121 "parse.y" { /* Set things up as initdcl0_innards expects. */ ! yyval.ttype = yyvsp[0].ttype; yyvsp[0].ttype = yyvsp[-1].ttype; yyvsp[-1].ftype.t = NULL_TREE; yyvsp[-1].ftype.lookups = NULL_TREE; ; break;} ! case 459: ! #line 2127 "parse.y" {; break;} ! case 460: ! #line 2129 "parse.y" { tree d = parse_decl0 (yyvsp[-2].ttype, NULL_TREE, NULL_TREE, yyvsp[0].ttype, 0); parse_end_decl (d, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 461: ! #line 2137 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 462: ! #line 2139 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 463: ! #line 2144 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 464: ! #line 2146 "parse.y" { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 465: ! #line 2151 "parse.y" { yyval.ttype = yyvsp[-2].ttype; ; break;} ! case 466: ! #line 2156 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 467: ! #line 2158 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 468: ! #line 2163 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 469: ! #line 2165 "parse.y" { yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 470: ! #line 2167 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; break;} ! case 471: ! #line 2169 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; break;} ! case 472: ! #line 2171 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 477: ! #line 2187 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 478: ! #line 2189 "parse.y" { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 479: ! #line 2194 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 480: ! #line 2196 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 482: ! #line 2205 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 483: ! #line 2208 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-1].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 484: ! #line 2211 "parse.y" { yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; break;} ! case 485: ! #line 2214 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 486: ! #line 2221 "parse.y" { yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; break;} ! case 487: ! #line 2223 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 488: ! #line 2226 "parse.y" { yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 489: ! #line 2228 "parse.y" { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 490: ! #line 2230 "parse.y" { yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 491: ! #line 2235 "parse.y" { ! expand_body (finish_function (2)); ! process_next_inline (yyvsp[-2].pi); ; break;} ! case 492: ! #line 2240 "parse.y" { ! expand_body (finish_function (2)); process_next_inline (yyvsp[-2].pi); ; break;} ! case 493: ! #line 2245 "parse.y" { finish_function (2); process_next_inline (yyvsp[-2].pi); ; break;} ! case 496: ! #line 2259 "parse.y" { replace_defarg (yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 497: ! #line 2261 "parse.y" { replace_defarg (yyvsp[-2].ttype, error_mark_node); ; break;} ! case 499: ! #line 2267 "parse.y" { do_pending_defargs (); ; break;} ! case 500: ! #line 2269 "parse.y" { do_pending_defargs (); ; break;} ! case 501: ! #line 2274 "parse.y" { yyval.ttype = current_enum_type; current_enum_type = start_enum (yyvsp[-1].ttype); ; break;} ! case 502: ! #line 2277 "parse.y" { yyval.ftype.t = current_enum_type; finish_enum (current_enum_type); yyval.ftype.new_type_flag = 1; current_enum_type = yyvsp[-2].ttype; check_for_missing_semicolon (yyval.ftype.t); ; break;} ! case 503: ! #line 2283 "parse.y" { yyval.ttype = current_enum_type; current_enum_type = start_enum (make_anon_name ()); ; break;} ! case 504: ! #line 2286 "parse.y" { yyval.ftype.t = current_enum_type; finish_enum (current_enum_type); yyval.ftype.new_type_flag = 1; current_enum_type = yyvsp[-2].ttype; check_for_missing_semicolon (yyval.ftype.t); ; break;} ! case 505: ! #line 2292 "parse.y" { yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, 1); yyval.ftype.new_type_flag = 0; ; break;} ! case 506: ! #line 2295 "parse.y" { yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, 1); yyval.ftype.new_type_flag = 0; ; break;} ! case 507: ! #line 2298 "parse.y" { yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; if (!processing_template_decl) ! pedwarn ("using `typename' outside of template"); ; break;} ! case 508: ! #line 2304 "parse.y" ! { ! if (yyvsp[-1].ttype && yyvsp[-2].ftype.t != error_mark_node) ! { ! tree type = TREE_TYPE (yyvsp[-2].ftype.t); ! ! if (TREE_CODE (type) == TYPENAME_TYPE) ! /* In a definition of a member class template, ! we will get here with an implicit typename, ! a TYPENAME_TYPE with a type. */ ! type = TREE_TYPE (type); ! maybe_process_partial_specialization (type); ! xref_basetypes (current_aggr, yyvsp[-2].ftype.t, type, yyvsp[-1].ttype); ! } ! yyvsp[-2].ftype.t = begin_class_definition (TREE_TYPE (yyvsp[-2].ftype.t)); ! check_class_key (current_aggr, yyvsp[-2].ftype.t); current_aggr = NULL_TREE; ; break;} ! case 509: ! #line 2321 "parse.y" { int semi; tree t; *************** case 506: *** 6753,6760 **** yychar = YYLEX; semi = yychar == ';'; ! t = finish_class_definition (yyvsp[-5].ftype.t, yyvsp[0].ttype, semi, ! yyvsp[-5].ftype.new_type_flag); yyval.ttype = t; /* restore current_aggr */ --- 7007,7013 ---- yychar = YYLEX; semi = yychar == ';'; ! t = finish_class_definition (yyvsp[-6].ftype.t, yyvsp[0].ttype, semi, yyvsp[-6].ftype.new_type_flag); yyval.ttype = t; /* restore current_aggr */ *************** case 506: *** 6764,7001 **** ? class_type_node : record_type_node; ; break;} ! case 507: ! #line 2281 "parse.y" { done_pending_defargs (); begin_inline_definitions (); ; break;} ! case 508: ! #line 2286 "parse.y" { finish_inline_definitions (); yyval.ftype.t = yyvsp[-3].ttype; yyval.ftype.new_type_flag = 1; ; break;} ! case 509: ! #line 2292 "parse.y" { ! if (yyvsp[0].ftype.new_type_flag && yyvsp[0].ftype.t != error_mark_node) ! pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (yyvsp[0].ftype.t))); ! yyval.ftype.new_type_flag = 0; ! if (yyvsp[0].ftype.t == error_mark_node) ! yyval.ftype.t = yyvsp[0].ftype.t; ! else if (TYPE_BINFO (yyvsp[0].ftype.t) == NULL_TREE) ! { ! cp_error ("%T is not a class type", yyvsp[0].ftype.t); ! yyval.ftype.t = error_mark_node; ! } ! else ! { ! yyval.ftype.t = yyvsp[0].ftype.t; ! /* struct B: public A; is not accepted by the standard grammar. */ ! if (CLASS_TYPE_P (yyval.ftype.t) ! && TYPE_BINFO_BASETYPES (yyval.ftype.t) ! && !COMPLETE_TYPE_P (yyval.ftype.t) ! && ! TYPE_BEING_DEFINED (yyval.ftype.t)) ! cp_error ("base clause without member specification for `%#T'", ! yyval.ftype.t); ! } ; break;} ! case 513: ! #line 2325 "parse.y" { if (pedantic && !in_system_header) pedwarn ("comma at end of enumerator list"); ; break;} - case 515: - #line 2332 "parse.y" - { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} - case 516: - #line 2334 "parse.y" - { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} - case 517: - #line 2336 "parse.y" - { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} case 518: ! #line 2338 "parse.y" ! { error ("no body nor ';' separates two class, struct or union declarations"); ; break;} case 519: ! #line 2340 "parse.y" ! { yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 520: ! #line 2345 "parse.y" ! { ! current_aggr = yyvsp[-1].ttype; ! yyval.ttype = yyvsp[0].ttype; ! ; break;} case 521: ! #line 2353 "parse.y" ! { current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; break;} case 522: ! #line 2355 "parse.y" ! { yyungetc ('{', 1); ; break;} case 523: ! #line 2357 "parse.y" ! { yyungetc (':', 1); ; break;} case 524: ! #line 2362 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ftype.t = handle_class_head (yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ! yyval.ftype.new_type_flag = 1; ; break;} case 525: ! #line 2368 "parse.y" { current_aggr = yyvsp[-3].ttype; ! yyval.ftype.t = handle_class_head (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ! yyval.ftype.new_type_flag = 1; ; break;} case 526: ! #line 2374 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ftype.t = handle_class_head (yyvsp[-2].ttype, NULL_TREE, yyvsp[0].ttype); ! yyval.ftype.new_type_flag = 1; ; break;} case 527: ! #line 2380 "parse.y" { current_aggr = yyvsp[-1].ttype; ! yyval.ftype.t = yyvsp[0].ttype; ! yyval.ftype.new_type_flag = 0; ; break;} case 528: ! #line 2386 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ftype.t = yyvsp[0].ttype; ! push_scope (CP_DECL_CONTEXT (yyval.ftype.t)); ! yyval.ftype.new_type_flag = 1; ; break;} case 529: ! #line 2396 "parse.y" { ! yyval.ftype.t = xref_tag (current_aggr, yyvsp[0].ttype, 1); ! yyval.ftype.new_type_flag = 0; ; break;} case 530: ! #line 2401 "parse.y" ! { yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, 0); ; break;} case 531: ! #line 2405 "parse.y" ! { ! yyval.ftype.t = yyvsp[-1].ttype; ! yyval.ftype.new_type_flag = 0; ! if (yyvsp[0].ttype) ! xref_basetypes (current_aggr, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 532: ! #line 2413 "parse.y" ! { ! if (yyvsp[-1].ftype.t != error_mark_node) ! { ! tree type = TREE_TYPE (yyvsp[-1].ftype.t); ! ! yyval.ftype.t = type; ! yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ! if ((current_aggr == union_type_node) ! != (TREE_CODE (type) == UNION_TYPE)) ! cp_pedwarn (current_aggr == union_type_node ! ? "`union' tag used in declaring `%#T'" ! : "non-`union' tag used in declaring `%#T'", ! type); ! else if (TREE_CODE (type) == RECORD_TYPE) ! /* We might be specializing a template with a different ! class-key; deal. */ ! CLASSTYPE_DECLARED_CLASS (type) ! = (current_aggr == class_type_node); ! if (yyvsp[0].ttype) ! { ! if (TREE_CODE (type) == TYPENAME_TYPE) ! /* In a definition of a member class template, we ! will get here with an implicit typename, a ! TYPENAME_TYPE with a type. */ ! type = TREE_TYPE (type); ! maybe_process_partial_specialization (type); ! xref_basetypes (current_aggr, yyvsp[-1].ftype.t, type, yyvsp[0].ttype); ! } ! } ; break;} case 533: ! #line 2447 "parse.y" ! { yyval.ttype = xref_tag (yyval.ttype, make_anon_name (), 0); ! yyungetc ('{', 1); ; break;} case 534: ! #line 2457 "parse.y" { ! yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; break;} case 536: ! #line 2466 "parse.y" ! { yyval.ttype = NULL_TREE; ; break;} case 537: ! #line 2468 "parse.y" ! { yyungetc(':', 1); yyval.ttype = NULL_TREE; ; break;} case 538: ! #line 2470 "parse.y" ! { yyval.ttype = yyvsp[0].ttype; ; break;} case 540: ! #line 2476 "parse.y" ! { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} case 541: ! #line 2481 "parse.y" ! { yyval.ttype = finish_base_specifier (access_default_node, yyvsp[0].ttype); ; break;} case 542: ! #line 2483 "parse.y" { yyval.ttype = finish_base_specifier (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 543: ! #line 2488 "parse.y" { if (!TYPE_P (yyval.ttype)) yyval.ttype = error_mark_node; ; break;} ! case 544: ! #line 2491 "parse.y" { yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 546: ! #line 2497 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) ! cp_error ("`%D' access", yyvsp[-1].ttype); yyval.ttype = access_default_virtual_node; ; break;} ! case 547: ! #line 2501 "parse.y" { if (yyvsp[-2].ttype != access_default_virtual_node) error ("multiple access specifiers"); --- 7017,7257 ---- ? class_type_node : record_type_node; ; break;} ! case 510: ! #line 2339 "parse.y" { done_pending_defargs (); begin_inline_definitions (); ; break;} ! case 511: ! #line 2344 "parse.y" { finish_inline_definitions (); yyval.ftype.t = yyvsp[-3].ttype; yyval.ftype.new_type_flag = 1; ; break;} ! case 512: ! #line 2350 "parse.y" { ! yyval.ftype.t = TREE_TYPE (yyvsp[0].ftype.t); ! yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ! check_class_key (current_aggr, yyval.ftype.t); ; break;} ! case 516: ! #line 2365 "parse.y" { if (pedantic && !in_system_header) pedwarn ("comma at end of enumerator list"); ; break;} case 518: ! #line 2372 "parse.y" ! { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 519: ! #line 2374 "parse.y" ! { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 520: ! #line 2376 "parse.y" ! { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; break;} case 521: ! #line 2378 "parse.y" ! { error ("no body nor ';' separates two class, struct or union declarations"); ; break;} case 522: ! #line 2380 "parse.y" ! { yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} case 523: ! #line 2385 "parse.y" ! { ! current_aggr = yyvsp[-1].ttype; ! yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ! ; break;} case 524: ! #line 2390 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 525: ! #line 2395 "parse.y" { current_aggr = yyvsp[-3].ttype; ! yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} case 526: ! #line 2400 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ttype = build_tree_list (global_namespace, yyvsp[0].ttype); ; break;} case 527: ! #line 2408 "parse.y" { current_aggr = yyvsp[-1].ttype; ! yyval.ttype = yyvsp[0].ttype; ; break;} case 528: ! #line 2413 "parse.y" { current_aggr = yyvsp[-2].ttype; ! yyval.ttype = yyvsp[0].ttype; ; break;} case 529: ! #line 2418 "parse.y" { ! current_aggr = yyvsp[-3].ttype; ! yyval.ttype = yyvsp[0].ttype; ; break;} case 530: ! #line 2426 "parse.y" ! { ! yyval.ftype.t = handle_class_head (current_aggr, ! TREE_PURPOSE (yyvsp[0].ttype), TREE_VALUE (yyvsp[0].ttype), ! 0, &yyval.ftype.new_type_flag); ! ; break;} case 531: ! #line 2432 "parse.y" ! { ! current_aggr = yyvsp[-1].ttype; ! yyval.ftype.t = TYPE_MAIN_DECL (xref_tag (current_aggr, yyvsp[0].ttype, 0)); ! yyval.ftype.new_type_flag = 1; ; break;} case 532: ! #line 2438 "parse.y" ! { ! yyval.ftype.t = yyvsp[0].ttype; ! yyval.ftype.new_type_flag = 0; ; break;} case 533: ! #line 2446 "parse.y" ! { ! yyungetc ('{', 1); ! yyval.ftype.t = handle_class_head (current_aggr, ! TREE_PURPOSE (yyvsp[-1].ttype), TREE_VALUE (yyvsp[-1].ttype), ! 1, &yyval.ftype.new_type_flag); ! ; break;} case 534: ! #line 2453 "parse.y" { ! yyungetc (':', 1); ! yyval.ftype.t = handle_class_head (current_aggr, ! TREE_PURPOSE (yyvsp[-1].ttype), TREE_VALUE (yyvsp[-1].ttype), ! 1, &yyval.ftype.new_type_flag); ! ; ! break;} ! case 535: ! #line 2460 "parse.y" ! { ! yyungetc ('{', 1); ! yyval.ftype.t = yyvsp[-1].ttype; yyval.ftype.new_type_flag = 0; + if (TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == RECORD_TYPE) + /* We might be specializing a template with a different + class-key. */ + CLASSTYPE_DECLARED_CLASS (TREE_TYPE (yyvsp[-1].ttype)) + = (current_aggr == class_type_node); ; break;} case 536: ! #line 2471 "parse.y" ! { ! yyungetc (':', 1); ! yyval.ftype.t = yyvsp[-1].ttype; ! yyval.ftype.new_type_flag = 0; ! if (TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == RECORD_TYPE) ! /* We might be specializing a template with a different ! class-key. */ ! CLASSTYPE_DECLARED_CLASS (TREE_TYPE (yyvsp[-1].ttype)) ! = (current_aggr == class_type_node); ! ; break;} case 537: ! #line 2482 "parse.y" ! { ! yyungetc ('{', 1); ! current_aggr = yyvsp[-2].ttype; ! yyval.ftype.t = handle_class_head (current_aggr, ! NULL_TREE, yyvsp[-1].ttype, ! 1, &yyval.ftype.new_type_flag); ! ; break;} case 538: ! #line 2490 "parse.y" ! { ! yyungetc (':', 1); ! current_aggr = yyvsp[-2].ttype; ! yyval.ftype.t = handle_class_head (current_aggr, ! NULL_TREE, yyvsp[-1].ttype, ! 1, &yyval.ftype.new_type_flag); ! ; ! break;} ! case 539: ! #line 2498 "parse.y" ! { ! current_aggr = yyvsp[-1].ttype; ! yyval.ftype.t = TYPE_MAIN_DECL (xref_tag (yyvsp[-1].ttype, make_anon_name (), 0)); ! yyval.ftype.new_type_flag = 0; ! yyungetc ('{', 1); ! ; break;} case 540: ! #line 2508 "parse.y" ! { yyval.ttype = NULL_TREE; ; break;} case 541: ! #line 2510 "parse.y" ! { error ("no bases given following `:'"); ! yyval.ttype = NULL_TREE; ; break;} case 542: ! #line 2513 "parse.y" ! { yyval.ttype = yyvsp[0].ttype; ; ! break;} ! case 544: ! #line 2519 "parse.y" ! { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; ! break;} ! case 545: ! #line 2524 "parse.y" ! { yyval.ttype = finish_base_specifier (access_default_node, yyvsp[0].ttype); ; ! break;} ! case 546: ! #line 2526 "parse.y" { yyval.ttype = finish_base_specifier (yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 547: ! #line 2531 "parse.y" { if (!TYPE_P (yyval.ttype)) yyval.ttype = error_mark_node; ; break;} ! case 548: ! #line 2534 "parse.y" { yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 550: ! #line 2540 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) ! error ("`%D' access", yyvsp[-1].ttype); yyval.ttype = access_default_virtual_node; ; break;} ! case 551: ! #line 2544 "parse.y" { if (yyvsp[-2].ttype != access_default_virtual_node) error ("multiple access specifiers"); *************** case 547: *** 7007,7016 **** yyval.ttype = access_private_virtual_node; ; break;} ! case 548: ! #line 2512 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) ! cp_error ("`%D' access", yyvsp[-1].ttype); else if (yyval.ttype == access_public_node) yyval.ttype = access_public_virtual_node; else if (yyval.ttype == access_protected_node) --- 7263,7272 ---- yyval.ttype = access_private_virtual_node; ; break;} ! case 552: ! #line 2555 "parse.y" { if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) ! error ("`%D' access", yyvsp[-1].ttype); else if (yyval.ttype == access_public_node) yyval.ttype = access_public_virtual_node; else if (yyval.ttype == access_protected_node) *************** case 548: *** 7021,7078 **** error ("multiple `virtual' specifiers"); ; break;} ! case 553: ! #line 2533 "parse.y" { current_access_specifier = yyvsp[-1].ttype; ; break;} ! case 554: ! #line 2542 "parse.y" { finish_member_declaration (yyvsp[0].ttype); current_aggr = NULL_TREE; ; break;} ! case 555: ! #line 2547 "parse.y" { finish_member_declaration (yyvsp[0].ttype); current_aggr = NULL_TREE; ; break;} ! case 557: ! #line 2556 "parse.y" { error ("missing ';' before right brace"); yyungetc ('}', 0); ; break;} ! case 558: ! #line 2561 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 559: ! #line 2563 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 560: ! #line 2565 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 561: ! #line 2567 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 562: ! #line 2569 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 563: ! #line 2571 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-1].itype; ; break;} ! case 564: ! #line 2574 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = finish_member_template_decl (yyvsp[0].ttype); --- 7277,7336 ---- error ("multiple `virtual' specifiers"); ; break;} ! case 557: ! #line 2576 "parse.y" { current_access_specifier = yyvsp[-1].ttype; ; break;} ! case 558: ! #line 2585 "parse.y" { finish_member_declaration (yyvsp[0].ttype); current_aggr = NULL_TREE; + reset_type_access_control (); ; break;} ! case 559: ! #line 2591 "parse.y" { finish_member_declaration (yyvsp[0].ttype); current_aggr = NULL_TREE; + reset_type_access_control (); ; break;} ! case 561: ! #line 2601 "parse.y" { error ("missing ';' before right brace"); yyungetc ('}', 0); ; break;} ! case 562: ! #line 2606 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 563: ! #line 2608 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 564: ! #line 2610 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 565: ! #line 2612 "parse.y" { yyval.ttype = finish_method (yyval.ttype); ; break;} ! case 566: ! #line 2614 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 567: ! #line 2616 "parse.y" { yyval.ttype = yyvsp[0].ttype; pedantic = yyvsp[-1].itype; ; break;} ! case 568: ! #line 2619 "parse.y" { if (yyvsp[0].ttype) yyval.ttype = finish_member_template_decl (yyvsp[0].ttype); *************** case 564: *** 7083,7101 **** finish_template_decl (yyvsp[-1].ttype); ; break;} ! case 565: ! #line 2584 "parse.y" { yyval.ttype = finish_member_class_template (yyvsp[-1].ftype.t); finish_template_decl (yyvsp[-2].ttype); ; break;} ! case 566: ! #line 2589 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 567: ! #line 2597 "parse.y" { /* Most of the productions for component_decl only allow the creation of one new member, so we call --- 7341,7359 ---- finish_template_decl (yyvsp[-1].ttype); ; break;} ! case 569: ! #line 2629 "parse.y" { yyval.ttype = finish_member_class_template (yyvsp[-1].ftype.t); finish_template_decl (yyvsp[-2].ttype); ; break;} ! case 570: ! #line 2634 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 571: ! #line 2642 "parse.y" { /* Most of the productions for component_decl only allow the creation of one new member, so we call *************** case 567: *** 7117,7170 **** yyval.ttype = NULL_TREE; ; break;} ! case 568: ! #line 2618 "parse.y" { if (!yyvsp[0].itype) grok_x_components (yyvsp[-1].ftype.t); yyval.ttype = NULL_TREE; ; break;} ! case 569: ! #line 2624 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, ! build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} ! case 570: ! #line 2627 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, ! build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} ! case 571: ! #line 2630 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ; break;} ! case 572: ! #line 2632 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 573: ! #line 2643 "parse.y" { tree specs, attrs; split_specs_attrs (yyvsp[-4].ftype.t, &specs, &attrs); yyval.ttype = grokfield (yyvsp[-3].ttype, specs, yyvsp[0].ttype, yyvsp[-2].ttype, ! build_tree_list (yyvsp[-1].ttype, attrs)); ; break;} ! case 574: ! #line 2648 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, ! build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; break;} ! case 575: ! #line 2651 "parse.y" { yyval.ttype = do_class_using_decl (yyvsp[0].ttype); ; break;} ! case 576: ! #line 2657 "parse.y" { yyval.itype = 0; ; break;} ! case 577: ! #line 2659 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); --- 7375,7425 ---- yyval.ttype = NULL_TREE; ; break;} ! case 572: ! #line 2663 "parse.y" { if (!yyvsp[0].itype) grok_x_components (yyvsp[-1].ftype.t); yyval.ttype = NULL_TREE; ; break;} ! case 573: ! #line 2669 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 574: ! #line 2671 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 575: ! #line 2673 "parse.y" { yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ; break;} ! case 576: ! #line 2675 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 577: ! #line 2686 "parse.y" { tree specs, attrs; split_specs_attrs (yyvsp[-4].ftype.t, &specs, &attrs); yyval.ttype = grokfield (yyvsp[-3].ttype, specs, yyvsp[0].ttype, yyvsp[-2].ttype, ! chainon (yyvsp[-1].ttype, attrs)); ; break;} ! case 578: ! #line 2691 "parse.y" ! { yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, yyvsp[-1].ttype); ; break;} ! case 579: ! #line 2693 "parse.y" { yyval.ttype = do_class_using_decl (yyvsp[0].ttype); ; break;} ! case 580: ! #line 2700 "parse.y" { yyval.itype = 0; ; break;} ! case 581: ! #line 2702 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); *************** case 577: *** 7172,7179 **** yyval.itype = 1; ; break;} ! case 578: ! #line 2666 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) --- 7427,7434 ---- yyval.itype = 1; ; break;} ! case 582: ! #line 2709 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) *************** case 578: *** 7182,7193 **** yyval.itype = 2; ; break;} ! case 579: ! #line 2677 "parse.y" { yyval.itype = 0; ; break;} ! case 580: ! #line 2679 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); --- 7437,7448 ---- yyval.itype = 2; ; break;} ! case 583: ! #line 2720 "parse.y" { yyval.itype = 0; ; break;} ! case 584: ! #line 2722 "parse.y" { if (PROCESSING_REAL_TEMPLATE_DECL_P ()) yyvsp[0].ttype = finish_member_template_decl (yyvsp[0].ttype); *************** case 580: *** 7195,7202 **** yyval.itype = 1; ; break;} ! case 581: ! #line 2686 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) --- 7450,7457 ---- yyval.itype = 1; ; break;} ! case 585: ! #line 2729 "parse.y" { check_multiple_declarators (); if (PROCESSING_REAL_TEMPLATE_DECL_P ()) *************** case 581: *** 7205,7280 **** yyval.itype = 2; ; break;} ! case 586: ! #line 2707 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 587: ! #line 2710 "parse.y" { yyval.ttype = parse_bitfield0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 588: ! #line 2716 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 589: ! #line 2719 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 590: ! #line 2722 "parse.y" { yyval.ttype = parse_bitfield0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 591: ! #line 2725 "parse.y" { yyval.ttype = parse_bitfield0 (NULL_TREE, yyvsp[-3].ftype.t, yyvsp[-3].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 592: ! #line 2731 "parse.y" { yyval.ttype = parse_field (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 593: ! #line 2733 "parse.y" { yyval.ttype = parse_bitfield (yyvsp[-3].ttype, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 594: ! #line 2738 "parse.y" { yyval.ttype = parse_field (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 595: ! #line 2740 "parse.y" { yyval.ttype = parse_bitfield (yyvsp[-3].ttype, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 596: ! #line 2742 "parse.y" { yyval.ttype = parse_bitfield (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 601: ! #line 2761 "parse.y" { build_enumerator (yyvsp[0].ttype, NULL_TREE, current_enum_type); ; break;} ! case 602: ! #line 2763 "parse.y" { build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype, current_enum_type); ; break;} ! case 603: ! #line 2769 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 604: ! #line 2772 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 605: ! #line 2777 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids array dimensions with parenthesized type in new"); --- 7460,7535 ---- yyval.itype = 2; ; break;} ! case 590: ! #line 2750 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 591: ! #line 2753 "parse.y" { yyval.ttype = parse_bitfield0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 592: ! #line 2759 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 593: ! #line 2762 "parse.y" { yyval.ttype = parse_field0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 594: ! #line 2765 "parse.y" { yyval.ttype = parse_bitfield0 (yyvsp[-3].ttype, yyvsp[-4].ftype.t, yyvsp[-4].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 595: ! #line 2768 "parse.y" { yyval.ttype = parse_bitfield0 (NULL_TREE, yyvsp[-3].ftype.t, yyvsp[-3].ftype.lookups, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 596: ! #line 2774 "parse.y" { yyval.ttype = parse_field (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 597: ! #line 2776 "parse.y" { yyval.ttype = parse_bitfield (yyvsp[-3].ttype, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 598: ! #line 2781 "parse.y" { yyval.ttype = parse_field (yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; break;} ! case 599: ! #line 2783 "parse.y" { yyval.ttype = parse_bitfield (yyvsp[-3].ttype, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 600: ! #line 2785 "parse.y" { yyval.ttype = parse_bitfield (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 605: ! #line 2804 "parse.y" { build_enumerator (yyvsp[0].ttype, NULL_TREE, current_enum_type); ; break;} ! case 606: ! #line 2806 "parse.y" { build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype, current_enum_type); ; break;} ! case 607: ! #line 2812 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 608: ! #line 2815 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 609: ! #line 2820 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids array dimensions with parenthesized type in new"); *************** case 605: *** 7283,7376 **** yyval.ftype.new_type_flag = yyvsp[-4].ftype.new_type_flag; ; break;} ! case 606: ! #line 2788 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 607: ! #line 2790 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 608: ! #line 2795 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); yyval.ftype.new_type_flag = 0; ; break;} ! case 609: ! #line 2798 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 610: ! #line 2808 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 611: ! #line 2810 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 612: ! #line 2812 "parse.y" { yyval.ttype = empty_parms (); ; break;} ! case 613: ! #line 2814 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 615: ! #line 2822 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 616: ! #line 2832 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 617: ! #line 2834 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 618: ! #line 2836 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 619: ! #line 2838 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 620: ! #line 2840 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 622: ! #line 2848 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 623: ! #line 2850 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 624: ! #line 2852 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 625: ! #line 2854 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 626: ! #line 2856 "parse.y" { push_nested_class (yyvsp[-1].ttype, 3); yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; break;} ! case 628: ! #line 2864 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) { --- 7538,7641 ---- yyval.ftype.new_type_flag = yyvsp[-4].ftype.new_type_flag; ; break;} ! case 610: ! #line 2831 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 611: ! #line 2833 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; break;} ! case 612: ! #line 2838 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); yyval.ftype.new_type_flag = 0; ; break;} ! case 613: ! #line 2841 "parse.y" { yyval.ftype.t = hash_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 614: ! #line 2844 "parse.y" ! { yyval.ftype.t = hash_tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ! yyval.ftype.new_type_flag = 0; ; ! break;} ! case 615: ! #line 2847 "parse.y" ! { yyval.ftype.t = hash_tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ftype.t); ! yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; ! break;} ! case 616: ! #line 2857 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 617: ! #line 2859 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 618: ! #line 2861 "parse.y" { yyval.ttype = empty_parms (); ; break;} ! case 619: ! #line 2863 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 621: ! #line 2871 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 622: ! #line 2881 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 623: ! #line 2883 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 624: ! #line 2885 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 625: ! #line 2887 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 626: ! #line 2889 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 628: ! #line 2897 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 629: ! #line 2899 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 630: ! #line 2901 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 631: ! #line 2903 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 632: ! #line 2905 "parse.y" { push_nested_class (yyvsp[-1].ttype, 3); yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; break;} ! case 634: ! #line 2913 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) { *************** case 628: *** 7381,7388 **** yyval.ttype = yyvsp[0].ttype; ; break;} ! case 629: ! #line 2874 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); --- 7646,7653 ---- yyval.ttype = yyvsp[0].ttype; ; break;} ! case 635: ! #line 2923 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); *************** case 629: *** 7391,7540 **** got_scope = NULL_TREE; ; break;} ! case 632: ! #line 2887 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 633: ! #line 2892 "parse.y" { yyval.ttype = get_type_decl (yyvsp[0].ttype); ; break;} ! case 635: ! #line 2901 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 636: ! #line 2910 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 637: ! #line 2912 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 638: ! #line 2914 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 639: ! #line 2916 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 640: ! #line 2918 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 642: ! #line 2926 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 643: ! #line 2928 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 644: ! #line 2930 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 645: ! #line 2932 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 646: ! #line 2934 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 648: ! #line 2942 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 649: ! #line 2944 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 650: ! #line 2946 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 651: ! #line 2948 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 652: ! #line 2950 "parse.y" { enter_scope_of (yyvsp[0].ttype); ; break;} ! case 653: ! #line 2952 "parse.y" { enter_scope_of (yyvsp[0].ttype); yyval.ttype = yyvsp[0].ttype;; break;} ! case 654: ! #line 2954 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, global_namespace, yyvsp[0].ttype); enter_scope_of (yyval.ttype); ; break;} ! case 655: ! #line 2958 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); enter_scope_of (yyval.ttype); ; break;} ! case 656: ! #line 2966 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} ! case 657: ! #line 2969 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 658: ! #line 2975 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} ! case 659: ! #line 2978 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 661: ! #line 2985 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 662: ! #line 2990 "parse.y" { yyval.ttype = build_functional_cast (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} ! case 663: ! #line 2992 "parse.y" { yyval.ttype = reparse_decl_as_expr (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} ! case 664: ! #line 2994 "parse.y" { yyval.ttype = reparse_absdcl_as_expr (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 669: ! #line 3006 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 670: ! #line 3008 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} ! case 671: ! #line 3016 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) { --- 7656,7815 ---- got_scope = NULL_TREE; ; break;} ! case 638: ! #line 2936 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 639: ! #line 2941 "parse.y" { yyval.ttype = get_type_decl (yyvsp[0].ttype); ; break;} ! case 641: ! #line 2950 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 642: ! #line 2959 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 643: ! #line 2961 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 644: ! #line 2963 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 645: ! #line 2965 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 646: ! #line 2967 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 648: ! #line 2975 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 649: ! #line 2977 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 650: ! #line 2979 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 651: ! #line 2981 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 652: ! #line 2983 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 654: ! #line 2991 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 655: ! #line 2993 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 656: ! #line 2995 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 657: ! #line 2997 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 658: ! #line 2999 "parse.y" { enter_scope_of (yyvsp[0].ttype); ; break;} ! case 659: ! #line 3001 "parse.y" { enter_scope_of (yyvsp[0].ttype); yyval.ttype = yyvsp[0].ttype;; break;} ! case 660: ! #line 3003 "parse.y" { yyval.ttype = build_nt (SCOPE_REF, global_namespace, yyvsp[0].ttype); enter_scope_of (yyval.ttype); ; break;} ! case 661: ! #line 3007 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); enter_scope_of (yyval.ttype); ; break;} ! case 662: ! #line 3015 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} ! case 663: ! #line 3018 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 664: ! #line 3024 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; break;} ! case 665: ! #line 3027 "parse.y" { got_scope = NULL_TREE; yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 667: ! #line 3034 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 668: ! #line 3039 "parse.y" { yyval.ttype = build_functional_cast (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} ! case 669: ! #line 3041 "parse.y" { yyval.ttype = reparse_decl_as_expr (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; break;} ! case 670: ! #line 3043 "parse.y" { yyval.ttype = reparse_absdcl_as_expr (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 675: ! #line 3055 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 676: ! #line 3057 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, tf_error); ; break;} ! case 677: ! #line 3061 "parse.y" ! { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype, tf_error); ; ! break;} ! case 678: ! #line 3064 "parse.y" ! { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype, tf_error); ; ! break;} ! case 679: ! #line 3072 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) { *************** case 671: *** 7545,7581 **** complete_type (TYPE_MAIN_VARIANT (TREE_TYPE (yyval.ttype))); ; break;} ! case 672: ! #line 3026 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 673: ! #line 3032 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype; ; break;} ! case 674: ! #line 3038 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ; break;} ! case 676: ! #line 3054 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 677: ! #line 3059 "parse.y" { if (TYPE_P (yyvsp[-1].ttype)) ! yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); else { yyval.ttype = yyvsp[0].ttype; --- 7820,7856 ---- complete_type (TYPE_MAIN_VARIANT (TREE_TYPE (yyval.ttype))); ; break;} ! case 680: ! #line 3082 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype = TREE_TYPE (yyval.ttype); ; break;} ! case 681: ! #line 3088 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype; ; break;} ! case 682: ! #line 3094 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ; break;} ! case 684: ! #line 3100 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 685: ! #line 3105 "parse.y" { if (TYPE_P (yyvsp[-1].ttype)) ! yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, tf_error); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", yyvsp[0].ttype); else { yyval.ttype = yyvsp[0].ttype; *************** case 677: *** 7584,7617 **** } ; break;} ! case 678: ! #line 3072 "parse.y" { yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} ! case 679: ! #line 3074 "parse.y" ! { yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); ; break;} ! case 680: ! #line 3076 "parse.y" ! { yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[0].ttype, /*complain=*/1); ; break;} ! case 681: ! #line 3081 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); else if (TREE_CODE (yyvsp[0].ttype) == TYPE_DECL) yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} ! case 682: ! #line 3088 "parse.y" { if (TYPE_P (yyvsp[-1].ttype)) ! yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, /*complain=*/1); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", yyvsp[0].ttype); else { yyval.ttype = yyvsp[0].ttype; --- 7859,7892 ---- } ; break;} ! case 686: ! #line 3118 "parse.y" { yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} ! case 687: ! #line 3120 "parse.y" ! { yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, tf_error); ; break;} ! case 688: ! #line 3122 "parse.y" ! { yyval.ttype = make_typename_type (yyvsp[-2].ttype, yyvsp[0].ttype, tf_error); ; break;} ! case 689: ! #line 3127 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", yyvsp[0].ttype); else if (TREE_CODE (yyvsp[0].ttype) == TYPE_DECL) yyval.ttype = TREE_TYPE (yyvsp[0].ttype); ; break;} ! case 690: ! #line 3134 "parse.y" { if (TYPE_P (yyvsp[-1].ttype)) ! yyval.ttype = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype, tf_error); else if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", yyvsp[0].ttype); else { yyval.ttype = yyvsp[0].ttype; *************** case 682: *** 7620,7637 **** } ; break;} ! case 683: ! #line 3101 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} ! case 684: ! #line 3104 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, /*complain=*/1); ; break;} ! case 685: ! #line 3112 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != TYPE_DECL) yyval.ttype = lastiddecl; --- 7895,7912 ---- } ; break;} ! case 691: ! #line 3147 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-2].ttype, yyvsp[-1].ttype, tf_error); ; break;} ! case 692: ! #line 3150 "parse.y" { got_scope = yyval.ttype ! = make_typename_type (yyvsp[-3].ttype, yyvsp[-1].ttype, tf_error); ; break;} ! case 693: ! #line 3158 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != TYPE_DECL) yyval.ttype = lastiddecl; *************** case 685: *** 7641,7675 **** got_scope = complete_type (TREE_TYPE (yyval.ttype)); if (yyval.ttype == error_mark_node) ! cp_error ("`%T' is not a class or namespace", yyvsp[-1].ttype); ; break;} ! case 686: ! #line 3124 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != TYPE_DECL) yyval.ttype = lastiddecl; got_scope = complete_type (TREE_TYPE (yyval.ttype)); ; break;} ! case 687: ! #line 3130 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ; break;} ! case 690: ! #line 3134 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype; ; break;} ! case 691: ! #line 3143 "parse.y" { yyval.ttype = build_min_nt (TEMPLATE_ID_EXPR, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 692: ! #line 3148 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); --- 7916,7950 ---- got_scope = complete_type (TREE_TYPE (yyval.ttype)); if (yyval.ttype == error_mark_node) ! error ("`%T' is not a class or namespace", yyvsp[-1].ttype); ; break;} ! case 694: ! #line 3170 "parse.y" { if (TREE_CODE (yyvsp[-1].ttype) != TYPE_DECL) yyval.ttype = lastiddecl; got_scope = complete_type (TREE_TYPE (yyval.ttype)); ; break;} ! case 695: ! #line 3176 "parse.y" { got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ; break;} ! case 698: ! #line 3180 "parse.y" { if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) yyval.ttype = lastiddecl; got_scope = yyval.ttype; ; break;} ! case 699: ! #line 3189 "parse.y" { yyval.ttype = build_min_nt (TEMPLATE_ID_EXPR, yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 700: ! #line 3194 "parse.y" { if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype); *************** case 692: *** 7678,7834 **** got_scope = NULL_TREE; ; break;} ! case 694: ! #line 3157 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 695: ! #line 3162 "parse.y" { got_scope = NULL_TREE; ; break;} ! case 696: ! #line 3164 "parse.y" { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; break;} ! case 697: ! #line 3171 "parse.y" { got_scope = void_type_node; ; break;} ! case 698: ! #line 3177 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 699: ! #line 3179 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 700: ! #line 3181 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 701: ! #line 3183 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 702: ! #line 3185 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} ! case 703: ! #line 3189 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 705: ! #line 3198 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 706: ! #line 3200 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 708: ! #line 3206 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 709: ! #line 3216 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 710: ! #line 3218 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 711: ! #line 3220 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} ! case 712: ! #line 3222 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; break;} ! case 713: ! #line 3224 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 714: ! #line 3226 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 715: ! #line 3228 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} ! case 716: ! #line 3230 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; break;} ! case 717: ! #line 3232 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} ! case 718: ! #line 3236 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 720: ! #line 3245 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 721: ! #line 3248 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 722: ! #line 3250 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 723: ! #line 3252 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 724: ! #line 3254 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 725: ! #line 3256 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 726: ! #line 3258 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 727: ! #line 3260 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 728: ! #line 3262 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 729: ! #line 3264 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ; break;} ! case 736: ! #line 3287 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids label declarations"); ; break;} ! case 739: ! #line 3298 "parse.y" { while (yyvsp[-1].ttype) { --- 7953,8109 ---- got_scope = NULL_TREE; ; break;} ! case 702: ! #line 3203 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 703: ! #line 3208 "parse.y" { got_scope = NULL_TREE; ; break;} ! case 704: ! #line 3210 "parse.y" { yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; break;} ! case 705: ! #line 3217 "parse.y" { got_scope = void_type_node; ; break;} ! case 706: ! #line 3223 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 707: ! #line 3225 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 708: ! #line 3227 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 709: ! #line 3229 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; break;} ! case 710: ! #line 3231 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} ! case 711: ! #line 3235 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 713: ! #line 3244 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 714: ! #line 3246 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 716: ! #line 3252 "parse.y" { /* Provide support for '(' attributes '*' declarator ')' etc */ yyval.ttype = tree_cons (yyvsp[-1].ttype, yyvsp[0].ttype, NULL_TREE); ; break;} ! case 717: ! #line 3262 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 718: ! #line 3264 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 719: ! #line 3266 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} ! case 720: ! #line 3268 "parse.y" { yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; break;} ! case 721: ! #line 3270 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 722: ! #line 3272 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; break;} ! case 723: ! #line 3274 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ; break;} ! case 724: ! #line 3276 "parse.y" { yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; break;} ! case 725: ! #line 3278 "parse.y" { tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-1].ttype, arg); ; break;} ! case 726: ! #line 3282 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 728: ! #line 3291 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 729: ! #line 3294 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 730: ! #line 3296 "parse.y" { yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 731: ! #line 3298 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 732: ! #line 3300 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, yyval.ttype, NULL_TREE); ; break;} ! case 733: ! #line 3302 "parse.y" { yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 734: ! #line 3304 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 735: ! #line 3306 "parse.y" { set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 736: ! #line 3308 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; break;} ! case 737: ! #line 3310 "parse.y" { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ; break;} ! case 744: ! #line 3333 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids label declarations"); ; break;} ! case 747: ! #line 3344 "parse.y" { while (yyvsp[-1].ttype) { *************** case 739: *** 7837,8228 **** } ; break;} ! case 742: ! #line 3316 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} ! case 743: ! #line 3318 "parse.y" { STMT_LINENO (yyvsp[-1].ttype) = yyvsp[-3].itype; finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} ! case 744: ! #line 3324 "parse.y" { yyval.ttype = begin_if_stmt (); cond_stmt_keyword = "if"; ; break;} ! case 745: ! #line 3327 "parse.y" { finish_if_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 746: ! #line 3329 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_then_clause (yyvsp[-3].ttype); ; break;} ! case 748: ! #line 3336 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} ! case 749: ! #line 3338 "parse.y" { STMT_LINENO (yyvsp[-2].ttype) = yyvsp[-1].itype; if (yyvsp[0].ttype) STMT_LINENO (yyvsp[0].ttype) = yyvsp[-1].itype; finish_compound_stmt (0, yyvsp[-2].ttype); ; break;} ! case 751: ! #line 3346 "parse.y" { if (yyvsp[0].ttype) STMT_LINENO (yyvsp[0].ttype) = yyvsp[-1].itype; ; break;} ! case 752: ! #line 3351 "parse.y" { finish_stmt (); yyval.ttype = NULL_TREE; ; break;} ! case 753: ! #line 3354 "parse.y" { yyval.ttype = finish_expr_stmt (yyvsp[-1].ttype); ; break;} ! case 754: ! #line 3356 "parse.y" { begin_else_clause (); ; break;} ! case 755: ! #line 3358 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_else_clause (yyvsp[-3].ttype); finish_if_stmt (); ; break;} ! case 756: ! #line 3364 "parse.y" { yyval.ttype = yyvsp[0].ttype; finish_if_stmt (); ; break;} ! case 757: ! #line 3367 "parse.y" { yyval.ttype = begin_while_stmt (); cond_stmt_keyword = "while"; ; break;} ! case 758: ! #line 3372 "parse.y" { finish_while_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 759: ! #line 3374 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_while_stmt (yyvsp[-3].ttype); ; break;} ! case 760: ! #line 3377 "parse.y" { yyval.ttype = begin_do_stmt (); ; break;} ! case 761: ! #line 3379 "parse.y" { finish_do_body (yyvsp[-2].ttype); cond_stmt_keyword = "do"; ; break;} ! case 762: ! #line 3384 "parse.y" { yyval.ttype = yyvsp[-5].ttype; finish_do_stmt (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} ! case 763: ! #line 3387 "parse.y" { yyval.ttype = begin_for_stmt (); ; break;} ! case 764: ! #line 3389 "parse.y" { finish_for_init_stmt (yyvsp[-2].ttype); ; break;} ! case 765: ! #line 3391 "parse.y" { finish_for_cond (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} ! case 766: ! #line 3393 "parse.y" { finish_for_expr (yyvsp[-1].ttype, yyvsp[-8].ttype); ; break;} ! case 767: ! #line 3395 "parse.y" { yyval.ttype = yyvsp[-10].ttype; finish_for_stmt (yyvsp[-10].ttype); ; break;} ! case 768: ! #line 3398 "parse.y" { yyval.ttype = begin_switch_stmt (); ; break;} ! case 769: ! #line 3400 "parse.y" { finish_switch_cond (yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} ! case 770: ! #line 3402 "parse.y" { yyval.ttype = yyvsp[-5].ttype; finish_switch_stmt (yyvsp[-5].ttype); ; break;} ! case 771: ! #line 3405 "parse.y" { yyval.ttype = finish_case_label (yyvsp[-1].ttype, NULL_TREE); ; break;} ! case 772: ! #line 3407 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 773: ! #line 3409 "parse.y" { yyval.ttype = finish_case_label (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 774: ! #line 3411 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 775: ! #line 3413 "parse.y" { yyval.ttype = finish_case_label (NULL_TREE, NULL_TREE); ; break;} ! case 776: ! #line 3415 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 777: ! #line 3417 "parse.y" { yyval.ttype = finish_break_stmt (); ; break;} ! case 778: ! #line 3419 "parse.y" { yyval.ttype = finish_continue_stmt (); ; break;} ! case 779: ! #line 3421 "parse.y" { yyval.ttype = finish_return_stmt (NULL_TREE); ; break;} ! case 780: ! #line 3423 "parse.y" { yyval.ttype = finish_return_stmt (yyvsp[-1].ttype); ; break;} ! case 781: ! #line 3425 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, NULL_TREE); ASM_INPUT_P (yyval.ttype) = 1; ; break;} ! case 782: ! #line 3430 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE); ; break;} ! case 783: ! #line 3434 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 784: ! #line 3436 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, NULL_TREE, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 785: ! #line 3440 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-10].ttype, yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} ! case 786: ! #line 3443 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, NULL_TREE, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} ! case 787: ! #line 3446 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, NULL_TREE, yyvsp[-2].ttype); ; break;} ! case 788: ! #line 3448 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids computed gotos"); yyval.ttype = finish_goto_stmt (yyvsp[-1].ttype); ; break;} ! case 789: ! #line 3454 "parse.y" { yyval.ttype = finish_goto_stmt (yyvsp[-1].ttype); ; break;} ! case 790: ! #line 3456 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 791: ! #line 3458 "parse.y" { error ("label must be followed by statement"); yyungetc ('}', 0); yyval.ttype = NULL_TREE; ; break;} ! case 792: ! #line 3462 "parse.y" { finish_stmt (); yyval.ttype = NULL_TREE; ; break;} ! case 793: ! #line 3465 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 794: ! #line 3467 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 795: ! #line 3469 "parse.y" { do_local_using_decl (yyvsp[0].ttype); yyval.ttype = NULL_TREE; ; break;} ! case 796: ! #line 3472 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 797: ! #line 3477 "parse.y" { yyval.ttype = begin_function_try_block (); ; break;} ! case 798: ! #line 3479 "parse.y" ! { finish_function_try_block (yyvsp[-2].ttype); ; break;} ! case 799: ! #line 3481 "parse.y" ! { ! finish_function_handler_sequence (yyvsp[-4].ttype); ! yyval.itype = yyvsp[-3].itype; ! ; break;} ! case 800: ! #line 3489 "parse.y" { yyval.ttype = begin_try_block (); ; break;} ! case 801: ! #line 3491 "parse.y" { finish_try_block (yyvsp[-1].ttype); ; break;} ! case 802: ! #line 3493 "parse.y" { finish_handler_sequence (yyvsp[-3].ttype); ; break;} ! case 805: ! #line 3503 "parse.y" ! { yyval.ttype = begin_handler(); ; break;} ! case 806: ! #line 3505 "parse.y" ! { yyval.ttype = finish_handler_parms (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 807: ! #line 3507 "parse.y" ! { finish_handler (yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} ! case 810: ! #line 3517 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 811: ! #line 3533 "parse.y" { check_for_new_type ("inside exception declarations", yyvsp[-1].ftype); yyval.ttype = start_handler_parms (TREE_PURPOSE (yyvsp[-1].ftype.t), TREE_VALUE (yyvsp[-1].ftype.t)); ; break;} ! case 812: ! #line 3542 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 813: ! #line 3544 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 814: ! #line 3546 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 815: ! #line 3548 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 816: ! #line 3553 "parse.y" { finish_expr_stmt (yyvsp[-1].ttype); ; break;} ! case 818: ! #line 3556 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids compound statements inside for initializations"); ; break;} ! case 819: ! #line 3565 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 821: ! #line 3571 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 823: ! #line 3574 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 824: ! #line 3581 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 827: ! #line 3588 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 828: ! #line 3593 "parse.y" ! { yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ; break;} ! case 829: ! #line 3598 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE);; break;} ! case 830: ! #line 3600 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ; break;} ! case 831: ! #line 3611 "parse.y" { yyval.ttype = empty_parms(); ; break;} ! case 833: ! #line 3616 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[0].ftype.t), 0); check_for_new_type ("inside parameter list", yyvsp[0].ftype); ; break;} ! case 834: ! #line 3624 "parse.y" { yyval.ttype = finish_parmlist (yyval.ttype, 0); ; break;} ! case 835: ! #line 3626 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} ! case 836: ! #line 3629 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} ! case 837: ! #line 3631 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 1); ; break;} ! case 838: ! #line 3634 "parse.y" { yyval.ttype = finish_parmlist (NULL_TREE, 1); ; break;} ! case 839: ! #line 3636 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right --- 8112,8519 ---- } ; break;} ! case 748: ! #line 3355 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} ! case 749: ! #line 3357 "parse.y" { STMT_LINENO (yyvsp[-1].ttype) = yyvsp[-3].itype; finish_compound_stmt (0, yyvsp[-1].ttype); ; break;} ! case 750: ! #line 3363 "parse.y" ! { last_expr_type = NULL_TREE; ; ! break;} ! case 751: ! #line 3368 "parse.y" { yyval.ttype = begin_if_stmt (); cond_stmt_keyword = "if"; ; break;} ! case 752: ! #line 3371 "parse.y" { finish_if_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 753: ! #line 3373 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_then_clause (yyvsp[-3].ttype); ; break;} ! case 755: ! #line 3380 "parse.y" { yyval.ttype = begin_compound_stmt (0); ; break;} ! case 756: ! #line 3382 "parse.y" { STMT_LINENO (yyvsp[-2].ttype) = yyvsp[-1].itype; if (yyvsp[0].ttype) STMT_LINENO (yyvsp[0].ttype) = yyvsp[-1].itype; finish_compound_stmt (0, yyvsp[-2].ttype); ; break;} ! case 758: ! #line 3390 "parse.y" { if (yyvsp[0].ttype) STMT_LINENO (yyvsp[0].ttype) = yyvsp[-1].itype; ; break;} ! case 759: ! #line 3395 "parse.y" { finish_stmt (); yyval.ttype = NULL_TREE; ; break;} ! case 760: ! #line 3398 "parse.y" { yyval.ttype = finish_expr_stmt (yyvsp[-1].ttype); ; break;} ! case 761: ! #line 3400 "parse.y" { begin_else_clause (); ; break;} ! case 762: ! #line 3402 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_else_clause (yyvsp[-3].ttype); finish_if_stmt (); ; break;} ! case 763: ! #line 3408 "parse.y" { yyval.ttype = yyvsp[0].ttype; finish_if_stmt (); ; break;} ! case 764: ! #line 3411 "parse.y" { yyval.ttype = begin_while_stmt (); cond_stmt_keyword = "while"; ; break;} ! case 765: ! #line 3416 "parse.y" { finish_while_stmt_cond (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 766: ! #line 3418 "parse.y" { yyval.ttype = yyvsp[-3].ttype; finish_while_stmt (yyvsp[-3].ttype); ; break;} ! case 767: ! #line 3421 "parse.y" { yyval.ttype = begin_do_stmt (); ; break;} ! case 768: ! #line 3423 "parse.y" { finish_do_body (yyvsp[-2].ttype); cond_stmt_keyword = "do"; ; break;} ! case 769: ! #line 3428 "parse.y" { yyval.ttype = yyvsp[-5].ttype; finish_do_stmt (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} ! case 770: ! #line 3431 "parse.y" { yyval.ttype = begin_for_stmt (); ; break;} ! case 771: ! #line 3433 "parse.y" { finish_for_init_stmt (yyvsp[-2].ttype); ; break;} ! case 772: ! #line 3435 "parse.y" { finish_for_cond (yyvsp[-1].ttype, yyvsp[-5].ttype); ; break;} ! case 773: ! #line 3437 "parse.y" { finish_for_expr (yyvsp[-1].ttype, yyvsp[-8].ttype); ; break;} ! case 774: ! #line 3439 "parse.y" { yyval.ttype = yyvsp[-10].ttype; finish_for_stmt (yyvsp[-10].ttype); ; break;} ! case 775: ! #line 3442 "parse.y" { yyval.ttype = begin_switch_stmt (); ; break;} ! case 776: ! #line 3444 "parse.y" { finish_switch_cond (yyvsp[-1].ttype, yyvsp[-3].ttype); ; break;} ! case 777: ! #line 3446 "parse.y" { yyval.ttype = yyvsp[-5].ttype; finish_switch_stmt (yyvsp[-5].ttype); ; break;} ! case 778: ! #line 3449 "parse.y" { yyval.ttype = finish_case_label (yyvsp[-1].ttype, NULL_TREE); ; break;} ! case 779: ! #line 3451 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 780: ! #line 3453 "parse.y" { yyval.ttype = finish_case_label (yyvsp[-3].ttype, yyvsp[-1].ttype); ; break;} ! case 781: ! #line 3455 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 782: ! #line 3457 "parse.y" { yyval.ttype = finish_case_label (NULL_TREE, NULL_TREE); ; break;} ! case 783: ! #line 3459 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 784: ! #line 3461 "parse.y" { yyval.ttype = finish_break_stmt (); ; break;} ! case 785: ! #line 3463 "parse.y" { yyval.ttype = finish_continue_stmt (); ; break;} ! case 786: ! #line 3465 "parse.y" { yyval.ttype = finish_return_stmt (NULL_TREE); ; break;} ! case 787: ! #line 3467 "parse.y" { yyval.ttype = finish_return_stmt (yyvsp[-1].ttype); ; break;} ! case 788: ! #line 3469 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, NULL_TREE); ASM_INPUT_P (yyval.ttype) = 1; ; break;} ! case 789: ! #line 3474 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE); ; break;} ! case 790: ! #line 3478 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 791: ! #line 3480 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-6].ttype, yyvsp[-4].ttype, NULL_TREE, yyvsp[-2].ttype, NULL_TREE); ; break;} ! case 792: ! #line 3484 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-10].ttype, yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} ! case 793: ! #line 3487 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, NULL_TREE, yyvsp[-4].ttype, yyvsp[-2].ttype); ; break;} ! case 794: ! #line 3490 "parse.y" { yyval.ttype = finish_asm_stmt (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, NULL_TREE, yyvsp[-2].ttype); ; break;} ! case 795: ! #line 3492 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids computed gotos"); yyval.ttype = finish_goto_stmt (yyvsp[-1].ttype); ; break;} ! case 796: ! #line 3498 "parse.y" { yyval.ttype = finish_goto_stmt (yyvsp[-1].ttype); ; break;} ! case 797: ! #line 3500 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 798: ! #line 3502 "parse.y" { error ("label must be followed by statement"); yyungetc ('}', 0); yyval.ttype = NULL_TREE; ; break;} ! case 799: ! #line 3506 "parse.y" { finish_stmt (); yyval.ttype = NULL_TREE; ; break;} ! case 800: ! #line 3509 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 801: ! #line 3511 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 802: ! #line 3513 "parse.y" { do_local_using_decl (yyvsp[0].ttype); yyval.ttype = NULL_TREE; ; break;} ! case 803: ! #line 3516 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 804: ! #line 3521 "parse.y" { yyval.ttype = begin_function_try_block (); ; break;} ! case 805: ! #line 3523 "parse.y" ! { finish_function_try_block (yyvsp[-1].ttype); ; break;} ! case 806: ! #line 3525 "parse.y" ! { finish_function_handler_sequence (yyvsp[-3].ttype); ; break;} ! case 807: ! #line 3530 "parse.y" { yyval.ttype = begin_try_block (); ; break;} ! case 808: ! #line 3532 "parse.y" { finish_try_block (yyvsp[-1].ttype); ; break;} ! case 809: ! #line 3534 "parse.y" { finish_handler_sequence (yyvsp[-3].ttype); ; break;} ! case 812: ! #line 3541 "parse.y" ! { /* Generate a fake handler block to avoid later aborts. */ ! tree fake_handler = begin_handler (); ! finish_handler_parms (NULL_TREE, fake_handler); ! finish_handler (fake_handler); ! yyval.ttype = fake_handler; ! ! error ("must have at least one catch per try block"); ! ; break;} ! case 813: ! #line 3553 "parse.y" ! { yyval.ttype = begin_handler (); ; break;} ! case 814: ! #line 3555 "parse.y" ! { finish_handler_parms (yyvsp[0].ttype, yyvsp[-1].ttype); ; break;} ! case 815: ! #line 3557 "parse.y" ! { finish_handler (yyvsp[-3].ttype); ; ! break;} ! case 818: ! #line 3567 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 819: ! #line 3583 "parse.y" { check_for_new_type ("inside exception declarations", yyvsp[-1].ftype); yyval.ttype = start_handler_parms (TREE_PURPOSE (yyvsp[-1].ftype.t), TREE_VALUE (yyvsp[-1].ftype.t)); ; break;} ! case 820: ! #line 3592 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 821: ! #line 3594 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 822: ! #line 3596 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 823: ! #line 3598 "parse.y" { finish_label_stmt (yyvsp[-1].ttype); ; break;} ! case 824: ! #line 3603 "parse.y" { finish_expr_stmt (yyvsp[-1].ttype); ; break;} ! case 826: ! #line 3606 "parse.y" { if (pedantic) pedwarn ("ISO C++ forbids compound statements inside for initializations"); ; break;} ! case 827: ! #line 3615 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 829: ! #line 3621 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 831: ! #line 3624 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 832: ! #line 3631 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 835: ! #line 3638 "parse.y" { yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; break;} ! case 836: ! #line 3643 "parse.y" ! { yyval.ttype = build_tree_list (build_tree_list (NULL_TREE, yyvsp[-3].ttype), yyvsp[-1].ttype); ; break;} ! case 837: ! #line 3645 "parse.y" ! { yyval.ttype = build_tree_list (build_tree_list (yyvsp[-5].ttype, yyvsp[-3].ttype), yyvsp[-1].ttype); ; ! break;} ! case 838: ! #line 3650 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE);; break;} ! case 839: ! #line 3652 "parse.y" { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ; break;} ! case 840: ! #line 3663 "parse.y" { yyval.ttype = empty_parms(); ; break;} ! case 842: ! #line 3668 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[0].ftype.t), 0); check_for_new_type ("inside parameter list", yyvsp[0].ftype); ; break;} ! case 843: ! #line 3676 "parse.y" { yyval.ttype = finish_parmlist (yyval.ttype, 0); ; break;} ! case 844: ! #line 3678 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} ! case 845: ! #line 3681 "parse.y" { yyval.ttype = finish_parmlist (yyvsp[-1].ttype, 1); ; break;} ! case 846: ! #line 3683 "parse.y" { yyval.ttype = finish_parmlist (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), 1); ; break;} ! case 847: ! #line 3686 "parse.y" { yyval.ttype = finish_parmlist (NULL_TREE, 1); ; break;} ! case 848: ! #line 3688 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right *************** case 839: *** 8233,8240 **** yychar = ')'; ; break;} ! case 840: ! #line 3646 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right --- 8524,8531 ---- yychar = ')'; ; break;} ! case 849: ! #line 3698 "parse.y" { /* This helps us recover from really nasty parse errors, for example, a missing right *************** case 840: *** 8246,8416 **** yychar = ')'; ; break;} ! case 841: ! #line 3661 "parse.y" { maybe_snarf_defarg (); ; break;} ! case 842: ! #line 3663 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 845: ! #line 3674 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} ! case 846: ! #line 3677 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[-1].ftype); yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ; break;} ! case 847: ! #line 3680 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ; break;} ! case 848: ! #line 3683 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 849: ! #line 3685 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; break;} ! case 851: ! #line 3691 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[-1].ftype); yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ; break;} ! case 852: ! #line 3701 "parse.y" ! { tree specs = strip_attrs (yyvsp[-1].ftype.t); ! yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ! yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); ; break;} ! case 853: ! #line 3705 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 854: ! #line 3708 "parse.y" { yyval.ftype.t = build_tree_list (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 855: ! #line 3712 "parse.y" ! { tree specs = strip_attrs (yyvsp[-1].ftype.t); ! yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 856: ! #line 3716 "parse.y" ! { tree specs = strip_attrs (yyvsp[0].ftype.t); ! yyval.ftype.t = build_tree_list (specs, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 857: ! #line 3720 "parse.y" ! { tree specs = strip_attrs (yyvsp[-1].ftype.t); ! yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); yyval.ftype.new_type_flag = 0; ; break;} ! case 858: ! #line 3727 "parse.y" { yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 859: ! #line 3730 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 862: ! #line 3741 "parse.y" { see_typename (); ; break;} ! case 863: ! #line 3746 "parse.y" { error ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (integer_type_node, NULL_TREE); ; break;} ! case 864: ! #line 3751 "parse.y" { ! error ("type specifier omitted for parameter"); ! if (TREE_CODE (yyval.ttype) == SCOPE_REF ! && (TREE_CODE (TREE_OPERAND (yyval.ttype, 0)) == TEMPLATE_TYPE_PARM ! || TREE_CODE (TREE_OPERAND (yyval.ttype, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM)) ! cp_error (" perhaps you want `typename %E' to make it a type", yyval.ttype); yyval.ttype = build_tree_list (integer_type_node, yyval.ttype); ; break;} ! case 865: ! #line 3763 "parse.y" { ! cp_error("'%D' is used as a type, but is not defined as a type.", yyvsp[-4].ttype); yyvsp[-2].ttype = error_mark_node; ; break;} ! case 866: ! #line 3771 "parse.y" { ; break;} ! case 868: ! #line 3777 "parse.y" { ; break;} ! case 870: ! #line 3783 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 871: ! #line 3785 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 872: ! #line 3787 "parse.y" { yyval.ttype = empty_except_spec; ; break;} ! case 873: ! #line 3792 "parse.y" { check_for_new_type ("exception specifier", yyvsp[0].ftype); yyval.ttype = groktypename (yyvsp[0].ftype.t); ; break;} ! case 874: ! #line 3800 "parse.y" { yyval.ttype = add_exception_specifier (NULL_TREE, yyvsp[0].ttype, 1); ; break;} ! case 875: ! #line 3802 "parse.y" { yyval.ttype = add_exception_specifier (yyvsp[-2].ttype, yyvsp[0].ttype, 1); ; break;} ! case 876: ! #line 3807 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 877: ! #line 3809 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 878: ! #line 3811 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 879: ! #line 3813 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 880: ! #line 3820 "parse.y" { saved_scopes = tree_cons (got_scope, got_object, saved_scopes); TREE_LANG_FLAG_0 (saved_scopes) = looking_for_typename; --- 8537,8712 ---- yychar = ')'; ; break;} ! case 850: ! #line 3713 "parse.y" { maybe_snarf_defarg (); ; break;} ! case 851: ! #line 3715 "parse.y" { yyval.ttype = yyvsp[0].ttype; ; break;} ! case 854: ! #line 3726 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; break;} ! case 855: ! #line 3729 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[-1].ftype); yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ; break;} ! case 856: ! #line 3732 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[0].ftype); yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ; break;} ! case 857: ! #line 3735 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; break;} ! case 858: ! #line 3737 "parse.y" { yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; break;} ! case 860: ! #line 3743 "parse.y" { check_for_new_type ("in a parameter list", yyvsp[-1].ftype); yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ; break;} ! case 861: ! #line 3753 "parse.y" ! { yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ! yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; break;} ! case 862: ! #line 3756 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 863: ! #line 3759 "parse.y" { yyval.ftype.t = build_tree_list (build_tree_list (NULL_TREE, yyvsp[-1].ftype.t), yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 864: ! #line 3763 "parse.y" ! { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 865: ! #line 3766 "parse.y" ! { yyval.ftype.t = build_tree_list (yyvsp[0].ftype.t, NULL_TREE); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 866: ! #line 3769 "parse.y" ! { yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); yyval.ftype.new_type_flag = 0; ; break;} ! case 867: ! #line 3775 "parse.y" { yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; break;} ! case 868: ! #line 3778 "parse.y" { yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; break;} ! case 871: ! #line 3789 "parse.y" { see_typename (); ; break;} ! case 872: ! #line 3794 "parse.y" { error ("type specifier omitted for parameter"); yyval.ttype = build_tree_list (integer_type_node, NULL_TREE); ; break;} ! case 873: ! #line 3799 "parse.y" { ! if (TREE_CODE (yyval.ttype) == SCOPE_REF) ! { ! if (TREE_CODE (TREE_OPERAND (yyval.ttype, 0)) == TEMPLATE_TYPE_PARM ! || TREE_CODE (TREE_OPERAND (yyval.ttype, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM) ! error ("`%E' is not a type, use `typename %E' to make it one", yyval.ttype); ! else ! error ("no type `%D' in `%T'", TREE_OPERAND (yyval.ttype, 1), TREE_OPERAND (yyval.ttype, 0)); ! } ! else ! error ("type specifier omitted for parameter `%E'", yyval.ttype); yyval.ttype = build_tree_list (integer_type_node, yyval.ttype); ; break;} ! case 874: ! #line 3816 "parse.y" { ! error("'%D' is used as a type, but is not defined as a type.", yyvsp[-4].ttype); yyvsp[-2].ttype = error_mark_node; ; break;} ! case 875: ! #line 3824 "parse.y" { ; break;} ! case 877: ! #line 3830 "parse.y" { ; break;} ! case 879: ! #line 3836 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 880: ! #line 3838 "parse.y" { yyval.ttype = yyvsp[-1].ttype; ; break;} ! case 881: ! #line 3840 "parse.y" { yyval.ttype = empty_except_spec; ; break;} ! case 882: ! #line 3845 "parse.y" { check_for_new_type ("exception specifier", yyvsp[0].ftype); yyval.ttype = groktypename (yyvsp[0].ftype.t); ; break;} ! case 883: ! #line 3850 "parse.y" ! { yyval.ttype = error_mark_node; ; ! break;} ! case 884: ! #line 3855 "parse.y" { yyval.ttype = add_exception_specifier (NULL_TREE, yyvsp[0].ttype, 1); ; break;} ! case 885: ! #line 3857 "parse.y" { yyval.ttype = add_exception_specifier (yyvsp[-2].ttype, yyvsp[0].ttype, 1); ; break;} ! case 886: ! #line 3862 "parse.y" { yyval.ttype = NULL_TREE; ; break;} ! case 887: ! #line 3864 "parse.y" { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 888: ! #line 3866 "parse.y" { yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; break;} ! case 889: ! #line 3868 "parse.y" { tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); yyval.ttype = build_nt (SCOPE_REF, yyvsp[-2].ttype, arg); ; break;} ! case 890: ! #line 3875 "parse.y" { saved_scopes = tree_cons (got_scope, got_object, saved_scopes); TREE_LANG_FLAG_0 (saved_scopes) = looking_for_typename; *************** case 880: *** 8421,8576 **** got_scope = NULL_TREE; ; break;} ! case 881: ! #line 3832 "parse.y" { got_scope = TREE_PURPOSE (saved_scopes); got_object = TREE_VALUE (saved_scopes); looking_for_typename = TREE_LANG_FLAG_0 (saved_scopes); saved_scopes = TREE_CHAIN (saved_scopes); ; break;} ! case 882: ! #line 3841 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MULT_EXPR)); ; break;} ! case 883: ! #line 3843 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUNC_DIV_EXPR)); ; break;} ! case 884: ! #line 3845 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUNC_MOD_EXPR)); ; break;} ! case 885: ! #line 3847 "parse.y" { yyval.ttype = frob_opname (ansi_opname (PLUS_EXPR)); ; break;} ! case 886: ! #line 3849 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MINUS_EXPR)); ; break;} ! case 887: ! #line 3851 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_AND_EXPR)); ; break;} ! case 888: ! #line 3853 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_IOR_EXPR)); ; break;} ! case 889: ! #line 3855 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_XOR_EXPR)); ; break;} ! case 890: ! #line 3857 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_NOT_EXPR)); ; break;} ! case 891: ! #line 3859 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COMPOUND_EXPR)); ; break;} ! case 892: ! #line 3861 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 893: ! #line 3863 "parse.y" { yyval.ttype = frob_opname (ansi_opname (LT_EXPR)); ; break;} ! case 894: ! #line 3865 "parse.y" { yyval.ttype = frob_opname (ansi_opname (GT_EXPR)); ; break;} ! case 895: ! #line 3867 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 896: ! #line 3869 "parse.y" { yyval.ttype = frob_opname (ansi_assopname (yyvsp[-1].code)); ; break;} ! case 897: ! #line 3871 "parse.y" { yyval.ttype = frob_opname (ansi_assopname (NOP_EXPR)); ; break;} ! case 898: ! #line 3873 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 899: ! #line 3875 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 900: ! #line 3877 "parse.y" { yyval.ttype = frob_opname (ansi_opname (POSTINCREMENT_EXPR)); ; break;} ! case 901: ! #line 3879 "parse.y" { yyval.ttype = frob_opname (ansi_opname (PREDECREMENT_EXPR)); ; break;} ! case 902: ! #line 3881 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_ANDIF_EXPR)); ; break;} ! case 903: ! #line 3883 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_ORIF_EXPR)); ; break;} ! case 904: ! #line 3885 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_NOT_EXPR)); ; break;} ! case 905: ! #line 3887 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COND_EXPR)); ; break;} ! case 906: ! #line 3889 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 907: ! #line 3891 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COMPONENT_REF)); ; break;} ! case 908: ! #line 3893 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MEMBER_REF)); ; break;} ! case 909: ! #line 3895 "parse.y" { yyval.ttype = frob_opname (ansi_opname (CALL_EXPR)); ; break;} ! case 910: ! #line 3897 "parse.y" { yyval.ttype = frob_opname (ansi_opname (ARRAY_REF)); ; break;} ! case 911: ! #line 3899 "parse.y" { yyval.ttype = frob_opname (ansi_opname (NEW_EXPR)); ; break;} ! case 912: ! #line 3901 "parse.y" { yyval.ttype = frob_opname (ansi_opname (DELETE_EXPR)); ; break;} ! case 913: ! #line 3903 "parse.y" { yyval.ttype = frob_opname (ansi_opname (VEC_NEW_EXPR)); ; break;} ! case 914: ! #line 3905 "parse.y" { yyval.ttype = frob_opname (ansi_opname (VEC_DELETE_EXPR)); ; break;} ! case 915: ! #line 3907 "parse.y" { yyval.ttype = frob_opname (grokoptypename (yyvsp[-2].ftype.t, yyvsp[-1].ttype)); ; break;} ! case 916: ! #line 3909 "parse.y" { yyval.ttype = frob_opname (ansi_opname (ERROR_MARK)); ; break;} ! case 917: ! #line 3916 "parse.y" { if (yychar == YYEMPTY) yychar = YYLEX; yyval.itype = lineno; ; --- 8717,8872 ---- got_scope = NULL_TREE; ; break;} ! case 891: ! #line 3887 "parse.y" { got_scope = TREE_PURPOSE (saved_scopes); got_object = TREE_VALUE (saved_scopes); looking_for_typename = TREE_LANG_FLAG_0 (saved_scopes); saved_scopes = TREE_CHAIN (saved_scopes); ; break;} ! case 892: ! #line 3896 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MULT_EXPR)); ; break;} ! case 893: ! #line 3898 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUNC_DIV_EXPR)); ; break;} ! case 894: ! #line 3900 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUNC_MOD_EXPR)); ; break;} ! case 895: ! #line 3902 "parse.y" { yyval.ttype = frob_opname (ansi_opname (PLUS_EXPR)); ; break;} ! case 896: ! #line 3904 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MINUS_EXPR)); ; break;} ! case 897: ! #line 3906 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_AND_EXPR)); ; break;} ! case 898: ! #line 3908 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_IOR_EXPR)); ; break;} ! case 899: ! #line 3910 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_XOR_EXPR)); ; break;} ! case 900: ! #line 3912 "parse.y" { yyval.ttype = frob_opname (ansi_opname (BIT_NOT_EXPR)); ; break;} ! case 901: ! #line 3914 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COMPOUND_EXPR)); ; break;} ! case 902: ! #line 3916 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 903: ! #line 3918 "parse.y" { yyval.ttype = frob_opname (ansi_opname (LT_EXPR)); ; break;} ! case 904: ! #line 3920 "parse.y" { yyval.ttype = frob_opname (ansi_opname (GT_EXPR)); ; break;} ! case 905: ! #line 3922 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 906: ! #line 3924 "parse.y" { yyval.ttype = frob_opname (ansi_assopname (yyvsp[-1].code)); ; break;} ! case 907: ! #line 3926 "parse.y" { yyval.ttype = frob_opname (ansi_assopname (NOP_EXPR)); ; break;} ! case 908: ! #line 3928 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 909: ! #line 3930 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 910: ! #line 3932 "parse.y" { yyval.ttype = frob_opname (ansi_opname (POSTINCREMENT_EXPR)); ; break;} ! case 911: ! #line 3934 "parse.y" { yyval.ttype = frob_opname (ansi_opname (PREDECREMENT_EXPR)); ; break;} ! case 912: ! #line 3936 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_ANDIF_EXPR)); ; break;} ! case 913: ! #line 3938 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_ORIF_EXPR)); ; break;} ! case 914: ! #line 3940 "parse.y" { yyval.ttype = frob_opname (ansi_opname (TRUTH_NOT_EXPR)); ; break;} ! case 915: ! #line 3942 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COND_EXPR)); ; break;} ! case 916: ! #line 3944 "parse.y" { yyval.ttype = frob_opname (ansi_opname (yyvsp[-1].code)); ; break;} ! case 917: ! #line 3946 "parse.y" { yyval.ttype = frob_opname (ansi_opname (COMPONENT_REF)); ; break;} ! case 918: ! #line 3948 "parse.y" { yyval.ttype = frob_opname (ansi_opname (MEMBER_REF)); ; break;} ! case 919: ! #line 3950 "parse.y" { yyval.ttype = frob_opname (ansi_opname (CALL_EXPR)); ; break;} ! case 920: ! #line 3952 "parse.y" { yyval.ttype = frob_opname (ansi_opname (ARRAY_REF)); ; break;} ! case 921: ! #line 3954 "parse.y" { yyval.ttype = frob_opname (ansi_opname (NEW_EXPR)); ; break;} ! case 922: ! #line 3956 "parse.y" { yyval.ttype = frob_opname (ansi_opname (DELETE_EXPR)); ; break;} ! case 923: ! #line 3958 "parse.y" { yyval.ttype = frob_opname (ansi_opname (VEC_NEW_EXPR)); ; break;} ! case 924: ! #line 3960 "parse.y" { yyval.ttype = frob_opname (ansi_opname (VEC_DELETE_EXPR)); ; break;} ! case 925: ! #line 3962 "parse.y" { yyval.ttype = frob_opname (grokoptypename (yyvsp[-2].ftype.t, yyvsp[-1].ttype)); ; break;} ! case 926: ! #line 3964 "parse.y" { yyval.ttype = frob_opname (ansi_opname (ERROR_MARK)); ; break;} ! case 927: ! #line 3971 "parse.y" { if (yychar == YYEMPTY) yychar = YYLEX; yyval.itype = lineno; ; *************** yyerrhandle: *** 8797,8803 **** } return 1; } ! #line 3920 "parse.y" #ifdef SPEW_DEBUG --- 9093,9099 ---- } return 1; } ! #line 3975 "parse.y" #ifdef SPEW_DEBUG diff -Nrc3pad gcc-3.0.4/gcc/cp/parse.h gcc-3.1/gcc/cp/parse.h *** gcc-3.0.4/gcc/cp/parse.h Wed Feb 20 19:42:14 2002 --- gcc-3.1/gcc/cp/parse.h Wed May 15 02:55:47 2002 *************** typedef union { *** 14,97 **** #define TYPESPEC 262 #define CV_QUALIFIER 263 #define CONSTANT 264 ! #define STRING 265 ! #define ELLIPSIS 266 ! #define SIZEOF 267 ! #define ENUM 268 ! #define IF 269 ! #define ELSE 270 ! #define WHILE 271 ! #define DO 272 ! #define FOR 273 ! #define SWITCH 274 ! #define CASE 275 ! #define DEFAULT 276 ! #define BREAK 277 ! #define CONTINUE 278 ! #define RETURN_KEYWORD 279 ! #define GOTO 280 ! #define ASM_KEYWORD 281 ! #define TYPEOF 282 ! #define ALIGNOF 283 ! #define SIGOF 284 ! #define ATTRIBUTE 285 ! #define EXTENSION 286 ! #define LABEL 287 ! #define REALPART 288 ! #define IMAGPART 289 ! #define VA_ARG 290 ! #define AGGR 291 ! #define VISSPEC 292 ! #define DELETE 293 ! #define NEW 294 ! #define THIS 295 ! #define OPERATOR 296 ! #define CXX_TRUE 297 ! #define CXX_FALSE 298 ! #define NAMESPACE 299 ! #define TYPENAME_KEYWORD 300 ! #define USING 301 ! #define LEFT_RIGHT 302 ! #define TEMPLATE 303 ! #define TYPEID 304 ! #define DYNAMIC_CAST 305 ! #define STATIC_CAST 306 ! #define REINTERPRET_CAST 307 ! #define CONST_CAST 308 ! #define SCOPE 309 ! #define EXPORT 310 ! #define EMPTY 311 ! #define PTYPENAME 312 ! #define NSNAME 313 ! #define THROW 314 ! #define ASSIGN 315 ! #define OROR 316 ! #define ANDAND 317 ! #define MIN_MAX 318 ! #define EQCOMPARE 319 ! #define ARITHCOMPARE 320 ! #define LSHIFT 321 ! #define RSHIFT 322 ! #define POINTSAT_STAR 323 ! #define DOT_STAR 324 ! #define UNARY 325 ! #define PLUSPLUS 326 ! #define MINUSMINUS 327 ! #define HYPERUNARY 328 ! #define POINTSAT 329 ! #define TRY 330 ! #define CATCH 331 ! #define EXTERN_LANG_STRING 332 ! #define ALL 333 ! #define PRE_PARSED_CLASS_DECL 334 ! #define DEFARG 335 ! #define DEFARG_MARKER 336 ! #define PRE_PARSED_FUNCTION_DECL 337 ! #define TYPENAME_DEFN 338 ! #define IDENTIFIER_DEFN 339 ! #define PTYPENAME_DEFN 340 ! #define END_OF_LINE 341 ! #define END_OF_SAVED_INPUT 342 extern YYSTYPE yylval; --- 14,98 ---- #define TYPESPEC 262 #define CV_QUALIFIER 263 #define CONSTANT 264 ! #define VAR_FUNC_NAME 265 ! #define STRING 266 ! #define ELLIPSIS 267 ! #define SIZEOF 268 ! #define ENUM 269 ! #define IF 270 ! #define ELSE 271 ! #define WHILE 272 ! #define DO 273 ! #define FOR 274 ! #define SWITCH 275 ! #define CASE 276 ! #define DEFAULT 277 ! #define BREAK 278 ! #define CONTINUE 279 ! #define RETURN_KEYWORD 280 ! #define GOTO 281 ! #define ASM_KEYWORD 282 ! #define TYPEOF 283 ! #define ALIGNOF 284 ! #define SIGOF 285 ! #define ATTRIBUTE 286 ! #define EXTENSION 287 ! #define LABEL 288 ! #define REALPART 289 ! #define IMAGPART 290 ! #define VA_ARG 291 ! #define AGGR 292 ! #define VISSPEC 293 ! #define DELETE 294 ! #define NEW 295 ! #define THIS 296 ! #define OPERATOR 297 ! #define CXX_TRUE 298 ! #define CXX_FALSE 299 ! #define NAMESPACE 300 ! #define TYPENAME_KEYWORD 301 ! #define USING 302 ! #define LEFT_RIGHT 303 ! #define TEMPLATE 304 ! #define TYPEID 305 ! #define DYNAMIC_CAST 306 ! #define STATIC_CAST 307 ! #define REINTERPRET_CAST 308 ! #define CONST_CAST 309 ! #define SCOPE 310 ! #define EXPORT 311 ! #define EMPTY 312 ! #define PTYPENAME 313 ! #define NSNAME 314 ! #define THROW 315 ! #define ASSIGN 316 ! #define OROR 317 ! #define ANDAND 318 ! #define MIN_MAX 319 ! #define EQCOMPARE 320 ! #define ARITHCOMPARE 321 ! #define LSHIFT 322 ! #define RSHIFT 323 ! #define POINTSAT_STAR 324 ! #define DOT_STAR 325 ! #define UNARY 326 ! #define PLUSPLUS 327 ! #define MINUSMINUS 328 ! #define HYPERUNARY 329 ! #define POINTSAT 330 ! #define TRY 331 ! #define CATCH 332 ! #define EXTERN_LANG_STRING 333 ! #define ALL 334 ! #define PRE_PARSED_CLASS_DECL 335 ! #define DEFARG 336 ! #define DEFARG_MARKER 337 ! #define PRE_PARSED_FUNCTION_DECL 338 ! #define TYPENAME_DEFN 339 ! #define IDENTIFIER_DEFN 340 ! #define PTYPENAME_DEFN 341 ! #define END_OF_LINE 342 ! #define END_OF_SAVED_INPUT 343 extern YYSTYPE yylval; diff -Nrc3pad gcc-3.0.4/gcc/cp/parse.y gcc-3.1/gcc/cp/parse.y *** gcc-3.0.4/gcc/cp/parse.y Tue May 22 18:00:53 2001 --- gcc-3.1/gcc/cp/parse.y Tue Apr 30 15:42:21 2002 *************** *** 1,6 **** /* YACC parser for C++ syntax. Copyright (C) 1988, 1989, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* YACC parser for C++ syntax. Copyright (C) 1988, 1989, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 45,54 **** #include "toplev.h" #include "ggc.h" - /* Since parsers are distinct for each language, put the language string - definition here. (fnf) */ - const char * const language_string = "GNU C++"; - extern struct obstack permanent_obstack; /* Like YYERROR but do call yyerror. */ --- 45,50 ---- *************** static tree parse_field PARAMS ((tree, t *** 91,97 **** static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree)); static tree parse_bitfield PARAMS ((tree, tree, tree)); static tree parse_method PARAMS ((tree, tree, tree)); ! static void frob_specs PARAMS ((tree, tree)); /* Cons up an empty parameter list. */ static inline tree --- 87,94 ---- static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree)); static tree parse_bitfield PARAMS ((tree, tree, tree)); static tree parse_method PARAMS ((tree, tree, tree)); ! static void frob_specs PARAMS ((tree, tree)); ! static void check_class_key PARAMS ((tree, tree)); /* Cons up an empty parameter list. */ static inline tree *************** frob_specs (specs_attrs, lookups) *** 123,129 **** current_declspecs = build_tree_list (NULL_TREE, current_declspecs); if (have_extern_spec && !used_extern_spec) { ! current_declspecs = tree_cons (NULL_TREE, get_identifier ("extern"), current_declspecs); used_extern_spec = 1; --- 120,132 ---- current_declspecs = build_tree_list (NULL_TREE, current_declspecs); if (have_extern_spec && !used_extern_spec) { ! /* We have to indicate that there is an "extern", but that it ! was part of a language specifier. For instance, ! ! extern "C" typedef int (*Ptr) (); ! ! is well formed. */ ! current_declspecs = tree_cons (error_mark_node, get_identifier ("extern"), current_declspecs); used_extern_spec = 1; *************** parse_field (declarator, attributes, asm *** 164,170 **** tree declarator, attributes, asmspec, init; { tree d = grokfield (declarator, current_declspecs, init, asmspec, ! build_tree_list (attributes, prefix_attributes)); decl_type_access_control (d); return d; } --- 167,173 ---- tree declarator, attributes, asmspec, init; { tree d = grokfield (declarator, current_declspecs, init, asmspec, ! chainon (attributes, prefix_attributes)); decl_type_access_control (d); return d; } *************** parse_bitfield (declarator, attributes, *** 182,188 **** tree declarator, attributes, width; { tree d = grokbitfield (declarator, current_declspecs, width); ! cplus_decl_attributes (d, attributes, prefix_attributes); decl_type_access_control (d); return d; } --- 185,191 ---- tree declarator, attributes, width; { tree d = grokbitfield (declarator, current_declspecs, width); ! cplus_decl_attributes (&d, chainon (attributes, prefix_attributes), 0); decl_type_access_control (d); return d; } *************** parse_method (declarator, specs_attrs, l *** 206,211 **** --- 209,227 ---- return d; } + static void + check_class_key (key, aggr) + tree key; + tree aggr; + { + if (TREE_CODE (key) == TREE_LIST) + key = TREE_VALUE (key); + if ((key == union_type_node) != (TREE_CODE (aggr) == UNION_TYPE)) + pedwarn ("`%s' tag used in naming `%#T'", + key == union_type_node ? "union" + : key == record_type_node ? "struct" : "class", aggr); + } + void cp_parse_init () { *************** cp_parse_init () *** 259,264 **** --- 275,284 ---- yylval is the node for the constant. */ %token CONSTANT + /* __func__, __FUNCTION__ or __PRETTY_FUNCTION__. + yylval contains an IDENTIFIER_NODE which indicates which one. */ + %token VAR_FUNC_NAME + /* String constants in raw form. yylval is a STRING_CST node. */ %token STRING *************** cp_parse_init () *** 295,301 **** %nonassoc IF %nonassoc ELSE ! %left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD %left '{' ',' ';' --- 315,321 ---- %nonassoc IF %nonassoc ELSE ! %left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD ATTRIBUTE %left '{' ',' ';' *************** cp_parse_init () *** 379,389 **** %token PRE_PARSED_FUNCTION_DECL %type component_constructor_declarator %type fn.def2 return_id constructor_declarator ! %type ctor_initializer_opt function_try_block ! %type named_class_head_sans_basetype ! %type class_head named_class_head ! %type named_complex_class_head_sans_basetype ! %type unnamed_class_head %type base_class_list %type base_class_access_list %type base_class maybe_base_class_list base_class.1 --- 399,407 ---- %token PRE_PARSED_FUNCTION_DECL %type component_constructor_declarator %type fn.def2 return_id constructor_declarator ! %type .begin_function_body ! %type class_head class_head_apparent_template ! %type class_head_decl class_head_defn %type base_class_list %type base_class_access_list %type base_class maybe_base_class_list base_class.1 *************** cp_parse_init () *** 412,418 **** %type explicit_template_type /* in order to recognize aggr tags as defining and thus shadowing. */ %token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN - %type named_class_head_sans_basetype_defn %type identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN %type handler_args %type self_template_type .finish_template_type --- 430,435 ---- *************** extdef: *** 492,498 **** { do_pending_inlines (); } | EXPORT ! { cp_warning ("keyword `export' not implemented, and will be ignored"); } template_def { do_pending_inlines (); } | template_def --- 509,515 ---- { do_pending_inlines (); } | EXPORT ! { warning ("keyword `export' not implemented, and will be ignored"); } template_def { do_pending_inlines (); } | template_def *************** namespace_qualifier: *** 581,586 **** --- 598,604 ---- $$ = lastiddecl; got_scope = $$; } + ; any_id: unqualified_id *************** extern_lang_string: *** 596,602 **** { push_lang_context ($1); } | extern_lang_string EXTERN_LANG_STRING { if (current_lang_name != $2) ! cp_error ("use of linkage spec `%D' is different from previous spec `%D'", $2, current_lang_name); pop_lang_context (); push_lang_context ($2); } ; --- 614,620 ---- { push_lang_context ($1); } | extern_lang_string EXTERN_LANG_STRING { if (current_lang_name != $2) ! error ("use of linkage spec `%D' is different from previous spec `%D'", $2, current_lang_name); pop_lang_context (); push_lang_context ($2); } ; *************** maybe_identifier: *** 630,635 **** --- 648,654 ---- { $$ = $1; } | /* empty */ { $$ = NULL_TREE; } + ; template_type_parm: aggr maybe_identifier *************** template_parm: *** 665,671 **** { if (TREE_CODE ($3) != TEMPLATE_DECL && TREE_CODE ($3) != TEMPLATE_TEMPLATE_PARM ! && TREE_CODE ($3) != TYPE_DECL) { error ("invalid default template argument"); $3 = error_mark_node; --- 684,691 ---- { if (TREE_CODE ($3) != TEMPLATE_DECL && TREE_CODE ($3) != TEMPLATE_TEMPLATE_PARM ! && TREE_CODE ($3) != TYPE_DECL ! && TREE_CODE ($3) != UNBOUND_CLASS_TEMPLATE) { error ("invalid default template argument"); $3 = error_mark_node; *************** datadef: *** 732,746 **** } | error ';' | error '}' | ';' | bad_decl ; ctor_initializer_opt: nodecls - { $$ = 0; } | base_init - { $$ = 1; } ; maybe_return_init: --- 752,766 ---- } | error ';' | error '}' + | error END_OF_SAVED_INPUT + { end_input (); } | ';' | bad_decl ; ctor_initializer_opt: nodecls | base_init ; maybe_return_init: *************** eat_saved_input: *** 754,764 **** | END_OF_SAVED_INPUT ; fndef: ! fn.def1 maybe_return_init ctor_initializer_opt compstmt_or_error ! { expand_body (finish_function ((int)$3)); } | fn.def1 maybe_return_init function_try_block ! { expand_body (finish_function ((int)$3)); } | fn.def1 maybe_return_init error { } ; --- 774,798 ---- | END_OF_SAVED_INPUT ; + /* The outermost block of a function really begins before the + mem-initializer-list, so we open one there and suppress the one that + actually corresponds to the curly braces. */ + function_body: + .begin_function_body ctor_initializer_opt save_lineno '{' + { $$ = begin_compound_stmt (/*has_no_scope=*/1); } + compstmtend + { + STMT_LINENO ($5) = $3; + finish_compound_stmt (/*has_no_scope=*/1, $5); + finish_function_body ($1); + } + ; + fndef: ! fn.def1 maybe_return_init function_body ! { expand_body (finish_function (0)); } | fn.def1 maybe_return_init function_try_block ! { expand_body (finish_function (0)); } | fn.def1 maybe_return_init error { } ; *************** fn.def1: *** 817,827 **** YYERROR1; } ; component_constructor_declarator: ! SELFNAME '(' parmlist ')' cv_qualifiers exception_specification_opt ! { $$ = make_call_declarator ($1, $3, $5, $6); } ! | SELFNAME LEFT_RIGHT cv_qualifiers exception_specification_opt ! { $$ = make_call_declarator ($1, empty_parms (), $3, $4); } | self_template_type '(' parmlist ')' cv_qualifiers exception_specification_opt { $$ = make_call_declarator ($1, $3, $5, $6); } | self_template_type LEFT_RIGHT cv_qualifiers exception_specification_opt --- 851,869 ---- YYERROR1; } ; + /* ANSI allows optional parentheses around constructor class names. + See ISO/IEC 14882:1998(E) 12.1. */ + component_constructor_declarator: ! SELFNAME '(' parmlist ')' cv_qualifiers exception_specification_opt ! { $$ = make_call_declarator ($1, $3, $5, $6); } ! | '(' SELFNAME ')' '(' parmlist ')' cv_qualifiers ! exception_specification_opt ! { $$ = make_call_declarator ($2, $5, $7, $8); } ! | SELFNAME LEFT_RIGHT cv_qualifiers exception_specification_opt ! { $$ = make_call_declarator ($1, empty_parms (), $3, $4); } ! | '(' SELFNAME ')' LEFT_RIGHT cv_qualifiers exception_specification_opt ! { $$ = make_call_declarator ($2, empty_parms (), $5, $6); } | self_template_type '(' parmlist ')' cv_qualifiers exception_specification_opt { $$ = make_call_declarator ($1, $3, $5, $6); } | self_template_type LEFT_RIGHT cv_qualifiers exception_specification_opt *************** return_init: *** 873,897 **** ; base_init: ! ':' .set_base_init member_init_list { ! if ($3.new_type_flag == 0) error ("no base or member initializers given following ':'"); ! finish_mem_initializers ($3.t); } ; ! .set_base_init: /* empty */ { ! if (DECL_CONSTRUCTOR_P (current_function_decl)) ! /* Make a contour for the initializer list. */ ! do_pushlevel (); ! else if (current_class_type == NULL_TREE) ! error ("base initializers not allowed for non-member functions"); ! else if (! DECL_CONSTRUCTOR_P (current_function_decl)) ! error ("only constructors take base initializers"); } ; --- 915,935 ---- ; base_init: ! ':' member_init_list { ! if (! DECL_CONSTRUCTOR_P (current_function_decl)) ! error ("only constructors take base initializers"); ! else if ($2.new_type_flag == 0) error ("no base or member initializers given following ':'"); ! finish_mem_initializers ($2.t); } ; ! .begin_function_body: /* empty */ { ! $$ = begin_function_body (); } ; *************** explicit_instantiation: *** 1008,1016 **** --- 1046,1056 ---- begin_explicit_instantiation: { begin_explicit_instantiation(); } + ; end_explicit_instantiation: { end_explicit_instantiation(); } + ; /* The TYPENAME expansions are to deal with use of a template class name as a template within the class itself, where the template decl is hidden by *************** apparent_template_type: *** 1031,1036 **** --- 1071,1077 ---- | identifier '<' template_arg_list_opt '>' .finish_template_type { $$ = $5; } + ; self_template_type: SELFNAME '<' template_arg_list_opt template_close_bracket *************** self_template_type: *** 1046,1051 **** --- 1087,1093 ---- $$ = finish_template_type ($-3, $-1, yychar == SCOPE); } + ; template_close_bracket: '>' *************** template_arg: *** 1086,1091 **** --- 1128,1143 ---- $$ = TREE_TYPE ($$); } | expr_no_comma_rangle + | nested_name_specifier TEMPLATE identifier + { + if (!processing_template_decl) + { + error ("use of template qualifier outside template"); + $$ = error_mark_node; + } + else + $$ = make_unbound_class_template ($1, $3, 1); + } ; unop: *************** condition: *** 1141,1149 **** if (TREE_CODE (d) == TYPE_DECL) { tree s = TREE_TYPE (d); if (TREE_CODE (s) == RECORD_TYPE) ! cp_error ("definition of class `%T' in condition", s); else if (TREE_CODE (s) == ENUMERAL_TYPE) ! cp_error ("definition of enum `%T' in condition", s); } } current_declspecs = $1.t; --- 1193,1201 ---- if (TREE_CODE (d) == TYPE_DECL) { tree s = TREE_TYPE (d); if (TREE_CODE (s) == RECORD_TYPE) ! error ("definition of class `%T' in condition", s); else if (TREE_CODE (s) == ENUMERAL_TYPE) ! error ("definition of enum `%T' in condition", s); } } current_declspecs = $1.t; *************** condition: *** 1154,1160 **** parse_end_decl ($6, $7, $4); $$ = convert_from_reference ($6); if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE) ! cp_error ("definition of array `%#D' in condition", $$); } | expr ; --- 1206,1212 ---- parse_end_decl ($6, $7, $4); $$ = convert_from_reference ($6); if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE) ! error ("definition of array `%#D' in condition", $$); } | expr ; *************** compstmtend: *** 1166,1181 **** | maybe_label_decls error '}' ; - already_scoped_stmt: - save_lineno '{' - { $$ = begin_compound_stmt (1); } - compstmtend - { STMT_LINENO ($3) = $1; - finish_compound_stmt (1, $3); } - | save_lineno simple_stmt - { if ($2) STMT_LINENO ($2) = $1; } - ; - nontrivial_exprlist: expr_no_commas ',' expr_no_commas { $$ = tree_cons (NULL_TREE, $$, --- 1218,1223 ---- *************** unary_expr: *** 1212,1229 **** { $$ = finish_unary_op_expr ($1, $2); } /* Refer to the address of a label as a pointer. */ | ANDAND identifier ! { if (pedantic) ! pedwarn ("ISO C++ forbids `&&'"); ! $$ = finish_label_address_expr ($2); } | SIZEOF unary_expr %prec UNARY ! { $$ = expr_sizeof ($2); } | SIZEOF '(' type_id ')' %prec HYPERUNARY ! { $$ = c_sizeof (groktypename ($3.t)); check_for_new_type ("sizeof", $3); } | ALIGNOF unary_expr %prec UNARY ! { $$ = grok_alignof ($2); } | ALIGNOF '(' type_id ')' %prec HYPERUNARY ! { $$ = c_alignof (groktypename ($3.t)); check_for_new_type ("alignof", $3); } /* The %prec EMPTY's here are required by the = init initializer --- 1254,1269 ---- { $$ = finish_unary_op_expr ($1, $2); } /* Refer to the address of a label as a pointer. */ | ANDAND identifier ! { $$ = finish_label_address_expr ($2); } | SIZEOF unary_expr %prec UNARY ! { $$ = finish_sizeof ($2); } | SIZEOF '(' type_id ')' %prec HYPERUNARY ! { $$ = finish_sizeof (groktypename ($3.t)); check_for_new_type ("sizeof", $3); } | ALIGNOF unary_expr %prec UNARY ! { $$ = finish_alignof ($2); } | ALIGNOF '(' type_id ')' %prec HYPERUNARY ! { $$ = finish_alignof (groktypename ($3.t)); check_for_new_type ("alignof", $3); } /* The %prec EMPTY's here are required by the = init initializer *************** new_placement: *** 1275,1281 **** '(' nonnull_exprlist ')' { $$ = $2; } | '{' nonnull_exprlist '}' ! { cp_pedwarn ("old style placement syntax, use () instead"); $$ = $2; } ; --- 1315,1321 ---- '(' nonnull_exprlist ')' { $$ = $2; } | '{' nonnull_exprlist '}' ! { pedwarn ("old style placement syntax, use () instead"); $$ = $2; } ; *************** new_initializer: *** 1286,1292 **** { $$ = void_zero_node; } | '(' typespec ')' { ! cp_error ("`%T' is not a valid expression", $2.t); $$ = error_mark_node; } /* GNU extension so people can use initializer lists. Note that --- 1326,1332 ---- { $$ = void_zero_node; } | '(' typespec ')' { ! error ("`%T' is not a valid expression", $2.t); $$ = error_mark_node; } /* GNU extension so people can use initializer lists. Note that *************** do_id: *** 1467,1472 **** --- 1507,1513 ---- else $$ = $-1; } + ; template_id: PFUNCNAME '<' do_id template_arg_list_opt template_close_bracket *************** primary: *** 1548,1553 **** --- 1589,1600 ---- (TREE_TYPE (TREE_TYPE ($$)), TYPE_DOMAIN (TREE_TYPE ($$))); } + | VAR_FUNC_NAME + { + $$ = fname_decl (C_RID_CODE ($$), $$); + if (processing_template_decl) + $$ = build_min_nt (LOOKUP_EXPR, DECL_NAME ($$)); + } | '(' expr ')' { $$ = finish_parenthesized_expr ($2); } | '(' expr_or_declarator_intern ')' *************** primary: *** 1566,1572 **** pedwarn ("ISO C++ forbids braced-groups within expressions"); $$ = begin_stmt_expr (); } ! compstmt ')' { $$ = finish_stmt_expr ($2); } /* Koenig lookup support We could store lastiddecl in $1 to avoid another lookup, --- 1613,1619 ---- pedwarn ("ISO C++ forbids braced-groups within expressions"); $$ = begin_stmt_expr (); } ! compstmt_or_stmtexpr ')' { $$ = finish_stmt_expr ($2); } /* Koenig lookup support We could store lastiddecl in $1 to avoid another lookup, *************** primary: *** 1624,1630 **** | TYPEID '(' type_id ')' { tree type = groktypename ($3.t); check_for_new_type ("typeid", $3); ! $$ = get_typeid (TYPE_MAIN_VARIANT (type)); } | global_scope IDENTIFIER { $$ = do_scoped_id ($2, 1); } | global_scope template_id --- 1671,1677 ---- | TYPEID '(' type_id ')' { tree type = groktypename ($3.t); check_for_new_type ("typeid", $3); ! $$ = get_typeid (type); } | global_scope IDENTIFIER { $$ = do_scoped_id ($2, 1); } | global_scope template_id *************** primary_no_id: *** 1691,1697 **** YYERROR; } $$ = expand_start_stmt_expr (); } ! compstmt ')' { if (pedantic) pedwarn ("ISO C++ forbids braced-groups within expressions"); $$ = expand_end_stmt_expr ($2); } --- 1738,1744 ---- YYERROR; } $$ = expand_start_stmt_expr (); } ! compstmt_or_stmtexpr ')' { if (pedantic) pedwarn ("ISO C++ forbids braced-groups within expressions"); $$ = expand_end_stmt_expr ($2); } *************** string: *** 1746,1752 **** nodecls: /* empty */ { ! setup_vtbl_ptr (NULL_TREE, NULL_TREE); } ; --- 1793,1800 ---- nodecls: /* empty */ { ! if (DECL_CONSTRUCTOR_P (current_function_decl)) ! finish_mem_initializers (NULL_TREE); } ; *************** reserved_declspecs: *** 1868,1877 **** warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $$); } - | reserved_declspecs attributes - { $$ = tree_cons ($2, NULL_TREE, $1); } - | attributes - { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); } ; /* List of just storage classes and type modifiers. --- 1916,1921 ---- *************** declmods: *** 1911,1921 **** } | declmods attributes { $$.t = hash_tree_cons ($2, NULL_TREE, $1.t); } - | attributes %prec EMPTY - { - $$.t = hash_tree_cons ($1, NULL_TREE, NULL_TREE); - $$.new_type_flag = 0; $$.lookups = NULL_TREE; - } ; /* Used instead of declspecs where storage classes are not allowed --- 1955,1960 ---- *************** reserved_typespecquals: *** 1944,1949 **** --- 1983,1992 ---- { $$ = build_tree_list (NULL_TREE, $1.t); } | reserved_typespecquals typespecqual_reserved { $$ = tree_cons (NULL_TREE, $2.t, $1); } + | reserved_typespecquals attributes + { $$ = tree_cons ($2, NULL_TREE, $1); } + | attributes %prec EMPTY + { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); } ; /* A typespec (but not a type qualifier). *************** notype_initdcl0: *** 2076,2082 **** nomods_initdcl0: notype_declarator maybeasm { /* Set things up as initdcl0_innards expects. */ ! $3 = $2; $2 = $1; $1.t = NULL_TREE; $1.lookups = NULL_TREE; } --- 2119,2125 ---- nomods_initdcl0: notype_declarator maybeasm { /* Set things up as initdcl0_innards expects. */ ! $$ = $2; $2 = $1; $1.t = NULL_TREE; $1.lookups = NULL_TREE; } *************** maybe_init: *** 2151,2156 **** --- 2194,2200 ---- { $$ = NULL_TREE; } | '=' init { $$ = $2; } + ; /* If we are processing a template, we don't want to expand this initializer yet. */ *************** initlist: *** 2187,2200 **** ; pending_inline: ! PRE_PARSED_FUNCTION_DECL maybe_return_init ctor_initializer_opt compstmt_or_error { ! expand_body (finish_function ((int)$3 | 2)); process_next_inline ($1); } | PRE_PARSED_FUNCTION_DECL maybe_return_init function_try_block { ! expand_body (finish_function ((int)$3 | 2)); process_next_inline ($1); } | PRE_PARSED_FUNCTION_DECL maybe_return_init error --- 2231,2244 ---- ; pending_inline: ! PRE_PARSED_FUNCTION_DECL maybe_return_init function_body { ! expand_body (finish_function (2)); process_next_inline ($1); } | PRE_PARSED_FUNCTION_DECL maybe_return_init function_try_block { ! expand_body (finish_function (2)); process_next_inline ($1); } | PRE_PARSED_FUNCTION_DECL maybe_return_init error *************** defarg_again: *** 2215,2220 **** --- 2259,2265 ---- { replace_defarg ($1, $2); } | DEFARG_MARKER error END_OF_SAVED_INPUT { replace_defarg ($1, error_mark_node); } + ; pending_defargs: /* empty */ %prec EMPTY *************** structsp: *** 2253,2262 **** { $$.t = $2; $$.new_type_flag = 0; if (!processing_template_decl) ! cp_pedwarn ("using `typename' outside of template"); } /* C++ extensions, merged with C to avoid shift/reduce conflicts */ ! | class_head '{' ! { $1.t = begin_class_definition ($1.t); current_aggr = NULL_TREE; } opt.component_decl_list '}' maybe_attribute { --- 2298,2321 ---- { $$.t = $2; $$.new_type_flag = 0; if (!processing_template_decl) ! pedwarn ("using `typename' outside of template"); } /* C++ extensions, merged with C to avoid shift/reduce conflicts */ ! | class_head_defn maybe_base_class_list '{' ! { ! if ($2 && $1.t != error_mark_node) ! { ! tree type = TREE_TYPE ($1.t); ! ! if (TREE_CODE (type) == TYPENAME_TYPE) ! /* In a definition of a member class template, ! we will get here with an implicit typename, ! a TYPENAME_TYPE with a type. */ ! type = TREE_TYPE (type); ! maybe_process_partial_specialization (type); ! xref_basetypes (current_aggr, $1.t, type, $2); ! } ! $1.t = begin_class_definition (TREE_TYPE ($1.t)); ! check_class_key (current_aggr, $1.t); current_aggr = NULL_TREE; } opt.component_decl_list '}' maybe_attribute { *************** structsp: *** 2267,2274 **** yychar = YYLEX; semi = yychar == ';'; ! t = finish_class_definition ($1.t, $6, semi, ! $1.new_type_flag); $$ = t; /* restore current_aggr */ --- 2326,2332 ---- yychar = YYLEX; semi = yychar == ';'; ! t = finish_class_definition ($1.t, $7, semi, $1.new_type_flag); $$ = t; /* restore current_aggr */ *************** structsp: *** 2285,2316 **** pending_inlines { finish_inline_definitions (); ! $$.t = $7; $$.new_type_flag = 1; } ! | class_head %prec EMPTY { ! if ($1.new_type_flag && $1.t != error_mark_node) ! pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL ($1.t))); ! $$.new_type_flag = 0; ! if ($1.t == error_mark_node) ! $$.t = $1.t; ! else if (TYPE_BINFO ($1.t) == NULL_TREE) ! { ! cp_error ("%T is not a class type", $1.t); ! $$.t = error_mark_node; ! } ! else ! { ! $$.t = $1.t; ! /* struct B: public A; is not accepted by the standard grammar. */ ! if (CLASS_TYPE_P ($$.t) ! && TYPE_BINFO_BASETYPES ($$.t) ! && !COMPLETE_TYPE_P ($$.t) ! && ! TYPE_BEING_DEFINED ($$.t)) ! cp_error ("base clause without member specification for `%#T'", ! $$.t); ! } } ; --- 2343,2356 ---- pending_inlines { finish_inline_definitions (); ! $$.t = $8; $$.new_type_flag = 1; } ! | class_head_decl { ! $$.t = TREE_TYPE ($1.t); ! $$.new_type_flag = $1.new_type_flag; ! check_class_key (current_aggr, $$.t); } ; *************** aggr: *** 2340,2472 **** { $$ = build_tree_list ($2, $1); } ; ! named_class_head_sans_basetype: aggr identifier ! { ! current_aggr = $1; ! $$ = $2; } ! ; ! ! named_class_head_sans_basetype_defn: ! aggr identifier_defn %prec EMPTY ! { current_aggr = $$; $$ = $2; } ! | named_class_head_sans_basetype '{' ! { yyungetc ('{', 1); } ! | named_class_head_sans_basetype ':' ! { yyungetc (':', 1); } ! ; ! ! named_complex_class_head_sans_basetype: ! aggr nested_name_specifier identifier { current_aggr = $1; ! $$.t = handle_class_head ($1, $2, $3); ! $$.new_type_flag = 1; } | aggr global_scope nested_name_specifier identifier { current_aggr = $1; ! $$.t = handle_class_head ($1, $3, $4); ! $$.new_type_flag = 1; } | aggr global_scope identifier { current_aggr = $1; ! $$.t = handle_class_head ($1, NULL_TREE, $3); ! $$.new_type_flag = 1; } ! | aggr apparent_template_type { current_aggr = $1; ! $$.t = $2; ! $$.new_type_flag = 0; } | aggr nested_name_specifier apparent_template_type { current_aggr = $1; ! $$.t = $3; ! push_scope (CP_DECL_CONTEXT ($$.t)); ! $$.new_type_flag = 1; } ; ! named_class_head: ! named_class_head_sans_basetype %prec EMPTY ! { ! $$.t = xref_tag (current_aggr, $1, 1); ! $$.new_type_flag = 0; } ! | named_class_head_sans_basetype_defn ! { $$ = xref_tag (current_aggr, $1, 0); } ! /* Class name is unqualified, so we look for base classes ! in the current scope. */ ! maybe_base_class_list %prec EMPTY ! { ! $$.t = $2; ! $$.new_type_flag = 0; ! if ($3) ! xref_basetypes (current_aggr, $1, $2, $3); } ! | named_complex_class_head_sans_basetype ! maybe_base_class_list ! { ! if ($1.t != error_mark_node) ! { ! tree type = TREE_TYPE ($1.t); ! ! $$.t = type; ! $$.new_type_flag = $1.new_type_flag; ! if ((current_aggr == union_type_node) ! != (TREE_CODE (type) == UNION_TYPE)) ! cp_pedwarn (current_aggr == union_type_node ! ? "`union' tag used in declaring `%#T'" ! : "non-`union' tag used in declaring `%#T'", ! type); ! else if (TREE_CODE (type) == RECORD_TYPE) ! /* We might be specializing a template with a different ! class-key; deal. */ ! CLASSTYPE_DECLARED_CLASS (type) ! = (current_aggr == class_type_node); ! if ($2) ! { ! if (TREE_CODE (type) == TYPENAME_TYPE) ! /* In a definition of a member class template, we ! will get here with an implicit typename, a ! TYPENAME_TYPE with a type. */ ! type = TREE_TYPE (type); ! maybe_process_partial_specialization (type); ! xref_basetypes (current_aggr, $1.t, type, $2); ! } ! } } ; ! unnamed_class_head: ! aggr '{' ! { $$ = xref_tag ($$, make_anon_name (), 0); ! yyungetc ('{', 1); } ! ; ! ! /* The tree output of this nonterminal a declarationf or the type ! named. If NEW_TYPE_FLAG is set, then the name used in this ! class-head was explicitly qualified, e.g.: `struct X::Y'. We have ! already called push_scope for X. */ ! class_head: ! unnamed_class_head ! { $$.t = $1; $$.new_type_flag = 0; } - | named_class_head ; maybe_base_class_list: ! /* empty */ %prec EMPTY { $$ = NULL_TREE; } ! | ':' see_typename %prec EMPTY ! { yyungetc(':', 1); $$ = NULL_TREE; } ! | ':' see_typename base_class_list %prec EMPTY { $$ = $3; } ; --- 2380,2515 ---- { $$ = build_tree_list ($2, $1); } ; ! class_head: aggr identifier ! { ! current_aggr = $1; ! $$ = build_tree_list (NULL_TREE, $2); } ! | aggr nested_name_specifier identifier { current_aggr = $1; ! $$ = build_tree_list ($2, $3); } | aggr global_scope nested_name_specifier identifier { current_aggr = $1; ! $$ = build_tree_list ($3, $4); } | aggr global_scope identifier { current_aggr = $1; ! $$ = build_tree_list (global_namespace, $3); } ! ; ! ! class_head_apparent_template: ! aggr apparent_template_type { current_aggr = $1; ! $$ = $2; } | aggr nested_name_specifier apparent_template_type { current_aggr = $1; ! $$ = $3; ! } ! | aggr global_scope nested_name_specifier apparent_template_type ! { ! current_aggr = $1; ! $$ = $4; } ; ! class_head_decl: ! class_head %prec EMPTY ! { ! $$.t = handle_class_head (current_aggr, ! TREE_PURPOSE ($1), TREE_VALUE ($1), ! 0, &$$.new_type_flag); } ! | aggr identifier_defn %prec EMPTY ! { ! current_aggr = $1; ! $$.t = TYPE_MAIN_DECL (xref_tag (current_aggr, $2, 0)); ! $$.new_type_flag = 1; } ! | class_head_apparent_template %prec EMPTY ! { ! $$.t = $1; ! $$.new_type_flag = 0; } ; ! class_head_defn: ! class_head '{' ! { ! yyungetc ('{', 1); ! $$.t = handle_class_head (current_aggr, ! TREE_PURPOSE ($1), TREE_VALUE ($1), ! 1, &$$.new_type_flag); ! } ! | class_head ':' ! { ! yyungetc (':', 1); ! $$.t = handle_class_head (current_aggr, ! TREE_PURPOSE ($1), TREE_VALUE ($1), ! 1, &$$.new_type_flag); ! } ! | class_head_apparent_template '{' ! { ! yyungetc ('{', 1); $$.t = $1; $$.new_type_flag = 0; + if (TREE_CODE (TREE_TYPE ($1)) == RECORD_TYPE) + /* We might be specializing a template with a different + class-key. */ + CLASSTYPE_DECLARED_CLASS (TREE_TYPE ($1)) + = (current_aggr == class_type_node); + } + | class_head_apparent_template ':' + { + yyungetc (':', 1); + $$.t = $1; + $$.new_type_flag = 0; + if (TREE_CODE (TREE_TYPE ($1)) == RECORD_TYPE) + /* We might be specializing a template with a different + class-key. */ + CLASSTYPE_DECLARED_CLASS (TREE_TYPE ($1)) + = (current_aggr == class_type_node); + } + | aggr identifier_defn '{' + { + yyungetc ('{', 1); + current_aggr = $1; + $$.t = handle_class_head (current_aggr, + NULL_TREE, $2, + 1, &$$.new_type_flag); + } + | aggr identifier_defn ':' + { + yyungetc (':', 1); + current_aggr = $1; + $$.t = handle_class_head (current_aggr, + NULL_TREE, $2, + 1, &$$.new_type_flag); + } + | aggr '{' + { + current_aggr = $1; + $$.t = TYPE_MAIN_DECL (xref_tag ($1, make_anon_name (), 0)); + $$.new_type_flag = 0; + yyungetc ('{', 1); } ; maybe_base_class_list: ! /* empty */ { $$ = NULL_TREE; } ! | ':' see_typename ! { error ("no bases given following `:'"); ! $$ = NULL_TREE; } ! | ':' see_typename base_class_list { $$ = $3; } ; *************** base_class_access_list: *** 2495,2501 **** VISSPEC see_typename | SCSPEC see_typename { if ($1 != ridpointers[(int)RID_VIRTUAL]) ! cp_error ("`%D' access", $1); $$ = access_default_virtual_node; } | base_class_access_list VISSPEC see_typename { --- 2538,2544 ---- VISSPEC see_typename | SCSPEC see_typename { if ($1 != ridpointers[(int)RID_VIRTUAL]) ! error ("`%D' access", $1); $$ = access_default_virtual_node; } | base_class_access_list VISSPEC see_typename { *************** base_class_access_list: *** 2510,2516 **** } | base_class_access_list SCSPEC see_typename { if ($2 != ridpointers[(int)RID_VIRTUAL]) ! cp_error ("`%D' access", $2); else if ($$ == access_public_node) $$ = access_public_virtual_node; else if ($$ == access_protected_node) --- 2553,2559 ---- } | base_class_access_list SCSPEC see_typename { if ($2 != ridpointers[(int)RID_VIRTUAL]) ! error ("`%D' access", $2); else if ($$ == access_public_node) $$ = access_public_virtual_node; else if ($$ == access_protected_node) *************** component_decl_list: *** 2542,2552 **** --- 2585,2597 ---- { finish_member_declaration ($1); current_aggr = NULL_TREE; + reset_type_access_control (); } | component_decl_list component_decl { finish_member_declaration ($2); current_aggr = NULL_TREE; + reset_type_access_control (); } ; *************** component_decl_1: *** 2621,2631 **** $$ = NULL_TREE; } | notype_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, ! build_tree_list ($3, NULL_TREE)); } | constructor_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, ! build_tree_list ($3, NULL_TREE)); } | ':' expr_no_commas { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); } | error --- 2666,2674 ---- $$ = NULL_TREE; } | notype_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, $3); } | constructor_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, $3); } | ':' expr_no_commas { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); } | error *************** component_decl_1: *** 2643,2654 **** { tree specs, attrs; split_specs_attrs ($1.t, &specs, &attrs); $$ = grokfield ($2, specs, $5, $3, ! build_tree_list ($4, attrs)); } | component_constructor_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, ! build_tree_list ($3, NULL_TREE)); } | using_decl { $$ = do_class_using_decl ($1); } /* The case of exactly one component is handled directly by component_decl. */ /* ??? Huh? ^^^ */ --- 2686,2697 ---- { tree specs, attrs; split_specs_attrs ($1.t, &specs, &attrs); $$ = grokfield ($2, specs, $5, $3, ! chainon ($4, attrs)); } | component_constructor_declarator maybeasm maybe_attribute maybe_init ! { $$ = grokfield ($$, NULL_TREE, $4, $2, $3); } | using_decl { $$ = do_class_using_decl ($1); } + ; /* The case of exactly one component is handled directly by component_decl. */ /* ??? Huh? ^^^ */ *************** nonempty_cv_qualifiers: *** 2797,2802 **** --- 2840,2851 ---- | nonempty_cv_qualifiers CV_QUALIFIER { $$.t = hash_tree_cons (NULL_TREE, $2, $1.t); $$.new_type_flag = $1.new_type_flag; } + | attributes %prec EMPTY + { $$.t = hash_tree_cons ($1, NULL_TREE, NULL_TREE); + $$.new_type_flag = 0; } + | nonempty_cv_qualifiers attributes %prec EMPTY + { $$.t = hash_tree_cons ($2, NULL_TREE, $1.t); + $$.new_type_flag = $1.new_type_flag; } ; /* These rules must follow the rules for function declarations *************** nested_name_specifier: *** 3006,3012 **** { $$ = $2; } | nested_name_specifier TEMPLATE explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $3, /*complain=*/1); } ; /* Why the @#$%^& do type_name and notype_identifier need to be expanded --- 3055,3068 ---- { $$ = $2; } | nested_name_specifier TEMPLATE explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $3, tf_error); } ! /* Error handling per Core 125. */ ! | nested_name_specifier IDENTIFIER SCOPE ! { got_scope = $$ ! = make_typename_type ($1, $2, tf_error); } ! | nested_name_specifier PTYPENAME SCOPE ! { got_scope = $$ ! = make_typename_type ($1, $2, tf_error); } ; /* Why the @#$%^& do type_name and notype_identifier need to be expanded *************** nested_name_specifier_1: *** 3036,3051 **** } | template_type SCOPE { got_scope = $$ = complete_type (TREE_TYPE ($1)); } - /* These break 'const i;' - | IDENTIFIER SCOPE - { - failed_scope: - cp_error ("`%D' is not an aggregate typedef", - lastiddecl ? lastiddecl : $$); - $$ = error_mark_node; - } - | PTYPENAME SCOPE - { goto failed_scope; } */ ; typename_sub: --- 3092,3097 ---- *************** typename_sub0: *** 3058,3066 **** typename_sub1 identifier %prec EMPTY { if (TYPE_P ($1)) ! $$ = make_typename_type ($1, $2, /*complain=*/1); else if (TREE_CODE ($2) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", $2); else { $$ = $2; --- 3104,3112 ---- typename_sub1 identifier %prec EMPTY { if (TYPE_P ($1)) ! $$ = make_typename_type ($1, $2, tf_error); else if (TREE_CODE ($2) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", $2); else { $$ = $2; *************** typename_sub0: *** 3071,3095 **** | typename_sub1 template_type %prec EMPTY { $$ = TREE_TYPE ($2); } | typename_sub1 explicit_template_type %prec EMPTY ! { $$ = make_typename_type ($1, $2, /*complain=*/1); } | typename_sub1 TEMPLATE explicit_template_type %prec EMPTY ! { $$ = make_typename_type ($1, $3, /*complain=*/1); } ; typename_sub1: typename_sub2 { if (TREE_CODE ($1) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", $1); else if (TREE_CODE ($1) == TYPE_DECL) $$ = TREE_TYPE ($1); } | typename_sub1 typename_sub2 { if (TYPE_P ($1)) ! $$ = make_typename_type ($1, $2, /*complain=*/1); else if (TREE_CODE ($2) == IDENTIFIER_NODE) ! cp_error ("`%T' is not a class or namespace", $2); else { $$ = $2; --- 3117,3141 ---- | typename_sub1 template_type %prec EMPTY { $$ = TREE_TYPE ($2); } | typename_sub1 explicit_template_type %prec EMPTY ! { $$ = make_typename_type ($1, $2, tf_error); } | typename_sub1 TEMPLATE explicit_template_type %prec EMPTY ! { $$ = make_typename_type ($1, $3, tf_error); } ; typename_sub1: typename_sub2 { if (TREE_CODE ($1) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", $1); else if (TREE_CODE ($1) == TYPE_DECL) $$ = TREE_TYPE ($1); } | typename_sub1 typename_sub2 { if (TYPE_P ($1)) ! $$ = make_typename_type ($1, $2, tf_error); else if (TREE_CODE ($2) == IDENTIFIER_NODE) ! error ("`%T' is not a class or namespace", $2); else { $$ = $2; *************** typename_sub1: *** 3099,3108 **** } | typename_sub1 explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $2, /*complain=*/1); } | typename_sub1 TEMPLATE explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $3, /*complain=*/1); } ; /* This needs to return a TYPE_DECL for simple names so that we don't --- 3145,3154 ---- } | typename_sub1 explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $2, tf_error); } | typename_sub1 TEMPLATE explicit_template_type SCOPE { got_scope = $$ ! = make_typename_type ($1, $3, tf_error); } ; /* This needs to return a TYPE_DECL for simple names so that we don't *************** typename_sub2: *** 3118,3124 **** got_scope = complete_type (TREE_TYPE ($$)); if ($$ == error_mark_node) ! cp_error ("`%T' is not a class or namespace", $1); } | SELFNAME SCOPE { --- 3164,3170 ---- got_scope = complete_type (TREE_TYPE ($$)); if ($$ == error_mark_node) ! error ("`%T' is not a class or namespace", $1); } | SELFNAME SCOPE { *************** label_decl: *** 3304,3317 **** } ; ! /* This is the body of a function definition. ! It causes syntax errors to ignore to the next openbrace. */ ! compstmt_or_error: ! compstmt ! | error compstmt ! ; ! ! compstmt: save_lineno '{' { $$ = begin_compound_stmt (0); } compstmtend --- 3350,3356 ---- } ; ! compstmt_or_stmtexpr: save_lineno '{' { $$ = begin_compound_stmt (0); } compstmtend *************** compstmt: *** 3319,3324 **** --- 3358,3368 ---- finish_compound_stmt (0, $3); } ; + compstmt: + compstmt_or_stmtexpr + { last_expr_type = NULL_TREE; } + ; + simple_if: IF { $$ = begin_if_stmt (); *************** simple_stmt: *** 3370,3376 **** } paren_cond_or_null { finish_while_stmt_cond ($3, $2); } ! already_scoped_stmt { $$ = $2; finish_while_stmt ($2); } | DO --- 3414,3420 ---- } paren_cond_or_null { finish_while_stmt_cond ($3, $2); } ! implicitly_scoped_stmt { $$ = $2; finish_while_stmt ($2); } | DO *************** simple_stmt: *** 3391,3397 **** { finish_for_cond ($6, $2); } xexpr ')' { finish_for_expr ($9, $2); } ! already_scoped_stmt { $$ = $2; finish_for_stmt ($2); } | SWITCH --- 3435,3441 ---- { finish_for_cond ($6, $2); } xexpr ')' { finish_for_expr ($9, $2); } ! implicitly_scoped_stmt { $$ = $2; finish_for_stmt ($2); } | SWITCH *************** simple_stmt: *** 3475,3487 **** function_try_block: TRY { $$ = begin_function_try_block (); } ! ctor_initializer_opt compstmt { finish_function_try_block ($2); } handler_seq ! { ! finish_function_handler_sequence ($2); ! $$ = $3; ! } ; try_block: --- 3519,3528 ---- function_try_block: TRY { $$ = begin_function_try_block (); } ! function_body { finish_function_try_block ($2); } handler_seq ! { finish_function_handler_sequence ($2); } ; try_block: *************** try_block: *** 3496,3510 **** handler_seq: handler | handler_seq handler ; handler: CATCH ! { $$ = begin_handler(); } handler_args ! { $$ = finish_handler_parms ($3, $2); } compstmt ! { finish_handler ($4, $2); } ; type_specifier_seq: --- 3537,3560 ---- handler_seq: handler | handler_seq handler + | /* empty */ + { /* Generate a fake handler block to avoid later aborts. */ + tree fake_handler = begin_handler (); + finish_handler_parms (NULL_TREE, fake_handler); + finish_handler (fake_handler); + $$ = fake_handler; + + error ("must have at least one catch per try block"); + } ; handler: CATCH ! { $$ = begin_handler (); } handler_args ! { finish_handler_parms ($3, $2); } compstmt ! { finish_handler ($2); } ; type_specifier_seq: *************** nonnull_asm_operands: *** 3590,3596 **** asm_operand: STRING '(' expr ')' ! { $$ = build_tree_list ($$, $3); } ; asm_clobbers: --- 3640,3648 ---- asm_operand: STRING '(' expr ')' ! { $$ = build_tree_list (build_tree_list (NULL_TREE, $1), $3); } ! | '[' identifier ']' STRING '(' expr ')' ! { $$ = build_tree_list (build_tree_list ($2, $4), $6); } ; asm_clobbers: *************** named_parm: *** 3698,3706 **** /* Here we expand typed_declspecs inline to avoid mis-parsing of TYPESPEC IDENTIFIER. */ typed_declspecs1 declarator ! { tree specs = strip_attrs ($1.t); ! $$.new_type_flag = $1.new_type_flag; ! $$.t = build_tree_list (specs, $2); } | typed_typespecs declarator { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = $1.new_type_flag; } --- 3750,3757 ---- /* Here we expand typed_declspecs inline to avoid mis-parsing of TYPESPEC IDENTIFIER. */ typed_declspecs1 declarator ! { $$.new_type_flag = $1.new_type_flag; ! $$.t = build_tree_list ($1.t, $2); } | typed_typespecs declarator { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = $1.new_type_flag; } *************** named_parm: *** 3709,3724 **** $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 absdcl ! { tree specs = strip_attrs ($1.t); ! $$.t = build_tree_list (specs, $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 %prec EMPTY ! { tree specs = strip_attrs ($1.t); ! $$.t = build_tree_list (specs, NULL_TREE); $$.new_type_flag = $1.new_type_flag; } | declmods notype_declarator ! { tree specs = strip_attrs ($1.t); ! $$.t = build_tree_list (specs, $2); $$.new_type_flag = 0; } ; --- 3760,3772 ---- $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 absdcl ! { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 %prec EMPTY ! { $$.t = build_tree_list ($1.t, NULL_TREE); $$.new_type_flag = $1.new_type_flag; } | declmods notype_declarator ! { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = 0; } ; *************** bad_parm: *** 3749,3759 **** } | notype_declarator { ! error ("type specifier omitted for parameter"); ! if (TREE_CODE ($$) == SCOPE_REF ! && (TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TYPE_PARM ! || TREE_CODE (TREE_OPERAND ($$, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM)) ! cp_error (" perhaps you want `typename %E' to make it a type", $$); $$ = build_tree_list (integer_type_node, $$); } ; --- 3797,3812 ---- } | notype_declarator { ! if (TREE_CODE ($$) == SCOPE_REF) ! { ! if (TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TYPE_PARM ! || TREE_CODE (TREE_OPERAND ($$, 0)) == BOUND_TEMPLATE_TEMPLATE_PARM) ! error ("`%E' is not a type, use `typename %E' to make it one", $$); ! else ! error ("no type `%D' in `%T'", TREE_OPERAND ($$, 1), TREE_OPERAND ($$, 0)); ! } ! else ! error ("type specifier omitted for parameter `%E'", $$); $$ = build_tree_list (integer_type_node, $$); } ; *************** bad_parm: *** 3761,3767 **** bad_decl: IDENTIFIER template_arg_list_ignore IDENTIFIER arg_list_ignore ';' { ! cp_error("'%D' is used as a type, but is not defined as a type.", $1); $3 = error_mark_node; } ; --- 3814,3820 ---- bad_decl: IDENTIFIER template_arg_list_ignore IDENTIFIER arg_list_ignore ';' { ! error("'%D' is used as a type, but is not defined as a type.", $1); $3 = error_mark_node; } ; *************** ansi_raise_identifier: *** 3793,3798 **** --- 3846,3853 ---- check_for_new_type ("exception specifier", $1); $$ = groktypename ($1.t); } + | error + { $$ = error_mark_node; } ; ansi_raise_identifiers: diff -Nrc3pad gcc-3.0.4/gcc/cp/pt.c gcc-3.1/gcc/cp/pt.c *** gcc-3.0.4/gcc/cp/pt.c Thu Dec 6 12:54:16 2001 --- gcc-3.1/gcc/cp/pt.c Tue Apr 30 19:43:56 2002 *************** *** 1,6 **** /* Handle parameterized types (templates) for GNU C++. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001 Free Software Foundation, Inc. Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. Rewritten by Jason Merrill (jason@cygnus.com). --- 1,6 ---- /* Handle parameterized types (templates) for GNU C++. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ! 2001, 2002 Free Software Foundation, Inc. Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. Rewritten by Jason Merrill (jason@cygnus.com). *************** Boston, MA 02111-1307, USA. */ *** 29,38 **** #include "config.h" #include "system.h" #include "obstack.h" - #include "tree.h" #include "flags.h" #include "cp-tree.h" #include "decl.h" #include "parse.h" #include "lex.h" --- 29,38 ---- #include "config.h" #include "system.h" #include "obstack.h" #include "tree.h" #include "flags.h" #include "cp-tree.h" + #include "tree-inline.h" #include "decl.h" #include "parse.h" #include "lex.h" *************** extern struct obstack permanent_obstack; *** 57,66 **** (for a function or static data member), or a TYPE (for a class) indicating what we are hoping to instantiate. */ static tree pending_templates; ! static tree *template_tail = &pending_templates; ! ! static tree maybe_templates; ! static tree *maybe_template_tail = &maybe_templates; int processing_template_parmlist; static int template_header_count; --- 57,63 ---- (for a function or static data member), or a TYPE (for a class) indicating what we are hoping to instantiate. */ static tree pending_templates; ! static tree last_pending_template; int processing_template_parmlist; static int template_header_count; *************** static htab_t local_specializations; *** 87,92 **** --- 84,90 ---- #define UNIFY_ALLOW_OUTER_LEVEL 16 #define UNIFY_ALLOW_OUTER_MORE_CV_QUAL 32 #define UNIFY_ALLOW_OUTER_LESS_CV_QUAL 64 + #define UNIFY_ALLOW_MAX_CORRECTION 128 #define GTB_VIA_VIRTUAL 1 /* The base class we are examining is virtual, or a base class of a virtual *************** static htab_t local_specializations; *** 95,124 **** type with the desired type. */ static int resolve_overloaded_unification PARAMS ((tree, tree, tree, tree, ! unification_kind_t, int)); static int try_one_overload PARAMS ((tree, tree, tree, tree, tree, ! unification_kind_t, int)); static int unify PARAMS ((tree, tree, tree, tree, int)); static void add_pending_template PARAMS ((tree)); static void reopen_tinst_level PARAMS ((tree)); static tree classtype_mangled_name PARAMS ((tree)); ! static char *mangle_class_name_for_template PARAMS ((const char *, tree, tree)); static tree tsubst_initializer_list PARAMS ((tree, tree)); static int list_eq PARAMS ((tree, tree)); static tree get_class_bindings PARAMS ((tree, tree, tree)); ! static tree coerce_template_parms PARAMS ((tree, tree, tree, int, int)); static void tsubst_enum PARAMS ((tree, tree, tree)); static tree add_to_template_args PARAMS ((tree, tree)); static tree add_outermost_template_args PARAMS ((tree, tree)); static int maybe_adjust_types_for_deduction PARAMS ((unification_kind_t, tree*, ! tree*)); static int type_unification_real PARAMS ((tree, tree, tree, tree, ! int, unification_kind_t, int, int)); static void note_template_header PARAMS ((int)); static tree maybe_fold_nontype_arg PARAMS ((tree)); static tree convert_nontype_argument PARAMS ((tree, tree)); ! static tree convert_template_argument PARAMS ((tree, tree, tree, int, ! int , tree)); static tree get_bindings_overload PARAMS ((tree, tree, tree)); static int for_each_template_parm PARAMS ((tree, tree_fn_t, void*)); static tree build_template_parm_index PARAMS ((int, int, int, tree, tree)); --- 93,124 ---- type with the desired type. */ static int resolve_overloaded_unification PARAMS ((tree, tree, tree, tree, ! unification_kind_t, int)); static int try_one_overload PARAMS ((tree, tree, tree, tree, tree, ! unification_kind_t, int)); static int unify PARAMS ((tree, tree, tree, tree, int)); static void add_pending_template PARAMS ((tree)); static void reopen_tinst_level PARAMS ((tree)); static tree classtype_mangled_name PARAMS ((tree)); ! static char *mangle_class_name_for_template PARAMS ((const char *, ! tree, tree)); static tree tsubst_initializer_list PARAMS ((tree, tree)); static int list_eq PARAMS ((tree, tree)); static tree get_class_bindings PARAMS ((tree, tree, tree)); ! static tree coerce_template_parms PARAMS ((tree, tree, tree, ! tsubst_flags_t, int)); static void tsubst_enum PARAMS ((tree, tree, tree)); static tree add_to_template_args PARAMS ((tree, tree)); static tree add_outermost_template_args PARAMS ((tree, tree)); static int maybe_adjust_types_for_deduction PARAMS ((unification_kind_t, tree*, ! tree*)); static int type_unification_real PARAMS ((tree, tree, tree, tree, ! int, unification_kind_t, int, int)); static void note_template_header PARAMS ((int)); static tree maybe_fold_nontype_arg PARAMS ((tree)); static tree convert_nontype_argument PARAMS ((tree, tree)); ! static tree convert_template_argument PARAMS ((tree, tree, tree, ! tsubst_flags_t, int, tree)); static tree get_bindings_overload PARAMS ((tree, tree, tree)); static int for_each_template_parm PARAMS ((tree, tree_fn_t, void*)); static tree build_template_parm_index PARAMS ((int, int, int, tree, tree)); *************** static tree get_bindings_real PARAMS ((t *** 138,173 **** static int template_decl_level PARAMS ((tree)); static tree maybe_get_template_decl_from_type_decl PARAMS ((tree)); static int check_cv_quals_for_unify PARAMS ((int, tree, tree)); ! static tree tsubst_template_arg_vector PARAMS ((tree, tree, int)); ! static tree tsubst_template_parms PARAMS ((tree, tree, int)); static void regenerate_decl_from_template PARAMS ((tree, tree)); static tree most_specialized PARAMS ((tree, tree, tree)); static tree most_specialized_class PARAMS ((tree, tree)); static int template_class_depth_real PARAMS ((tree, int)); ! static tree tsubst_aggr_type PARAMS ((tree, tree, int, tree, int)); ! static tree tsubst_decl PARAMS ((tree, tree, tree)); ! static tree tsubst_arg_types PARAMS ((tree, tree, int, tree)); ! static tree tsubst_function_type PARAMS ((tree, tree, int, tree)); static void check_specialization_scope PARAMS ((void)); static tree process_partial_specialization PARAMS ((tree)); static void set_current_access_from_decl PARAMS ((tree)); static void check_default_tmpl_args PARAMS ((tree, tree, int, int)); ! static tree tsubst_call_declarator_parms PARAMS ((tree, tree, int, tree)); static tree get_template_base_recursive PARAMS ((tree, tree, ! tree, tree, tree, int)); static tree get_template_base PARAMS ((tree, tree, tree, tree)); static int verify_class_unification PARAMS ((tree, tree, tree)); static tree try_class_unification PARAMS ((tree, tree, tree, tree)); ! static int coerce_template_template_parms PARAMS ((tree, tree, int, ! tree, tree)); static tree determine_specialization PARAMS ((tree, tree, tree *, int)); static int template_args_equal PARAMS ((tree, tree)); static void tsubst_default_arguments PARAMS ((tree)); static tree for_each_template_parm_r PARAMS ((tree *, int *, void *)); - static tree instantiate_clone PARAMS ((tree, tree)); static tree copy_default_args_to_explicit_spec_1 PARAMS ((tree, tree)); static void copy_default_args_to_explicit_spec PARAMS ((tree)); ! static int invalid_nontype_parm_type_p PARAMS ((tree, int)); /* Called once to initialize pt.c. */ --- 138,173 ---- static int template_decl_level PARAMS ((tree)); static tree maybe_get_template_decl_from_type_decl PARAMS ((tree)); static int check_cv_quals_for_unify PARAMS ((int, tree, tree)); ! static tree tsubst_template_arg_vector PARAMS ((tree, tree, tsubst_flags_t)); ! static tree tsubst_template_parms PARAMS ((tree, tree, tsubst_flags_t)); static void regenerate_decl_from_template PARAMS ((tree, tree)); static tree most_specialized PARAMS ((tree, tree, tree)); static tree most_specialized_class PARAMS ((tree, tree)); static int template_class_depth_real PARAMS ((tree, int)); ! static tree tsubst_aggr_type PARAMS ((tree, tree, tsubst_flags_t, tree, int)); ! static tree tsubst_decl PARAMS ((tree, tree, tree, tsubst_flags_t)); ! static tree tsubst_arg_types PARAMS ((tree, tree, tsubst_flags_t, tree)); ! static tree tsubst_function_type PARAMS ((tree, tree, tsubst_flags_t, tree)); static void check_specialization_scope PARAMS ((void)); static tree process_partial_specialization PARAMS ((tree)); static void set_current_access_from_decl PARAMS ((tree)); static void check_default_tmpl_args PARAMS ((tree, tree, int, int)); ! static tree tsubst_call_declarator_parms PARAMS ((tree, tree, ! tsubst_flags_t, tree)); static tree get_template_base_recursive PARAMS ((tree, tree, ! tree, tree, tree, int)); static tree get_template_base PARAMS ((tree, tree, tree, tree)); static int verify_class_unification PARAMS ((tree, tree, tree)); static tree try_class_unification PARAMS ((tree, tree, tree, tree)); ! static int coerce_template_template_parms PARAMS ((tree, tree, tsubst_flags_t, ! tree, tree)); static tree determine_specialization PARAMS ((tree, tree, tree *, int)); static int template_args_equal PARAMS ((tree, tree)); static void tsubst_default_arguments PARAMS ((tree)); static tree for_each_template_parm_r PARAMS ((tree *, int *, void *)); static tree copy_default_args_to_explicit_spec_1 PARAMS ((tree, tree)); static void copy_default_args_to_explicit_spec PARAMS ((tree)); ! static int invalid_nontype_parm_type_p PARAMS ((tree, tsubst_flags_t)); /* Called once to initialize pt.c. */ *************** void *** 175,181 **** init_pt () { ggc_add_tree_root (&pending_templates, 1); - ggc_add_tree_root (&maybe_templates, 1); ggc_add_tree_root (&saved_trees, 1); ggc_add_tree_root (¤t_tinst_level, 1); } --- 175,180 ---- *************** finish_member_template_decl (decl) *** 209,215 **** return NULL_TREE; } else if (TREE_CODE (decl) == FIELD_DECL) ! cp_error ("data member `%D' cannot be a member template", decl); else if (DECL_TEMPLATE_INFO (decl)) { if (!DECL_TEMPLATE_SPECIALIZATION (decl)) --- 208,214 ---- return NULL_TREE; } else if (TREE_CODE (decl) == FIELD_DECL) ! error ("data member `%D' cannot be a member template", decl); else if (DECL_TEMPLATE_INFO (decl)) { if (!DECL_TEMPLATE_SPECIALIZATION (decl)) *************** finish_member_template_decl (decl) *** 221,227 **** return decl; } else ! cp_error ("invalid member template declaration `%D'", decl); return error_mark_node; } --- 220,226 ---- return decl; } else ! error ("invalid member template declaration `%D'", decl); return error_mark_node; } *************** push_inline_template_parms_recursive (pa *** 356,362 **** break; default: ! my_friendly_abort (0); } } } --- 355,361 ---- break; default: ! abort (); } } } *************** check_specialization_scope () *** 616,622 **** shall be declared in the namespace of which the class template is a member. */ if (scope && TREE_CODE (scope) != NAMESPACE_DECL) ! cp_error ("explicit specialization in non-namespace scope `%D'", scope); /* [temp.expl.spec] --- 615,621 ---- shall be declared in the namespace of which the class template is a member. */ if (scope && TREE_CODE (scope) != NAMESPACE_DECL) ! error ("explicit specialization in non-namespace scope `%D'", scope); /* [temp.expl.spec] *************** check_specialization_scope () *** 628,634 **** explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well. */ if (current_template_parms) ! cp_error ("enclosing class templates are not explicitly specialized"); } /* We've just seen template <>. */ --- 627,633 ---- explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well. */ if (current_template_parms) ! error ("enclosing class templates are not explicitly specialized"); } /* We've just seen template <>. */ *************** maybe_process_partial_specialization (ty *** 703,709 **** if (current_namespace != decl_namespace_context (CLASSTYPE_TI_TEMPLATE (type))) { ! cp_pedwarn ("specializing `%#T' in different namespace", type); cp_pedwarn_at (" from definition of `%#D'", CLASSTYPE_TI_TEMPLATE (type)); } --- 702,708 ---- if (current_namespace != decl_namespace_context (CLASSTYPE_TI_TEMPLATE (type))) { ! pedwarn ("specializing `%#T' in different namespace", type); cp_pedwarn_at (" from definition of `%#D'", CLASSTYPE_TI_TEMPLATE (type)); } *************** maybe_process_partial_specialization (ty *** 712,721 **** push_template_decl (TYPE_MAIN_DECL (type)); } else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)) ! cp_error ("specialization of `%T' after instantiation", type); } else if (processing_specialization) ! cp_error ("explicit specialization of non-template `%T'", type); } /* Retrieve the specialization (in the sense of [temp.spec] - a --- 711,720 ---- push_template_decl (TYPE_MAIN_DECL (type)); } else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)) ! error ("specialization of `%T' after instantiation", type); } else if (processing_specialization) ! error ("explicit specialization of non-template `%T'", type); } /* Retrieve the specialization (in the sense of [temp.spec] - a *************** register_specialization (spec, tmpl, arg *** 847,853 **** if (TREE_USED (fn) || DECL_EXPLICIT_INSTANTIATION (fn)) { ! cp_error ("specialization of %D after instantiation", fn); return spec; } --- 846,852 ---- if (TREE_USED (fn) || DECL_EXPLICIT_INSTANTIATION (fn)) { ! error ("specialization of %D after instantiation", fn); return spec; } *************** determine_specialization (template_id, d *** 1001,1007 **** if (!is_overloaded_fn (fns)) { ! cp_error ("`%D' is not a function template", fns); return error_mark_node; } --- 1000,1006 ---- if (!is_overloaded_fn (fns)) { ! error ("`%D' is not a function template", fns); return error_mark_node; } *************** determine_specialization (template_id, d *** 1026,1031 **** --- 1025,1033 ---- /* This is just an ordinary non-member function. Nothing can be a specialization of that. */ continue; + else if (DECL_ARTIFICIAL (fn)) + /* Cannot specialize functions that are created implicitly. */ + continue; else { tree decl_arg_types; *************** determine_specialization (template_id, d *** 1040,1045 **** --- 1042,1053 ---- Here, S::f is a non-template, but S is a template class. If FN has the same type as DECL, we might be in business. */ + + if (!DECL_TEMPLATE_INFO (fn)) + /* Its enclosing class is an explicit specialization + of a template class. This is not a candidate. */ + continue; + if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)), TREE_TYPE (TREE_TYPE (fn)))) /* The return types differ. */ *************** check_explicit_specialization (declarato *** 1350,1356 **** /* This case handles bogus declarations like template <> template void f(); */ ! cp_error ("template-id `%D' in declaration of primary template", declarator); return decl; } --- 1358,1364 ---- /* This case handles bogus declarations like template <> template void f(); */ ! error ("template-id `%D' in declaration of primary template", declarator); return decl; } *************** check_explicit_specialization (declarato *** 1363,1381 **** return error_mark_node; case tsk_invalid_expl_inst: ! cp_error ("template parameter list used in explicit instantiation"); /* Fall through. */ case tsk_expl_inst: if (have_def) ! cp_error ("definition provided for explicit instantiation"); explicit_instantiation = 1; break; case tsk_excessive_parms: ! cp_error ("too many template parameter lists in declaration of `%D'", decl); return error_mark_node; --- 1371,1389 ---- return error_mark_node; case tsk_invalid_expl_inst: ! error ("template parameter list used in explicit instantiation"); /* Fall through. */ case tsk_expl_inst: if (have_def) ! error ("definition provided for explicit instantiation"); explicit_instantiation = 1; break; case tsk_excessive_parms: ! error ("too many template parameter lists in declaration of `%D'", decl); return error_mark_node; *************** check_explicit_specialization (declarato *** 1391,1397 **** case tsk_insufficient_parms: if (template_header_count) { ! cp_error("too few template parameter lists in declaration of `%D'", decl); return decl; } --- 1399,1405 ---- case tsk_insufficient_parms: if (template_header_count) { ! error("too few template parameter lists in declaration of `%D'", decl); return decl; } *************** check_explicit_specialization (declarato *** 1407,1413 **** That used to be legal C++. */ if (pedantic) ! cp_pedwarn ("explicit specialization not preceded by `template <>'"); specialization = 1; SET_DECL_TEMPLATE_SPECIALIZATION (decl); --- 1415,1421 ---- That used to be legal C++. */ if (pedantic) ! pedwarn ("explicit specialization not preceded by `template <>'"); specialization = 1; SET_DECL_TEMPLATE_SPECIALIZATION (decl); *************** check_explicit_specialization (declarato *** 1421,1430 **** template void f(); */ if (uses_template_parms (declarator)) ! cp_error ("partial specialization `%D' of function template", declarator); else ! cp_error ("template-id `%D' in declaration of primary template", declarator); return decl; } --- 1429,1438 ---- template void f(); */ if (uses_template_parms (declarator)) ! error ("partial specialization `%D' of function template", declarator); else ! error ("template-id `%D' in declaration of primary template", declarator); return decl; } *************** check_explicit_specialization (declarato *** 1443,1449 **** break; default: ! my_friendly_abort (20000309); } if (specialization || member_specialization) --- 1451,1457 ---- break; default: ! abort (); } if (specialization || member_specialization) *************** check_explicit_specialization (declarato *** 1452,1463 **** for (; t; t = TREE_CHAIN (t)) if (TREE_PURPOSE (t)) { ! cp_pedwarn ("default argument specified in explicit specialization"); break; } if (current_lang_name == lang_name_c) ! cp_error ("template specialization with C linkage"); } if (specialization || member_specialization || explicit_instantiation) --- 1460,1471 ---- for (; t; t = TREE_CHAIN (t)) if (TREE_PURPOSE (t)) { ! pedwarn ("default argument specified in explicit specialization"); break; } if (current_lang_name == lang_name_c) ! error ("template specialization with C linkage"); } if (specialization || member_specialization || explicit_instantiation) *************** check_explicit_specialization (declarato *** 1545,1551 **** program is ill-formed. Similar language is found in [temp.explicit]. */ ! cp_error ("specialization of implicitly-declared special member function"); return error_mark_node; } --- 1553,1559 ---- program is ill-formed. Similar language is found in [temp.explicit]. */ ! error ("specialization of implicitly-declared special member function"); return error_mark_node; } *************** check_explicit_specialization (declarato *** 1588,1594 **** if (fns == NULL_TREE) { ! cp_error ("no member function `%D' declared in `%T'", name, ctype); return error_mark_node; } --- 1596,1602 ---- if (fns == NULL_TREE) { ! error ("no member function `%D' declared in `%T'", name, ctype); return error_mark_node; } *************** check_explicit_specialization (declarato *** 1671,1676 **** --- 1679,1689 ---- DECL is specializing. */ copy_default_args_to_explicit_spec (decl); + /* This specialization has the same protection as the + template it specializes. */ + TREE_PRIVATE (decl) = TREE_PRIVATE (gen_tmpl); + TREE_PROTECTED (decl) = TREE_PROTECTED (gen_tmpl); + if (is_friend && !have_def) /* This is not really a declaration of a specialization. It's just the name of an instantiation. But, it's not *************** maybe_check_template_type (type) *** 1731,1737 **** ; else if (template_header_count > context_depth + 1) /* There are two many template parameter lists. */ ! cp_error ("too many template parameter lists in declaration of `%T'", type); } } --- 1744,1750 ---- ; else if (template_header_count > context_depth + 1) /* There are two many template parameter lists. */ ! error ("too many template parameter lists in declaration of `%T'", type); } } *************** process_template_parm (list, next) *** 1924,1930 **** my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260); /* is a const-param */ parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), ! PARM, 0, NULL_TREE); /* [temp.param] --- 1937,1944 ---- my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260); /* is a const-param */ parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), ! PARM, 0, NULL); ! SET_DECL_TEMPLATE_PARM_P (parm); /* [temp.param] *************** end_template_parm_list (parms) *** 1988,2004 **** tree parms; { int nparms; ! tree parm; tree saved_parmlist = make_tree_vec (list_length (parms)); current_template_parms = tree_cons (size_int (processing_template_decl), saved_parmlist, current_template_parms); ! for (parm = parms, nparms = 0; ! parm; ! parm = TREE_CHAIN (parm), nparms++) ! TREE_VEC_ELT (saved_parmlist, nparms) = parm; --processing_template_parmlist; --- 2002,2020 ---- tree parms; { int nparms; ! tree parm, next; tree saved_parmlist = make_tree_vec (list_length (parms)); current_template_parms = tree_cons (size_int (processing_template_decl), saved_parmlist, current_template_parms); ! for (parm = parms, nparms = 0; parm; parm = next, nparms++) ! { ! next = TREE_CHAIN (parm); ! TREE_VEC_ELT (saved_parmlist, nparms) = parm; ! TREE_CHAIN (parm) = NULL_TREE; ! } --processing_template_parmlist; *************** process_partial_specialization (decl) *** 2228,2238 **** specialization. */ if (!did_error_intro) { ! cp_error ("template parameters not used in partial specialization:"); did_error_intro = 1; } ! cp_error (" `%D'", TREE_VALUE (TREE_VEC_ELT (inner_parms, i))); } --- 2244,2254 ---- specialization. */ if (!did_error_intro) { ! error ("template parameters not used in partial specialization:"); did_error_intro = 1; } ! error (" `%D'", TREE_VALUE (TREE_VEC_ELT (inner_parms, i))); } *************** process_partial_specialization (decl) *** 2244,2250 **** (inner_args, INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (TREE_TYPE (maintmpl))))) ! cp_error ("partial specialization `%T' does not specialize any template arguments", type); /* [temp.class.spec] --- 2260,2266 ---- (inner_args, INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (TREE_TYPE (maintmpl))))) ! error ("partial specialization `%T' does not specialize any template arguments", type); /* [temp.class.spec] *************** process_partial_specialization (decl) *** 2269,2275 **** && TREE_CODE (arg) != TEMPLATE_PARM_INDEX) { if (tpd.arg_uses_template_parms[i]) ! cp_error ("template argument `%E' involves template parameter(s)", arg); else { /* Look at the corresponding template parameter, --- 2285,2291 ---- && TREE_CODE (arg) != TEMPLATE_PARM_INDEX) { if (tpd.arg_uses_template_parms[i]) ! error ("template argument `%E' involves template parameter(s)", arg); else { /* Look at the corresponding template parameter, *************** process_partial_specialization (decl) *** 2312,2318 **** if (tpd2.parms[j] != 0 && tpd.arg_uses_template_parms [j]) { ! cp_error ("type `%T' of template argument `%E' depends on template parameter(s)", type, arg); break; --- 2328,2334 ---- if (tpd2.parms[j] != 0 && tpd.arg_uses_template_parms [j]) { ! error ("type `%T' of template argument `%E' depends on template parameter(s)", type, arg); break; *************** check_default_tmpl_args (decl, parms, is *** 2400,2406 **** seen_def_arg_p = 1; else if (seen_def_arg_p) { ! cp_error ("no default argument for `%D'", TREE_VALUE (parm)); /* For better subsequent error-recovery, we indicate that there should have been a default argument. */ TREE_PURPOSE (parm) = error_mark_node; --- 2416,2422 ---- seen_def_arg_p = 1; else if (seen_def_arg_p) { ! error ("no default argument for `%D'", TREE_VALUE (parm)); /* For better subsequent error-recovery, we indicate that there should have been a default argument. */ TREE_PURPOSE (parm) = error_mark_node; *************** check_default_tmpl_args (decl, parms, is *** 2430,2438 **** /* Figure out what error message to issue. */ if (TREE_CODE (decl) == FUNCTION_DECL) ! msg = "default argument for template parameter in function template `%D'"; else if (is_partial) ! msg = "default argument in partial specialization `%D'"; else msg = "default argument for template parameter for class enclosing `%D'"; --- 2446,2454 ---- /* Figure out what error message to issue. */ if (TREE_CODE (decl) == FUNCTION_DECL) ! msg = "default template arguments may not be used in function templates"; else if (is_partial) ! msg = "default template arguments may not be used in partial specializations"; else msg = "default argument for template parameter for class enclosing `%D'"; *************** check_default_tmpl_args (decl, parms, is *** 2464,2470 **** { if (msg) { ! cp_error (msg, decl); msg = 0; } --- 2480,2486 ---- { if (msg) { ! error (msg, decl); msg = 0; } *************** push_template_decl_real (decl, is_friend *** 2533,2549 **** if (primary) { if (current_lang_name == lang_name_c) ! cp_error ("template with C linkage"); else if (TREE_CODE (decl) == TYPE_DECL && ANON_AGGRNAME_P (DECL_NAME (decl))) ! cp_error ("template class without a name"); else if ((DECL_IMPLICIT_TYPEDEF_P (decl) && CLASS_TYPE_P (TREE_TYPE (decl))) || (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx)) || TREE_CODE (decl) == FUNCTION_DECL) /* OK */; else ! cp_error ("template declaration of `%#D'", decl); } /* Check to see that the rules regarding the use of default --- 2549,2565 ---- if (primary) { if (current_lang_name == lang_name_c) ! error ("template with C linkage"); else if (TREE_CODE (decl) == TYPE_DECL && ANON_AGGRNAME_P (DECL_NAME (decl))) ! error ("template class without a name"); else if ((DECL_IMPLICIT_TYPEDEF_P (decl) && CLASS_TYPE_P (TREE_TYPE (decl))) || (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx)) || TREE_CODE (decl) == FUNCTION_DECL) /* OK */; else ! error ("template declaration of `%#D'", decl); } /* Check to see that the rules regarding the use of default *************** push_template_decl_real (decl, is_friend *** 2558,2564 **** if (!ctx || TREE_CODE (ctx) == FUNCTION_DECL ! || TYPE_BEING_DEFINED (ctx) || (is_friend && !DECL_TEMPLATE_INFO (decl))) { if (DECL_LANG_SPECIFIC (decl) --- 2574,2582 ---- if (!ctx || TREE_CODE (ctx) == FUNCTION_DECL ! || (TREE_CODE (ctx) != TEMPLATE_TYPE_PARM ! && TREE_CODE (ctx) != BOUND_TEMPLATE_TEMPLATE_PARM ! && TYPE_BEING_DEFINED (ctx)) || (is_friend && !DECL_TEMPLATE_INFO (decl))) { if (DECL_LANG_SPECIFIC (decl) *************** push_template_decl_real (decl, is_friend *** 2611,2623 **** tmpl = TYPE_TI_TEMPLATE (TREE_TYPE (decl)); else { ! cp_error ("`%D' does not declare a template type", decl); return decl; } } ! else if (! DECL_TEMPLATE_INFO (decl)) { ! cp_error ("template definition of non-template `%#D'", decl); return decl; } else --- 2629,2641 ---- tmpl = TYPE_TI_TEMPLATE (TREE_TYPE (decl)); else { ! error ("`%D' does not declare a template type", decl); return decl; } } ! else if (!DECL_LANG_SPECIFIC (decl) || !DECL_TEMPLATE_INFO (decl)) { ! error ("template definition of non-template `%#D'", decl); return decl; } else *************** push_template_decl_real (decl, is_friend *** 2658,2664 **** i = TMPL_PARMS_DEPTH (parms); if (TMPL_ARGS_DEPTH (args) != i) { ! cp_error ("expected %d levels of template parms for `%#D', got %d", i, decl, TMPL_ARGS_DEPTH (args)); } else --- 2676,2682 ---- i = TMPL_PARMS_DEPTH (parms); if (TMPL_ARGS_DEPTH (args) != i) { ! error ("expected %d levels of template parms for `%#D', got %d", i, decl, TMPL_ARGS_DEPTH (args)); } else *************** push_template_decl_real (decl, is_friend *** 2670,2681 **** if (TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a)) { if (current == decl) ! cp_error ("got %d template parameters for `%#D'", TREE_VEC_LENGTH (a), decl); else ! cp_error ("got %d template parameters for `%#T'", TREE_VEC_LENGTH (a), current); ! cp_error (" but %d required", TREE_VEC_LENGTH (t)); } /* Perhaps we should also check that the parms are used in the --- 2688,2699 ---- if (TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a)) { if (current == decl) ! error ("got %d template parameters for `%#D'", TREE_VEC_LENGTH (a), decl); else ! error ("got %d template parameters for `%#T'", TREE_VEC_LENGTH (a), current); ! error (" but %d required", TREE_VEC_LENGTH (t)); } /* Perhaps we should also check that the parms are used in the *************** redeclare_class_template (type, parms) *** 2743,2749 **** if (!TYPE_TEMPLATE_INFO (type)) { ! cp_error ("`%T' is not a template type", type); return; } --- 2761,2767 ---- if (!TYPE_TEMPLATE_INFO (type)) { ! error ("`%T' is not a template type", type); return; } *************** redeclare_class_template (type, parms) *** 2760,2766 **** if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms)) { cp_error_at ("previous declaration `%D'", tmpl); ! cp_error ("used %d template parameter%s instead of %d", TREE_VEC_LENGTH (tmpl_parms), TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s", TREE_VEC_LENGTH (parms)); --- 2778,2784 ---- if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms)) { cp_error_at ("previous declaration `%D'", tmpl); ! error ("used %d template parameter%s instead of %d", TREE_VEC_LENGTH (tmpl_parms), TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s", TREE_VEC_LENGTH (parms)); *************** redeclare_class_template (type, parms) *** 2777,2783 **** if (TREE_CODE (tmpl_parm) != TREE_CODE (parm)) { cp_error_at ("template parameter `%#D'", tmpl_parm); ! cp_error ("redeclared here as `%#D'", parm); return; } --- 2795,2801 ---- if (TREE_CODE (tmpl_parm) != TREE_CODE (parm)) { cp_error_at ("template parameter `%#D'", tmpl_parm); ! error ("redeclared here as `%#D'", parm); return; } *************** redeclare_class_template (type, parms) *** 2787,2793 **** A template-parameter may not be given default arguments by two different declarations in the same scope. */ ! cp_error ("redefinition of default argument for `%#D'", parm); cp_error_at (" original definition appeared here", tmpl_parm); return; } --- 2805,2811 ---- A template-parameter may not be given default arguments by two different declarations in the same scope. */ ! error ("redefinition of default argument for `%#D'", parm); cp_error_at (" original definition appeared here", tmpl_parm); return; } *************** convert_nontype_argument (type, expr) *** 2881,2897 **** if (TREE_CODE (e) != ADDR_EXPR) { bad_argument: ! cp_error ("`%E' is not a valid template argument", expr); if (TYPE_PTR_P (expr_type)) { if (TREE_CODE (TREE_TYPE (expr_type)) == FUNCTION_TYPE) ! cp_error ("it must be the address of a function with external linkage"); else ! cp_error ("it must be the address of an object with external linkage"); } else if (TYPE_PTRMEM_P (expr_type) || TYPE_PTRMEMFUNC_P (expr_type)) ! cp_error ("it must be a pointer-to-member of the form `&X::Y'"); return NULL_TREE; } --- 2899,2915 ---- if (TREE_CODE (e) != ADDR_EXPR) { bad_argument: ! error ("`%E' is not a valid template argument", expr); if (TYPE_PTR_P (expr_type)) { if (TREE_CODE (TREE_TYPE (expr_type)) == FUNCTION_TYPE) ! error ("it must be the address of a function with external linkage"); else ! error ("it must be the address of an object with external linkage"); } else if (TYPE_PTRMEM_P (expr_type) || TYPE_PTRMEMFUNC_P (expr_type)) ! error ("it must be a pointer-to-member of the form `&X::Y'"); return NULL_TREE; } *************** convert_nontype_argument (type, expr) *** 2902,2908 **** if (TREE_CODE (referent) == STRING_CST) { ! cp_error ("string literal %E is not a valid template argument because it is the address of an object with static linkage", referent); return NULL_TREE; } --- 2920,2926 ---- if (TREE_CODE (referent) == STRING_CST) { ! error ("string literal %E is not a valid template argument because it is the address of an object with static linkage", referent); return NULL_TREE; } *************** convert_nontype_argument (type, expr) *** 2914,2941 **** goto bad_argument; else if (!DECL_EXTERNAL_LINKAGE_P (referent)) { ! cp_error ("address of non-extern `%E' cannot be used as template argument", referent); return error_mark_node; } } else if (INTEGRAL_TYPE_P (expr_type) || TYPE_PTRMEM_P (expr_type) ! || TYPE_PTRMEMFUNC_P (expr_type) ! /* The next two are g++ extensions. */ ! || TREE_CODE (expr_type) == REAL_TYPE ! || TREE_CODE (expr_type) == COMPLEX_TYPE) { if (! TREE_CONSTANT (expr)) { non_constant: ! cp_error ("non-constant `%E' cannot be used as template argument", expr); return NULL_TREE; } } else { ! cp_error ("object `%E' cannot be used as template argument", expr); return NULL_TREE; } --- 2932,2956 ---- goto bad_argument; else if (!DECL_EXTERNAL_LINKAGE_P (referent)) { ! error ("address of non-extern `%E' cannot be used as template argument", referent); return error_mark_node; } } else if (INTEGRAL_TYPE_P (expr_type) || TYPE_PTRMEM_P (expr_type) ! || TYPE_PTRMEMFUNC_P (expr_type)) { if (! TREE_CONSTANT (expr)) { non_constant: ! error ("non-constant `%E' cannot be used as template argument", expr); return NULL_TREE; } } else { ! error ("object `%E' cannot be used as template argument", expr); return NULL_TREE; } *************** convert_nontype_argument (type, expr) *** 2962,2980 **** return expr; - case REAL_TYPE: - case COMPLEX_TYPE: - /* These are g++ extensions. */ - if (TREE_CODE (expr_type) != TREE_CODE (type)) - return error_mark_node; - - expr = digest_init (type, expr, (tree*) 0); - - if (TREE_CODE (expr) != REAL_CST) - goto non_constant; - - return expr; - case POINTER_TYPE: { tree type_pointed_to = TREE_TYPE (type); --- 2977,2982 ---- *************** convert_nontype_argument (type, expr) *** 3014,3020 **** else fns = expr; ! fn = instantiate_type (type_pointed_to, fns, itf_none); if (fn == error_mark_node) return error_mark_node; --- 3016,3022 ---- else fns = expr; ! fn = instantiate_type (type_pointed_to, fns, tf_none); if (fn == error_mark_node) return error_mark_node; *************** convert_nontype_argument (type, expr) *** 3079,3085 **** set (_over.over_). */ tree fn; ! fn = instantiate_type (type_referred_to, expr, itf_none); if (fn == error_mark_node) return error_mark_node; --- 3081,3087 ---- set (_over.over_). */ tree fn; ! fn = instantiate_type (type_referred_to, expr, tf_none); if (fn == error_mark_node) return error_mark_node; *************** convert_nontype_argument (type, expr) *** 3148,3154 **** if (TREE_CODE (expr) != ADDR_EXPR) return error_mark_node; ! expr = instantiate_type (type, expr, itf_none); if (expr == error_mark_node) return error_mark_node; --- 3150,3156 ---- if (TREE_CODE (expr) != ADDR_EXPR) return error_mark_node; ! expr = instantiate_type (type, expr, tf_none); if (expr == error_mark_node) return error_mark_node; *************** convert_nontype_argument (type, expr) *** 3161,3167 **** default: /* All non-type parameters must have one of these types. */ ! my_friendly_abort (0); break; } --- 3163,3169 ---- default: /* All non-type parameters must have one of these types. */ ! abort (); break; } *************** static int *** 3189,3195 **** coerce_template_template_parms (parm_parms, arg_parms, complain, in_decl, outer_args) tree parm_parms, arg_parms; ! int complain; tree in_decl, outer_args; { int nparms, nargs, i; --- 3191,3197 ---- coerce_template_template_parms (parm_parms, arg_parms, complain, in_decl, outer_args) tree parm_parms, arg_parms; ! tsubst_flags_t complain; tree in_decl, outer_args; { int nparms, nargs, i; *************** coerce_template_template_parms (parm_par *** 3250,3256 **** break; default: ! my_friendly_abort (0); } } return 1; --- 3252,3258 ---- break; default: ! abort (); } } return 1; *************** coerce_template_template_parms (parm_par *** 3258,3274 **** /* Convert the indicated template ARG as necessary to match the indicated template PARM. Returns the converted ARG, or ! error_mark_node if the conversion was unsuccessful. Error messages ! are issued if COMPLAIN is non-zero. This conversion is for the Ith ! parameter in the parameter list. ARGS is the full set of template ! arguments deduced so far. */ static tree convert_template_argument (parm, arg, args, complain, i, in_decl) tree parm; tree arg; tree args; ! int complain; int i; tree in_decl; { --- 3260,3276 ---- /* Convert the indicated template ARG as necessary to match the indicated template PARM. Returns the converted ARG, or ! error_mark_node if the conversion was unsuccessful. Error and ! warning messages are issued under control of COMPLAIN. This ! conversion is for the Ith parameter in the parameter list. ARGS is ! the full set of template arguments deduced so far. */ static tree convert_template_argument (parm, arg, args, complain, i, in_decl) tree parm; tree arg; tree args; ! tsubst_flags_t complain; int i; tree in_decl; { *************** convert_template_argument (parm, arg, ar *** 3295,3317 **** requires_type = (TREE_CODE (parm) == TYPE_DECL || requires_tmpl_type); ! /* Check if it is a class template. If REQUIRES_TMPL_TYPE is true, ! we also accept implicitly created TYPE_DECL as a valid argument. ! This is necessary to handle the case where we pass a template name ! to a template template parameter in a scope where we've derived from ! in instantiation of that template, so the template name refers to that ! instantiation. We really ought to handle this better. */ ! is_tmpl_type ! = ((TREE_CODE (arg) == TEMPLATE_DECL ! && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL) ! || TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM ! || (TREE_CODE (arg) == RECORD_TYPE ! && CLASSTYPE_TEMPLATE_INFO (arg) ! && TREE_CODE (TYPE_NAME (arg)) == TYPE_DECL ! && DECL_ARTIFICIAL (TYPE_NAME (arg)) ! && requires_tmpl_type ! && is_base_of_enclosing_class (arg, current_class_type))); ! if (is_tmpl_type && TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM) arg = TYPE_STUB_DECL (arg); else if (is_tmpl_type && TREE_CODE (arg) == RECORD_TYPE) arg = CLASSTYPE_TI_TEMPLATE (arg); --- 3297,3326 ---- requires_type = (TREE_CODE (parm) == TYPE_DECL || requires_tmpl_type); ! if (TREE_CODE (arg) != RECORD_TYPE) ! is_tmpl_type = ((TREE_CODE (arg) == TEMPLATE_DECL ! && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL) ! || TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM ! || TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE); ! else if (CLASSTYPE_TEMPLATE_INFO (arg) && !CLASSTYPE_USE_TEMPLATE (arg) ! && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (arg))) ! { ! if (is_base_of_enclosing_class (arg, current_class_type)) ! /* This is a template name used within the scope of the ! template. It could be the template, or it could be the ! instantiation. Choose whichever makes sense. */ ! is_tmpl_type = requires_tmpl_type; ! else ! is_tmpl_type = 1; ! } ! else ! /* It is a non-template class, or a specialization of a template ! class, or a non-template member of a template class. */ ! is_tmpl_type = 0; ! ! if (is_tmpl_type ! && (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM ! || TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE)) arg = TYPE_STUB_DECL (arg); else if (is_tmpl_type && TREE_CODE (arg) == RECORD_TYPE) arg = CLASSTYPE_TI_TEMPLATE (arg); *************** convert_template_argument (parm, arg, ar *** 3321,3361 **** if (requires_type && ! is_type && TREE_CODE (arg) == SCOPE_REF && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM) { ! cp_pedwarn ("to refer to a type member of a template parameter, use `typename %E'", arg); arg = make_typename_type (TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1), ! complain); is_type = 1; } if (is_type != requires_type) { if (in_decl) { ! if (complain) { ! cp_error ("type/value mismatch at argument %d in template parameter list for `%D'", i + 1, in_decl); if (is_type) ! cp_error (" expected a constant of type `%T', got `%T'", TREE_TYPE (parm), (is_tmpl_type ? DECL_NAME (arg) : arg)); else ! cp_error (" expected a type, got `%E'", arg); } } return error_mark_node; } if (is_tmpl_type ^ requires_tmpl_type) { ! if (in_decl && complain) { ! cp_error ("type/value mismatch at argument %d in template parameter list for `%D'", i + 1, in_decl); if (is_tmpl_type) ! cp_error (" expected a type, got `%T'", DECL_NAME (arg)); else ! cp_error (" expected a class template, got `%T'", arg); } return error_mark_node; } --- 3330,3370 ---- if (requires_type && ! is_type && TREE_CODE (arg) == SCOPE_REF && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM) { ! pedwarn ("to refer to a type member of a template parameter, use `typename %E'", arg); arg = make_typename_type (TREE_OPERAND (arg, 0), TREE_OPERAND (arg, 1), ! complain & tf_error); is_type = 1; } if (is_type != requires_type) { if (in_decl) { ! if (complain & tf_error) { ! error ("type/value mismatch at argument %d in template parameter list for `%D'", i + 1, in_decl); if (is_type) ! error (" expected a constant of type `%T', got `%T'", TREE_TYPE (parm), (is_tmpl_type ? DECL_NAME (arg) : arg)); else ! error (" expected a type, got `%E'", arg); } } return error_mark_node; } if (is_tmpl_type ^ requires_tmpl_type) { ! if (in_decl && (complain & tf_error)) { ! error ("type/value mismatch at argument %d in template parameter list for `%D'", i + 1, in_decl); if (is_tmpl_type) ! error (" expected a type, got `%T'", DECL_NAME (arg)); else ! error (" expected a class template, got `%T'", arg); } return error_mark_node; } *************** convert_template_argument (parm, arg, ar *** 3364,3393 **** { if (requires_tmpl_type) { ! tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm); ! tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg); ! ! if (coerce_template_template_parms (parmparm, argparm, complain, ! in_decl, inner_args)) ! { ! val = arg; ! ! /* TEMPLATE_TEMPLATE_PARM node is preferred over ! TEMPLATE_DECL. */ ! if (val != error_mark_node ! && DECL_TEMPLATE_TEMPLATE_PARM_P (val)) ! val = TREE_TYPE (val); ! } else { ! if (in_decl && complain) { ! cp_error ("type/value mismatch at argument %d in template parameter list for `%D'", ! i + 1, in_decl); ! cp_error (" expected a template of type `%D', got `%D'", parm, arg); } ! val = error_mark_node; } } else --- 3373,3410 ---- { if (requires_tmpl_type) { ! if (TREE_CODE (TREE_TYPE (arg)) == UNBOUND_CLASS_TEMPLATE) ! /* The number of argument required is not known yet. ! Just accept it for now. */ ! val = TREE_TYPE (arg); else { ! tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm); ! tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg); ! ! if (coerce_template_template_parms (parmparm, argparm, ! complain, in_decl, ! inner_args)) { ! val = arg; ! ! /* TEMPLATE_TEMPLATE_PARM node is preferred over ! TEMPLATE_DECL. */ ! if (val != error_mark_node ! && DECL_TEMPLATE_TEMPLATE_PARM_P (val)) ! val = TREE_TYPE (val); } + else + { + if (in_decl && (complain & tf_error)) + { + error ("type/value mismatch at argument %d in template parameter list for `%D'", + i + 1, in_decl); + error (" expected a template of type `%D', got `%D'", parm, arg); + } ! val = error_mark_node; ! } } } else *************** convert_template_argument (parm, arg, ar *** 3404,3413 **** if (t) { if (TYPE_ANONYMOUS_P (t)) ! cp_pedwarn ("template-argument `%T' uses anonymous type", val); else ! cp_error ("template-argument `%T' uses local type `%T'", val, t); return error_mark_node; --- 3421,3430 ---- if (t) { if (TYPE_ANONYMOUS_P (t)) ! pedwarn ("template-argument `%T' uses anonymous type", val); else ! error ("template-argument `%T' uses local type `%T'", val, t); return error_mark_node; *************** convert_template_argument (parm, arg, ar *** 3442,3449 **** if (val == NULL_TREE) val = error_mark_node; ! else if (val == error_mark_node && complain) ! cp_error ("could not convert template argument `%E' to `%T'", arg, t); } --- 3459,3466 ---- if (val == NULL_TREE) val = error_mark_node; ! else if (val == error_mark_node && (complain & tf_error)) ! error ("could not convert template argument `%E' to `%T'", arg, t); } *************** convert_template_argument (parm, arg, ar *** 3452,3461 **** /* Convert all template arguments to their appropriate types, and return a vector containing the innermost resulting template ! arguments. If any error occurs, return error_mark_node, and, if ! COMPLAIN is non-zero, issue an error message. Some error messages ! are issued even if COMPLAIN is zero; for instance, if a template ! argument is composed from a local class. If REQUIRE_ALL_ARGUMENTS is non-zero, all arguments must be provided in ARGLIST, or else trailing parameters must have default --- 3469,3478 ---- /* Convert all template arguments to their appropriate types, and return a vector containing the innermost resulting template ! arguments. If any error occurs, return error_mark_node. Error and ! warning messages are issued under control of COMPLAIN. Some error ! messages are issued even if COMPLAIN is zero; for instance, if a ! template argument is composed from a local class. If REQUIRE_ALL_ARGUMENTS is non-zero, all arguments must be provided in ARGLIST, or else trailing parameters must have default *************** coerce_template_parms (parms, args, in_d *** 3468,3474 **** require_all_arguments) tree parms, args; tree in_decl; ! int complain; int require_all_arguments; { int nparms, nargs, i, lost = 0; --- 3485,3491 ---- require_all_arguments) tree parms, args; tree in_decl; ! tsubst_flags_t complain; int require_all_arguments; { int nparms, nargs, i, lost = 0; *************** coerce_template_parms (parms, args, in_d *** 3485,3493 **** && require_all_arguments && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE)) { ! if (complain) { ! cp_error ("wrong number of template arguments (%d, should be %d)", nargs, nparms); if (in_decl) --- 3502,3510 ---- && require_all_arguments && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE)) { ! if (complain & tf_error) { ! error ("wrong number of template arguments (%d, should be %d)", nargs, nparms); if (in_decl) *************** coerce_template_parms (parms, args, in_d *** 3538,3544 **** } else if (arg == error_mark_node) { ! cp_error ("template argument %d is invalid", i + 1); arg = error_mark_node; } else --- 3555,3561 ---- } else if (arg == error_mark_node) { ! error ("template argument %d is invalid", i + 1); arg = error_mark_node; } else *************** mangle_class_name_for_template (name, pa *** 3618,3625 **** obstack_free (&scratch_obstack, scratch_firstobj); scratch_firstobj = obstack_alloc (&scratch_obstack, 1); ! #define ccat(c) obstack_1grow (&scratch_obstack, (c)); ! #define cat(s) obstack_grow (&scratch_obstack, (s), strlen (s)) cat (name); ccat ('<'); --- 3635,3642 ---- obstack_free (&scratch_obstack, scratch_firstobj); scratch_firstobj = obstack_alloc (&scratch_obstack, 1); ! #define ccat(C) obstack_1grow (&scratch_obstack, (C)); ! #define cat(S) obstack_grow (&scratch_obstack, (S), strlen (S)) cat (name); ccat ('<'); *************** add_pending_template (d) *** 3729,3734 **** --- 3746,3752 ---- tree ti = (TYPE_P (d) ? CLASSTYPE_TEMPLATE_INFO (d) : DECL_TEMPLATE_INFO (d)); + tree pt; int level; if (TI_PENDING_TEMPLATE_FLAG (ti)) *************** add_pending_template (d) *** 3742,3749 **** if (level) push_tinst_level (d); ! *template_tail = tree_cons (current_tinst_level, d, NULL_TREE); ! template_tail = &TREE_CHAIN (*template_tail); TI_PENDING_TEMPLATE_FLAG (ti) = 1; if (level) --- 3760,3773 ---- if (level) push_tinst_level (d); ! pt = tree_cons (current_tinst_level, d, NULL_TREE); ! if (last_pending_template) ! TREE_CHAIN (last_pending_template) = pt; ! else ! pending_templates = pt; ! ! last_pending_template = pt; ! TI_PENDING_TEMPLATE_FLAG (ti) = 1; if (level) *************** lookup_template_function (fns, arglist) *** 3763,3769 **** if (fns == NULL_TREE) { ! cp_error ("non-template used as template"); return error_mark_node; } --- 3787,3793 ---- if (fns == NULL_TREE) { ! error ("non-template used as template"); return error_mark_node; } *************** maybe_get_template_decl_from_type_decl ( *** 3810,3816 **** If ENTERING_SCOPE is non-zero, we are about to enter the scope of the class we are looking up. ! If COMPLAIN is non-zero, issue error messages. If the template class is really a local class in a template function, then the FUNCTION_CONTEXT is the function in which it is --- 3834,3840 ---- If ENTERING_SCOPE is non-zero, we are about to enter the scope of the class we are looking up. ! Issue error and warning messages under control of COMPLAIN. If the template class is really a local class in a template function, then the FUNCTION_CONTEXT is the function in which it is *************** lookup_template_class (d1, arglist, in_d *** 3822,3828 **** tree in_decl; tree context; int entering_scope; ! int complain; { tree template = NULL_TREE, parmlist; tree t; --- 3846,3852 ---- tree in_decl; tree context; int entering_scope; ! tsubst_flags_t complain; { tree template = NULL_TREE, parmlist; tree t; *************** lookup_template_class (d1, arglist, in_d *** 3880,3887 **** crash. Alternatively D1 might not be a template type at all. */ if (! template) { ! if (complain) ! cp_error ("`%T' is not a template", d1); return error_mark_node; } --- 3904,3911 ---- crash. Alternatively D1 might not be a template type at all. */ if (! template) { ! if (complain & tf_error) ! error ("`%T' is not a template", d1); return error_mark_node; } *************** lookup_template_class (d1, arglist, in_d *** 3892,3900 **** && !DECL_TEMPLATE_PARM_P (template) && !PRIMARY_TEMPLATE_P (template))) { ! if (complain) { ! cp_error ("non-template type `%T' used as a template", d1); if (in_decl) cp_error_at ("for template declaration `%D'", in_decl); } --- 3916,3924 ---- && !DECL_TEMPLATE_PARM_P (template) && !PRIMARY_TEMPLATE_P (template))) { ! if (complain & tf_error) { ! error ("non-template type `%T' used as a template", d1); if (in_decl) cp_error_at ("for template declaration `%D'", in_decl); } *************** lookup_template_class (d1, arglist, in_d *** 3911,3923 **** parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template); arglist2 = coerce_template_parms (parmlist, arglist, template, complain, /*require_all_args=*/1); if (arglist2 == error_mark_node) return error_mark_node; ! parm = copy_template_template_parm (TREE_TYPE (template), arglist2); ! TYPE_SIZE (parm) = 0; return parm; } else --- 3935,3959 ---- parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template); + /* Consider an example where a template template parameter declared as + + template > class TT + + The template parameter level of T and U are one level larger than + of TT. To proper process the default argument of U, say when an + instantiation `TT' is seen, we need to build the full + arguments containing {int} as the innermost level. Outer levels + can be obtained from `current_template_args ()'. */ + + if (processing_template_decl) + arglist = add_to_template_args (current_template_args (), arglist); + arglist2 = coerce_template_parms (parmlist, arglist, template, complain, /*require_all_args=*/1); if (arglist2 == error_mark_node) return error_mark_node; ! parm = bind_template_template_parm (TREE_TYPE (template), arglist2); return parm; } else *************** lookup_template_class (d1, arglist, in_d *** 3956,3962 **** arg_depth = TMPL_ARGS_DEPTH (arglist); } ! /* Now we should enough arguments. */ my_friendly_assert (parm_depth == arg_depth, 0); /* From here on, we're only interested in the most general --- 3992,3998 ---- arg_depth = TMPL_ARGS_DEPTH (arglist); } ! /* Now we should have enough arguments. */ my_friendly_assert (parm_depth == arg_depth, 0); /* From here on, we're only interested in the most general *************** lookup_template_class (d1, arglist, in_d *** 4078,4084 **** } context = tsubst (DECL_CONTEXT (template), arglist, ! /*complain=*/0, in_decl); if (!context) context = global_namespace; --- 4114,4120 ---- } context = tsubst (DECL_CONTEXT (template), arglist, ! complain, in_decl); if (!context) context = global_namespace; *************** lookup_template_class (d1, arglist, in_d *** 4185,4191 **** Create the partial instantiation. */ TREE_VEC_LENGTH (arglist)--; ! found = tsubst (template, arglist, /*complain=*/0, NULL_TREE); TREE_VEC_LENGTH (arglist)++; } } --- 4221,4227 ---- Create the partial instantiation. */ TREE_VEC_LENGTH (arglist)--; ! found = tsubst (template, arglist, complain, NULL_TREE); TREE_VEC_LENGTH (arglist)++; } } *************** push_tinst_level (d) *** 4447,4453 **** return 0; last_template_error_tick = tinst_level_tick; ! cp_error ("template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN to increase the maximum) instantiating `%D'", max_tinst_depth, d); print_instantiation_context (); --- 4483,4489 ---- return 0; last_template_error_tick = tinst_level_tick; ! error ("template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN to increase the maximum) instantiating `%D'", max_tinst_depth, d); print_instantiation_context (); *************** tsubst_friend_function (decl, args) *** 4552,4571 **** tree template_id, arglist, fns; tree new_args; tree tmpl; ! tree ns = CP_DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type)); /* Friend functions are looked up in the containing namespace scope. We must enter that scope, to avoid finding member functions of the current cless with same name. */ push_nested_namespace (ns); fns = tsubst_expr (DECL_TI_TEMPLATE (decl), args, ! /*complain=*/1, NULL_TREE); pop_nested_namespace (ns); arglist = tsubst (DECL_TI_ARGS (decl), args, ! /*complain=*/1, NULL_TREE); template_id = lookup_template_function (fns, arglist); ! new_friend = tsubst (decl, args, /*complain=*/1, NULL_TREE); tmpl = determine_specialization (template_id, new_friend, &new_args, /*need_member_template=*/0); --- 4588,4607 ---- tree template_id, arglist, fns; tree new_args; tree tmpl; ! tree ns = decl_namespace_context (TYPE_MAIN_DECL (current_class_type)); /* Friend functions are looked up in the containing namespace scope. We must enter that scope, to avoid finding member functions of the current cless with same name. */ push_nested_namespace (ns); fns = tsubst_expr (DECL_TI_TEMPLATE (decl), args, ! tf_error | tf_warning, NULL_TREE); pop_nested_namespace (ns); arglist = tsubst (DECL_TI_ARGS (decl), args, ! tf_error | tf_warning, NULL_TREE); template_id = lookup_template_function (fns, arglist); ! new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE); tmpl = determine_specialization (template_id, new_friend, &new_args, /*need_member_template=*/0); *************** tsubst_friend_function (decl, args) *** 4573,4579 **** goto done; } ! new_friend = tsubst (decl, args, /*complain=*/1, NULL_TREE); /* The NEW_FRIEND will look like an instantiation, to the compiler, but is not an instantiation from the point of view of --- 4609,4615 ---- goto done; } ! new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE); /* The NEW_FRIEND will look like an instantiation, to the compiler, but is not an instantiation from the point of view of *************** tsubst_friend_class (friend_tmpl, args) *** 4760,4775 **** { tree friend_type; tree tmpl; /* First, we look for a class template. */ tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0); ! /* But, if we don't find one, it might be because we're in a situation like this: template struct S { ! template friend struct S; }; --- 4796,4822 ---- { tree friend_type; tree tmpl; + tree context; + + context = DECL_CONTEXT (friend_tmpl); + + if (context) + { + if (TREE_CODE (context) == NAMESPACE_DECL) + push_nested_namespace (context); + else + push_nested_class (context, 2); + } /* First, we look for a class template. */ tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0); ! /* But, if we don't find one, it might be because we're in a situation like this: template struct S { ! template friend struct S; }; *************** tsubst_friend_class (friend_tmpl, args) *** 4789,4800 **** of course. We only need the innermost template parameters because that is all that redeclare_class_template will look at. */ ! tree parms ! = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl), ! args, /*complain=*/1); ! if (!parms) ! return error_mark_node; ! redeclare_class_template (TREE_TYPE (tmpl), parms); friend_type = TREE_TYPE (tmpl); } else --- 4836,4850 ---- of course. We only need the innermost template parameters because that is all that redeclare_class_template will look at. */ ! if (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (friend_tmpl)) ! > TMPL_ARGS_DEPTH (args)) ! { ! tree parms; ! parms = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl), ! args, tf_error | tf_warning); ! redeclare_class_template (TREE_TYPE (tmpl), parms); ! } ! friend_type = TREE_TYPE (tmpl); } else *************** tsubst_friend_class (friend_tmpl, args) *** 4802,4808 **** /* The friend template has not already been declared. In this case, the instantiation of the template class will cause the injection of this template into the global scope. */ ! tmpl = tsubst (friend_tmpl, args, /*complain=*/1, NULL_TREE); /* The new TMPL is not an instantiation of anything, so we forget its origins. We don't reset CLASSTYPE_TI_TEMPLATE for --- 4852,4858 ---- /* The friend template has not already been declared. In this case, the instantiation of the template class will cause the injection of this template into the global scope. */ ! tmpl = tsubst (friend_tmpl, args, tf_error | tf_warning, NULL_TREE); /* The new TMPL is not an instantiation of anything, so we forget its origins. We don't reset CLASSTYPE_TI_TEMPLATE for *************** tsubst_friend_class (friend_tmpl, args) *** 4816,4821 **** --- 4866,4879 ---- friend_type = TREE_TYPE (pushdecl_top_level (tmpl)); } + if (context) + { + if (TREE_CODE (context) == NAMESPACE_DECL) + pop_nested_namespace (context); + else + pop_nested_class (); + } + return friend_type; } *************** instantiate_class_template (type) *** 4882,4888 **** if (t == error_mark_node) { const char *str = "candidates are:"; ! cp_error ("ambiguous class template instantiation for `%#T'", type); for (t = DECL_TEMPLATE_SPECIALIZATIONS (template); t; t = TREE_CHAIN (t)) { --- 4940,4946 ---- if (t == error_mark_node) { const char *str = "candidates are:"; ! error ("ambiguous class template instantiation for `%#T'", type); for (t = DECL_TEMPLATE_SPECIALIZATIONS (template); t; t = TREE_CHAIN (t)) { *************** instantiate_class_template (type) *** 4971,4994 **** { CLASSTYPE_INTERFACE_ONLY (type) = interface_only; SET_CLASSTYPE_INTERFACE_UNKNOWN_X (type, interface_unknown); - CLASSTYPE_VTABLE_NEEDS_WRITING (type) - = (! CLASSTYPE_INTERFACE_ONLY (type) - && CLASSTYPE_INTERFACE_KNOWN (type)); } else { CLASSTYPE_INTERFACE_ONLY (type) = CLASSTYPE_INTERFACE_ONLY (pattern); SET_CLASSTYPE_INTERFACE_UNKNOWN_X (type, CLASSTYPE_INTERFACE_UNKNOWN (pattern)); - CLASSTYPE_VTABLE_NEEDS_WRITING (type) - = (! CLASSTYPE_INTERFACE_ONLY (type) - && CLASSTYPE_INTERFACE_KNOWN (type)); } } else { SET_CLASSTYPE_INTERFACE_UNKNOWN (type); - CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1; } TYPE_HAS_CONSTRUCTOR (type) = TYPE_HAS_CONSTRUCTOR (pattern); --- 5029,5045 ---- *************** instantiate_class_template (type) *** 4999,5005 **** TYPE_HAS_NEW_OPERATOR (type) = TYPE_HAS_NEW_OPERATOR (pattern); TYPE_HAS_ARRAY_NEW_OPERATOR (type) = TYPE_HAS_ARRAY_NEW_OPERATOR (pattern); TYPE_GETS_DELETE (type) = TYPE_GETS_DELETE (pattern); - TYPE_VEC_DELETE_TAKES_SIZE (type) = TYPE_VEC_DELETE_TAKES_SIZE (pattern); TYPE_HAS_ASSIGN_REF (type) = TYPE_HAS_ASSIGN_REF (pattern); TYPE_HAS_CONST_ASSIGN_REF (type) = TYPE_HAS_CONST_ASSIGN_REF (pattern); TYPE_HAS_ABSTRACT_ASSIGN_REF (type) = TYPE_HAS_ABSTRACT_ASSIGN_REF (pattern); --- 5050,5055 ---- *************** instantiate_class_template (type) *** 5037,5044 **** pbase = TREE_VEC_ELT (pbases, i); /* Substitute to figure out the base class. */ ! base = tsubst (BINFO_TYPE (pbase), args, ! /*complain=*/1, NULL_TREE); if (base == error_mark_node) continue; --- 5087,5093 ---- pbase = TREE_VEC_ELT (pbases, i); /* Substitute to figure out the base class. */ ! base = tsubst (BINFO_TYPE (pbase), args, tf_error, NULL_TREE); if (base == error_mark_node) continue; *************** instantiate_class_template (type) *** 5092,5098 **** tree name = TYPE_IDENTIFIER (tag); tree newtag; ! newtag = tsubst (tag, args, /*complain=*/1, NULL_TREE); my_friendly_assert (newtag != error_mark_node, 20010206); if (TREE_CODE (newtag) != ENUMERAL_TYPE) { --- 5141,5147 ---- tree name = TYPE_IDENTIFIER (tag); tree newtag; ! newtag = tsubst (tag, args, tf_error, NULL_TREE); my_friendly_assert (newtag != error_mark_node, 20010206); if (TREE_CODE (newtag) != ENUMERAL_TYPE) { *************** instantiate_class_template (type) *** 5130,5143 **** lineno = DECL_SOURCE_LINE (t); input_filename = DECL_SOURCE_FILE (t); ! r = tsubst (t, args, /*complain=*/1, NULL_TREE); if (TREE_CODE (r) == VAR_DECL) { tree init; if (DECL_INITIALIZED_IN_CLASS_P (r)) init = tsubst_expr (DECL_INITIAL (t), args, ! /*complain=*/1, NULL_TREE); else init = NULL_TREE; --- 5179,5192 ---- lineno = DECL_SOURCE_LINE (t); input_filename = DECL_SOURCE_FILE (t); ! r = tsubst (t, args, tf_error | tf_warning, NULL_TREE); if (TREE_CODE (r) == VAR_DECL) { tree init; if (DECL_INITIALIZED_IN_CLASS_P (r)) init = tsubst_expr (DECL_INITIAL (t), args, ! tf_error | tf_warning, NULL_TREE); else init = NULL_TREE; *************** instantiate_class_template (type) *** 5165,5172 **** for this instantiation. */ for (t = TYPE_METHODS (pattern); t; t = TREE_CHAIN (t)) { ! tree r = tsubst (t, args, /*complain=*/1, NULL_TREE); set_current_access_from_decl (r); finish_member_declaration (r); } --- 5214,5222 ---- for this instantiation. */ for (t = TYPE_METHODS (pattern); t; t = TREE_CHAIN (t)) { ! tree r = tsubst (t, args, tf_error, NULL_TREE); set_current_access_from_decl (r); + grok_special_member_properties (r); finish_member_declaration (r); } *************** instantiate_class_template (type) *** 5186,5192 **** tsubst_friend_function (TREE_VALUE (friends), args)); else ! my_friendly_abort (20000216); } for (t = CLASSTYPE_FRIEND_CLASSES (pattern); --- 5236,5242 ---- tsubst_friend_function (TREE_VALUE (friends), args)); else ! abort (); } for (t = CLASSTYPE_FRIEND_CLASSES (pattern); *************** instantiate_class_template (type) *** 5199,5206 **** if (TREE_CODE (friend_type) == TEMPLATE_DECL) new_friend_type = tsubst_friend_class (friend_type, args); else if (uses_template_parms (friend_type)) ! new_friend_type = tsubst (friend_type, args, /*complain=*/1, ! NULL_TREE); else { tree ns = decl_namespace_context (TYPE_MAIN_DECL (friend_type)); --- 5249,5256 ---- if (TREE_CODE (friend_type) == TEMPLATE_DECL) new_friend_type = tsubst_friend_class (friend_type, args); else if (uses_template_parms (friend_type)) ! new_friend_type = tsubst (friend_type, args, ! tf_error | tf_warning, NULL_TREE); else { tree ns = decl_namespace_context (TYPE_MAIN_DECL (friend_type)); *************** static tree *** 5324,5330 **** tsubst_template_arg_vector (t, args, complain) tree t; tree args; ! int complain; { int len = TREE_VEC_LENGTH (t), need_new = 0, i; tree *elts = (tree *) alloca (len * sizeof (tree)); --- 5374,5380 ---- tsubst_template_arg_vector (t, args, complain) tree t; tree args; ! tsubst_flags_t complain; { int len = TREE_VEC_LENGTH (t), need_new = 0, i; tree *elts = (tree *) alloca (len * sizeof (tree)); *************** static tree *** 5370,5376 **** tsubst_template_parms (parms, args, complain) tree parms; tree args; ! int complain; { tree r = NULL_TREE; tree* new_parms; --- 5420,5426 ---- tsubst_template_parms (parms, args, complain) tree parms; tree args; ! tsubst_flags_t complain; { tree r = NULL_TREE; tree* new_parms; *************** tsubst_template_parms (parms, args, comp *** 5386,5401 **** for (i = 0; i < TREE_VEC_LENGTH (new_vec); ++i) { ! tree default_value = ! TREE_PURPOSE (TREE_VEC_ELT (TREE_VALUE (parms), i)); ! tree parm_decl = ! TREE_VALUE (TREE_VEC_ELT (TREE_VALUE (parms), i)); ! ! TREE_VEC_ELT (new_vec, i) ! = build_tree_list (tsubst (default_value, args, complain, ! NULL_TREE), ! tsubst (parm_decl, args, complain, ! NULL_TREE)); } *new_parms = --- 5436,5451 ---- for (i = 0; i < TREE_VEC_LENGTH (new_vec); ++i) { ! tree tuple = TREE_VEC_ELT (TREE_VALUE (parms), i); ! tree default_value = TREE_PURPOSE (tuple); ! tree parm_decl = TREE_VALUE (tuple); ! ! parm_decl = tsubst (parm_decl, args, complain, NULL_TREE); ! default_value = tsubst_expr (default_value, args, ! complain, NULL_TREE); ! tuple = build_tree_list (maybe_fold_nontype_arg (default_value), ! parm_decl); ! TREE_VEC_ELT (new_vec, i) = tuple; } *new_parms = *************** static tree *** 5417,5423 **** tsubst_aggr_type (t, args, complain, in_decl, entering_scope) tree t; tree args; ! int complain; tree in_decl; int entering_scope; { --- 5467,5473 ---- tsubst_aggr_type (t, args, complain, in_decl, entering_scope) tree t; tree args; ! tsubst_flags_t complain; tree in_decl; int entering_scope; { *************** tsubst_aggr_type (t, args, complain, in_ *** 5428,5439 **** { case RECORD_TYPE: if (TYPE_PTRMEMFUNC_P (t)) ! { ! tree r = build_ptrmemfunc_type ! (tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, complain, in_decl)); ! return cp_build_qualified_type_real (r, TYPE_QUALS (t), ! complain); ! } /* else fall through */ case ENUMERAL_TYPE: --- 5478,5484 ---- { case RECORD_TYPE: if (TYPE_PTRMEMFUNC_P (t)) ! return tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, complain, in_decl); /* else fall through */ case ENUMERAL_TYPE: *************** tsubst_aggr_type (t, args, complain, in_ *** 5470,5477 **** r = lookup_template_class (t, argvec, in_decl, context, entering_scope, complain); ! return cp_build_qualified_type_real (r, TYPE_QUALS (t), ! complain); } else /* This is not a template type, so there's nothing to do. */ --- 5515,5521 ---- r = lookup_template_class (t, argvec, in_decl, context, entering_scope, complain); ! return cp_build_qualified_type_real (r, TYPE_QUALS (t), complain); } else /* This is not a template type, so there's nothing to do. */ *************** tsubst_default_argument (fn, type, arg) *** 5506,5512 **** if (DECL_CLASS_SCOPE_P (fn)) pushclass (DECL_CONTEXT (fn), 2); ! arg = tsubst_expr (arg, DECL_TI_ARGS (fn), /*complain=*/1, NULL_TREE); if (DECL_CLASS_SCOPE_P (fn)) popclass (); --- 5550,5557 ---- if (DECL_CLASS_SCOPE_P (fn)) pushclass (DECL_CONTEXT (fn), 2); ! arg = tsubst_expr (arg, DECL_TI_ARGS (fn), ! tf_error | tf_warning, NULL_TREE); if (DECL_CLASS_SCOPE_P (fn)) popclass (); *************** tsubst_default_arguments (fn) *** 5544,5562 **** /* Substitute the ARGS into the T, which is a _DECL. TYPE is the (already computed) substitution of ARGS into TREE_TYPE (T), if ! appropriate. Return the result of the substitution. */ static tree ! tsubst_decl (t, args, type) tree t; tree args; tree type; { int saved_lineno; const char *saved_filename; tree r = NULL_TREE; tree in_decl = t; /* Set the filename and linenumber to improve error-reporting. */ saved_lineno = lineno; saved_filename = input_filename; --- 5589,5611 ---- /* Substitute the ARGS into the T, which is a _DECL. TYPE is the (already computed) substitution of ARGS into TREE_TYPE (T), if ! appropriate. Return the result of the substitution. Issue error ! and warning messages under control of COMPLAIN. */ static tree ! tsubst_decl (t, args, type, complain) tree t; tree args; tree type; + tsubst_flags_t complain; { int saved_lineno; const char *saved_filename; tree r = NULL_TREE; tree in_decl = t; + my_friendly_assert (complain & tf_error, 20011214); + /* Set the filename and linenumber to improve error-reporting. */ saved_lineno = lineno; saved_filename = input_filename; *************** tsubst_decl (t, args, type) *** 5585,5591 **** tree full_args; full_args = tsubst_template_arg_vector (tmpl_args, args, ! /*complain=*/1); /* tsubst_template_arg_vector doesn't copy the vector if nothing changed. But, *something* should have --- 5634,5640 ---- tree full_args; full_args = tsubst_template_arg_vector (tmpl_args, args, ! complain); /* tsubst_template_arg_vector doesn't copy the vector if nothing changed. But, *something* should have *************** tsubst_decl (t, args, type) *** 5611,5617 **** if (is_template_template_parm) { ! tree new_decl = tsubst (decl, args, /*complain=*/1, in_decl); DECL_TEMPLATE_RESULT (r) = new_decl; TREE_TYPE (r) = TREE_TYPE (new_decl); break; --- 5660,5666 ---- if (is_template_template_parm) { ! tree new_decl = tsubst (decl, args, complain, in_decl); DECL_TEMPLATE_RESULT (r) = new_decl; TREE_TYPE (r) = TREE_TYPE (new_decl); break; *************** tsubst_decl (t, args, type) *** 5619,5636 **** DECL_CONTEXT (r) = tsubst_aggr_type (DECL_CONTEXT (t), args, ! /*complain=*/1, in_decl, /*entering_scope=*/1); DECL_VIRTUAL_CONTEXT (r) = tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args, ! /*complain=*/1, in_decl, /*entering_scope=*/1); DECL_TEMPLATE_INFO (r) = build_tree_list (t, args); if (TREE_CODE (decl) == TYPE_DECL) { ! tree new_type = tsubst (TREE_TYPE (t), args, ! /*complain=*/1, in_decl); TREE_TYPE (r) = new_type; CLASSTYPE_TI_TEMPLATE (new_type) = r; DECL_TEMPLATE_RESULT (r) = TYPE_MAIN_DECL (new_type); --- 5668,5684 ---- DECL_CONTEXT (r) = tsubst_aggr_type (DECL_CONTEXT (t), args, ! complain, in_decl, /*entering_scope=*/1); DECL_VIRTUAL_CONTEXT (r) = tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args, ! complain, in_decl, /*entering_scope=*/1); DECL_TEMPLATE_INFO (r) = build_tree_list (t, args); if (TREE_CODE (decl) == TYPE_DECL) { ! tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl); TREE_TYPE (r) = new_type; CLASSTYPE_TI_TEMPLATE (new_type) = r; DECL_TEMPLATE_RESULT (r) = TYPE_MAIN_DECL (new_type); *************** tsubst_decl (t, args, type) *** 5638,5644 **** } else { ! tree new_decl = tsubst (decl, args, /*complain=*/1, in_decl); DECL_TEMPLATE_RESULT (r) = new_decl; DECL_TI_TEMPLATE (new_decl) = r; --- 5686,5692 ---- } else { ! tree new_decl = tsubst (decl, args, complain, in_decl); DECL_TEMPLATE_RESULT (r) = new_decl; DECL_TI_TEMPLATE (new_decl) = r; *************** tsubst_decl (t, args, type) *** 5655,5661 **** outermost level of parameters. */ DECL_TEMPLATE_PARMS (r) = tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args, ! /*complain=*/1); if (PRIMARY_TEMPLATE_P (t)) DECL_PRIMARY_TEMPLATE (r) = r; --- 5703,5709 ---- outermost level of parameters. */ DECL_TEMPLATE_PARMS (r) = tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args, ! complain); if (PRIMARY_TEMPLATE_P (t)) DECL_PRIMARY_TEMPLATE (r) = r; *************** tsubst_decl (t, args, type) *** 5695,5701 **** argvec = tsubst_template_arg_vector (DECL_TI_ARGS (DECL_TEMPLATE_RESULT (gen_tmpl)), ! args, /*complain=*/1); /* Check to see if we already have this specialization. */ spec = retrieve_specialization (gen_tmpl, argvec); --- 5743,5749 ---- argvec = tsubst_template_arg_vector (DECL_TI_ARGS (DECL_TEMPLATE_RESULT (gen_tmpl)), ! args, complain); /* Check to see if we already have this specialization. */ spec = retrieve_specialization (gen_tmpl, argvec); *************** tsubst_decl (t, args, type) *** 5772,5778 **** else member = 1; ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, ! /*complain=*/1, t, /*entering_scope=*/1); } else --- 5820,5826 ---- else member = 1; ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, ! complain, t, /*entering_scope=*/1); } else *************** tsubst_decl (t, args, type) *** 5780,5786 **** member = 0; ctx = DECL_CONTEXT (t); } ! type = tsubst (type, args, /*complain=*/1, in_decl); if (type == error_mark_node) return error_mark_node; --- 5828,5834 ---- member = 0; ctx = DECL_CONTEXT (t); } ! type = tsubst (type, args, complain, in_decl); if (type == error_mark_node) return error_mark_node; *************** tsubst_decl (t, args, type) *** 5798,5804 **** DECL_CONTEXT (r) = ctx; DECL_VIRTUAL_CONTEXT (r) = tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args, ! /*complain=*/1, t, /*entering_scope=*/1); if (member && DECL_CONV_FN_P (r)) --- 5846,5852 ---- DECL_CONTEXT (r) = ctx; DECL_VIRTUAL_CONTEXT (r) = tsubst_aggr_type (DECL_VIRTUAL_CONTEXT (t), args, ! complain, t, /*entering_scope=*/1); if (member && DECL_CONV_FN_P (r)) *************** tsubst_decl (t, args, type) *** 5807,5813 **** DECL_NAME (r) = mangle_conv_op_name_for_type (TREE_TYPE (type)); DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args, ! /*complain=*/1, t); DECL_RESULT (r) = NULL_TREE; TREE_STATIC (r) = 0; --- 5855,5861 ---- DECL_NAME (r) = mangle_conv_op_name_for_type (TREE_TYPE (type)); DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args, ! complain, t); DECL_RESULT (r) = NULL_TREE; TREE_STATIC (r) = 0; *************** tsubst_decl (t, args, type) *** 5823,5829 **** if (DECL_CLONED_FUNCTION (r)) { DECL_CLONED_FUNCTION (r) = tsubst (DECL_CLONED_FUNCTION (t), ! args, /*complain=*/1, t); TREE_CHAIN (r) = TREE_CHAIN (DECL_CLONED_FUNCTION (r)); TREE_CHAIN (DECL_CLONED_FUNCTION (r)) = r; } --- 5871,5877 ---- if (DECL_CLONED_FUNCTION (r)) { DECL_CLONED_FUNCTION (r) = tsubst (DECL_CLONED_FUNCTION (t), ! args, complain, t); TREE_CHAIN (r) = TREE_CHAIN (DECL_CLONED_FUNCTION (r)); TREE_CHAIN (DECL_CLONED_FUNCTION (r)) = r; } *************** tsubst_decl (t, args, type) *** 5862,5868 **** { *friends = copy_node (*friends); TREE_VALUE (*friends) = tsubst (TREE_VALUE (*friends), ! args, /*complain=*/1, in_decl); } --- 5910,5916 ---- { *friends = copy_node (*friends); TREE_VALUE (*friends) = tsubst (TREE_VALUE (*friends), ! args, complain, in_decl); } *************** tsubst_decl (t, args, type) *** 5875,5907 **** If it isn't, that'll be handled by clone_constructors_and_destructors. */ if (PRIMARY_TEMPLATE_P (gen_tmpl)) ! clone_function_decl(r, /*update_method_vec_p=*/0); } else if (IDENTIFIER_OPNAME_P (DECL_NAME (r))) ! grok_op_properties (r, DECL_VIRTUAL_P (r), DECL_FRIEND_P (r)); } break; case PARM_DECL: { r = copy_node (t); TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (CP_TYPE_QUALS (type), r); if (TREE_CODE (DECL_INITIAL (r)) != TEMPLATE_PARM_INDEX) DECL_INITIAL (r) = TREE_TYPE (r); else DECL_INITIAL (r) = tsubst (DECL_INITIAL (r), args, ! /*complain=*/1, in_decl); DECL_CONTEXT (r) = NULL_TREE; ! if (PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) DECL_ARG_TYPE (r) = integer_type_node; if (TREE_CHAIN (t)) TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, ! /*complain=*/1, TREE_CHAIN (t)); } break; --- 5923,5958 ---- If it isn't, that'll be handled by clone_constructors_and_destructors. */ if (PRIMARY_TEMPLATE_P (gen_tmpl)) ! clone_function_decl (r, /*update_method_vec_p=*/0); } else if (IDENTIFIER_OPNAME_P (DECL_NAME (r))) ! grok_op_properties (r, DECL_FRIEND_P (r)); } break; case PARM_DECL: { r = copy_node (t); + if (DECL_TEMPLATE_PARM_P (t)) + SET_DECL_TEMPLATE_PARM_P (r); + TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (cp_type_quals (type), r); if (TREE_CODE (DECL_INITIAL (r)) != TEMPLATE_PARM_INDEX) DECL_INITIAL (r) = TREE_TYPE (r); else DECL_INITIAL (r) = tsubst (DECL_INITIAL (r), args, ! complain, in_decl); DECL_CONTEXT (r) = NULL_TREE; ! if (!DECL_TEMPLATE_PARM_P (r) && PROMOTE_PROTOTYPES && INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) DECL_ARG_TYPE (r) = integer_type_node; if (TREE_CHAIN (t)) TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, ! complain, TREE_CHAIN (t)); } break; *************** tsubst_decl (t, args, type) *** 5909,5923 **** { r = copy_decl (t); TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (CP_TYPE_QUALS (type), r); /* We don't have to set DECL_CONTEXT here; it is set by finish_member_declaration. */ DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args, ! /*complain=*/1, in_decl); TREE_CHAIN (r) = NULL_TREE; ! if (TREE_CODE (type) == VOID_TYPE) ! cp_error_at ("instantiation of `%D' as type void", r); } break; --- 5960,5974 ---- { r = copy_decl (t); TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (cp_type_quals (type), r); /* We don't have to set DECL_CONTEXT here; it is set by finish_member_declaration. */ DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args, ! complain, in_decl); TREE_CHAIN (r) = NULL_TREE; ! if (VOID_TYPE_P (type)) ! cp_error_at ("instantiation of `%D' as type `%T'", r, type); } break; *************** tsubst_decl (t, args, type) *** 5925,5931 **** { r = copy_node (t); DECL_INITIAL (r) ! = tsubst_copy (DECL_INITIAL (t), args, /*complain=*/1, in_decl); TREE_CHAIN (r) = NULL_TREE; } break; --- 5976,5982 ---- { r = copy_node (t); DECL_INITIAL (r) ! = tsubst_copy (DECL_INITIAL (t), args, complain, in_decl); TREE_CHAIN (r) = NULL_TREE; } break; *************** tsubst_decl (t, args, type) *** 5958,5964 **** if (TYPE_P (CP_DECL_CONTEXT (t))) ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, ! /*complain=*/1, in_decl, /*entering_scope=*/1); else if (DECL_NAMESPACE_SCOPE_P (t)) ctx = DECL_CONTEXT (t); --- 6009,6015 ---- if (TYPE_P (CP_DECL_CONTEXT (t))) ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, ! complain, in_decl, /*entering_scope=*/1); else if (DECL_NAMESPACE_SCOPE_P (t)) ctx = DECL_CONTEXT (t); *************** tsubst_decl (t, args, type) *** 5974,5980 **** { tmpl = DECL_TI_TEMPLATE (t); gen_tmpl = most_general_template (tmpl); ! argvec = tsubst (DECL_TI_ARGS (t), args, /*complain=*/1, in_decl); spec = retrieve_specialization (gen_tmpl, argvec); } else --- 6025,6031 ---- { tmpl = DECL_TI_TEMPLATE (t); gen_tmpl = most_general_template (tmpl); ! argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl); spec = retrieve_specialization (gen_tmpl, argvec); } else *************** tsubst_decl (t, args, type) *** 5988,5994 **** r = copy_decl (t); TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (CP_TYPE_QUALS (type), r); DECL_CONTEXT (r) = ctx; /* Clear out the mangled name and RTL for the instantiation. */ SET_DECL_ASSEMBLER_NAME (r, NULL_TREE); --- 6039,6045 ---- r = copy_decl (t); TREE_TYPE (r) = type; ! c_apply_type_quals_to_decl (cp_type_quals (type), r); DECL_CONTEXT (r) = ctx; /* Clear out the mangled name and RTL for the instantiation. */ SET_DECL_ASSEMBLER_NAME (r, NULL_TREE); *************** tsubst_decl (t, args, type) *** 6000,6015 **** SET_DECL_RTL (r, NULL_RTX); DECL_SIZE (r) = DECL_SIZE_UNIT (r) = 0; - /* For __PRETTY_FUNCTION__ we have to adjust the initializer. */ - if (DECL_PRETTY_FUNCTION_P (r)) - { - DECL_INITIAL (r) = tsubst (DECL_INITIAL (t), - args, - /*complain=*/1, - NULL_TREE); - TREE_TYPE (r) = TREE_TYPE (DECL_INITIAL (r)); - } - /* Even if the original location is out of scope, the newly substituted one is not. */ if (TREE_CODE (r) == VAR_DECL) --- 6051,6056 ---- *************** tsubst_decl (t, args, type) *** 6031,6043 **** register_local_specialization (r, t); TREE_CHAIN (r) = NULL_TREE; ! if (TREE_CODE (r) == VAR_DECL && TREE_CODE (type) == VOID_TYPE) ! cp_error_at ("instantiation of `%D' as type void", r); } break; default: ! my_friendly_abort (0); } /* Restore the file and line information. */ --- 6072,6084 ---- register_local_specialization (r, t); TREE_CHAIN (r) = NULL_TREE; ! if (TREE_CODE (r) == VAR_DECL && VOID_TYPE_P (type)) ! cp_error_at ("instantiation of `%D' as type `%T'", r, type); } break; default: ! abort (); } /* Restore the file and line information. */ *************** static tree *** 6053,6059 **** tsubst_arg_types (arg_types, args, complain, in_decl) tree arg_types; tree args; ! int complain; tree in_decl; { tree remaining_arg_types; --- 6094,6100 ---- tsubst_arg_types (arg_types, args, complain, in_decl) tree arg_types; tree args; ! tsubst_flags_t complain; tree in_decl; { tree remaining_arg_types; *************** tsubst_arg_types (arg_types, args, compl *** 6072,6080 **** return error_mark_node; if (VOID_TYPE_P (type)) { ! if (complain) { ! cp_error ("invalid parameter type `%T'", type); if (in_decl) cp_error_at ("in declaration `%D'", in_decl); } --- 6113,6121 ---- return error_mark_node; if (VOID_TYPE_P (type)) { ! if (complain & tf_error) { ! error ("invalid parameter type `%T'", type); if (in_decl) cp_error_at ("in declaration `%D'", in_decl); } *************** static tree *** 6114,6120 **** tsubst_function_type (t, args, complain, in_decl) tree t; tree args; ! int complain; tree in_decl; { tree return_type; --- 6155,6161 ---- tsubst_function_type (t, args, complain, in_decl) tree t; tree args; ! tsubst_flags_t complain; tree in_decl; { tree return_type; *************** tsubst_function_type (t, args, complain, *** 6124,6130 **** /* The TYPE_CONTEXT is not used for function/method types. */ my_friendly_assert (TYPE_CONTEXT (t) == NULL_TREE, 0); ! /* Substitue the return type. */ return_type = tsubst (TREE_TYPE (t), args, complain, in_decl); if (return_type == error_mark_node) return error_mark_node; --- 6165,6171 ---- /* The TYPE_CONTEXT is not used for function/method types. */ my_friendly_assert (TYPE_CONTEXT (t) == NULL_TREE, 0); ! /* Substitute the return type. */ return_type = tsubst (TREE_TYPE (t), args, complain, in_decl); if (return_type == error_mark_node) return error_mark_node; *************** tsubst_function_type (t, args, complain, *** 6150,6157 **** -- Attempting to create "pointer to member of T" when T is not a class type. */ ! if (complain) ! cp_error ("creating pointer to member function of non-class type `%T'", r); return error_mark_node; } --- 6191,6198 ---- -- Attempting to create "pointer to member of T" when T is not a class type. */ ! if (complain & tf_error) ! error ("creating pointer to member function of non-class type `%T'", r); return error_mark_node; } *************** tsubst_function_type (t, args, complain, *** 6159,6165 **** fntype = build_cplus_method_type (r, return_type, TREE_CHAIN (arg_types)); } ! fntype = build_qualified_type (fntype, TYPE_QUALS (t)); fntype = build_type_attribute_variant (fntype, TYPE_ATTRIBUTES (t)); return fntype; --- 6200,6206 ---- fntype = build_cplus_method_type (r, return_type, TREE_CHAIN (arg_types)); } ! fntype = cp_build_qualified_type_real (fntype, TYPE_QUALS (t), complain); fntype = build_type_attribute_variant (fntype, TYPE_ATTRIBUTES (t)); return fntype; *************** static tree *** 6171,6177 **** tsubst_call_declarator_parms (parms, args, complain, in_decl) tree parms; tree args; ! int complain; tree in_decl; { tree new_parms; --- 6212,6218 ---- tsubst_call_declarator_parms (parms, args, complain, in_decl) tree parms; tree args; ! tsubst_flags_t complain; tree in_decl; { tree new_parms; *************** tsubst_call_declarator_parms (parms, arg *** 6205,6219 **** /* Take the tree structure T and replace template parameters used therein with the argument vector ARGS. IN_DECL is an associated decl for diagnostics. If an error occurs, returns ERROR_MARK_NODE. ! An appropriate error message is issued only if COMPLAIN is ! non-zero. Note that we must be relatively non-tolerant of ! extensions here, in order to preserve conformance; if we allow ! substitutions that should not be allowed, we may allow argument ! deductions that should not succeed, and therefore report ambiguous ! overload situations where there are none. In theory, we could ! allow the substitution, but indicate that it should have failed, ! and allow our caller to make sure that the right thing happens, but ! we don't try to do this yet. This function is used for dealing with types, decls and the like; for expressions, use tsubst_expr or tsubst_copy. */ --- 6246,6260 ---- /* Take the tree structure T and replace template parameters used therein with the argument vector ARGS. IN_DECL is an associated decl for diagnostics. If an error occurs, returns ERROR_MARK_NODE. ! Issue error and warning messages under control of COMPLAIN. Note ! that we must be relatively non-tolerant of extensions here, in ! order to preserve conformance; if we allow substitutions that ! should not be allowed, we may allow argument deductions that should ! not succeed, and therefore report ambiguous overload situations ! where there are none. In theory, we could allow the substitution, ! but indicate that it should have failed, and allow our caller to ! make sure that the right thing happens, but we don't try to do this ! yet. This function is used for dealing with types, decls and the like; for expressions, use tsubst_expr or tsubst_copy. */ *************** tsubst_call_declarator_parms (parms, arg *** 6221,6227 **** tree tsubst (t, args, complain, in_decl) tree t, args; ! int complain; tree in_decl; { tree type, r; --- 6262,6268 ---- tree tsubst (t, args, complain, in_decl) tree t, args; ! tsubst_flags_t complain; tree in_decl; { tree type, r; *************** tsubst (t, args, complain, in_decl) *** 6238,6244 **** else type = TREE_TYPE (t); if (type == unknown_type_node) ! my_friendly_abort (42); if (type && TREE_CODE (t) != FUNCTION_DECL && TREE_CODE (t) != TYPENAME_TYPE --- 6279,6285 ---- else type = TREE_TYPE (t); if (type == unknown_type_node) ! abort (); if (type && TREE_CODE (t) != FUNCTION_DECL && TREE_CODE (t) != TYPENAME_TYPE *************** tsubst (t, args, complain, in_decl) *** 6251,6257 **** return error_mark_node; if (DECL_P (t)) ! return tsubst_decl (t, args, type); switch (TREE_CODE (t)) { --- 6292,6298 ---- return error_mark_node; if (DECL_P (t)) ! return tsubst_decl (t, args, type, complain); switch (TREE_CODE (t)) { *************** tsubst (t, args, complain, in_decl) *** 6263,6269 **** case ERROR_MARK: case IDENTIFIER_NODE: - case OP_IDENTIFIER: case VOID_TYPE: case REAL_TYPE: case COMPLEX_TYPE: --- 6304,6309 ---- *************** tsubst (t, args, complain, in_decl) *** 6328,6335 **** Attempting to create an array with a size that is zero or negative. */ ! if (complain) ! cp_error ("creating array with size zero (`%E')", max); return error_mark_node; } --- 6368,6375 ---- Attempting to create an array with a size that is zero or negative. */ ! if (complain & tf_error) ! error ("creating array with size zero (`%E')", max); return error_mark_node; } *************** tsubst (t, args, complain, in_decl) *** 6377,6384 **** { my_friendly_assert (TYPE_P (arg), 0); return cp_build_qualified_type_real ! (arg, CP_TYPE_QUALS (arg) | CP_TYPE_QUALS (t), ! complain); } else if (TREE_CODE (t) == BOUND_TEMPLATE_TEMPLATE_PARM) { --- 6417,6424 ---- { my_friendly_assert (TYPE_P (arg), 0); return cp_build_qualified_type_real ! (arg, cp_type_quals (arg) | cp_type_quals (t), ! complain | tf_ignore_bad_quals); } else if (TREE_CODE (t) == BOUND_TEMPLATE_TEMPLATE_PARM) { *************** tsubst (t, args, complain, in_decl) *** 6402,6410 **** DECL_CONTEXT (arg), /*entering_scope=*/0, complain); ! return cp_build_qualified_type_real (r, ! TYPE_QUALS (t), ! complain); } else /* TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX. */ --- 6442,6449 ---- DECL_CONTEXT (arg), /*entering_scope=*/0, complain); ! return cp_build_qualified_type_real ! (r, TYPE_QUALS (t), complain); } else /* TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX. */ *************** tsubst (t, args, complain, in_decl) *** 6412,6418 **** } } else ! my_friendly_abort (981018); if (level == 1) /* This can happen during the attempted tsubst'ing in --- 6451,6457 ---- } } else ! abort (); if (level == 1) /* This can happen during the attempted tsubst'ing in *************** tsubst (t, args, complain, in_decl) *** 6428,6442 **** case TEMPLATE_TYPE_PARM: case TEMPLATE_TEMPLATE_PARM: case BOUND_TEMPLATE_TEMPLATE_PARM: ! if (CP_TYPE_QUALS (t)) { r = tsubst (TYPE_MAIN_VARIANT (t), args, complain, in_decl); ! r = cp_build_qualified_type_real (r, CP_TYPE_QUALS (t), ! complain); } else { ! r = copy_node (t); TEMPLATE_TYPE_PARM_INDEX (r) = reduce_template_parm_level (TEMPLATE_TYPE_PARM_INDEX (t), r, levels); --- 6467,6483 ---- case TEMPLATE_TYPE_PARM: case TEMPLATE_TEMPLATE_PARM: case BOUND_TEMPLATE_TEMPLATE_PARM: ! if (cp_type_quals (t)) { r = tsubst (TYPE_MAIN_VARIANT (t), args, complain, in_decl); ! r = cp_build_qualified_type_real ! (r, cp_type_quals (t), ! complain | (TREE_CODE (t) == TEMPLATE_TYPE_PARM ! ? tf_ignore_bad_quals : 0)); } else { ! r = copy_type (t); TEMPLATE_TYPE_PARM_INDEX (r) = reduce_template_parm_level (TEMPLATE_TYPE_PARM_INDEX (t), r, levels); *************** tsubst (t, args, complain, in_decl) *** 6463,6469 **** break; default: ! my_friendly_abort (0); } return r; --- 6504,6510 ---- break; default: ! abort (); } return r; *************** tsubst (t, args, complain, in_decl) *** 6540,6546 **** { enum tree_code code; ! if (type == TREE_TYPE (t)) return t; code = TREE_CODE (t); --- 6581,6587 ---- { enum tree_code code; ! if (type == TREE_TYPE (t) && TREE_CODE (type) != METHOD_TYPE) return t; code = TREE_CODE (t); *************** tsubst (t, args, complain, in_decl) *** 6563,6575 **** /* We keep track of the last time we issued this error message to avoid spewing a ton of messages during a single bad template instantiation. */ ! if (complain && (last_line != lineno || ! last_file != input_filename)) { if (TREE_CODE (type) == VOID_TYPE) ! cp_error ("forming reference to void"); else ! cp_error ("forming %s to reference type `%T'", (code == POINTER_TYPE) ? "pointer" : "reference", type); last_line = lineno; --- 6604,6616 ---- /* We keep track of the last time we issued this error message to avoid spewing a ton of messages during a single bad template instantiation. */ ! if (complain & tf_error ! && (last_line != lineno || last_file != input_filename)) { if (TREE_CODE (type) == VOID_TYPE) ! error ("forming reference to void"); else ! error ("forming %s to reference type `%T'", (code == POINTER_TYPE) ? "pointer" : "reference", type); last_line = lineno; *************** tsubst (t, args, complain, in_decl) *** 6579,6585 **** return error_mark_node; } else if (code == POINTER_TYPE) ! r = build_pointer_type (type); else r = build_reference_type (type); r = cp_build_qualified_type_real (r, TYPE_QUALS (t), complain); --- 6620,6630 ---- return error_mark_node; } else if (code == POINTER_TYPE) ! { ! r = build_pointer_type (type); ! if (TREE_CODE (type) == METHOD_TYPE) ! r = build_ptrmemfunc_type (r); ! } else r = build_reference_type (type); r = cp_build_qualified_type_real (r, TYPE_QUALS (t), complain); *************** tsubst (t, args, complain, in_decl) *** 6602,6613 **** -- Attempting to create "pointer to member of T" when T is not a class type. */ if (complain) ! cp_error ("creating pointer to member of non-class type `%T'", ! r); return error_mark_node; } ! return build_offset_type (r, type); } case FUNCTION_TYPE: case METHOD_TYPE: --- 6647,6680 ---- -- Attempting to create "pointer to member of T" when T is not a class type. */ + if (complain & tf_error) + error ("creating pointer to member of non-class type `%T'", r); + return error_mark_node; + } + if (TREE_CODE (type) == REFERENCE_TYPE) + { if (complain) ! error ("creating pointer to member reference type `%T'", type); ! return error_mark_node; } ! my_friendly_assert (TREE_CODE (type) != METHOD_TYPE, 20011231); ! if (TREE_CODE (type) == FUNCTION_TYPE) ! /* This is really a method type. The cv qualifiers of the ! this pointer should _not_ be determined by the cv ! qualifiers of the class type. They should be held ! somewhere in the FUNCTION_TYPE, but we don't do that at ! the moment. Consider ! typedef void (Func) () const; ! ! template void Foo (Func T1::*); ! ! */ ! return build_cplus_method_type (TYPE_MAIN_VARIANT (r), ! TREE_TYPE (type), ! TYPE_ARG_TYPES (type)); ! else ! return build_offset_type (r, type); } case FUNCTION_TYPE: case METHOD_TYPE: *************** tsubst (t, args, complain, in_decl) *** 6664,6671 **** || TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == REFERENCE_TYPE) { ! if (complain) ! cp_error ("creating array of `%T'", type); return error_mark_node; } --- 6731,6738 ---- || TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == REFERENCE_TYPE) { ! if (complain & tf_error) ! error ("creating array of `%T'", type); return error_mark_node; } *************** tsubst (t, args, complain, in_decl) *** 6676,6685 **** case PLUS_EXPR: case MINUS_EXPR: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); ! tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, ! in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; --- 6743,6750 ---- case PLUS_EXPR: case MINUS_EXPR: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); ! tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; *************** tsubst (t, args, complain, in_decl) *** 6690,6697 **** case NEGATE_EXPR: case NOP_EXPR: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); if (e == error_mark_node) return error_mark_node; --- 6755,6761 ---- case NEGATE_EXPR: case NOP_EXPR: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); if (e == error_mark_node) return error_mark_node; *************** tsubst (t, args, complain, in_decl) *** 6710,6717 **** if (!IS_AGGR_TYPE (ctx)) { ! if (complain) ! cp_error ("`%T' is not a class, struct, or union type", ctx); return error_mark_node; } --- 6774,6781 ---- if (!IS_AGGR_TYPE (ctx)) { ! if (complain & tf_error) ! error ("`%T' is not a class, struct, or union type", ctx); return error_mark_node; } *************** tsubst (t, args, complain, in_decl) *** 6728,6752 **** ctx = complete_type (ctx); if (!COMPLETE_TYPE_P (ctx)) { ! if (complain) incomplete_type_error (NULL_TREE, ctx); return error_mark_node; } } ! f = make_typename_type (ctx, f, complain); if (f == error_mark_node) return f; ! return cp_build_qualified_type_real (f, ! CP_TYPE_QUALS (f) ! | CP_TYPE_QUALS (t), ! complain); } case INDIRECT_REF: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); if (e == error_mark_node) return error_mark_node; return make_pointer_declarator (type, e); --- 6792,6832 ---- ctx = complete_type (ctx); if (!COMPLETE_TYPE_P (ctx)) { ! if (complain & tf_error) incomplete_type_error (NULL_TREE, ctx); return error_mark_node; } } ! f = make_typename_type (ctx, f, ! (complain & tf_error) | tf_keep_type_decl); if (f == error_mark_node) return f; ! if (TREE_CODE (f) == TYPE_DECL) ! { ! complain |= tf_ignore_bad_quals; ! f = TREE_TYPE (f); ! } ! ! return cp_build_qualified_type_real ! (f, cp_type_quals (f) | cp_type_quals (t), complain); ! } ! ! case UNBOUND_CLASS_TEMPLATE: ! { ! tree ctx = tsubst_aggr_type (TYPE_CONTEXT (t), args, complain, ! in_decl, /*entering_scope=*/1); ! tree name = TYPE_IDENTIFIER (t); ! ! if (ctx == error_mark_node || name == error_mark_node) ! return error_mark_node; ! ! return make_unbound_class_template (ctx, name, complain); } case INDIRECT_REF: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); if (e == error_mark_node) return error_mark_node; return make_pointer_declarator (type, e); *************** tsubst (t, args, complain, in_decl) *** 6754,6761 **** case ADDR_EXPR: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); if (e == error_mark_node) return error_mark_node; return make_reference_declarator (type, e); --- 6834,6840 ---- case ADDR_EXPR: { ! tree e = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); if (e == error_mark_node) return error_mark_node; return make_reference_declarator (type, e); *************** tsubst (t, args, complain, in_decl) *** 6763,6772 **** case ARRAY_REF: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); ! tree e2 = tsubst_expr (TREE_OPERAND (t, 1), args, complain, ! in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; --- 6842,6849 ---- case ARRAY_REF: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); ! tree e2 = tsubst_expr (TREE_OPERAND (t, 1), args, complain, in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; *************** tsubst (t, args, complain, in_decl) *** 6775,6782 **** case CALL_EXPR: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); tree e2 = (tsubst_call_declarator_parms (CALL_DECLARATOR_PARMS (t), args, complain, in_decl)); tree e3 = tsubst (CALL_DECLARATOR_EXCEPTION_SPEC (t), args, --- 6852,6858 ---- case CALL_EXPR: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); tree e2 = (tsubst_call_declarator_parms (CALL_DECLARATOR_PARMS (t), args, complain, in_decl)); tree e3 = tsubst (CALL_DECLARATOR_EXCEPTION_SPEC (t), args, *************** tsubst (t, args, complain, in_decl) *** 6791,6798 **** case SCOPE_REF: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, ! in_decl); tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; --- 6867,6873 ---- case SCOPE_REF: { ! tree e1 = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl); tree e2 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl); if (e1 == error_mark_node || e2 == error_mark_node) return error_mark_node; *************** tsubst (t, args, complain, in_decl) *** 6802,6833 **** case TYPEOF_TYPE: { ! tree e1 = tsubst_expr (TYPE_FIELDS (t), args, complain, ! in_decl); if (e1 == error_mark_node) return error_mark_node; return TREE_TYPE (e1); } - case FUNCTION_NAME: - { - const char *name; - int len; - tree type; - tree str; - - /* This code should match declare_hidden_char_array in - c-common.c. */ - name = (*decl_printable_name) (current_function_decl, 2); - len = strlen (name) + 1; - type = build_array_type (char_type_node, - build_index_type (size_int (len))); - str = build_string (len, name); - TREE_TYPE (str) = type; - return str; - } - default: sorry ("use of `%s' in template", tree_code_name [(int) TREE_CODE (t)]); --- 6877,6889 ---- case TYPEOF_TYPE: { ! tree e1 = tsubst_expr (TYPE_FIELDS (t), args, complain, in_decl); if (e1 == error_mark_node) return error_mark_node; return TREE_TYPE (e1); } default: sorry ("use of `%s' in template", tree_code_name [(int) TREE_CODE (t)]); *************** tsubst (t, args, complain, in_decl) *** 6842,6848 **** tree tsubst_copy (t, args, complain, in_decl) tree t, args; ! int complain; tree in_decl; { enum tree_code code; --- 6898,6904 ---- tree tsubst_copy (t, args, complain, in_decl) tree t, args; ! tsubst_flags_t complain; tree in_decl; { enum tree_code code; *************** tsubst_copy (t, args, complain, in_decl) *** 6890,6896 **** /* We didn't find the name. That should never happen; if name-lookup found it during preliminary parsing, we should find it again here during instantiation. */ ! my_friendly_abort (0); } return t; --- 6946,6952 ---- /* We didn't find the name. That should never happen; if name-lookup found it during preliminary parsing, we should find it again here during instantiation. */ ! abort (); } return t; *************** tsubst_copy (t, args, complain, in_decl) *** 7061,7068 **** if (!processing_template_decl) { tree stmt_expr = begin_stmt_expr (); ! tsubst_expr (STMT_EXPR_STMT (t), args, ! complain, in_decl); return finish_stmt_expr (stmt_expr); } --- 7117,7123 ---- if (!processing_template_decl) { tree stmt_expr = begin_stmt_expr (); ! tsubst_expr (STMT_EXPR_STMT (t), args, complain, in_decl); return finish_stmt_expr (stmt_expr); } *************** tsubst_copy (t, args, complain, in_decl) *** 7161,7166 **** --- 7216,7223 ---- case METHOD_TYPE: case ARRAY_TYPE: case TYPENAME_TYPE: + case UNBOUND_CLASS_TEMPLATE: + case TYPEOF_TYPE: case TYPE_DECL: return tsubst (t, args, complain, in_decl); *************** tsubst_copy (t, args, complain, in_decl) *** 7185,7195 **** case VA_ARG_EXPR: return build_x_va_arg (tsubst_copy (TREE_OPERAND (t, 0), args, complain, ! in_decl), ! tsubst (TREE_TYPE (t), args, complain, in_decl)); ! ! case FUNCTION_NAME: ! return tsubst (t, args, complain, in_decl); default: return t; --- 7242,7249 ---- case VA_ARG_EXPR: return build_x_va_arg (tsubst_copy (TREE_OPERAND (t, 0), args, complain, ! in_decl), ! tsubst (TREE_TYPE (t), args, complain, in_decl)); default: return t; *************** tsubst_copy (t, args, complain, in_decl) *** 7201,7210 **** tree tsubst_expr (t, args, complain, in_decl) tree t, args; ! int complain; tree in_decl; { ! tree stmt; if (t == NULL_TREE || t == error_mark_node) return t; --- 7255,7264 ---- tree tsubst_expr (t, args, complain, in_decl) tree t, args; ! tsubst_flags_t complain; tree in_decl; { ! tree stmt, tmp; if (t == NULL_TREE || t == error_mark_node) return t; *************** tsubst_expr (t, args, complain, in_decl) *** 7212,7225 **** if (processing_template_decl) return tsubst_copy (t, args, complain, in_decl); switch (TREE_CODE (t)) { case RETURN_INIT: prep_stmt (t); finish_named_return_value (TREE_OPERAND (t, 0), ! tsubst_expr (TREE_OPERAND (t, 1), args, /*complain=*/1, in_decl)); ! tsubst_expr (TREE_CHAIN (t), args, complain, in_decl); break; case CTOR_INITIALIZER: --- 7266,7281 ---- if (processing_template_decl) return tsubst_copy (t, args, complain, in_decl); + if (!statement_code_p (TREE_CODE (t))) + return build_expr_from_tree (tsubst_copy (t, args, complain, in_decl)); + switch (TREE_CODE (t)) { case RETURN_INIT: prep_stmt (t); finish_named_return_value (TREE_OPERAND (t, 0), ! tsubst_expr (TREE_OPERAND (t, 1), args, complain, in_decl)); break; case CTOR_INITIALIZER: *************** tsubst_expr (t, args, complain, in_decl) *** 7232,7239 **** = tsubst_initializer_list (TREE_OPERAND (t, 0), args); base_init_list = tsubst_initializer_list (TREE_OPERAND (t, 1), args); ! setup_vtbl_ptr (member_init_list, base_init_list); ! tsubst_expr (TREE_CHAIN (t), args, complain, in_decl); break; } --- 7288,7294 ---- = tsubst_initializer_list (TREE_OPERAND (t, 0), args); base_init_list = tsubst_initializer_list (TREE_OPERAND (t, 1), args); ! emit_base_init (member_init_list, base_init_list); break; } *************** tsubst_expr (t, args, complain, in_decl) *** 7276,7282 **** { init = DECL_INITIAL (decl); decl = tsubst (decl, args, complain, in_decl); - init = tsubst_expr (init, args, complain, in_decl); if (decl != error_mark_node) { if (TREE_CODE (decl) != TYPE_DECL) --- 7331,7336 ---- *************** tsubst_expr (t, args, complain, in_decl) *** 7292,7314 **** if (TREE_CODE (decl) == VAR_DECL) DECL_TEMPLATE_INSTANTIATED (decl) = 1; maybe_push_decl (decl); cp_finish_decl (decl, init, NULL_TREE, 0); } } ! return decl; } case FOR_STMT: { - tree tmp; prep_stmt (t); stmt = begin_for_stmt (); ! for (tmp = FOR_INIT_STMT (t); tmp; tmp = TREE_CHAIN (tmp)) ! tsubst_expr (tmp, args, complain, in_decl); finish_for_init_stmt (stmt); ! finish_for_cond (tsubst_expr (FOR_COND (t), args, ! complain, in_decl), stmt); tmp = tsubst_expr (FOR_EXPR (t), args, complain, in_decl); finish_for_expr (tmp, stmt); --- 7346,7383 ---- if (TREE_CODE (decl) == VAR_DECL) DECL_TEMPLATE_INSTANTIATED (decl) = 1; maybe_push_decl (decl); + if (DECL_PRETTY_FUNCTION_P (decl)) + { + /* For __PRETTY_FUNCTION__ we have to adjust the + initializer. */ + const char *const name + = (*decl_printable_name) (current_function_decl, 2); + init = cp_fname_init (name); + TREE_TYPE (decl) = TREE_TYPE (init); + } + else + init = tsubst_expr (init, args, complain, in_decl); cp_finish_decl (decl, init, NULL_TREE, 0); } } ! ! /* A DECL_STMT can also be used as an expression, in the condition ! clause of a if/for/while construct. If we aren't followed by ! another statement, return our decl. */ ! if (TREE_CHAIN (t) == NULL_TREE) ! return decl; } + break; case FOR_STMT: { prep_stmt (t); stmt = begin_for_stmt (); ! tsubst_expr (FOR_INIT_STMT (t), args, complain, in_decl); finish_for_init_stmt (stmt); ! finish_for_cond (tsubst_expr (FOR_COND (t), ! args, complain, in_decl), stmt); tmp = tsubst_expr (FOR_EXPR (t), args, complain, in_decl); finish_for_expr (tmp, stmt); *************** tsubst_expr (t, args, complain, in_decl) *** 7335,7350 **** stmt = begin_do_stmt (); tsubst_expr (DO_BODY (t), args, complain, in_decl); finish_do_body (stmt); ! finish_do_stmt (tsubst_expr (DO_COND (t), args, ! complain, in_decl), stmt); } break; case IF_STMT: { - tree tmp; - prep_stmt (t); stmt = begin_if_stmt (); finish_if_stmt_cond (tsubst_expr (IF_COND (t), --- 7404,7417 ---- stmt = begin_do_stmt (); tsubst_expr (DO_BODY (t), args, complain, in_decl); finish_do_body (stmt); ! finish_do_stmt (tsubst_expr (DO_COND (t), ! args, complain, in_decl), stmt); } break; case IF_STMT: { prep_stmt (t); stmt = begin_if_stmt (); finish_if_stmt_cond (tsubst_expr (IF_COND (t), *************** tsubst_expr (t, args, complain, in_decl) *** 7370,7384 **** case COMPOUND_STMT: { - tree substmt; - prep_stmt (t); ! stmt = begin_compound_stmt (COMPOUND_STMT_NO_SCOPE (t)); ! for (substmt = COMPOUND_BODY (t); ! substmt != NULL_TREE; ! substmt = TREE_CHAIN (substmt)) ! tsubst_expr (substmt, args, complain, in_decl); ! return finish_compound_stmt (COMPOUND_STMT_NO_SCOPE (t), stmt); } break; --- 7437,7454 ---- case COMPOUND_STMT: { prep_stmt (t); ! if (COMPOUND_STMT_BODY_BLOCK (t)) ! stmt = begin_function_body (); ! else ! stmt = begin_compound_stmt (COMPOUND_STMT_NO_SCOPE (t)); ! ! tsubst_expr (COMPOUND_BODY (t), args, complain, in_decl); ! ! if (COMPOUND_STMT_BODY_BLOCK (t)) ! finish_function_body (stmt); ! else ! finish_compound_stmt (COMPOUND_STMT_NO_SCOPE (t), stmt); } break; *************** tsubst_expr (t, args, complain, in_decl) *** 7419,7433 **** case GOTO_STMT: prep_stmt (t); ! t = GOTO_DESTINATION (t); ! if (TREE_CODE (t) != LABEL_DECL) /* Computed goto's must be tsubst'd into. On the other hand, non-computed gotos must not be; the identifier in question will have no binding. */ ! t = tsubst_expr (t, args, complain, in_decl); else ! t = DECL_NAME (t); ! finish_goto_stmt (t); break; case ASM_STMT: --- 7489,7503 ---- case GOTO_STMT: prep_stmt (t); ! tmp = GOTO_DESTINATION (t); ! if (TREE_CODE (tmp) != LABEL_DECL) /* Computed goto's must be tsubst'd into. On the other hand, non-computed gotos must not be; the identifier in question will have no binding. */ ! tmp = tsubst_expr (tmp, args, complain, in_decl); else ! tmp = DECL_NAME (tmp); ! finish_goto_stmt (tmp); break; case ASM_STMT: *************** tsubst_expr (t, args, complain, in_decl) *** 7453,7460 **** } else { - tree handler; - if (FN_TRY_BLOCK_P (t)) stmt = begin_function_try_block (); else --- 7523,7528 ---- *************** tsubst_expr (t, args, complain, in_decl) *** 7467,7475 **** else finish_try_block (stmt); ! handler = TRY_HANDLERS (t); ! for (; handler; handler = TREE_CHAIN (handler)) ! tsubst_expr (handler, args, complain, in_decl); if (FN_TRY_BLOCK_P (t)) finish_function_handler_sequence (stmt); else --- 7535,7541 ---- else finish_try_block (stmt); ! tsubst_expr (TRY_HANDLERS (t), args, complain, in_decl); if (FN_TRY_BLOCK_P (t)) finish_function_handler_sequence (stmt); else *************** tsubst_expr (t, args, complain, in_decl) *** 7480,7486 **** case HANDLER: { tree decl; - tree blocks; prep_stmt (t); stmt = begin_handler (); --- 7546,7551 ---- *************** tsubst_expr (t, args, complain, in_decl) *** 7495,7553 **** } else decl = NULL_TREE; ! blocks = finish_handler_parms (decl, stmt); tsubst_expr (HANDLER_BODY (t), args, complain, in_decl); ! finish_handler (blocks, stmt); } break; case TAG_DEFN: prep_stmt (t); ! t = TREE_TYPE (t); ! tsubst (t, args, complain, NULL_TREE); break; default: ! return build_expr_from_tree (tsubst_copy (t, args, complain, in_decl)); } - return NULL_TREE; - } - - /* TMPL is a TEMPLATE_DECL for a cloned constructor or destructor. - Instantiate it with the ARGS. */ - - static tree - instantiate_clone (tmpl, args) - tree tmpl; - tree args; - { - tree spec; - tree clone; - - /* Instantiated the cloned function, rather than the clone. */ - spec = instantiate_template (DECL_CLONED_FUNCTION (tmpl), args); ! /* Then, see if we've already cloned the instantiation. */ ! for (clone = TREE_CHAIN (spec); ! clone && DECL_CLONED_FUNCTION_P (clone); ! clone = TREE_CHAIN (clone)) ! if (DECL_NAME (clone) == DECL_NAME (tmpl)) ! return clone; ! ! /* If we haven't, do so know. */ ! if (!clone) ! clone_function_decl (spec, /*update_method_vec_p=*/0); ! ! /* Look again. */ ! for (clone = TREE_CHAIN (spec); ! clone && DECL_CLONED_FUNCTION_P (clone); ! clone = TREE_CHAIN (clone)) ! if (DECL_NAME (clone) == DECL_NAME (tmpl)) ! return clone; ! ! /* We should always have found the clone by now. */ ! my_friendly_abort (20000411); ! return NULL_TREE; } /* Instantiate the indicated variable or function template TMPL with --- 7560,7585 ---- } else decl = NULL_TREE; ! finish_handler_parms (decl, stmt); tsubst_expr (HANDLER_BODY (t), args, complain, in_decl); ! finish_handler (stmt); } break; case TAG_DEFN: prep_stmt (t); ! tsubst (TREE_TYPE (t), args, complain, NULL_TREE); ! break; ! ! case CTOR_STMT: ! add_stmt (copy_node (t)); break; default: ! abort (); } ! return tsubst_expr (TREE_CHAIN (t), args, complain, in_decl); } /* Instantiate the indicated variable or function template TMPL with *************** tree *** 7557,7563 **** instantiate_template (tmpl, targ_ptr) tree tmpl, targ_ptr; { - tree clone; tree fndecl; tree gen_tmpl; tree spec; --- 7589,7594 ---- *************** instantiate_template (tmpl, targ_ptr) *** 7571,7578 **** /* If this function is a clone, handle it specially. */ if (DECL_CLONED_FUNCTION_P (tmpl)) ! return instantiate_clone (tmpl, targ_ptr); ! /* Check to see if we already have this specialization. */ spec = retrieve_specialization (tmpl, targ_ptr); if (spec != NULL_TREE) --- 7602,7622 ---- /* If this function is a clone, handle it specially. */ if (DECL_CLONED_FUNCTION_P (tmpl)) ! { ! tree spec = instantiate_template (DECL_CLONED_FUNCTION (tmpl), targ_ptr); ! tree clone; ! ! /* Look for the clone. */ ! for (clone = TREE_CHAIN (spec); ! clone && DECL_CLONED_FUNCTION_P (clone); ! clone = TREE_CHAIN (clone)) ! if (DECL_NAME (clone) == DECL_NAME (tmpl)) ! return clone; ! /* We should always have found the clone by now. */ ! abort (); ! return NULL_TREE; ! } ! /* Check to see if we already have this specialization. */ spec = retrieve_specialization (tmpl, targ_ptr); if (spec != NULL_TREE) *************** instantiate_template (tmpl, targ_ptr) *** 7604,7611 **** tree nt = target_type (t); if (IS_AGGR_TYPE (nt) && decl_function_context (TYPE_MAIN_DECL (nt))) { ! cp_error ("type `%T' composed from a local class is not a valid template-argument", t); ! cp_error (" trying to instantiate `%D'", gen_tmpl); return error_mark_node; } } --- 7648,7655 ---- tree nt = target_type (t); if (IS_AGGR_TYPE (nt) && decl_function_context (TYPE_MAIN_DECL (nt))) { ! error ("type `%T' composed from a local class is not a valid template-argument", t); ! error (" trying to instantiate `%D'", gen_tmpl); return error_mark_node; } } *************** instantiate_template (tmpl, targ_ptr) *** 7613,7619 **** /* substitute template parameters */ fndecl = tsubst (DECL_TEMPLATE_RESULT (gen_tmpl), ! targ_ptr, /*complain=*/1, gen_tmpl); /* The DECL_TI_TEMPLATE should always be the immediate parent template, not the most general template. */ DECL_TI_TEMPLATE (fndecl) = tmpl; --- 7657,7663 ---- /* substitute template parameters */ fndecl = tsubst (DECL_TEMPLATE_RESULT (gen_tmpl), ! targ_ptr, tf_error, gen_tmpl); /* The DECL_TI_TEMPLATE should always be the immediate parent template, not the most general template. */ DECL_TI_TEMPLATE (fndecl) = tmpl; *************** instantiate_template (tmpl, targ_ptr) *** 7622,7632 **** add_pending_template (fndecl); /* If we've just instantiated the main entry point for a function, ! instantiate all the alternate entry points as well. */ ! for (clone = TREE_CHAIN (gen_tmpl); ! clone && DECL_CLONED_FUNCTION_P (clone); ! clone = TREE_CHAIN (clone)) ! instantiate_template (clone, targ_ptr); return fndecl; } --- 7666,7676 ---- add_pending_template (fndecl); /* If we've just instantiated the main entry point for a function, ! instantiate all the alternate entry points as well. We do this ! by cloning the instantiation of the main entry point, not by ! instantiating the template clones. */ ! if (TREE_CHAIN (gen_tmpl) && DECL_CLONED_FUNCTION_P (TREE_CHAIN (gen_tmpl))) ! clone_function_decl (fndecl, /*update_method_vec_p=*/0); return fndecl; } *************** fn_type_unification (fn, explicit_targs, *** 7710,7721 **** converted_args = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn), ! explicit_targs, NULL_TREE, /*complain=*/0, /*require_all_arguments=*/0)); if (converted_args == error_mark_node) return 1; ! fntype = tsubst (fntype, converted_args, /*complain=*/0, NULL_TREE); if (fntype == error_mark_node) return 1; --- 7754,7765 ---- converted_args = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn), ! explicit_targs, NULL_TREE, tf_none, /*require_all_arguments=*/0)); if (converted_args == error_mark_node) return 1; ! fntype = tsubst (fntype, converted_args, tf_none, NULL_TREE); if (fntype == error_mark_node) return 1; *************** fn_type_unification (fn, explicit_targs, *** 7756,7762 **** the corresponding deduced argument values. If the substitution results in an invalid type, as described above, type deduction fails. */ ! if (tsubst (TREE_TYPE (fn), targs, /*complain=*/0, NULL_TREE) == error_mark_node) return 1; --- 7800,7806 ---- the corresponding deduced argument values. If the substitution results in an invalid type, as described above, type deduction fails. */ ! if (tsubst (TREE_TYPE (fn), targs, tf_none, NULL_TREE) == error_mark_node) return 1; *************** maybe_adjust_types_for_deduction (strict *** 7821,7827 **** } break; default: ! my_friendly_abort (0); } if (TREE_CODE (*parm) != REFERENCE_TYPE) --- 7865,7871 ---- } break; default: ! abort (); } if (TREE_CODE (*parm) != REFERENCE_TYPE) *************** type_unification_real (tparms, targs, xp *** 7916,7922 **** break; default: ! my_friendly_abort (0); } if (xlen == 0) --- 7960,7966 ---- break; default: ! abort (); } if (xlen == 0) *************** resolve_overloaded_unification (tparms, *** 8092,8099 **** expl_subargs); if (subargs) { ! elem = tsubst (TREE_TYPE (fn), subargs, /*complain=*/0, ! NULL_TREE); if (TREE_CODE (elem) == METHOD_TYPE) elem = build_ptrmemfunc_type (build_pointer_type (elem)); good += try_one_overload (tparms, targs, tempargs, parm, elem, --- 8136,8142 ---- expl_subargs); if (subargs) { ! elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE); if (TREE_CODE (elem) == METHOD_TYPE) elem = build_ptrmemfunc_type (build_pointer_type (elem)); good += try_one_overload (tparms, targs, tempargs, parm, elem, *************** resolve_overloaded_unification (tparms, *** 8114,8120 **** } } else ! my_friendly_abort (981006); /* [temp.deduct.type] A template-argument can be deduced from a pointer to function or pointer to member function argument if the set of --- 8157,8163 ---- } } else ! abort (); /* [temp.deduct.type] A template-argument can be deduced from a pointer to function or pointer to member function argument if the set of *************** verify_class_unification (targs, parms, *** 8231,8237 **** int i; int nparms = TREE_VEC_LENGTH (parms); tree new_parms = tsubst (parms, add_outermost_template_args (args, targs), ! /*complain=*/0, NULL_TREE); if (new_parms == error_mark_node) return 1; --- 8274,8280 ---- int i; int nparms = TREE_VEC_LENGTH (parms); tree new_parms = tsubst (parms, add_outermost_template_args (args, targs), ! tf_none, NULL_TREE); if (new_parms == error_mark_node) return 1; *************** template_decl_level (decl) *** 8432,8438 **** return TEMPLATE_PARM_LEVEL (DECL_INITIAL (decl)); default: ! my_friendly_abort (0); return 0; } } --- 8475,8481 ---- return TEMPLATE_PARM_LEVEL (DECL_INITIAL (decl)); default: ! abort (); return 0; } } *************** check_cv_quals_for_unify (strict, arg, p *** 8447,8458 **** tree arg; tree parm; { if (!(strict & (UNIFY_ALLOW_MORE_CV_QUAL | UNIFY_ALLOW_OUTER_MORE_CV_QUAL)) ! && !at_least_as_qualified_p (arg, parm)) return 0; if (!(strict & (UNIFY_ALLOW_LESS_CV_QUAL | UNIFY_ALLOW_OUTER_LESS_CV_QUAL)) ! && !at_least_as_qualified_p (parm, arg)) return 0; return 1; --- 8490,8517 ---- tree arg; tree parm; { + int arg_quals = cp_type_quals (arg); + int parm_quals = cp_type_quals (parm); + + if (TREE_CODE (parm) == TEMPLATE_TYPE_PARM) + { + /* If the cvr quals of parm will not unify with ARG, they'll be + ignored in instantiation, so we have to do the same here. */ + if (TREE_CODE (arg) == REFERENCE_TYPE + || TREE_CODE (arg) == FUNCTION_TYPE + || TREE_CODE (arg) == METHOD_TYPE) + parm_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); + if (!POINTER_TYPE_P (arg) && + TREE_CODE (arg) != TEMPLATE_TYPE_PARM) + parm_quals &= ~TYPE_QUAL_RESTRICT; + } + if (!(strict & (UNIFY_ALLOW_MORE_CV_QUAL | UNIFY_ALLOW_OUTER_MORE_CV_QUAL)) ! && (arg_quals & parm_quals) != parm_quals) return 0; if (!(strict & (UNIFY_ALLOW_LESS_CV_QUAL | UNIFY_ALLOW_OUTER_LESS_CV_QUAL)) ! && (parm_quals & arg_quals) != arg_quals) return 0; return 1; *************** check_cv_quals_for_unify (strict, arg, p *** 8488,8494 **** qualified at this point. UNIFY_ALLOW_OUTER_LESS_CV_QUAL: This is the outermost level of a deduction, and PARM can be less CV ! qualified at this point. */ static int unify (tparms, targs, parm, arg, strict) --- 8547,8560 ---- qualified at this point. UNIFY_ALLOW_OUTER_LESS_CV_QUAL: This is the outermost level of a deduction, and PARM can be less CV ! qualified at this point. ! UNIFY_ALLOW_MAX_CORRECTION: ! This is an INTEGER_TYPE's maximum value. Used if the range may ! have been derived from a size specification, such as an array size. ! If the size was given by a nontype template parameter N, the maximum ! value will have the form N-1. The flag says that we can (and indeed ! must) unify N with (ARG + 1), an exception to the normal rules on ! folding PARM. */ static int unify (tparms, targs, parm, arg, strict) *************** unify (tparms, targs, parm, arg, strict) *** 8544,8553 **** --- 8610,8622 ---- strict &= ~UNIFY_ALLOW_DERIVED; strict &= ~UNIFY_ALLOW_OUTER_MORE_CV_QUAL; strict &= ~UNIFY_ALLOW_OUTER_LESS_CV_QUAL; + strict &= ~UNIFY_ALLOW_MAX_CORRECTION; switch (TREE_CODE (parm)) { case TYPENAME_TYPE: + case SCOPE_REF: + case UNBOUND_CLASS_TEMPLATE: /* In a type which contains a nested-name-specifier, template argument values cannot be deduced for template parameters used within the nested-name-specifier. */ *************** unify (tparms, targs, parm, arg, strict) *** 8645,8655 **** /* Consider the case where ARG is `const volatile int' and PARM is `const T'. Then, T should be `volatile int'. */ ! arg = ! cp_build_qualified_type_real (arg, ! CP_TYPE_QUALS (arg) ! & ~CP_TYPE_QUALS (parm), ! /*complain=*/0); if (arg == error_mark_node) return 1; --- 8714,8721 ---- /* Consider the case where ARG is `const volatile int' and PARM is `const T'. Then, T should be `volatile int'. */ ! arg = cp_build_qualified_type_real ! (arg, cp_type_quals (arg) & ~cp_type_quals (parm), tf_none); if (arg == error_mark_node) return 1; *************** unify (tparms, targs, parm, arg, strict) *** 8698,8704 **** else if (i == 0) return 1; else ! my_friendly_abort (42); } /* [temp.deduct.type] If, in the declaration of a function template --- 8764,8770 ---- else if (i == 0) return 1; else ! abort (); } /* [temp.deduct.type] If, in the declaration of a function template *************** unify (tparms, targs, parm, arg, strict) *** 8799,8805 **** return 1; if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg) && unify (tparms, targs, TYPE_MAX_VALUE (parm), ! TYPE_MAX_VALUE (arg), UNIFY_ALLOW_INTEGER)) return 1; } /* We have already checked cv-qualification at the top of the --- 8865,8872 ---- return 1; if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg) && unify (tparms, targs, TYPE_MAX_VALUE (parm), ! TYPE_MAX_VALUE (arg), ! UNIFY_ALLOW_INTEGER | UNIFY_ALLOW_MAX_CORRECTION)) return 1; } /* We have already checked cv-qualification at the top of the *************** unify (tparms, targs, parm, arg, strict) *** 8929,8935 **** return 1; case MINUS_EXPR: ! if (TREE_CODE (TREE_OPERAND (parm, 1)) == INTEGER_CST) { /* We handle this case specially, since it comes up with arrays. In particular, something like: --- 8996,9003 ---- return 1; case MINUS_EXPR: ! if (tree_int_cst_equal (TREE_OPERAND (parm, 1), integer_one_node) ! && (strict_in & UNIFY_ALLOW_MAX_CORRECTION)) { /* We handle this case specially, since it comes up with arrays. In particular, something like: *************** get_bindings_real (fn, decl, explicit_ar *** 9117,9129 **** converted_args = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl), explicit_args, NULL_TREE, ! /*complain=*/0, ! /*require_all_arguments=*/0)); if (converted_args == error_mark_node) return NULL_TREE; ! decl_type = tsubst (decl_type, converted_args, /*complain=*/0, ! NULL_TREE); if (decl_type == error_mark_node) return NULL_TREE; } --- 9185,9195 ---- converted_args = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl), explicit_args, NULL_TREE, ! tf_none, /*require_all_arguments=*/0)); if (converted_args == error_mark_node) return NULL_TREE; ! decl_type = tsubst (decl_type, converted_args, tf_none, NULL_TREE); if (decl_type == error_mark_node) return NULL_TREE; } *************** get_bindings_overload (fn, decl, explici *** 9166,9172 **** /* Return the innermost template arguments that, when applied to a template specialization whose innermost template parameters are ! TPARMS, and whose specialization arguments are ARGS, yield the ARGS. For example, suppose we have: --- 9232,9238 ---- /* Return the innermost template arguments that, when applied to a template specialization whose innermost template parameters are ! TPARMS, and whose specialization arguments are PARMS, yield the ARGS. For example, suppose we have: *************** void *** 9390,9396 **** do_decl_instantiation (declspecs, declarator, storage) tree declspecs, declarator, storage; { ! tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0, NULL_TREE); tree result = NULL_TREE; int extern_p = 0; --- 9456,9462 ---- do_decl_instantiation (declspecs, declarator, storage) tree declspecs, declarator, storage; { ! tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0, NULL); tree result = NULL_TREE; int extern_p = 0; *************** do_decl_instantiation (declspecs, declar *** 9400,9406 **** return; else if (! DECL_LANG_SPECIFIC (decl)) { ! cp_error ("explicit instantiation of non-template `%#D'", decl); return; } else if (TREE_CODE (decl) == VAR_DECL) --- 9466,9472 ---- return; else if (! DECL_LANG_SPECIFIC (decl)) { ! error ("explicit instantiation of non-template `%#D'", decl); return; } else if (TREE_CODE (decl) == VAR_DECL) *************** do_decl_instantiation (declspecs, declar *** 9416,9428 **** result = lookup_field (DECL_CONTEXT (decl), DECL_NAME (decl), 0, 0); if (result && TREE_CODE (result) != VAR_DECL) { ! cp_error ("no matching template for `%D' found", result); return; } } else if (TREE_CODE (decl) != FUNCTION_DECL) { ! cp_error ("explicit instantiation of `%#D'", decl); return; } else --- 9482,9494 ---- result = lookup_field (DECL_CONTEXT (decl), DECL_NAME (decl), 0, 0); if (result && TREE_CODE (result) != VAR_DECL) { ! error ("no matching template for `%D' found", result); return; } } else if (TREE_CODE (decl) != FUNCTION_DECL) { ! error ("explicit instantiation of `%#D'", decl); return; } else *************** do_decl_instantiation (declspecs, declar *** 9439,9445 **** No program shall both explicitly instantiate and explicitly specialize a template. */ ! cp_pedwarn ("explicit instantiation of `%#D' after", result); cp_pedwarn_at ("explicit specialization here", result); return; } --- 9505,9511 ---- No program shall both explicitly instantiate and explicitly specialize a template. */ ! pedwarn ("explicit instantiation of `%#D' after", result); cp_pedwarn_at ("explicit specialization here", result); return; } *************** do_decl_instantiation (declspecs, declar *** 9455,9461 **** the opposite case. If -frepo, chances are we already got marked as an explicit instantiation because of the repo file. */ if (DECL_INTERFACE_KNOWN (result) && !extern_p && !flag_use_repository) ! cp_pedwarn ("duplicate explicit instantiation of `%#D'", result); /* If we've already instantiated the template, just return now. */ if (DECL_INTERFACE_KNOWN (result)) --- 9521,9527 ---- the opposite case. If -frepo, chances are we already got marked as an explicit instantiation because of the repo file. */ if (DECL_INTERFACE_KNOWN (result) && !extern_p && !flag_use_repository) ! pedwarn ("duplicate explicit instantiation of `%#D'", result); /* If we've already instantiated the template, just return now. */ if (DECL_INTERFACE_KNOWN (result)) *************** do_decl_instantiation (declspecs, declar *** 9463,9474 **** } else if (!DECL_IMPLICIT_INSTANTIATION (result)) { ! cp_error ("no matching template for `%D' found", result); return; } else if (!DECL_TEMPLATE_INFO (result)) { ! cp_pedwarn ("explicit instantiation of non-template `%#D'", result); return; } --- 9529,9540 ---- } else if (!DECL_IMPLICIT_INSTANTIATION (result)) { ! error ("no matching template for `%D' found", result); return; } else if (!DECL_TEMPLATE_INFO (result)) { ! pedwarn ("explicit instantiation of non-template `%#D'", result); return; } *************** do_decl_instantiation (declspecs, declar *** 9479,9490 **** ; else if (storage == ridpointers[(int) RID_EXTERN]) { ! if (pedantic) ! cp_pedwarn ("ISO C++ forbids the use of `extern' on explicit instantiations"); extern_p = 1; } else ! cp_error ("storage class `%D' applied to template instantiation", storage); SET_DECL_EXPLICIT_INSTANTIATION (result); --- 9545,9556 ---- ; else if (storage == ridpointers[(int) RID_EXTERN]) { ! if (pedantic && !in_system_header) ! pedwarn ("ISO C++ forbids the use of `extern' on explicit instantiations"); extern_p = 1; } else ! error ("storage class `%D' applied to template instantiation", storage); SET_DECL_EXPLICIT_INSTANTIATION (result); *************** mark_class_instantiated (t, extern_p) *** 9502,9508 **** SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t); SET_CLASSTYPE_INTERFACE_KNOWN (t); CLASSTYPE_INTERFACE_ONLY (t) = extern_p; - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p; TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p; if (! extern_p) { --- 9568,9573 ---- *************** mark_class_instantiated (t, extern_p) *** 9519,9525 **** void do_type_instantiation (t, storage, complain) tree t, storage; ! int complain; { int extern_p = 0; int nomem_p = 0; --- 9584,9590 ---- void do_type_instantiation (t, storage, complain) tree t, storage; ! tsubst_flags_t complain; { int extern_p = 0; int nomem_p = 0; *************** do_type_instantiation (t, storage, compl *** 9530,9536 **** if (! CLASS_TYPE_P (t) || ! CLASSTYPE_TEMPLATE_INFO (t)) { ! cp_error ("explicit instantiation of non-template type `%T'", t); return; } --- 9595,9601 ---- if (! CLASS_TYPE_P (t) || ! CLASSTYPE_TEMPLATE_INFO (t)) { ! error ("explicit instantiation of non-template type `%T'", t); return; } *************** do_type_instantiation (t, storage, compl *** 9543,9558 **** if (!COMPLETE_TYPE_P (t)) { ! if (complain) ! cp_error ("explicit instantiation of `%#T' before definition of template", t); return; } if (storage != NULL_TREE) { ! if (pedantic) ! cp_pedwarn("ISO C++ forbids the use of `%s' on explicit instantiations", IDENTIFIER_POINTER (storage)); if (storage == ridpointers[(int) RID_INLINE]) --- 9608,9623 ---- if (!COMPLETE_TYPE_P (t)) { ! if (complain & tf_error) ! error ("explicit instantiation of `%#T' before definition of template", t); return; } if (storage != NULL_TREE) { ! if (pedantic && !in_system_header) ! pedwarn("ISO C++ forbids the use of `%s' on explicit instantiations", IDENTIFIER_POINTER (storage)); if (storage == ridpointers[(int) RID_INLINE]) *************** do_type_instantiation (t, storage, compl *** 9563,9569 **** static_p = 1; else { ! cp_error ("storage class `%D' applied to template instantiation", storage); extern_p = 0; } --- 9628,9634 ---- static_p = 1; else { ! error ("storage class `%D' applied to template instantiation", storage); extern_p = 0; } *************** do_type_instantiation (t, storage, compl *** 9575,9583 **** No program shall both explicitly instantiate and explicitly specialize a template. */ ! if (complain) { ! cp_error ("explicit instantiation of `%#T' after", t); cp_error_at ("explicit specialization here", t); } return; --- 9640,9648 ---- No program shall both explicitly instantiate and explicitly specialize a template. */ ! if (complain & tf_error) { ! error ("explicit instantiation of `%#T' after", t); cp_error_at ("explicit specialization here", t); } return; *************** do_type_instantiation (t, storage, compl *** 9591,9601 **** If CLASSTYPE_INTERFACE_ONLY, then the first explicit instantiation was `extern'. If EXTERN_P then the second is. If -frepo, chances ! are we already got marked as an explicit instantion because of the repo file. All these cases are OK. */ if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository ! && complain) ! cp_pedwarn ("duplicate explicit instantiation of `%#T'", t); /* If we've already instantiated the template, just return now. */ if (!CLASSTYPE_INTERFACE_ONLY (t)) --- 9656,9666 ---- If CLASSTYPE_INTERFACE_ONLY, then the first explicit instantiation was `extern'. If EXTERN_P then the second is. If -frepo, chances ! are we already got marked as an explicit instantiation because of the repo file. All these cases are OK. */ if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository ! && (complain & tf_error)) ! pedwarn ("duplicate explicit instantiation of `%#T'", t); /* If we've already instantiated the template, just return now. */ if (!CLASSTYPE_INTERFACE_ONLY (t)) *************** regenerate_decl_from_template (decl, tmp *** 9714,9727 **** pushclass (DECL_CONTEXT (decl), 2); /* Do the substitution to get the new declaration. */ ! new_decl = tsubst (code_pattern, args, /*complain=*/1, NULL_TREE); if (TREE_CODE (decl) == VAR_DECL) { /* Set up DECL_INITIAL, since tsubst doesn't. */ DECL_INITIAL (new_decl) = tsubst_expr (DECL_INITIAL (code_pattern), args, ! /*complain=*/1, DECL_TI_TEMPLATE (decl)); /* Pop the class context we pushed above. */ popclass (); } --- 9779,9792 ---- pushclass (DECL_CONTEXT (decl), 2); /* Do the substitution to get the new declaration. */ ! new_decl = tsubst (code_pattern, args, tf_error, NULL_TREE); if (TREE_CODE (decl) == VAR_DECL) { /* Set up DECL_INITIAL, since tsubst doesn't. */ DECL_INITIAL (new_decl) = tsubst_expr (DECL_INITIAL (code_pattern), args, ! tf_error, DECL_TI_TEMPLATE (decl)); /* Pop the class context we pushed above. */ popclass (); } *************** instantiate_decl (d, defer_ok) *** 9908,9913 **** --- 9973,9999 ---- import_export_decl (d); } + if (!defer_ok) + { + /* Recheck the substitutions to obtain any warning messages + about ignoring cv qualifiers. */ + tree gen = DECL_TEMPLATE_RESULT (gen_tmpl); + tree type = TREE_TYPE (gen); + + if (TREE_CODE (gen) == FUNCTION_DECL) + { + tsubst (DECL_ARGUMENTS (gen), args, tf_error | tf_warning, d); + tsubst (TYPE_RAISES_EXCEPTIONS (type), args, + tf_error | tf_warning, d); + /* Don't simply tsubst the function type, as that will give + duplicate warnings about poor parameter qualifications. + The function arguments are the same as the decl_arguments + without the top level cv qualifiers. */ + type = TREE_TYPE (type); + } + tsubst (type, args, tf_error | tf_warning, d); + } + if (TREE_CODE (d) == VAR_DECL && DECL_INITIALIZED_IN_CLASS_P (d) && DECL_INITIAL (d) == NULL_TREE) /* We should have set up DECL_INITIAL in instantiate_class_template. */ *************** instantiate_decl (d, defer_ok) *** 9915,9921 **** /* Reject all external templates except inline functions. */ else if (DECL_INTERFACE_KNOWN (d) && ! DECL_NOT_REALLY_EXTERN (d) ! && ! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d))) goto out; /* Defer all other templates, unless we have been explicitly forbidden from doing so. We restore the source position here --- 10001,10008 ---- /* Reject all external templates except inline functions. */ else if (DECL_INTERFACE_KNOWN (d) && ! DECL_NOT_REALLY_EXTERN (d) ! && ! (TREE_CODE (d) == FUNCTION_DECL ! && DECL_INLINE (d))) goto out; /* Defer all other templates, unless we have been explicitly forbidden from doing so. We restore the source position here *************** instantiate_decl (d, defer_ok) *** 9934,9941 **** member function or static data member of a class template shall be present in every translation unit in which it is explicitly instantiated. */ ! cp_error ("explicit instantiation of `%D' but no definition available", ! d); add_pending_template (d); goto out; --- 10021,10028 ---- member function or static data member of a class template shall be present in every translation unit in which it is explicitly instantiated. */ ! pedwarn ! ("explicit instantiation of `%D' but no definition available", d); add_pending_template (d); goto out; *************** instantiate_decl (d, defer_ok) *** 9988,10000 **** /* Set up context. */ start_function (NULL_TREE, d, NULL_TREE, SF_PRE_PARSED); - /* We already set up __FUNCTION__, etc., so we don't want to do - it again now. */ - function_name_declared_p = 1; - /* Substitute into the body of the function. */ tsubst_expr (DECL_SAVED_TREE (code_pattern), args, ! /*complain=*/1, tmpl); /* We don't need the local specializations any more. */ htab_delete (local_specializations); --- 10075,10083 ---- /* Set up context. */ start_function (NULL_TREE, d, NULL_TREE, SF_PRE_PARSED); /* Substitute into the body of the function. */ tsubst_expr (DECL_SAVED_TREE (code_pattern), args, ! tf_error | tf_warning, tmpl); /* We don't need the local specializations any more. */ htab_delete (local_specializations); *************** int *** 10028,10033 **** --- 10111,10117 ---- instantiate_pending_templates () { tree *t; + tree last = NULL_TREE; int instantiated_something = 0; int reconsider; *************** instantiate_pending_templates () *** 10066,10073 **** /* If INSTANTIATION has been instantiated, then we don't need to consider it again in the future. */ *t = TREE_CHAIN (*t); ! else ! t = &TREE_CHAIN (*t); } else { --- 10150,10160 ---- /* If INSTANTIATION has been instantiated, then we don't need to consider it again in the future. */ *t = TREE_CHAIN (*t); ! else ! { ! last = *t; ! t = &TREE_CHAIN (*t); ! } } else { *************** instantiate_pending_templates () *** 10088,10130 **** /* If INSTANTIATION has been instantiated, then we don't need to consider it again in the future. */ *t = TREE_CHAIN (*t); ! else ! t = &TREE_CHAIN (*t); } tinst_depth = 0; current_tinst_level = NULL_TREE; } ! template_tail = t; ! ! /* Go through the things that are template instantiations if we are ! using guiding declarations. */ ! t = &maybe_templates; ! while (*t) ! { ! tree template; ! tree fn; ! tree args; ! ! fn = TREE_VALUE (*t); ! ! if (DECL_INITIAL (fn)) ! /* If the FN is already defined, then it was either already ! instantiated or, even though guiding declarations were ! allowed, a non-template definition was provided. */ ! ; ! else ! { ! template = TREE_PURPOSE (*t); ! args = get_bindings (template, fn, NULL_TREE); ! fn = instantiate_template (template, args); ! instantiate_decl (fn, /*defer_ok=*/0); ! reconsider = 1; ! } ! ! /* Remove this entry from the chain. */ ! *t = TREE_CHAIN (*t); ! } ! maybe_template_tail = t; } while (reconsider); --- 10175,10190 ---- /* If INSTANTIATION has been instantiated, then we don't need to consider it again in the future. */ *t = TREE_CHAIN (*t); ! else ! { ! last = *t; ! t = &TREE_CHAIN (*t); ! } } tinst_depth = 0; current_tinst_level = NULL_TREE; } ! last_pending_template = last; } while (reconsider); *************** tsubst_initializer_list (t, argvec) *** 10149,10157 **** tree init; tree val; ! decl = tsubst_copy (TREE_PURPOSE (t), argvec, /*complain=*/1, NULL_TREE); ! init = tsubst_expr (TREE_VALUE (t), argvec, /*complain=*/1, NULL_TREE); if (!init) --- 10209,10217 ---- tree init; tree val; ! decl = tsubst_copy (TREE_PURPOSE (t), argvec, tf_error | tf_warning, NULL_TREE); ! init = tsubst_expr (TREE_VALUE (t), argvec, tf_error | tf_warning, NULL_TREE); if (!init) *************** tsubst_enum (tag, newtag, args) *** 10201,10207 **** /* Note that in a template enum, the TREE_VALUE is the CONST_DECL, not the corresponding INTEGER_CST. */ value = tsubst_expr (DECL_INITIAL (TREE_VALUE (e)), ! args, /*complain=*/1, NULL_TREE); /* Give this enumeration constant the correct access. */ --- 10261,10267 ---- /* Note that in a template enum, the TREE_VALUE is the CONST_DECL, not the corresponding INTEGER_CST. */ value = tsubst_expr (DECL_INITIAL (TREE_VALUE (e)), ! args, tf_error | tf_warning, NULL_TREE); /* Give this enumeration constant the correct access. */ *************** get_mostly_instantiated_function_type (d *** 10270,10285 **** /* Now, do the (partial) substitution to figure out the appropriate function type. */ ! fn_type = tsubst (fn_type, partial_args, /*complain=*/1, NULL_TREE); if (DECL_STATIC_FUNCTION_P (decl)) ! context = tsubst (context, partial_args, /*complain=*/1, NULL_TREE); /* Substitute into the template parameters to obtain the real innermost set of parameters. This step is important if the innermost set of template parameters contains value parameters whose types depend on outer template parameters. */ TREE_VEC_LENGTH (partial_args)--; ! tparms = tsubst_template_parms (tparms, partial_args, /*complain=*/1); } if (contextp) --- 10330,10345 ---- /* Now, do the (partial) substitution to figure out the appropriate function type. */ ! fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE); if (DECL_STATIC_FUNCTION_P (decl)) ! context = tsubst (context, partial_args, tf_error, NULL_TREE); /* Substitute into the template parameters to obtain the real innermost set of parameters. This step is important if the innermost set of template parameters contains value parameters whose types depend on outer template parameters. */ TREE_VEC_LENGTH (partial_args)--; ! tparms = tsubst_template_parms (tparms, partial_args, tf_error); } if (contextp) *************** current_instantiation () *** 10312,10324 **** } /* [temp.param] Check that template non-type parm TYPE is of an allowable ! type. Return zero for ok, non-zero for disallowed. If COMPLAIN is ! non-zero, then complain. */ static int invalid_nontype_parm_type_p (type, complain) tree type; ! int complain; { if (INTEGRAL_TYPE_P (type)) return 0; --- 10372,10384 ---- } /* [temp.param] Check that template non-type parm TYPE is of an allowable ! type. Return zero for ok, non-zero for disallowed. Issue error and ! warning messages under control of COMPLAIN. */ static int invalid_nontype_parm_type_p (type, complain) tree type; ! tsubst_flags_t complain; { if (INTEGRAL_TYPE_P (type)) return 0; *************** invalid_nontype_parm_type_p (type, compl *** 10328,10352 **** return 0; else if (TYPE_PTRMEMFUNC_P (type)) return 0; - else if (!pedantic && TREE_CODE (type) == REAL_TYPE) - { - if (complain) - cp_deprecated ("floating point template constant parameter"); - return 0; /* GNU extension */ - } - else if (!pedantic && TREE_CODE (type) == COMPLEX_TYPE) - { - if (complain) - cp_deprecated ("complex template constant parameter"); - return 0; /* GNU extension */ - } else if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) return 0; else if (TREE_CODE (type) == TYPENAME_TYPE) return 0; ! if (complain) ! cp_error ("`%#T' is not a valid type for a template constant parameter", type); return 1; } --- 10388,10400 ---- return 0; else if (TYPE_PTRMEMFUNC_P (type)) return 0; else if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) return 0; else if (TREE_CODE (type) == TYPENAME_TYPE) return 0; ! if (complain & tf_error) ! error ("`%#T' is not a valid type for a template constant parameter", type); return 1; } diff -Nrc3pad gcc-3.0.4/gcc/cp/ptree.c gcc-3.1/gcc/cp/ptree.c *** gcc-3.0.4/gcc/cp/ptree.c Tue Sep 5 00:57:57 2000 --- gcc-3.1/gcc/cp/ptree.c Fri Nov 9 23:30:28 2001 *************** Boston, MA 02111-1307, USA. */ *** 27,33 **** #include "cp-tree.h" void ! print_lang_decl (file, node, indent) FILE *file; tree node; int indent; --- 27,33 ---- #include "cp-tree.h" void ! cxx_print_decl (file, node, indent) FILE *file; tree node; int indent; *************** print_lang_decl (file, node, indent) *** 66,72 **** } void ! print_lang_type (file, node, indent) FILE *file; register tree node; int indent; --- 66,72 ---- } void ! cxx_print_type (file, node, indent) FILE *file; register tree node; int indent; *************** print_lang_type (file, node, indent) *** 152,166 **** fprintf (file, " interface-only"); if (CLASSTYPE_INTERFACE_UNKNOWN (node)) fprintf (file, " interface-unknown"); - if (CLASSTYPE_VTABLE_NEEDS_WRITING (node)) - fprintf (file, " vtable-needs-writing"); print_node (file, "member-functions", CLASSTYPE_METHOD_VEC (node), indent + 4); } } void ! print_lang_identifier (file, node, indent) FILE *file; tree node; int indent; --- 152,164 ---- fprintf (file, " interface-only"); if (CLASSTYPE_INTERFACE_UNKNOWN (node)) fprintf (file, " interface-unknown"); print_node (file, "member-functions", CLASSTYPE_METHOD_VEC (node), indent + 4); } } void ! cxx_print_identifier (file, node, indent) FILE *file; tree node; int indent; *************** print_lang_identifier (file, node, inden *** 175,181 **** } void ! lang_print_xnode (file, node, indent) FILE *file; tree node; int indent; --- 173,179 ---- } void ! cxx_print_xnode (file, node, indent) FILE *file; tree node; int indent; diff -Nrc3pad gcc-3.0.4/gcc/cp/repo.c gcc-3.1/gcc/cp/repo.c *** gcc-3.0.4/gcc/cp/repo.c Wed Jun 6 03:17:49 2001 --- gcc-3.1/gcc/cp/repo.c Wed Jan 23 14:26:01 2002 *************** Boston, MA 02111-1307, USA. */ *** 33,42 **** #include "obstack.h" #include "toplev.h" #include "ggc.h" static tree repo_get_id PARAMS ((tree)); static char *extract_string PARAMS ((char **)); ! static char *get_base_filename PARAMS ((const char *)); static void open_repo_file PARAMS ((const char *)); static char *afgets PARAMS ((FILE *)); static void reopen_repo_file_for_write PARAMS ((void)); --- 33,43 ---- #include "obstack.h" #include "toplev.h" #include "ggc.h" + #include "diagnostic.h" static tree repo_get_id PARAMS ((tree)); static char *extract_string PARAMS ((char **)); ! static const char *get_base_filename PARAMS ((const char *)); static void open_repo_file PARAMS ((const char *)); static char *afgets PARAMS ((FILE *)); static void reopen_repo_file_for_write PARAMS ((void)); *************** static FILE *repo_file; *** 48,54 **** static char *old_args, *old_dir, *old_main; - extern int flag_use_repository; static struct obstack temporary_obstack; extern struct obstack permanent_obstack; --- 49,54 ---- *************** repo_get_id (t) *** 103,109 **** the vtable, so going ahead would give the wrong answer. See g++.pt/instantiate4.C. */ if (!COMPLETE_TYPE_P (t) || TYPE_BEING_DEFINED (t)) ! my_friendly_abort (981113); vtable = get_vtbl_decl_for_binfo (TYPE_BINFO (t)); --- 103,109 ---- the vtable, so going ahead would give the wrong answer. See g++.pt/instantiate4.C. */ if (!COMPLETE_TYPE_P (t) || TYPE_BEING_DEFINED (t)) ! abort (); vtable = get_vtbl_decl_for_binfo (TYPE_BINFO (t)); *************** repo_template_used (t) *** 147,153 **** 0); } else ! my_friendly_abort (1); if (! IDENTIFIER_REPO_USED (id)) { --- 147,153 ---- 0); } else ! abort (); if (! IDENTIFIER_REPO_USED (id)) { *************** extract_string (pp) *** 246,252 **** return obstack_finish (&temporary_obstack); } ! static char * get_base_filename (filename) const char *filename; { --- 246,252 ---- return obstack_finish (&temporary_obstack); } ! const char * get_base_filename (filename) const char *filename; { *************** get_base_filename (filename) *** 274,280 **** return NULL; } ! return file_name_nondirectory (filename); } static void --- 274,280 ---- return NULL; } ! return lbasename (filename); } static void *************** open_repo_file (filename) *** 287,293 **** if (s == NULL) return; ! p = file_name_nondirectory (s); p = strrchr (p, '.'); if (! p) p = s + strlen (s); --- 287,293 ---- if (s == NULL) return; ! p = lbasename (s); p = strrchr (p, '.'); if (! p) p = s + strlen (s); diff -Nrc3pad gcc-3.0.4/gcc/cp/rtti.c gcc-3.1/gcc/cp/rtti.c *** gcc-3.0.4/gcc/cp/rtti.c Thu Dec 6 12:54:19 2001 --- gcc-3.1/gcc/cp/rtti.c Wed Jan 23 14:26:02 2002 *************** Boston, MA 02111-1307, USA. */ *** 41,56 **** extern struct obstack permanent_obstack; - static tree build_headof_sub PARAMS((tree)); static tree build_headof PARAMS((tree)); static tree ifnonnull PARAMS((tree, tree)); static tree tinfo_name PARAMS((tree)); - static tree get_base_offset PARAMS((tree, tree)); static tree build_dynamic_cast_1 PARAMS((tree, tree)); static tree throw_bad_cast PARAMS((void)); static tree throw_bad_typeid PARAMS((void)); static tree get_tinfo_decl_dynamic PARAMS((tree)); ! static tree tinfo_from_decl PARAMS((tree)); static int qualifier_flags PARAMS((tree)); static int target_incomplete_p PARAMS((tree)); static tree tinfo_base_init PARAMS((tree, tree)); --- 41,54 ---- extern struct obstack permanent_obstack; static tree build_headof PARAMS((tree)); static tree ifnonnull PARAMS((tree, tree)); static tree tinfo_name PARAMS((tree)); static tree build_dynamic_cast_1 PARAMS((tree, tree)); static tree throw_bad_cast PARAMS((void)); static tree throw_bad_typeid PARAMS((void)); static tree get_tinfo_decl_dynamic PARAMS((tree)); ! static bool typeid_ok_p PARAMS ((void)); static int qualifier_flags PARAMS((tree)); static int target_incomplete_p PARAMS((tree)); static tree tinfo_base_init PARAMS((tree, tree)); *************** static int doing_runtime = 0; *** 73,108 **** void init_rtti_processing () { ! if (flag_honor_std) ! push_namespace (std_identifier); type_info_type_node = xref_tag (class_type_node, get_identifier ("type_info"), 1); ! if (flag_honor_std) ! pop_namespace (); ! /* FIXME: These identifier prefixes are not set in stone yet. */ ! tinfo_decl_id = get_identifier ("__ti"); ! tinfo_var_id = get_identifier ("__tn"); tinfo_decl_type = build_qualified_type (type_info_type_node, TYPE_QUAL_CONST); } - /* Given a pointer to an object with at least one virtual table - pointer somewhere, return a pointer to a possible sub-object that - has a virtual table pointer in it that is the vtable parent for - that sub-object. */ - - static tree - build_headof_sub (exp) - tree exp; - { - tree type = TREE_TYPE (TREE_TYPE (exp)); - tree basetype = CLASSTYPE_RTTI (type); - tree binfo = get_binfo (basetype, type, 0); - - exp = convert_pointer_to_real (binfo, exp); - return exp; - } - /* Given the expression EXP of type `class *', return the head of the object pointed to by EXP with type cv void*, if the class has any virtual functions (TYPE_POLYMORPHIC_P), else just return the --- 71,84 ---- void init_rtti_processing () { ! push_namespace (std_identifier); type_info_type_node = xref_tag (class_type_node, get_identifier ("type_info"), 1); ! pop_namespace (); tinfo_decl_type = build_qualified_type (type_info_type_node, TYPE_QUAL_CONST); } /* Given the expression EXP of type `class *', return the head of the object pointed to by EXP with type cv void*, if the class has any virtual functions (TYPE_POLYMORPHIC_P), else just return the *************** build_headof (exp) *** 113,119 **** tree exp; { tree type = TREE_TYPE (exp); - tree aref; tree offset; tree index; --- 89,94 ---- *************** build_headof (exp) *** 122,153 **** if (!TYPE_POLYMORPHIC_P (type)) return exp; - if (CLASSTYPE_COM_INTERFACE (type)) - { - cp_error ("RTTI not supported for COM interface type `%T'", type); - return error_mark_node; - } - - /* If we don't have rtti stuff, get to a sub-object that does. */ - if (!CLASSTYPE_VFIELDS (TREE_TYPE (TREE_TYPE (exp)))) - exp = build_headof_sub (exp); /* We use this a couple of times below, protect it. */ exp = save_expr (exp); ! /* Under the new ABI, the offset-to-top field is at index -2 from ! the vptr. */ index = build_int_2 (-2, -1); ! aref = build_vtbl_ref (build_indirect_ref (exp, NULL_PTR), index); ! ! if (flag_vtable_thunks) ! offset = aref; ! else ! offset = build_component_ref (aref, delta_identifier, NULL_TREE, 0); type = build_qualified_type (ptr_type_node, ! CP_TYPE_QUALS (TREE_TYPE (exp))); return build (PLUS_EXPR, type, exp, cp_convert (ptrdiff_type_node, offset)); } --- 97,113 ---- if (!TYPE_POLYMORPHIC_P (type)) return exp; /* We use this a couple of times below, protect it. */ exp = save_expr (exp); ! /* The offset-to-top field is at index -2 from the vptr. */ index = build_int_2 (-2, -1); ! offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index); type = build_qualified_type (ptr_type_node, ! cp_type_quals (TREE_TYPE (exp))); return build (PLUS_EXPR, type, exp, cp_convert (ptrdiff_type_node, offset)); } *************** get_tinfo_decl_dynamic (exp) *** 220,241 **** tree t; tree index; - if (! flag_rtti) - error ("taking dynamic typeid of object with -fno-rtti"); - if (CLASSTYPE_COM_INTERFACE (type)) - { - cp_error ("RTTI not supported for COM interface type `%T'", type); - return error_mark_node; - } - - /* If we don't have rtti stuff, get to a sub-object that does. */ - if (! CLASSTYPE_VFIELDS (type)) - { - exp = build_unary_op (ADDR_EXPR, exp, 0); - exp = build_headof_sub (exp); - exp = build_indirect_ref (exp, NULL_PTR); - } - /* The RTTI information is at index -1. */ index = integer_minus_one_node; t = build_vtbl_ref (exp, index); --- 180,185 ---- *************** get_tinfo_decl_dynamic (exp) *** 248,272 **** return build_unary_op (ADDR_EXPR, exp, 0); } ! tree ! build_typeid (exp) ! tree exp; { - tree cond = NULL_TREE; - int nonnull = 0; - if (! flag_rtti) { error ("cannot use typeid with -fno-rtti"); ! return error_mark_node; } if (!COMPLETE_TYPE_P (type_info_type_node)) { error ("must #include before using typeid"); ! return error_mark_node; } if (processing_template_decl) return build_min_nt (TYPEID_EXPR, exp); --- 192,225 ---- return build_unary_op (ADDR_EXPR, exp, 0); } ! static bool ! typeid_ok_p () { if (! flag_rtti) { error ("cannot use typeid with -fno-rtti"); ! return false; } if (!COMPLETE_TYPE_P (type_info_type_node)) { error ("must #include before using typeid"); ! return false; } + return true; + } + + tree + build_typeid (exp) + tree exp; + { + tree cond = NULL_TREE; + int nonnull = 0; + + if (exp == error_mark_node || !typeid_ok_p ()) + return error_mark_node; + if (processing_template_decl) return build_min_nt (TYPEID_EXPR, exp); *************** build_typeid (exp) *** 285,291 **** if (exp == error_mark_node) return error_mark_node; ! exp = tinfo_from_decl (exp); if (cond) { --- 238,244 ---- if (exp == error_mark_node) return error_mark_node; ! exp = build_indirect_ref (exp, NULL); if (cond) { *************** tinfo_name (type) *** 310,322 **** return name_string; } ! /* Returns a decl for a function or variable which can be used to obtain a ! type_info object for TYPE. The old-abi uses functions, the new-abi ! uses the type_info object directly. You can take the address of the ! returned decl, to save the decl. To use the decl call ! tinfo_from_decl. You must arrange that the decl is mark_used, if ! actually use it --- decls in vtables are only used if the vtable is ! output. */ tree get_tinfo_decl (type) --- 263,271 ---- return name_string; } ! /* Returns a decl for the type_info variable for TYPE. You must ! arrange that the decl is mark_used, if actually use it --- decls in ! vtables are only used if the vtable is output. */ tree get_tinfo_decl (type) *************** get_tinfo_decl (type) *** 328,334 **** if (COMPLETE_TYPE_P (type) && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) { ! cp_error ("cannot create type information for type `%T' because its size is variable", type); return error_mark_node; } --- 277,283 ---- if (COMPLETE_TYPE_P (type) && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) { ! error ("cannot create type information for type `%T' because its size is variable", type); return error_mark_node; } *************** get_tinfo_decl (type) *** 348,354 **** { /* The tinfo decl is the type_info object itself. We make all tinfo objects look as type_info, even though they will end up ! being a subclass of that when emitted. This means the we'll erroneously think we know the dynamic type -- be careful in the runtime. */ d = build_lang_decl (VAR_DECL, name, tinfo_decl_type); --- 297,303 ---- { /* The tinfo decl is the type_info object itself. We make all tinfo objects look as type_info, even though they will end up ! being a subclass of that when emitted. This means that we'll erroneously think we know the dynamic type -- be careful in the runtime. */ d = build_lang_decl (VAR_DECL, name, tinfo_decl_type); *************** get_tinfo_decl (type) *** 373,420 **** return d; } - /* Given an expr produced by get_tinfo_decl, return an expr which - produces a reference to the type_info object. */ - - static tree - tinfo_from_decl (expr) - tree expr; - { - tree t; - - if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) - t = build_indirect_ref (expr, NULL); - else - t = expr; - - return t; - } - - tree - get_typeid_1 (type) - tree type; - { - tree t; - - t = get_tinfo_decl (type); - t = tinfo_from_decl (t); - return convert_from_reference (t); - } - /* Return the type_info object for TYPE. */ tree get_typeid (type) tree type; { ! if (type == error_mark_node) return error_mark_node; - - if (!COMPLETE_TYPE_P (type_info_type_node)) - { - error ("must #include before using typeid"); - return error_mark_node; - } if (processing_template_decl) return build_min_nt (TYPEID_EXPR, type); --- 322,335 ---- return d; } /* Return the type_info object for TYPE. */ tree get_typeid (type) tree type; { ! if (type == error_mark_node || !typeid_ok_p ()) return error_mark_node; if (processing_template_decl) return build_min_nt (TYPEID_EXPR, type); *************** get_typeid (type) *** 435,441 **** if (!type) return error_mark_node; ! return get_typeid_1 (type); } /* Check whether TEST is null before returning RESULT. If TEST is used in --- 350,356 ---- if (!type) return error_mark_node; ! return get_tinfo_decl (type); } /* Check whether TEST is null before returning RESULT. If TEST is used in *************** ifnonnull (test, result) *** 451,499 **** result); } - /* Generate the constant expression describing where direct base BINFO - appears within the PARENT. How to interpret this expression depends on - details of the ABI, which the runtime must be aware of. */ - - static tree - get_base_offset (binfo, parent) - tree binfo; - tree parent; - { - if (! TREE_VIA_VIRTUAL (binfo)) - return BINFO_OFFSET (binfo); - else if (! vbase_offsets_in_vtable_p ()) - { - const char *name; - tree result; - tree field; - - FORMAT_VBASE_NAME (name, BINFO_TYPE (binfo)); - field = lookup_field (parent, get_identifier (name), 0, 0); - result = byte_position (field); - - if (DECL_CONTEXT (field) != parent) - { - /* The vbase pointer might be in a non-virtual base of PARENT. - * Adjust for the offset of that base in PARENT. */ - tree path; - - get_base_distance (DECL_CONTEXT (field), parent, -1, &path); - result = build (PLUS_EXPR, TREE_TYPE (result), - result, BINFO_OFFSET (path)); - result = fold (result); - } - return result; - } - else - /* Under the new ABI, we store the vtable offset at which - the virtual base offset can be found. */ - return convert (sizetype, - BINFO_VPTR_FIELD (binfo_for_vbase (BINFO_TYPE (binfo), - parent))); - - } - /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working paper. */ --- 366,371 ---- *************** build_dynamic_cast_1 (type, expr) *** 600,627 **** /* If *type is an unambiguous accessible base class of *exprtype, convert statically. */ { ! int distance; ! tree path; ! ! distance = get_base_distance (TREE_TYPE (type), TREE_TYPE (exprtype), 1, ! &path); ! if (distance == -2) ! { ! cp_error ("dynamic_cast from `%T' to ambiguous base class `%T'", ! TREE_TYPE (exprtype), TREE_TYPE (type)); ! return error_mark_node; ! } ! if (distance == -3) ! { ! cp_error ("dynamic_cast from `%T' to private base class `%T'", ! TREE_TYPE (exprtype), TREE_TYPE (type)); ! return error_mark_node; ! } ! if (distance >= 0) { ! expr = build_vbase_path (PLUS_EXPR, type, expr, path, 0); if (TREE_CODE (exprtype) == POINTER_TYPE) expr = non_lvalue (expr); return expr; --- 472,486 ---- /* If *type is an unambiguous accessible base class of *exprtype, convert statically. */ { ! tree binfo; ! binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type), ! ba_not_special, NULL); ! if (binfo) { ! expr = build_base_path (PLUS_EXPR, convert_from_reference (expr), ! binfo, 0); if (TREE_CODE (exprtype) == POINTER_TYPE) expr = non_lvalue (expr); return expr; *************** build_dynamic_cast_1 (type, expr) *** 663,669 **** && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE) { tree expr = throw_bad_cast (); ! cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed", old_expr, type); /* Bash it to the expected type. */ TREE_TYPE (expr) = type; --- 522,528 ---- && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE) { tree expr = throw_bad_cast (); ! warning ("dynamic_cast of `%#D' to `%#T' can never succeed", old_expr, type); /* Bash it to the expected type. */ TREE_TYPE (expr) = type; *************** build_dynamic_cast_1 (type, expr) *** 677,683 **** if (TREE_CODE (op) == VAR_DECL && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE) { ! cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed", op, type); retval = build_int_2 (0, 0); TREE_TYPE (retval) = type; --- 536,542 ---- if (TREE_CODE (op) == VAR_DECL && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE) { ! warning ("dynamic_cast of `%#D' to `%#T' can never succeed", op, type); retval = build_int_2 (0, 0); TREE_TYPE (retval) = type; *************** build_dynamic_cast_1 (type, expr) *** 752,758 **** errstr = "source type is not polymorphic"; fail: ! cp_error ("cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)", expr, exprtype, type, errstr); return error_mark_node; } --- 611,617 ---- errstr = "source type is not polymorphic"; fail: ! error ("cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)", expr, exprtype, type, errstr); return error_mark_node; } *************** tinfo_base_init (desc, target) *** 843,850 **** DECL_EXTERNAL (name_decl) = 0; TREE_PUBLIC (name_decl) = 1; comdat_linkage (name_decl); ! /* The new ABI specifies the external name of the string ! containing the type's name. */ SET_DECL_ASSEMBLER_NAME (name_decl, mangle_typeinfo_string_for_type (target)); DECL_INITIAL (name_decl) = name_string; --- 702,709 ---- DECL_EXTERNAL (name_decl) = 0; TREE_PUBLIC (name_decl) = 1; comdat_linkage (name_decl); ! /* External name of the string containing the type's name has a ! special name. */ SET_DECL_ASSEMBLER_NAME (name_decl, mangle_typeinfo_string_for_type (target)); DECL_INITIAL (name_decl) = name_string; *************** dfs_class_hint_unmark (binfo, data) *** 1001,1007 **** return NULL_TREE; } ! /* Determine the hint flags describing the features of a class's heirarchy. */ static int class_hint_flags (type) --- 860,866 ---- return NULL_TREE; } ! /* Determine the hint flags describing the features of a class's hierarchy. */ static int class_hint_flags (type) *************** typeinfo_in_lib_p (type) *** 1051,1058 **** /* The typeinfo objects for `T*' and `const T*' are in the runtime library for simple types T. */ if (TREE_CODE (type) == POINTER_TYPE ! && (CP_TYPE_QUALS (TREE_TYPE (type)) == TYPE_QUAL_CONST ! || CP_TYPE_QUALS (TREE_TYPE (type)) == TYPE_UNQUALIFIED)) type = TREE_TYPE (type); switch (TREE_CODE (type)) --- 910,917 ---- /* The typeinfo objects for `T*' and `const T*' are in the runtime library for simple types T. */ if (TREE_CODE (type) == POINTER_TYPE ! && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST ! || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED)) type = TREE_TYPE (type); switch (TREE_CODE (type)) *************** synthesize_tinfo_var (target_type, real_ *** 1151,1163 **** tree tinfo; tree offset; - if (TREE_VIA_VIRTUAL (base_binfo)) - flags |= 1; if (TREE_PUBLIC (base_binfo)) flags |= 2; tinfo = get_tinfo_decl (BINFO_TYPE (base_binfo)); tinfo = build_unary_op (ADDR_EXPR, tinfo, 0); ! offset = get_base_offset (base_binfo, target_type); /* is it a single public inheritance? */ if (is_simple && flags == 2 && integer_zerop (offset)) --- 1010,1030 ---- tree tinfo; tree offset; if (TREE_PUBLIC (base_binfo)) flags |= 2; tinfo = get_tinfo_decl (BINFO_TYPE (base_binfo)); tinfo = build_unary_op (ADDR_EXPR, tinfo, 0); ! if (TREE_VIA_VIRTUAL (base_binfo)) ! { ! /* We store the vtable offset at which the virtual ! base offset can be found. */ ! offset = BINFO_VPTR_FIELD (binfo_for_vbase (BINFO_TYPE (base_binfo), ! target_type)); ! offset = convert (sizetype, offset); ! flags |= 1; ! } ! else ! offset = BINFO_OFFSET (base_binfo); /* is it a single public inheritance? */ if (is_simple && flags == 2 && integer_zerop (offset)) *************** synthesize_tinfo_var (target_type, real_ *** 1208,1217 **** var_init = generic_initializer (var_type, target_type); break; } ! my_friendly_abort (20000117); } - return create_real_tinfo_var (target_type, real_name, TINFO_PSEUDO_TYPE (var_type), var_init, non_public); --- 1075,1083 ---- var_init = generic_initializer (var_type, target_type); break; } ! abort (); } return create_real_tinfo_var (target_type, real_name, TINFO_PSEUDO_TYPE (var_type), var_init, non_public); *************** create_real_tinfo_var (target_type, name *** 1232,1241 **** tree decl; tree hidden_name; char hidden[30]; ! ! sprintf (hidden, "%.*s_%d", ! IDENTIFIER_LENGTH (tinfo_decl_id), IDENTIFIER_POINTER (tinfo_decl_id), ! count++); hidden_name = get_identifier (hidden); decl = build_lang_decl (VAR_DECL, hidden_name, --- 1098,1108 ---- tree decl; tree hidden_name; char hidden[30]; ! ! /* We cannot give this the name NAME, as that already is globally ! bound to the tinfo_decl we originally created for this type in ! get_tinfo_decl. */ ! sprintf (hidden, "__ti_%d", count++); hidden_name = get_identifier (hidden); decl = build_lang_decl (VAR_DECL, hidden_name, *************** create_real_tinfo_var (target_type, name *** 1274,1284 **** static tree create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...)) { - #ifndef ANSI_PROTOTYPES - char const *real_name; - int ident; - #endif - va_list ap; tree real_type, pseudo_type; char *pseudo_name; tree vtable_decl; --- 1141,1146 ---- *************** create_pseudo_type_info VPARAMS((const c *** 1286,1297 **** tree fields[10]; tree field_decl; tree result; ! ! VA_START (ap, ident); ! #ifndef ANSI_PROTOTYPES ! real_name = va_arg (ap, char const *); ! ident = va_arg (ap, int); ! #endif /* Generate the pseudo type name. */ pseudo_name = (char *)alloca (strlen (real_name) + 30); --- 1148,1157 ---- tree fields[10]; tree field_decl; tree result; ! ! VA_OPEN (ap, ident); ! VA_FIXEDARG (ap, const char *, real_name); ! VA_FIXEDARG (ap, int, ident); /* Generate the pseudo type name. */ pseudo_name = (char *)alloca (strlen (real_name) + 30); *************** create_pseudo_type_info VPARAMS((const c *** 1314,1321 **** vtable_decl = get_vtable_decl (real_type, /*complete=*/1); vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0); ! /* Under the new ABI, we need to point into the middle of the ! vtable. */ vtable_decl = build (PLUS_EXPR, TREE_TYPE (vtable_decl), vtable_decl, --- 1174,1180 ---- vtable_decl = get_vtable_decl (real_type, /*complete=*/1); vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0); ! /* We need to point into the middle of the vtable. */ vtable_decl = build (PLUS_EXPR, TREE_TYPE (vtable_decl), vtable_decl, *************** create_pseudo_type_info VPARAMS((const c *** 1335,1346 **** pseudo_type = make_aggr_type (RECORD_TYPE); finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node); TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1; ! va_end (ap); ! result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); TINFO_VTABLE_DECL (result) = vtable_decl; TINFO_PSEUDO_TYPE (result) = pseudo_type; return result; } --- 1194,1205 ---- pseudo_type = make_aggr_type (RECORD_TYPE); finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node); TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1; ! result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); TINFO_VTABLE_DECL (result) = vtable_decl; TINFO_PSEUDO_TYPE (result) = pseudo_type; + VA_CLOSE (ap); return result; } *************** create_tinfo_types () *** 1456,1462 **** TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1; } ! /* General heirarchy is created as necessary in this vector. */ vmi_class_desc_type_node = make_tree_vec (10); /* Pointer type_info. Adds two fields, qualification mask --- 1315,1321 ---- TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1; } ! /* General hierarchy is created as necessary in this vector. */ vmi_class_desc_type_node = make_tree_vec (10); /* Pointer type_info. Adds two fields, qualification mask *************** create_tinfo_types () *** 1484,1490 **** /* Emit the type_info descriptors which are guaranteed to be in the runtime support. Generating them here guarantees consistency with the other structures. We use the following heuristic to determine when the runtime ! is being generated. If std::__fundamental_type_info is defined, and it's destructor is defined, then the runtime is being built. */ void --- 1343,1349 ---- /* Emit the type_info descriptors which are guaranteed to be in the runtime support. Generating them here guarantees consistency with the other structures. We use the following heuristic to determine when the runtime ! is being generated. If std::__fundamental_type_info is defined, and its destructor is defined, then the runtime is being built. */ void diff -Nrc3pad gcc-3.0.4/gcc/cp/search.c gcc-3.1/gcc/cp/search.c *** gcc-3.0.4/gcc/cp/search.c Fri Jun 8 17:12:41 2001 --- gcc-3.1/gcc/cp/search.c Thu Apr 18 13:59:00 2002 *************** *** 1,7 **** /* Breadth-first and depth-first routines for searching multiple-inheritance lattice for GNU C++. Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,7 ---- /* Breadth-first and depth-first routines for searching multiple-inheritance lattice for GNU C++. Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2002 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** struct vbase_info *** 83,108 **** tree inits; }; - static tree get_vbase_1 PARAMS ((tree, tree, unsigned int *)); static tree lookup_field_1 PARAMS ((tree, tree)); static int is_subobject_of_p PARAMS ((tree, tree, tree)); - static tree virtual_context PARAMS ((tree, tree, tree)); static tree dfs_check_overlap PARAMS ((tree, void *)); static tree dfs_no_overlap_yet PARAMS ((tree, void *)); ! static int get_base_distance_recursive ! PARAMS ((tree, int, int, int, int *, tree *, tree, ! int, int *, int, int)); static int dynamic_cast_base_recurse PARAMS ((tree, tree, int, tree *)); - static void expand_upcast_fixups - PARAMS ((tree, tree, tree, tree, tree, tree, tree *)); - static void fixup_virtual_upcast_offsets - PARAMS ((tree, tree, int, int, tree, tree, tree, tree, - tree *)); static tree marked_pushdecls_p PARAMS ((tree, void *)); static tree unmarked_pushdecls_p PARAMS ((tree, void *)); static tree dfs_debug_unmarkedp PARAMS ((tree, void *)); static tree dfs_debug_mark PARAMS ((tree, void *)); - static tree dfs_init_vbase_pointers PARAMS ((tree, void *)); static tree dfs_get_vbase_types PARAMS ((tree, void *)); static tree dfs_push_type_decls PARAMS ((tree, void *)); static tree dfs_push_decls PARAMS ((tree, void *)); --- 83,99 ---- tree inits; }; static tree lookup_field_1 PARAMS ((tree, tree)); static int is_subobject_of_p PARAMS ((tree, tree, tree)); static tree dfs_check_overlap PARAMS ((tree, void *)); static tree dfs_no_overlap_yet PARAMS ((tree, void *)); ! static base_kind lookup_base_r ! PARAMS ((tree, tree, base_access, int, int, int, tree *)); static int dynamic_cast_base_recurse PARAMS ((tree, tree, int, tree *)); static tree marked_pushdecls_p PARAMS ((tree, void *)); static tree unmarked_pushdecls_p PARAMS ((tree, void *)); static tree dfs_debug_unmarkedp PARAMS ((tree, void *)); static tree dfs_debug_mark PARAMS ((tree, void *)); static tree dfs_get_vbase_types PARAMS ((tree, void *)); static tree dfs_push_type_decls PARAMS ((tree, void *)); static tree dfs_push_decls PARAMS ((tree, void *)); *************** static int protected_accessible_p PARAMS *** 136,146 **** static int friend_accessible_p PARAMS ((tree, tree, tree)); static void setup_class_bindings PARAMS ((tree, int)); static int template_self_reference_p PARAMS ((tree, tree)); - static tree get_shared_vbase_if_not_primary PARAMS ((tree, void *)); static tree dfs_find_vbase_instance PARAMS ((tree, void *)); static tree dfs_get_pure_virtuals PARAMS ((tree, void *)); static tree dfs_build_inheritance_graph_order PARAMS ((tree, void *)); - static tree dfs_vtable_path_unmark PARAMS ((tree, void *)); /* Allocate a level of searching. */ --- 127,135 ---- *************** static int n_contexts_saved; *** 177,494 **** #endif /* GATHER_STATISTICS */ ! /* Get a virtual binfo that is found inside BINFO's hierarchy that is ! the same type as the type given in PARENT. To be optimal, we want ! the first one that is found by going through the least number of ! virtual bases. ! ! This uses a clever algorithm that updates *depth when we find the vbase, ! and cuts off other paths of search when they reach that depth. */ ! ! static tree ! get_vbase_1 (parent, binfo, depth) ! tree parent, binfo; ! unsigned int *depth; ! { ! tree binfos; ! int i, n_baselinks; ! tree rval = NULL_TREE; ! int virtualp = TREE_VIA_VIRTUAL (binfo) != 0; ! ! *depth -= virtualp; ! if (virtualp && BINFO_TYPE (binfo) == parent) ! { ! *depth = 0; ! return binfo; ! } ! ! binfos = BINFO_BASETYPES (binfo); ! n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; ! ! /* Process base types. */ ! for (i = 0; i < n_baselinks; i++) ! { ! tree base_binfo = TREE_VEC_ELT (binfos, i); ! tree nrval; ! ! if (*depth == 0) ! break; ! ! nrval = get_vbase_1 (parent, base_binfo, depth); ! if (nrval) ! rval = nrval; ! } ! *depth += virtualp; ! return rval; ! } ! ! /* Return the shortest path to vbase PARENT within BINFO, ignoring ! access and ambiguity. */ ! ! tree ! get_vbase (parent, binfo) ! tree parent; ! tree binfo; ! { ! unsigned int d = (unsigned int)-1; ! return get_vbase_1 (parent, binfo, &d); ! } ! ! /* Convert EXPR to a virtual base class of type TYPE. We know that ! EXPR is a non-null POINTER_TYPE to RECORD_TYPE. We also know that ! the type of what expr points to has a virtual base of type TYPE. */ ! ! tree ! convert_pointer_to_vbase (type, expr) ! tree type; ! tree expr; ! { ! tree vb = get_vbase (type, TYPE_BINFO (TREE_TYPE (TREE_TYPE (expr)))); ! return convert_pointer_to_real (vb, expr); ! } ! ! /* Check whether the type given in BINFO is derived from PARENT. If ! it isn't, return 0. If it is, but the derivation is MI-ambiguous ! AND protect != 0, emit an error message and return error_mark_node. ! Otherwise, if TYPE is derived from PARENT, return the actual base ! information, unless a one of the protection violations below ! occurs, in which case emit an error message and return error_mark_node. ! If PROTECT is 1, then check if access to a public field of PARENT ! would be private. Also check for ambiguity. */ ! tree ! get_binfo (parent, binfo, protect) ! register tree parent, binfo; ! int protect; { ! tree type = NULL_TREE; ! int dist; ! tree rval = NULL_TREE; ! ! if (TREE_CODE (parent) == TREE_VEC) ! parent = BINFO_TYPE (parent); ! else if (! IS_AGGR_TYPE_CODE (TREE_CODE (parent))) ! my_friendly_abort (89); ! ! if (TREE_CODE (binfo) == TREE_VEC) ! type = BINFO_TYPE (binfo); ! else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo))) ! type = binfo; ! else ! my_friendly_abort (90); ! dist = get_base_distance (parent, binfo, protect, &rval); ! ! if (dist == -3) { ! cp_error ("fields of `%T' are inaccessible in `%T' due to private inheritance", ! parent, type); ! return error_mark_node; } ! else if (dist == -2 && protect) { ! cp_error ("type `%T' is ambiguous base class for type `%T'", parent, ! type); ! return error_mark_node; } ! ! return rval; ! } ! ! /* This is the newer depth first get_base_distance routine. */ ! ! static int ! get_base_distance_recursive (binfo, depth, is_private, rval, ! rval_private_ptr, new_binfo_ptr, parent, ! protect, via_virtual_ptr, via_virtual, ! current_scope_in_chain) ! tree binfo; ! int depth, is_private, rval; ! int *rval_private_ptr; ! tree *new_binfo_ptr, parent; ! int protect, *via_virtual_ptr, via_virtual; ! int current_scope_in_chain; ! { ! tree binfos; ! int i, n_baselinks; ! ! if (protect == 1 ! && !current_scope_in_chain ! && is_friend (BINFO_TYPE (binfo), current_scope ())) ! current_scope_in_chain = 1; ! ! if (BINFO_TYPE (binfo) == parent || binfo == parent) { ! int better = 0; ! ! if (rval == -1) ! /* This is the first time we've found parent. */ ! better = 1; ! else if (tree_int_cst_equal (BINFO_OFFSET (*new_binfo_ptr), ! BINFO_OFFSET (binfo)) ! && *via_virtual_ptr && via_virtual) ! { ! /* A new path to the same vbase. If this one has better ! access or is shorter, take it. */ ! if (protect) ! better = *rval_private_ptr - is_private; ! if (better == 0) ! better = rval - depth; ! } else ! { ! /* Ambiguous base class. */ ! rval = depth = -2; ! ! /* If we get an ambiguity between virtual and non-virtual base ! class, return the non-virtual in case we are ignoring ! ambiguity. */ ! better = *via_virtual_ptr - via_virtual; ! } ! if (better > 0) { ! rval = depth; ! *rval_private_ptr = is_private; ! *new_binfo_ptr = binfo; ! *via_virtual_ptr = via_virtual; } - - return rval; } ! ! binfos = BINFO_BASETYPES (binfo); ! n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; ! depth += 1; ! ! /* Process base types. */ ! for (i = 0; i < n_baselinks; i++) ! { ! tree base_binfo = TREE_VEC_ELT (binfos, i); ! ! int via_private ! = ((protect == 1 ! && (is_private ! || (!TREE_VIA_PUBLIC (base_binfo) ! && !(TREE_VIA_PROTECTED (base_binfo) ! && current_scope_in_chain) ! && !is_friend (BINFO_TYPE (binfo), current_scope ())))) ! || (protect > 1 ! && (is_private || !TREE_VIA_PUBLIC (base_binfo)))); ! ! int this_virtual = via_virtual || TREE_VIA_VIRTUAL (base_binfo); ! ! rval = get_base_distance_recursive (base_binfo, depth, via_private, ! rval, rval_private_ptr, ! new_binfo_ptr, parent, ! protect, via_virtual_ptr, ! this_virtual, ! current_scope_in_chain); ! ! /* If we've found a non-virtual, ambiguous base class, we don't need ! to keep searching. */ ! if (rval == -2 && *via_virtual_ptr == 0) ! return rval; ! } ! ! return rval; } ! /* Return the number of levels between type PARENT and the type given ! in BINFO, following the leftmost path to PARENT not found along a ! virtual path, if there are no real PARENTs (all come from virtual ! base classes), then follow the shortest public path to PARENT. ! ! Return -1 if TYPE is not derived from PARENT. ! Return -2 if PARENT is an ambiguous base class of TYPE, and PROTECT is ! non-negative. ! Return -3 if PARENT is not accessible in TYPE, and PROTECT is non-zero. ! ! If PATH_PTR is non-NULL, then also build the list of types ! from PARENT to TYPE, with TREE_VIA_VIRTUAL and TREE_VIA_PUBLIC ! set. ! ! If PROTECT is greater than 1, ignore any special access the current ! scope might have when determining whether PARENT is inaccessible. ! ! PARENT can also be a binfo, in which case that exact parent is found ! and no other. convert_pointer_to_real uses this functionality. ! If BINFO is a binfo, its BINFO_INHERITANCE_CHAIN will be left alone. */ ! int ! get_base_distance (parent, binfo, protect, path_ptr) ! register tree parent, binfo; ! int protect; ! tree *path_ptr; { ! int rval; ! int rval_private = 0; ! tree type = NULL_TREE; ! tree new_binfo = NULL_TREE; ! int via_virtual; ! int watch_access = protect; ! ! /* Should we be completing types here? */ ! if (TREE_CODE (parent) != TREE_VEC) ! parent = complete_type (TYPE_MAIN_VARIANT (parent)); ! else ! complete_type (TREE_TYPE (parent)); ! ! if (TREE_CODE (binfo) == TREE_VEC) ! type = BINFO_TYPE (binfo); ! else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo))) ! { ! type = complete_type (binfo); ! binfo = TYPE_BINFO (type); ! ! if (path_ptr) ! my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo) == NULL_TREE, ! 980827); ! } ! else ! my_friendly_abort (92); ! ! if (parent == type || parent == binfo) { ! /* If the distance is 0, then we don't really need ! a path pointer, but we shouldn't let garbage go back. */ ! if (path_ptr) ! *path_ptr = binfo; ! return 0; } ! if (path_ptr && watch_access == 0) ! watch_access = 1; ! ! rval = get_base_distance_recursive (binfo, 0, 0, -1, ! &rval_private, &new_binfo, parent, ! watch_access, &via_virtual, 0, ! 0); ! ! /* Access restrictions don't count if we found an ambiguous basetype. */ ! if (rval == -2 && protect >= 0) ! rval_private = 0; ! ! if (rval && protect && rval_private) ! return -3; ! ! /* If they gave us the real vbase binfo, which isn't in the main binfo ! tree, deal with it. This happens when we are called from ! expand_upcast_fixups. */ ! if (rval == -1 && TREE_CODE (parent) == TREE_VEC ! && parent == binfo_for_vbase (BINFO_TYPE (parent), type)) { ! new_binfo = parent; ! rval = 1; } ! ! if (path_ptr) ! *path_ptr = new_binfo; ! return rval; } /* Worker function for get_dynamic_cast_base_type. */ --- 166,364 ---- #endif /* GATHER_STATISTICS */ ! /* Worker for lookup_base. BINFO is the binfo we are searching at, ! BASE is the RECORD_TYPE we are searching for. ACCESS is the ! required access checks. WITHIN_CURRENT_SCOPE, IS_NON_PUBLIC and ! IS_VIRTUAL indicate how BINFO was reached from the start of the ! search. WITHIN_CURRENT_SCOPE is true if we met the current scope, ! or friend thereof (this allows us to determine whether a protected ! base is accessible or not). IS_NON_PUBLIC indicates whether BINFO ! is accessible and IS_VIRTUAL indicates if it is morally virtual. ! If BINFO is of the required type, then *BINFO_PTR is examined to ! compare with any other instance of BASE we might have already ! discovered. *BINFO_PTR is initialized and a base_kind return value ! indicates what kind of base was located. ! Otherwise BINFO's bases are searched. */ ! static base_kind ! lookup_base_r (binfo, base, access, within_current_scope, ! is_non_public, is_virtual, binfo_ptr) ! tree binfo, base; ! base_access access; ! int within_current_scope; ! int is_non_public; /* inside a non-public part */ ! int is_virtual; /* inside a virtual part */ ! tree *binfo_ptr; { ! int i; ! tree bases; ! base_kind found = bk_not_base; ! if (access == ba_check ! && !within_current_scope ! && is_friend (BINFO_TYPE (binfo), current_scope ())) { ! /* Do not clear is_non_public here. If A is a private base of B, A ! is not allowed to convert a B* to an A*. */ ! within_current_scope = 1; } ! ! if (same_type_p (BINFO_TYPE (binfo), base)) { ! /* We have found a base. Check against what we have found ! already. */ ! found = bk_same_type; ! if (is_virtual) ! found = bk_via_virtual; ! if (is_non_public) ! found = bk_inaccessible; ! ! if (!*binfo_ptr) ! *binfo_ptr = binfo; ! else if (!is_virtual || !tree_int_cst_equal (BINFO_OFFSET (binfo), ! BINFO_OFFSET (*binfo_ptr))) ! { ! if (access != ba_any) ! *binfo_ptr = NULL; ! else if (!is_virtual) ! /* Prefer a non-virtual base. */ ! *binfo_ptr = binfo; ! found = bk_ambig; ! } ! ! return found; } ! ! bases = BINFO_BASETYPES (binfo); ! if (!bases) ! return bk_not_base; ! ! for (i = TREE_VEC_LENGTH (bases); i--;) { ! tree base_binfo = TREE_VEC_ELT (bases, i); ! int this_non_public = is_non_public; ! int this_virtual = is_virtual; ! base_kind bk; ! if (access <= ba_ignore) ! ; /* no change */ ! else if (TREE_VIA_PUBLIC (base_binfo)) ! ; /* no change */ ! else if (access == ba_not_special) ! this_non_public = 1; ! else if (TREE_VIA_PROTECTED (base_binfo) && within_current_scope) ! ; /* no change */ ! else if (is_friend (BINFO_TYPE (binfo), current_scope ())) ! ; /* no change */ else ! this_non_public = 1; ! ! if (TREE_VIA_VIRTUAL (base_binfo)) ! this_virtual = 1; ! ! bk = lookup_base_r (base_binfo, base, ! access, within_current_scope, ! this_non_public, this_virtual, ! binfo_ptr); ! switch (bk) { ! case bk_ambig: ! if (access != ba_any) ! return bk; ! found = bk; ! break; ! ! case bk_inaccessible: ! if (found == bk_not_base) ! found = bk; ! my_friendly_assert (found == bk_via_virtual ! || found == bk_inaccessible, 20010723); ! ! break; ! ! case bk_same_type: ! bk = bk_proper_base; ! /* FALLTHROUGH */ ! case bk_proper_base: ! my_friendly_assert (found == bk_not_base, 20010723); ! found = bk; ! break; ! ! case bk_via_virtual: ! if (found != bk_ambig) ! found = bk; ! break; ! ! case bk_not_base: ! break; } } ! return found; } ! /* Lookup BASE in the hierarchy dominated by T. Do access checking as ! ACCESS specifies. Return the binfo we discover (which might not be ! canonical). If KIND_PTR is non-NULL, fill with information about ! what kind of base we discovered. ! If ba_quiet bit is set in ACCESS, then do not issue an error, and ! return NULL_TREE for failure. */ ! tree ! lookup_base (t, base, access, kind_ptr) ! tree t, base; ! base_access access; ! base_kind *kind_ptr; { ! tree binfo = NULL; /* The binfo we've found so far. */ ! base_kind bk; ! ! if (t == error_mark_node || base == error_mark_node) { ! if (kind_ptr) ! *kind_ptr = bk_not_base; ! return error_mark_node; } + my_friendly_assert (TYPE_P (t) && TYPE_P (base), 20011127); + + /* Ensure that the types are instantiated. */ + t = complete_type (TYPE_MAIN_VARIANT (t)); + base = complete_type (TYPE_MAIN_VARIANT (base)); + + bk = lookup_base_r (TYPE_BINFO (t), base, access & ~ba_quiet, + 0, 0, 0, &binfo); ! switch (bk) { ! case bk_inaccessible: ! binfo = NULL_TREE; ! if (!(access & ba_quiet)) ! { ! error ("`%T' is an inaccessible base of `%T'", base, t); ! binfo = error_mark_node; ! } ! break; ! case bk_ambig: ! if (access != ba_any) ! { ! binfo = NULL_TREE; ! if (!(access & ba_quiet)) ! { ! error ("`%T' is an ambiguous base of `%T'", base, t); ! binfo = error_mark_node; ! } ! } ! break; ! default:; } ! ! if (kind_ptr) ! *kind_ptr = bk; ! ! return binfo; } /* Worker function for get_dynamic_cast_base_type. */ *************** dynamic_cast_base_recurse (subtype, binf *** 541,547 **** /* The dynamic cast runtime needs a hint about how the static SUBTYPE type started from is related to the required TARGET type, in order to optimize ! the inheritance graph search. This information is independant of the current context, and ignores private paths, hence get_base_distance is inappropriate. Return a TREE specifying the base offset, BOFF. BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset BOFF, --- 411,417 ---- /* The dynamic cast runtime needs a hint about how the static SUBTYPE type started from is related to the required TARGET type, in order to optimize ! the inheritance graph search. This information is independent of the current context, and ignores private paths, hence get_base_distance is inappropriate. Return a TREE specifying the base offset, BOFF. BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset BOFF, *************** get_dynamic_cast_base_type (subtype, tar *** 561,567 **** if (!boff) return offset; ! return build_int_2 (boff, -1); } /* Search for a member with name NAME in a multiple inheritance lattice --- 431,439 ---- if (!boff) return offset; ! offset = build_int_2 (boff, -1); ! TREE_TYPE (offset) = ssizetype; ! return offset; } /* Search for a member with name NAME in a multiple inheritance lattice *************** lookup_field_1 (type, name) *** 580,590 **** register tree field; if (TREE_CODE (type) == TEMPLATE_TYPE_PARM ! || TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM) ! /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM are not fields at all; instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX. (Miraculously, the code often worked even when we treated the index as a list ! of fields!) */ return NULL_TREE; if (TYPE_NAME (type) --- 452,465 ---- register tree field; if (TREE_CODE (type) == TEMPLATE_TYPE_PARM ! || TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM ! || TREE_CODE (type) == TYPENAME_TYPE) ! /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM and ! BOUND_TEMPLATE_TEMPLATE_PARM are not fields at all; instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX. (Miraculously, the code often worked even when we treated the index as a list ! of fields!) ! The TYPE_FIELDS of TYPENAME_TYPE is its TYPENAME_TYPE_FULLNAME. */ return NULL_TREE; if (TYPE_NAME (type) *************** lookup_field_1 (type, name) *** 648,660 **** from TYPE_FIELDS anyhow; see handle_using_decl. */ ; else if (DECL_NAME (field) == name) ! { ! if (TREE_CODE(field) == VAR_DECL ! && (TREE_STATIC (field) || DECL_EXTERNAL (field))) ! GNU_xref_ref(current_function_decl, ! IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (field))); ! return field; ! } field = TREE_CHAIN (field); } /* Not found. */ --- 523,529 ---- from TYPE_FIELDS anyhow; see handle_using_decl. */ ; else if (DECL_NAME (field) == name) ! return field; field = TREE_CHAIN (field); } /* Not found. */ *************** shared_unmarked_p (binfo, data) *** 810,817 **** /* Set the access associated with NODE to ACCESS. */ #define SET_BINFO_ACCESS(NODE, ACCESS) \ ! ((TREE_LANG_FLAG_1 (NODE) = (ACCESS & 2) != 0), \ ! (TREE_LANG_FLAG_6 (NODE) = (ACCESS & 1) != 0)) /* Called from access_in_type via dfs_walk. Calculate the access to DATA (which is really a DECL) in BINFO. */ --- 679,686 ---- /* Set the access associated with NODE to ACCESS. */ #define SET_BINFO_ACCESS(NODE, ACCESS) \ ! ((TREE_LANG_FLAG_1 (NODE) = ((ACCESS) & 2) != 0), \ ! (TREE_LANG_FLAG_6 (NODE) = ((ACCESS) & 1) != 0)) /* Called from access_in_type via dfs_walk. Calculate the access to DATA (which is really a DECL) in BINFO. */ *************** lookup_field_r (binfo, data) *** 1380,1386 **** /* If we're looking up a type (as with an elaborated type specifier) we ignore all non-types we find. */ ! if (lfi->want_type && TREE_CODE (nval) != TYPE_DECL) { if (lfi->name == TYPE_IDENTIFIER (type)) { --- 1249,1256 ---- /* If we're looking up a type (as with an elaborated type specifier) we ignore all non-types we find. */ ! if (lfi->want_type && TREE_CODE (nval) != TYPE_DECL ! && !DECL_CLASS_TEMPLATE_P (nval)) { if (lfi->name == TYPE_IDENTIFIER (type)) { *************** lookup_field_r (binfo, data) *** 1467,1481 **** } else { - /* If the thing we're looking for is a virtual base class, then - we know we've got what we want at this point; there's no way - to get an ambiguity. */ - if (VBASE_NAME_P (lfi->name)) - { - lfi->rval = nval; - return nval; - } - if (from_dep_base_p && TREE_CODE (nval) != TYPE_DECL /* We need to return a member template class so we can define partial specializations. Is there a better --- 1337,1342 ---- *************** lookup_member (xbasetype, name, protect, *** 1547,1553 **** 980827); } else ! my_friendly_abort (97); complete_type (type); --- 1408,1414 ---- 980827); } else ! abort (); complete_type (type); *************** lookup_member (xbasetype, name, protect, *** 1589,1595 **** if (errstr && protect) { ! cp_error (errstr, name, type); if (lfi.ambiguous) print_candidates (lfi.ambiguous); rval = error_mark_node; --- 1450,1456 ---- if (errstr && protect) { ! error (errstr, name, type); if (lfi.ambiguous) print_candidates (lfi.ambiguous); rval = error_mark_node; *************** lookup_fnfields_1 (type, name) *** 1749,1757 **** } /* Walk the class hierarchy dominated by TYPE. FN is called for each ! type in the hierarchy, in a breadth-first preorder traversal. . If it ever returns a non-NULL value, that value is immediately ! returned and the walk is terminated. At each node FN, is passed a BINFO indicating the path from the curently visited base-class to TYPE. Before each base-class is walked QFN is called. If the value returned is non-zero, the base-class is walked; otherwise it --- 1610,1618 ---- } /* Walk the class hierarchy dominated by TYPE. FN is called for each ! type in the hierarchy, in a breadth-first preorder traversal. If it ever returns a non-NULL value, that value is immediately ! returned and the walk is terminated. At each node, FN is passed a BINFO indicating the path from the curently visited base-class to TYPE. Before each base-class is walked QFN is called. If the value returned is non-zero, the base-class is walked; otherwise it *************** covariant_return_p (brettype, drettype) *** 1895,1900 **** --- 1756,1762 ---- tree brettype, drettype; { tree binfo; + base_kind kind; if (TREE_CODE (brettype) == FUNCTION_DECL) { *************** covariant_return_p (brettype, drettype) *** 1926,1941 **** if (! IS_AGGR_TYPE (drettype) || ! IS_AGGR_TYPE (brettype)) return -1; ! binfo = get_binfo (brettype, drettype, 1); ! ! /* If we get an error_mark_node from get_binfo, it already complained, ! so let's just succeed. */ ! if (binfo == error_mark_node) return 1; ! ! if (! BINFO_OFFSET_ZEROP (binfo) || TREE_VIA_VIRTUAL (binfo)) ! return 2; ! return 1; } /* Check that virtual overrider OVERRIDER is acceptable for base function --- 1788,1800 ---- if (! IS_AGGR_TYPE (drettype) || ! IS_AGGR_TYPE (brettype)) return -1; ! binfo = lookup_base (drettype, brettype, ba_check | ba_quiet, &kind); ! ! if (!binfo) ! return 0; ! if (BINFO_OFFSET_ZEROP (binfo) && kind != bk_via_virtual) return 1; ! return 2; } /* Check that virtual overrider OVERRIDER is acceptable for base function *************** check_final_overrider (overrider, basefn *** 1982,1988 **** return 0; } ! /* Check throw specifier is subset. */ if (!comp_except_specs (base_throw, over_throw, 0)) { cp_error_at ("looser throw specifier for `%#F'", overrider); --- 1841,1847 ---- return 0; } ! /* Check throw specifier is at least as strict. */ if (!comp_except_specs (base_throw, over_throw, 0)) { cp_error_at ("looser throw specifier for `%#F'", overrider); *************** look_for_overrides_r (type, fndecl) *** 2092,2172 **** return look_for_overrides (type, fndecl); } ! /* A queue function for dfs_walk that skips any nonprimary virtual ! bases and any already marked bases. */ ! ! tree ! dfs_skip_nonprimary_vbases_unmarkedp (binfo, data) ! tree binfo; ! void *data ATTRIBUTE_UNUSED; ! { ! if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo)) ! /* This is a non-primary virtual base. Skip it. */ ! return NULL_TREE; ! ! return unmarkedp (binfo, NULL); ! } ! ! /* A queue function for dfs_walk that skips any nonprimary virtual ! bases and any unmarked bases. */ tree ! dfs_skip_nonprimary_vbases_markedp (binfo, data) ! tree binfo; ! void *data ATTRIBUTE_UNUSED; ! { ! if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo)) ! /* This is a non-primary virtual base. Skip it. */ ! return NULL_TREE; ! ! return markedp (binfo, NULL); ! } ! ! /* If BINFO is a non-primary virtual baseclass (in the hierarchy ! dominated by TYPE), and no primary copy appears anywhere in the ! hierarchy, return the shared copy. If a primary copy appears ! elsewhere, return NULL_TREE. Otherwise, return BINFO itself; it is ! either a non-virtual base or a primary virtual base. */ ! ! static tree ! get_shared_vbase_if_not_primary (binfo, data) tree binfo; void *data; { ! if (TREE_VIA_VIRTUAL (binfo) && !BINFO_PRIMARY_P (binfo)) { tree type = (tree) data; if (TREE_CODE (type) == TREE_LIST) type = TREE_PURPOSE (type); - - /* This is a non-primary virtual base. If there is no primary - version, get the shared version. */ binfo = binfo_for_vbase (BINFO_TYPE (binfo), type); - if (BINFO_PRIMARY_P (binfo)) - return NULL_TREE; } ! ! return binfo; ! } ! ! /* A queue function to use with dfs_walk that prevents travel into any ! nonprimary virtual base, or its baseclasses. DATA should be the ! type of the complete object, or a TREE_LIST whose TREE_PURPOSE is ! the type of the complete object. By using this function as a queue ! function, you will walk over exactly those BINFOs that actually ! exist in the complete object, including those for virtual base ! classes. If you SET_BINFO_MARKED for each binfo you process, you ! are further guaranteed that you will walk into each virtual base ! class exactly once. */ ! ! tree ! dfs_unmarked_real_bases_queue_p (binfo, data) ! tree binfo; ! void *data; ! { ! binfo = get_shared_vbase_if_not_primary (binfo, data); ! return binfo ? unmarkedp (binfo, NULL) : NULL_TREE; } /* Like dfs_unmarked_real_bases_queue_p but walks only into things --- 1951,1980 ---- return look_for_overrides (type, fndecl); } ! /* A queue function to use with dfs_walk that only walks into ! canonical bases. DATA should be the type of the complete object, ! or a TREE_LIST whose TREE_PURPOSE is the type of the complete ! object. By using this function as a queue function, you will walk ! over exactly those BINFOs that actually exist in the complete ! object, including those for virtual base classes. If you ! SET_BINFO_MARKED for each binfo you process, you are further ! guaranteed that you will walk into each virtual base class exactly ! once. */ tree ! dfs_unmarked_real_bases_queue_p (binfo, data) tree binfo; void *data; { ! if (TREE_VIA_VIRTUAL (binfo)) { tree type = (tree) data; if (TREE_CODE (type) == TREE_LIST) type = TREE_PURPOSE (type); binfo = binfo_for_vbase (BINFO_TYPE (binfo), type); } ! return unmarkedp (binfo, NULL); } /* Like dfs_unmarked_real_bases_queue_p but walks only into things *************** dfs_marked_real_bases_queue_p (binfo, da *** 2177,2184 **** tree binfo; void *data; { ! binfo = get_shared_vbase_if_not_primary (binfo, data); ! return binfo ? markedp (binfo, NULL) : NULL_TREE; } /* A queue function that skips all virtual bases (and their --- 1985,1999 ---- tree binfo; void *data; { ! if (TREE_VIA_VIRTUAL (binfo)) ! { ! tree type = (tree) data; ! ! if (TREE_CODE (type) == TREE_LIST) ! type = TREE_PURPOSE (type); ! binfo = binfo_for_vbase (BINFO_TYPE (binfo), type); ! } ! return markedp (binfo, NULL); } /* A queue function that skips all virtual bases (and their *************** get_pure_virtuals (type) *** 2262,2268 **** { tree base_fndecl = BV_FN (virtuals); if (DECL_NEEDS_FINAL_OVERRIDER_P (base_fndecl)) ! cp_error ("`%#D' needs a final overrider", base_fndecl); } } } --- 2077,2083 ---- { tree base_fndecl = BV_FN (virtuals); if (DECL_NEEDS_FINAL_OVERRIDER_P (base_fndecl)) ! error ("`%#D' needs a final overrider", base_fndecl); } } } *************** dfs_unmark (binfo, data) *** 2332,2723 **** return NULL_TREE; } - - static tree - dfs_init_vbase_pointers (binfo, data) - tree binfo; - void *data; - { - struct vbase_info *vi = (struct vbase_info *) data; - tree type = BINFO_TYPE (binfo); - tree fields; - tree this_vbase_ptr; - - /* Don't initialize the same base more than once. */ - SET_BINFO_VTABLE_PATH_MARKED (binfo); - - /* We know that VI->DECL_PTR points to the complete object. So, - finding a pointer to this subobject is easy. */ - this_vbase_ptr = build (PLUS_EXPR, - build_pointer_type (type), - vi->decl_ptr, - BINFO_OFFSET (binfo)); - - /* We're going to iterate through all the pointers to virtual - base-classes. They come at the beginning of the class. */ - fields = TYPE_FIELDS (type); - - if (fields == NULL_TREE - || DECL_NAME (fields) == NULL_TREE - || ! VBASE_NAME_P (DECL_NAME (fields))) - return NULL_TREE; - - if (build_pointer_type (type) - != TYPE_MAIN_VARIANT (TREE_TYPE (this_vbase_ptr))) - my_friendly_abort (125); - - while (fields && DECL_NAME (fields) && VBASE_NAME_P (DECL_NAME (fields))) - { - tree ref = build (COMPONENT_REF, TREE_TYPE (fields), - build_indirect_ref (this_vbase_ptr, NULL_PTR), fields); - tree init; - tree vbase_type; - tree vbase_binfo; - - vbase_type = TREE_TYPE (TREE_TYPE (fields)); - vbase_binfo = binfo_for_vbase (vbase_type, vi->type); - init = build (PLUS_EXPR, - build_pointer_type (vbase_type), - vi->decl_ptr, - BINFO_OFFSET (vbase_binfo)); - vi->inits - = tree_cons (vbase_binfo, - build_modify_expr (ref, NOP_EXPR, init), - vi->inits); - fields = TREE_CHAIN (fields); - } - - return NULL_TREE; - } - - /* Call CLEAR_BINFO_VTABLE_PATH_MARKED for BINFO. */ - - static tree - dfs_vtable_path_unmark (binfo, data) - tree binfo; - void *data ATTRIBUTE_UNUSED; - { - CLEAR_BINFO_VTABLE_PATH_MARKED (binfo); - return NULL_TREE; - } - - tree - init_vbase_pointers (type, decl_ptr) - tree type; - tree decl_ptr; - { - my_friendly_assert (!vbase_offsets_in_vtable_p (), 20000516); - - if (TYPE_USES_VIRTUAL_BASECLASSES (type)) - { - struct vbase_info vi; - tree binfo = TYPE_BINFO (type); - - /* Find all the virtual base classes, marking them for later - initialization. */ - vi.type = type; - vi.decl_ptr = decl_ptr; - vi.inits = NULL_TREE; - - /* Build up a list of the initializers. */ - dfs_walk_real (binfo, - dfs_init_vbase_pointers, 0, - unmarked_vtable_pathp, - &vi); - dfs_walk (binfo, - dfs_vtable_path_unmark, - marked_vtable_pathp, - NULL); - - return vi.inits; - } - - return 0; - } - - /* get the virtual context (the vbase that directly contains the - DECL_CONTEXT of the FNDECL) that the given FNDECL is declared in, - or NULL_TREE if there is none. - - FNDECL must come from a virtual table from a virtual base to ensure - that there is only one possible DECL_CONTEXT. - - We know that if there is more than one place (binfo) the fndecl that the - declared, they all refer to the same binfo. See get_class_offset_1 for - the check that ensures this. */ - - static tree - virtual_context (fndecl, t, vbase) - tree fndecl, t, vbase; - { - tree path; - if (get_base_distance (DECL_CONTEXT (fndecl), t, 0, &path) < 0) - { - /* DECL_CONTEXT can be ambiguous in t. */ - if (get_base_distance (DECL_CONTEXT (fndecl), vbase, 0, &path) >= 0) - { - while (path) - { - /* Not sure if checking path == vbase is necessary here, but just in - case it is. */ - if (TREE_VIA_VIRTUAL (path) || path == vbase) - return binfo_for_vbase (BINFO_TYPE (path), t); - path = BINFO_INHERITANCE_CHAIN (path); - } - } - /* This shouldn't happen, I don't want errors! */ - warning ("recoverable compiler error, fixups for virtual function"); - return vbase; - } - while (path) - { - if (TREE_VIA_VIRTUAL (path)) - return binfo_for_vbase (BINFO_TYPE (path), t); - path = BINFO_INHERITANCE_CHAIN (path); - } - return 0; - } - - /* Fixups upcast offsets for one vtable. - Entries may stay within the VBASE given, or - they may upcast into a direct base, or - they may upcast into a different vbase. - - We only need to do fixups in case 2 and 3. In case 2, we add in - the virtual base offset to effect an upcast, in case 3, we add in - the virtual base offset to effect an upcast, then subtract out the - offset for the other virtual base, to effect a downcast into it. - - This routine mirrors fixup_vtable_deltas in functionality, though - this one is runtime based, and the other is compile time based. - Conceivably that routine could be removed entirely, and all fixups - done at runtime. - - VBASE_OFFSETS is an association list of virtual bases that contains - offset information for the virtual bases, so the offsets are only - calculated once. */ - - static void - expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t, - vbase_offsets) - tree binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets; - { - tree virtuals; - tree vc; - tree delta; - HOST_WIDE_INT n; - - while (BINFO_PRIMARY_P (binfo)) - { - binfo = BINFO_INHERITANCE_CHAIN (binfo); - if (TREE_VIA_VIRTUAL (binfo)) - return; - } - - delta = purpose_member (vbase, *vbase_offsets); - if (! delta) - { - delta = build (PLUS_EXPR, - build_pointer_type (BINFO_TYPE (vbase)), - orig_addr, - BINFO_OFFSET (vbase)); - delta = build (MINUS_EXPR, ptrdiff_type_node, delta, vbase_addr); - delta = save_expr (delta); - delta = tree_cons (vbase, delta, *vbase_offsets); - *vbase_offsets = delta; - } - - for (virtuals = BINFO_VIRTUALS (binfo), n = 0; - virtuals; - virtuals = TREE_CHAIN (virtuals), ++n) - { - tree current_fndecl = TREE_VALUE (virtuals); - - if (current_fndecl - && current_fndecl != abort_fndecl - && (vc=virtual_context (current_fndecl, t, vbase)) != vbase) - { - /* This may in fact need a runtime fixup. */ - tree idx = build_int_2 (n, 0); - tree vtbl = BINFO_VTABLE (binfo); - tree nvtbl = lookup_name (DECL_NAME (vtbl), 0); - tree aref, ref, naref; - tree old_delta, new_delta; - tree init; - - if (nvtbl == NULL_TREE - || nvtbl == IDENTIFIER_GLOBAL_VALUE (DECL_NAME (vtbl))) - { - /* Dup it if it isn't in local scope yet. */ - nvtbl = build_decl - (VAR_DECL, DECL_NAME (vtbl), - TYPE_MAIN_VARIANT (TREE_TYPE (vtbl))); - DECL_ALIGN (nvtbl) = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (nvtbl)); - TREE_READONLY (nvtbl) = 0; - DECL_ARTIFICIAL (nvtbl) = 1; - nvtbl = pushdecl (nvtbl); - init = NULL_TREE; - cp_finish_decl (nvtbl, init, NULL_TREE, - LOOKUP_ONLYCONVERTING); - - /* We don't set DECL_VIRTUAL_P and DECL_CONTEXT on nvtbl - because they wouldn't be useful; everything that wants to - look at the vtable will look at the decl for the normal - vtable. Setting DECL_CONTEXT also screws up - decl_function_context. */ - - init = build (MODIFY_EXPR, TREE_TYPE (nvtbl), - nvtbl, vtbl); - finish_expr_stmt (init); - /* Update the vtable pointers as necessary. */ - ref = build_vfield_ref - (build_indirect_ref (addr, NULL_PTR), - DECL_CONTEXT (TYPE_VFIELD (BINFO_TYPE (binfo)))); - finish_expr_stmt - (build_modify_expr (ref, NOP_EXPR, nvtbl)); - } - assemble_external (vtbl); - aref = build_array_ref (vtbl, idx); - naref = build_array_ref (nvtbl, idx); - old_delta = build_component_ref (aref, delta_identifier, - NULL_TREE, 0); - new_delta = build_component_ref (naref, delta_identifier, - NULL_TREE, 0); - - /* This is a upcast, so we have to add the offset for the - virtual base. */ - old_delta = cp_build_binary_op (PLUS_EXPR, old_delta, - TREE_VALUE (delta)); - if (vc) - { - /* If this is set, we need to subtract out the delta - adjustments for the other virtual base that we - downcast into. */ - tree vc_delta = purpose_member (vc, *vbase_offsets); - if (! vc_delta) - { - tree vc_addr = convert_pointer_to_real (vc, orig_addr); - vc_delta = build (PLUS_EXPR, - build_pointer_type (BINFO_TYPE (vc)), - orig_addr, - BINFO_OFFSET (vc)); - vc_delta = build (MINUS_EXPR, ptrdiff_type_node, - vc_delta, vc_addr); - vc_delta = save_expr (vc_delta); - *vbase_offsets = tree_cons (vc, vc_delta, *vbase_offsets); - } - else - vc_delta = TREE_VALUE (vc_delta); - - /* This is a downcast, so we have to subtract the offset - for the virtual base. */ - old_delta = cp_build_binary_op (MINUS_EXPR, old_delta, vc_delta); - } - - TREE_READONLY (new_delta) = 0; - TREE_TYPE (new_delta) = - cp_build_qualified_type (TREE_TYPE (new_delta), - CP_TYPE_QUALS (TREE_TYPE (new_delta)) - & ~TYPE_QUAL_CONST); - finish_expr_stmt (build_modify_expr (new_delta, NOP_EXPR, - old_delta)); - } - } - } - - /* Fixup upcast offsets for all direct vtables. Patterned after - expand_direct_vtbls_init. */ - - static void - fixup_virtual_upcast_offsets (real_binfo, binfo, init_self, can_elide, addr, orig_addr, type, vbase, vbase_offsets) - tree real_binfo, binfo; - int init_self, can_elide; - tree addr, orig_addr, type, vbase, *vbase_offsets; - { - tree real_binfos = BINFO_BASETYPES (real_binfo); - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0; - - for (i = 0; i < n_baselinks; i++) - { - tree real_base_binfo = TREE_VEC_ELT (real_binfos, i); - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = !BINFO_PRIMARY_P (real_base_binfo); - if (! TREE_VIA_VIRTUAL (real_base_binfo)) - fixup_virtual_upcast_offsets (real_base_binfo, base_binfo, - is_not_base_vtable, can_elide, addr, - orig_addr, type, vbase, vbase_offsets); - } - #if 0 - /* Before turning this on, make sure it is correct. */ - if (can_elide && ! BINFO_MODIFIED (binfo)) - return; - #endif - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo))) - { - tree new_addr = convert_pointer_to_real (binfo, addr); - expand_upcast_fixups (real_binfo, new_addr, orig_addr, vbase, addr, - type, vbase_offsets); - } - } - - /* Fixup all the virtual upcast offsets for TYPE. DECL_PTR is the - address of the sub-object being initialized. */ - - void - fixup_all_virtual_upcast_offsets (decl_ptr) - tree decl_ptr; - { - tree if_stmt; - tree in_charge_node; - tree vbases; - tree type; - - /* Only tweak the vtables if we're in charge. */ - in_charge_node = current_in_charge_parm; - if (!in_charge_node) - /* There's no need for any fixups in this case. */ - return; - in_charge_node = cp_build_binary_op (EQ_EXPR, - in_charge_node, integer_zero_node); - if_stmt = begin_if_stmt (); - finish_if_stmt_cond (in_charge_node, if_stmt); - - /* Iterate through the virtual bases, fixing up the upcast offset - for each one. */ - type = TREE_TYPE (TREE_TYPE (decl_ptr)); - for (vbases = CLASSTYPE_VBASECLASSES (type); - vbases; - vbases = TREE_CHAIN (vbases)) - { - if (flag_vtable_thunks) - /* We don't have dynamic thunks yet! So for now, just fail - silently. */ - ; - else - { - tree vbase; - tree vbase_offsets; - tree addr; - - vbase = find_vbase_instance (TREE_PURPOSE (vbases), type); - vbase_offsets = NULL_TREE; - addr = convert_pointer_to_vbase (TREE_PURPOSE (vbases), decl_ptr); - fixup_virtual_upcast_offsets (vbase, - TYPE_BINFO (TREE_PURPOSE (vbases)), - 1, 0, addr, decl_ptr, - type, vbase, &vbase_offsets); - } - } - - /* Close out the if-statement. */ - finish_then_clause (if_stmt); - finish_if_stmt (); - } - /* get virtual base class types. This adds type to the vbase_types list in reverse dfs order. Ordering is very important, so don't change it. */ --- 2147,2152 ---- *************** setup_class_bindings (name, type_binding *** 2963,2976 **** if (type_binding_p && (TREE_CODE (value_binding) == TYPE_DECL || (TREE_CODE (value_binding) == TREE_LIST && TREE_TYPE (value_binding) == error_mark_node && (TREE_CODE (TREE_VALUE (value_binding)) == TYPE_DECL)))) /* We found a type-binding, even when looking for a non-type binding. This means that we already processed this binding ! above. */ ! my_friendly_assert (type_binding_p, 19990401); else if (value_binding) { if (TREE_CODE (value_binding) == TREE_LIST --- 2392,2405 ---- if (type_binding_p && (TREE_CODE (value_binding) == TYPE_DECL + || DECL_CLASS_TEMPLATE_P (value_binding) || (TREE_CODE (value_binding) == TREE_LIST && TREE_TYPE (value_binding) == error_mark_node && (TREE_CODE (TREE_VALUE (value_binding)) == TYPE_DECL)))) /* We found a type-binding, even when looking for a non-type binding. This means that we already processed this binding ! above. */; else if (value_binding) { if (TREE_CODE (value_binding) == TREE_LIST diff -Nrc3pad gcc-3.0.4/gcc/cp/semantics.c gcc-3.1/gcc/cp/semantics.c *** gcc-3.0.4/gcc/cp/semantics.c Thu Jan 31 22:46:46 2002 --- gcc-3.1/gcc/cp/semantics.c Wed Apr 17 01:44:01 2002 *************** *** 3,9 **** building RTL. These routines are used both during actual parsing and during the instantiation of template functions. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Written by Mark Mitchell (mmitchell@usa.net) based on code found formerly in parse.y and pt.c. --- 3,9 ---- building RTL. These routines are used both during actual parsing and during the instantiation of template functions. ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Written by Mark Mitchell (mmitchell@usa.net) based on code found formerly in parse.y and pt.c. *************** *** 28,41 **** --- 28,44 ---- #include "system.h" #include "tree.h" #include "cp-tree.h" + #include "tree-inline.h" #include "except.h" #include "lex.h" #include "toplev.h" #include "flags.h" #include "ggc.h" #include "rtl.h" + #include "expr.h" #include "output.h" #include "timevar.h" + #include "debug.h" /* There routines provide a modular interface to perform many parsing operations. They may therefore be used during actual parsing, or *************** static void emit_associated_thunks PARAM *** 53,59 **** static void genrtl_try_block PARAMS ((tree)); static void genrtl_eh_spec_block PARAMS ((tree)); static void genrtl_handler PARAMS ((tree)); - static void genrtl_catch_block PARAMS ((tree)); static void genrtl_ctor_stmt PARAMS ((tree)); static void genrtl_subobject PARAMS ((tree)); static void genrtl_named_return_value PARAMS ((void)); --- 56,61 ---- *************** static tree clear_decl_rtl PARAMS ((tree *** 64,82 **** /* Finish processing the COND, the SUBSTMT condition for STMT. */ ! #define FINISH_COND(cond, stmt, substmt) \ do { \ ! if (last_tree != stmt) \ { \ ! RECHAIN_STMTS (stmt, substmt); \ ! if (!processing_template_decl) \ ! { \ ! cond = build_tree_list (substmt, cond); \ ! substmt = cond; \ ! } \ } \ else \ ! substmt = cond; \ } while (0) /* Returns non-zero if the current statement is a full expression, --- 66,84 ---- /* Finish processing the COND, the SUBSTMT condition for STMT. */ ! #define FINISH_COND(COND, STMT, SUBSTMT) \ do { \ ! if (last_tree != (STMT)) \ { \ ! RECHAIN_STMTS (STMT, SUBSTMT); \ ! if (!processing_template_decl) \ ! { \ ! (COND) = build_tree_list (SUBSTMT, COND); \ ! (SUBSTMT) = (COND); \ ! } \ } \ else \ ! (SUBSTMT) = (COND); \ } while (0) /* Returns non-zero if the current statement is a full expression, *************** finish_expr_stmt (expr) *** 203,208 **** --- 205,211 ---- tree expr; { tree r = NULL_TREE; + tree expr_type = NULL_TREE;; if (expr != NULL_TREE) { *************** finish_expr_stmt (expr) *** 213,218 **** --- 216,224 ---- || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)) expr = default_conversion (expr); + /* Remember the type of the expression. */ + expr_type = TREE_TYPE (expr); + if (stmts_are_full_exprs_p ()) expr = convert_to_void (expr, "statement"); *************** finish_expr_stmt (expr) *** 223,229 **** /* This was an expression-statement, so we save the type of the expression. */ ! last_expr_type = expr ? TREE_TYPE (expr) : NULL_TREE; return r; } --- 229,235 ---- /* This was an expression-statement, so we save the type of the expression. */ ! last_expr_type = expr_type; return r; } *************** finish_else_clause (if_stmt) *** 283,289 **** RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt)); } ! /* Finsh an if-statement. */ void finish_if_stmt () --- 289,295 ---- RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt)); } ! /* Finish an if-statement. */ void finish_if_stmt () *************** finish_return_stmt (expr) *** 388,408 **** expr = check_return_expr (expr); if (!processing_template_decl) { ! if (DECL_CONSTRUCTOR_P (current_function_decl) && ctor_label) ! { ! /* Even returns without a value in a constructor must return ! `this'. We accomplish this by sending all returns in a ! constructor to the CTOR_LABEL; finish_function emits code to ! return a value there. When we finally generate the real ! return statement, CTOR_LABEL is no longer set, and we fall ! through into the normal return-processing code below. */ ! return finish_goto_stmt (ctor_label); ! } ! else if (DECL_DESTRUCTOR_P (current_function_decl)) { /* Similarly, all destructors must run destructors for base-classes before returning. So, all returns in a ! destructor get sent to the DTOR_LABEL; finsh_function emits code to return a value there. */ return finish_goto_stmt (dtor_label); } --- 394,404 ---- expr = check_return_expr (expr); if (!processing_template_decl) { ! if (DECL_DESTRUCTOR_P (current_function_decl)) { /* Similarly, all destructors must run destructors for base-classes before returning. So, all returns in a ! destructor get sent to the DTOR_LABEL; finish_function emits code to return a value there. */ return finish_goto_stmt (dtor_label); } *************** tree *** 508,514 **** begin_switch_stmt () { tree r; ! r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE); add_stmt (r); do_pushlevel (); return r; --- 504,510 ---- begin_switch_stmt () { tree r; ! r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE, NULL_TREE); add_stmt (r); do_pushlevel (); return r; *************** finish_switch_cond (cond, switch_stmt) *** 521,529 **** tree cond; tree switch_stmt; { if (!processing_template_decl) { - tree type; tree index; /* Convert the condition to an integer or enumeration type. */ --- 517,525 ---- tree cond; tree switch_stmt; { + tree orig_type = NULL; if (!processing_template_decl) { tree index; /* Convert the condition to an integer or enumeration type. */ *************** finish_switch_cond (cond, switch_stmt) *** 533,555 **** error ("switch quantity not an integer"); cond = error_mark_node; } if (cond != error_mark_node) { cond = default_conversion (cond); cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond)); } ! type = TREE_TYPE (cond); ! index = get_unwidened (cond, NULL_TREE); ! /* We can't strip a conversion from a signed type to an unsigned, ! because if we did, int_fits_type_p would do the wrong thing ! when checking case values for being in range, ! and it's too hard to do the right thing. */ ! if (TREE_UNSIGNED (TREE_TYPE (cond)) ! == TREE_UNSIGNED (TREE_TYPE (index))) ! cond = index; } FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt)); push_switch (switch_stmt); } --- 529,555 ---- error ("switch quantity not an integer"); cond = error_mark_node; } + orig_type = TREE_TYPE (cond); if (cond != error_mark_node) { cond = default_conversion (cond); cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond)); } ! if (cond != error_mark_node) ! { ! index = get_unwidened (cond, NULL_TREE); ! /* We can't strip a conversion from a signed type to an unsigned, ! because if we did, int_fits_type_p would do the wrong thing ! when checking case values for being in range, ! and it's too hard to do the right thing. */ ! if (TREE_UNSIGNED (TREE_TYPE (cond)) ! == TREE_UNSIGNED (TREE_TYPE (index))) ! cond = index; ! } } FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt)); + SWITCH_TYPE (switch_stmt) = orig_type; push_switch (switch_stmt); } *************** genrtl_try_block (t) *** 588,594 **** if (FN_TRY_BLOCK_P (t)) { - end_protect_partials (); expand_start_all_catch (); in_function_try_handler = 1; expand_stmt (TRY_HANDLERS (t)); --- 588,593 ---- *************** finish_cleanup (cleanup, try_block) *** 676,682 **** void finish_function_try_block (try_block) ! tree try_block; { if (TREE_CHAIN (try_block) && TREE_CODE (TREE_CHAIN (try_block)) == CTOR_INITIALIZER) --- 675,681 ---- void finish_function_try_block (try_block) ! tree try_block; { if (TREE_CHAIN (try_block) && TREE_CODE (TREE_CHAIN (try_block)) == CTOR_INITIALIZER) *************** genrtl_handler (t) *** 720,725 **** --- 719,726 ---- tree t; { genrtl_do_pushlevel (); + if (!processing_template_decl) + expand_start_catch (HANDLER_TYPE (t)); expand_stmt (HANDLER_BODY (t)); if (!processing_template_decl) expand_end_catch (); *************** begin_handler () *** 733,739 **** --- 734,743 ---- tree r; r = build_stmt (HANDLER, NULL_TREE, NULL_TREE); add_stmt (r); + /* Create a binding level for the eh_info and the exception object + cleanup. */ do_pushlevel (); + note_level_for_catch (); return r; } *************** begin_handler () *** 741,753 **** HANDLER. DECL is the declaration for the catch parameter, or NULL if this is a `catch (...)' clause. */ ! tree finish_handler_parms (decl, handler) tree decl; tree handler; { ! tree blocks = NULL_TREE; ! if (processing_template_decl) { if (decl) --- 745,756 ---- HANDLER. DECL is the declaration for the catch parameter, or NULL if this is a `catch (...)' clause. */ ! void finish_handler_parms (decl, handler) tree decl; tree handler; { ! tree type = NULL_TREE; if (processing_template_decl) { if (decl) *************** finish_handler_parms (decl, handler) *** 756,802 **** decl = push_template_decl (decl); add_decl_stmt (decl); RECHAIN_STMTS (handler, HANDLER_PARMS (handler)); } } else ! blocks = expand_start_catch_block (decl); ! ! if (decl) ! TREE_TYPE (handler) = TREE_TYPE (decl); ! ! return blocks; ! } ! ! /* Generate the RTL for a START_CATCH_STMT. */ ! ! static void ! genrtl_catch_block (type) ! tree type; ! { ! expand_start_catch (type); ! } ! ! /* Note the beginning of a handler for TYPE. This function is called ! at the point to which control should be transferred when an ! appropriately-typed exception is thrown. */ ! void ! begin_catch_block (type) ! tree type; ! { ! add_stmt (build (START_CATCH_STMT, type)); } /* Finish a handler, which may be given by HANDLER. The BLOCKs are the return value from the matching call to finish_handler_parms. */ void ! finish_handler (blocks, handler) ! tree blocks; tree handler; { if (!processing_template_decl) ! expand_end_catch_block (blocks); do_poplevel (); RECHAIN_STMTS (handler, HANDLER_BODY (handler)); } --- 759,782 ---- decl = push_template_decl (decl); add_decl_stmt (decl); RECHAIN_STMTS (handler, HANDLER_PARMS (handler)); + type = TREE_TYPE (decl); } } else ! type = expand_start_catch_block (decl); ! HANDLER_TYPE (handler) = type; } /* Finish a handler, which may be given by HANDLER. The BLOCKs are the return value from the matching call to finish_handler_parms. */ void ! finish_handler (handler) tree handler; { if (!processing_template_decl) ! expand_end_catch_block (); do_poplevel (); RECHAIN_STMTS (handler, HANDLER_BODY (handler)); } *************** begin_compound_stmt (has_no_scope) *** 851,866 **** to accidentally keep a block *inside* the scopeless block. */ keep_next_level (0); - /* If this is the outermost block of the function, declare the - variables __FUNCTION__, __PRETTY_FUNCTION__, and so forth. */ - if (cfun - && !function_name_declared_p - && !has_no_scope) - { - function_name_declared_p = 1; - declare_function_name (); - } - return r; } --- 831,836 ---- *************** finish_asm_stmt (cv_qualifier, string, o *** 916,922 **** if (cv_qualifier != NULL_TREE && cv_qualifier != ridpointers[(int) RID_VOLATILE]) { ! cp_warning ("%s qualifier ignored on asm", IDENTIFIER_POINTER (cv_qualifier)); cv_qualifier = NULL_TREE; } --- 886,892 ---- if (cv_qualifier != NULL_TREE && cv_qualifier != ridpointers[(int) RID_VOLATILE]) { ! warning ("%s qualifier ignored on asm", IDENTIFIER_POINTER (cv_qualifier)); cv_qualifier = NULL_TREE; } *************** finish_asm_stmt (cv_qualifier, string, o *** 928,934 **** int noutputs; for (t = input_operands; t; t = TREE_CHAIN (t)) ! TREE_VALUE (t) = decay_conversion (TREE_VALUE (t)); ninputs = list_length (input_operands); noutputs = list_length (output_operands); --- 898,919 ---- int noutputs; for (t = input_operands; t; t = TREE_CHAIN (t)) ! { ! tree converted_operand ! = decay_conversion (TREE_VALUE (t)); ! ! /* If the type of the operand hasn't been determined (e.g., ! because it involves an overloaded function), then issue ! an error message. There's no context available to ! resolve the overloading. */ ! if (TREE_TYPE (converted_operand) == unknown_type_node) ! { ! error ("type of asm operand `%E' could not be determined", ! TREE_VALUE (t)); ! converted_operand = error_mark_node; ! } ! TREE_VALUE (t) = converted_operand; ! } ninputs = list_length (input_operands); noutputs = list_length (output_operands); *************** finish_asm_stmt (cv_qualifier, string, o *** 941,947 **** const char *constraint; tree operand; ! constraint = TREE_STRING_POINTER (TREE_PURPOSE (t)); operand = TREE_VALUE (output_operands); if (!parse_output_constraint (&constraint, --- 926,932 ---- const char *constraint; tree operand; ! constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t))); operand = TREE_VALUE (output_operands); if (!parse_output_constraint (&constraint, *************** finish_named_return_value (return_id, in *** 1074,1080 **** DECL_NAME (decl) = return_id; else { ! cp_error ("return identifier `%D' already in place", return_id); return; } } --- 1059,1065 ---- DECL_NAME (decl) = return_id; else { ! error ("return identifier `%D' already in place", return_id); return; } } *************** finish_mem_initializers (init_list) *** 1139,1145 **** /* We're running through the initializers from right to left as we process them here. So, if we see a data member initializer after we see a base initializer, that ! actually means that the base initializer preceeded the data member initializer. */ if (warn_reorder && last_base_warned_about != base_init_list) { --- 1124,1130 ---- /* We're running through the initializers from right to left as we process them here. So, if we see a data member initializer after we see a base initializer, that ! actually means that the base initializer preceded the data member initializer. */ if (warn_reorder && last_base_warned_about != base_init_list) { *************** finish_mem_initializers (init_list) *** 1149,1155 **** base != last_base_warned_about; base = TREE_CHAIN (base)) { ! cp_warning ("base initializer for `%T'", TREE_PURPOSE (base)); warning (" will be re-ordered to precede member initializations"); } --- 1134,1140 ---- base != last_base_warned_about; base = TREE_CHAIN (base)) { ! warning ("base initializer for `%T'", TREE_PURPOSE (base)); warning (" will be re-ordered to precede member initializations"); } *************** finish_mem_initializers (init_list) *** 1164,1254 **** } } - setup_vtbl_ptr (member_init_list, base_init_list); - } - - /* Do the initialization work necessary at the beginning of a constructor - or destructor. This means processing member initializers and setting - vtable pointers. - - ??? The call to keep_next_level at the end applies to all functions, but - should probably go somewhere else. */ - - void - setup_vtbl_ptr (member_init_list, base_init_list) - tree member_init_list; - tree base_init_list; - { - my_friendly_assert (doing_semantic_analysis_p (), 19990919); - - /* If we've already done this, there's no need to do it again. */ - if (vtbls_set_up_p) - return; - if (processing_template_decl) add_stmt (build_min_nt (CTOR_INITIALIZER, member_init_list, base_init_list)); ! else if (DECL_CONSTRUCTOR_P (current_function_decl)) ! { ! tree ctor_stmt; ! ! /* Mark the beginning of the constructor. */ ! ctor_stmt = build_stmt (CTOR_STMT); ! CTOR_BEGIN_P (ctor_stmt) = 1; ! add_stmt (ctor_stmt); ! ! /* And actually initialize the base-classes and members. */ ! emit_base_init (member_init_list, base_init_list); ! } ! else if (DECL_DESTRUCTOR_P (current_function_decl)) ! { ! tree if_stmt; ! tree compound_stmt; ! int saved_cfnd; ! ! /* If the dtor is empty, and we know there is not any possible ! way we could use any vtable entries, before they are possibly ! set by a base class dtor, we don't have to setup the vtables, ! as we know that any base class dtor will set up any vtables ! it needs. We avoid MI, because one base class dtor can do a ! virtual dispatch to an overridden function that would need to ! have a non-related vtable set up, we cannot avoid setting up ! vtables in that case. We could change this to see if there ! is just one vtable. */ ! if_stmt = begin_if_stmt (); ! ! /* If it is not safe to avoid setting up the vtables, then ! someone will change the condition to be boolean_true_node. ! (Actually, for now, we do not have code to set the condition ! appropriately, so we just assume that we always need to ! initialize the vtables.) */ ! finish_if_stmt_cond (boolean_true_node, if_stmt); ! current_vcalls_possible_p = &IF_COND (if_stmt); ! ! /* Don't declare __PRETTY_FUNCTION__ and friends here when we ! open the block for the if-body. */ ! saved_cfnd = function_name_declared_p; ! function_name_declared_p = 1; ! compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); ! function_name_declared_p = saved_cfnd; ! ! /* Make all virtual function table pointers in non-virtual base ! classes point to CURRENT_CLASS_TYPE's virtual function ! tables. */ ! initialize_vtbl_ptrs (current_class_ptr); ! ! finish_compound_stmt (/*has_no_scope=*/0, compound_stmt); ! finish_then_clause (if_stmt); ! finish_if_stmt (); ! } ! ! /* Always keep the BLOCK node associated with the outermost pair of ! curly braces of a function. These are needed for correct ! operation of dwarfout.c. */ ! keep_next_level (1); ! ! /* The virtual function tables are set up now. */ ! vtbls_set_up_p = 1; } /* Returns the stack of SCOPE_STMTs for the current function. */ --- 1149,1159 ---- } } if (processing_template_decl) add_stmt (build_min_nt (CTOR_INITIALIZER, member_init_list, base_init_list)); ! else ! emit_base_init (member_init_list, base_init_list); } /* Returns the stack of SCOPE_STMTs for the current function. */ *************** begin_global_stmt_expr () *** 1308,1314 **** keep_next_level (1); ! return (last_tree != NULL_TREE) ? last_tree : expand_start_stmt_expr(); } /* Finish the STMT_EXPR last begun with begin_global_stmt_expr. */ --- 1213,1219 ---- keep_next_level (1); ! return last_tree ? last_tree : expand_start_stmt_expr(/*has_scope=*/1); } /* Finish the STMT_EXPR last begun with begin_global_stmt_expr. */ *************** finish_this_expr () *** 1414,1422 **** if (current_class_ptr) { - #ifdef WARNING_ABOUT_CCD - TREE_USED (current_class_ptr) = 1; - #endif result = current_class_ptr; } else if (current_function_decl --- 1319,1324 ---- *************** finish_object_call_expr (fn, object, arg *** 1468,1474 **** fn = DECL_NAME (fn); else { ! cp_error ("calling type `%T' like a method", fn); return error_mark_node; } } --- 1370,1376 ---- fn = DECL_NAME (fn); else { ! error ("calling type `%T' like a method", fn); return error_mark_node; } } *************** finish_pseudo_destructor_call_expr (obje *** 1504,1516 **** return build_min_nt (PSEUDO_DTOR_EXPR, object, scope, destructor); if (scope && scope != destructor) ! cp_error ("destructor specifier `%T::~%T()' must have matching names", scope, destructor); if ((scope == NULL_TREE || IDENTIFIER_GLOBAL_VALUE (destructor)) && (TREE_CODE (TREE_TYPE (object)) != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (destructor))))) ! cp_error ("`%E' is not of type `%T'", object, destructor); return cp_convert (void_type_node, object); } --- 1406,1418 ---- return build_min_nt (PSEUDO_DTOR_EXPR, object, scope, destructor); if (scope && scope != destructor) ! error ("destructor specifier `%T::~%T()' must have matching names", scope, destructor); if ((scope == NULL_TREE || IDENTIFIER_GLOBAL_VALUE (destructor)) && (TREE_CODE (TREE_TYPE (object)) != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (destructor))))) ! error ("`%E' is not of type `%T'", object, destructor); return cp_convert (void_type_node, object); } *************** finish_qualified_call_expr (fn, args) *** 1531,1561 **** args); } - /* Finish an expression taking the address of LABEL. Returns an - expression for the address. */ - - tree - finish_label_address_expr (label) - tree label; - { - tree result; - - label = lookup_label (label); - if (label == NULL_TREE) - result = null_pointer_node; - else - { - TREE_USED (label) = 1; - result = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT (result) = 1; - /* This function cannot be inlined. All jumps to the addressed - label should wind up at the same point. */ - DECL_UNINLINABLE (current_function_decl) = 1; - } - - return result; - } - /* Finish an expression of the form CODE EXPR. */ tree --- 1433,1438 ---- *************** save_type_access_control (lookups) *** 1638,1643 **** --- 1515,1529 ---- current_type_lookups = lookups; } + /* Reset the deferred access control. */ + + void + reset_type_access_control () + { + type_lookups = NULL_TREE; + current_type_lookups = NULL_TREE; + } + /* Begin a function definition declared with DECL_SPECS and DECLARATOR. Returns non-zero if the function-declaration is legal. */ *************** finish_translation_unit () *** 1702,1707 **** --- 1588,1597 ---- pop_everything (); while (current_namespace != global_namespace) pop_namespace (); + + /* Do file scope __FUNCTION__ et al. */ + finish_fname_decls (); + finish_file (); } *************** tree *** 1768,1776 **** begin_class_definition (t) tree t; { if (processing_template_parmlist) { ! cp_error ("definition of `%#T' inside template parameter list", t); return error_mark_node; } --- 1658,1673 ---- begin_class_definition (t) tree t; { + if (t == error_mark_node) + return error_mark_node; + + /* Check the bases are accessible. */ + decl_type_access_control (TYPE_NAME (t)); + reset_type_access_control (); + if (processing_template_parmlist) { ! error ("definition of `%#T' inside template parameter list", t); return error_mark_node; } *************** begin_class_definition (t) *** 1786,1792 **** This is erroneous. */ else if (TREE_CODE (t) == TYPENAME_TYPE) { ! cp_error ("invalid definition of qualified type `%T'", t); t = error_mark_node; } --- 1683,1689 ---- This is erroneous. */ else if (TREE_CODE (t) == TYPENAME_TYPE) { ! error ("invalid definition of qualified type `%T'", t); t = error_mark_node; } *************** begin_class_definition (t) *** 1869,1880 **** SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); } - - /* Only leave this bit clear if we know this - class is part of an interface-only specification. */ - if (! CLASSTYPE_INTERFACE_KNOWN (t) - || ! CLASSTYPE_INTERFACE_ONLY (t)) - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = 1; reset_specialization(); /* Make a declaration for this class in its own scope. */ --- 1766,1771 ---- *************** finish_class_definition (t, attributes, *** 1979,1985 **** int semi; int pop_scope_p; { ! tree variant; /* finish_struct nukes this anyway; if finish_exception does too, then it can go. */ --- 1870,1877 ---- int semi; int pop_scope_p; { ! if (t == error_mark_node) ! return error_mark_node; /* finish_struct nukes this anyway; if finish_exception does too, then it can go. */ *************** finish_class_definition (t, attributes, *** 1988,1998 **** /* If we got any attributes in class_head, xref_tag will stick them in TREE_TYPE of the type. Grab them now. */ ! attributes = chainon (TREE_TYPE (t), attributes); ! ! /* And then clear it out. */ ! for (variant = t; variant; variant = TYPE_NEXT_VARIANT (variant)) ! TREE_TYPE (variant) = NULL_TREE; if (TREE_CODE (t) == ENUMERAL_TYPE) ; --- 1880,1887 ---- /* If we got any attributes in class_head, xref_tag will stick them in TREE_TYPE of the type. Grab them now. */ ! attributes = chainon (TYPE_ATTRIBUTES (t), attributes); ! TYPE_ATTRIBUTES (t) = NULL_TREE; if (TREE_CODE (t) == ENUMERAL_TYPE) ; *************** finish_member_class_template (types) *** 2065,2071 **** return NULL_TREE; } ! /* Finish processsing a complete template declaration. The PARMS are the template parameters. */ void --- 1954,1960 ---- return NULL_TREE; } ! /* Finish processing a complete template declaration. The PARMS are the template parameters. */ void *************** enter_scope_of (sr) *** 2131,2137 **** /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER. Return a TREE_LIST containing the ACCESS_SPECIFIER and the BASE_CLASS, or NULL_TREE if an error occurred. The ! ACCESSS_SPECIFIER is one of access_{default,public,protected_private}[_virtual]_node.*/ tree --- 2020,2026 ---- /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER. Return a TREE_LIST containing the ACCESS_SPECIFIER and the BASE_CLASS, or NULL_TREE if an error occurred. The ! ACCESS_SPECIFIER is one of access_{default,public,protected_private}[_virtual]_node.*/ tree *************** finish_base_specifier (access_specifier, *** 2145,2153 **** result = NULL_TREE; else { ! if (CP_TYPE_QUALS (base_class) != 0) { ! cp_error ("base class `%T' has cv qualifiers", base_class); base_class = TYPE_MAIN_VARIANT (base_class); } result = build_tree_list (access_specifier, base_class); --- 2034,2042 ---- result = NULL_TREE; else { ! if (cp_type_quals (base_class) != 0) { ! error ("base class `%T' has cv qualifiers", base_class); base_class = TYPE_MAIN_VARIANT (base_class); } result = build_tree_list (access_specifier, base_class); *************** check_multiple_declarators () *** 2180,2188 **** if (PROCESSING_REAL_TEMPLATE_DECL_P () || processing_explicit_instantiation || processing_specialization) ! cp_error ("multiple declarators in template declaration"); } tree finish_typeof (expr) tree expr; --- 2069,2080 ---- if (PROCESSING_REAL_TEMPLATE_DECL_P () || processing_explicit_instantiation || processing_specialization) ! error ("multiple declarators in template declaration"); } + /* Implement the __typeof keyword: Return the type of EXPR, suitable for + use as a type-specifier. */ + tree finish_typeof (expr) tree expr; *************** finish_typeof (expr) *** 2197,2205 **** --- 2089,2125 ---- return t; } + if (TREE_CODE (expr) == OFFSET_REF) + expr = resolve_offset_ref (expr); + return TREE_TYPE (expr); } + /* Compute the value of the `sizeof' operator. */ + + tree + finish_sizeof (t) + tree t; + { + if (processing_template_decl) + return build_min_nt (SIZEOF_EXPR, t); + + return TYPE_P (t) ? c_sizeof (t) : expr_sizeof (t); + } + + /* Implement the __alignof keyword: Return the minimum required + alignment of T, measured in bytes. */ + + tree + finish_alignof (t) + tree t; + { + if (processing_template_decl) + return build_min_nt (ALIGNOF_EXPR, t); + + return TYPE_P (t) ? c_alignof (t) : c_alignof_expr (t); + } + /* Generate RTL for the statement T, and its substatements, and any other statements at its nesting level. */ *************** cp_expand_stmt (t) *** 2209,2222 **** { switch (TREE_CODE (t)) { - case CLEANUP_STMT: - genrtl_decl_cleanup (CLEANUP_DECL (t), CLEANUP_EXPR (t)); - break; - - case START_CATCH_STMT: - genrtl_catch_block (TREE_TYPE (t)); - break; - case CTOR_STMT: genrtl_ctor_stmt (t); break; --- 2129,2134 ---- *************** cp_expand_stmt (t) *** 2245,2251 **** break; default: ! my_friendly_abort (19990810); break; } } --- 2157,2163 ---- break; default: ! abort (); break; } } *************** emit_associated_thunks (fn) *** 2349,2355 **** is so that you can know statically the entire set of thunks that will ever be needed for a given virtual function, thereby enabling you to output all the thunks with the function itself. */ ! if (vcall_offsets_in_vtable_p () && DECL_VIRTUAL_P (fn)) { tree binfo; tree v; --- 2261,2267 ---- is so that you can know statically the entire set of thunks that will ever be needed for a given virtual function, thereby enabling you to output all the thunks with the function itself. */ ! if (DECL_VIRTUAL_P (fn)) { tree binfo; tree v; *************** expand_body (fn) *** 2415,2422 **** simplify_aggr_init_exprs_r, NULL); ! /* If this is a constructor or destructor body, we have to clone it ! under the new ABI. */ if (maybe_clone_body (fn)) { /* We don't want to process FN again, so pretend we've written --- 2327,2334 ---- simplify_aggr_init_exprs_r, NULL); ! /* If this is a constructor or destructor body, we have to clone ! it. */ if (maybe_clone_body (fn)) { /* We don't want to process FN again, so pretend we've written *************** expand_body (fn) *** 2435,2446 **** to decide whether to write it out or not. */ if (/* We have to generate RTL if it's not an inline function. */ (DECL_INLINE (fn) || DECL_COMDAT (fn)) ! /* Or if we have to keep all inline functions anyhow. */ && !flag_keep_inline_functions /* Or if we actually have a reference to the function. */ ! && !DECL_NEEDED_P (fn) ! /* Or if this is a nested function. */ ! && !decl_function_context (fn)) { /* Set DECL_EXTERNAL so that assemble_external will be called as necessary. We'll clear it again in finish_file. */ --- 2347,2356 ---- to decide whether to write it out or not. */ if (/* We have to generate RTL if it's not an inline function. */ (DECL_INLINE (fn) || DECL_COMDAT (fn)) ! /* Or if we have to emit code for inline functions anyhow. */ && !flag_keep_inline_functions /* Or if we actually have a reference to the function. */ ! && !DECL_NEEDED_P (fn)) { /* Set DECL_EXTERNAL so that assemble_external will be called as necessary. We'll clear it again in finish_file. */ *************** expand_body (fn) *** 2452,2459 **** /* Remember this function. In finish_file we'll decide if we actually need to write this function out. */ defer_fn (fn); ! /* Let the back-end know that this funtion exists. */ ! note_deferral_of_defined_inline_function (fn); return; } --- 2362,2369 ---- /* Remember this function. In finish_file we'll decide if we actually need to write this function out. */ defer_fn (fn); ! /* Let the back-end know that this function exists. */ ! (*debug_hooks->deferred_inline_function) (fn); return; } *************** expand_body (fn) *** 2462,2479 **** if (DECL_DECLARED_INLINE_P (fn)) import_export_decl (fn); ! /* Emit any thunks that should be emitted at the same time as FN. */ ! emit_associated_thunks (fn); timevar_push (TV_INTEGRATION); ! /* Optimize the body of the function before expanding it. We do not ! optimize thunks, as (1) the backend tries to optimize the call to ! the thunkee, (b) the tree based inliner breaks that optimization, ! (c) virtual functions are rarely inlineable, and (d) ! ASM_OUTPUT_MI_THUNK is there to DTRT anyway. */ ! if (!DECL_THUNK_P (fn)) ! optimize_function (fn); timevar_pop (TV_INTEGRATION); timevar_push (TV_EXPAND); --- 2372,2389 ---- if (DECL_DECLARED_INLINE_P (fn)) import_export_decl (fn); ! /* If FN is external, then there's no point in generating RTL for ! it. This situation can arise with an inline function under ! `-fexternal-templates'; we instantiate the function, even though ! we're not planning on emitting it, in case we get a chance to ! inline it. */ ! if (DECL_EXTERNAL (fn)) ! return; timevar_push (TV_INTEGRATION); ! /* Optimize the body of the function before expanding it. */ ! optimize_function (fn); timevar_pop (TV_INTEGRATION); timevar_push (TV_EXPAND); *************** expand_body (fn) *** 2489,2499 **** genrtl_start_function (fn); current_function_is_thunk = DECL_THUNK_P (fn); - /* We don't need to redeclare __FUNCTION__, __PRETTY_FUNCTION__, or - any of the other magic variables we set up when starting a - function body. */ - function_name_declared_p = 1; - /* Expand the body. */ expand_stmt (DECL_SAVED_TREE (fn)); --- 2399,2404 ---- *************** expand_body (fn) *** 2527,2532 **** --- 2432,2466 ---- extract_interface_info (); timevar_pop (TV_EXPAND); + + /* Emit any thunks that should be emitted at the same time as FN. */ + emit_associated_thunks (fn); + } + + /* Helper function for walk_tree, used by finish_function to override all + the RETURN_STMTs and pertinent CLEANUP_STMTs for the named return + value optimization. */ + + tree + nullify_returns_r (tp, walk_subtrees, data) + tree *tp; + int *walk_subtrees; + void *data; + { + tree nrv = (tree) data; + + /* No need to walk into types. There wouldn't be any need to walk into + non-statements, except that we have to consider STMT_EXPRs. */ + if (TYPE_P (*tp)) + *walk_subtrees = 0; + else if (TREE_CODE (*tp) == RETURN_STMT) + RETURN_EXPR (*tp) = NULL_TREE; + else if (TREE_CODE (*tp) == CLEANUP_STMT + && CLEANUP_DECL (*tp) == nrv) + CLEANUP_EH_ONLY (*tp) = 1; + + /* Keep iterating. */ + return NULL_TREE; } /* Start generating the RTL for FN. */ *************** static void *** 2535,2542 **** genrtl_start_function (fn) tree fn; { - tree parm; - /* Tell everybody what function we're processing. */ current_function_decl = fn; /* Get the RTL machinery going for this function. */ --- 2469,2474 ---- *************** genrtl_start_function (fn) *** 2572,2611 **** if (!current_function_cannot_inline) current_function_cannot_inline = cp_function_chain->cannot_inline; ! /* We don't need the saved data anymore. */ ! free (DECL_SAVED_FUNCTION_DATA (fn)); ! DECL_SAVED_FUNCTION_DATA (fn) = NULL; } - /* Tell the cross-reference machinery that we're defining this - function. */ - GNU_xref_function (fn, DECL_ARGUMENTS (fn)); - /* Keep track of how many functions we're presently expanding. */ ++function_depth; /* Create a binding level for the parameters. */ ! expand_start_bindings (2); ! /* Clear out any previously saved instructions for this function, in ! case it was defined more than once. */ ! DECL_SAVED_INSNS (fn) = NULL; ! /* Go through the PARM_DECLs for this function to see if any need ! cleanups. */ ! for (parm = DECL_ARGUMENTS (fn); parm; parm = TREE_CHAIN (parm)) ! if (TREE_TYPE (parm) != error_mark_node ! && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (parm))) ! { ! expand_function_start (fn, /*parms_have_cleanups=*/1); ! break; ! } ! if (!parm) ! expand_function_start (fn, /*parms_have_cleanups=*/0); /* If this function is `main'. */ if (DECL_MAIN_P (fn)) expand_main_function (); ! /* Create a binding contour which can be used to catch ! cleanup-generated temporaries. */ ! expand_start_bindings (2); } /* Finish generating the RTL for FN. */ --- 2504,2531 ---- if (!current_function_cannot_inline) current_function_cannot_inline = cp_function_chain->cannot_inline; ! /* We don't need the saved data anymore. Unless this is an inline ! function; we need the named return value info for ! cp_copy_res_decl_for_inlining. */ ! if (! DECL_INLINE (fn)) ! { ! free (DECL_SAVED_FUNCTION_DATA (fn)); ! DECL_SAVED_FUNCTION_DATA (fn) = NULL; ! } } /* Keep track of how many functions we're presently expanding. */ ++function_depth; /* Create a binding level for the parameters. */ ! expand_function_start (fn, /*parms_have_cleanups=*/0); /* If this function is `main'. */ if (DECL_MAIN_P (fn)) expand_main_function (); ! ! /* Give our named return value the same RTL as our RESULT_DECL. */ ! if (current_function_return_value) ! COPY_DECL_RTL (DECL_RESULT (fn), current_function_return_value); } /* Finish generating the RTL for FN. */ *************** static void *** 2614,2620 **** genrtl_finish_function (fn) tree fn; { ! tree no_return_label = NULL_TREE; #if 0 if (write_symbols != NO_DEBUG) --- 2534,2540 ---- genrtl_finish_function (fn) tree fn; { ! tree t; #if 0 if (write_symbols != NO_DEBUG) *************** genrtl_finish_function (fn) *** 2642,2701 **** /* Clean house because we will need to reorder insns here. */ do_pending_stack_adjust (); ! if (!dtor_label && !DECL_CONSTRUCTOR_P (fn) ! && return_label != NULL_RTX ! && current_function_return_value == NULL_TREE ! && ! DECL_NAME (DECL_RESULT (current_function_decl))) ! no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ! ! /* If this function is supposed to return a value, ensure that ! we do not fall into the cleanups by mistake. The end of our ! function will look like this: ! ! user code (may have return stmt somewhere) ! goto no_return_label ! cleanup_label: ! cleanups ! goto return_label ! no_return_label: ! NOTE_INSN_FUNCTION_END ! return_label: ! things for return ! ! If the user omits a return stmt in the USER CODE section, we ! will have a control path which reaches NOTE_INSN_FUNCTION_END. ! Otherwise, we won't. */ ! if (no_return_label) ! { ! DECL_CONTEXT (no_return_label) = fn; ! DECL_INITIAL (no_return_label) = error_mark_node; ! DECL_SOURCE_FILE (no_return_label) = input_filename; ! DECL_SOURCE_LINE (no_return_label) = lineno; ! expand_goto (no_return_label); ! } ! ! if (cleanup_label) ! { ! /* Remove the binding contour which is used to catch ! cleanup-generated temporaries. */ ! expand_end_bindings (0, 0, 0); ! poplevel (0, 0, 0); ! ! /* Emit label at beginning of cleanup code for parameters. */ ! emit_label (cleanup_label); ! } ! ! /* Finish building code that will trigger warnings if users forget ! to make their functions return values. */ ! if (return_label) emit_jump (return_label); - if (no_return_label) - { - /* We don't need to call `expand_*_return' here because we don't - need any cleanups here--this path of code is only for error - checking purposes. */ - expand_label (no_return_label); - } /* We hard-wired immediate_size_expand to zero in start_function. Expand_function_end will decrement this variable. So, we set the --- 2562,2571 ---- /* Clean house because we will need to reorder insns here. */ do_pending_stack_adjust (); ! /* If we have a named return value, we need to force a return so that ! the return register is USEd. */ ! if (DECL_NAME (DECL_RESULT (fn))) emit_jump (return_label); /* We hard-wired immediate_size_expand to zero in start_function. Expand_function_end will decrement this variable. So, we set the *************** genrtl_finish_function (fn) *** 2704,2710 **** immediate_size_expand = 1; /* Generate rtl for function exit. */ ! expand_function_end (input_filename, lineno, 1); /* If this is a nested function (like a template instantiation that we're compiling in the midst of compiling something else), push a --- 2574,2580 ---- immediate_size_expand = 1; /* Generate rtl for function exit. */ ! expand_function_end (input_filename, lineno, 0); /* If this is a nested function (like a template instantiation that we're compiling in the midst of compiling something else), push a *************** genrtl_finish_function (fn) *** 2726,2741 **** if (function_depth > 1) ggc_pop_context (); - if (DECL_SAVED_INSNS (fn) && ! TREE_ASM_WRITTEN (fn)) - { - /* Set DECL_EXTERNAL so that assemble_external will be called as - necessary. We'll clear it again in finish_file. */ - if (! DECL_EXTERNAL (fn)) - DECL_NOT_REALLY_EXTERN (fn) = 1; - DECL_EXTERNAL (fn) = 1; - defer_fn (fn); - } - #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) */ --- 2596,2601 ---- *************** genrtl_finish_function (fn) *** 2758,2789 **** --function_depth; ! /* If we don't need the RTL for this function anymore, stop pointing ! to it. That's especially important for LABEL_DECLs, since you ! can reach all the instructions in the function from the ! CODE_LABEL stored in the DECL_RTL for the LABEL_DECL. */ ! if (!DECL_SAVED_INSNS (fn)) ! { ! tree t; ! ! /* Walk the BLOCK-tree, clearing DECL_RTL for LABEL_DECLs and ! non-static local variables. */ ! walk_tree_without_duplicates (&DECL_SAVED_TREE (fn), ! clear_decl_rtl, ! NULL); ! /* Clear out the RTL for the arguments. */ ! for (t = DECL_ARGUMENTS (fn); t; t = TREE_CHAIN (t)) ! { ! SET_DECL_RTL (t, NULL_RTX); ! DECL_INCOMING_RTL (t) = NULL_RTX; ! } ! if (!(flag_inline_trees && DECL_INLINE (fn))) ! /* DECL_INITIAL must remain nonzero so we know this was an ! actual function definition. */ ! DECL_INITIAL (fn) = error_mark_node; } /* Let the error reporting routines know that we're outside a function. For a nested function, this value is used in --- 2618,2647 ---- --function_depth; ! /* In C++, we should never be saving RTL for the function. */ ! my_friendly_assert (!DECL_SAVED_INSNS (fn), 20010903); ! /* Since we don't need the RTL for this function anymore, stop ! pointing to it. That's especially important for LABEL_DECLs, ! since you can reach all the instructions in the function from the ! CODE_LABEL stored in the DECL_RTL for the LABEL_DECL. Walk the ! BLOCK-tree, clearing DECL_RTL for LABEL_DECLs and non-static ! local variables. */ ! walk_tree_without_duplicates (&DECL_SAVED_TREE (fn), ! clear_decl_rtl, ! NULL); ! /* Clear out the RTL for the arguments. */ ! for (t = DECL_ARGUMENTS (fn); t; t = TREE_CHAIN (t)) ! { ! SET_DECL_RTL (t, NULL_RTX); ! DECL_INCOMING_RTL (t) = NULL_RTX; } + + if (!(flag_inline_trees && DECL_INLINE (fn))) + /* DECL_INITIAL must remain nonzero so we know this was an + actual function definition. */ + DECL_INITIAL (fn) = error_mark_node; /* Let the error reporting routines know that we're outside a function. For a nested function, this value is used in diff -Nrc3pad gcc-3.0.4/gcc/cp/spew.c gcc-3.1/gcc/cp/spew.c *** gcc-3.0.4/gcc/cp/spew.c Thu Jul 26 08:16:56 2001 --- gcc-3.1/gcc/cp/spew.c Mon Feb 4 08:55:43 2002 *************** *** 1,6 **** /* Type Analyzer for GNU C++. Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Hacked... nay, bludgeoned... by Mark Eichin (eichin@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Type Analyzer for GNU C++. Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Hacked... nay, bludgeoned... by Mark Eichin (eichin@cygnus.com) This file is part of GNU CC. *************** static SPEW_INLINE void consume_token PA *** 113,134 **** static SPEW_INLINE int read_process_identifier PARAMS ((YYSTYPE *)); static SPEW_INLINE void feed_input PARAMS ((struct unparsed_text *)); - static SPEW_INLINE void end_input PARAMS ((void)); static SPEW_INLINE void snarf_block PARAMS ((const char *, int)); static tree snarf_defarg PARAMS ((void)); static int frob_id PARAMS ((int, int, tree *)); /* The list of inline functions being held off until we reach the end of the current class declaration. */ ! struct unparsed_text *pending_inlines; ! struct unparsed_text *pending_inlines_tail; /* The list of previously-deferred inline functions currently being parsed. This exists solely to be a GC root. */ ! struct unparsed_text *processing_these_inlines; static void begin_parsing_inclass_inline PARAMS ((struct unparsed_text *)); - static void mark_pending_inlines PARAMS ((PTR)); #ifdef SPEW_DEBUG int spew_debug = 0; --- 113,132 ---- static SPEW_INLINE int read_process_identifier PARAMS ((YYSTYPE *)); static SPEW_INLINE void feed_input PARAMS ((struct unparsed_text *)); static SPEW_INLINE void snarf_block PARAMS ((const char *, int)); static tree snarf_defarg PARAMS ((void)); static int frob_id PARAMS ((int, int, tree *)); /* The list of inline functions being held off until we reach the end of the current class declaration. */ ! static struct unparsed_text *pending_inlines; ! static struct unparsed_text *pending_inlines_tail; /* The list of previously-deferred inline functions currently being parsed. This exists solely to be a GC root. */ ! static struct unparsed_text *processing_these_inlines; static void begin_parsing_inclass_inline PARAMS ((struct unparsed_text *)); #ifdef SPEW_DEBUG int spew_debug = 0; *************** static tree defarg_parm; /* current d *** 174,180 **** static tree defarg_depfns; /* list of unprocessed fns met during current fn. */ static tree defarg_fnsdone; /* list of fns with circular defargs */ ! /* Initialize obstacks. Called once, from init_parse. */ void init_spew () --- 172,178 ---- static tree defarg_depfns; /* list of unprocessed fns met during current fn. */ static tree defarg_fnsdone; /* list of fns with circular defargs */ ! /* Initialize obstacks. Called once, from cxx_init. */ void init_spew () *************** read_process_identifier (pyylval) *** 223,250 **** case RID_NOT_EQ: pyylval->code = NE_EXPR; return EQCOMPARE; default: - if (C_RID_YYCODE (id) == TYPESPEC) - GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id)); - pyylval->ttype = ridpointers[C_RID_CODE (id)]; return C_RID_YYCODE (id); } } - GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id)); - /* Make sure that user does not collide with our internal naming scheme. This is not necessary if '.' is used to remove them from the user's namespace, but is if '$' or double underscores are. */ #if !defined(JOINER) || JOINER == '$' ! if (THIS_NAME_P (id) ! || VPTR_NAME_P (id) ! || DESTRUCTOR_NAME_P (id) || VTABLE_NAME_P (id) || TEMP_NAME_P (id) ! || ANON_AGGRNAME_P (id) ! || ANON_PARMNAME_P (id)) warning ( "identifier name `%s' conflicts with GNU C++ internal naming strategy", IDENTIFIER_POINTER (id)); --- 221,240 ---- case RID_NOT_EQ: pyylval->code = NE_EXPR; return EQCOMPARE; default: pyylval->ttype = ridpointers[C_RID_CODE (id)]; return C_RID_YYCODE (id); } } /* Make sure that user does not collide with our internal naming scheme. This is not necessary if '.' is used to remove them from the user's namespace, but is if '$' or double underscores are. */ #if !defined(JOINER) || JOINER == '$' ! if (VPTR_NAME_P (id) || VTABLE_NAME_P (id) || TEMP_NAME_P (id) ! || ANON_AGGRNAME_P (id)) warning ( "identifier name `%s' conflicts with GNU C++ internal naming strategy", IDENTIFIER_POINTER (id)); *************** read_token (t) *** 265,272 **** switch (last_token) { ! #define YYCHAR(yy) t->yychar = yy; break; ! #define YYCODE(c) t->yylval.code = c; case CPP_EQ: YYCHAR('='); case CPP_NOT: YYCHAR('!'); --- 255,262 ---- switch (last_token) { ! #define YYCHAR(YY) t->yychar = (YY); break; ! #define YYCODE(C) t->yylval.code = (C); case CPP_EQ: YYCHAR('='); case CPP_NOT: YYCHAR('!'); *************** read_token (t) *** 331,338 **** #undef YYCODE case CPP_EOF: - if (cpp_pop_buffer (parse_in) != 0) - goto retry; t->yychar = 0; break; --- 321,326 ---- *************** read_token (t) *** 340,347 **** t->yychar = read_process_identifier (&t->yylval); break; - case CPP_INT: - case CPP_FLOAT: case CPP_NUMBER: case CPP_CHAR: case CPP_WCHAR: --- 328,333 ---- *************** read_token (t) *** 362,368 **** return t->yychar; } ! static SPEW_INLINE void feed_input (input) struct unparsed_text *input; { --- 348,354 ---- return t->yychar; } ! static void feed_input (input) struct unparsed_text *input; { *************** feed_input (input) *** 401,407 **** feed = f; } ! static SPEW_INLINE void end_input () { struct feed *f = feed; --- 387,393 ---- feed = f; } ! void end_input () { struct feed *f = feed; *************** end_input () *** 424,430 **** } /* GC callback to mark memory pointed to by the pending inline queue. */ ! static void mark_pending_inlines (pi) PTR pi; { --- 410,416 ---- } /* GC callback to mark memory pointed to by the pending inline queue. */ ! void mark_pending_inlines (pi) PTR pi; { *************** do_aggr () *** 683,689 **** nth_token (1)->yychar = IDENTIFIER_DEFN; break; default: ! my_friendly_abort (102); } } --- 669,675 ---- nth_token (1)->yychar = IDENTIFIER_DEFN; break; default: ! abort (); } } *************** frob_id (yyc, peek, idp) *** 925,931 **** lastiddecl = trrr; break; default: ! my_friendly_abort (20000907); } } else --- 911,917 ---- lastiddecl = trrr; break; default: ! abort (); } } else *************** begin_parsing_inclass_inline (pi) *** 958,965 **** tree context; /* Record that we are processing the chain of inlines starting at ! PI in a special GC root. */ ! processing_these_inlines = pi; ggc_collect (); --- 944,954 ---- tree context; /* Record that we are processing the chain of inlines starting at ! PI for GC. */ ! if (cfun) ! cp_function_chain->unparsed_inlines = pi; ! else ! processing_these_inlines = pi; ggc_collect (); *************** process_next_inline (i) *** 1033,1039 **** begin_parsing_inclass_inline (i); else { ! processing_these_inlines = 0; extract_interface_info (); } } --- 1022,1031 ---- begin_parsing_inclass_inline (i); else { ! if (cfun) ! cp_function_chain->unparsed_inlines = 0; ! else ! processing_these_inlines = 0; extract_interface_info (); } } *************** do_pending_defargs () *** 1360,1366 **** { /* This function's default args depend on unprocessed default args of defarg_fns. We will need to reprocess this function, and ! check for circular dependancies. */ tree a, b; for (a = defarg_depfns, b = TREE_PURPOSE (current); a && b; --- 1352,1358 ---- { /* This function's default args depend on unprocessed default args of defarg_fns. We will need to reprocess this function, and ! check for circular dependencies. */ tree a, b; for (a = defarg_depfns, b = TREE_PURPOSE (current); a && b; *************** replace_defarg (arg, init) *** 1440,1446 **** { if (! processing_template_decl && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init)) ! cp_pedwarn ("invalid type `%T' for default argument to `%T'", TREE_TYPE (init), TREE_VALUE (arg)); if (!defarg_depfns) TREE_PURPOSE (arg) = init; --- 1432,1438 ---- { if (! processing_template_decl && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init)) ! pedwarn ("invalid type `%T' for default argument to `%T'", TREE_TYPE (init), TREE_VALUE (arg)); if (!defarg_depfns) TREE_PURPOSE (arg) = init; *************** debug_yychar (yy) *** 1473,1479 **** #endif ! #define NAME(type) cpp_type2name (type) void yyerror (msgid) --- 1465,1471 ---- #endif ! #define NAME(TYPE) cpp_type2name (TYPE) void yyerror (msgid) *************** yyerror (msgid) *** 1486,1492 **** else if (last_token == CPP_CHAR || last_token == CPP_WCHAR) { unsigned int val = TREE_INT_CST_LOW (yylval.ttype); ! const char *ell = (last_token == CPP_CHAR) ? "" : "L"; if (val <= UCHAR_MAX && ISGRAPH (val)) error ("%s before %s'%c'", string, ell, val); else --- 1478,1484 ---- else if (last_token == CPP_CHAR || last_token == CPP_WCHAR) { unsigned int val = TREE_INT_CST_LOW (yylval.ttype); ! const char *const ell = (last_token == CPP_CHAR) ? "" : "L"; if (val <= UCHAR_MAX && ISGRAPH (val)) error ("%s before %s'%c'", string, ell, val); else *************** yyerror (msgid) *** 1495,1503 **** else if (last_token == CPP_STRING || last_token == CPP_WSTRING) error ("%s before string constant", string); ! else if (last_token == CPP_NUMBER ! || last_token == CPP_INT ! || last_token == CPP_FLOAT) error ("%s before numeric constant", string); else if (last_token == CPP_NAME) { --- 1487,1493 ---- else if (last_token == CPP_STRING || last_token == CPP_WSTRING) error ("%s before string constant", string); ! else if (last_token == CPP_NUMBER) error ("%s before numeric constant", string); else if (last_token == CPP_NAME) { diff -Nrc3pad gcc-3.0.4/gcc/cp/tree.c gcc-3.1/gcc/cp/tree.c *** gcc-3.0.4/gcc/cp/tree.c Fri Nov 30 03:12:44 2001 --- gcc-3.1/gcc/cp/tree.c Thu Apr 25 00:14:25 2002 *************** Boston, MA 02111-1307, USA. */ *** 31,36 **** --- 31,37 ---- #include "ggc.h" #include "insn-config.h" #include "integrate.h" + #include "tree-inline.h" static tree bot_manip PARAMS ((tree *, int *, void *)); static tree bot_replace PARAMS ((tree *, int *, void *)); *************** static tree verify_stmt_tree_r PARAMS (( *** 50,55 **** --- 51,60 ---- static tree find_tree_r PARAMS ((tree *, int *, void *)); extern int cp_statement_code_p PARAMS ((enum tree_code)); + static tree handle_java_interface_attribute PARAMS ((tree *, tree, tree, int, bool *)); + static tree handle_com_interface_attribute PARAMS ((tree *, tree, tree, int, bool *)); + static tree handle_init_priority_attribute PARAMS ((tree *, tree, tree, int, bool *)); + /* If REF is an lvalue, returns the kind of lvalue that REF is. Otherwise, returns clk_none. If TREAT_CLASS_RVALUES_AS_LVALUES is non-zero, rvalues of class type are considered lvalues. */ *************** lvalue_p_1 (ref, treat_class_rvalues_as_ *** 80,85 **** --- 85,93 ---- case WITH_CLEANUP_EXPR: case REALPART_EXPR: case IMAGPART_EXPR: + /* This shouldn't be here, but there are lots of places in the compiler + that are sloppy about tacking on NOP_EXPRs to the same type when + no actual conversion is happening. */ case NOP_EXPR: return lvalue_p_1 (TREE_OPERAND (ref, 0), treat_class_rvalues_as_lvalues); *************** lvalue_p_1 (ref, treat_class_rvalues_as_ *** 119,125 **** /* A currently unresolved scope ref. */ case SCOPE_REF: ! my_friendly_abort (103); case OFFSET_REF: if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL) return clk_ordinary; --- 127,133 ---- /* A currently unresolved scope ref. */ case SCOPE_REF: ! abort (); case OFFSET_REF: if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL) return clk_ordinary; *************** break_out_calls (exp) *** 408,417 **** } - /* Here is how primitive or already-canonicalized types' hash - codes are made. MUST BE CONSISTENT WITH tree.c !!! */ - #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777) - /* Construct, lay out and return the type of methods belonging to class BASETYPE and whose arguments are described by ARGTYPES and whose values are described by RETTYPE. If each type exists already, reuse it. */ --- 416,421 ---- *************** build_cplus_array_type_1 (elt_type, inde *** 460,466 **** if (elt_type == error_mark_node || index_type == error_mark_node) return error_mark_node; ! if (processing_template_decl || uses_template_parms (elt_type) || uses_template_parms (index_type)) { --- 464,475 ---- if (elt_type == error_mark_node || index_type == error_mark_node) return error_mark_node; ! /* Don't do the minimal thing just because processing_template_decl is ! set; we want to give string constants the right type immediately, so ! we don't have to fix them up at instantiation time. */ ! if ((processing_template_decl ! && index_type && TYPE_MAX_VALUE (index_type) ! && TREE_CODE (TYPE_MAX_VALUE (index_type)) != INTEGER_CST) || uses_template_parms (elt_type) || uses_template_parms (index_type)) { *************** build_cplus_array_type (elt_type, index_ *** 486,494 **** tree index_type; { tree t; ! int type_quals = CP_TYPE_QUALS (elt_type); ! elt_type = TYPE_MAIN_VARIANT (elt_type); t = build_cplus_array_type_1 (elt_type, index_type); --- 495,504 ---- tree index_type; { tree t; ! int type_quals = cp_type_quals (elt_type); ! if (type_quals != TYPE_UNQUALIFIED) ! elt_type = cp_build_qualified_type (elt_type, TYPE_UNQUALIFIED); t = build_cplus_array_type_1 (elt_type, index_type); *************** build_cplus_array_type (elt_type, index_ *** 500,550 **** /* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles arrays correctly. In particular, if TYPE is an array of T's, and ! TYPE_QUALS is non-empty, returns an array of qualified T's. If ! at attempt is made to qualify a type illegally, and COMPLAIN is ! non-zero, an error is issued. If COMPLAIN is zero, error_mark_node ! is returned. */ tree cp_build_qualified_type_real (type, type_quals, complain) tree type; int type_quals; ! int complain; { tree result; if (type == error_mark_node) return type; ! if (type_quals == CP_TYPE_QUALS (type)) return type; ! /* A restrict-qualified pointer type must be a pointer (or reference) to object or incomplete type. */ if ((type_quals & TYPE_QUAL_RESTRICT) && TREE_CODE (type) != TEMPLATE_TYPE_PARM ! && (!POINTER_TYPE_P (type) ! || TYPE_PTRMEM_P (type) ! || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)) { ! if (complain) ! cp_error ("`%T' cannot be `restrict'-qualified", type); ! else ! return error_mark_node; ! type_quals &= ~TYPE_QUAL_RESTRICT; } ! if (type_quals != TYPE_UNQUALIFIED ! && TREE_CODE (type) == FUNCTION_TYPE) { ! if (complain) ! cp_error ("`%T' cannot be `const'-, `volatile'-, or `restrict'-qualified", type); ! else ! return error_mark_node; ! type_quals = TYPE_UNQUALIFIED; } ! else if (TREE_CODE (type) == ARRAY_TYPE) { /* In C++, the qualification really applies to the array element type. Obtain the appropriately qualified element type. */ --- 510,593 ---- /* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles arrays correctly. In particular, if TYPE is an array of T's, and ! TYPE_QUALS is non-empty, returns an array of qualified T's. ! ! FLAGS determines how to deal with illformed qualifications. If ! tf_ignore_bad_quals is set, then bad qualifications are dropped ! (this is permitted if TYPE was introduced via a typedef or template ! type parameter). If bad qualifications are dropped and tf_warning ! is set, then a warning is issued for non-const qualifications. If ! tf_ignore_bad_quals is not set and tf_error is not set, we ! return error_mark_node. Otherwise, we issue an error, and ignore ! the qualifications. + Qualification of a reference type is valid when the reference came + via a typedef or template type argument. [dcl.ref] No such + dispensation is provided for qualifying a function type. [dcl.fct] + DR 295 queries this and the proposed resolution brings it into line + with qualifiying a reference. We implement the DR. We also behave + in a similar manner for restricting non-pointer types. */ + tree cp_build_qualified_type_real (type, type_quals, complain) tree type; int type_quals; ! tsubst_flags_t complain; { tree result; + int bad_quals = TYPE_UNQUALIFIED; if (type == error_mark_node) return type; ! if (type_quals == cp_type_quals (type)) return type; ! /* A reference, fucntion or method type shall not be cv qualified. ! [dcl.ref], [dct.fct] */ ! if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) ! && (TREE_CODE (type) == REFERENCE_TYPE ! || TREE_CODE (type) == FUNCTION_TYPE ! || TREE_CODE (type) == METHOD_TYPE)) ! { ! bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); ! type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); ! } ! ! /* A restrict-qualified type must be a pointer (or reference) to object or incomplete type. */ if ((type_quals & TYPE_QUAL_RESTRICT) && TREE_CODE (type) != TEMPLATE_TYPE_PARM ! && TREE_CODE (type) != TYPENAME_TYPE ! && !POINTER_TYPE_P (type)) { ! bad_quals |= TYPE_QUAL_RESTRICT; type_quals &= ~TYPE_QUAL_RESTRICT; } ! if (bad_quals == TYPE_UNQUALIFIED) ! /*OK*/; ! else if (!(complain & (tf_error | tf_ignore_bad_quals))) ! return error_mark_node; ! else { ! if (complain & tf_ignore_bad_quals) ! /* We're not going to warn about constifying things that can't ! be constified. */ ! bad_quals &= ~TYPE_QUAL_CONST; ! if (bad_quals) ! { ! tree bad_type = build_qualified_type (ptr_type_node, bad_quals); ! ! if (!(complain & tf_ignore_bad_quals)) ! error ("`%V' qualifiers cannot be applied to `%T'", ! bad_type, type); ! else if (complain & tf_warning) ! warning ("ignoring `%V' qualifiers on `%T'", bad_type, type); ! } } ! ! if (TREE_CODE (type) == ARRAY_TYPE) { /* In C++, the qualification really applies to the array element type. Obtain the appropriately qualified element type. */ *************** cp_build_qualified_type_real (type, type *** 558,566 **** return error_mark_node; /* See if we already have an identically qualified type. */ ! for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) ! if (CP_TYPE_QUALS (t) == type_quals) ! break; /* If we didn't already have it, create it now. */ if (!t) --- 601,607 ---- return error_mark_node; /* See if we already have an identically qualified type. */ ! t = get_qualified_type (type, type_quals); /* If we didn't already have it, create it now. */ if (!t) *************** cp_build_qualified_type_real (type, type *** 588,594 **** { /* For a pointer-to-member type, we can't just return a cv-qualified version of the RECORD_TYPE. If we do, we ! haven't change the field that contains the actual pointer to a method, and so TYPE_PTRMEMFUNC_FN_TYPE will be wrong. */ tree t; --- 629,635 ---- { /* For a pointer-to-member type, we can't just return a cv-qualified version of the RECORD_TYPE. If we do, we ! haven't changed the field that contains the actual pointer to a method, and so TYPE_PTRMEMFUNC_FN_TYPE will be wrong. */ tree t; *************** cp_build_qualified_type_real (type, type *** 596,602 **** t = cp_build_qualified_type_real (t, type_quals, complain); return build_ptrmemfunc_type (t); } ! /* Retrieve (or create) the appropriately qualified variant. */ result = build_qualified_type (type, type_quals); --- 637,643 ---- t = cp_build_qualified_type_real (t, type_quals, complain); return build_ptrmemfunc_type (t); } ! /* Retrieve (or create) the appropriately qualified variant. */ result = build_qualified_type (type, type_quals); *************** tree *** 621,627 **** canonical_type_variant (t) tree t; { ! return cp_build_qualified_type (TYPE_MAIN_VARIANT (t), CP_TYPE_QUALS (t)); } /* Makes new binfos for the indirect bases under BINFO, and updates --- 662,668 ---- canonical_type_variant (t) tree t; { ! return cp_build_qualified_type (TYPE_MAIN_VARIANT (t), cp_type_quals (t)); } /* Makes new binfos for the indirect bases under BINFO, and updates *************** make_binfo (offset, binfo, vtable, virtu *** 824,846 **** return new_binfo; } - /* Return the binfo value for ELEM in TYPE. */ - - tree - binfo_value (elem, type) - tree elem; - tree type; - { - if (get_base_distance (elem, type, 0, (tree *)0) == -2) - compiler_error ("base class `%s' ambiguous in binfo_value", - TYPE_NAME_STRING (elem)); - if (elem == type) - return TYPE_BINFO (type); - if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type) - return type; - return get_binfo (elem, type, 0); - } - /* Return a TREE_LIST whose TREE_VALUE nodes along the BINFO_INHERITANCE_CHAIN for BINFO, but in the opposite order. In other words, while the BINFO_INHERITANCE_CHAIN goes from base --- 865,870 ---- *************** count_functions (t) *** 910,916 **** return i; } ! my_friendly_abort (359); return 0; } --- 934,940 ---- return i; } ! abort (); return 0; } *************** cp_statement_code_p (code) *** 1013,1027 **** switch (code) { case SUBOBJECT: - case CLEANUP_STMT: - case START_CATCH_STMT: case CTOR_STMT: case CTOR_INITIALIZER: case RETURN_INIT: case TRY_BLOCK: case HANDLER: - case USING_STMT: case EH_SPEC_BLOCK: return 1; default: --- 1037,1050 ---- switch (code) { case SUBOBJECT: case CTOR_STMT: case CTOR_INITIALIZER: case RETURN_INIT: case TRY_BLOCK: case HANDLER: case EH_SPEC_BLOCK: + case USING_STMT: + case TAG_DEFN: return 1; default: *************** lang_printable_name (decl, v) *** 1063,1069 **** if (ring_counter == PRINT_RING_SIZE) ring_counter = 0; if (decl_ring[ring_counter] == current_function_decl) ! my_friendly_abort (106); } if (print_ring[ring_counter]) --- 1086,1092 ---- if (ring_counter == PRINT_RING_SIZE) ring_counter = 0; if (decl_ring[ring_counter] == current_function_decl) ! abort (); } if (print_ring[ring_counter]) *************** build_exception_variant (type, raises) *** 1096,1392 **** return v; } ! /* Given a TEMPLATE_TEMPLATE_PARM or BOUND_TEMPLATE_TEMPLATE_PARM ! node T, create a new one together with its ! lang_specific field and its corresponding *_DECL node. ! If NEWARGS is not NULL_TREE, this parameter is bound with new set of arguments. */ tree ! copy_template_template_parm (t, newargs) tree t; tree newargs; { tree decl = TYPE_NAME (t); tree t2; ! if (newargs == NULL_TREE) ! { ! t2 = make_aggr_type (TREE_CODE (t)); ! decl = copy_decl (decl); ! ! /* No need to copy these. */ ! TEMPLATE_TYPE_PARM_INDEX (t2) = TEMPLATE_TYPE_PARM_INDEX (t); ! TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2) ! = TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t); ! } ! else ! { ! t2 = make_aggr_type (BOUND_TEMPLATE_TEMPLATE_PARM); ! decl = build_decl (TYPE_DECL, DECL_NAME (decl), NULL_TREE); ! /* These nodes have to be created to reflect new TYPE_DECL and template ! arguments. */ ! TEMPLATE_TYPE_PARM_INDEX (t2) = copy_node (TEMPLATE_TYPE_PARM_INDEX (t)); ! TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (t2)) = decl; ! TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2) ! = tree_cons (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t), ! newargs, NULL_TREE); ! } TREE_TYPE (decl) = t2; TYPE_NAME (t2) = decl; TYPE_STUB_DECL (t2) = decl; return t2; } - /* Apply FUNC to all the sub-trees of TP in a pre-order traversal. - FUNC is called with the DATA and the address of each sub-tree. If - FUNC returns a non-NULL value, the traversal is aborted, and the - value returned by FUNC is returned. If HTAB is non-NULL it is used - to record the nodes visited, and to avoid visiting a node more than - once. */ - - tree - walk_tree (tp, func, data, htab) - tree *tp; - walk_tree_fn func; - void *data; - htab_t htab; - { - enum tree_code code; - int walk_subtrees; - tree result; - - #define WALK_SUBTREE(NODE) \ - do \ - { \ - result = walk_tree (&(NODE), func, data, htab); \ - if (result) \ - return result; \ - } \ - while (0) - - /* Skip empty subtrees. */ - if (!*tp) - return NULL_TREE; - - if (htab) - { - void **slot; - - /* Don't walk the same tree twice, if the user has requested - that we avoid doing so. */ - if (htab_find (htab, *tp)) - return NULL_TREE; - /* If we haven't already seen this node, add it to the table. */ - slot = htab_find_slot (htab, *tp, INSERT); - *slot = *tp; - } - - /* Call the function. */ - walk_subtrees = 1; - result = (*func) (tp, &walk_subtrees, data); - - /* If we found something, return it. */ - if (result) - return result; - - /* Even if we didn't, FUNC may have decided that there was nothing - interesting below this point in the tree. */ - if (!walk_subtrees) - return NULL_TREE; - - code = TREE_CODE (*tp); - - /* Handle common cases up front. */ - if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)) - || TREE_CODE_CLASS (code) == 'r' - || TREE_CODE_CLASS (code) == 's') - { - int i, len; - - /* Set lineno here so we get the right instantiation context - if we call instantiate_decl from inlinable_function_p. */ - if (statement_code_p (code) && !STMT_LINENO_FOR_FN_P (*tp)) - lineno = STMT_LINENO (*tp); - - /* Walk over all the sub-trees of this operand. */ - len = first_rtl_op (code); - /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same. - But, we only want to walk once. */ - if (code == TARGET_EXPR - && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1)) - --len; - /* Go through the subtrees. We need to do this in forward order so - that the scope of a FOR_EXPR is handled properly. */ - for (i = 0; i < len; ++i) - WALK_SUBTREE (TREE_OPERAND (*tp, i)); - - /* For statements, we also walk the chain so that we cover the - entire statement tree. */ - if (statement_code_p (code)) - { - if (code == DECL_STMT - && DECL_STMT_DECL (*tp) - && DECL_P (DECL_STMT_DECL (*tp))) - { - /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk - into declarations that are just mentioned, rather than - declared; they don't really belong to this part of the tree. - And, we can see cycles: the initializer for a declaration can - refer to the declaration itself. */ - WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp))); - WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp))); - WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp))); - } - - /* This can be tail-recursion optimized if we write it this way. */ - return walk_tree (&TREE_CHAIN (*tp), func, data, htab); - } - - /* We didn't find what we were looking for. */ - return NULL_TREE; - } - else if (TREE_CODE_CLASS (code) == 'd') - { - WALK_SUBTREE (TREE_TYPE (*tp)); - - /* We didn't find what we were looking for. */ - return NULL_TREE; - } - - /* Not one of the easy cases. We must explicitly go through the - children. */ - switch (code) - { - case ERROR_MARK: - case IDENTIFIER_NODE: - case INTEGER_CST: - case REAL_CST: - case STRING_CST: - case DEFAULT_ARG: - case TEMPLATE_TEMPLATE_PARM: - case BOUND_TEMPLATE_TEMPLATE_PARM: - case TEMPLATE_PARM_INDEX: - case TEMPLATE_TYPE_PARM: - case REAL_TYPE: - case COMPLEX_TYPE: - case VECTOR_TYPE: - case VOID_TYPE: - case BOOLEAN_TYPE: - case TYPENAME_TYPE: - case UNION_TYPE: - case ENUMERAL_TYPE: - case TYPEOF_TYPE: - case BLOCK: - /* None of thse have subtrees other than those already walked - above. */ - break; - - case PTRMEM_CST: - WALK_SUBTREE (TREE_TYPE (*tp)); - break; - - case POINTER_TYPE: - case REFERENCE_TYPE: - WALK_SUBTREE (TREE_TYPE (*tp)); - break; - - case TREE_LIST: - /* A BASELINK_P's TREE_PURPOSE is a BINFO, and hence circular. */ - if (!BASELINK_P (*tp)) - WALK_SUBTREE (TREE_PURPOSE (*tp)); - WALK_SUBTREE (TREE_VALUE (*tp)); - WALK_SUBTREE (TREE_CHAIN (*tp)); - break; - - case OVERLOAD: - WALK_SUBTREE (OVL_FUNCTION (*tp)); - WALK_SUBTREE (OVL_CHAIN (*tp)); - break; - - case TREE_VEC: - { - int len = TREE_VEC_LENGTH (*tp); - while (len--) - WALK_SUBTREE (TREE_VEC_ELT (*tp, len)); - } - break; - - case COMPLEX_CST: - WALK_SUBTREE (TREE_REALPART (*tp)); - WALK_SUBTREE (TREE_IMAGPART (*tp)); - break; - - case CONSTRUCTOR: - WALK_SUBTREE (CONSTRUCTOR_ELTS (*tp)); - break; - - case METHOD_TYPE: - WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp)); - /* Fall through. */ - - case FUNCTION_TYPE: - WALK_SUBTREE (TREE_TYPE (*tp)); - { - tree arg = TYPE_ARG_TYPES (*tp); - - /* We never want to walk into default arguments. */ - for (; arg; arg = TREE_CHAIN (arg)) - WALK_SUBTREE (TREE_VALUE (arg)); - } - break; - - case ARRAY_TYPE: - WALK_SUBTREE (TREE_TYPE (*tp)); - WALK_SUBTREE (TYPE_DOMAIN (*tp)); - break; - - case INTEGER_TYPE: - WALK_SUBTREE (TYPE_MIN_VALUE (*tp)); - WALK_SUBTREE (TYPE_MAX_VALUE (*tp)); - break; - - case OFFSET_TYPE: - WALK_SUBTREE (TREE_TYPE (*tp)); - WALK_SUBTREE (TYPE_OFFSET_BASETYPE (*tp)); - break; - - case RECORD_TYPE: - if (TYPE_PTRMEMFUNC_P (*tp)) - WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE (*tp)); - break; - - default: - my_friendly_abort (19990803); - } - - /* We didn't find what we were looking for. */ - return NULL_TREE; - - #undef WALK_SUBTREE - } - - /* Like walk_tree, but does not walk duplicate nodes more than - once. */ - - tree - walk_tree_without_duplicates (tp, func, data) - tree *tp; - walk_tree_fn func; - void *data; - { - tree result; - htab_t htab; - - htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL); - result = walk_tree (tp, func, data, htab); - htab_delete (htab); - return result; - } - /* Called from count_trees via walk_tree. */ static tree --- 1119,1155 ---- return v; } ! /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new ! BOUND_TEMPLATE_TEMPLATE_PARM bound with NEWARGS as its template arguments. */ tree ! bind_template_template_parm (t, newargs) tree t; tree newargs; { tree decl = TYPE_NAME (t); tree t2; ! t2 = make_aggr_type (BOUND_TEMPLATE_TEMPLATE_PARM); ! decl = build_decl (TYPE_DECL, DECL_NAME (decl), NULL_TREE); ! /* These nodes have to be created to reflect new TYPE_DECL and template ! arguments. */ ! TEMPLATE_TYPE_PARM_INDEX (t2) = copy_node (TEMPLATE_TYPE_PARM_INDEX (t)); ! TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (t2)) = decl; ! TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2) ! = tree_cons (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t), ! newargs, NULL_TREE); TREE_TYPE (decl) = t2; TYPE_NAME (t2) = decl; TYPE_STUB_DECL (t2) = decl; + TYPE_SIZE (t2) = 0; return t2; } /* Called from count_trees via walk_tree. */ static tree *************** verify_stmt_tree_r (tp, walk_subtrees, d *** 1429,1435 **** /* If this statement is already present in the hash table, then there is a circularity in the statement tree. */ if (htab_find (*statements, t)) ! my_friendly_abort (20000727); slot = htab_find_slot (*statements, t, INSERT); *slot = t; --- 1192,1198 ---- /* If this statement is already present in the hash table, then there is a circularity in the statement tree. */ if (htab_find (*statements, t)) ! abort (); slot = htab_find_slot (*statements, t, INSERT); *slot = t; *************** no_linkage_check (t) *** 1511,1570 **** return NULL_TREE; } - /* Passed to walk_tree. Copies the node pointed to, if appropriate. */ - - tree - copy_tree_r (tp, walk_subtrees, data) - tree *tp; - int *walk_subtrees; - void *data ATTRIBUTE_UNUSED; - { - enum tree_code code = TREE_CODE (*tp); - - /* We make copies of most nodes. */ - if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)) - || TREE_CODE_CLASS (code) == 'r' - || TREE_CODE_CLASS (code) == 'c' - || TREE_CODE_CLASS (code) == 's' - || code == TREE_LIST - || code == TREE_VEC - || code == OVERLOAD) - { - /* Because the chain gets clobbered when we make a copy, we save it - here. */ - tree chain = TREE_CHAIN (*tp); - - /* Copy the node. */ - *tp = copy_node (*tp); - - /* Now, restore the chain, if appropriate. That will cause - walk_tree to walk into the chain as well. */ - if (code == PARM_DECL || code == TREE_LIST || code == OVERLOAD - || statement_code_p (code)) - TREE_CHAIN (*tp) = chain; - - /* For now, we don't update BLOCKs when we make copies. So, we - have to nullify all scope-statements. */ - if (TREE_CODE (*tp) == SCOPE_STMT) - SCOPE_STMT_BLOCK (*tp) = NULL_TREE; - } - else if (code == TEMPLATE_TEMPLATE_PARM - || code == BOUND_TEMPLATE_TEMPLATE_PARM) - /* These must be copied specially. */ - *tp = copy_template_template_parm (*tp, NULL_TREE); - else if (TREE_CODE_CLASS (code) == 't') - /* There's no need to copy types, or anything beneath them. */ - *walk_subtrees = 0; - - return NULL_TREE; - } - #ifdef GATHER_STATISTICS extern int depth_reached; #endif void ! print_lang_statistics () { print_search_statistics (); print_class_statistics (); --- 1274,1285 ---- return NULL_TREE; } #ifdef GATHER_STATISTICS extern int depth_reached; #endif void ! cxx_print_statistics () { print_search_statistics (); print_class_statistics (); *************** break_out_target_exprs (t) *** 1721,1739 **** tree build_min_nt VPARAMS ((enum tree_code code, ...)) { - #ifndef ANSI_PROTOTYPES - enum tree_code code; - #endif - va_list p; register tree t; register int length; register int i; ! VA_START (p, code); ! ! #ifndef ANSI_PROTOTYPES ! code = va_arg (p, enum tree_code); ! #endif t = make_node (code); length = TREE_CODE_LENGTH (code); --- 1436,1447 ---- tree build_min_nt VPARAMS ((enum tree_code code, ...)) { register tree t; register int length; register int i; ! VA_OPEN (p, code); ! VA_FIXEDARG (p, enum tree_code, code); t = make_node (code); length = TREE_CODE_LENGTH (code); *************** build_min_nt VPARAMS ((enum tree_code co *** 1745,1751 **** TREE_OPERAND (t, i) = x; } ! va_end (p); return t; } --- 1453,1459 ---- TREE_OPERAND (t, i) = x; } ! VA_CLOSE (p); return t; } *************** build_min_nt VPARAMS ((enum tree_code co *** 1755,1775 **** tree build_min VPARAMS ((enum tree_code code, tree tt, ...)) { - #ifndef ANSI_PROTOTYPES - enum tree_code code; - tree tt; - #endif - va_list p; register tree t; register int length; register int i; ! VA_START (p, tt); ! ! #ifndef ANSI_PROTOTYPES ! code = va_arg (p, enum tree_code); ! tt = va_arg (p, tree); ! #endif t = make_node (code); length = TREE_CODE_LENGTH (code); --- 1463,1475 ---- tree build_min VPARAMS ((enum tree_code code, tree tt, ...)) { register tree t; register int length; register int i; ! VA_OPEN (p, tt); ! VA_FIXEDARG (p, enum tree_code, code); ! VA_FIXEDARG (p, tree, tt); t = make_node (code); length = TREE_CODE_LENGTH (code); *************** build_min VPARAMS ((enum tree_code code, *** 1782,1788 **** TREE_OPERAND (t, i) = x; } ! va_end (p); return t; } --- 1482,1488 ---- TREE_OPERAND (t, i) = x; } ! VA_CLOSE (p); return t; } *************** get_type_decl (t) *** 1817,1823 **** if (t == error_mark_node) return t; ! my_friendly_abort (42); /* Stop compiler from complaining control reaches end of non-void function. */ return 0; --- 1517,1523 ---- if (t == error_mark_node) return t; ! abort (); /* Stop compiler from complaining control reaches end of non-void function. */ return 0; *************** cp_tree_equal (t1, t2) *** 1957,1963 **** cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); if (cmp <= 0) return cmp; ! return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2)); case COMPONENT_REF: if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1)) --- 1657,1663 ---- cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); if (cmp <= 0) return cmp; ! return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t1, 1)); case COMPONENT_REF: if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1)) *************** build_dummy_object (type) *** 2123,2129 **** tree type; { tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node); ! return build_indirect_ref (decl, NULL_PTR); } /* We've gotten a reference to a member of TYPE. Return *this if appropriate, --- 1823,1829 ---- tree type; { tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node); ! return build_indirect_ref (decl, NULL); } /* We've gotten a reference to a member of TYPE. Return *this if appropriate, *************** maybe_dummy_object (type, binfop) *** 2136,2153 **** tree *binfop; { tree decl, context; ! if (current_class_type ! && get_base_distance (type, current_class_type, 0, binfop) != -1) context = current_class_type; else { /* Reference from a nested class member function. */ context = type; ! if (binfop) ! *binfop = TYPE_BINFO (type); } if (current_class_ref && context == current_class_type) decl = current_class_ref; else --- 1836,1857 ---- tree *binfop; { tree decl, context; ! tree binfo; ! if (current_class_type ! && (binfo = lookup_base (current_class_type, type, ! ba_ignore | ba_quiet, NULL))) context = current_class_type; else { /* Reference from a nested class member function. */ context = type; ! binfo = TYPE_BINFO (type); } + if (binfop) + *binfop = binfo; + if (current_class_ref && context == current_class_type) decl = current_class_ref; else *************** pod_type_p (t) *** 2194,2303 **** return 1; } ! /* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid C++-specific ! attribute for either declaration DECL or type TYPE and 0 otherwise. ! Plugged into valid_lang_attribute. */ ! int ! cp_valid_lang_attribute (attr_name, attr_args, decl, type) ! tree attr_name; ! tree attr_args ATTRIBUTE_UNUSED; ! tree decl ATTRIBUTE_UNUSED; ! tree type ATTRIBUTE_UNUSED; { ! if (is_attribute_p ("java_interface", attr_name)) { ! if (attr_args != NULL_TREE ! || decl != NULL_TREE ! || ! CLASS_TYPE_P (type) ! || ! TYPE_FOR_JAVA (type)) ! { ! error ("`java_interface' attribute can only be applied to Java class definitions"); ! return 0; ! } ! TYPE_JAVA_INTERFACE (type) = 1; ! return 1; } ! if (is_attribute_p ("com_interface", attr_name)) ! { ! if (! flag_vtable_thunks) ! { ! error ("`com_interface' only supported with -fvtable-thunks"); ! return 0; ! } ! if (attr_args != NULL_TREE ! || decl != NULL_TREE ! || ! CLASS_TYPE_P (type) ! || type != TYPE_MAIN_VARIANT (type)) ! { ! warning ("`com_interface' attribute can only be applied to class definitions"); ! return 0; ! } ! return 1; ! } ! else if (is_attribute_p ("init_priority", attr_name)) { ! tree initp_expr = (attr_args ? TREE_VALUE (attr_args): NULL_TREE); ! int pri; ! if (initp_expr) ! STRIP_NOPS (initp_expr); ! if (!initp_expr || TREE_CODE (initp_expr) != INTEGER_CST) ! { ! error ("requested init_priority is not an integer constant"); ! return 0; ! } ! pri = TREE_INT_CST_LOW (initp_expr); ! type = strip_array_types (type); ! ! if (decl == NULL_TREE ! || TREE_CODE (decl) != VAR_DECL ! || ! TREE_STATIC (decl) ! || DECL_EXTERNAL (decl) ! || (TREE_CODE (type) != RECORD_TYPE ! && TREE_CODE (type) != UNION_TYPE) ! /* Static objects in functions are initialized the ! first time control passes through that ! function. This is not precise enough to pin down an ! init_priority value, so don't allow it. */ ! || current_function_decl) ! { ! error ("can only use init_priority attribute on file-scope definitions of objects of class type"); ! return 0; ! } ! if (pri > MAX_INIT_PRIORITY || pri <= 0) ! { ! error ("requested init_priority is out of range"); ! return 0; ! } ! /* Check for init_priorities that are reserved for ! language and runtime support implementations.*/ ! if (pri <= MAX_RESERVED_INIT_PRIORITY) ! { ! warning ! ("requested init_priority is reserved for internal use"); ! } ! if (SUPPORTS_INIT_PRIORITY) ! { ! DECL_INIT_PRIORITY (decl) = pri; ! return 1; ! } ! else ! { ! error ("init_priority attribute is not supported on this platform"); ! return 0; ! } } ! return 0; } /* Return a new PTRMEM_CST of the indicated TYPE. The MEMBER is the --- 1898,2042 ---- return 1; } ! /* Table of valid C++ attributes. */ ! const struct attribute_spec cp_attribute_table[] = ! { ! /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ ! { "java_interface", 0, 0, false, false, false, handle_java_interface_attribute }, ! { "com_interface", 0, 0, false, false, false, handle_com_interface_attribute }, ! { "init_priority", 1, 1, true, false, false, handle_init_priority_attribute }, ! { NULL, 0, 0, false, false, false, NULL } ! }; ! /* Handle a "java_interface" attribute; arguments as in ! struct attribute_spec.handler. */ ! static tree ! handle_java_interface_attribute (node, name, args, flags, no_add_attrs) ! tree *node; ! tree name; ! tree args ATTRIBUTE_UNUSED; ! int flags; ! bool *no_add_attrs; { ! if (DECL_P (*node) ! || !CLASS_TYPE_P (*node) ! || !TYPE_FOR_JAVA (*node)) { ! error ("`%s' attribute can only be applied to Java class definitions", ! IDENTIFIER_POINTER (name)); ! *no_add_attrs = true; ! return NULL_TREE; } ! if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) ! *node = build_type_copy (*node); ! TYPE_JAVA_INTERFACE (*node) = 1; ! return NULL_TREE; ! } ! /* Handle a "com_interface" attribute; arguments as in ! struct attribute_spec.handler. */ ! static tree ! handle_com_interface_attribute (node, name, args, flags, no_add_attrs) ! tree *node; ! tree name; ! tree args ATTRIBUTE_UNUSED; ! int flags ATTRIBUTE_UNUSED; ! bool *no_add_attrs; ! { ! static int warned; ! ! *no_add_attrs = true; ! ! if (DECL_P (*node) ! || !CLASS_TYPE_P (*node) ! || *node != TYPE_MAIN_VARIANT (*node)) { ! warning ("`%s' attribute can only be applied to class definitions", ! IDENTIFIER_POINTER (name)); ! return NULL_TREE; ! } ! if (!warned++) ! warning ("`%s' is obsolete; g++ vtables are now COM-compatible by default", ! IDENTIFIER_POINTER (name)); ! ! return NULL_TREE; ! } ! ! /* Handle an "init_priority" attribute; arguments as in ! struct attribute_spec.handler. */ ! static tree ! handle_init_priority_attribute (node, name, args, flags, no_add_attrs) ! tree *node; ! tree name; ! tree args; ! int flags ATTRIBUTE_UNUSED; ! bool *no_add_attrs; ! { ! tree initp_expr = TREE_VALUE (args); ! tree decl = *node; ! tree type = TREE_TYPE (decl); ! int pri; ! ! STRIP_NOPS (initp_expr); ! if (!initp_expr || TREE_CODE (initp_expr) != INTEGER_CST) ! { ! error ("requested init_priority is not an integer constant"); ! *no_add_attrs = true; ! return NULL_TREE; ! } ! pri = TREE_INT_CST_LOW (initp_expr); ! type = strip_array_types (type); ! if (decl == NULL_TREE ! || TREE_CODE (decl) != VAR_DECL ! || !TREE_STATIC (decl) ! || DECL_EXTERNAL (decl) ! || (TREE_CODE (type) != RECORD_TYPE ! && TREE_CODE (type) != UNION_TYPE) ! /* Static objects in functions are initialized the ! first time control passes through that ! function. This is not precise enough to pin down an ! init_priority value, so don't allow it. */ ! || current_function_decl) ! { ! error ("can only use `%s' attribute on file-scope definitions of objects of class type", ! IDENTIFIER_POINTER (name)); ! *no_add_attrs = true; ! return NULL_TREE; ! } ! if (pri > MAX_INIT_PRIORITY || pri <= 0) ! { ! error ("requested init_priority is out of range"); ! *no_add_attrs = true; ! return NULL_TREE; ! } ! /* Check for init_priorities that are reserved for ! language and runtime support implementations.*/ ! if (pri <= MAX_RESERVED_INIT_PRIORITY) ! { ! warning ! ("requested init_priority is reserved for internal use"); } ! if (SUPPORTS_INIT_PRIORITY) ! { ! DECL_INIT_PRIORITY (decl) = pri; ! return NULL_TREE; ! } ! else ! { ! error ("`%s' attribute is not supported on this platform", ! IDENTIFIER_POINTER (name)); ! *no_add_attrs = true; ! return NULL_TREE; ! } } /* Return a new PTRMEM_CST of the indicated TYPE. The MEMBER is the *************** make_ptrmem_cst (type, member) *** 2317,2322 **** --- 2056,2300 ---- return ptrmem_cst; } + /* Apply FUNC to all language-specific sub-trees of TP in a pre-order + traversal. Called from walk_tree(). */ + + tree + cp_walk_subtrees (tp, walk_subtrees_p, func, data, htab) + tree *tp; + int *walk_subtrees_p; + walk_tree_fn func; + void *data; + void *htab; + { + enum tree_code code = TREE_CODE (*tp); + tree result; + + #define WALK_SUBTREE(NODE) \ + do \ + { \ + result = walk_tree (&(NODE), func, data, htab); \ + if (result) \ + return result; \ + } \ + while (0) + + /* Not one of the easy cases. We must explicitly go through the + children. */ + switch (code) + { + case DEFAULT_ARG: + case TEMPLATE_TEMPLATE_PARM: + case BOUND_TEMPLATE_TEMPLATE_PARM: + case UNBOUND_CLASS_TEMPLATE: + case TEMPLATE_PARM_INDEX: + case TEMPLATE_TYPE_PARM: + case TYPENAME_TYPE: + case TYPEOF_TYPE: + /* None of thse have subtrees other than those already walked + above. */ + *walk_subtrees_p = 0; + break; + + case PTRMEM_CST: + WALK_SUBTREE (TREE_TYPE (*tp)); + *walk_subtrees_p = 0; + break; + + case TREE_LIST: + /* A BASELINK_P's TREE_PURPOSE is a BINFO, and hence circular. */ + if (!BASELINK_P (*tp)) + WALK_SUBTREE (TREE_PURPOSE (*tp)); + break; + + case OVERLOAD: + WALK_SUBTREE (OVL_FUNCTION (*tp)); + WALK_SUBTREE (OVL_CHAIN (*tp)); + *walk_subtrees_p = 0; + break; + + case RECORD_TYPE: + if (TYPE_PTRMEMFUNC_P (*tp)) + WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE (*tp)); + break; + + default: + break; + } + + /* We didn't find what we were looking for. */ + return NULL_TREE; + + #undef WALK_SUBTREE + } + + /* Decide whether there are language-specific reasons to not inline a + function as a tree. */ + + int + cp_cannot_inline_tree_fn (fnp) + tree *fnp; + { + tree fn = *fnp; + + if (flag_really_no_inline + && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL) + return 1; + + /* We can inline a template instantiation only if it's fully + instantiated. */ + if (DECL_TEMPLATE_INFO (fn) + && TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn))) + { + fn = *fnp = instantiate_decl (fn, /*defer_ok=*/0); + return TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)); + } + + if (varargs_function_p (fn)) + { + DECL_UNINLINABLE (fn) = 1; + return 1; + } + + if (! function_attribute_inlinable_p (fn)) + { + DECL_UNINLINABLE (fn) = 1; + return 1; + } + + return 0; + } + + /* Add any pending functions other than the current function (already + handled by the caller), that thus cannot be inlined, to FNS_P, then + return the latest function added to the array, PREV_FN. */ + + tree + cp_add_pending_fn_decls (fns_p, prev_fn) + void *fns_p; + tree prev_fn; + { + varray_type *fnsp = (varray_type *)fns_p; + struct saved_scope *s; + + for (s = scope_chain; s; s = s->prev) + if (s->function_decl && s->function_decl != prev_fn) + { + VARRAY_PUSH_TREE (*fnsp, s->function_decl); + prev_fn = s->function_decl; + } + + return prev_fn; + } + + /* Determine whether a tree node is an OVERLOAD node. Used to decide + whether to copy a node or to preserve its chain when inlining a + function. */ + + int + cp_is_overload_p (t) + tree t; + { + return TREE_CODE (t) == OVERLOAD; + } + + /* Determine whether VAR is a declaration of an automatic variable in + function FN. */ + + int + cp_auto_var_in_fn_p (var, fn) + tree var, fn; + { + return (DECL_P (var) && DECL_CONTEXT (var) == fn + && nonstatic_local_decl_p (var)); + } + + /* Tell whether a declaration is needed for the RESULT of a function + FN being inlined into CALLER or if the top node of target_exprs is + to be used. */ + + tree + cp_copy_res_decl_for_inlining (result, fn, caller, decl_map_, + need_decl, target_exprs) + tree result, fn, caller; + void *decl_map_; + int *need_decl; + void *target_exprs; + { + splay_tree decl_map = (splay_tree)decl_map_; + varray_type *texps = (varray_type *)target_exprs; + tree var; + int aggregate_return_p; + + /* Figure out whether or not FN returns an aggregate. */ + aggregate_return_p = IS_AGGR_TYPE (TREE_TYPE (result)); + *need_decl = ! aggregate_return_p; + + /* If FN returns an aggregate then the caller will always create the + temporary (using a TARGET_EXPR) and the call will be the + initializing expression for the TARGET_EXPR. If we were just to + create a new VAR_DECL here, then the result of this function + would be copied (bitwise) into the variable initialized by the + TARGET_EXPR. That's incorrect, so we must transform any + references to the RESULT into references to the target. */ + if (aggregate_return_p) + { + if (VARRAY_ACTIVE_SIZE (*texps) == 0) + abort (); + var = TREE_OPERAND (VARRAY_TOP_TREE (*texps), 0); + if (! same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (var), + TREE_TYPE (result))) + abort (); + } + /* Otherwise, make an appropriate copy. */ + else + var = copy_decl_for_inlining (result, fn, caller); + + if (DECL_SAVED_FUNCTION_DATA (fn)) + { + tree nrv = DECL_SAVED_FUNCTION_DATA (fn)->x_return_value; + if (nrv) + { + /* We have a named return value; copy the name and source + position so we can get reasonable debugging information, and + register the return variable as its equivalent. */ + DECL_NAME (var) = DECL_NAME (nrv); + DECL_SOURCE_FILE (var) = DECL_SOURCE_FILE (nrv); + DECL_SOURCE_LINE (var) = DECL_SOURCE_LINE (nrv); + DECL_ABSTRACT_ORIGIN (var) = DECL_ORIGIN (nrv); + splay_tree_insert (decl_map, + (splay_tree_key) nrv, + (splay_tree_value) var); + } + } + + return var; + } + + /* Record that we're about to start inlining FN, and return non-zero if + that's OK. Used for lang_hooks.tree_inlining.start_inlining. */ + + int + cp_start_inlining (fn) + tree fn; + { + if (DECL_TEMPLATE_INSTANTIATION (fn)) + return push_tinst_level (fn); + else + return 1; + } + + /* Record that we're done inlining FN. Used for + lang_hooks.tree_inlining.end_inlining. */ + + void + cp_end_inlining (fn) + tree fn ATTRIBUTE_UNUSED; + { + if (DECL_TEMPLATE_INSTANTIATION (fn)) + pop_tinst_level (); + } + /* Initialize tree.c. */ void *************** init_tree () *** 2332,2378 **** mark_tree_hashtable); } - /* The SAVE_EXPR pointed to by TP is being copied. If ST contains - information indicating to what new SAVE_EXPR this one should be - mapped, use that one. Otherwise, create a new node and enter it in - ST. FN is the function into which the copy will be placed. */ - - void - remap_save_expr (tp, st, fn, walk_subtrees) - tree *tp; - splay_tree st; - tree fn; - int *walk_subtrees; - { - splay_tree_node n; - - /* See if we already encountered this SAVE_EXPR. */ - n = splay_tree_lookup (st, (splay_tree_key) *tp); - - /* If we didn't already remap this SAVE_EXPR, do so now. */ - if (!n) - { - tree t = copy_node (*tp); - - /* The SAVE_EXPR is now part of the function into which we - are inlining this body. */ - SAVE_EXPR_CONTEXT (t) = fn; - /* And we haven't evaluated it yet. */ - SAVE_EXPR_RTL (t) = NULL_RTX; - /* Remember this SAVE_EXPR. */ - n = splay_tree_insert (st, - (splay_tree_key) *tp, - (splay_tree_value) t); - } - else - /* We've already walked into this SAVE_EXPR, so we needn't do it - again. */ - *walk_subtrees = 0; - - /* Replace this SAVE_EXPR with the copy. */ - *tp = (tree) n->value; - } - /* Called via walk_tree. If *TP points to a DECL_STMT for a local declaration, copies the declaration and enters it in the splay_tree pointed to by DATA (which is really a `splay_tree *'). */ --- 2310,2315 ---- diff -Nrc3pad gcc-3.0.4/gcc/cp/typeck.c gcc-3.1/gcc/cp/typeck.c *** gcc-3.0.4/gcc/cp/typeck.c Tue Nov 20 04:39:23 2001 --- gcc-3.1/gcc/cp/typeck.c Thu Apr 25 00:14:24 2002 *************** *** 1,6 **** /* Build expressions with type checking for C++ compiler. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Build expressions with type checking for C++ compiler. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, ! 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GNU CC. *************** Boston, MA 02111-1307, USA. */ *** 40,49 **** #include "flags.h" #include "output.h" #include "toplev.h" static tree convert_for_assignment PARAMS ((tree, tree, const char *, tree, int)); ! static tree pointer_int_sum PARAMS ((enum tree_code, tree, tree)); static tree rationalize_conditional_expr PARAMS ((enum tree_code, tree)); static int comp_target_parms PARAMS ((tree, tree)); static int comp_ptr_ttypes_real PARAMS ((tree, tree, int)); --- 40,51 ---- #include "flags.h" #include "output.h" #include "toplev.h" + #include "diagnostic.h" + #include "target.h" static tree convert_for_assignment PARAMS ((tree, tree, const char *, tree, int)); ! static tree cp_pointer_int_sum PARAMS ((enum tree_code, tree, tree)); static tree rationalize_conditional_expr PARAMS ((enum tree_code, tree)); static int comp_target_parms PARAMS ((tree, tree)); static int comp_ptr_ttypes_real PARAMS ((tree, tree, int)); *************** require_complete_type (value) *** 112,123 **** && current_class_ref != 0 && TREE_OPERAND (value, 0) == current_class_ref) { ! tree base, member = TREE_OPERAND (value, 1); ! tree basetype = TYPE_OFFSET_BASETYPE (type); ! my_friendly_assert (TREE_CODE (member) == FIELD_DECL, 305); ! base = convert_pointer_to (basetype, current_class_ptr); ! value = build (COMPONENT_REF, TREE_TYPE (member), ! build_indirect_ref (base, NULL_PTR), member); return require_complete_type (value); } --- 114,120 ---- && current_class_ref != 0 && TREE_OPERAND (value, 0) == current_class_ref) { ! value = resolve_offset_ref (value); return require_complete_type (value); } *************** qualify_type_recursive (t1, t2) *** 209,216 **** tree tt2 = TREE_TYPE (t2); tree b1; int type_quals; ! tree target; ! tree attributes = merge_machine_type_attributes (t1, t2); if (TREE_CODE (tt1) == OFFSET_TYPE) { --- 206,213 ---- tree tt2 = TREE_TYPE (t2); tree b1; int type_quals; ! tree tgt; ! tree attributes = (*targetm.merge_type_attributes) (t1, t2); if (TREE_CODE (tt1) == OFFSET_TYPE) { *************** qualify_type_recursive (t1, t2) *** 221,232 **** else b1 = NULL_TREE; ! type_quals = (CP_TYPE_QUALS (tt1) | CP_TYPE_QUALS (tt2)); ! target = qualify_type_recursive (tt1, tt2); ! target = cp_build_qualified_type (target, type_quals); if (b1) ! target = build_offset_type (b1, target); ! t1 = build_pointer_type (target); t1 = build_type_attribute_variant (t1, attributes); } return t1; --- 218,229 ---- else b1 = NULL_TREE; ! type_quals = (cp_type_quals (tt1) | cp_type_quals (tt2)); ! tgt = qualify_type_recursive (tt1, tt2); ! tgt = cp_build_qualified_type (tgt, type_quals); if (b1) ! tgt = build_offset_type (b1, tgt); ! t1 = build_pointer_type (tgt); t1 = build_type_attribute_variant (t1, attributes); } return t1; *************** commonparms (p1, p2) *** 288,294 **** if (TREE_VALUE (p1) != TREE_VALUE (p2)) { any_change = 1; ! TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2)); } else TREE_VALUE (n) = TREE_VALUE (p1); --- 285,291 ---- if (TREE_VALUE (p1) != TREE_VALUE (p2)) { any_change = 1; ! TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2)); } else TREE_VALUE (n) = TREE_VALUE (p1); *************** original_type (t) *** 319,325 **** } /* T1 and T2 are arithmetic or enumeration types. Return the type ! that will result from the "usual arithmetic converions" on T1 and T2 as described in [expr]. */ tree --- 316,322 ---- } /* T1 and T2 are arithmetic or enumeration types. Return the type ! that will result from the "usual arithmetic conversions" on T1 and T2 as described in [expr]. */ tree *************** type_after_usual_arithmetic_conversions *** 333,347 **** /* FIXME: Attributes. */ my_friendly_assert (ARITHMETIC_TYPE_P (t1) || TREE_CODE (t1) == ENUMERAL_TYPE, 19990725); my_friendly_assert (ARITHMETIC_TYPE_P (t2) || TREE_CODE (t2) == ENUMERAL_TYPE, 19990725); ! /* In what follows, we slightly generalize the rules given in [expr] ! so as to deal with `long long'. First, merge the attributes. */ ! attributes = merge_machine_type_attributes (t1, t2); /* If only one is real, use it as the result. */ if (code1 == REAL_TYPE && code2 != REAL_TYPE) --- 330,366 ---- /* FIXME: Attributes. */ my_friendly_assert (ARITHMETIC_TYPE_P (t1) + || TREE_CODE (t1) == COMPLEX_TYPE || TREE_CODE (t1) == ENUMERAL_TYPE, 19990725); my_friendly_assert (ARITHMETIC_TYPE_P (t2) + || TREE_CODE (t2) == COMPLEX_TYPE || TREE_CODE (t2) == ENUMERAL_TYPE, 19990725); ! /* In what follows, we slightly generalize the rules given in [expr] so ! as to deal with `long long' and `complex'. First, merge the ! attributes. */ ! attributes = (*targetm.merge_type_attributes) (t1, t2); ! ! /* If one type is complex, form the common type of the non-complex ! components, then make that complex. Use T1 or T2 if it is the ! required type. */ ! if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE) ! { ! tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1; ! tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2; ! tree subtype ! = type_after_usual_arithmetic_conversions (subtype1, subtype2); ! ! if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype) ! return build_type_attribute_variant (t1, attributes); ! else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype) ! return build_type_attribute_variant (t2, attributes); ! else ! return build_type_attribute_variant (build_complex_type (subtype), ! attributes); ! } /* If only one is real, use it as the result. */ if (code1 == REAL_TYPE && code2 != REAL_TYPE) *************** type_after_usual_arithmetic_conversions *** 362,367 **** --- 381,390 ---- else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1)) return build_type_attribute_variant (t2, attributes); + /* The types are the same; no need to do anything fancy. */ + if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) + return build_type_attribute_variant (t1, attributes); + if (code1 != REAL_TYPE) { /* If one is a sizetype, use it so size_binop doesn't blow up. */ *************** type_after_usual_arithmetic_conversions *** 423,431 **** || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node)) return build_type_attribute_variant (double_type_node, attributes); ! else return build_type_attribute_variant (float_type_node, attributes); } } --- 446,462 ---- || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node)) return build_type_attribute_variant (double_type_node, attributes); ! if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node) ! || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node)) return build_type_attribute_variant (float_type_node, attributes); + + /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of + the standard C++ floating-point types. Logic earlier in this + function has already eliminated the possibility that + TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no + compelling reason to choose one or the other. */ + return build_type_attribute_variant (t1, attributes); } } *************** composite_pointer_type (t1, t2, arg1, ar *** 442,447 **** --- 473,479 ---- const char* location; { tree result_type; + tree attributes; /* [expr.rel] *************** composite_pointer_type (t1, t2, arg1, ar *** 459,464 **** --- 491,499 ---- if (TYPE_PTRMEMFUNC_P (t2)) t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2); + /* Merge the attributes. */ + attributes = (*targetm.merge_type_attributes) (t1, t2); + /* We have: [expr.rel] *************** composite_pointer_type (t1, t2, arg1, ar *** 484,491 **** t1 = TREE_TYPE (t1); t2 = TREE_TYPE (t2); result_type = cp_build_qualified_type (void_type_node, ! (CP_TYPE_QUALS (t1) ! | CP_TYPE_QUALS (t2))); result_type = build_pointer_type (result_type); } else --- 519,526 ---- t1 = TREE_TYPE (t1); t2 = TREE_TYPE (t2); result_type = cp_build_qualified_type (void_type_node, ! (cp_type_quals (t1) ! | cp_type_quals (t2))); result_type = build_pointer_type (result_type); } else *************** composite_pointer_type (t1, t2, arg1, ar *** 501,527 **** result_type = full2; else { ! cp_pedwarn ("%s between distinct pointer types `%T' and `%T' lacks a cast", location, t1, t2); result_type = ptr_type_node; } } ! return result_type; } ! /* Return the common type of two types. We assume that comptypes has already been done and returned 1; if that isn't so, this may crash. ! This is the type for the result of most arithmetic operations ! if the operands have the given two types. ! ! We do not deal with enumeral types here because they have already been ! converted to integer types. */ tree ! common_type (t1, t2) tree t1, t2; { register enum tree_code code1; --- 536,559 ---- result_type = full2; else { ! pedwarn ("%s between distinct pointer types `%T' and `%T' lacks a cast", location, t1, t2); result_type = ptr_type_node; } } ! return build_type_attribute_variant (result_type, attributes); } ! /* Return the merged type of two types. We assume that comptypes has already been done and returned 1; if that isn't so, this may crash. ! This just combines attributes and default arguments; any other ! differences would cause the two types to compare unalike. */ tree ! merge_types (t1, t2) tree t1, t2; { register enum tree_code code1; *************** common_type (t1, t2) *** 531,539 **** /* Save time if the two types are the same. */ if (t1 == t2) return t1; ! t1 = original_type (t1); ! t2 = original_type (t2); ! if (t1 == t2) return t1; /* If one type is nonsense, use the other. */ --- 563,569 ---- /* Save time if the two types are the same. */ if (t1 == t2) return t1; ! if (original_type (t1) == original_type (t2)) return t1; /* If one type is nonsense, use the other. */ *************** common_type (t1, t2) *** 542,561 **** if (t2 == error_mark_node) return t1; - if ((ARITHMETIC_TYPE_P (t1) || TREE_CODE (t1) == ENUMERAL_TYPE) - && (ARITHMETIC_TYPE_P (t2) || TREE_CODE (t2) == ENUMERAL_TYPE)) - return type_after_usual_arithmetic_conversions (t1, t2); - /* Merge the attributes. */ ! attributes = merge_machine_type_attributes (t1, t2); /* Treat an enum type as the unsigned integer type of the same width. */ - if (TREE_CODE (t1) == ENUMERAL_TYPE) - t1 = type_for_size (TYPE_PRECISION (t1), 1); - if (TREE_CODE (t2) == ENUMERAL_TYPE) - t2 = type_for_size (TYPE_PRECISION (t2), 1); - if (TYPE_PTRMEMFUNC_P (t1)) t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1); if (TYPE_PTRMEMFUNC_P (t2)) --- 572,582 ---- if (t2 == error_mark_node) return t1; /* Merge the attributes. */ ! attributes = (*targetm.merge_type_attributes) (t1, t2); /* Treat an enum type as the unsigned integer type of the same width. */ if (TYPE_PTRMEMFUNC_P (t1)) t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1); if (TYPE_PTRMEMFUNC_P (t2)) *************** common_type (t1, t2) *** 564,651 **** code1 = TREE_CODE (t1); code2 = TREE_CODE (t2); - /* If one type is complex, form the common type of the non-complex - components, then make that complex. Use T1 or T2 if it is the - required type. */ - if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE) - { - tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1; - tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2; - tree subtype = common_type (subtype1, subtype2); - - if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype) - return build_type_attribute_variant (t1, attributes); - else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype) - return build_type_attribute_variant (t2, attributes); - else - return build_type_attribute_variant (build_complex_type (subtype), - attributes); - } - switch (code1) { - case INTEGER_TYPE: - case REAL_TYPE: - /* We should have called type_after_usual_arithmetic_conversions - above. */ - my_friendly_abort (19990725); - break; - case POINTER_TYPE: case REFERENCE_TYPE: ! /* For two pointers, do this recursively on the target type, ! and combine the qualifiers of the two types' targets. */ ! /* This code was turned off; I don't know why. ! But ISO C++ specifies doing this with the qualifiers. ! So I turned it on again. */ { ! tree tt1 = TREE_TYPE (t1); ! tree tt2 = TREE_TYPE (t2); ! tree b1, b2; ! int type_quals; ! tree target; ! ! if (TREE_CODE (tt1) == OFFSET_TYPE) ! { ! b1 = TYPE_OFFSET_BASETYPE (tt1); ! b2 = TYPE_OFFSET_BASETYPE (tt2); ! tt1 = TREE_TYPE (tt1); ! tt2 = TREE_TYPE (tt2); ! } ! else ! b1 = b2 = NULL_TREE; ! ! type_quals = (CP_TYPE_QUALS (tt1) | CP_TYPE_QUALS (tt2)); ! tt1 = TYPE_MAIN_VARIANT (tt1); ! tt2 = TYPE_MAIN_VARIANT (tt2); ! ! if (tt1 == tt2) ! target = tt1; ! else if (VOID_TYPE_P (tt1) || VOID_TYPE_P (tt2)) ! target = void_type_node; ! else if (tt1 == unknown_type_node) ! target = tt2; ! else if (tt2 == unknown_type_node) ! target = tt1; ! else ! target = common_type (tt1, tt2); ! ! target = cp_build_qualified_type (target, type_quals); ! ! if (b1) ! { ! if (same_type_p (b1, b2) ! || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2))) ! target = build_offset_type (b2, target); ! else if (binfo_or_else (b2, b1)) ! target = build_offset_type (b1, target); ! } if (code1 == POINTER_TYPE) t1 = build_pointer_type (target); else t1 = build_reference_type (target); t1 = build_type_attribute_variant (t1, attributes); if (TREE_CODE (target) == METHOD_TYPE) t1 = build_ptrmemfunc_type (t1); --- 585,605 ---- code1 = TREE_CODE (t1); code2 = TREE_CODE (t2); switch (code1) { case POINTER_TYPE: case REFERENCE_TYPE: ! /* For two pointers, do this recursively on the target type. */ { ! tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2)); ! int quals = cp_type_quals (t1); if (code1 == POINTER_TYPE) t1 = build_pointer_type (target); else t1 = build_reference_type (target); t1 = build_type_attribute_variant (t1, attributes); + t1 = cp_build_qualified_type (t1, quals); if (TREE_CODE (target) == METHOD_TYPE) t1 = build_ptrmemfunc_type (t1); *************** common_type (t1, t2) *** 653,661 **** return t1; } case ARRAY_TYPE: { ! tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2)); /* Save space: see if the result is identical to one of the args. */ if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1)) return build_type_attribute_variant (t1, attributes); --- 607,623 ---- return t1; } + case OFFSET_TYPE: + { + tree base = TYPE_OFFSET_BASETYPE (t1); + tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2)); + t1 = build_offset_type (base, target); + break; + } + case ARRAY_TYPE: { ! tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2)); /* Save space: see if the result is identical to one of the args. */ if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1)) return build_type_attribute_variant (t1, attributes); *************** common_type (t1, t2) *** 664,677 **** /* Merge the element types, and have a size if either arg has one. */ t1 = build_cplus_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2)); ! return build_type_attribute_variant (t1, attributes); } case FUNCTION_TYPE: /* Function types: prefer the one that specified arg types. If both do, merge the arg types. Also merge the return types. */ { ! tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2)); tree p1 = TYPE_ARG_TYPES (t1); tree p2 = TYPE_ARG_TYPES (t2); tree rval, raises; --- 626,639 ---- /* Merge the element types, and have a size if either arg has one. */ t1 = build_cplus_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2)); ! break; } case FUNCTION_TYPE: /* Function types: prefer the one that specified arg types. If both do, merge the arg types. Also merge the return types. */ { ! tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2)); tree p1 = TYPE_ARG_TYPES (t1); tree p2 = TYPE_ARG_TYPES (t2); tree rval, raises; *************** common_type (t1, t2) *** 700,772 **** } rval = build_function_type (valtype, commonparms (p1, p2)); ! rval = build_exception_variant (rval, raises); ! return build_type_attribute_variant (rval, attributes); } ! case RECORD_TYPE: ! case UNION_TYPE: ! t1 = TYPE_MAIN_VARIANT (t1); ! t2 = TYPE_MAIN_VARIANT (t2); ! if (DERIVED_FROM_P (t1, t2) && binfo_or_else (t1, t2)) ! return build_type_attribute_variant (t1, attributes); ! else if (binfo_or_else (t2, t1)) ! return build_type_attribute_variant (t2, attributes); ! else ! { ! compiler_error ("common_type called with uncommon aggregate types"); ! return error_mark_node; ! } ! case METHOD_TYPE: ! if (TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2))) ! { ! /* Get this value the long way, since TYPE_METHOD_BASETYPE ! is just the main variant of this. */ ! tree basetype; ! tree raises, t3; ! tree b1 = TYPE_OFFSET_BASETYPE (t1); ! tree b2 = TYPE_OFFSET_BASETYPE (t2); ! if (same_type_p (b1, b2) ! || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2))) ! basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2))); ! else ! { ! if (binfo_or_else (b2, b1) == NULL_TREE) ! compiler_error ("common_type called with uncommon method types"); ! basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t1))); ! } ! raises = TYPE_RAISES_EXCEPTIONS (t1); ! /* If this was a member function type, get back to the ! original type of type member function (i.e., without ! the class instance variable up front. */ ! t1 = build_function_type (TREE_TYPE (t1), ! TREE_CHAIN (TYPE_ARG_TYPES (t1))); ! t2 = build_function_type (TREE_TYPE (t2), ! TREE_CHAIN (TYPE_ARG_TYPES (t2))); ! t3 = common_type (t1, t2); ! t3 = build_cplus_method_type (basetype, TREE_TYPE (t3), ! TYPE_ARG_TYPES (t3)); ! t1 = build_exception_variant (t3, raises); ! } ! else ! compiler_error ("common_type called with uncommon method types"); ! return build_type_attribute_variant (t1, attributes); ! case OFFSET_TYPE: ! /* Pointers to members should now be handled by the POINTER_TYPE ! case above. */ ! my_friendly_abort (990325); ! default: ! return build_type_attribute_variant (t1, attributes); ! } } /* Compare two exception specifier types for exactness or subsetness, if --- 662,733 ---- } rval = build_function_type (valtype, commonparms (p1, p2)); ! t1 = build_exception_variant (rval, raises); ! break; } ! case METHOD_TYPE: ! { ! /* Get this value the long way, since TYPE_METHOD_BASETYPE ! is just the main variant of this. */ ! tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2))); ! tree raises = TYPE_RAISES_EXCEPTIONS (t1); ! tree t3; ! /* If this was a member function type, get back to the ! original type of type member function (i.e., without ! the class instance variable up front. */ ! t1 = build_function_type (TREE_TYPE (t1), ! TREE_CHAIN (TYPE_ARG_TYPES (t1))); ! t2 = build_function_type (TREE_TYPE (t2), ! TREE_CHAIN (TYPE_ARG_TYPES (t2))); ! t3 = merge_types (t1, t2); ! t3 = build_cplus_method_type (basetype, TREE_TYPE (t3), ! TYPE_ARG_TYPES (t3)); ! t1 = build_exception_variant (t3, raises); ! break; ! } ! default:; ! } ! return build_type_attribute_variant (t1, attributes); ! } ! /* Return the common type of two types. ! We assume that comptypes has already been done and returned 1; ! if that isn't so, this may crash. ! This is the type for the result of most arithmetic operations ! if the operands have the given two types. */ ! tree ! common_type (t1, t2) ! tree t1, t2; ! { ! enum tree_code code1; ! enum tree_code code2; ! /* If one type is nonsense, bail. */ ! if (t1 == error_mark_node || t2 == error_mark_node) ! return error_mark_node; ! code1 = TREE_CODE (t1); ! code2 = TREE_CODE (t2); ! if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE ! || code1 == COMPLEX_TYPE) ! && (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE ! || code2 == COMPLEX_TYPE)) ! return type_after_usual_arithmetic_conversions (t1, t2); ! else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2)) ! || (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2)) ! || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2))) ! return composite_pointer_type (t1, t2, error_mark_node, error_mark_node, ! "conversion"); ! ! else ! abort (); } /* Compare two exception specifier types for exactness or subsetness, if *************** comp_except_types (a, b, exact) *** 793,799 **** return 1; else if (!exact) { ! if (CP_TYPE_QUALS (a) || CP_TYPE_QUALS (b)) return 0; if (TREE_CODE (a) == POINTER_TYPE --- 754,760 ---- return 1; else if (!exact) { ! if (cp_type_quals (a) || cp_type_quals (b)) return 0; if (TREE_CODE (a) == POINTER_TYPE *************** comp_except_types (a, b, exact) *** 801,807 **** { a = TREE_TYPE (a); b = TREE_TYPE (b); ! if (CP_TYPE_QUALS (a) || CP_TYPE_QUALS (b)) return 0; } --- 762,768 ---- { a = TREE_TYPE (a); b = TREE_TYPE (b); ! if (cp_type_quals (a) || cp_type_quals (b)) return 0; } *************** comptypes (t1, t2, strict) *** 981,987 **** return 0; /* Qualifiers must match. */ ! if (CP_TYPE_QUALS (t1) != CP_TYPE_QUALS (t2)) return 0; if (strict == COMPARE_STRICT && TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2)) --- 942,948 ---- return 0; /* Qualifiers must match. */ ! if (cp_type_quals (t1) != cp_type_quals (t2)) return 0; if (strict == COMPARE_STRICT && TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2)) *************** comptypes (t1, t2, strict) *** 994,1009 **** if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) return 1; - /* ??? COMP_TYPE_ATTRIBUTES is currently useless for variables as each - attribute is its own main variant (`val' will remain 0). */ - #ifndef COMP_TYPE_ATTRIBUTES - #define COMP_TYPE_ATTRIBUTES(t1,t2) 1 - #endif - if (strict & COMPARE_NO_ATTRIBUTES) attrval = 1; /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ! else if (! (attrval = COMP_TYPE_ATTRIBUTES (t1, t2))) return 0; /* 1 if no need for warning yet, 2 if warning cause has been seen. */ --- 955,964 ---- if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) return 1; if (strict & COMPARE_NO_ATTRIBUTES) attrval = 1; /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ! else if (! (attrval = (*targetm.comp_type_attributes) (t1, t2))) return 0; /* 1 if no need for warning yet, 2 if warning cause has been seen. */ *************** comptypes (t1, t2, strict) *** 1046,1065 **** && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)); break; - case METHOD_TYPE: - if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1), - TYPE_RAISES_EXCEPTIONS (t2), 1)) - return 0; - - /* This case is anti-symmetrical! - One can pass a base member (or member function) - to something expecting a derived member (or member function), - but not vice-versa! */ - - val = (comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict) - && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); - break; - case POINTER_TYPE: case REFERENCE_TYPE: t1 = TREE_TYPE (t1); --- 1001,1006 ---- *************** comptypes (t1, t2, strict) *** 1074,1084 **** goto look_hard; break; case FUNCTION_TYPE: - if (! comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1), - TYPE_RAISES_EXCEPTIONS (t2), 1)) - return 0; - val = ((TREE_TYPE (t1) == TREE_TYPE (t2) || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)) && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); --- 1015,1022 ---- goto look_hard; break; + case METHOD_TYPE: case FUNCTION_TYPE: val = ((TREE_TYPE (t1) == TREE_TYPE (t2) || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)) && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); *************** comptypes (t1, t2, strict) *** 1101,1106 **** --- 1039,1050 ---- return 0; return same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)); + case UNBOUND_CLASS_TEMPLATE: + if (cp_tree_equal (TYPE_IDENTIFIER (t1), + TYPE_IDENTIFIER (t2)) < 1) + return 0; + return same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)); + case COMPLEX_TYPE: return same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)); *************** at_least_as_qualified_p (type1, type2) *** 1325,1332 **** tree type2; { /* All qualifiers for TYPE2 must also appear in TYPE1. */ ! return ((CP_TYPE_QUALS (type1) & CP_TYPE_QUALS (type2)) ! == CP_TYPE_QUALS (type2)); } /* Returns 1 if TYPE1 is more qualified than TYPE2. */ --- 1269,1276 ---- tree type2; { /* All qualifiers for TYPE2 must also appear in TYPE1. */ ! return ((cp_type_quals (type1) & cp_type_quals (type2)) ! == cp_type_quals (type2)); } /* Returns 1 if TYPE1 is more qualified than TYPE2. */ *************** more_qualified_p (type1, type2) *** 1336,1342 **** tree type1; tree type2; { ! return (CP_TYPE_QUALS (type1) != CP_TYPE_QUALS (type2) && at_least_as_qualified_p (type1, type2)); } --- 1280,1286 ---- tree type1; tree type2; { ! return (cp_type_quals (type1) != cp_type_quals (type2) && at_least_as_qualified_p (type1, type2)); } *************** comp_cv_qualification (type1, type2) *** 1348,1354 **** tree type1; tree type2; { ! if (CP_TYPE_QUALS (type1) == CP_TYPE_QUALS (type2)) return 0; if (at_least_as_qualified_p (type1, type2)) --- 1292,1298 ---- tree type1; tree type2; { ! if (cp_type_quals (type1) == cp_type_quals (type2)) return 0; if (at_least_as_qualified_p (type1, type2)) *************** comp_target_parms (parms1, parms2) *** 1485,1491 **** if (t1 == 0 && t2 != 0) { ! cp_pedwarn ("ISO C++ prohibits conversion from `%#T' to `(...)'", parms2); return self_promoting_args_p (t2); } --- 1429,1435 ---- if (t1 == 0 && t2 != 0) { ! pedwarn ("ISO C++ prohibits conversion from `%#T' to `(...)'", parms2); return self_promoting_args_p (t2); } *************** c_sizeof (type) *** 1581,1592 **** if (code == OFFSET_TYPE) { ! cp_error ("`sizeof' applied to non-static member"); size = size_zero_node; } else if (!COMPLETE_TYPE_P (complete_type (type))) { ! cp_error ("`sizeof' applied to incomplete type `%T'", type); size = size_zero_node; } else --- 1525,1536 ---- if (code == OFFSET_TYPE) { ! error ("`sizeof' applied to non-static member"); size = size_zero_node; } else if (!COMPLETE_TYPE_P (complete_type (type))) { ! error ("`sizeof' applied to incomplete type `%T'", type); size = size_zero_node; } else *************** c_sizeof_nowarn (type) *** 1674,1708 **** 20001021); return size; } - - /* Implement the __alignof keyword: Return the minimum required - alignment of TYPE, measured in bytes. */ - - tree - c_alignof (type) - tree type; - { - enum tree_code code = TREE_CODE (type); - tree t; - - if (processing_template_decl) - return build_min_nt (ALIGNOF_EXPR, type); - - if (code == FUNCTION_TYPE || code == METHOD_TYPE) - t = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT); - else if (code == VOID_TYPE || code == ERROR_MARK) - t = size_one_node; - else - { - /* Similar to sizeof, __alignof applies to the referant. */ - if (code == REFERENCE_TYPE) - type = TREE_TYPE (type); - - t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT); - } - - return fold (build1 (NOP_EXPR, c_size_type_node, t)); - } /* Perform the array-to-pointer and function-to-pointer conversions for EXP. --- 1618,1623 ---- *************** decay_conversion (exp) *** 1761,1767 **** return error_mark_node; } if (code == METHOD_TYPE) ! my_friendly_abort (990506); if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) return build_unary_op (ADDR_EXPR, exp, 0); if (code == ARRAY_TYPE) --- 1676,1682 ---- return error_mark_node; } if (code == METHOD_TYPE) ! abort (); if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) return build_unary_op (ADDR_EXPR, exp, 0); if (code == ARRAY_TYPE) *************** string_conv_p (totype, exp, warn) *** 1901,1907 **** /* This warning is not very useful, as it complains about printf. */ if (warn && warn_write_strings) ! cp_warning ("deprecated conversion from string constant to `%T'", totype); return 1; } --- 1816,1822 ---- /* This warning is not very useful, as it complains about printf. */ if (warn && warn_write_strings) ! warning ("deprecated conversion from string constant to `%T'", totype); return 1; } *************** build_object_ref (datum, basetype, field *** 1919,1925 **** dtype = TREE_TYPE (dtype); if (! IS_AGGR_TYPE_CODE (TREE_CODE (dtype))) { ! cp_error ("request for member `%T::%D' in expression of non-aggregate type `%T'", basetype, field, dtype); return error_mark_node; } --- 1834,1840 ---- dtype = TREE_TYPE (dtype); if (! IS_AGGR_TYPE_CODE (TREE_CODE (dtype))) { ! error ("request for member `%T::%D' in expression of non-aggregate type `%T'", basetype, field, dtype); return error_mark_node; } *************** build_component_ref (datum, component, b *** 2031,2036 **** --- 1946,1953 ---- register tree ref; tree field_type; int type_quals; + tree old_datum; + tree old_basetype; if (processing_template_decl) return build_min_nt (COMPONENT_REF, datum, component); *************** build_component_ref (datum, component, b *** 2062,2068 **** basetype_path, protect)); case TEMPLATE_DECL: ! cp_error ("invalid use of %D", datum); datum = error_mark_node; break; --- 1979,1985 ---- basetype_path, protect)); case TEMPLATE_DECL: ! error ("invalid use of `%D'", datum); datum = error_mark_node; break; *************** build_component_ref (datum, component, b *** 2089,2095 **** if (TREE_CODE (component) == TREE_LIST) { /* I could not trigger this code. MvL */ ! my_friendly_abort (980326); #ifdef DEAD my_friendly_assert (!(TREE_CHAIN (component) == NULL_TREE && DECL_CHAIN (TREE_VALUE (component)) == NULL_TREE), 309); --- 2006,2012 ---- if (TREE_CODE (component) == TREE_LIST) { /* I could not trigger this code. MvL */ ! abort (); #ifdef DEAD my_friendly_assert (!(TREE_CHAIN (component) == NULL_TREE && DECL_CHAIN (TREE_VALUE (component)) == NULL_TREE), 309); *************** build_component_ref (datum, component, b *** 2100,2106 **** if (! IS_AGGR_TYPE_CODE (code)) { if (code != ERROR_MARK) ! cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", component, datum, basetype); return error_mark_node; } --- 2017,2023 ---- if (! IS_AGGR_TYPE_CODE (code)) { if (code != ERROR_MARK) ! error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", component, datum, basetype); return error_mark_node; } *************** build_component_ref (datum, component, b *** 2112,2124 **** { if (TYPE_IDENTIFIER (basetype) != TREE_OPERAND (component, 0)) { ! cp_error ("destructor specifier `%T::~%T' must have matching names", basetype, TREE_OPERAND (component, 0)); return error_mark_node; } if (! TYPE_HAS_DESTRUCTOR (basetype)) { ! cp_error ("type `%T' has no destructor", basetype); return error_mark_node; } return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1); --- 2029,2041 ---- { if (TYPE_IDENTIFIER (basetype) != TREE_OPERAND (component, 0)) { ! error ("destructor specifier `%T::~%T' must have matching names", basetype, TREE_OPERAND (component, 0)); return error_mark_node; } if (! TYPE_HAS_DESTRUCTOR (basetype)) { ! error ("type `%T' has no destructor", basetype); return error_mark_node; } return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1); *************** build_component_ref (datum, component, b *** 2135,2152 **** field = component; else if (TREE_CODE (component) == TYPE_DECL) { ! cp_error ("invalid use of type decl `%#D' as expression", component); return error_mark_node; } else if (TREE_CODE (component) == TEMPLATE_DECL) { ! cp_error ("invalid use of template `%#D' as expression", component); return error_mark_node; } else { tree name = component; ! if (TREE_CODE (component) == VAR_DECL) name = DECL_NAME (component); if (TREE_CODE (component) == NAMESPACE_DECL) /* Source is in error, but produce a sensible diagnostic. */ --- 2052,2072 ---- field = component; else if (TREE_CODE (component) == TYPE_DECL) { ! error ("invalid use of type decl `%#D' as expression", component); return error_mark_node; } else if (TREE_CODE (component) == TEMPLATE_DECL) { ! error ("invalid use of template `%#D' as expression", component); return error_mark_node; } else { tree name = component; ! ! if (TREE_CODE (component) == TEMPLATE_ID_EXPR) ! name = TREE_OPERAND (component, 0); ! else if (TREE_CODE (component) == VAR_DECL) name = DECL_NAME (component); if (TREE_CODE (component) == NAMESPACE_DECL) /* Source is in error, but produce a sensible diagnostic. */ *************** build_component_ref (datum, component, b *** 2194,2205 **** } } ref = build (COMPONENT_REF, unknown_type_node, ! datum, TREE_VALUE (fndecls)); return ref; } ! cp_error ("`%#T' has no member named `%D'", basetype, name); return error_mark_node; } else if (TREE_TYPE (field) == error_mark_node) --- 2114,2131 ---- } } + fndecls = TREE_VALUE (fndecls); + + if (TREE_CODE (component) == TEMPLATE_ID_EXPR) + fndecls = build_nt (TEMPLATE_ID_EXPR, + fndecls, TREE_OPERAND (component, 1)); + ref = build (COMPONENT_REF, unknown_type_node, ! datum, fndecls); return ref; } ! error ("`%#T' has no member named `%D'", basetype, name); return error_mark_node; } else if (TREE_TYPE (field) == error_mark_node) *************** build_component_ref (datum, component, b *** 2208,2214 **** if (TREE_CODE (field) != FIELD_DECL) { if (TREE_CODE (field) == TYPE_DECL) ! cp_pedwarn ("invalid use of type decl `%#D' as expression", field); else if (DECL_RTL (field) != 0) mark_used (field); else --- 2134,2140 ---- if (TREE_CODE (field) != FIELD_DECL) { if (TREE_CODE (field) == TYPE_DECL) ! pedwarn ("invalid use of type decl `%#D' as expression", field); else if (DECL_RTL (field) != 0) mark_used (field); else *************** build_component_ref (datum, component, b *** 2222,2227 **** --- 2148,2159 ---- } } + if (TREE_DEPRECATED (field)) + warn_deprecated_use (field); + + old_datum = datum; + old_basetype = basetype; + /* See if we have to do any conversions so that we pick up the field from the right context. */ if (DECL_FIELD_CONTEXT (field) != basetype) *************** build_component_ref (datum, component, b *** 2235,2257 **** /* Handle base classes here... */ if (base != basetype && TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype)) { ! tree addr = build_unary_op (ADDR_EXPR, datum, 0); ! if (integer_zerop (addr)) { ! error ("invalid reference to NULL ptr, use ptr-to-member instead"); return error_mark_node; } ! if (VBASE_NAME_P (DECL_NAME (field))) ! { ! /* It doesn't matter which vbase pointer we grab, just ! find one of them. */ ! tree binfo = get_binfo (base, ! TREE_TYPE (TREE_TYPE (addr)), 0); ! addr = convert_pointer_to_real (binfo, addr); ! } ! else ! addr = convert_pointer_to (base, addr); ! datum = build_indirect_ref (addr, NULL_PTR); if (datum == error_mark_node) return error_mark_node; } --- 2167,2186 ---- /* Handle base classes here... */ if (base != basetype && TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype)) { ! base_kind kind; ! tree binfo = lookup_base (TREE_TYPE (datum), base, ba_check, &kind); ! ! /* Complain about use of offsetof which will break. */ ! if (TREE_CODE (datum) == INDIRECT_REF ! && integer_zerop (TREE_OPERAND (datum, 0)) ! && kind == bk_via_virtual) { ! error ("\ ! invalid offsetof from non-POD type `%#T'; use pointer to member instead", ! basetype); return error_mark_node; } ! datum = build_base_path (PLUS_EXPR, datum, binfo, 1); if (datum == error_mark_node) return error_mark_node; } *************** build_component_ref (datum, component, b *** 2267,2272 **** --- 2196,2213 ---- } } + /* Complain about other invalid uses of offsetof, even though they will + give the right answer. Note that we complain whether or not they + actually used the offsetof macro, since there's no way to know at this + point. So we just give a warning, instead of a pedwarn. */ + if (protect + && CLASSTYPE_NON_POD_P (old_basetype) + && TREE_CODE (old_datum) == INDIRECT_REF + && integer_zerop (TREE_OPERAND (old_datum, 0))) + warning ("\ + invalid offsetof from non-POD type `%#T'; use pointer to member instead", + basetype); + /* Compute the type of the field, as described in [expr.ref]. */ type_quals = TYPE_UNQUALIFIED; field_type = TREE_TYPE (field); *************** build_component_ref (datum, component, b *** 2277,2284 **** ; else { ! type_quals = (CP_TYPE_QUALS (field_type) ! | CP_TYPE_QUALS (TREE_TYPE (datum))); /* A field is const (volatile) if the enclosing object, or the field itself, is const (volatile). But, a mutable field is --- 2218,2225 ---- ; else { ! type_quals = (cp_type_quals (field_type) ! | cp_type_quals (TREE_TYPE (datum))); /* A field is const (volatile) if the enclosing object, or the field itself, is const (volatile). But, a mutable field is *************** build_indirect_ref (ptr, errorstring) *** 2374,2380 **** { /* A pointer to incomplete type (other than cv void) can be dereferenced [expr.unary.op]/1 */ ! cp_error ("`%T' is not a pointer-to-object type", type); return error_mark_node; } else if (TREE_CODE (pointer) == ADDR_EXPR --- 2315,2321 ---- { /* A pointer to incomplete type (other than cv void) can be dereferenced [expr.unary.op]/1 */ ! error ("`%T' is not a pointer-to-object type", type); return error_mark_node; } else if (TREE_CODE (pointer) == ADDR_EXPR *************** build_x_function_call (function, params, *** 2720,2726 **** { if (current_class_type == NULL_TREE) { ! cp_error ("object missing in call to method `%D'", function); return error_mark_node; } /* Yow: call from a static member function. */ --- 2661,2667 ---- { if (current_class_type == NULL_TREE) { ! error ("object missing in call to method `%D'", function); return error_mark_node; } /* Yow: call from a static member function. */ *************** build_x_function_call (function, params, *** 2739,2750 **** /* Undo what we did in build_component_ref. */ decl = TREE_OPERAND (function, 0); function = TREE_OPERAND (function, 1); - function = DECL_NAME (OVL_CURRENT (function)); ! if (template_id) { ! TREE_OPERAND (template_id, 0) = function; ! function = template_id; } return build_method_call (decl, function, params, --- 2680,2701 ---- /* Undo what we did in build_component_ref. */ decl = TREE_OPERAND (function, 0); function = TREE_OPERAND (function, 1); ! if (TREE_CODE (function) == TEMPLATE_ID_EXPR) { ! my_friendly_assert (!template_id, 20011228); ! ! template_id = function; ! } ! else ! { ! function = DECL_NAME (OVL_CURRENT (function)); ! ! if (template_id) ! { ! TREE_OPERAND (template_id, 0) = function; ! function = template_id; ! } } return build_method_call (decl, function, params, *************** build_x_function_call (function, params, *** 2754,2760 **** { if (OVL_FUNCTION (function) == NULL_TREE) { ! cp_error ("function `%D' declared overloaded, but no definitions appear with which to resolve it?!?", TREE_PURPOSE (function)); return error_mark_node; } --- 2705,2711 ---- { if (OVL_FUNCTION (function) == NULL_TREE) { ! error ("function `%D' declared overloaded, but no definitions appear with which to resolve it?!?", TREE_PURPOSE (function)); return error_mark_node; } *************** build_x_function_call (function, params, *** 2829,2835 **** } /* Unexpected node type? */ else ! my_friendly_abort (116); if (decl == NULL_TREE) { if (current_function_decl --- 2780,2786 ---- } /* Unexpected node type? */ else ! abort (); if (decl == NULL_TREE) { if (current_function_decl *************** build_x_function_call (function, params, *** 2842,2849 **** if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (decl))) { decl = build_unary_op (ADDR_EXPR, decl, 0); ! decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl); } else decl = build_c_cast (ctypeptr, decl); --- 2793,2803 ---- if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (decl))) { + tree binfo = lookup_base (TREE_TYPE (decl), TREE_TYPE (ctypeptr), + ba_check, NULL); + decl = build_unary_op (ADDR_EXPR, decl, 0); ! decl = build_base_path (PLUS_EXPR, decl, binfo, 1); } else decl = build_c_cast (ctypeptr, decl); *************** get_member_function_from_ptrfunc (instan *** 2862,2874 **** tree function; { if (TREE_CODE (function) == OFFSET_REF) ! { ! function = TREE_OPERAND (function, 1); ! } if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function))) { ! tree fntype, idx, e1, delta, delta2, e2, e3, aref, vtbl; tree instance, basetype; tree instance_ptr = *instance_ptrptr; --- 2816,2826 ---- tree function; { if (TREE_CODE (function) == OFFSET_REF) ! function = TREE_OPERAND (function, 1); if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function))) { ! tree fntype, idx, e1, delta, delta2, e2, e3, vtbl; tree instance, basetype; tree instance_ptr = *instance_ptrptr; *************** get_member_function_from_ptrfunc (instan *** 2893,2906 **** fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function)); basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype)); ! /* Convert down to the right base, before using the instance. */ ! instance = convert_pointer_to_real (basetype, instance_ptr); if (instance == error_mark_node && instance_ptr != error_mark_node) return instance; e3 = PFN_FROM_PTRMEMFUNC (function); ! ! vtbl = convert_pointer_to (ptr_type_node, instance); delta = cp_convert (ptrdiff_type_node, build_component_ref (function, delta_identifier, NULL_TREE, 0)); --- 2845,2862 ---- fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function)); basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype)); ! /* Convert down to the right base, before using the instance. */ ! instance = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)), basetype, ! ba_check, NULL); ! instance = build_base_path (PLUS_EXPR, instance_ptr, instance, 1); if (instance == error_mark_node && instance_ptr != error_mark_node) return instance; e3 = PFN_FROM_PTRMEMFUNC (function); ! ! vtbl = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), instance); ! TREE_CONSTANT (vtbl) = TREE_CONSTANT (instance); ! delta = cp_convert (ptrdiff_type_node, build_component_ref (function, delta_identifier, NULL_TREE, 0)); *************** get_member_function_from_ptrfunc (instan *** 2917,2935 **** load-with-sign-extend, while the second used normal load then shift to sign-extend. An optimizer flaw, perhaps, but it's easier to make this change. */ switch (TARGET_PTRMEMFUNC_VBIT_LOCATION) { case ptrmemfunc_vbit_in_pfn: - idx = cp_build_binary_op (TRUNC_DIV_EXPR, - build1 (NOP_EXPR, vtable_index_type, e3), - TYPE_SIZE_UNIT (vtable_entry_type)); e1 = cp_build_binary_op (BIT_AND_EXPR, build1 (NOP_EXPR, vtable_index_type, e3), integer_one_node); break; case ptrmemfunc_vbit_in_delta: - idx = build1 (NOP_EXPR, vtable_index_type, e3); e1 = cp_build_binary_op (BIT_AND_EXPR, delta, integer_one_node); delta = cp_build_binary_op (RSHIFT_EXPR, --- 2873,2890 ---- load-with-sign-extend, while the second used normal load then shift to sign-extend. An optimizer flaw, perhaps, but it's easier to make this change. */ + idx = cp_build_binary_op (TRUNC_DIV_EXPR, + build1 (NOP_EXPR, vtable_index_type, e3), + TYPE_SIZE_UNIT (vtable_entry_type)); switch (TARGET_PTRMEMFUNC_VBIT_LOCATION) { case ptrmemfunc_vbit_in_pfn: e1 = cp_build_binary_op (BIT_AND_EXPR, build1 (NOP_EXPR, vtable_index_type, e3), integer_one_node); break; case ptrmemfunc_vbit_in_delta: e1 = cp_build_binary_op (BIT_AND_EXPR, delta, integer_one_node); delta = cp_build_binary_op (RSHIFT_EXPR, *************** get_member_function_from_ptrfunc (instan *** 2949,2981 **** (PLUS_EXPR, build_pointer_type (build_pointer_type (vtable_entry_type)), vtbl, cp_convert (ptrdiff_type_node, delta2)); ! vtbl = build_indirect_ref (vtbl, NULL_PTR); ! aref = build_array_ref (vtbl, idx); ! ! if (! flag_vtable_thunks) ! { ! aref = save_expr (aref); ! ! delta = cp_build_binary_op ! (PLUS_EXPR, ! build_conditional_expr (e1, ! build_component_ref (aref, ! delta_identifier, ! NULL_TREE, 0), ! integer_zero_node), ! delta); ! } ! ! if (flag_vtable_thunks) ! e2 = aref; ! else ! e2 = build_component_ref (aref, pfn_identifier, NULL_TREE, 0); /* When using function descriptors, the address of the ! vtable entry is treated as a function pointer. */ if (TARGET_VTABLE_USES_DESCRIPTORS) ! e2 = build1 (NOP_EXPR, TREE_TYPE (e2), ! build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1)); TREE_TYPE (e2) = TREE_TYPE (e3); e1 = build_conditional_expr (e1, e2, e3); --- 2904,2917 ---- (PLUS_EXPR, build_pointer_type (build_pointer_type (vtable_entry_type)), vtbl, cp_convert (ptrdiff_type_node, delta2)); ! vtbl = build_indirect_ref (vtbl, NULL); ! e2 = build_array_ref (vtbl, idx); /* When using function descriptors, the address of the ! vtable entry is treated as a function pointer. */ if (TARGET_VTABLE_USES_DESCRIPTORS) ! e2 = build1 (NOP_EXPR, TREE_TYPE (e2), ! build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1)); TREE_TYPE (e2) = TREE_TYPE (e3); e1 = build_conditional_expr (e1, e2, e3); *************** get_member_function_from_ptrfunc (instan *** 2992,2998 **** if (instance_ptr == error_mark_node && TREE_CODE (e1) != ADDR_EXPR && TREE_CODE (TREE_OPERAND (e1, 0)) != FUNCTION_DECL) ! cp_error ("object missing in `%E'", function); function = e1; } --- 2928,2934 ---- if (instance_ptr == error_mark_node && TREE_CODE (e1) != ADDR_EXPR && TREE_CODE (TREE_OPERAND (e1, 0)) != FUNCTION_DECL) ! error ("object missing in `%E'", function); function = e1; } *************** build_function_call_real (function, para *** 3010,3015 **** --- 2946,2952 ---- tree result; tree name = NULL_TREE, assembler_name = NULL_TREE; int is_method; + tree original = function; /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */ *************** build_function_call_real (function, para *** 3022,3031 **** name = DECL_NAME (function); assembler_name = DECL_ASSEMBLER_NAME (function); - GNU_xref_call (current_function_decl, - IDENTIFIER_POINTER (name ? name - : TYPE_IDENTIFIER (DECL_CLASS_CONTEXT - (function)))); mark_used (function); fndecl = function; --- 2959,2964 ---- *************** build_function_call_real (function, para *** 3036,3042 **** /* Differs from default_conversion by not setting TREE_ADDRESSABLE (because calling an inline function does not mean the function needs to be separately compiled). */ ! if (DECL_INLINE (function)) function = inline_conversion (function); else --- 2969,2975 ---- /* Differs from default_conversion by not setting TREE_ADDRESSABLE (because calling an inline function does not mean the function needs to be separately compiled). */ ! if (DECL_INLINE (function)) function = inline_conversion (function); else *************** build_function_call_real (function, para *** 3056,3063 **** if (TYPE_PTRMEMFUNC_P (fntype)) { ! cp_error ("must use .* or ->* to call pointer-to-member function in `%E (...)'", ! function); return error_mark_node; } --- 2989,2996 ---- if (TYPE_PTRMEMFUNC_P (fntype)) { ! error ("must use .* or ->* to call pointer-to-member function in `%E (...)'", ! original); return error_mark_node; } *************** build_function_call_real (function, para *** 3069,3075 **** || is_method || TREE_CODE (function) == TEMPLATE_ID_EXPR)) { ! cp_error ("`%E' cannot be used as a function", function); return error_mark_node; } --- 3002,3008 ---- || is_method || TREE_CODE (function) == TEMPLATE_ID_EXPR)) { ! error ("`%E' cannot be used as a function", original); return error_mark_node; } *************** build_function_call_real (function, para *** 3096,3103 **** /* Check for errors in format strings. */ ! if (warn_format && (name || assembler_name)) ! check_function_format (NULL, name, assembler_name, coerced_params); /* Recognize certain built-in functions so we can make tree-codes other than CALL_EXPR. We do this when it enables fold-const.c --- 3029,3036 ---- /* Check for errors in format strings. */ ! if (warn_format) ! check_function_format (NULL, TYPE_ATTRIBUTES (fntype), coerced_params); /* Recognize certain built-in functions so we can make tree-codes other than CALL_EXPR. We do this when it enables fold-const.c *************** convert_arguments (typelist, values, fnd *** 3260,3268 **** if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) val = convert_from_reference (val); ! result = tree_cons (NULL_TREE, ! convert_arg_to_ellipsis (val), ! result); } if (typetail) --- 3193,3208 ---- if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) val = convert_from_reference (val); ! if (fndecl && DECL_BUILT_IN (fndecl) ! && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P) ! /* Don't do ellipsis conversion for __built_in_constant_p ! as this will result in spurious warnings for non-POD ! types. */ ! val = require_complete_type (val); ! else ! val = convert_arg_to_ellipsis (val); ! ! result = tree_cons (NULL_TREE, val, result); } if (typetail) *************** build_binary_op (code, orig_op0, orig_op *** 3420,3439 **** /* DTRT if one side is an overloaded function, but complain about it. */ if (type_unknown_p (op0)) { ! tree t = instantiate_type (TREE_TYPE (op1), op0, itf_none); if (t != error_mark_node) { ! cp_pedwarn ("assuming cast to type `%T' from overloaded function", TREE_TYPE (t)); op0 = t; } } if (type_unknown_p (op1)) { ! tree t = instantiate_type (TREE_TYPE (op0), op1, itf_none); if (t != error_mark_node) { ! cp_pedwarn ("assuming cast to type `%T' from overloaded function", TREE_TYPE (t)); op1 = t; } --- 3360,3379 ---- /* DTRT if one side is an overloaded function, but complain about it. */ if (type_unknown_p (op0)) { ! tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none); if (t != error_mark_node) { ! pedwarn ("assuming cast to type `%T' from overloaded function", TREE_TYPE (t)); op0 = t; } } if (type_unknown_p (op1)) { ! tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none); if (t != error_mark_node) { ! pedwarn ("assuming cast to type `%T' from overloaded function", TREE_TYPE (t)); op1 = t; } *************** build_binary_op (code, orig_op0, orig_op *** 3458,3466 **** case PLUS_EXPR: /* Handle the pointer + int case. */ if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ! return pointer_int_sum (PLUS_EXPR, op0, op1); else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE) ! return pointer_int_sum (PLUS_EXPR, op1, op0); else common = 1; break; --- 3398,3406 ---- case PLUS_EXPR: /* Handle the pointer + int case. */ if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ! return cp_pointer_int_sum (PLUS_EXPR, op0, op1); else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE) ! return cp_pointer_int_sum (PLUS_EXPR, op1, op0); else common = 1; break; *************** build_binary_op (code, orig_op0, orig_op *** 3473,3479 **** return pointer_diff (op0, op1, common_type (type0, type1)); /* Handle pointer minus int. Just like pointer plus int. */ else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ! return pointer_int_sum (MINUS_EXPR, op0, op1); else common = 1; break; --- 3413,3419 ---- return pointer_diff (op0, op1, common_type (type0, type1)); /* Handle pointer minus int. Just like pointer plus int. */ else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ! return cp_pointer_int_sum (MINUS_EXPR, op0, op1); else common = 1; break; *************** build_binary_op (code, orig_op0, orig_op *** 3493,3501 **** || code1 == COMPLEX_TYPE)) { if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1)) ! cp_warning ("division by zero in `%E / 0'", op0); else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1)) ! cp_warning ("division by zero in `%E / 0.'", op0); if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)) resultcode = RDIV_EXPR; --- 3433,3441 ---- || code1 == COMPLEX_TYPE)) { if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1)) ! warning ("division by zero in `%E / 0'", op0); else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1)) ! warning ("division by zero in `%E / 0.'", op0); if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)) resultcode = RDIV_EXPR; *************** build_binary_op (code, orig_op0, orig_op *** 3520,3558 **** case BIT_XOR_EXPR: if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) shorten = -1; - /* If one operand is a constant, and the other is a short type - that has been converted to an int, - really do the work in the short type and then convert the - result to int. If we are lucky, the constant will be 0 or 1 - in the short type, making the entire operation go away. */ - if (TREE_CODE (op0) == INTEGER_CST - && TREE_CODE (op1) == NOP_EXPR - && (TYPE_PRECISION (type1) - > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0)))) - && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0)))) - { - final_type = result_type; - op1 = TREE_OPERAND (op1, 0); - result_type = TREE_TYPE (op1); - } - if (TREE_CODE (op1) == INTEGER_CST - && TREE_CODE (op0) == NOP_EXPR - && (TYPE_PRECISION (type0) - > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))) - && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0)))) - { - final_type = result_type; - op0 = TREE_OPERAND (op0, 0); - result_type = TREE_TYPE (op0); - } break; case TRUNC_MOD_EXPR: case FLOOR_MOD_EXPR: if (code1 == INTEGER_TYPE && integer_zerop (op1)) ! cp_warning ("division by zero in `%E %% 0'", op0); else if (code1 == REAL_TYPE && real_zerop (op1)) ! cp_warning ("division by zero in `%E %% 0.'", op0); if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { --- 3460,3473 ---- case BIT_XOR_EXPR: if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) shorten = -1; break; case TRUNC_MOD_EXPR: case FLOOR_MOD_EXPR: if (code1 == INTEGER_TYPE && integer_zerop (op1)) ! warning ("division by zero in `%E %% 0'", op0); else if (code1 == REAL_TYPE && real_zerop (op1)) ! warning ("division by zero in `%E %% 0.'", op0); if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { *************** build_binary_op (code, orig_op0, orig_op *** 3729,3735 **** && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0), type1)) || (TYPE_PTRMEMFUNC_P (type1) && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1), type0))) ! my_friendly_abort (20000221); break; case MAX_EXPR: --- 3644,3650 ---- && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0), type1)) || (TYPE_PTRMEMFUNC_P (type1) && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1), type0))) ! abort (); break; case MAX_EXPR: *************** build_binary_op (code, orig_op0, orig_op *** 3947,3953 **** && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0)) != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1))) { ! cp_warning ("comparison between types `%#T' and `%#T'", TREE_TYPE (orig_op0), TREE_TYPE (orig_op1)); } --- 3862,3868 ---- && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0)) != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1))) { ! warning ("comparison between types `%#T' and `%#T'", TREE_TYPE (orig_op0), TREE_TYPE (orig_op1)); } *************** build_binary_op (code, orig_op0, orig_op *** 4048,4054 **** if (!result_type) { ! cp_error ("invalid operands of types `%T' and `%T' to binary `%O'", TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code); return error_mark_node; } --- 3963,3969 ---- if (!result_type) { ! error ("invalid operands of types `%T' and `%T' to binary `%O'", TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code); return error_mark_node; } *************** build_binary_op (code, orig_op0, orig_op *** 4070,4076 **** performed. Note that pointer-difference and pointer-addition have already been handled above, and so we don't end up here in that case. */ ! cp_warning ("NULL used in arithmetic"); if (! converted) { --- 3985,3991 ---- performed. Note that pointer-difference and pointer-addition have already been handled above, and so we don't end up here in that case. */ ! warning ("NULL used in arithmetic"); if (! converted) { *************** build_binary_op (code, orig_op0, orig_op *** 4103,4196 **** of pointer PTROP and integer INTOP. */ static tree ! pointer_int_sum (resultcode, ptrop, intop) enum tree_code resultcode; register tree ptrop, intop; { ! tree size_exp; ! ! register tree result; ! register tree folded = fold (intop); ! ! /* The result is a pointer of the same type that is being added. */ ! ! register tree result_type = TREE_TYPE (ptrop); ! ! if (!complete_type_or_else (result_type, ptrop)) ! return error_mark_node; ! ! if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) ! { ! if (pedantic || warn_pointer_arith) ! pedwarn ("ISO C++ forbids using pointer of type `void *' in pointer arithmetic"); ! size_exp = integer_one_node; ! } ! else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE) ! { ! if (pedantic || warn_pointer_arith) ! pedwarn ("ISO C++ forbids using a pointer-to-function in pointer arithmetic"); ! size_exp = integer_one_node; ! } ! else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE) ! { ! if (pedantic || warn_pointer_arith) ! pedwarn ("ISO C++ forbids using a pointer to member function in pointer arithmetic"); ! size_exp = integer_one_node; ! } ! else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE) ! { ! if (pedantic || warn_pointer_arith) ! pedwarn ("ISO C++ forbids using pointer to a member in pointer arithmetic"); ! size_exp = integer_one_node; ! } ! else ! size_exp = size_in_bytes (complete_type (TREE_TYPE (result_type))); ! ! /* Needed to make OOPS V2R3 work. */ ! intop = folded; ! if (integer_zerop (intop)) ! return ptrop; ! ! /* If what we are about to multiply by the size of the elements ! contains a constant term, apply distributive law ! and multiply that constant term separately. ! This helps produce common subexpressions. */ ! ! if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR) ! && ! TREE_CONSTANT (intop) ! && TREE_CONSTANT (TREE_OPERAND (intop, 1)) ! && TREE_CONSTANT (size_exp)) ! { ! enum tree_code subcode = resultcode; ! if (TREE_CODE (intop) == MINUS_EXPR) ! subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR); ! ptrop = cp_build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1)); ! intop = TREE_OPERAND (intop, 0); ! } ! ! /* Convert the integer argument to a type the same size as sizetype ! so the multiply won't overflow spuriously. */ ! ! if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)) ! intop = cp_convert (type_for_size (TYPE_PRECISION (sizetype), 0), intop); ! ! /* Replace the integer argument with a suitable product by the object size. ! Do this multiplication as signed, then convert to the appropriate ! pointer type (actually unsigned integral). */ ! ! intop = cp_convert (result_type, ! cp_build_binary_op (MULT_EXPR, intop, ! cp_convert (TREE_TYPE (intop), ! size_exp))); ! ! /* Create the sum or difference. */ ! result = build (resultcode, result_type, ptrop, intop); ! folded = fold (result); ! if (folded == result) ! TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop); ! return folded; } /* Return a tree for the difference of pointers OP0 and OP1. --- 4018,4037 ---- of pointer PTROP and integer INTOP. */ static tree ! cp_pointer_int_sum (resultcode, ptrop, intop) enum tree_code resultcode; register tree ptrop, intop; { ! tree res_type = TREE_TYPE (ptrop); ! /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type) ! in certain circumstance (when it's valid to do so). So we need ! to make sure it's complete. We don't need to check here, if we ! can actually complete it at all, as those checks will be done in ! pointer_int_sum() anyway. */ ! complete_type (TREE_TYPE (res_type)); ! return pointer_int_sum (resultcode, ptrop, fold (intop)); } /* Return a tree for the difference of pointers OP0 and OP1. *************** build_component_addr (arg, argtype) *** 4266,4272 **** if (DECL_C_BIT_FIELD (field)) { ! cp_error ("attempt to take address of bit-field structure member `%D'", field); return error_mark_node; } --- 4107,4113 ---- if (DECL_C_BIT_FIELD (field)) { ! error ("attempt to take address of bit-field structure member `%D'", field); return error_mark_node; } *************** build_component_addr (arg, argtype) *** 4277,4284 **** /* Can't convert directly to ARGTYPE, since that may have the same pointer type as one of our baseclasses. */ ! rval = build1 (NOP_EXPR, argtype, ! convert_pointer_to (basetype, rval)); TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0)); } else --- 4118,4128 ---- /* Can't convert directly to ARGTYPE, since that may have the same pointer type as one of our baseclasses. */ ! tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)), basetype, ! ba_check, NULL); ! ! rval = build_base_path (PLUS_EXPR, rval, binfo, 1); ! rval = build1 (NOP_EXPR, argtype, rval); TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0)); } else *************** build_x_unary_op (code, xarg) *** 4329,4337 **** if (!ptrmem && !flag_ms_extensions && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE) ! /* A single non-static member, make sure we don't allow a ! pointer-to-member. */ ! xarg = ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE); } else if (TREE_CODE (xarg) == TARGET_EXPR) warning ("taking address of temporary"); --- 4173,4187 ---- if (!ptrmem && !flag_ms_extensions && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE) ! { ! /* A single non-static member, make sure we don't allow a ! pointer-to-member. */ ! xarg = build (OFFSET_REF, TREE_TYPE (xarg), ! TREE_OPERAND (xarg, 0), ! ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE)); ! PTRMEM_OK_P (xarg) = ptrmem; ! } ! } else if (TREE_CODE (xarg) == TARGET_EXPR) warning ("taking address of temporary"); *************** build_unary_op (code, xarg, noconvert) *** 4548,4561 **** tree type = complete_type (TREE_TYPE (argtype)); if (!COMPLETE_OR_VOID_TYPE_P (type)) ! cp_error ("cannot %s a pointer to incomplete type `%T'", ((code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ? "increment" : "decrement"), TREE_TYPE (argtype)); else if ((pedantic || warn_pointer_arith) && (tmp == FUNCTION_TYPE || tmp == METHOD_TYPE || tmp == VOID_TYPE || tmp == OFFSET_TYPE)) ! cp_pedwarn ("ISO C++ forbids %sing a pointer of type `%T'", ((code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ? "increment" : "decrement"), argtype); --- 4398,4411 ---- tree type = complete_type (TREE_TYPE (argtype)); if (!COMPLETE_OR_VOID_TYPE_P (type)) ! error ("cannot %s a pointer to incomplete type `%T'", ((code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ? "increment" : "decrement"), TREE_TYPE (argtype)); else if ((pedantic || warn_pointer_arith) && (tmp == FUNCTION_TYPE || tmp == METHOD_TYPE || tmp == VOID_TYPE || tmp == OFFSET_TYPE)) ! pedwarn ("ISO C++ forbids %sing a pointer of type `%T'", ((code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ? "increment" : "decrement"), argtype); *************** build_unary_op (code, xarg, noconvert) *** 4614,4620 **** { if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR) { ! cp_error ("invalid use of `--' on bool variable `%D'", arg); return error_mark_node; } #if 0 --- 4464,4470 ---- { if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR) { ! error ("invalid use of `--' on bool variable `%D'", arg); return error_mark_node; } #if 0 *************** build_unary_op (code, xarg, noconvert) *** 4687,4693 **** if (TREE_CODE (arg) == IDENTIFIER_NODE && IDENTIFIER_OPNAME_P (arg)) { ! my_friendly_abort (117); /* We don't know the type yet, so just work around the problem. We know that this will resolve to an lvalue. */ return build1 (ADDR_EXPR, unknown_type_node, arg); --- 4537,4543 ---- if (TREE_CODE (arg) == IDENTIFIER_NODE && IDENTIFIER_OPNAME_P (arg)) { ! abort (); /* We don't know the type yet, so just work around the problem. We know that this will resolve to an lvalue. */ return build1 (ADDR_EXPR, unknown_type_node, arg); *************** build_unary_op (code, xarg, noconvert) *** 4714,4722 **** if (current_class_type && TREE_OPERAND (arg, 0) == current_class_ref) /* An expression like &memfn. */ ! cp_pedwarn ("ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&%T::%D'", base, name); else ! cp_pedwarn ("ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'", base, name); } arg = build_offset_ref (base, name); } --- 4564,4572 ---- if (current_class_type && TREE_OPERAND (arg, 0) == current_class_ref) /* An expression like &memfn. */ ! pedwarn ("ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function. Say `&%T::%D'", base, name); else ! pedwarn ("ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'", base, name); } arg = build_offset_ref (base, name); } *************** unary_complex_lvalue (code, arg) *** 4827,4838 **** || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR) return rationalize_conditional_expr (code, arg); if (TREE_CODE (arg) == MODIFY_EXPR || TREE_CODE (arg) == PREINCREMENT_EXPR || TREE_CODE (arg) == PREDECREMENT_EXPR) ! return unary_complex_lvalue ! (code, build (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)), ! arg, TREE_OPERAND (arg, 0))); if (code != ADDR_EXPR) return 0; --- 4677,4697 ---- || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR) return rationalize_conditional_expr (code, arg); + /* Handle (a = b), (++a), and (--a) used as an "lvalue". */ if (TREE_CODE (arg) == MODIFY_EXPR || TREE_CODE (arg) == PREINCREMENT_EXPR || TREE_CODE (arg) == PREDECREMENT_EXPR) ! { ! tree lvalue = TREE_OPERAND (arg, 0); ! if (TREE_SIDE_EFFECTS (lvalue)) ! { ! lvalue = stabilize_reference (lvalue); ! arg = build (TREE_CODE (arg), TREE_TYPE (arg), ! lvalue, TREE_OPERAND (arg, 1)); ! } ! return unary_complex_lvalue ! (code, build (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue)); ! } if (code != ADDR_EXPR) return 0; *************** unary_complex_lvalue (code, arg) *** 4867,4873 **** if (TREE_CODE (t) == FUNCTION_DECL) { if (DECL_DESTRUCTOR_P (t)) ! cp_error ("taking address of destructor"); return build_unary_op (ADDR_EXPR, t, 0); } if (TREE_CODE (t) == VAR_DECL) --- 4726,4732 ---- if (TREE_CODE (t) == FUNCTION_DECL) { if (DECL_DESTRUCTOR_P (t)) ! error ("taking address of destructor"); return build_unary_op (ADDR_EXPR, t, 0); } if (TREE_CODE (t) == VAR_DECL) *************** unary_complex_lvalue (code, arg) *** 4880,4886 **** && ! is_dummy_object (TREE_OPERAND (arg, 0)) && TREE_CODE (t) != FIELD_DECL) { ! cp_error ("taking address of bound pointer-to-member expression"); return error_mark_node; } --- 4739,4761 ---- && ! is_dummy_object (TREE_OPERAND (arg, 0)) && TREE_CODE (t) != FIELD_DECL) { ! error ("taking address of bound pointer-to-member expression"); ! return error_mark_node; ! } ! if (!PTRMEM_OK_P (arg)) ! { ! /* This cannot form a pointer to method, so we must ! resolve the offset ref, and take the address of the ! result. For instance, ! &(C::m) */ ! arg = resolve_offset_ref (arg); ! ! return build_unary_op (code, arg, 0); ! } ! ! if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE) ! { ! error ("cannot create pointer to reference member `%D'", t); return error_mark_node; } *************** mark_addressable (exp) *** 4964,4970 **** case RESULT_DECL: if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x) && !DECL_ARTIFICIAL (x) && extra_warnings) ! cp_warning ("address requested for `%D', which is declared `register'", x); TREE_ADDRESSABLE (x) = 1; return 1; --- 4839,4845 ---- case RESULT_DECL: if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x) && !DECL_ARTIFICIAL (x) && extra_warnings) ! warning ("address requested for `%D', which is declared `register'", x); TREE_ADDRESSABLE (x) = 1; return 1; *************** build_static_cast (type, expr) *** 5141,5159 **** { /* They're pointers to objects. They must be aggregates that are related non-virtually. */ ! ! tree binfo; if (IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype)) ! && (binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 0)) ! && !binfo_from_vbase (binfo)) ok = 1; } else if (TREE_CODE (intype) != BOOLEAN_TYPE && TREE_CODE (type) != ARRAY_TYPE && TREE_CODE (type) != FUNCTION_TYPE && can_convert (intype, strip_all_pointer_quals (type))) ok = 1; /* [expr.static.cast] --- 5016,5057 ---- { /* They're pointers to objects. They must be aggregates that are related non-virtually. */ ! base_kind kind; if (IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype)) ! && lookup_base (TREE_TYPE (type), TREE_TYPE (intype), ! ba_ignore | ba_quiet, &kind) ! && kind != bk_via_virtual) ok = 1; } + else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)) + { + /* They're pointers to members. The pointed to objects must be + the same (ignoring CV qualifiers), and the containing classes + must be related non-virtually. */ + base_kind kind; + + if (same_type_p + (strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (type))), + strip_all_pointer_quals (TREE_TYPE (TREE_TYPE (intype)))) + && (lookup_base (TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)), + TYPE_OFFSET_BASETYPE (TREE_TYPE (type)), + ba_ignore | ba_quiet, &kind)) + && kind != bk_via_virtual) + ok = 1; + } else if (TREE_CODE (intype) != BOOLEAN_TYPE && TREE_CODE (type) != ARRAY_TYPE && TREE_CODE (type) != FUNCTION_TYPE && can_convert (intype, strip_all_pointer_quals (type))) ok = 1; + else if (TREE_CODE (intype) == ENUMERAL_TYPE + && TREE_CODE (type) == ENUMERAL_TYPE) + /* DR 128: "A value of integral _or enumeration_ type can be explicitly + converted to an enumeration type." + The integral to enumeration will be accepted by the previous clause. + We need to explicitly check for enumeration to enumeration. */ + ok = 1; /* [expr.static.cast] *************** build_static_cast (type, expr) *** 5161,5167 **** constness. */ if (ok && casts_away_constness (intype, type)) { ! cp_error ("static_cast from type `%T' to type `%T' casts away constness", intype, type); return error_mark_node; } --- 5059,5065 ---- constness. */ if (ok && casts_away_constness (intype, type)) { ! error ("static_cast from type `%T' to type `%T' casts away constness", intype, type); return error_mark_node; } *************** build_static_cast (type, expr) *** 5169,5175 **** if (ok) return build_c_cast (type, expr); ! cp_error ("invalid static_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } --- 5067,5073 ---- if (ok) return build_c_cast (type, expr); ! error ("invalid static_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } *************** build_reinterpret_cast (type, expr) *** 5208,5214 **** { if (! real_lvalue_p (expr)) { ! cp_error ("invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'", intype, type); return error_mark_node; } expr = build_unary_op (ADDR_EXPR, expr, 0); --- 5106,5112 ---- { if (! real_lvalue_p (expr)) { ! error ("invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'", intype, type); return error_mark_node; } expr = build_unary_op (ADDR_EXPR, expr, 0); *************** build_reinterpret_cast (type, expr) *** 5228,5234 **** else if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PTR_P (intype)) { if (TYPE_PRECISION (type) < TYPE_PRECISION (intype)) ! cp_pedwarn ("reinterpret_cast from `%T' to `%T' loses precision", intype, type); } else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype)) --- 5126,5132 ---- else if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PTR_P (intype)) { if (TYPE_PRECISION (type) < TYPE_PRECISION (intype)) ! pedwarn ("reinterpret_cast from `%T' to `%T' loses precision", intype, type); } else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype)) *************** build_reinterpret_cast (type, expr) *** 5241,5247 **** || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype))) { if (! comp_ptr_ttypes_reinterpret (TREE_TYPE (type), TREE_TYPE (intype))) ! cp_pedwarn ("reinterpret_cast from `%T' to `%T' casts away const (or volatile)", intype, type); expr = decl_constant_value (expr); --- 5139,5145 ---- || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype))) { if (! comp_ptr_ttypes_reinterpret (TREE_TYPE (type), TREE_TYPE (intype))) ! pedwarn ("reinterpret_cast from `%T' to `%T' casts away const (or volatile)", intype, type); expr = decl_constant_value (expr); *************** build_reinterpret_cast (type, expr) *** 5256,5262 **** } else { ! cp_error ("invalid reinterpret_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } --- 5154,5160 ---- } else { ! error ("invalid reinterpret_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } *************** build_const_cast (type, expr) *** 5283,5292 **** } if (!POINTER_TYPE_P (type)) ! cp_error ("invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type", type); else if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) { ! cp_error ("invalid use of const_cast with type `%T', which is a pointer or reference to a function type", type); return error_mark_node; } --- 5181,5190 ---- } if (!POINTER_TYPE_P (type)) ! error ("invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type", type); else if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) { ! error ("invalid use of const_cast with type `%T', which is a pointer or reference to a function type", type); return error_mark_node; } *************** build_const_cast (type, expr) *** 5309,5315 **** { if (! real_lvalue_p (expr)) { ! cp_error ("invalid const_cast of an rvalue of type `%T' to type `%T'", intype, type); return error_mark_node; } --- 5207,5213 ---- { if (! real_lvalue_p (expr)) { ! error ("invalid const_cast of an rvalue of type `%T' to type `%T'", intype, type); return error_mark_node; } *************** build_const_cast (type, expr) *** 5325,5331 **** && comp_ptr_ttypes_const (TREE_TYPE (type), TREE_TYPE (intype))) return cp_convert (type, expr); ! cp_error ("invalid const_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } --- 5223,5229 ---- && comp_ptr_ttypes_const (TREE_TYPE (type), TREE_TYPE (intype))) return cp_convert (type, expr); ! error ("invalid const_cast from type `%T' to type `%T'", intype, type); return error_mark_node; } *************** build_c_cast (type, expr) *** 5367,5378 **** NIHCL uses it. It is not valid ISO C++ however. */ if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) { ! cp_pedwarn ("ISO C++ forbids casting to an array type `%T'", type); type = build_pointer_type (TREE_TYPE (type)); } else { ! cp_error ("ISO C++ forbids casting to an array type `%T'", type); return error_mark_node; } } --- 5265,5276 ---- NIHCL uses it. It is not valid ISO C++ however. */ if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) { ! pedwarn ("ISO C++ forbids casting to an array type `%T'", type); type = build_pointer_type (TREE_TYPE (type)); } else { ! error ("ISO C++ forbids casting to an array type `%T'", type); return error_mark_node; } } *************** build_c_cast (type, expr) *** 5380,5386 **** if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) { ! cp_error ("invalid cast to function type `%T'", type); return error_mark_node; } --- 5278,5284 ---- if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) { ! error ("invalid cast to function type `%T'", type); return error_mark_node; } *************** build_c_cast (type, expr) *** 5432,5438 **** && TREE_CODE (otype) == POINTER_TYPE && !at_least_as_qualified_p (TREE_TYPE (type), TREE_TYPE (otype))) ! cp_warning ("cast from `%T' to `%T' discards qualifiers from pointer target type", otype, type); if (TREE_CODE (type) == INTEGER_TYPE --- 5330,5336 ---- && TREE_CODE (otype) == POINTER_TYPE && !at_least_as_qualified_p (TREE_TYPE (type), TREE_TYPE (otype))) ! warning ("cast from `%T' to `%T' discards qualifiers from pointer target type", otype, type); if (TREE_CODE (type) == INTEGER_TYPE *************** build_c_cast (type, expr) *** 5478,5484 **** && COMPLETE_TYPE_P (TREE_TYPE (otype)) && COMPLETE_TYPE_P (TREE_TYPE (type)) && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype))) ! cp_warning ("cast from `%T' to `%T' increases required alignment of target type", otype, type); /* Always produce some operator for an explicit cast, --- 5376,5382 ---- && COMPLETE_TYPE_P (TREE_TYPE (otype)) && COMPLETE_TYPE_P (TREE_TYPE (type)) && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype))) ! warning ("cast from `%T' to `%T' increases required alignment of target type", otype, type); /* Always produce some operator for an explicit cast, *************** build_modify_expr (lhs, modifycode, rhs) *** 5513,5525 **** if (lhs == error_mark_node || rhs == error_mark_node) return error_mark_node; - /* Types that aren't fully specified cannot be used in assignments. */ - lhs = require_complete_type (lhs); - - newrhs = rhs; - /* Handle control structure constructs used as "lvalues". */ - switch (TREE_CODE (lhs)) { /* Handle --foo = 5; as these are valid constructs in C++ */ --- 5411,5417 ---- *************** build_modify_expr (lhs, modifycode, rhs) *** 5551,5563 **** /* Handle (a ? b : c) used as an "lvalue". */ case COND_EXPR: - rhs = save_expr (rhs); { /* Produce (a ? (b = rhs) : (c = rhs)) except that the RHS goes through a save-expr so the code to compute it is only emitted once. */ tree cond; /* Check this here to avoid odd errors when trying to convert a throw to the type of the COND_EXPR. */ if (!lvalue_or_else (lhs, "assignment")) --- 5443,5456 ---- /* Handle (a ? b : c) used as an "lvalue". */ case COND_EXPR: { /* Produce (a ? (b = rhs) : (c = rhs)) except that the RHS goes through a save-expr so the code to compute it is only emitted once. */ tree cond; + rhs = save_expr (rhs); + /* Check this here to avoid odd errors when trying to convert a throw to the type of the COND_EXPR. */ if (!lvalue_or_else (lhs, "assignment")) *************** build_modify_expr (lhs, modifycode, rhs) *** 5577,5630 **** /* Make sure the code to compute the rhs comes out before the split. */ return build (COMPOUND_EXPR, TREE_TYPE (lhs), ! /* Case to void to suppress warning from warn_if_unused_value. */ cp_convert (void_type_node, rhs), cond); } ! default: break; } - if (TREE_CODE (lhs) == OFFSET_REF) - { - if (TREE_OPERAND (lhs, 0) == NULL_TREE) - { - /* Static class member? */ - tree member = TREE_OPERAND (lhs, 1); - if (TREE_CODE (member) == VAR_DECL) - lhs = member; - else - { - compiler_error ("invalid static class member"); - return error_mark_node; - } - } - else - lhs = resolve_offset_ref (lhs); - - olhstype = lhstype = TREE_TYPE (lhs); - } - - if (lhs == error_mark_node) - return lhs; - - if (TREE_CODE (lhstype) == REFERENCE_TYPE - && modifycode != INIT_EXPR) - { - lhs = convert_from_reference (lhs); - olhstype = lhstype = TREE_TYPE (lhs); - } - - /* If a binary op has been requested, combine the old LHS value with the RHS - producing the value we should actually store into the LHS. */ - if (modifycode == INIT_EXPR) { if (TREE_CODE (rhs) == CONSTRUCTOR) { ! if (! same_type_p (TREE_TYPE (rhs), lhstype)) ! abort (); result = build (INIT_EXPR, lhstype, lhs, rhs); TREE_SIDE_EFFECTS (result) = 1; return result; --- 5470,5496 ---- /* Make sure the code to compute the rhs comes out before the split. */ return build (COMPOUND_EXPR, TREE_TYPE (lhs), ! /* Cast to void to suppress warning from warn_if_unused_value. */ cp_convert (void_type_node, rhs), cond); } ! ! case OFFSET_REF: ! lhs = resolve_offset_ref (lhs); ! if (lhs == error_mark_node) ! return error_mark_node; ! olhstype = lhstype = TREE_TYPE (lhs); ! default: break; } if (modifycode == INIT_EXPR) { if (TREE_CODE (rhs) == CONSTRUCTOR) { ! my_friendly_assert (same_type_p (TREE_TYPE (rhs), lhstype), ! 20011220); result = build (INIT_EXPR, lhstype, lhs, rhs); TREE_SIDE_EFFECTS (result) = 1; return result; *************** build_modify_expr (lhs, modifycode, rhs) *** 5641,5675 **** return result; } } ! else if (modifycode == NOP_EXPR) { ! /* `operator=' is not an inheritable operator. */ ! if (! IS_AGGR_TYPE (lhstype)) ! /* Do the default thing */; ! else { ! result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, ! lhs, rhs, make_node (NOP_EXPR)); ! if (result == NULL_TREE) ! return error_mark_node; ! return result; } ! lhstype = olhstype; ! } ! else if (PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE)) ! { ! my_friendly_abort (978652); ! } ! else ! { ! lhs = stabilize_reference (lhs); ! newrhs = cp_build_binary_op (modifycode, lhs, rhs); ! if (newrhs == error_mark_node) { ! cp_error (" in evaluation of `%Q(%#T, %#T)'", modifycode, ! TREE_TYPE (lhs), TREE_TYPE (rhs)); ! return error_mark_node; } } /* Handle a cast used as an "lvalue". --- 5507,5561 ---- return result; } } ! else { ! if (TREE_CODE (lhstype) == REFERENCE_TYPE) { ! lhs = convert_from_reference (lhs); ! olhstype = lhstype = TREE_TYPE (lhs); } ! lhs = require_complete_type (lhs); ! if (lhs == error_mark_node) ! return error_mark_node; ! ! if (modifycode == NOP_EXPR) { ! /* `operator=' is not an inheritable operator. */ ! if (! IS_AGGR_TYPE (lhstype)) ! /* Do the default thing */; ! else ! { ! result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, ! lhs, rhs, make_node (NOP_EXPR)); ! if (result == NULL_TREE) ! return error_mark_node; ! return result; ! } ! lhstype = olhstype; ! } ! else ! { ! /* A binary op has been requested. Combine the old LHS ! value with the RHS producing the value we should actually ! store into the LHS. */ ! ! my_friendly_assert (!PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE), ! 978652); ! lhs = stabilize_reference (lhs); ! newrhs = cp_build_binary_op (modifycode, lhs, rhs); ! if (newrhs == error_mark_node) ! { ! error (" in evaluation of `%Q(%#T, %#T)'", modifycode, ! TREE_TYPE (lhs), TREE_TYPE (rhs)); ! return error_mark_node; ! } ! ! /* Now it looks like a plain assignment. */ ! modifycode = NOP_EXPR; } + my_friendly_assert (TREE_CODE (lhstype) != REFERENCE_TYPE, 20011220); + my_friendly_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE, + 20011220); } /* Handle a cast used as an "lvalue". *************** build_modify_expr (lhs, modifycode, rhs) *** 5688,5702 **** case FIX_FLOOR_EXPR: case FIX_ROUND_EXPR: case FIX_CEIL_EXPR: - if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE - || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE - || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE) - newrhs = default_conversion (newrhs); { tree inner_lhs = TREE_OPERAND (lhs, 0); tree result; /* ISO C++ 5.4/1: The result is an lvalue if T is a reference type, otherwise the result is an rvalue. */ if (! lvalue_p (lhs)) --- 5574,5589 ---- case FIX_FLOOR_EXPR: case FIX_ROUND_EXPR: case FIX_CEIL_EXPR: { tree inner_lhs = TREE_OPERAND (lhs, 0); tree result; + if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE + || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE + || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE + || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE) + newrhs = default_conversion (newrhs); + /* ISO C++ 5.4/1: The result is an lvalue if T is a reference type, otherwise the result is an rvalue. */ if (! lvalue_p (lhs)) *************** build_modify_expr (lhs, modifycode, rhs) *** 5720,5744 **** if (!lvalue_or_else (lhs, "assignment")) return error_mark_node; ! GNU_xref_assign (lhs); ! ! /* Warn about storing in something that is `const'. */ ! /* For C++, don't warn if this is initialization. */ if (modifycode != INIT_EXPR && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype) /* Functions are not modifiable, even though they are lvalues. */ || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE || (IS_AGGR_TYPE_CODE (TREE_CODE (lhstype)) ! && C_TYPE_FIELDS_READONLY (lhstype)) ! || (TREE_CODE (lhstype) == REFERENCE_TYPE ! && CP_TYPE_CONST_P (TREE_TYPE (lhstype))))) readonly_error (lhs, "assignment", 0); ! /* If storing into a structure or union member, ! it has probably been given type `int'. ! Compute the type that would go with ! the actual amount of storage the member occupies. */ if (TREE_CODE (lhs) == COMPONENT_REF && (TREE_CODE (lhstype) == INTEGER_TYPE --- 5607,5629 ---- if (!lvalue_or_else (lhs, "assignment")) return error_mark_node; ! /* Warn about modifying something that is `const'. Don't warn if ! this is initialization. */ if (modifycode != INIT_EXPR && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype) /* Functions are not modifiable, even though they are lvalues. */ || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE + || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE + /* If it's an aggregate and any field is const, then it is + effectively const. */ || (IS_AGGR_TYPE_CODE (TREE_CODE (lhstype)) ! && C_TYPE_FIELDS_READONLY (lhstype)))) readonly_error (lhs, "assignment", 0); ! /* If storing into a structure or union member, it has probably been ! given type `int'. Compute the type that would go with the actual ! amount of storage the member occupies. */ if (TREE_CODE (lhs) == COMPONENT_REF && (TREE_CODE (lhstype) == INTEGER_TYPE *************** build_modify_expr (lhs, modifycode, rhs) *** 5757,5811 **** } } ! if (modifycode != INIT_EXPR) { ! /* Make modifycode now either a NOP_EXPR or an INIT_EXPR. */ ! modifycode = NOP_EXPR; ! /* Reference-bashing */ ! if (TREE_CODE (lhstype) == REFERENCE_TYPE) ! { ! tree tmp = convert_from_reference (lhs); ! lhstype = TREE_TYPE (tmp); ! if (!COMPLETE_TYPE_P (lhstype)) ! { ! incomplete_type_error (lhs, lhstype); ! return error_mark_node; ! } ! lhs = tmp; ! olhstype = lhstype; ! } ! if (TREE_CODE (TREE_TYPE (newrhs)) == REFERENCE_TYPE) ! { ! tree tmp = convert_from_reference (newrhs); ! if (!COMPLETE_TYPE_P (TREE_TYPE (tmp))) ! { ! incomplete_type_error (newrhs, TREE_TYPE (tmp)); ! return error_mark_node; ! } ! newrhs = tmp; ! } } - if (TREE_SIDE_EFFECTS (lhs)) - lhs = stabilize_reference (lhs); - if (TREE_SIDE_EFFECTS (newrhs)) - newrhs = stabilize_reference (newrhs); - /* Convert new value to destination type. */ if (TREE_CODE (lhstype) == ARRAY_TYPE) { int from_array; ! if (!same_or_base_type_p (lhstype, TREE_TYPE (rhs))) { ! cp_error ("incompatible types in assignment of `%T' to `%T'", ! TREE_TYPE (rhs), lhstype); return error_mark_node; } /* Allow array assignment in compiler-generated code. */ ! if (pedantic && ! DECL_ARTIFICIAL (current_function_decl)) pedwarn ("ISO C++ forbids assignment of arrays"); from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE --- 5642,5671 ---- } } ! if (TREE_CODE (lhstype) != REFERENCE_TYPE) { ! if (TREE_SIDE_EFFECTS (lhs)) ! lhs = stabilize_reference (lhs); ! if (TREE_SIDE_EFFECTS (newrhs)) ! newrhs = stabilize_reference (newrhs); } /* Convert new value to destination type. */ if (TREE_CODE (lhstype) == ARRAY_TYPE) { int from_array; ! if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype), ! TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))) { ! error ("incompatible types in assignment of `%T' to `%T'", ! TREE_TYPE (rhs), lhstype); return error_mark_node; } /* Allow array assignment in compiler-generated code. */ ! if (! DECL_ARTIFICIAL (current_function_decl)) pedwarn ("ISO C++ forbids assignment of arrays"); from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE *************** build_modify_expr (lhs, modifycode, rhs) *** 5814,5830 **** } if (modifycode == INIT_EXPR) ! { ! newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL, ! "initialization", NULL_TREE, 0); ! if (current_function_decl && ! lhs == DECL_RESULT (current_function_decl)) ! { ! if (DECL_INITIAL (lhs)) ! warning ("return value from function receives multiple initializations"); ! DECL_INITIAL (lhs) = newrhs; ! } ! } else { /* Avoid warnings on enum bit fields. */ --- 5674,5681 ---- } if (modifycode == INIT_EXPR) ! newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL, ! "initialization", NULL_TREE, 0); else { /* Avoid warnings on enum bit fields. */ *************** get_delta_difference (from, to, force) *** 5953,5973 **** tree delta = integer_zero_node; tree binfo; tree virt_binfo; ! if (to == from) ! return delta; ! ! /* Should get_base_distance here, so we can check if any thing along ! the path is virtual, and we need to make sure we stay inside the ! real binfos when going through virtual bases. Maybe we should ! replace virtual bases with BINFO_FOR_VBASE ... (mrs) */ ! binfo = get_binfo (from, to, 1); ! if (binfo == error_mark_node) { error (" in pointer to member function conversion"); return delta; } ! if (binfo == 0) { if (!force) { --- 5804,5818 ---- tree delta = integer_zero_node; tree binfo; tree virt_binfo; + base_kind kind; ! binfo = lookup_base (to, from, ba_check, &kind); ! if (kind == bk_inaccessible || kind == bk_ambig) { error (" in pointer to member function conversion"); return delta; } ! if (!binfo) { if (!force) { *************** get_delta_difference (from, to, force) *** 5975,5989 **** error (" in pointer to member conversion"); return delta; } ! binfo = get_binfo (to, from, 1); ! if (binfo == 0 || binfo == error_mark_node) return delta; virt_binfo = binfo_from_vbase (binfo); if (virt_binfo) { /* This is a reinterpret cast, we choose to do nothing. */ ! cp_warning ("pointer to member cast via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); return delta; --- 5820,5834 ---- error (" in pointer to member conversion"); return delta; } ! binfo = lookup_base (from, to, ba_check, &kind); ! if (binfo == 0) return delta; virt_binfo = binfo_from_vbase (binfo); if (virt_binfo) { /* This is a reinterpret cast, we choose to do nothing. */ ! warning ("pointer to member cast via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); return delta; *************** get_delta_difference (from, to, force) *** 6002,6012 **** { /* This is a reinterpret cast, we choose to do nothing. */ if (force) ! cp_warning ("pointer to member cast via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); else ! cp_error ("pointer to member conversion via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); return delta; --- 5847,5857 ---- { /* This is a reinterpret cast, we choose to do nothing. */ if (force) ! warning ("pointer to member cast via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); else ! error ("pointer to member conversion via virtual base `%T' of `%T'", BINFO_TYPE (virt_binfo), BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo))); return delta; *************** build_ptrmemfunc (type, pfn, force) *** 6076,6082 **** if (!force && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn)) ! cp_error ("invalid conversion to type `%T' from type `%T'", to_type, pfn_type); n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type), --- 5921,5927 ---- if (!force && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn)) ! error ("invalid conversion to type `%T' from type `%T'", to_type, pfn_type); n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type), *************** build_ptrmemfunc (type, pfn, force) *** 6107,6114 **** delta = build_component_ref (pfn, delta_identifier, NULL_TREE, 0); } ! /* Under the new ABI, the conversion is easy. Just adjust ! the DELTA field. */ delta = cp_convert (ptrdiff_type_node, delta); if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta) n = cp_build_binary_op (LSHIFT_EXPR, n, integer_one_node); --- 5952,5958 ---- delta = build_component_ref (pfn, delta_identifier, NULL_TREE, 0); } ! /* Just adjust the DELTA field. */ delta = cp_convert (ptrdiff_type_node, delta); if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta) n = cp_build_binary_op (LSHIFT_EXPR, n, integer_one_node); *************** build_ptrmemfunc (type, pfn, force) *** 6126,6132 **** } if (type_unknown_p (pfn)) ! return instantiate_type (type, pfn, itf_complain); fn = TREE_OPERAND (pfn, 0); my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0); --- 5970,5976 ---- } if (type_unknown_p (pfn)) ! return instantiate_type (type, pfn, tf_error | tf_warning); fn = TREE_OPERAND (pfn, 0); my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0); *************** expand_ptrmemfunc_cst (cst, delta, pfn) *** 6173,6182 **** *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta), *delta, BINFO_OFFSET (binfo))); ! /* Under the new ABI, we set PFN to the vtable offset at ! which the function can be found, plus one (unless ! ptrmemfunc_vbit_in_delta, in which case delta is shifted ! left, and then incremented). */ *pfn = DECL_VINDEX (fn); *pfn = fold (build (MULT_EXPR, integer_type_node, *pfn, TYPE_SIZE_UNIT (vtable_entry_type))); --- 6017,6025 ---- *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta), *delta, BINFO_OFFSET (binfo))); ! /* We set PFN to the vtable offset at which the function can be ! found, plus one (unless ptrmemfunc_vbit_in_delta, in which ! case delta is shifted left, and then incremented). */ *pfn = DECL_VINDEX (fn); *pfn = fold (build (MULT_EXPR, integer_type_node, *pfn, TYPE_SIZE_UNIT (vtable_entry_type))); *************** dubious_conversion_warnings (type, expr, *** 6243,6252 **** if (ARITHMETIC_TYPE_P (type) && expr == null_node) { if (fndecl) ! cp_warning ("passing NULL used for non-pointer %s %P of `%D'", errtype, parmnum, fndecl); else ! cp_warning ("%s to non-pointer type `%T' from NULL", errtype, type); } /* Warn about assigning a floating-point type to an integer type. */ --- 6086,6095 ---- if (ARITHMETIC_TYPE_P (type) && expr == null_node) { if (fndecl) ! warning ("passing NULL used for non-pointer %s %P of `%D'", errtype, parmnum, fndecl); else ! warning ("%s to non-pointer type `%T' from NULL", errtype, type); } /* Warn about assigning a floating-point type to an integer type. */ *************** dubious_conversion_warnings (type, expr, *** 6254,6263 **** && TREE_CODE (type) == INTEGER_TYPE) { if (fndecl) ! cp_warning ("passing `%T' for %s %P of `%D'", TREE_TYPE (expr), errtype, parmnum, fndecl); else ! cp_warning ("%s to `%T' from `%T'", errtype, type, TREE_TYPE (expr)); } /* And warn about assigning a negative value to an unsigned variable. */ --- 6097,6106 ---- && TREE_CODE (type) == INTEGER_TYPE) { if (fndecl) ! warning ("passing `%T' for %s %P of `%D'", TREE_TYPE (expr), errtype, parmnum, fndecl); else ! warning ("%s to `%T' from `%T'", errtype, type, TREE_TYPE (expr)); } /* And warn about assigning a negative value to an unsigned variable. */ *************** dubious_conversion_warnings (type, expr, *** 6267,6276 **** && TREE_NEGATED_INT (expr)) { if (fndecl) ! cp_warning ("passing negative value `%E' for %s %P of `%D'", expr, errtype, parmnum, fndecl); else ! cp_warning ("%s of negative value `%E' to `%T'", errtype, expr, type); } --- 6110,6119 ---- && TREE_NEGATED_INT (expr)) { if (fndecl) ! warning ("passing negative value `%E' for %s %P of `%D'", expr, errtype, parmnum, fndecl); else ! warning ("%s of negative value `%E' to `%T'", errtype, expr, type); } *************** convert_for_assignment (type, rhs, errty *** 6300,6306 **** register enum tree_code coder; if (codel == OFFSET_TYPE) ! my_friendly_abort (990505); if (TREE_CODE (rhs) == OFFSET_REF) rhs = resolve_offset_ref (rhs); --- 6143,6149 ---- register enum tree_code coder; if (codel == OFFSET_TYPE) ! abort (); if (TREE_CODE (rhs) == OFFSET_REF) rhs = resolve_offset_ref (rhs); *************** convert_for_assignment (type, rhs, errty *** 6335,6342 **** /* [expr.ass] The expression is implicitly converted (clause _conv_) to the ! cv-unqualified type of the left operand. */ ! if (!can_convert_arg (type, rhstype, rhs)) { /* When -Wno-pmf-conversions is use, we just silently allow conversions from pointers-to-members to plain pointers. If --- 6178,6189 ---- /* [expr.ass] The expression is implicitly converted (clause _conv_) to the ! cv-unqualified type of the left operand. ! ! 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. */ ! if (!can_convert_arg_bad (type, rhstype, rhs)) { /* When -Wno-pmf-conversions is use, we just silently allow conversions from pointers-to-members to plain pointers. If *************** convert_for_assignment (type, rhs, errty *** 6345,6362 **** && TYPE_PTR_P (type) && TYPE_PTRMEMFUNC_P (rhstype)) rhs = cp_convert (strip_top_quals (type), rhs); ! else { /* If the right-hand side has unknown type, then it is an overloaded function. Call instantiate_type to get error messages. */ if (rhstype == unknown_type_node) ! instantiate_type (type, rhs, itf_complain); else if (fndecl) ! cp_error ("cannot convert `%T' to `%T' for argument `%P' to `%D'", rhstype, type, parmnum, fndecl); else ! cp_error ("cannot convert `%T' to `%T' in %s", rhstype, type, errtype); return error_mark_node; } --- 6192,6209 ---- && TYPE_PTR_P (type) && TYPE_PTRMEMFUNC_P (rhstype)) rhs = cp_convert (strip_top_quals (type), rhs); ! else { /* If the right-hand side has unknown type, then it is an overloaded function. Call instantiate_type to get error messages. */ if (rhstype == unknown_type_node) ! instantiate_type (type, rhs, tf_error | tf_warning); else if (fndecl) ! error ("cannot convert `%T' to `%T' for argument `%P' to `%D'", rhstype, type, parmnum, fndecl); else ! error ("cannot convert `%T' to `%T' in %s", rhstype, type, errtype); return error_mark_node; } *************** convert_for_initialization (exp, type, r *** 6435,6441 **** if (codel == REFERENCE_TYPE) { /* This should eventually happen in convert_arguments. */ - extern int warningcount, errorcount; int savew = 0, savee = 0; if (fndecl) --- 6282,6287 ---- *************** check_return_expr (retval) *** 6610,6616 **** warning ("function declared `noreturn' has a `return' statement"); /* Check for various simple errors. */ ! if (dtor_label) { if (retval) error ("returning a value from a destructor"); --- 6456,6462 ---- warning ("function declared `noreturn' has a `return' statement"); /* Check for various simple errors. */ ! if (DECL_DESTRUCTOR_P (current_function_decl)) { if (retval) error ("returning a value from a destructor"); *************** check_return_expr (retval) *** 6678,6690 **** && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl)) && ! flag_check_new && null_ptr_cst_p (retval)) ! cp_warning ("`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)"); /* Effective C++ rule 15. See also start_function. */ if (warn_ecpp && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR) && retval != current_class_ref) ! cp_warning ("`operator=' should return a reference to `*this'"); /* We don't need to do any conversions when there's nothing being returned. */ --- 6524,6575 ---- && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl)) && ! flag_check_new && null_ptr_cst_p (retval)) ! warning ("`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)"); /* Effective C++ rule 15. See also start_function. */ if (warn_ecpp && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR) && retval != current_class_ref) ! warning ("`operator=' should return a reference to `*this'"); ! ! /* The fabled Named Return Value optimization, as per [class.copy]/15: ! ! [...] For a function with a class return type, if the expression ! in the return statement is the name of a local object, and the cv- ! unqualified type of the local object is the same as the function ! return type, an implementation is permitted to omit creating the tem- ! porary object to hold the function return value [...] ! ! So, if this is a value-returning function that always returns the same ! local variable, remember it. ! ! It might be nice to be more flexible, and choose the first suitable ! variable even if the function sometimes returns something else, but ! then we run the risk of clobbering the variable we chose if the other ! returned expression uses the chosen variable somehow. And people expect ! this restriction, anyway. (jason 2000-11-19) ! ! See finish_function, genrtl_start_function, and declare_return_variable ! for other pieces of this optimization. */ ! ! if (fn_returns_value_p && flag_elide_constructors) ! { ! if (retval != NULL_TREE ! && (current_function_return_value == NULL_TREE ! || current_function_return_value == retval) ! && TREE_CODE (retval) == VAR_DECL ! && DECL_CONTEXT (retval) == current_function_decl ! && ! TREE_STATIC (retval) ! && (DECL_ALIGN (retval) ! >= DECL_ALIGN (DECL_RESULT (current_function_decl))) ! && same_type_p ((TYPE_MAIN_VARIANT ! (TREE_TYPE (retval))), ! (TYPE_MAIN_VARIANT ! (TREE_TYPE (TREE_TYPE (current_function_decl)))))) ! current_function_return_value = retval; ! else ! current_function_return_value = error_mark_node; ! } /* We don't need to do any conversions when there's nothing being returned. */ *************** ptr_reasonably_similar (to, from) *** 6800,6805 **** --- 6685,6695 ---- { for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from)) { + /* Any target type is similar enough to void. */ + if (TREE_CODE (to) == VOID_TYPE + || TREE_CODE (from) == VOID_TYPE) + return 1; + if (TREE_CODE (to) != TREE_CODE (from)) return 0; *************** ptr_reasonably_similar (to, from) *** 6809,6814 **** --- 6699,6711 ---- COMPARE_BASE | COMPARE_RELAXED)) continue; + if (TREE_CODE (to) == INTEGER_TYPE + && TYPE_PRECISION (to) == TYPE_PRECISION (from)) + return 1; + + if (TREE_CODE (to) == FUNCTION_TYPE) + return 1; + if (TREE_CODE (to) != POINTER_TYPE) return comptypes (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), *************** comp_ptr_ttypes_reinterpret (to, from) *** 6872,6878 **** } } ! /* Returns the type-qualifier set corresponding to TYPE. */ int cp_type_quals (type) --- 6769,6776 ---- } } ! /* Returns the type qualifiers for this type, including the qualifiers on the ! elements for an array type. */ int cp_type_quals (type) *************** casts_away_constness_r (t1, t2) *** 6938,6951 **** || TREE_CODE (*t2) != POINTER_TYPE) { *t1 = cp_build_qualified_type (void_type_node, ! CP_TYPE_QUALS (*t1)); *t2 = cp_build_qualified_type (void_type_node, ! CP_TYPE_QUALS (*t2)); return; } ! quals1 = CP_TYPE_QUALS (*t1); ! quals2 = CP_TYPE_QUALS (*t2); *t1 = TREE_TYPE (*t1); *t2 = TREE_TYPE (*t2); casts_away_constness_r (t1, t2); --- 6836,6849 ---- || TREE_CODE (*t2) != POINTER_TYPE) { *t1 = cp_build_qualified_type (void_type_node, ! cp_type_quals (*t1)); *t2 = cp_build_qualified_type (void_type_node, ! cp_type_quals (*t2)); return; } ! quals1 = cp_type_quals (*t1); ! quals2 = cp_type_quals (*t2); *t1 = TREE_TYPE (*t1); *t2 = TREE_TYPE (*t2); casts_away_constness_r (t1, t2); *************** casts_away_constness (t1, t2) *** 6983,6989 **** Casting from an rvalue of type "pointer to data member of X of type T1" to the type "pointer to data member of Y of type T2" casts away constness if a cast from an rvalue of type ! "poitner to T1" to the type "pointer to T2" casts away constness. */ return casts_away_constness (build_pointer_type (TREE_TYPE (TREE_TYPE (t1))), --- 6881,6887 ---- Casting from an rvalue of type "pointer to data member of X of type T1" to the type "pointer to data member of Y of type T2" casts away constness if a cast from an rvalue of type ! "pointer to T1" to the type "pointer to T2" casts away constness. */ return casts_away_constness (build_pointer_type (TREE_TYPE (TREE_TYPE (t1))), diff -Nrc3pad gcc-3.0.4/gcc/cp/typeck2.c gcc-3.1/gcc/cp/typeck2.c *** gcc-3.0.4/gcc/cp/typeck2.c Thu Apr 12 05:26:11 2001 --- gcc-3.1/gcc/cp/typeck2.c Wed Feb 13 17:32:24 2002 *************** Boston, MA 02111-1307, USA. */ *** 38,43 **** --- 38,44 ---- #include "flags.h" #include "toplev.h" #include "output.h" + #include "diagnostic.h" static tree process_init_constructor PARAMS ((tree, tree, tree *)); *************** error_not_base_type (basetype, type) *** 50,74 **** { if (TREE_CODE (basetype) == FUNCTION_DECL) basetype = DECL_CONTEXT (basetype); ! cp_error ("type `%T' is not a base type for type `%T'", basetype, type); return error_mark_node; } tree ! binfo_or_else (parent_or_type, type) ! tree parent_or_type, type; { ! tree binfo; ! if (TYPE_MAIN_VARIANT (parent_or_type) == TYPE_MAIN_VARIANT (type)) ! return TYPE_BINFO (parent_or_type); ! if ((binfo = get_binfo (parent_or_type, TYPE_MAIN_VARIANT (type), 0))) ! { ! if (binfo == error_mark_node) ! return NULL_TREE; ! return binfo; ! } ! error_not_base_type (parent_or_type, type); ! return NULL_TREE; } /* According to ARM $7.1.6, "A `const' object may be initialized, but its --- 51,71 ---- { if (TREE_CODE (basetype) == FUNCTION_DECL) basetype = DECL_CONTEXT (basetype); ! error ("type `%T' is not a base type for type `%T'", basetype, type); return error_mark_node; } tree ! binfo_or_else (base, type) ! tree base, type; { ! tree binfo = lookup_base (type, base, ba_ignore, NULL); ! ! if (binfo == error_mark_node) ! return NULL_TREE; ! else if (!binfo) ! error_not_base_type (base, type); ! return binfo; } /* According to ARM $7.1.6, "A `const' object may be initialized, but its *************** readonly_error (arg, string, soft) *** 86,94 **** void (*fn) PARAMS ((const char *, ...)); if (soft) ! fn = cp_pedwarn; else ! fn = cp_error; if (TREE_CODE (arg) == COMPONENT_REF) { --- 83,91 ---- void (*fn) PARAMS ((const char *, ...)); if (soft) ! fn = pedwarn; else ! fn = error; if (TREE_CODE (arg) == COMPONENT_REF) { *************** abstract_virtuals_error (decl, type) *** 139,144 **** --- 136,146 ---- if (!CLASS_TYPE_P (type) || !CLASSTYPE_PURE_VIRTUALS (type)) return 0; + if (!TYPE_SIZE (type)) + /* TYPE is being defined, and during that time + CLASSTYPE_PURE_VIRTUALS holds the inline friends. */ + return 0; + u = CLASSTYPE_PURE_VIRTUALS (type); if (decl) { *************** abstract_virtuals_error (decl, type) *** 146,167 **** return 0; if (TREE_CODE (decl) == VAR_DECL) ! cp_error ("cannot declare variable `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == PARM_DECL) ! cp_error ("cannot declare parameter `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == FIELD_DECL) ! cp_error ("cannot declare field `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) ! cp_error ("invalid return type for member function `%#D'", decl); else if (TREE_CODE (decl) == FUNCTION_DECL) ! cp_error ("invalid return type for function `%#D'", decl); } else ! cp_error ("cannot allocate an object of type `%T'", type); /* Only go through this once. */ if (TREE_PURPOSE (u) == NULL_TREE) --- 148,169 ---- return 0; if (TREE_CODE (decl) == VAR_DECL) ! error ("cannot declare variable `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == PARM_DECL) ! error ("cannot declare parameter `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == FIELD_DECL) ! error ("cannot declare field `%D' to be of type `%T'", decl, type); else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) ! error ("invalid return type for member function `%#D'", decl); else if (TREE_CODE (decl) == FUNCTION_DECL) ! error ("invalid return type for function `%#D'", decl); } else ! error ("cannot allocate an object of type `%T'", type); /* Only go through this once. */ if (TREE_PURPOSE (u) == NULL_TREE) *************** abstract_virtuals_error (decl, type) *** 173,179 **** cp_error_at ("\t%#D", TREE_VALUE (tu)); } else ! cp_error (" since type `%T' has abstract virtual functions", type); return 1; } --- 175,181 ---- cp_error_at ("\t%#D", TREE_VALUE (tu)); } else ! error (" since type `%T' has abstract virtual functions", type); return 1; } *************** retry: *** 208,219 **** case UNION_TYPE: case ENUMERAL_TYPE: if (!decl) ! cp_error ("invalid use of undefined type `%#T'", type); cp_error_at ("forward declaration of `%#T'", type); break; case VOID_TYPE: ! cp_error ("invalid use of `%T'", type); break; case ARRAY_TYPE: --- 210,221 ---- case UNION_TYPE: case ENUMERAL_TYPE: if (!decl) ! error ("invalid use of undefined type `%#T'", type); cp_error_at ("forward declaration of `%#T'", type); break; case VOID_TYPE: ! error ("invalid use of `%T'", type); break; case ARRAY_TYPE: *************** retry: *** 222,277 **** type = TREE_TYPE (type); goto retry; } ! cp_error ("invalid use of array with unspecified bounds"); break; case OFFSET_TYPE: bad_member: ! cp_error ("invalid use of member (did you forget the `&' ?)"); break; case TEMPLATE_TYPE_PARM: ! cp_error ("invalid use of template type parameter"); break; case UNKNOWN_TYPE: if (value && TREE_CODE (value) == COMPONENT_REF) goto bad_member; else if (value && TREE_CODE (value) == ADDR_EXPR) ! cp_error ("address of overloaded function with no contextual type information"); else if (value && TREE_CODE (value) == OVERLOAD) ! cp_error ("overloaded function with no contextual type information"); else ! cp_error ("insufficient contextual information to determine type"); break; default: ! my_friendly_abort (108); ! } ! } ! ! /* This is a wrapper around fancy_abort, as used in the back end and ! other front ends. It will also report the magic number assigned to ! this particular abort. That is for backward compatibility with the ! old C++ abort handler, which would just report the magic number. */ ! void ! friendly_abort (where, file, line, func) ! int where; ! const char *file; ! int line; ! const char *func; ! { ! if (errorcount > 0 || sorrycount > 0) ! /* Say nothing. */; ! else if (where > 0) ! { ! error ("Internal error #%d.", where); ! ! /* Uncount this error, so internal_error will do the right thing. */ ! --errorcount; } - - fancy_abort (file, line, func); } --- 224,255 ---- type = TREE_TYPE (type); goto retry; } ! error ("invalid use of array with unspecified bounds"); break; case OFFSET_TYPE: bad_member: ! error ("invalid use of member (did you forget the `&' ?)"); break; case TEMPLATE_TYPE_PARM: ! error ("invalid use of template type parameter"); break; case UNKNOWN_TYPE: if (value && TREE_CODE (value) == COMPONENT_REF) goto bad_member; else if (value && TREE_CODE (value) == ADDR_EXPR) ! error ("address of overloaded function with no contextual type information"); else if (value && TREE_CODE (value) == OVERLOAD) ! error ("overloaded function with no contextual type information"); else ! error ("insufficient contextual information to determine type"); break; default: ! abort (); } } *************** store_init_value (decl, init) *** 316,326 **** { if (! TYPE_HAS_TRIVIAL_INIT_REF (type) && TREE_CODE (init) != CONSTRUCTOR) ! my_friendly_abort (109); if (TREE_CODE (init) == TREE_LIST) { ! cp_error ("constructor syntax used, but no constructor declared for type `%T'", type); init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (init)); } #if 0 --- 294,304 ---- { if (! TYPE_HAS_TRIVIAL_INIT_REF (type) && TREE_CODE (init) != CONSTRUCTOR) ! abort (); if (TREE_CODE (init) == TREE_LIST) { ! error ("constructor syntax used, but no constructor declared for type `%T'", type); init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (init)); } #if 0 *************** store_init_value (decl, init) *** 388,396 **** /* End of special C++ code. */ ! /* Digest the specified initializer into an expression. */ ! ! value = digest_init (type, init, (tree *) 0); /* Store the expression if valid; else report error. */ --- 366,380 ---- /* End of special C++ code. */ ! /* We might have already run this bracketed initializer through ! digest_init. Don't do so again. */ ! if (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init) ! && TREE_TYPE (init) ! && TYPE_MAIN_VARIANT (TREE_TYPE (init)) == TYPE_MAIN_VARIANT (type)) ! value = init; ! else ! /* Digest the specified initializer into an expression. */ ! value = digest_init (type, init, (tree *) 0); /* Store the expression if valid; else report error. */ *************** store_init_value (decl, init) *** 425,431 **** if (pedantic && TREE_CODE (value) == CONSTRUCTOR) { if (! TREE_CONSTANT (value) || ! TREE_STATIC (value)) ! pedwarn ("ANSI C++ forbids non-constant aggregate initializer expressions"); } } #endif --- 409,415 ---- if (pedantic && TREE_CODE (value) == CONSTRUCTOR) { if (! TREE_CONSTANT (value) || ! TREE_STATIC (value)) ! pedwarn ("ISO C++ forbids non-constant aggregate initializer expressions"); } } #endif *************** digest_init (type, init, tail) *** 470,475 **** --- 454,470 ---- && TREE_VALUE (init) == error_mark_node)) return error_mark_node; + if (TREE_CODE (init) == ERROR_MARK) + /* __PRETTY_FUNCTION__'s initializer is a bogus expression inside + a template function. This gets substituted during instantiation. */ + return init; + + /* We must strip the outermost array type when completing the type, + because the its bounds might be incomplete at the moment. */ + if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE + ? TREE_TYPE (type) : type, NULL_TREE)) + return error_mark_node; + /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ if (TREE_CODE (init) == NON_LVALUE_EXPR) init = TREE_OPERAND (init, 0); *************** digest_init (type, init, tail) *** 549,555 **** if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE || code == ENUMERAL_TYPE || code == REFERENCE_TYPE ! || code == BOOLEAN_TYPE || code == COMPLEX_TYPE || code == VECTOR_TYPE || TYPE_PTRMEMFUNC_P (type)) { if (raw_constructor) --- 544,550 ---- if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE || code == ENUMERAL_TYPE || code == REFERENCE_TYPE ! || code == BOOLEAN_TYPE || code == COMPLEX_TYPE || TYPE_PTRMEMFUNC_P (type)) { if (raw_constructor) *************** digest_init (type, init, tail) *** 563,572 **** } while (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init)) { ! cp_pedwarn ("braces around scalar initializer for `%T'", type); init = CONSTRUCTOR_ELTS (init); if (TREE_CHAIN (init)) ! cp_pedwarn ("ignoring extra initializers for `%T'", type); init = TREE_VALUE (init); } --- 558,567 ---- } while (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init)) { ! pedwarn ("braces around scalar initializer for `%T'", type); init = CONSTRUCTOR_ELTS (init); if (TREE_CHAIN (init)) ! pedwarn ("ignoring extra initializers for `%T'", type); init = TREE_VALUE (init); } *************** digest_init (type, init, tail) *** 578,594 **** if (COMPLETE_TYPE_P (type) && ! TREE_CONSTANT (TYPE_SIZE (type))) { ! cp_error ("variable-sized object of type `%T' may not be initialized", type); return error_mark_node; } ! if (code == ARRAY_TYPE || IS_AGGR_TYPE_CODE (code)) { if (raw_constructor && TYPE_NON_AGGREGATE_CLASS (type) && TREE_HAS_CONSTRUCTOR (init)) { ! cp_error ("subobject of type `%T' must be initialized by constructor, not by `%E'", type, init); return error_mark_node; } --- 573,589 ---- if (COMPLETE_TYPE_P (type) && ! TREE_CONSTANT (TYPE_SIZE (type))) { ! error ("variable-sized object of type `%T' may not be initialized", type); return error_mark_node; } ! if (code == ARRAY_TYPE || code == VECTOR_TYPE || IS_AGGR_TYPE_CODE (code)) { if (raw_constructor && TYPE_NON_AGGREGATE_CLASS (type) && TREE_HAS_CONSTRUCTOR (init)) { ! error ("subobject of type `%T' must be initialized by constructor, not by `%E'", type, init); return error_mark_node; } *************** process_init_constructor (type, init, el *** 664,681 **** for each element of this aggregate. Chain them together in result. If there are too few, use 0 for each scalar ultimate component. */ ! if (TREE_CODE (type) == ARRAY_TYPE) { - tree domain = TYPE_DOMAIN (type); register long len; register int i; ! if (domain) ! len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain)) ! - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain)) ! + 1); else ! len = -1; /* Take as many as there are */ for (i = 0; len < 0 || i < len; i++) { --- 659,684 ---- for each element of this aggregate. Chain them together in result. If there are too few, use 0 for each scalar ultimate component. */ ! if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE) { register long len; register int i; ! if (TREE_CODE (type) == ARRAY_TYPE) ! { ! tree domain = TYPE_DOMAIN (type); ! if (domain) ! len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain)) ! - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain)) ! + 1); ! else ! len = -1; /* Take as many as there are */ ! } else ! { ! /* Vectors are like simple fixed-size arrays. */ ! len = TYPE_VECTOR_SUBPARTS (type); ! } for (i = 0; len < 0 || i < len; i++) { *************** process_init_constructor (type, init, el *** 826,849 **** /* Warn when some struct elements are implicitly initialized. */ if (extra_warnings && (!init || TREE_HAS_CONSTRUCTOR (init))) ! cp_warning ("missing initializer for member `%D'", field); } else { if (TREE_READONLY (field)) ! cp_error ("uninitialized const member `%D'", field); else if (TYPE_LANG_SPECIFIC (TREE_TYPE (field)) && CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field))) ! cp_error ("member `%D' with uninitialized const fields", field); else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) ! cp_error ("member `%D' is uninitialized reference", field); /* Warn when some struct elements are implicitly initialized to zero. */ if (extra_warnings && (!init || TREE_HAS_CONSTRUCTOR (init))) ! cp_warning ("missing initializer for member `%D'", field); /* The default zero-initialization is fine for us; don't add anything to the CONSTRUCTOR. */ --- 829,852 ---- /* Warn when some struct elements are implicitly initialized. */ if (extra_warnings && (!init || TREE_HAS_CONSTRUCTOR (init))) ! warning ("missing initializer for member `%D'", field); } else { if (TREE_READONLY (field)) ! error ("uninitialized const member `%D'", field); else if (TYPE_LANG_SPECIFIC (TREE_TYPE (field)) && CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field))) ! error ("member `%D' with uninitialized const fields", field); else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) ! error ("member `%D' is uninitialized reference", field); /* Warn when some struct elements are implicitly initialized to zero. */ if (extra_warnings && (!init || TREE_HAS_CONSTRUCTOR (init))) ! warning ("missing initializer for member `%D'", field); /* The default zero-initialization is fine for us; don't add anything to the CONSTRUCTOR. */ *************** process_init_constructor (type, init, el *** 892,898 **** if (temp) field = temp, win = 1; else ! cp_error ("no field `%D' in union being initialized", TREE_PURPOSE (tail)); } if (!win) --- 895,901 ---- if (temp) field = temp, win = 1; else ! error ("no field `%D' in union being initialized", TREE_PURPOSE (tail)); } if (!win) *************** process_init_constructor (type, init, el *** 900,906 **** } else if (field == 0) { ! cp_error ("union `%T' with no named members cannot be initialized", type); TREE_VALUE (tail) = error_mark_node; } --- 903,909 ---- } else if (field == 0) { ! error ("union `%T' with no named members cannot be initialized", type); TREE_VALUE (tail) = error_mark_node; } *************** process_init_constructor (type, init, el *** 912,918 **** next1 = digest_init (TREE_TYPE (field), TREE_VALUE (tail), &tail1); if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST) ! my_friendly_abort (357); tail = tail1; } else --- 915,921 ---- next1 = digest_init (TREE_TYPE (field), TREE_VALUE (tail), &tail1); if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST) ! abort (); tail = tail1; } else *************** build_scoped_ref (datum, basetype) *** 980,991 **** tree basetype; { tree ref; if (datum == error_mark_node) return error_mark_node; ref = build_unary_op (ADDR_EXPR, datum, 0); ! ref = convert_pointer_to (basetype, ref); return build_indirect_ref (ref, "(compiler error in build_scoped_ref)"); } --- 983,1001 ---- tree basetype; { tree ref; + tree binfo; if (datum == error_mark_node) return error_mark_node; + binfo = lookup_base (TREE_TYPE (datum), basetype, ba_check, NULL); + if (binfo == error_mark_node) + return error_mark_node; + if (!binfo) + return error_not_base_type (TREE_TYPE (datum), basetype); + ref = build_unary_op (ADDR_EXPR, datum, 0); ! ref = build_base_path (PLUS_EXPR, ref, binfo, 1); return build_indirect_ref (ref, "(compiler error in build_scoped_ref)"); } *************** build_x_arrow (datum) *** 1047,1053 **** if (last_rval == NULL_TREE) { ! cp_error ("base operand of `->' has non-pointer type `%T'", type); return error_mark_node; } --- 1057,1063 ---- if (last_rval == NULL_TREE) { ! error ("base operand of `->' has non-pointer type `%T'", type); return error_mark_node; } *************** build_x_arrow (datum) *** 1058,1064 **** last_rval = default_conversion (rval); if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE) ! return build_indirect_ref (last_rval, NULL_PTR); if (types_memoized) error ("result of `operator->()' yields non-pointer result"); --- 1068,1074 ---- last_rval = default_conversion (rval); if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE) ! return build_indirect_ref (last_rval, NULL); if (types_memoized) error ("result of `operator->()' yields non-pointer result"); *************** build_m_component_ref (datum, component) *** 1093,1098 **** --- 1103,1109 ---- return build_min_nt (DOTSTAR_EXPR, datum, component); datum = decay_conversion (datum); + if (datum == error_mark_node || component == error_mark_node) return error_mark_node; *************** build_m_component_ref (datum, component) *** 1107,1157 **** { type = TREE_TYPE (TREE_TYPE (component)); field_type = TREE_TYPE (type); } else - type = error_mark_node; - - if (TREE_CODE (type) != OFFSET_TYPE && TREE_CODE (type) != METHOD_TYPE) { ! cp_error ("`%E' cannot be used as a member pointer, since it is of type `%T'", component, TREE_TYPE (component)); return error_mark_node; } if (! IS_AGGR_TYPE (objtype)) { ! cp_error ("cannot apply member pointer `%E' to `%E'", component, datum); ! cp_error ("which is of non-aggregate type `%T'", objtype); return error_mark_node; } ! binfo = get_binfo (TYPE_METHOD_BASETYPE (type), objtype, 1); ! if (binfo == NULL_TREE) { ! cp_error ("member type `%T::' incompatible with object type `%T'", TYPE_METHOD_BASETYPE (type), objtype); return error_mark_node; } else if (binfo == error_mark_node) return error_mark_node; - /* Compute the type of the field, as described in [expr.ref]. */ - type_quals = TYPE_UNQUALIFIED; - if (TREE_CODE (field_type) == REFERENCE_TYPE) - /* The standard says that the type of the result should be the - type referred to by the reference. But for now, at least, we - do the conversion from reference type later. */ - ; - else - { - type_quals = (CP_TYPE_QUALS (field_type) - | CP_TYPE_QUALS (TREE_TYPE (datum))); - - /* There's no such thing as a mutable pointer-to-member, so we don't - need to deal with that here like we do in build_component_ref. */ - field_type = cp_build_qualified_type (field_type, type_quals); - } - component = build (OFFSET_REF, field_type, datum, component); if (TREE_CODE (type) == OFFSET_TYPE) component = resolve_offset_ref (component); --- 1118,1167 ---- { type = TREE_TYPE (TREE_TYPE (component)); field_type = TREE_TYPE (type); + + /* Compute the type of the field, as described in [expr.ref]. */ + type_quals = TYPE_UNQUALIFIED; + if (TREE_CODE (field_type) == REFERENCE_TYPE) + /* The standard says that the type of the result should be the + type referred to by the reference. But for now, at least, + we do the conversion from reference type later. */ + ; + else + { + type_quals = (cp_type_quals (field_type) + | cp_type_quals (TREE_TYPE (datum))); + + /* There's no such thing as a mutable pointer-to-member, so + we don't need to deal with that here like we do in + build_component_ref. */ + field_type = cp_build_qualified_type (field_type, type_quals); + } } else { ! error ("`%E' cannot be used as a member pointer, since it is of type `%T'", component, TREE_TYPE (component)); return error_mark_node; } if (! IS_AGGR_TYPE (objtype)) { ! error ("cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'", ! component, datum, objtype); return error_mark_node; } ! binfo = lookup_base (objtype, TYPE_METHOD_BASETYPE (type), ! ba_check, NULL); ! if (!binfo) { ! error ("member type `%T::' incompatible with object type `%T'", TYPE_METHOD_BASETYPE (type), objtype); return error_mark_node; } else if (binfo == error_mark_node) return error_mark_node; component = build (OFFSET_REF, field_type, datum, component); if (TREE_CODE (type) == OFFSET_TYPE) component = resolve_offset_ref (component); *************** build_functional_cast (exp, parms) *** 1182,1188 **** type = lookup_name (exp, 1); if (!type || TREE_CODE (type) != TYPE_DECL) { ! cp_error ("`%T' fails to be a typedef or built-in type", exp); return error_mark_node; } type = TREE_TYPE (type); --- 1192,1198 ---- type = lookup_name (exp, 1); if (!type || TREE_CODE (type) != TYPE_DECL) { ! error ("`%T' fails to be a typedef or built-in type", exp); return error_mark_node; } type = TREE_TYPE (type); *************** add_exception_specifier (list, spec, com *** 1289,1297 **** ok = is_ptr; else if (TREE_CODE (core) == TEMPLATE_TYPE_PARM) ok = 1; else ok = COMPLETE_TYPE_P (complete_type (core)); ! if (ok) { tree probe; --- 1299,1309 ---- ok = is_ptr; else if (TREE_CODE (core) == TEMPLATE_TYPE_PARM) ok = 1; + else if (processing_template_decl) + ok = 1; else ok = COMPLETE_TYPE_P (complete_type (core)); ! if (ok) { tree probe; diff -Nrc3pad gcc-3.0.4/gcc/cp/xref.c gcc-3.1/gcc/cp/xref.c *** gcc-3.0.4/gcc/cp/xref.c Thu Nov 2 19:03:58 2000 --- gcc-3.1/gcc/cp/xref.c Thu Jan 1 00:00:00 1970 *************** *** 1,836 **** - /* Code for handling XREF output from GNU C++. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 2000 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - - This file is part of GNU CC. - - GNU CC is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU CC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU CC; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - - - #include "config.h" - #include "system.h" - #include "tree.h" - #include "cp-tree.h" - #include "input.h" - #include "toplev.h" - - /* The character(s) used to join a directory specification (obtained with - getwd or equivalent) with a non-absolute file name. */ - - #ifndef FILE_NAME_JOINER - #define FILE_NAME_JOINER "/" - #endif - - /* Nonzero if NAME as a file name is absolute. */ - #ifndef FILE_NAME_ABSOLUTE_P - #define FILE_NAME_ABSOLUTE_P(NAME) (NAME[0] == '/') - #endif - - /* For cross referencing. */ - - int flag_gnu_xref; - - /************************************************************************/ - /* */ - /* Common definitions */ - /* */ - /************************************************************************/ - - #ifndef TRUE - #define TRUE 1 - #endif - #ifndef FALSE - #define FALSE 0 - #endif - - #define PALLOC(typ) ((typ *) xcalloc(1,sizeof(typ))) - - - /* Return a malloc'd copy of STR. */ - #define SALLOC(str) ((char *) ((str) == NULL ? NULL : xstrdup (str))) - #define SFREE(str) (str != NULL && (free(str),0)) - - #define STREQL(s1,s2) (strcmp((s1),(s2)) == 0) - #define STRNEQ(s1,s2) (strcmp((s1),(s2)) != 0) - #define STRLSS(s1,s2) (strcmp((s1),(s2)) < 0) - #define STRLEQ(s1,s2) (strcmp((s1),(s2)) <= 0) - #define STRGTR(s1,s2) (strcmp((s1),(s2)) > 0) - #define STRGEQ(s1,s2) (strcmp((s1),(s2)) >= 0) - - /************************************************************************/ - /* */ - /* Type definitions */ - /* */ - /************************************************************************/ - - - typedef struct _XREF_FILE * XREF_FILE; - typedef struct _XREF_SCOPE * XREF_SCOPE; - - typedef struct _XREF_FILE - { - const char *name; - const char *outname; - XREF_FILE next; - } XREF_FILE_INFO; - - typedef struct _XREF_SCOPE - { - int gid; - int lid; - XREF_FILE file; - int start; - XREF_SCOPE outer; - } XREF_SCOPE_INFO; - - /************************************************************************/ - /* */ - /* Local storage */ - /* */ - /************************************************************************/ - - static char doing_xref = 0; - static FILE * xref_file = NULL; - static char xref_name[1024]; - static XREF_FILE all_files = NULL; - static char * wd_name = NULL; - static XREF_SCOPE cur_scope = NULL; - static int scope_ctr = 0; - static XREF_FILE last_file = NULL; - static tree last_fndecl = NULL; - - /************************************************************************/ - /* */ - /* Forward definitions */ - /* */ - /************************************************************************/ - static void gen_assign PARAMS ((XREF_FILE, tree)); - static XREF_FILE find_file PARAMS ((const char *)); - static const char * filename PARAMS ((XREF_FILE)); - static const char * fctname PARAMS ((tree)); - static const char * declname PARAMS ((tree)); - static void simplify_type PARAMS ((char *)); - static const char * fixname PARAMS ((const char *, char *)); - static void open_xref_file PARAMS ((const char *)); - static const char * classname PARAMS ((tree)); - - /* Start cross referencing. FILE is the name of the file we xref. */ - - void - GNU_xref_begin (file) - const char *file; - { - doing_xref = 1; - - if (file != NULL && STRNEQ (file,"-")) - { - open_xref_file(file); - GNU_xref_file(file); - } - } - - /* Finish cross-referencing. ERRCNT is the number of errors - we encountered. */ - - void - GNU_xref_end (ect) - int ect; - { - XREF_FILE xf; - - if (!doing_xref) return; - - xf = find_file (input_filename); - if (xf == NULL) return; - - while (cur_scope != NULL) - GNU_xref_end_scope(cur_scope->gid,0,0,0); - - doing_xref = 0; - - if (xref_file == NULL) return; - - fclose (xref_file); - - xref_file = NULL; - all_files = NULL; - - if (ect > 0) unlink (xref_name); - } - - /* Write out xref for file named NAME. */ - - void - GNU_xref_file (name) - const char *name; - { - XREF_FILE xf; - - if (!doing_xref || name == NULL) return; - - if (xref_file == NULL) - { - open_xref_file (name); - if (!doing_xref) return; - } - - if (all_files == NULL) - fprintf(xref_file,"SCP * 0 0 0 0 RESET\n"); - - xf = find_file (name); - if (xf != NULL) return; - - xf = PALLOC (XREF_FILE_INFO); - xf->name = SALLOC (name); - xf->next = all_files; - all_files = xf; - - if (wd_name == NULL) - wd_name = getpwd (); - - if (FILE_NAME_ABSOLUTE_P (name) || ! wd_name) - xf->outname = xf->name; - else - { - char *nmbuf - = (char *) xmalloc (strlen (wd_name) + strlen (FILE_NAME_JOINER) - + strlen (name) + 1); - sprintf (nmbuf, "%s%s%s", wd_name, FILE_NAME_JOINER, name); - name = nmbuf; - xf->outname = nmbuf; - } - - fprintf (xref_file, "FIL %s %s 0\n", name, wd_name); - - filename (xf); - fctname (NULL); - } - - /* Start a scope identified at level ID. */ - - void - GNU_xref_start_scope (id) - HOST_WIDE_INT id; - { - XREF_SCOPE xs; - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file (input_filename); - - xs = PALLOC (XREF_SCOPE_INFO); - xs->file = xf; - xs->start = lineno; - if (xs->start <= 0) xs->start = 1; - xs->gid = id; - xs->lid = ++scope_ctr; - xs->outer = cur_scope; - cur_scope = xs; - } - - /* Finish a scope at level ID. - INID is ??? - PRM is ??? - KEEP is nonzero iff this scope is retained (nonzero if it's - a compiler-generated invisible scope). - TRNS is ??? */ - - void - GNU_xref_end_scope (id,inid,prm,keep) - HOST_WIDE_INT id; - HOST_WIDE_INT inid; - int prm,keep; - { - XREF_FILE xf; - XREF_SCOPE xs,lxs,oxs; - const char *stype; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - lxs = NULL; - for (xs = cur_scope; xs != NULL; xs = xs->outer) - { - if (xs->gid == id) break; - lxs = xs; - } - if (xs == NULL) return; - - if (inid != 0) { - for (oxs = cur_scope; oxs != NULL; oxs = oxs->outer) { - if (oxs->gid == inid) break; - } - if (oxs == NULL) return; - inid = oxs->lid; - } - - if (prm == 2) stype = "SUE"; - else if (prm != 0) stype = "ARGS"; - else if (keep == 2 || inid != 0) stype = "INTERN"; - else stype = "EXTERN"; - - fprintf (xref_file, "SCP %s %d %d %d ", - filename (xf), xs->start, lineno,xs->lid); - fprintf (xref_file, HOST_WIDE_INT_PRINT_DEC, inid); - fprintf (xref_file, " %s\n", stype); - - if (lxs == NULL) cur_scope = xs->outer; - else lxs->outer = xs->outer; - - free (xs); - } - - /* Output a reference to NAME in FNDECL. */ - - void - GNU_xref_ref (fndecl,name) - tree fndecl; - const char *name; - { - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - fprintf (xref_file, "REF %s %d %s %s\n", - filename (xf), lineno, fctname (fndecl), name); - } - - /* Output a reference to DECL in FNDECL. */ - - void - GNU_xref_decl (fndecl,decl) - tree fndecl; - tree decl; - { - XREF_FILE xf,xf1; - const char *cls = 0; - const char *name; - char buf[10240]; - int uselin; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - uselin = FALSE; - - if (TREE_CODE (decl) == TYPE_DECL) cls = "TYPEDEF"; - else if (TREE_CODE (decl) == FIELD_DECL) cls = "FIELD"; - else if (TREE_CODE (decl) == VAR_DECL) - { - if (fndecl == NULL && TREE_STATIC(decl) - && TREE_READONLY(decl) && DECL_INITIAL(decl) != 0 - && !TREE_PUBLIC(decl) && !DECL_EXTERNAL(decl) - && DECL_MODE(decl) != BLKmode) cls = "CONST"; - else if (DECL_EXTERNAL(decl)) cls = "EXTERN"; - else if (TREE_PUBLIC(decl)) cls = "EXTDEF"; - else if (TREE_STATIC(decl)) cls = "STATIC"; - else if (DECL_REGISTER(decl)) cls = "REGISTER"; - else cls = "AUTO"; - } - else if (TREE_CODE (decl) == PARM_DECL) cls = "PARAM"; - else if (TREE_CODE (decl) == FIELD_DECL) cls = "FIELD"; - else if (TREE_CODE (decl) == CONST_DECL) cls = "CONST"; - else if (TREE_CODE (decl) == FUNCTION_DECL) - { - if (DECL_EXTERNAL (decl)) cls = "EXTERN"; - else if (TREE_PUBLIC (decl)) cls = "EFUNCTION"; - else cls = "SFUNCTION"; - } - else if (TREE_CODE (decl) == LABEL_DECL) cls = "LABEL"; - else if (TREE_CODE (decl) == UNION_TYPE) - { - cls = "UNIONID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == RECORD_TYPE) - { - if (CLASSTYPE_DECLARED_CLASS (decl)) cls = "CLASSID"; - else cls = "STRUCTID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == ENUMERAL_TYPE) - { - cls = "ENUMID"; - decl = TYPE_NAME (decl); - uselin = TRUE; - } - else if (TREE_CODE (decl) == TEMPLATE_DECL) - { - if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL) - cls = "CLASSTEMP"; - else if (TREE_CODE (DECL_RESULT (decl)) == FUNCTION_DECL) - cls = "FUNCTEMP"; - else if (TREE_CODE (DECL_RESULT (decl)) == VAR_DECL) - cls = "VARTEMP"; - else - my_friendly_abort (358); - uselin = TRUE; - } - else cls = "UNKNOWN"; - - if (decl == NULL || DECL_NAME (decl) == NULL) return; - - if (uselin && decl->decl.linenum > 0 && decl->decl.filename != NULL) - { - xf1 = find_file (decl->decl.filename); - if (xf1 != NULL) - { - lineno = decl->decl.linenum; - xf = xf1; - } - } - - if (DECL_ASSEMBLER_NAME (decl)) - name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - else - name = IDENTIFIER_POINTER (DECL_NAME (decl)); - - strcpy (buf, type_as_string (TREE_TYPE (decl), 0)); - simplify_type (buf); - - fprintf (xref_file, "DCL %s %d %s %d %s %s %s\n", - filename(xf), lineno, name, - (cur_scope != NULL ? cur_scope->lid : 0), - cls, fctname(fndecl), buf); - - if (STREQL (cls, "STRUCTID") || STREQL (cls, "UNIONID")) - { - cls = "CLASSID"; - fprintf (xref_file, "DCL %s %d %s %d %s %s %s\n", - filename(xf), lineno,name, - (cur_scope != NULL ? cur_scope->lid : 0), - cls, fctname(fndecl), buf); - } - } - - /* Output a reference to a call to NAME in FNDECL. */ - - void - GNU_xref_call (fndecl, name) - tree fndecl; - const char *name; - { - XREF_FILE xf; - char buf[1024]; - const char *s; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - name = fixname (name, buf); - - for (s = name; *s != 0; ++s) - if (*s == '_' && s[1] == '_') break; - if (*s != 0) GNU_xref_ref (fndecl, name); - - fprintf (xref_file, "CAL %s %d %s %s\n", - filename (xf), lineno, name, fctname (fndecl)); - } - - /* Output cross-reference info about FNDECL. If non-NULL, - ARGS are the arguments for the function (i.e., before the FUNCTION_DECL - has been fully built). */ - - void - GNU_xref_function (fndecl, args) - tree fndecl; - tree args; - { - XREF_FILE xf; - int ct; - char buf[1024]; - - if (!doing_xref) return; - xf = find_file (input_filename); - if (xf == NULL) return; - - ct = 0; - buf[0] = 0; - if (args == NULL) args = DECL_ARGUMENTS (fndecl); - - GNU_xref_decl (NULL, fndecl); - - for ( ; args != NULL; args = TREE_CHAIN (args)) - { - GNU_xref_decl (fndecl,args); - if (ct != 0) strcat (buf,","); - strcat (buf, declname (args)); - ++ct; - } - - fprintf (xref_file, "PRC %s %d %s %d %d %s\n", - filename(xf), lineno, declname(fndecl), - (cur_scope != NULL ? cur_scope->lid : 0), - ct, buf); - } - - /* Output cross-reference info about an assignment to NAME. */ - - void - GNU_xref_assign(name) - tree name; - { - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file(input_filename); - if (xf == NULL) return; - - gen_assign(xf, name); - } - - static void - gen_assign(xf, name) - XREF_FILE xf; - tree name; - { - const char *s; - - s = NULL; - - switch (TREE_CODE (name)) - { - case IDENTIFIER_NODE : - s = IDENTIFIER_POINTER(name); - break; - case VAR_DECL : - s = declname(name); - break; - case COMPONENT_REF : - gen_assign(xf, TREE_OPERAND(name, 0)); - gen_assign(xf, TREE_OPERAND(name, 1)); - break; - case INDIRECT_REF : - case OFFSET_REF : - case ARRAY_REF : - case BUFFER_REF : - gen_assign(xf, TREE_OPERAND(name, 0)); - break; - case COMPOUND_EXPR : - gen_assign(xf, TREE_OPERAND(name, 1)); - break; - default : - break; - } - - if (s != NULL) - fprintf(xref_file, "ASG %s %d %s\n", filename(xf), lineno, s); - } - - static const char * - classname (cls) - tree cls; - { - if (cls && TYPE_P (cls)) - cls = TYPE_NAME (cls); - if (cls && DECL_P (cls)) - cls = DECL_NAME (cls); - if (cls && TREE_CODE (cls) == IDENTIFIER_NODE) - return IDENTIFIER_POINTER (cls); - return "?"; - } - - /* Output cross-reference info about a class hierarchy. - CLS is the class type of interest. BASE is a baseclass - for CLS. PUB and VIRT give the access info about - the class derivation. FRND is nonzero iff BASE is a friend - of CLS. - - ??? Needs to handle nested classes. */ - - void - GNU_xref_hier(cls, base, pub, virt, frnd) - tree cls; - tree base; - int pub; - int virt; - int frnd; - { - XREF_FILE xf; - - if (!doing_xref) return; - xf = find_file(input_filename); - if (xf == NULL) return; - - fprintf(xref_file, "HIE %s %d %s %s %d %d %d\n", - filename(xf), lineno, classname (cls), classname (base), - pub, virt, frnd); - } - - /* Output cross-reference info about class members. CLS - is the containing type; FLD is the class member. */ - - void - GNU_xref_member(cls, fld) - tree cls; - tree fld; - { - XREF_FILE xf; - const char *prot; - int confg, pure; - const char *d; - #ifdef XREF_SHORT_MEMBER_NAMES - int i; - #endif - char buf[1024], bufa[1024]; - - if (!doing_xref) return; - xf = find_file(fld->decl.filename); - if (xf == NULL) return; - - if (TREE_PRIVATE (fld)) prot = "PRIVATE"; - else if (TREE_PROTECTED(fld)) prot = "PROTECTED"; - else prot = "PUBLIC"; - - confg = 0; - if (TREE_CODE (fld) == FUNCTION_DECL && DECL_CONST_MEMFUNC_P(fld)) - confg = 1; - else if (TREE_CODE (fld) == CONST_DECL) - confg = 1; - - pure = 0; - if (TREE_CODE (fld) == FUNCTION_DECL && DECL_PURE_VIRTUAL_P(fld)) - pure = 1; - - d = IDENTIFIER_POINTER(cls); - sprintf(buf, "%d%s", (int) strlen(d), d); - #ifdef XREF_SHORT_MEMBER_NAMES - i = strlen(buf); - #endif - strcpy(bufa, declname(fld)); - - #ifdef XREF_SHORT_MEMBER_NAMES - for (p = &bufa[1]; *p != 0; ++p) - { - if (p[0] == '_' && p[1] == '_' && p[2] >= '0' && p[2] <= '9') { - if (strncmp(&p[2], buf, i) == 0) *p = 0; - break; - } - else if (p[0] == '_' && p[1] == '_' && p[2] == 'C' && p[3] >= '0' && p[3] <= '9') { - if (strncmp(&p[3], buf, i) == 0) *p = 0; - break; - } - } - #endif - - fprintf(xref_file, "MEM %s %d %s %s %s %d %d %d %d %d %d %d\n", - filename(xf), fld->decl.linenum, d, bufa, prot, - (TREE_CODE (fld) == FUNCTION_DECL ? 0 : 1), - (DECL_INLINE (fld) ? 1 : 0), - (DECL_LANG_SPECIFIC(fld) && DECL_FRIEND_P(fld) ? 1 : 0), - (DECL_VINDEX(fld) ? 1 : 0), - (TREE_STATIC(fld) ? 1 : 0), - pure, confg); - } - - /* Find file entry given name. */ - - static XREF_FILE - find_file(name) - const char *name; - { - XREF_FILE xf; - - for (xf = all_files; xf != NULL; xf = xf->next) { - if (STREQL(name, xf->name)) break; - } - - return xf; - } - - /* Return filename for output purposes. */ - - static const char * - filename(xf) - XREF_FILE xf; - { - if (xf == NULL) { - last_file = NULL; - return "*"; - } - - if (last_file == xf) return "*"; - - last_file = xf; - - return xf->outname; - } - - /* Return function name for output purposes. */ - - static const char * - fctname(fndecl) - tree fndecl; - { - static char fctbuf[1024]; - const char *s; - - if (fndecl == NULL && last_fndecl == NULL) return "*"; - - if (fndecl == NULL) - { - last_fndecl = NULL; - return "*TOP*"; - } - - if (fndecl == last_fndecl) return "*"; - - last_fndecl = fndecl; - - s = declname(fndecl); - s = fixname(s, fctbuf); - - return s; - } - - /* Return decl name for output purposes. */ - - static const char * - declname(dcl) - tree dcl; - { - if (DECL_NAME (dcl) == NULL) return "?"; - - if (DECL_ASSEMBLER_NAME (dcl)) - return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (dcl)); - else - return IDENTIFIER_POINTER (DECL_NAME (dcl)); - } - - /* Simplify a type string by removing unneeded parenthesis. */ - - static void - simplify_type(typ) - char *typ; - { - char *s; - int lvl, i; - - i = strlen(typ); - while (i > 0 && ISSPACE((unsigned char) typ[i-1])) typ[--i] = 0; - - if (i > 7 && STREQL(&typ[i-5], "const")) - { - typ[i-5] = 0; - i -= 5; - } - - if (typ[i-1] != ')') return; - - s = &typ[i-2]; - lvl = 1; - while (*s != 0) { - if (*s == ')') ++lvl; - else if (*s == '(') - { - --lvl; - if (lvl == 0) - { - s[1] = ')'; - s[2] = 0; - break; - } - } - --s; - } - - if (*s != 0 && s[-1] == ')') - { - --s; - --s; - if (*s == '(') s[2] = 0; - else if (*s == ':') { - while (*s != '(') --s; - s[1] = ')'; - s[2] = 0; - } - } - } - - /* Fixup a function name (take care of embedded spaces). */ - - static const char * - fixname(nam, buf) - const char *nam; - char *buf; - { - const char *s; - char *t; - int fg; - - s = nam; - t = buf; - fg = 0; - - while (*s != 0) - { - if (*s == ' ') - { - *t++ = '\36'; - ++fg; - } - else *t++ = *s; - ++s; - } - *t = 0; - - if (fg == 0) return nam; - - return buf; - } - - /* Open file for xreffing. */ - - static void - open_xref_file(file) - const char *file; - { - const char *s; - char *t; - - #ifdef XREF_FILE_NAME - XREF_FILE_NAME (xref_name, file); - #else - s = strrchr (file, '/'); - if (s == NULL) - sprintf (xref_name, ".%s.gxref", file); - else - { - ++s; - strcpy (xref_name, file); - t = strrchr (xref_name, '/'); - ++t; - *t++ = '.'; - strcpy (t, s); - strcat (t, ".gxref"); - } - #endif /* no XREF_FILE_NAME */ - - xref_file = fopen(xref_name, "w"); - - if (xref_file == NULL) - { - error("Can't create cross-reference file `%s'", xref_name); - doing_xref = 0; - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libstdc++-v3/ChangeLog gcc-3.1/libstdc++-v3/ChangeLog *** gcc-3.0.4/libstdc++-v3/ChangeLog Wed Feb 20 18:47:18 2002 --- gcc-3.1/libstdc++-v3/ChangeLog Wed May 15 02:25:24 2002 *************** *** 1,3781 **** ! 2002-02-20 Release Manager ! ! * GCC 3.0.4 Released. ! ! 2001-02-14 Joel Sherrill ! ! * config/cpu/m68k/bits/atomicity.h: Corrected for RTEMS targets which ! do not have a CAS instruction. ! ! 2002-01-28 Jens Rehsack ! ! libstdc++/3561 ! * include/bits/ostream.tcc (__pad_char): Support -Wshadow -Werror. ! ! 2002-01-23 Richard Henderson ! PR libstdc++/5198 ! * config/cpu/m68k/bits/atomicity.h (__exchange_and_add): Only use ! CAS on the cpu variants that support it. Add versions that use ! TAS and that disable interrupts. ! (__atomic_add): Use __exchange_and_add to guarantee atomicity. ! 2002-01-18 David Edelsohn ! (copy from trunk 2002-01-17 2002-01-16) ! * configure.target: Define OPT_LDFLAGS for AIX case. ! * acinclude.m4 (GLIBCPP_CHECK_LINKER_FEATURES): Do not clear ! SECTION_LDFLAGS and OPT_LDFLAGS. Fix ac_sectionLDflags type. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2002-01-16 Benjamin Kosnik ! ! ! libstdc++/3272 (copy from trunk 2001-06-11) ! libstdc++/5181 ! * include/bits/streambuf.tcc (__copy_streambufs): Don't set eofbit. ! * testsuite/27_io/ostream_inserter_other.cc (test04): Add test. ! * testsuite/27_io/istream_extractor_other.cc: Fix. ! 2002-01-15 Loren Rittle ! * include/Makefile.am (extra_target_headers): New list of all ! target files built with ad hoc naming rules. ! (stamp-*): Handle LN_S failure in manner portable across make ! implementations. ! (install-data-local): Install header files from human-maintained ! file lists and directory components instead of non-robust find. ! * include/Makefile.in: Rebuilt. ! 2002-01-14 Benjamin Kosnik ! * src/Makefile.am (libstdc___la_LDFLAGS): Increase revision number. ! * src/Makefile.in: Regenerate. ! 2002-01-02 Nathan Myers ! Loren Rittle ! libstdc++/5037 (copy from trunk 2001-12-07 and 2001-12-11) ! * config/cpu/sparc/sparc32/bits/atomicity.h ! (struct __Atomicity_lock<__inst>): Add. ! (__Atomicity_lock<__inst>::_S_atomicity_lock): Add. ! (__Atomicity_lock<0>::_S_atomicity_lock): Add. ! (__exchange_and_add): Use __Atomicity_lock<0>::_S_atomicity_lock ! instead of lock local to static function. ! (__atomic_add): Likewise. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. ! 2001-12-13 Phil Edwards ! Bulk documentation merge (copy) from trunk. ! * docs/html/Makefile, docs/html/documentation.html, ! docs/html/explanations.html, docs/html/17_intro/BUGS, ! docs/html/17_intro/C++STYLE, docs/html/17_intro/CHECKLIST, ! docs/html/17_intro/DESIGN, docs/html/17_intro/TODO, ! docs/html/17_intro/howto.html, docs/html/17_intro/license.html, ! docs/html/17_intro/porting-howto.html, ! docs/html/17_intro/porting-howto.xml, docs/html/17_intro/porting.html, ! docs/html/17_intro/porting.texi, docs/html/18_support/howto.html, ! docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html, ! docs/html/21_strings/howto.html, docs/html/23_containers/howto.html, ! docs/html/26_numerics/howto.html, docs/html/27_io/howto.html, ! docs/html/ext/howto.html, docs/html/ext/lwg-active.html, ! docs/html/ext/lwg-defects.html, docs/html/ext/sgiexts.html, ! docs/html/faq/index.html, docs/html/faq/index.txt: Merge from trunk. ! 2001-12-10 Philip Martin ! PR libstdc++/3720 ! * include/bits/locale_facets.h ! (_M_extract_buffer_length): Add this constant. ! * include/bits/locale_facet.tcc ! (do_get): Use _M_extract_buffer_length. ! * src/locale.cc ! (_M_extract): Set failbit if buffer gets filled while ! extracting characters. ! * testsuite/27_io/istream_extractor_arith.cc ! (tes12_aux, test12, test13): Add, ported from trunk. ! 2001-12-09 Edward E. Meyer ! PR libstdc++/4622 (copy from trunk 2001-10-31) ! * include/bits/std_complex.h (complex::operator/=): Correct sign. ! 2001-11-21 Paolo Carlini ! PR libstdc++/4548 ! * include/bits/basic_string.tcc (basic_string::reserve): Never shrink ! below the current size. ! * testsuite/21_strings/capacity.cc (test02): Add test. ! 2001-11-16 Paolo Carlini ! * include/bits/stl_deque.h (deque::erase()): Fix memory leak. ! 2001-11-09 Phil Edwards ! * acinclude.m4 (GLIBCPP_ENABLE_LONG_LONG): Run the test in ! LANG_CPLUSPLUS mode. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-11-02 Phil Edwards ! * acconfig.h: Update comments. ! * acinclude.m4 (GLIBCPP_ENABLE_C99): Move strtoll, strtoull tests... ! (GLIBCPP_ENABLE_LONG_LONG): ...to here. Don't check enable_c99. ! * aclocal.m4: Regenerate. ! * config.h.in: Regenerate. ! * configure: Regenerate. ! * include/bits/boost_concept_check.h: Unconditionally compile uses ! of 'long long' which require only compiler support, not C lib support. ! * include/bits/cpp_type_traits.h: Likewise. ! * include/bits/std_limits.h: Likewise. ! * include/bits/type_traits.h: Likewise. ! * src/limits.cc: Likewise. ! * include/c_shadow/stdlib.h: Compile conditionally on _GLIBCPP_USE_C99 ! instead of _GLIBCPP_USE_LONG_LONG. ! * include/c_shadow/bits/std_cstdlib.h: Likewise. ! 2001-11-01 Gabriel Dos Reis ! * include/bits/std_complex.h (_Norm_helper): New class template. ! (norm): Tweak. ! (std): Tweak. ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-10-19 Phil Edwards ! Bulk documentation merge (copy) from trunk. ! * docs/html/17_intro/COPYING.DOC, docs/html/17_intro/license.html, ! docs/html/22_locale/messages.html, docs/html/ext/lwg-active.html, ! docs/html/ext/lwg-defects.html, docs/html/ext/sgiexts.html: New. ! * docs/html/configopts.html, docs/html/documentation.html, ! docs/html/explanations.html, docs/html/install.html, ! docs/html/17_intro/howto.html, docs/html/18_support/howto.html, ! docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html, ! docs/html/21_strings/howto.html, docs/html/22_locale/codecvt.html, ! docs/html/22_locale/ctype.html, docs/html/22_locale/howto.html, ! docs/html/22_locale/locale.html, docs/html/23_containers/howto.html, ! docs/html/24_iterators/howto.html, docs/html/25_algorithms/howto.html, ! docs/html/26_numerics/howto.html, docs/html/27_io/howto.html, ! docs/html/ext/howto.html, docs/html/faq/index.html, ! docs/html/faq/index.txt: Merge from trunk. ! 2001-10-07 Joseph S. Myers ! * docs/html/22_locale/locale.html: Fix spelling error of ! "separate" as "seperate". ! 2001-10-02 Rainer Orth ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Use ! correct multilib builddir. ! Properly locate libgcc_s. ! 2001-09-25 Phil Edwards ! * testsuite/21_strings/c_strings.cc (test01, test02): Increase ! `carray' size. ! 2001-09-14 Phil Edwards ! * docs/html/17_intro/headers_cc.txt: "Sync"/copy real file over. ! * docs/html/17_intro/howto.html: Spacing and HTML markup fixes. ! * docs/html/18_support/howto.html: It won't compile; it's not code. ! * docs/html/19_diagnostics/howto.html: Point diagram seekers to ! doxygen'd pages. ! * docs/html/22_locale/howto.html: Comment for future work. ! * docs/html/23_containers/howto.html: More comments. ! * docs/html/25_algorithms/howto.html: It's a comment, not a ! blunt command to the reader. (English grammar.) ! 2001-09-12 Gabriel Dos Reis ! * include/bits/std_limits.h (numeric_limits::radix, ! numeric_limits::epsilon: Fix thinko. ! 2001-09-10 Benjamin Kosnik ! ! * src/Makefile.am (libstdc___la_LDFLAGS): Increase revision number. ! * src/Makefile.in: Regenerate. ! 2001-09-04 Benjamin Kosnik ! * include/c_std/bits/std_c*.h: Don't use include_next. ! 2001-09-05 Phil Edwards ! * Makefile.am: The testsuite directory never needs to be made here. ! * Makefile.in: Regenerate. ! * include/Makefile.in: Regenerate. ! * libio/Makefile.in: Regenerate. ! * libmath/Makefile.in: Regenerate. ! * libsupc++/Makefile.in: Regenerate. ! * po/Makefile.in: Regenerate. ! * src/Makefile.in: Regenerate. ! * testsuite/Makefile.in: Regenerate. ! 2001-08-30 Loren J. Rittle ! PR libstdc++/4082 ! 2001-08-13 H.J. Lu (hjl@gnu.org) ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-copy-files): ! New. Copy files. ! (libstdc++-v3-init): Use it. ! 2001-08-28 Loren J. Rittle ! PR libstdc++/4082 ! * include/Makefile.am: Use toplevel_srcdir to refer to src files ! outside this component. ! * include/Makefile.in: Regenerate. ! 2001-08-28 Phil Edwards ! Move testsuite_hooks changes onto the branch. This is the 08-06 ! patch (on trunk) from pme, plus the 08-09 change from bkoz and the ! 08-10 fix from ljrittle, accumulated into one. ! * acconfig.h (_GLIBCPP_MEM_LIMITS): Define. ! * acinclude.m4 (GLIBCPP_CONFIGURE_TESTSUITE): New macro, calls... ! (GLIBCPP_CHECK_SETRLIMIT): ...this new macro, which also uses... ! (GLIBCPP_CHECK_SETRLIMIT_ancilliary): ...this new macro. ! * configure.in: Call GLIBCPP_CONFIGURE_TESTSUITE. ! * aclocal.m4: Regenerate. ! * config.h.in: Regenerate. ! * configure: Regenerate. ! * testsuite/lib/libstdc++-v3-dg.exp: Download new header instead ! of old header. ! * testsuite/debug_assert.h: Removed; contents merged into... ! * testsuite/testsuite_hooks.h: ...here. New file. ! * testsuite/17_intro/header_ciso646.cc: No longer include ! debug_assert.h, include testsuite_hooks.h instead. ! * testsuite/17_intro/header_fstream.cc: Likewise. ! * testsuite/17_intro/header_iomanip.cc: Likewise. ! * testsuite/17_intro/header_ios.cc: Likewise. ! * testsuite/17_intro/header_iosfwd.cc: Likewise. ! * testsuite/17_intro/header_iostream.cc: Likewise. ! * testsuite/17_intro/header_istream.cc: Likewise. ! * testsuite/17_intro/header_ostream.cc: Likewise. ! * testsuite/17_intro/header_sstream.cc: Likewise. ! * testsuite/17_intro/header_streambuf.cc: Likewise. ! * testsuite/18_support/numeric_limits.cc: Likewise. ! * testsuite/19_diagnostics/stdexceptions.cc: Likewise. ! * testsuite/20_util/auto_ptr.cc: Likewise. ! * testsuite/21_strings/append.cc: Likewise. ! * testsuite/21_strings/capacity.cc: Likewise. ! * testsuite/21_strings/char_traits_requirements.cc: Likewise. ! * testsuite/21_strings/compare.cc: Likewise. ! * testsuite/21_strings/ctor_copy_dtor.cc: Likewise. ! * testsuite/21_strings/element_access.cc: Likewise. ! * testsuite/21_strings/find.cc: Likewise. ! * testsuite/21_strings/insert.cc: Likewise. ! * testsuite/21_strings/inserters_extractors.cc: Likewise. ! * testsuite/21_strings/invariants.cc: Likewise. ! * testsuite/21_strings/nonmember.cc: Likewise. ! * testsuite/21_strings/operations.cc: Likewise. ! * testsuite/21_strings/replace.cc: Likewise. ! * testsuite/21_strings/rfind.cc: Likewise. ! * testsuite/21_strings/substr.cc: Likewise. ! * testsuite/22_locale/codecvt_char_char.cc: Likewise. ! * testsuite/22_locale/codecvt_unicode_char.cc: Likewise. ! * testsuite/22_locale/codecvt_unicode_wchar_t.cc: Likewise. ! * testsuite/22_locale/codecvt_wchar_t_char.cc: Likewise. ! * testsuite/22_locale/ctor_copy_dtor.cc: Likewise. ! * testsuite/22_locale/ctype_char_members.cc: Likewise. ! * testsuite/22_locale/ctype_wchar_t_members.cc: Likewise. ! * testsuite/22_locale/facet.cc: Likewise. ! * testsuite/22_locale/global_templates.cc: Likewise. ! * testsuite/22_locale/members.cc: Likewise. ! * testsuite/22_locale/numpunct_byname.cc: Likewise. ! * testsuite/22_locale/numpunct_char_members.cc: Likewise. ! * testsuite/22_locale/operators.cc: Likewise. ! * testsuite/22_locale/static_members.cc: Likewise. ! * testsuite/23_containers/bitset_ctor.cc: Likewise. ! * testsuite/23_containers/bitset_members.cc: Likewise. ! * testsuite/23_containers/bitset_shift.cc: Likewise. ! * testsuite/23_containers/map_insert.cc: Likewise. ! * testsuite/23_containers/vector_capacity.cc: Likewise. ! * testsuite/23_containers/vector_ctor.cc: Likewise. ! * testsuite/23_containers/vector_element_access.cc: Likewise. ! * testsuite/23_containers/vector_modifiers.cc: Likewise. ! * testsuite/24_iterators/istreambuf_iterator.cc: Likewise. ! * testsuite/24_iterators/iterator.cc: Likewise. ! * testsuite/24_iterators/ostreambuf_iterator.cc: Likewise. ! * testsuite/25_algorithms/lower_bound.cc: Likewise. ! * testsuite/25_algorithms/min_max.cc: Likewise. ! * testsuite/26_numerics/c_math.cc: Likewise. ! * testsuite/26_numerics/complex_inserters_extractors.cc: Likewise. ! * testsuite/26_numerics/complex_value.cc: Likewise. ! * testsuite/27_io/filebuf.cc: Likewise. ! * testsuite/27_io/filebuf_members.cc: Likewise. ! * testsuite/27_io/filebuf_virtuals.cc: Likewise. ! * testsuite/27_io/fpos.cc: Likewise. ! * testsuite/27_io/fstream_members.cc: Likewise. ! * testsuite/27_io/ifstream_members.cc: Likewise. ! * testsuite/27_io/ios_base_callbacks.cc: Likewise. ! * testsuite/27_io/ios_base_members_static.cc: Likewise. ! * testsuite/27_io/ios_base_storage.cc: Likewise. ! * testsuite/27_io/ios_ctor.cc: Likewise. ! * testsuite/27_io/ios_init.cc: Likewise. ! * testsuite/27_io/ios_manip_basefield.cc: Likewise. ! * testsuite/27_io/ios_manip_fmtflags.cc: Likewise. ! * testsuite/27_io/ios_members.cc: Likewise. ! * testsuite/27_io/istream_extractor_arith.cc: Likewise. ! * testsuite/27_io/istream_extractor_char.cc: Likewise. ! * testsuite/27_io/istream_extractor_other.cc: Likewise. ! * testsuite/27_io/istream_manip.cc: Likewise. ! * testsuite/27_io/istream_seeks.cc: Likewise. ! * testsuite/27_io/istream_sentry.cc: Likewise. ! * testsuite/27_io/istream_unformatted.cc: Likewise. ! * testsuite/27_io/istringstream_members.cc: Likewise. ! * testsuite/27_io/narrow_stream_objects.cc: Likewise. ! * testsuite/27_io/ofstream_members.cc: Likewise. ! * testsuite/27_io/ostream_inserter_arith.cc: Likewise. ! * testsuite/27_io/ostream_inserter_char.cc: Likewise. ! * testsuite/27_io/ostream_inserter_other.cc: Likewise. ! * testsuite/27_io/ostream_manip.cc: Likewise. ! * testsuite/27_io/ostream_seeks.cc: Likewise. ! * testsuite/27_io/ostream_unformatted.cc: Likewise. ! * testsuite/27_io/ostringstream_members.cc: Likewise. ! * testsuite/27_io/streambuf.cc: Likewise. ! * testsuite/27_io/stringbuf.cc: Likewise. ! * testsuite/27_io/stringbuf_virtuals.cc: Likewise. ! * testsuite/27_io/stringstream.cc: Likewise. ! * testsuite/27_io/stringstream_members.cc: Likewise. ! * testsuite/27_io/wide_stream_objects.cc: Likewise. ! 2001-08-28 Loren J. Rittle ! * testsuite/23_containers/map_insert.cc: (For 3.0 branch only:) ! Include debug_assert.h not testsuite_hooks.h. ! 2001-08-27 Phil Edwards ! PR libstdc++/4143 ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Handle enable/disable ! correctly for version-specific-runtime-libs. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-08-24 Benjamin Kosnik ! * include/Makefile.am (install-data-local): Don't install Makefile. ! * include/Makefile.in: Regenerated. ! ! 2001-08-24 Jan van Male ! * docs/html/17_intro/C++STYLE: Fix typo. ! 2001-08-24 Phil Edwards ! * docs/html/23_containers/howto.html: Describe implementation of ! insertion with hints. ! 2001-08-24 Sylvain Pion ! Phil Edwards ! PR libstdc++/3349 ! * include/bits/stl_tree.h (insert_unique): Revert last change. ! Values inserted at begin() must be less, not greater, than *begin()'s. ! * testsuite/23_containers/map_insert.cc: New file. ! 2001-08-23 David Edelsohn ! * config/os/gnu-linux/bits/os_defines.h: Correct __s390__ definitions. ! Set __powerpc__ long double definition based on __LONG_DOUBLE_128__. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-17 Loren J. Rittle ! bootstrap/3963 ! * include/Makefile.am: Use relative file path in rule to allow ! colon in $(objdir). ! * include/Makefile.in: Rebuilt. ! 2001-08-16 Franz Sirl ! * configure.target: Set LIMITSH for powerpc-*-*. ! * config/cpu/powerpc/bits/limits.h: New file. ! 2001-08-16 Marc Espie ! * libmath/mathconf.h: Include on OpenBSD (branch ! fix only, for robustness). ! 2001-08-15 Andreas Schwab ! * configure.target (cpu_include_dir): Set to `config/cpu/m68k' for ! m68k and m680[246]0. ! * config/cpu/m68k/bits/atomicity.h: New file. ! * include/bits/std_limits.h [__glibcpp_long_double_bits == 96]: ! Define appropriate long double limits for m68k extended floating ! point. ! (__glibcpp_f32_digits10): Corrected, off by one. ! (__glibcpp_f80_digits10): Likewise. ! (__glibcpp_f128_digits10): Likewise. ! * config/os/gnu-linux/bits/os_defines.h ! (__glibcpp_long_double_bits) [__mc68000__]: Define to 96. ! 2001-08-15 Gabriel Dos Reis ! * include/bits/std_limits.h (numeric_limits::max): Fix ! typo. ! 2001-08-14 Ulrich Weigand ! ! * configure.target (cpu_include_dir): Set to `config/cpu/s390' ! for s390 and s390x. ! ! * config/cpu/s390/bits/atomicity.h: New. ! 2001-08-14 Gabriel Dos Reis ! * include/bits/std_limits.h: Fix thinko. ! 2001-08-14 Benjamin Kosnik ! * src/Makefile.am (libstdc___la_LDFLAGS): Increase revision number. ! * src/Makefile.in: Regenerate. ! 2001-08-14 Peter Schmid ! ! * libstdc++-v3/libmath/stubs.c: Fix PR/3988, replace ! _GBLICPP_HAVE_LOGL with HAVE_LOGL ! ! 2001-08-13 Mark Mitchell ! ! * configure.in (LIMITS_INC_SRCDIR): New variable. ! * configure.target (LIMITSH): New variable. ! * porting.texi: Discuss numeric limits. ! * config/cpu/generic/bits/limits.h: New file. ! * config/cpu/i386/bits/limits.h: New file. ! * include/Makefile.am: Install bits/limits.h. ! * include/bits/c++config: Include bits/limits.h. ! 2001-08-10 Gabriel Dos Reis ! Mark Mitchell ! * include/bits/std_limits.h: New file. ! * include/Makefile.am (bits_headers): Add std_limits.h ! (all-local): std_limits.h is no longer built. ! (${target_builddir}/std_limits.h): Remove. ! * include/Makefile.in: Regenerate. ! * src/limits.cc: New file. ! * src/Makefile.am (sources): Add limits.cc in replacement of ! limitsMEMBERS.cc. ! * src/Makefile.in: Regenerate. ! ! 2001-08-09 David Edelsohn ! ! * config/os/aix/bits/os_defines.h: Define std_limits.h macros. ! * config/os/generic/bits/os_defines.h: Likewise. ! * config/os/gnu-linux/bits/os_defines.h: Likewise. ! * config/os/hpux/bits/os_defines.h: Likewise. ! * config/os/irix/irix6.5/bits/os_defines.h: Likewise. ! * config/os/solaris/solaris2.7/bits/os_defines.h: Likewise. ! ! 2001-08-10 Gunter Winkler ! ! * include/bits/std_complex.h (complex::operator*=, ! complex::operator/=): Fix thinko. ! ! 2001-07-31 Loren J. Rittle ! * src/gen-num-limits.cc: Use __LONG_LONG_MAX__. ! 2001-07-30 Benjamin Kosnik ! * configure.target: Remove mips from cpu table. ! * config/cpu/mips/bits/atomicity.h: Remove generic ! versions. Comment sgidefs include. ! 2001-07-26 Gabriel Dos Reis ! * acinclude.m4: CHECK_MATH_DECL_AND_LINKAGE for hypot, hypotf, ! hypotl, atan2f, atan2l. Remove from REPLACE_MATHFUNCS list. * aclocal.m4: Regenerate. ! * config.h.in: Likewise. ! * configure: Likewise. ! * libmath/Makefile.am (EXTRA_LONG_DOUBLE_yes): Remove hypotl.c ! (EXTRA_DIST): Remove hypot.c hypotf.c. ! * libmath/Makefile.am: Regenerate. ! * libmath/hypotf.c: Remove. ! * libmath/hypot.c: Likewise. ! * libmath/hypotl.c: Likewise. ! * libmath/stubs.c: The macros seen here are HAVE_xxx, not ! _GLIBCPP_HAVE_xxx. Add long double versions. ! ! 2001-07-26 Stephen M. Webb ! ! * acinclude.m4 (GLIBCPP_ENABLE_CHEADERS): Use glibcpp_srcdir when ! setting C_INCLUDE_DIR. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! ! 2001-07-26 Stephen M. Webb ! Loren J. Rittle ! Phil Edwards ! ! * include/Makefile.am: New file encapsulating header generation rules. ! * Makefile.am (SUBDIRS): Prepend 'include' directory. ! * acinclude.m4: Moved/removed rules for building various headers. ! * configure.in (AC_OUTPUT): Add include/Makefile. ! * mkc++config: Removed. ! ! * testsuite_flags.in: Changed build-includes to match new scheme. ! * mknumeric_limits: Likewise. ! * libio/Makefile.am: Changed INCLUDES to maatch new header scheme. ! * libmath/Makefile.am: Likewise. ! * libsupc++/Makefile.am: Likewise. ! * src/Makefile.am: Likewise; removed rules to build headers. ! * libmath/mathconf.h: Changed #include'd header names to match. ! * libmath/stubs.c: Likewise. ! * src/gen-num-limits.cc: Likewise. ! ! * configure: Regenerated. ! * config.h.in: Regenerated. ! * aclocal.m4: Regenerated. ! * Makefile.in: Regenerated. ! * include/Makefile.in: Regenerated. ! * libio/Makefile.in: Regenerated. ! * libmath/Makefile.in: Regenerated. ! * libsupc++/Makefile.in: Regenerated. ! * src/Makefile.in: Regenerated. ! * testsuite/Makefile.in: Regenerated. ! ! 2001-07-26 Daniel Jacobowitz ! ! * configure.in: Remove NATIVE, NULL_TARGET. ! Set CANADIAN only for Canadian crosses. Set xcompiling ! for both Canadian crosses and host-x-host crosses. ! * configure: Regenerated. ! 2001-07-25 H.J. Lu ! * configure.target (cpu_include_dir): Set to `config/cpu/mips' ! for mips. ! * config/cpu/mips/bits/atomicity.h: New. ! 2001-07-25 David Edelsohn ! * include/bits/limits_generic.h (int): Set digits and digits10 ! appropriately for word size. ! (unsigned int,long,unsigned long): Likewise. ! 2001-07-19 Phil Edwards ! Mark Mitchell ! Merge from cp-parser-branch. ! * include/bits/basic_string.h: Qualify symbols with 'template'. ! * include/bits/basic_string.tcc: Likewise. ! * include/bits/fstream.tcc: Likewise. ! * include/bits/istream.tcc: Likewise. ! * include/bits/sstream.tcc: Likewise. ! * include/bits/std_istream.h: Likewise. ! * include/bits/stl_iterator.h: Likewise. ! * include/bits/streambuf.tcc: Likewise. ! * src/gen-num-limits.cc: Add 'template<>' to specializations. ! * src/locale.cc: Likewise. ! 2001-07-19 Gabriel Dos Reis ! Bert De Knuydt ! * src/gen-num-limits.cc (set_signals_handler): New function. ! Factor out signals setting. Set signal handler for SIGILL. ! 2001-07-18 Phil Edwards ! * docs/html/27_io/howto.html: Fix typo. ! * docs/html/faq/index.html: Minor updates for 3.0 all around. ! * docs/html/faq/index.txt: Regenerated. ! 2001-07-13 Phil Edwards ! * include/bits/std_sstream.h (basic_stringbuf::basic_stringbuf(string): ! Initialize _M_string with pointer-and-size constructor, not just ! pointer. Fix some comments. ! * testsuite/21_strings/ctor_copy_dtor.cc (test03): New test. ! * testsuite/27_io/stringbuf.cc (test02): Remove unused variable. ! (test03): Add embedded-NUL tests. ! * mkcheck.in: When printing totals, match the order of the tests. ! * include/bits/stringfwd.h: Use same declaration keywords. ! * include/bits/std_iosfwd.h: Cosmetic spacing. ! 2001-07-11 Felix Natter ! * docs/html/17_intro/porting-howto.xml: Initial checkin of ! master copy. ! * docs/html/17_intro/porting-howto.html: check in v0.9.3 ! 2001-07-11 Phil Edwards ! * docs/doxygen/run_doxygen: Don't keep output from previous run. ! * docs/doxygen/user.cfg.in: Tweaks. ! * include/bits/c++config: Documentation comments for Doxygen. ! * include/bits/char_traits.h: Likewise. ! * include/bits/limits_generic.h: Likewise. ! * include/bits/std_stdexcept.h: Likewise. ! * include/bits/stl_pair.h: Likewise. ! * libsupc++/exception: Likewise. ! * libsupc++/new: Likewise. ! * libsupc++/typeinfo: Likewise. ! * libmath/Makefile.am: Update and correct copyright. ! 2001-07-10 Gabriel Dos Reis ! * acinclude.m4: Don't AC_REPLACE_MATHFUNCS expf and atan2f. ! * aclocal.m4: Regenerate. ! * configure: Same. ! 2001-07-09 Phil Edwards ! * docs/html/configopts.html: Fix thinko. ! * docs/html/27_io/howto.html: Fix thinko and HTML markup. ! * include/bits/stl_iterator.h: Fix typo. ! 2001-07-09 Phil Edwards ! * docs/html/explanations.html: New file. ! * docs/html/configopts.html: Link to it to provide more notes ! on cstdio. Minor markup and spacing fixes. ! * docs/html/27_io/howto.html: Talk about sync_with_stdio. ! 2001-07-09 Kriang Lerdsuwanakij ! * include/bits/valarray_meta.h (_Expr::operator+): Use qualified id ! for _Expr template template argument. ! (_Expr::operator-): Likewise. ! (_Expr::operator~): Likewise. ! (_Expr::operator!): Likewise. ! (_DEFINE_EXPR_UNARY_OPERATOR): Likewise. ! 2001-07-06 Gabriel Dos Reis ! * libmath/Makefile.am (EXTRA_DIST): Remove atan2f.c and expf.c ! * libmath/Makefile.in: Regenerate. ! * libmath/expf.c: Remove. ! * libmath/atan2f.c: Likewise. ! 2001-07-02 Loren J. Rittle ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Protect variable from shell ! expansion (thanks to Alexandre Oliva). ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-07-02 Loren J. Rittle ! libstdc++/3284 ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Portability enhancement. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-07-02 Loren J. Rittle ! libstdc++/3243 ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Add relative path to ! staged/installed area to support -I-. Document. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-06-27 Phil Edwards ! * include/backward/algo.h: Add "GPL plus runtime exception" comment ! block, this time for real. ! * include/backward/algobase.h: Likewise. ! * include/backward/alloc.h: Likewise. ! * include/backward/bvector.h: Likewise. ! * include/backward/defalloc.h: Likewise. ! * include/backward/deque.h: Likewise. ! * include/backward/function.h: Likewise. ! * include/backward/hash_map.h: Likewise. ! * include/backward/hash_set.h: Likewise. ! * include/backward/hashtable.h: Likewise. ! * include/backward/heap.h: Likewise. ! * include/backward/iterator.h: Likewise. ! * include/backward/list.h: Likewise. ! * include/backward/map.h: Likewise. ! * include/backward/multimap.h: Likewise. ! * include/backward/multiset.h: Likewise. ! * include/backward/pair.h: Likewise. ! * include/backward/rope.h: Likewise. ! * include/backward/set.h: Likewise. ! * include/backward/slist.h: Likewise. ! * include/backward/stack.h: Likewise. ! * include/backward/strstream: Likewise. ! * include/backward/tempbuf.h: Likewise. ! * include/backward/tree.h: Likewise. ! * include/backward/vector.h: Likewise. ! * include/bits/pthread_allocimpl.h: Likewise. ! * include/bits/std_algorithm.h: Likewise. ! * include/bits/std_bitset.h: Likewise. ! * include/bits/std_deque.h: Likewise. ! * include/bits/std_functional.h: Likewise. ! * include/bits/std_iterator.h: Likewise. ! * include/bits/std_list.h: Likewise. ! * include/bits/std_map.h: Likewise. ! * include/bits/std_memory.h: Likewise. ! * include/bits/std_numeric.h: Likewise. ! * include/bits/std_queue.h: Likewise. ! * include/bits/std_set.h: Likewise. ! * include/bits/std_stack.h: Likewise. ! * include/bits/std_utility.h: Likewise. ! * include/bits/std_vector.h: Likewise. ! * include/bits/stl_algo.h: Likewise. ! * include/bits/stl_algobase.h: Likewise. * include/bits/stl_alloc.h: Likewise. - * include/bits/stl_bvector.h: Likewise. * include/bits/stl_construct.h: Likewise. * include/bits/stl_deque.h: Likewise. - * include/bits/stl_function.h: Likewise. - * include/bits/stl_heap.h: Likewise. - * include/bits/stl_iterator.h: Likewise. - * include/bits/stl_iterator_base_funcs.h: Likewise. * include/bits/stl_iterator_base_types.h: Likewise. * include/bits/stl_list.h: Likewise. - * include/bits/stl_map.h: Likewise. - * include/bits/stl_multimap.h: Likewise. - * include/bits/stl_multiset.h: Likewise. - * include/bits/stl_numeric.h: Likewise. - * include/bits/stl_pair.h: Likewise. - * include/bits/stl_pthread_alloc.h: Likewise. - * include/bits/stl_queue.h: Likewise. - * include/bits/stl_raw_storage_iter.h: Likewise. * include/bits/stl_relops.h: Likewise. - * include/bits/stl_set.h: Likewise. - * include/bits/stl_stack.h: Likewise. * include/bits/stl_tempbuf.h: Likewise. - * include/bits/stl_threads.h: Likewise. - * include/bits/stl_tree.h: Likewise. - * include/bits/stl_uninitialized.h: Likewise. * include/bits/stl_vector.h: Likewise. ! * include/bits/type_traits.h: Likewise. ! * include/ext/hash_map: Likewise. ! * include/ext/hash_set: Likewise. ! * include/ext/rope: Likewise. ! * include/ext/ropeimpl.h: Likewise. ! * include/ext/slist: Likewise. ! * include/ext/stl_hash_fun.h: Likewise. ! * include/ext/stl_hashtable.h: Likewise. ! * include/ext/stl_rope.h: Likewise. ! * src/bitset.cc: Likewise. ! * src/strstream.cc: Likewise. ! ! 2001-06-26 Felix Natter ! ! * docs/html/17_intro/porting-howto.html: Fixed some errors. ! ! 2001-06-25 Phil Edwards ! Kurt Garloff ! ! PR libstdc++/3377 ! * src/cmath.cc: New [version of an old] file; instantiate ! __cmath_power to start with. ! * src/Makefile.am (sources): Add cmath.cc (and alphabetize). ! * Makefile.in: Regenerate. ! * libio/Makefile.in: Regenerate. ! * libmath/Makefile.in: Regenerate. ! * libsupc++/Makefile.in: Regenerate. ! * src/Makefile.in: Regenerate. ! * testsuite/Makefile.in: Regenerate. ! ! 2001-06-24 Gabriel Dos Reis ! David Edelsohn ! ! * libmath/stubs.c: New file. ! * libmath/Makefile.am (libmath_la_SOURCES): Add stubs.c. ! * libmath/Makefile.in: Regenerate. ! ! 2001-06-19 Benjamin Kosnik ! ! * include/c_std/bits/std_cwchar.h: Include ctime. ! * testsuite/17_intro/header_cwchar.cc : Check. ! ! * include/c_std/bits/std_cwctype.h: Inject wctype. ! * testsuite/17_intro/header_cwctype.cc: Update. ! ! 2001-06-17 Release Manager ! ! * GCC 3.0 Released. ! ! 2001-06-14 Nathan Sidwell ! ! * configure.in (auxdir): Replace by ... ! (toprel): ... new variable. ! (toplevel_srcdir): Construct from $toprel. ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Use $toprel ! rather than .. to locate gcc source directory. ! (GLIBCPP_CONFIGURE): Replace $auxdir with $srcdir/$toprel. ! * aclocal.m4, configure: Rebuilt. ! ! 2001-06-13 John David Anglin ! ! (Approved by Mark and Benjamin. Applied by Loren.) ! ! * src/globals.cc: Define globals _GLIBCPP_mutex_init (), ! _GLIBCPP_mutex_address_init (), _GLIBCPP_once, _GLIBCPP_mutex ! and _GLIBCPP_mutex_address. ! * include/bits/stl_threads.h (_STL_mutex_lock): Use above to provide ! once-only runtime initialization of _M_lock mutex when ! __GTHREAD_MUTEX_INIT_FUNCTION is defined. ! (__STL_MUTEX_INITIALIZER): Provide initializer for _STL_mutex_lock ! for __GTHREAD_MUTEX_INIT_FUNCTION case. ! ! 2001-06-13 Benjamin Kosnik ! ! * acinclude.m4 (GLIBCPP_CONFIGURE): Bump version to 3.0.0. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * include/bits/c++config (__GLIBCPP__): Update date. ! ! 2001-06-12 Benjamin Kosnik ! ! * include/bits/fpos.h (fpos::operator-): Don't return reference, ! return original, non-modified version. ! (fpos::operator+): Same. ! * testsuite/27_io/fpos.cc: Add test. ! ! 2001-06-12 Loren J. Rittle ! ! libstdc++/2071 ! * porting.texi: Add documentation about libstdc++-v3-specific ! macros that are currently included in os_defines.h files. ! ! * config/basic_file_stdio.h (sys_getc): New method. ! (sys_ungetc): New method. ! * include/bits/basic_file.h: (sys_getc): New method signature. ! (sys_ungetc): New method signature. ! ! * include/bits/fstream.tcc (underflow): Add conditional code ! paths which avoid using short seeks on streams (especially ! useful when the stream might be interactive or a pipe). At ! the moment, this alternate path only avoids seeking when the ! ``buffer size'' of underflow() is 1 since the C standard only ! guarantees buffer space for one ungetc (this technique could ! be extended since *-*-solaris* supports buffering for 4 calls ! to ungetc and *-*-*bsd* supports buffering limited only by ! memory resources). Also, _GLIBCPP_AVOID_FSEEK must be defined ! in a port's os_defines.h file for this alternate path to even ! be considered. As a bonus, the idiom of using getc/ungetc ! requires no system calls whereas fseek maps to one or two ! system call(s) on many platforms. ! ! * config/os/bsd/freebsd/bits/os_defines.h (_GLIBCPP_AVOID_FSEEK): ! Define it. ! * config/os/solaris/solaris2.5/bits/os_defines.h ! (_GLIBCPP_AVOID_FSEEK): Likewise. ! * config/os/solaris/solaris2.6/bits/os_defines.h ! (_GLIBCPP_AVOID_FSEEK): Likewise. ! * config/os/solaris/solaris2.7/bits/os_defines.h ! (_GLIBCPP_AVOID_FSEEK): Likewise. ! ! 2001-06-12 Benjamin Kosnik ! ! * acinclude.m4 (GLIBCPP_CHECK_COMPILER_VERSION): Change to ! AC_TRY_COMPILE, so that the built compiler is checked, and ! bootstraps or cross compiles with an older compile still work. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! ! 2001-06-12 Benjamin Kosnik ! ! libstdc++/3142 ! * include/bits/std_sstream.h: Add allocator_type, as per DR 251. ! ! libstdc++/3141 ! * include/bits/istream.tcc (getline, get): Fix as per DR 243. ! ! libstdc++/3140 ! * include/bits/std_bitset.h (bitset::set): Fix as per DR 186. ! ! libstdc++/3139 ! * include/bits/limits_generic.h: Fix as per DR 184. ! ! 2001-06-11 Benjamin Kosnik ! ! libstdc++/3126 ! * include/bits/basic_string.h (string::compare): Adjust signatures ! as per DR 5. ! * include/bits/basic_string.tcc: And here. ! ! libstdc++/2346 ! * config/c_io_stdio.h: Remove whitespace. ! * testsuite/27_io/istream_seeks.cc (test03): Add regression. ! (test02): Add regression. ! * testsuite/27_io/istream_seeks-3.tst: New file. ! ! 2001-06-11 Phil Edwards ! ! * README: Update to reflect reality. ! * acinclude.m4: Update descriptions, fix typos. Comment changes only. ! * configure.in: Make certain target_alias is set and subst'd for 2.50. ! * aclocal.m4: Regenerate. ! * configure: Regenerate (with 2.13). ! 2001-06-11 Benjamin Kosnik ! libstdc++/3114 ! * include/bits/ostream.tcc (ostream::seekp): Add error checking as ! per DR 129. ! * include/bits/istream.tcc (istream::seekg): Same. ! * testsuite/27_io/istream_seeks.cc: Fix. ! libstdc++/3113 ! * include/bits/stl_function.h (binder2nd): Fix as per DR 109. ! (binder1st): Same. ! * include/bits/std_queue.h: Add c++config.h. ! * testsuite/20_util/binders.cc: New test. ! ! 2001-06-11 Matthias Klose ! Phil Edwards ! * docs/doxygen/run_doxygen (find_doxygen): Tweak version check. ! (main script): Echo more information. ! 2001-06-10 Benjamin Kosnik ! * include/c_std/bits/std_cwchar.h: Alphabetize. ! * include/bits/char_traits.h: Tweak. ! * acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Check for ! everything used by std_cwchar.h. ! * aclocal.m4: Regenerate. ! * configure.in: Regenerate. ! * config.h.in: Regenerate. ! 2001-06-10 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_ENABLE_C99): Add stdio.h checking. ! Add checking for strtof, _Exit in stdlib.h ! * aclocal.m4: Regenerate. ! * configure.in: Regenerate. ! * include/c_std/bits/std_cstdio.h: Alphabetize lists. ! (snprintf): Put C99 functions into __gnu_cxx namespace. ! (vfscanf): Same. ! (vscanf): Same. ! (vsnprintf): Same. ! (vsscanf): Same. ! * include/c_std/bits/std_cstdlib.h: Alphabetize lists. Put undefs ! for C99 functions within _GLIBCPP_USE_C99 guard. ! (_Exit): Same. ! (strtof): Same. ! (strtold): Same. ! * include/bits/locale_facets.tcc: Check if C99 is enabled. ! * include/c_std/bits/std_cwchar.h (__gnu_cxx): Put undefs within ! C99 guard. ! * include/c_std/bits/cmath.tcc: Formatting tweak. ! * include/c_std/bits/std_cmath.h: Same. ! 2001-06-10 Benjamin Kosnik ! * include/c_std/bits/std_cstdio.h: Include cstddef for size_t. ! ! 2001-06-09 Alexandre Oliva ! Stephen L Moshier ! * acinclude.m4 (AC_EXEEXT): Work around in case it expands to ! nothing, as in autoconf 2.50. * configure: Rebuilt. ! 2001-06-09 Benjamin Kosnik ! ! * include/c_std/bits/std_cwchar.h: Remove size_t injection, ! include std_cstddef. ! * include/c_std/bits/std_ctime.h: Same. ! * include/c_std/bits/std_cstring.h: Same. ! * include/c_std/bits/std_cstdlib.h: Same. ! ! * include/c_std/bits/std_cstdio.h: Remove vsnprintf, snprintf. ! * include/c_std/bits/std_cctype.h: Remove isblank. ! ! 2001-06-09 Benjamin Kosnik ! ! * acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Check for fgetwc, ! fgetws. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * include/c_std/bits/std_cwchar.h: Remove duplicate fgetwc ! injection, guard fgetwc, fgetws. ! * include/c_std/bits/std_cstdio.h: Remove superfluous includes. ! * include/c_std/bits/std_clocale.h: And here. ! * include/c_std/bits/std_cctype.h: And here. ! * include/c_std/bits/std_cstdlib.h (strtof): Guard strtof injection. ! ! * config/basic_file_stdio.h: Don't include unistd.h. ! * config/c_io_stdio.h: Don't use compatibility headers. ! * libsupc++/eh_terminate.cc: Qualify abort. ! (__terminate): And here. ! * libsupc++/eh_catch.cc (__cxa_end_catch): Qualify abort. ! ! 2001-06-08 Benjamin Kosnik ! ! * include/c_std/bits/std_cstdlib.h: Remove _Exit, strtof injections. ! ! 2001-06-08 Benjamin Kosnik ! ! libstdc++/2767 ! libstdc++/2989 ! libstdc++/2992 ! * include/std/*: Add copyright notice. ! * include/c_std/bits/*: Use using statements instead of extern "C". ! * include/c_std/bits/std_cmath.h: Don't overload double versions ! of math functions with __buitin versions, use global version to ! prevent ambiguities. Remove define hacks. ! * include/c_std/bits/std_cwchar.h: Using declarations for "C" ! functions that have changed signatures and std:: ! declarations. Remove define hacks. ! * include/c_std/bits/std_cwchar.h: Same, plus remove ambiguous ! __builtins in std::. Remove define hacks. ! * testsuite/17_intro/headers_c.cc: Add tests. ! * testsuite/17_intro/headers_c++.cc: Add test. ! ! 2001-06-07 Loren J. Rittle ! John David Anglin ! c++/3082 ! * libsupc++/eh_alloc.cc: Ensure that required macros are ! defined before including gthr.h. Ensure that we get the ! version of gthr.h for which we know how to provide a ! configuration. ! * libsupc++/eh_globals.cc: Likewise. And, bring the threading ! code path into line with the current EH model. Use std, where ! appropriate. ! 2001-06-07 Loren J. Rittle ! John David Anglin ! * config/threads-no.h: Remove file. ! * config/threads-posix.h: Remove file. ! * acconfig.h (_GLIBCPP_USE_THREADS): Remove. ! (_GLIBCPP_SUPPORTS_WEAK): Add (required by namespace-clean gthr*.h). ! (_GLIBCPP_HAVE_GTHR_DEFAULT): Likewise. ! * config.h.in: Regenerate. ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Completely rework to ! setup and use gthr*.h files. In particular, make gthr.h files ! namespace-clean in the staging area (they don't have to be for ! libgcc.a). * aclocal.m4: Regenerate. * configure: Regenerate. ! * src/Makefile.am (build_headers): Remove bits/c++threads.h ! and add bits/gthr.h bits/gthr-single.h bits/gthr-default.h. ! * src/Makefile.in: Regenerate. ! ! * include/bits/c++config: Cleanup threading configuration macros. ! In particular, define __STL_GTHREADS macro which controls... ! * include/bits/stl_threads.h: ...a brand new gthr.h-based ! configuration here. ! ! * config/c_io_stdio.h: Include staged gthr.h instead of local ! thread configuration file. Always use __gthread_mutex_t ! instead of __mutext_type (or int). ! * include/bits/std_fstream.h: Likewise. ! ! * docs/html/17_intro/howto.html: Remove placeholder comment in ! case this configuration patch didn't make it. Add advice that ! section only applies if configured with --enable-threads. ! * docs/html/23_containers/howto.html: Reword to make clear ! that _PTHREADS is no longer required for any port to be ! correctly using STL with threads. Add advice that section ! only applies if configured with --enable-threads. ! ! 2001-06-06 Benjamin Kosnik ! ! * src/string-inst.cc (_Rep::_S_max_size): Add instantiation. ! ! 2001-06-05 Benjamin Kosnik ! ! libstdc++/3045 ! * include/bits/basic_ios.tcc: Formatting tweaks. ! * include/bits/ios_base.h: Formatting tweaks. ! * src/ios.cc (ios_base::Init::_S_ios_create): Use filebufs here. ! (ios_base::Init::_S_ios_destroy): ..and here. Explicitly call dtors. ! * src/globals.cc: Allocate filebufs for standard streams here. ! (buf_cout, buf_cin, buf_cerr): Like so. ! (buf_wcout, buf_wcin, buf_wcerr): And so. ! * testsuite/27_io/ios_init.cc: Add. ! ! 2001-06-04 Brendan Kehoe ! Benjamin Kosnik ! ! libstdc++/3017 ! * include/bits/locale_facets.h (ctype<_CharT>): Add definitions ! for generic ctype virtuals. ! * src/locale.cc: Minor tweaks, naming consistency. ! * testsuite/22_locale/ctype.cc: Add test. ! ! 2001-06-04 Kenny Simpson ! Phil Edwards ! ! PR libstdc++/3035 and PR libstdc++/3036 ! * include/bits/stl_pair.h: Fix pair ctor and make_pair according ! to LWG DR 181 and 265. ! ! 2001-06-04 Phil Edwards ! ! PR libstdc++/3034 ! * include/bits/stl_multiset.h (find, lower_bound, upper_bound, ! equal_range): Add const overloads as per LWG DR 214. ! * include/bits/stl_set.h: Likewise. ! ! 2001-06-04 Brendan Kehoe ! Phil Edwards ! ! PR libstdc++/3018 ! * include/bits/std_bitset.h (bitset::test): Fix __pos >= _Nb ! comparison; all positions must be < _Nb. ! * testsuite/23_containers/bitset_members.cc: New file. ! ! 2001-06-04 Brendan Kehoe ! ! PR libstdc++/3016 ! * include/bits/stl_queue.h (classes queue, priority_queue): Fix ! ctors to match the standard. ! 2001-06-04 Hans-Peter Nilsson ! * configure.in (use of GLIBCPP_CHECK_GNU_MAKE): Re-apply change ! from 2001-05-30, accidentally reverted later that day. ! * configure: Regenerate. ! * libsupc++/Makefile.am (install-glibcppinstallHEADERS, ! uninstall-glibcppinstallHEADERS): Have explicit rules catering to ! SUN make VPATH peculiarities. ! * libsupc++/Makefile.in: Regenerate. ! 2001-05-31 scott snyder ! libstdc++/2976 ! * include/bits/istream.tcc: Include std_ostream.h. ! ! 2001-05-31 Benjamin Kosnik ! libstdc++/2997 ! * src/bitset.cc: Qualify size_t with std::. ! ! 2001-05-30 Benjamin Kosnik ! * acconfig.h (_GLIBCPP_BUGGY_FLOAT_COMPLEX): Remove. ! (_GLIBCPP_BUGGY_COMPLEX): Remove. ! * config.h.in: Regenerate. ! * acinclude.m4 (GLIBCPP_CHECK_COMPLEX_MATH_COMPILER_SUPPORT): Remove. * aclocal.m4: Regenerate. ! * configure.in: Don't call it. ! * configure: Regenerate. ! ! libstdc++/2970 ! * src/complex_io.cc (operator<<(ostream&, const complex&): Fix. ! * testsuite/26_numerics/complex_inserters_extractors.cc (test01): ! New test. ! ! libstdc++/2985 ! * include/bits/std_complex.h: Include sstream. Put definitions for ! complex inserters and extractors here, and remove them from... ! * src/complex_io.cc: ...here. ! * include/bits/basic_ios.h (basic_ios::__numput_type): Add _Traits ! parameter. ! (basic_ios::__numget_type): Same. ! * include/bits/std_istream.h: Same. ! * include/bits/std_ostream.h: Same. ! * include/bits/sbuf_iter.h (ostreambuf_iterator): Fix typo in base ! class iterator template arguments. ! * src/locale-inst.cc: Add explicit has_facet instantiations. ! * include/bits/basic_ios.h (_M_get_fnumput): Remove. ! (_M_get_fnumget): Remove. ! (basic_ios::_M_check_facet): New function. ! (basic_ios::_M_cache_facets): New function. ! * include/bits/basic_ios.tcc: Definition for _M_cache_facets. ! (basic_ios::imbue): Call _M_cache_facets. ! (basic_ios::init): Same. ! * include/bits/istream.tcc: Format, use _M_check_facet. ! * include/bits/ostream.tcc: Same. ! * include/bits/locale_facets.tcc (__output_float): Change ! signature, add _Traits. ! * testsuite/26_numerics/complex_inserters_extractors.cc (test02): ! New test. ! ! 2001-05-30 Loren J. Rittle ! * include/bits/c++config (__USE_MALLOC): Do not define it. ! Document why not and give pointers to more information. ! * docs/html/23_containers/howto.html: Update documentation ! to reflect recent understanding of problem. ! * docs/html/17_intro/howto.html: Likewise. ! 2001-05-30 Phil Edwards ! * docs/doxygen/user.cfg.in: Minor addition. ! * docs/html/documentation.html: Reorganize. Put most-looked-at ! stuff first. ! * docs/html/install.html: Update for 3.0. HTML fixups. ! * docs/html/17_intro/howto.html: Likewise. ! * docs/html/18_support/howto.html: Likewise. ! * docs/html/19_diagnostics/howto.html: Likewise. ! * docs/html/20_util/howto.html: Likewise. ! * docs/html/23_containers/howto.html: Likewise. ! * docs/html/24_iterators/howto.html: Likewise. More notes. ! * docs/html/25_algorithms/howto.html: Likewise. ! * docs/html/26_numerics/howto.html: Likewise. More notes. ! * docs/html/27_io/howto.html: Likewise. ! * docs/html/ext/howto.html: Likewise. ! * docs/html/faq/index.html: Likewise. * docs/html/faq/index.txt: Regenerate. - * docs/html/27_io/iostreams_hierarchy.pdf: Remove in favor of - Doxygen-created documentation. - - 2001-05-30 Rainer Orth - - * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Use - get_multilibs to find gcc. - - 2001-05-30 Phil Edwards ! * acinclude.m4 (GLIBCPP_ENABLE_C99): Reorder output messages. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! ! 2001-05-29 Gabriel Dos Reis ! ! * include/c_std/bits/std_cstdlib.h:: Move C99 thingies to __gnu_cxx::. ! * include/c_std/bits/std_cwchar.h (__gnu_cxx): Likewise. ! ! 2001-05-27 Gabriel Dos Reis ! ! * include/c_std/bits/std_cmath.h: Move C99 functions in __gnu_cxx::. ! * include/c_std/bits/std_cstdlib.h: Same. ! * include/c_std/bits/std_cwchar.h: Same. ! ! 2001-05-30 Hans-Peter Nilsson ! ! * src/Makefile.am (VPATH): Delimit with ":", not space. ! * src/Makefile.in: Regenerate. ! * configure.in (use of GLIBCPP_CHECK_GNU_MAKE): Don't fail if GNU ! make isn't found. * configure: Regenerate. ! ! 2001-05-28 Gabriel Dos Reis ! ! * include/c_std/bits/std_cmath.h (sqrt): Change __builtin_fsqrt to ! __builtin_sqrt. ! ! 2001-05-26 Gabriel Dos Reis ! ! * include/c_std/bits/std_cmath.h (sqrt): #undef. ! ! 2001-05-23 Rainer Orth ! ! * mknumeric_limits: Stop if gen-num-limits dies. ! ! 2001-05-25 Benjamin Kosnik ! ! other/2931 ! * acinclude.m4 (GLIBCPP_ENABLE_C99): Use AC_TRY_COMPILE. ! * aclocal.m4: Regenerate. ! * configure: Same. ! ! 2001-05-25 Rainer Orth ! Phil Edwards ! Alexandre Oliva ! ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Set glibcpp_srcdir ! in an amd-safe manner. Revert glibcpp_prefixdir. ! ! 2001-05-25 Gabriel Dos Reis ! ! * include/c_std/bits/std_cmath.h: Tweak. #define away abs, cos, ! fabs, sin, sqrt. They are now implemented in terms of __builtin_ ! variants. ! ! 2001-05-24 Benjamin Kosnik ! ! libstdc++/2830 ! * testsuite/21_strings/inserters_extractors.cc (test09): New test. ! * include/bits/ostream.tcc: Format to match istream.tcc. ! (operator<<(basic_ostream __out, const basic_string __s)): Fix. ! ! 2001-05-24 Phil Edwards ! ! * libsupc++/eh_alloc.cc (__cxa_allocate_exception): Qualify ! malloc with std:: . ! (__cxa_free_exception): Likewise with free. ! ! 2001-05-24 Mark Mitchell ! ! * include/c_std/bits/std_cstring.h: #define away all global ! functions we will redeclare in namespace `std'. ! * libsupc++/eh_alloc.cc (__cxa_allocate_exception): Use ! std::memset, instead of memset. ! * testsuite/19_diagnostics/stdexceptions.cc: Use `std::strcmp', ! not plain `strcmp'. ! * testsuite/21_strings/c_strings.cc: Use `std::strcpy' instead of ! plain `strcpy'. ! ! 2001-05-24 Benjamin Kosnik ! ! libstdc++/2832 ! * include/bits/basic_ios.tcc: Small tweak. ! * include/bits/std_fstream.h (ifstream): Add buffer member. Adjust ! ctors and dtors, and rdbuf settings. ! (ofstream): Same. ! (fstream): Same. ! * include/bits/std_sstream.h: Same, but for stringstream classes. ! * testsuite/27_io/ostringstream_members.cc: New. ! * testsuite/27_io/stringstream_members.cc: New. ! * testsuite/27_io/fstream_members.cc: New. ! * testsuite/27_io/ifstream_members.cc: Add test. ! * testsuite/27_io/istringstream_members.cc: Add test. ! * testsuite/27_io/ofstream_members.cc: Add test. ! ! 2001-05-24 Gabriel Dos Reis ! ! * include/bits/c++config(__NO_MATH_INLINES): Move to... ! * config/os/gnu-linux/bits/os_defines.h: ...here. ! ! 2001-05-24 Gabriel Dos Reis ! ! * include/bits/c++config (__NO_MATH_INLINES): New macro. ! * testsuite/26_numerics/fabs_inline.cc (main): New test. ! ! 2001-05-22 Benjamin Kosnik ! ! libstdc++/2841 ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Set ! ld_library_path. ! (libstdc++-v3_set_ld_library_path): New, copied from g++.exp. ! (libstdc++-v3-finish): Remove. ! (libstdc++-v3_exit): Remove. ! ! 2001-05-22 Phil Edwards ! ! * docs/html/documentation.html: Point to doxygen output. ! ! 2001-05-21 Benjamin Kosnik ! ! * mkcheck.in (static_fail): Remove S_FLAG decoration on output. ! ! * include/bits/std_sstream.h (stringbuf::setbuf): Require both ! arguments to be non-null. ! * include/bits/fstream.tcc (filebuf::_M_allocate_buffers): Only ! try allocations if allocated size is greater than zero. ! (filebuf::_M_filebuf_init): Change to ! (filebuf::_M_allocate_file): Which is what it does now. ! (filebuf::_M_allocate_bufers): Change to ! (filebuf::_M_allocate_internal_buffer): This, and create ! (filebuf::_M_allocate_pback_buffer): New. ! (filebuf::_M_destroy_internal_buffer): New. ! (filebuf::_M_buf_allocated): New data member. ! (filebuf::setbuf): Use new logic, allow use of external buffer. ! * testsuite/27_io/stringbuf_virtuals.cc: New file. ! * testsuite/27_io/filebuf_virtuals.cc: New file. ! ! 2001-05-21 Stephen M. Webb ! ! * include/c_std/bits/std_cstring.h (memchr): Define "C" functions to ! __glibcpp_memchr. ! (strchr): Same, but to __glibcpp_strchr. ! (strpbrk): Same. ! (strrchr): Same. ! (strstr): Same. ! * include/c_std/bits/std_cwchar.h (wcschr): Same. ! (wcsbrk): Same. ! (wcsrchr): Same. ! (wcsstr): Same. ! (wmemchr): Same. ! ! 2001-05-21 Benjamin Kosnik ! ! * testsuite/21_strings/c_strings.cc (main): Fix. ! ! 2001-05-19 Phil Edwards ! ! * acinclude.m4: Fix --help spacing, correct comments. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * mkcheck.in: Add usage comments. ! * docs/html/documentation.html: Point to doxygen'd tarball. ! ! 2001-05-18 Benjamin Kosnik ! ! * testsuite/README: Add notes. ! ! * src/Makefile.am (libstdc++.INC): Remove. * src/Makefile.in: Regenerate. ! Phil Edwards ! * mkcheck.in: Add missing '#'. ! ! 2001-05-18 Angela Marie Thomas ! ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Set flags ! appropriately for remote testing and testing installed files without ! a build dir. ! ! 2001-05-18 Benjamin Kosnik ! ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Set glibcpp_srcdir ! amd glibcpp_prefixdir with absolute paths. ! ! * include/bits/c++config (__GLIBCPP__): Bump. ! * acinclude.m4 (GLIBCPP_CONFIGURE): Correct version number. ! ! 2001-05-18 Gabriel Dos Reis ! ! * include/bits/std_valarray.h (valarray<>::operator[] const): ! Return a const reference. ! * testsuite/26_numerics/valarray_const_bracket.cc: New test. ! ! 2001-05-18 Alexandre Oliva ! ! * configure.target (ATOMICITYH): Actually use AIX-specific code on ! earlier versions of AIX 4.*. ! ! 2001-05-18 Angela Marie Thomas ! ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-dg-test): Set ! output_file based on the name of the testcase. ! ! 2001-05-18 Angela Marie Thomas ! ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Build ! gluefile and use it if needs_status_wrapper is set. ! ! 2001-05-18 Alexandre Oliva ! ! * configure.target (ATOMICITYH): Use cpu/generic code on earlier ! versions of AIX. ! ! 2001-05-17 Alexandre Oliva ! ! * configure.target (ATOMICITYH): Don't use AIX 4.3-specific code ! on earlier versions of AIX. ! ! 2001-05-15 Benjamin Kosnik ! ! * testsuite_flags.in (query): Add backwards, ext directories. ! ! 2001-05-15 Mark Mitchell ! ! * porting.texi: Correct documentation about handling ! _LARRGEFILE_SOURCE and its ilk. ! * config/os/solaris/solaris2.5/bits/os_defines.h: Remove ! definitions of _XOPEN_SOURCE, _LARGEFILE64_SOURCE, and ! __EXTENSIONS__. ! * config/os/solaris/solaris2.6/bits/os_defines.h: Likewise. ! * config/os/solaris/solaris2.7/bits/os_defines.h: Likewise. ! ! 001-05-15 Zack Weinberg ! ! * testsuite/21_strings/inserters_extractors.cc, ! testsuite/27_io/istream_unformatted.cc, ! testsuite/27_io/stringstream.cc: ! Replace multi-line string constants with C89-style ! concatenated string constants. ! ! 2001-05-14 Richard Henderson ! ! * mknumeric_limits: Build with -fno-exceptions. ! ! 2001-05-13 Benjamin Kosnik ! ! Switch over to new harness. ! * testsuite_flags.in: Tweaks via Gaby. ! * testsuite/Makefile.am: Change tool to libstdc++-v3. ! (EXPECT): Quote directly. ! (RUNTEST): Same. ! * configure.in: Output testsuite_flags. ! * acinclude.m4: Substitute src, bld, and prefix dirs. ! Remove glibcpp_expect, glibcpp_runtestflags. ! * Makefile.am (RUNTESTFLAGS): Pass this down to subdirs. ! * mkcheck.in: Port to new interface. ! ! * aclocal.m4: Regerate. ! * configure: Regnerate. ! * Makefile.in: Regnerate. ! * */Makefile.in: Regenerate. ! ! * tests_flags.in: Remove. ! * testsuite/lib/libstdc++.exp: Remove. ! * testsuite/libstdc++.tests/tests.exp: Remove. ! ! 2001-05-13 Alexandre Oliva ! ! * configure.target: Remove detection of AIX pthread multilib, now ! obtained from `gcc -v'. ! ! 2001-05-13 John David Anglin ! ! * mkcheck.in (setup_size_command): Use Berkeley "-B" mode with GNU ! size. Add hpux case for HP size. ! ! 2001-05-11 Benjamin Kosnik ! ! * testsuite_flags.in: New, simplified interface. ! * testsuite/lib/libstdc++-v3-dg.exp: New test harness. ! * testsuite/libstdc++-v3.dg: Add. ! * testsuite/libstdc++-v3.dg/dg.exp: Add. ! ! 2001-05-11 Benjamin Kosnik ! ! * testsuite/*/*.cc: Remove spaces, make sure testcases return zero. ! * testsuite/config/default.exp: Update bugs email address. ! ! 2001-05-11 Richard Henderson ! ! * libsupc++/eh_personality.cc: Include unwind-pe.h. Remove ! all pointer encoding logic. ! (struct lsda_header_info): Add ttype_base. ! (get_ttype_entry): Use it instead of a context. ! (check_exception_spec): Likewise. ! (PERSONALITY_FUNCTION): Initialize ttype_base. Store it in ! the c++ exception header for __cxa_call_unexpected. ! (__cxa_call_unexpected): Use it. ! ! 2001-05-09 Benjamin Kosnik ! ! * testsuite/lib/libstdc++.exp: Use libgloss.exp. Call ! libgloss_link_flags to find crt0.o for targets that use libgloss ! instead of newlib. ! Change LDFLAGS to LIBS. ! Consistently name procedures libstdc++-XXX. ! * testsuite/libstdc++.tests/tests.exp: Use new procedure names. ! ! 2001-05-08 Benjamin Kosnik ! ! * include/c_std/bits/std_cstring.h (memchr): Correct definitions. ! (strchr): Same. ! (strpbrk): Same. ! (strrchr): Same. ! (strstr): Same. ! * include/c_std/bits/std_cwchar.h (wcschr): Same. ! (wcsbrk): Same. ! (wcsrchr): Same. ! (wcsstr): Same. ! (wmemchr): Same. ! * testsuite/21_strings/c_strings.cc: Add tests. ! ! 2001-05-07 Benjamin Kosnik ! ! libstdc++/2523 ! * include/bits/std_fstream.h (basic_filebuf): Change signature. ! * include/bits/fstream.tcc (basic_filebuf): Change bool argument ! to int_type, pass in buffer size info. ! * include/bits/std_streambuf.h (_M_is_indeterminate): Check for ! unbuffered situation. ! (underflow): Remove codecvt bits for the time being. ! * include/bits/istream.tcc (istream::sentry): Avoid sputbackc call. ! * include/bits/locale_facets.tcc (_M_extract): Cache dereference ! values from iterators, clean. ! * src/locale.cc: Ditto. ! * include/bits/sbuf_iter.h: Format. ! * src/ios.cc: Explicitly pass in buffer sizes at creation time. ! * testsuite/27_io/narrow_stream_objects.cc: Add tests. ! * testsuite/27_io/filebuf.cc: Tweaks. ! * testsuite/27_io/filebuf_members.cc: Tweaks. ! ! 2001-05-07 Mark Mitchell ! ! * config/os/solaris/solaris2.7/bits/os_defines.h ! (_LARGEFILE_SOURCE): Define it. ! ! 2001-05-03 Alexandre Oliva ! ! * configure.in (LIBSUPCXX_PICFLAGS): Set it to -prefer-pic or ! -prefer-non-pic depending on whether libtool has shared libraries ! enabled or disabled. ! * libsupc++/Makefile.am (LIBSUPCXX_CXXFLAGS): Set to ! $(LIBSUPCXX_PICFLAGS). ! * configure, */Makefile.in: Rebuilt. ! ! 2001-05-01 Benjamin Kosnik ! ! * include/bits/sbuf_iter.h (istreambuf_iterator): Correct. ! * testsuite/24_iterators/istreambuf_iterator.cc (test02): Add test. ! ! * include/bits/std_sstream.h (stringbuf): Leak ! copied string. ! * testsuite/24_iterators/ostreambuf_iterator.cc: Correct. ! ! 2001-05-01 Tom Browder ! ! * docs/html/ext/howto.html: Fix typo. ! ! 2001-05-01 Gabriel Dos Reis ! * testsuite/libstdc++.tests/tests.exp: Add comment. ! 2001-05-01 Gabriel Dos Reis ! * testsuite/libstdc++.tests/tests.exp: Set ulimits. ! 2001-04-30 Mark Mitchell ! * porting.texi: Use the GFDL. ! 2001-04-30 Benjamin Kosnik ! libstdc++/2627 ! * testsuite/24_iterators/ostreambuf_iterator.cc: New file. ! * include/bits/sbuf_iter.h (ostreambuf_iterator): Remove bogus ! specializations. ! 2001-04-30 Benjamin Kosnik ! libstdc++/2964 ! * include/bits/stl_iterator_base_funcs.h (__advance): Fix. ! 2001-04-28 Phil Edwards ! * docs/doxygen/run_doxygen: Minor tweaks. ! * docs/doxygen/style.css: New file. ! * docs/doxygen/user.cfg.in: Update using "doxygen -u" to get the ! latest parameters available. Use style.css. ! 2001-04-27 Benjamin Kosnik ! * docs/doxygen/mainpage.doxy: New. ! * docs/doxygen/user.cfg.in: Change default configuration. Single ! frame, other tweaks. ! 2001-04-26 Mark Mitchell ! * docs/html/17_intro/BADNAMES: Remove EGCS reference. ! Indicate obsolete nature of thelist for G++ 3.0. ! 2001-04-26 Alexandre Oliva ! * acinclude.m4 (GLIBCPP_ENABLE_THREADS): Obtain ! target_thread_file with `gcc -v'. ! * aclocal.m4, configure: Rebuilt. ! 2001-04-25 Benjamin Kosnik ! * include/c_std/bits/std_cmath.h (std): Explicitly inject c99 names. ! * include/c_std/bits/std_cstdlib.h (std): Same, except for llabs. ! * include/c_std/bits/std_cwchar.h (std): Same. ! * acconfig.h (std): Remove c99 injection into std. ! * config.h.in: Regenerate. ! ! * testsuite/README: Fix typo. ! * include/bits/codecvt.h: Remove warnings. ! ! 2001-04-24 Peter Schmid ! * include/ext/slist: Include required header files. ! 2001-04-23 Loren J. Rittle ! * include/c_std/bits/std_cerrno.h (errno): Define macro from ! identifier declared with external linkage, if needed. ! * include/c_std/bits/std_csetjmp.h (setjmp): Likewise. ! * include/c_std/bits/std_cstdarg.h (va_end): Likewise. ! 2001-04-23 Benjamin Kosnik ! * acinclude.m4 (CXX): Set to glibcpp_CXX so that in-directory ! re-configures find the build compiler. ! (GLIBCPP_ENABLE_C99): Do all fp-tests with 0.0, not 0. Fixes ! libstdc++/2609. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-04-20 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_ENABLE_LONG_LONG): Make sure required C99 ! support is enabled correctly before long long is activated. * aclocal.m4: Regenerate. - * configure: Regenerate. - - * include/backward/backward_warning.h: Format correctly. - - * testsuite/26_numerics/c99_classification_macros_c.cc: Add. - * testsuite/26_numerics/c99_classification_macros_c++.cc: Add. - * testsuite/26_numerics/c99_macros.cc: Remove. - - 2001-04-20 Phil Edwards - - * include/bits/stl_bvector.h: Replace __ITERATOR_CATEGORY with - __iterator_category. - - 2001-04-19 Benjamin Kosnik - - * acconfig.h (_GLIBCPP_USE_C99): Add. * config.h.in: Regenerate. - * acinclude.m4 (GLIBCPP_ENABLE_C99): New macro. Test for ISO/IEC - 9899: 1999 support. - * aclocal.m4: Regenerate. - * configure.in (GLIBCPP_ENABLE_C99): Use it, on by default. - * configure: Regenerate. - * configure.in (GLIBCPP_ENABLE_LONG_LONG): Set default to yes. * configure: Regenerate. ! * include/c_std/bits/std_cwchar.h: Put wcstold, wcstoll, wcstoull ! into c99. ! * include/c_std/bits/std_cmath.h: Bring C99 functions into c99 ! namespace. ! * include/c_std/bits/std_cstdlib.h: Same. ! * docs/html/configopts.html: Update. ! * testsuite/26_numerics/c99_macros.cc: Edit, use cmath instead of ! math.h ! (test_c99_classify): Add. ! * config/os/gnu-linux/bits/os_defines.h (_GNU_SOURCE): Remove. ! (_ISOC99_SOURCE): Remove. ! * include/bits/stl_algo.h: Use _GLIBCPP_HAVE_DRAND48. ! * include/bits/c++config (__STL_ASSERTIONS): Simplify. ! * acinclude.m4 (GLIBCPP_CHECK_STDLIB_SUPPORT): Add check for drand48. * aclocal.m4: Regenerate. * configure: Regenerate. - - 2001-04-19 Phil Edwards - - * Makefile.am (doxygen): Assume script is missing execute perms. - * Makefile.in: Regenerated. - * docs/doxygen/user.cfg.in: Add class diagrams and source browsing. - - 2001-04-17 Loren J. Rittle - - * testsuite/27_io/istream_seeks.cc: Inform DejaGnu of required files. - - 2001-04-17 Benjamin Kosnik - - * testsuite/23_containers/map_operators.cc: Add dg-excess-errors. - * testsuite/23_containers/set_operators.cc: Same. - - * include/bits/c++config: Add _GLIBCPP_CONCEPT_CHECKS. Disable by - default. - (__GLIBCPP__): Bump from value of last release. - * include/bits/concept_check.h: Default to off, edit comments. - * src/stl-inst.cc: Use _GLIBCPP_CONCEPT_CHECKS. - * src/Makefile.am (AM_CXXFLAGS): Remove _GLIBCPP_NO_CONCEPT_CHECKS. - * src/Makefile.in: Regenerate. - - 2001-04-14 Martin Reinecke - - * include/bits/boost_concept_check.h(_Mutable_ContainerConcept): - Properly uglify member. ! 2001-04-13 Phil Edwards ! ! * include/bits/stl_algobase.h (equal): Use EqualOpConcept instead ! of EqualityCo ! mparableConcept. ! 2001-04-13 Phil Edwards ! * include/bits/boost_concept_check.h: Uglify, fork from Boost. ! * include/bits/concept_check.h: Uglify. ! * include/bits/stl_algo.h: Likewise. ! * include/bits/stl_algobase.h: Likewise. ! * include/bits/stl_deque.h: Likewise. ! * include/bits/stl_heap.h: Likewise. ! * include/bits/stl_iterator_base_funcs.h: Likewise. ! * include/bits/stl_list.h: Likewise. ! * include/bits/stl_map.h: Likewise. ! * include/bits/stl_multimap.h: Likewise. ! * include/bits/stl_multiset.h: Likewise. ! * include/bits/stl_numeric.h: Likewise. ! * include/bits/stl_queue.h: Likewise. ! * include/bits/stl_set.h: Likewise. ! * include/bits/stl_stack.h: Likewise. ! * include/bits/stl_vector.h: Likewise. ! * include/ext/hash_map: Likewise. ! * include/ext/hash_set: Likewise. ! * include/ext/slist: Likewise. ! 2001-04-13 Gabriel Dos Reis ! * testsuite/23_containers/set_operators.cc: Just try to compile. ! Mark as XFAIL. ! * testsuite/23_containers/map_operators.cc: Same. ! 2001-04-12 Jason Merrill ! * testsuite/lib/libstdc++.exp (libstdc++-dg-test): Prepend "./" to ! output_file. ! (dg-test): Revert rth's change. ! 2001-04-12 Nathan Sidwell ! * libsupc++/eh_alloc.cc (__cxa_allocate_exception): Don't ! terminate holding the mutex. Make sure size fits in EMERGENCY_OBJ_SIZE. ! 2001-04-12 Gabriel Dos Reis ! * testsuite/README: Add DejaGnu specific documentation. ! 2001-04-11 Benjamin Kosnik ! ! * acinclude.m4: AC_CHECK_TOOL for expect. * aclocal.m4: Regenerate. * configure: Regenerate. ! * testsuite/Makefile.am (RUNTEST): Use substituted. ! (EXPECT): Same. ! ! * configure.in: Remove xcompiling substitution. ! * tests_flags.in (CROSS_LIB_PATH): Remove. ! (xcompiling): Remove. ! (CXX): Use substituted CXX. ! ! 2001-04-11 Richard Henderson ! ! * testsuite/lib/libstdc++.exp: Specify path for output_file. ! ! 2001-04-08 Gabriel Dos Reis ! ! * include/bits/std_valarray.h(valarray<>::operator[]): Make ! inline. ! ! 2001-04-06 Gabriel Dos Reis ! ! * testsuite/25_algorithms/equal.cc: New test. ! ! 2001-04-06 Joe Buck ! ! * stl_algobase.h (std::equal): avoid use of possibly-undefined ! operator != (one line patch). ! ! 2001-04-06 Benjamin Kosnik ! ! * include/backward/backward_warning.h: Re-enable. ! ! 2001-04-06 Benjamin Kosnik ! Alexandre Oliva ! ! * tests_flags.in (CROSS_LIB_PATH): Add as -B flag. ! ! 2001-04-06 Gabriel Dos Reis ! ! * include/c_std/bits/std_cmath.h: Get rid of C99 math macros. ! * testsuite/26_numerics/c99_macros.cc: Add test. ! ! 2001-04-06 Phil Edwards ! ! * docs/html/faq/index.html: Update for 2.92, grab from RELEASE-NOTES. ! * docs/html/faq/index.txt: Regenerated. ! ! 2001-04-06 Benjamin Kosnik ! ! * include/backward/backward_warning.h: Temporarily disable until ! g++ testsuite changes go in. ! * tests_flags.in (CROSS_LIB_PATH): Add. ! ! 2001-04-05 Benjamin Kosnik ! ! Warn when using backward headers. ! * include/backward/algo.h: Include warning file. ! * include/backward/vector.h: Same. ! * include/backward/tree.h: Same. ! * include/backward/tempbuf.h: Same. ! * include/backward/strstream: Same. ! * include/backward/streambuf.h: Same. ! * include/backward/stream.h: Same. ! * include/backward/stack.h: Same. ! * include/backward/slist.h: Same. ! * include/backward/set.h: Same. ! * include/backward/rope.h: ! * include/backward/queue.h: Same. ! * include/backward/pair.h: Same. ! * include/backward/ostream.h: Same. ! * include/backward/new.h: Same. ! * include/backward/multiset.h: Same. ! * include/backward/multimap.h: Same. ! * include/backward/map.h: Same. ! * include/backward/list.h: Same. ! * include/backward/iterator.h: Same. ! * include/backward/istream.h: Same. ! * include/backward/iostream.h: ! * include/backward/iomanip.h: ! * include/backward/heap.h: Same. ! * include/backward/hashtable.h: ! * include/backward/hash_set.h: ! * include/backward/hash_map.h: ! * include/backward/function.h: ! * include/backward/fstream.h: ! * include/backward/deque.h: ! * include/backward/defalloc.h: Same. ! * include/backward/complex.h: Same. ! * include/backward/bvector.h: ! * include/backward/alloc.h: ! * include/backward/algobase.h: Same. ! ! * include/backward/backward_warning.h: New file. ! * src/Makefile.am (backward_headers): Add backward_warning.h ! * src/Makefile.in: Regenerate. ! ! 2001-04-05 Benjamin Kosnik ! ! * src/Makefile.am (myinstalldirs): Make sure backward directory is ! created. ! (myinstallheaders): Install backward headers in backward directory. * src/Makefile.in: Regenerate. ! ! 2001-04-05 Benjamin Kosnik ! ! Prepare for libstdc++-2.92. ! * docs/html/17_intro/RELEASE-NOTES (New): Update. ! * docs/html/configopts.html: Fix formatting. ! * README (file): Updates. ! * include/bits/c++config (__GLIBCPP__): Update. ! ! 2001-04-05 Phil Edwards ! ! * docs/doxygen/run_doxygen: Check for the existence of Doxygen. ! ! 2001-04-04 Phil Edwards ! ! * docs/doxygen/user.cfg.in: Extract all non-private members; ! reduce confusing documentation output. ! ! 2001-04-04 Geoffrey Keating ! ! * include/backward/fstream.h: Add missing semicolons. ! ! 2001-04-03 Benjamin Kosnik ! ! * include/bits/fstream.tcc: Add bool parameter to filebuf ctor. ! * include/bits/ios_base.h(ios_base::Init): Remove _M_cout, _M_cin, ! _M_cerr, _M_wcout, _M_wcin, _M_wcerr. ! (ios_base::Init::_S_ios_create): New. ! (ios_base::Init::_S_ios_destroy): New. ! * include/bits/std_fstream.h: Change ctor args. ! * src/ios.cc (ios_base::Init::Init): Use _S_ios_create. ! (ios_base::Init::~Init): Use _S_ios_destroy. ! (ios_base::sync_with_stdio): Use new members. ! * testsuite/27_io/filebuf_members.cc: Fix calling conventions for ! filebuf ctor. ! ! 2001-04-03 Peter Schmid ! ! * include/backward/fstream.h: Expose streampos to global ! namespace. ! ! 2001-04-03 Peter Schmid ! ! * include/bits/stl_iterator_base_types.h: Fix typo ! 2001-04-03 Andreas Schwab ! * include/backward/fstream.h: Define filebuf and wfilebuf. ! 2001-04-02 Phil Edwards ! New concept checking implementation. ! * docs/html/19_diagnostics/howto.html: Document. ! * docs/html/17_intro/concept_check.diff: New file, for reference. ! * include/bits/boost_concept_check.h: New file from Boost. ! * include/bits/c++config: Update comments. ! * include/bits/concept_check.h: New file. ! * include/bits/concept_checks.h: Removed. ! * include/bits/container_concepts.h: Removed. ! * include/bits/sequence_concepts.h: Removed. ! * include/bits/stl_iterator_base.h: Removed; split into... ! * include/bits/stl_iterator_base_funcs.h: ...this new file... ! * include/bits/stl_iterator_base_types.h: ...and this new file. ! * include/bits/sbuf_iter.h: Update to use new implementation. ! * include/bits/std_iterator.h: Likewise. ! * include/bits/std_memory.h: Likewise. ! * include/bits/stl_algo.h: Likewise. ! * include/bits/stl_algobase.h: Likewise. ! * include/bits/stl_construct.h: Likewise. ! * include/bits/stl_deque.h: Likewise. ! * include/bits/stl_heap.h: Likewise. ! * include/bits/stl_list.h: Likewise. ! * include/bits/stl_map.h: Likewise. ! * include/bits/stl_multimap.h: Likewise. ! * include/bits/stl_multiset.h: Likewise. ! * include/bits/stl_numeric.h: Likewise. ! * include/bits/stl_queue.h: Likewise. ! * include/bits/stl_set.h: Likewise. ! * include/bits/stl_stack.h: Likewise. ! * include/bits/stl_uninitialized.h: Likewise. ! * include/bits/stl_vector.h: Likewise. ! * include/ext/hash_map: Likewise. ! * include/ext/hash_set: Likewise. ! * include/ext/slist: Likewise. ! * include/ext/stl_hashtable.h: Likewise. ! * src/Makefile.am (base_headers): Update list of headers. ! * Makefile.in: Regenerated. ! * src/Makefile.in: Regenerated. ! * libio/Makefile.in: Regenerated. ! * libmath/Makefile.in: Regenerated. ! * libsupc++/Makefile.in: Regenerated. ! * testsuite/Makefile.in: Regenerated. ! * docs/html/install.html: Update contact information. ! * docs/html/17_intro/howto.html: Ditto. ! * docs/html/18_support/howto.html: Ditto. ! * docs/html/20_util/howto.html: Ditto. ! * docs/html/21_strings/howto.html: Ditto. ! * docs/html/22_locale/howto.html: Ditto. ! * docs/html/23_containers/howto.html: Ditto. ! * docs/html/24_iterators/howto.html: Ditto. ! * docs/html/25_algorithms/howto.html: Ditto. ! * docs/html/26_numerics/howto.html: Ditto. ! * docs/html/27_io/howto.html: Ditto. ! * docs/html/faq/index.html: Ditto, plus info on new checking code. ! * docs/html/ext/howto.html: Ditto, plus info on new checking code. ! * docs/html/faq/index.txt: Regenerated. ! 2001-04-02 Zack Weinberg ! * testsuite/lib/libstdc++.exp (dg-test): Annotate result ! messages with $which_library as well as $tool_flags and ! ${dg-extra-tool-flags}. Factor out annotation text into ! a single variable. ! 2001-04-02 Stephen M. Webb ! * include/c_std/bits/std_cstring.h: Fix for const-correctness. ! * include/c_std/bits/std_cwchar.h: Same. ! * testsuite/21_strings/c_strings.cc: Add. ! 2001-04-01 Benjamin Kosnik ! * docs/html/configopts.html: Add --enable-sjlj-exceptions docs. ! 2001-04-01 Zack Weinberg ! * tests_flags.in: Use test a = b, not test a == b which is not ! portable. ! 2001-03-31 Benjamin Kosnik ! * configure.target: Remove duplicate aix entry. ! 2001-03-30 Benjamin Kosnik ! * include/ext/stl_bvector.h: Move to... ! * include/bits/stl_vector.h: ...here. ! * include/ext/bvector: Move to... ! * include/backward/bvector.h: ...here. ! * include/bits/std_vector.h: Change stl_bvector include. ! * include/bits/std_queue.h: Remove bvector include. ! * include/ext/tree: Insert using rb_tree, move to... ! * include/backward/tree.h: ...here. ! * include/backward/hash_map.h: Include ext/hash_map. ! * include/backward/hash_set.h: Include ext/hash_set. ! * include/backward/queue.h: New file. ! * include/backward/stack.h: Edit. ! * include/backward/algo.h: Same. ! * include/backward/algobase.h: Same. ! * include/backward/alloc.h: Same. ! * include/backward/function.h: Same. ! * include/backward/iomanip.h: Same. ! * include/backward/istream.h: Same. ! * include/backward/iterator.h: Same. ! * include/backward/list.h: Same. ! * include/backward/map.h: Same. ! * include/backward/multimap.h: Same. ! * include/backward/multiset.h: Same. ! * include/backward/ostream.h: Same. ! * include/backward/pair.h: Same ! * include/backward/rope.h: Same. ! * include/backward/set.h: Same. ! * include/backward/stream.h: Same. ! * include/backward/strstream.h: Same. ! * include/backward/tempbuf.h: Same. ! * src/Makefile.am (ext_headers): Edit. ! * src/Makefile.in: Regenerate. ! * testsuite/ext/headers.cc (main): Fix. ! * mkcheck.in: Fix. ! 2001-03-30 Phil Edwards ! * tests_flags.in (LIBS): Pass correct path for installed testing. ! 2001-03-28 Benjamin Kosnik ! * mkcheck.in (LIBTOOL): Don't construct -B argument here... ! * tests_flags.in (CXX): Construct here. ! (static_fail): Don't remove compile.out. Format with spaces. ! (INCLUDES): Deal with xcompiling. ! * configure.in (xcompiling): Substitute. ! * testsuite/Makefile.am: Snake libjava configury. ! * testsuite/Makefile.in: Regenerate. ! * testsuite/23_containers/map_operators.cc: Tweaks. ! * testsuite/23_containers/set_operators.cc: Tweaks. ! 2001-03-28 Gabriel Dos Reis ! Enable dejagnu testing framework. ! * configure.in: Generate testsuite/Makefile. ! * configure: Regenerate. ! * Makefile.am (check-install): Change rule from this... ! (check-script-install): ...to this. ! (check): Change rule from this... ! (check-script):...to this. ! * Makefile.in: Regenerate. ! 2001-03-28 Alexandre Oliva ! * libsupc++/Makefile.am (CXXLINK): Add --tag disable-shared after ! --tag CXX. ! (LIBTOOL): Let automake take care of its definition. ! * libsupc++/Makefile.in: Rebuilt. ! 2001-03-28 Richard Henderson ! IA-64 ABI Exception Handling: ! * acinclude.m4 (GLIBCPP_ENABLE_SJLJ_EXCEPTIONS): New. ! * configure.in: Use it. ! * Makefile.in, aclocal.m4, config.h.in, configure: Regenerate. ! * libsupc++/Makefile.am (sources): Update files list. ! * libsupc++/Makefile.in: Regenerate. ! * libsupc++/eh_alloc.cc, libsupc++/eh_aux_runtime.cc: New files. ! * libsupc++/eh_catch.cc, libsupc++/eh_exception.cc: New files. ! * libsupc++/eh_globals.cc, libsupc++/eh_personality.cc: New files. ! * libsupc++/eh_terminate.cc, libsupc++/eh_throw.cc: New files. ! * libsupc++/exception_support.cc: Remove. ! * libsupc++/exception_support.h: Remove. ! * libsupc++/pure.cc: Use std::terminate. ! * libsupc++/tinfo2.cc (__throw_type_match_rtti_2): Remove. ! (__is_pointer): Remove. ! * libsupc++/unwind-cxx.h: New file. ! * libsupc++/vec.cc (uncatch_exception): Update for new abi. ! 2001-03-27 Alexandre Oliva ! * libsupc++/Makefile.am (CXXLINK): Use CXX again, and choose ! CXX tag explicitly. ! * src/Makefile.am (CXXLINK): Likewise. ! * libsupc++/Makefile.in, src/Makefile.in: Rebuilt. ! 2001-03-27 Benjamin Kosnik ! * include/bits/c++config (_STL_USE_CONCEPT_CHECKS): Disable by default. ! 2001-03-26 Peter Schmid ! * libstdc++-v3/tests_flags.in: Change the order of libstdc++ ! and libc ! 2001-03-26 Benjamin Kosnik ! * include/bits/basic_file.h (get_fileno): Remove. ! (_M_fileno): Remove. ! (_M_cfile_created): Add. ! (basic_file::basic_file(__c_file_type*, openmode): Add. ! (basic_file::basic_file(int, const char*, openmode): Remove. ! * include/bits/fstream.tcc (basic_fstream::basic_filebuf(int __fd, ! const char*, ios_base::openmode): Don't allocate ! internal buffers. Turn off internal buffers. ! (basic_filebuf::overflow): Remove test for null buffer. ! (basic_filebuf::_M_really_overflow): Same. Allow unbuffered use. ! * include/bits/streambuf.cc: Tweak. ! * include/bits/std_ostream.h: Tweak. ! * config/basic_file_libio.h: Same. ! * config/basic_file_stdio.h: Same. ! * src/ios.cc (ios_base::Init::Init()): Unbuffer stdout by default. ! * testsuite/27_io/filebuf_members.cc: Tweaks. ! * testsuite/27_io/ios_base_members_static.cc: Tweaks. ! 2001-03-24 Phil Edwards ! * Makefile.am: New targets, doxygen and doxygen-maint. ! * Makefile.in: Regenerated. ! * docs/doxygen/run_doxygen: Finally implemented. ! * docs/doxygen/maint.cfg.in: New file. ! * docs/doxygen/user.cfg.in: New file. ! 2001-03-24 Phil Edwards ! * acinclude.m4 (GLIBCPP_CHECK_COMPILER_FEATURES): Update comment. ! * src/Makefile.am: Replace leading spaces with tabs on continuation ! lines. ! * aclocal.m4: Regenerated. ! * configure: Ditto. ! * Makefile.in: Ditto. ! * src/Makefile.in: Ditto. ! * libio/Makefile.in: Ditto. ! * libmath/Makefile.in: Ditto. ! * libsupc++/Makefile.in: Ditto. ! 2001-03-24 Phil Edwards ! * docs/html/19_diagnostics/howto.html: HTML fixup. Describe ! concept-checking code and current status of same. ! * docs/html/ext/howto.html: Ditto. ! * docs/html/faq/index.html: Ditto. ! * docs/html/faq/index.txt: Regenerated. ! 2001-03-24 Phil Edwards ! * include/bits/std_bitset.h: Include ostream and istream headers ! instead of iostream. ! 2001-03-22 Greg Bumgardner ! * include/bits/ostream.tcc: Use __builtin_alloca. ! 2001-03-22 Benjamin Kosnik ! * src/misc-inst.cc (__sink_unused_warning): Move to... ! * src/locale-inst.cc (__sink_unused_warning): Move to... ! * src/stl-inst.cc: Here. ! * include/bits/c++config (_STL_NO_CONCEPT_CHECKS): Add define, ! commented it out. ! 2001-03-21 Theodore Papadopoulo ! * include/bits/basic_file.h: Fix typos in comments. ! 2001-03-20 Richard Henderson ! * src/gen-num-limits.cc: Instantiate for wchar_t. ! * config/os/aix/bits/ctype_base.h (mask): Use unsigned int. ! 2001-03-20 Jason Merrill ! * libsupc++/vec.cc (__cxa_vec_cleanup): New fn. ! (__cxa_vec_ctor, __cxa_vec_cctor, __cxa_vec_dtor): Call it. ! * libsupc++/cxxabi.h: Declare it. ! 2001-03-16 Alexandre Oliva ! * src/gen-num-limits.cc (signal_adapter): Overloaded to match ! signal_func with an unspecified argument list. ! 2001-03-15 Benjamin Kosnik ! * tests_flags.in (CXXFLAGS): Link libstdc++ before libsupc++. ! 2001-03-15 Gabriel Dos Reis ! * include/bits/basic_string.tcc (operator+): Fix thinko. ! 2001-03-14 Benjamin Kosnik ! libstdc++/2020 ! * include/bits/std_streambuf.h: Remove cached locale facets. ! (basic_streambuf::_M_buf_fctype): Remove. ! (basic_streambuf::~basic_streambuf): Remove here. ! (basic_streambuf::basic_streambuf): Same. ! (basic_streambuf::imbue): Same. ! * include/bits/fstream.tcc (filebuf::imbue): Remove _M_buf_fctype. ! * include/bits/std_fstream.h (basic_filebuf::_M_fcvt): Remove. ! (basic_filebuf::~basic_filebuf()): Remove here. ! * include/bits/fstream.tcc (basic_filebuf::basic_filebuf): Same. ! (basic_filebuf::imbue): Same. ! * include/bits/localefwd.h (_Count_ones): Remove. ! (locale::_S_num_categories): Just use 6, since this doesn't ! actually change, ever. ! * include/bits/locale_facets.tcc (has_facet): Simplify. ! (use_facet): Same. ! * testsuite/27_io/filebuf.cc (test06): Add tests. ! 2001-03-13 Steve Ellcey ! * libstdc++-v3/config/os/hpux/bits/ctype_base.h: Make ctype masks ! match HP-UX ctype.h header file. ! 2001-03-13 Andris Pavenis ! * config/djgpp/bits/ctype_noninline.h: Fix typo and remove ! duplicate definitions of __dj_ctype_* ! 2001-03-13 Benjamin Kosnik ! * libsupc++/new: Remove pragma interface. ! * libsupc++/typeinfo: Same. ! * libsupc++/exception: Same. ! * libsupc++/new_handler.cc: Remove pragma implementation. ! (bad_alloc::~bad_alloc()): Add. ! * libsupc++/exception_support.cc: Same. ! (exception::~exception): Add. ! (bad_exception::~bad_exception): Add. ! * libsupc++/tinfo.cc: Same. ! (bad_cast::~bad_cast): Add. ! (bad_typeid::~bad_typeid): Add. ! 2001-03-13 Phil Edwards ! * mkcheck.in: Fix IFS regression for non-bash-2.01 hosts. ! 2001-03-12 Felix Lee ! * mkcheck.in: workaround for bash 2.01 IFS bug. ! 2001-03-12 Benjamin Kosnik ! Fixups for -fno-for-scope ! * include/bits/locale_facets.tcc (__match_parallel): Fixup. ! * src/valarray-inst.cc (__gslice_to_index): Same. ! 2001-03-12 Rodney Brown ! * src/gen-num-limits.cc (traps) [SPECIALIZE_TRAPPING]: Add fflush ! prior to trapping signal (UnixWare 7 workaround). ! 2001-03-12 Craig Rodrigues ! * include/backward/hashtable.h: Same. ! * include/backward/rope.h: Fix include. ! 2001-03-12 Benjamin Kosnik ! * include/backward/vector.h: Include std_vector.h. ! * include/bits/istream.tcc (basic_istream<_CharT, _Traits>& ! operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)): ! Fix typo. ! 2001-03-11 Peter Schmid ! * include/ext/stl_hashtable.h: Change type of __n to size_t ! * include/backward/bvector.h: Include ! 2001-03-09 Gabriel Dos Reis ! * include/bits/istream.tcc ( basic_istream<_CharT, _Traits>& ! operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)): ! Use streamsize, not int_type. ! 2001-03-08 Benjamin Kosnik ! * testsuite/27_io/streambuf.cc (test06): New test, disabled at the ! moment. ! 2001-03-08 Andreas Schwab ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Fix syntax in test ! command. ! * aclocal.m4, configure: Regenerated. ! 2001-03-07 Benjamin Kosnik ! * include/bits/std_iosfwd.h: Remove string forward decls here. ! * include/bits/stringfwd.h: Add forward decls for char_traits ! specializations. ! * config/c_io_libio.h (wstreamoff): Delete. ! * config/c_io_stdio.h (wstreamoff): Same. ! * include/bits/char_traits.h: Use streamoff not wstreamoff for ! char_traits::off_type. ! Remove duplicate typedefs. ! * include/bits/fpos.h: Define streampos/wstreampos here. ! * testsuite/27_io/istream_seeks.cc (test04): Explicitly cast int ! values to off_type. ! (test05): Same. ! Changeup output files. ! * testsuite/27_io/istream_unformatted.cc: Change output files. ! * testsuite/27_io/istream_seeks-1.txt: Add. ! * testsuite/27_io/istream_seeks-2.tst: Add. ! * testsuite/27_io/istream_seeks-1.tst: Add. ! * testsuite/27_io/istream_unformatted-2.tst: Delete. ! * testsuite/27_io/istream_unformatted-3.tst: Delete. ! * testsuite/27_io/istream_unformatted-3.txt: Delete. ! 2001-03-07 Alexandre Oliva ! Add Irix 5.2, 6.3 support. ! * config/os/irix/bits: Renamed to... ! * config/os/irix/irix6.5/bits: this. ! * config/os/irix/irix5.2/bits: New, copied from irix6.5/bits. ! * config/os/irix/irix5.2/bits/ctype_base.h: Use _U, _L, _N, ! _X, _S, _P, _C and _B instead of IRIX-6.5 _IS* macros. ! * config/os/irix/irix5.2/bits/ctype_noninline.h ! (ctype::ctype): Initialize _M_table with __ctype. ! * configure.target: Adjust. ! 2001-03-06 Benjamin Kosnik ! libstdc++/2181 ! * include/bits/istream.tcc (basic_istream<_CharT, _Traits>:: ! operator>>(__istream_type& (*__pf)(__istream_type&)): Don't use ! sentry. ! (basic_istream<_CharT, _Traits>:: operator>>(__ios_type& ! (*__pf)(__ios_type&)): Same. ! (basic_istream<_CharT, _Traits>:: operator>>(ios_base& ! (*__pf)(ios_base&))): Same. ! * testsuite/27_io/istream_extractor_other.cc: Add tests. ! * testsuite/27_io/istream_manip.cc (test01): Fix. ! 2001-03-06 Nathan Myers ! Benjamin Kosnik ! * include/c_std/bits/std_cerrno.h: Don't define errno in std::. ! * testsuite/17_intro/header_cerrno.cc (test01): New file. ! * testsuite/17_intro/header_cassert.cc (test01): New file. ! * testsuite/17_intro/header_cstddef.cc (test01): New file. ! * testsuite/17_intro/header_csetjmp.cc (test01): New file. ! * testsuite/17_intro/header_cstdarg.cc (test01): New file. ! 2001-03-05 scott snyder ! libstdc++/2190 ! * include/c_std/bits/std_cmath.h: Move abs(long), div(long,long) ! from here... ! * include/c_std/bits/std_cstdlib.h: ... to here. ! * testsuite/17_intro/header_cstdlib.cc: Add test. ! 2001-03-05 Stephen M. Webb ! * libsupc++/vec.cc (__cxxa_vec_new2): Qualify size_t. ! 2001-03-05 Laurynas Biveinis ! * config/os/djgpp/ctype_base.h (ctype_base): fix __to_type ! definition. Replace enum with static const variables. ! * config/os/djgpp/ctype_inline.h (ctype::is): remove ! throw specification, fix typos, use . ! (ctype::scan_is): remove throw specification. ! (ctype::scan_not): likewise. ! * config/os/djgpp/ctype_noninline.h (ctype::ctype): fix typo. ! (ctype::do_toupper(char)): use . ! (ctype::do_toupper(char *, const char *)): likewise. ! (ctype::do_tolower(char)): likewise. ! (ctype::do_tolower(char *, const char *)): likewise. ! 2001-03-04 Phil Edwards ! http://gcc.gnu.org/ml/libstdc++/2001-03/msg00015.html ! * include/backward/algo.h: Use std not __STD. Remove unneeded ! macros and "never happens" code. Adjust to C++STYLE guidelines. ! * include/backward/algobase.h: Likewise. ! * include/backward/alloc.h: Likewise. ! * include/backward/bvector.h: Likewise. ! * include/backward/deque.h: Likewise. ! * include/backward/function.h: Likewise. ! * include/backward/hash_map.h: Likewise. ! * include/backward/hash_set.h: Likewise. ! * include/backward/hashtable.h: Likewise. ! * include/backward/heap.h: Likewise. ! * include/backward/iterator.h: Likewise. ! * include/backward/list.h: Likewise. ! * include/backward/map.h: Likewise. ! * include/backward/multimap.h: Likewise. ! * include/backward/multiset.h: Likewise. ! * include/backward/pair.h: Likewise. ! * include/backward/rope.h: Likewise. ! * include/backward/set.h: Likewise. ! * include/backward/slist.h: Likewise. ! * include/backward/stack.h: Likewise. ! * include/backward/strstream: Likewise. ! * include/backward/tempbuf.h: Likewise. ! * include/backward/tree.h: Likewise. ! * include/backward/vector.h: Likewise. ! * include/bits/basic_ios.h: Likewise. ! * include/bits/basic_ios.tcc: Likewise. ! * include/bits/basic_string.h: Likewise. ! * include/bits/c++config: Likewise. ! * include/bits/concept_checks.h: Likewise. ! * include/bits/fpos.h: Likewise. ! * include/bits/fstream.tcc: Likewise. ! * include/bits/functexcept.h: Likewise. ! * include/bits/ios_base.h: Likewise. ! * include/bits/istream.tcc: Likewise. ! * include/bits/mask_array.h: Likewise. ! * include/bits/ostream.tcc: Likewise. ! * include/bits/pthread_allocimpl.h: Likewise. ! * include/bits/sbuf_iter.h: Likewise. ! * include/bits/slice.h: Likewise. ! * include/bits/slice_array.h: Likewise. ! * include/bits/sstream.tcc: Likewise. ! * include/bits/std_bitset.h: Likewise. ! * include/bits/std_fstream.h: Likewise. ! * include/bits/std_iomanip.h: Likewise. ! * include/bits/std_ios.h: Likewise. ! * include/bits/std_istream.h: Likewise. ! * include/bits/std_iterator.h: Likewise. ! * include/bits/std_memory.h: Likewise. ! * include/bits/std_ostream.h: Likewise. ! * include/bits/std_sstream.h: Likewise. ! * include/bits/std_streambuf.h: Likewise. ! * include/bits/std_string.h: Likewise. ! * include/bits/std_valarray.h: Likewise. ! * include/bits/stl_algo.h: Likewise. ! * include/bits/stl_algobase.h: Likewise. ! * include/bits/stl_alloc.h: Likewise. ! * include/bits/stl_construct.h: Likewise. ! * include/bits/stl_deque.h: Likewise. ! * include/bits/stl_function.h: Likewise. ! * include/bits/stl_heap.h: Likewise. ! * include/bits/stl_iterator.h: Likewise. ! * include/bits/stl_iterator_base.h: Likewise. ! * include/bits/stl_list.h: Likewise. ! * include/bits/stl_map.h: Likewise. ! * include/bits/stl_multimap.h: Likewise. ! * include/bits/stl_multiset.h: Likewise. ! * include/bits/stl_numeric.h: Likewise. ! * include/bits/stl_pair.h: Likewise. ! * include/bits/stl_pthread_alloc.h: Likewise. ! * include/bits/stl_queue.h: Likewise. ! * include/bits/stl_raw_storage_iter.h: Likewise. ! * include/bits/stl_relops.h: Likewise. ! * include/bits/stl_set.h: Likewise. ! * include/bits/stl_stack.h: Likewise. ! * include/bits/stl_tempbuf.h: Likewise. ! * include/bits/stl_threads.h: Likewise. ! * include/bits/stl_tree.h: Likewise. ! * include/bits/stl_uninitialized.h: Likewise. * include/bits/stl_vector.h: Likewise. - * include/bits/streambuf.tcc: Likewise. - * include/bits/type_traits.h: Likewise. - * include/bits/valarray_meta.h: Likewise. - * include/ext/bvector: Likewise. - * include/ext/hash_map: Likewise. - * include/ext/hash_set: Likewise. - * include/ext/ropeimpl.h: Likewise. - * include/ext/slist: Likewise. - * include/ext/stl_bvector.h: Likewise. - * include/ext/stl_hash_fun.h: Likewise. - * include/ext/stl_hashtable.h: Likewise. - * include/ext/stl_rope.h: Likewise. - * src/complex_io.cc: Likewise. - * src/ios.cc: Likewise. - * src/locale-inst.cc: Likewise. - * src/locale.cc: Likewise. - * src/localename.cc: Likewise. - * src/misc-inst.cc: Likewise. - * src/stdexcept.cc: Likewise. - * src/stl-inst.cc: Likewise. - * src/strstream.cc: Likewise. - * src/valarray-inst.cc: Likewise. - - 2001-03-03 Benjamin Kosnik - - * src/misc-inst.cc (__copy_streambufs): Fix typo for alpha. - - 2001-03-02 Peter Schmid - - * include/bits/istream.tcc: change type of __extracted to __size_type - - 2001-03-02 Benjamin Kosnik ! * src/wstring-inst.cc: New file. ! * src/Makefile.am (EXTRA_LTLIBRARIES): Remove. ! (libinst_wstring_la_SOURCES): Remove. ! (libstdc___la_LIBADD): Remove libinst_wstring_la. ! (sources): Add wstring-inst.cc ! * acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Remove ! libinst_wstring_la. ! 2001-03-02 Peter Schmid ! * src/locale.cc: initialise __ret with zero ! * src/strstream.cc:cast gptr to int_type ! 2001-03-01 Phil Edwards ! * docs/html/faq/index.html: Update broken links. ! * docs/html/faq/index.txt: Regenerated. ! 2001-02-28 Benjamin Kosnik ! libstdc++/2064 ! * configure.target: Change irix* to irix6.5* in target_os table. ! 2001-02-28 Benjamin Kosnik ! libstdc++/2103 ! * include/bits/c++config (__GLIBCPP__): Bump number in ! anticipation of 2.92. ! * include/bits/codecvt.h: Fix typo. ! * include/bits/basic_file.h (__basic_file): Don't use _M_wfile for ! stdio model. ! * acinclude.m4 (GLIBCPP_ENABLE_CSTDIO): Enable wchar_t ! instantiations for stdio model. ! 2001-02-28 Phil Edwards ! * acinclude.m4 (GLIBCPP_CONFIGURE): Remove GLIBCPP_CFLAGS ! and GLIBCPP_CXXFLAGS as unused variables. ! * configure.host: Likewise. ! * configure.target: Likewise. ! * aclocal.m4: Regenerated. ! * configure: Regenerated. ! * Makefile.in: Regenerated. ! * libio/Makefile.in: Regenerated. ! * libmath/Makefile.in: Regenerated. ! * libsupc++/Makefile.in: Regenerated. ! * src/Makefile.in: Regenerated. ! 2001-02-27 Benjamin Kosnik ! libstdc++/1886 ! * include/bits/basic_file.h: Include basic_file_model.h. ! * config/c_io_libio.cc: Move to... ! * config/basic_file_libio.cc: Here. ! * config/basic_file_libio.h: New file. ! * config/c_io_stdio.cc: Move to... ! * config/basic_file_stdio.cc: Here. ! * config/basic_file_stdio.h: New file. ! * config/c_io_libio.h: Tweak. ! * config/c_io_stdio.h: Tweak. ! * src/Makefile.am (build_headers): Add basic_file_model.h. ! (sources): Add basic_file.cc, remove c++io.cc. ! * src/Makefile.in: Regenerate. ! * acinclude.m4 (GLIBCPP_ENABLE_CSTDIO): Add support for ! basic_file_model.h and basic_file.cc. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * testsuite/27_io/filebuf.cc (test05): Add regression. ! 2001-02-27 Benjamin Kosnik ! Correct license. ! * config/cpu/alpha/bits/atomicity.h: Change. ! * config/cpu/arm/bits/atomicit3y.h ! * config/cpu/generic/bits/atomicity.h ! * config/cpu/i386/bits/atomicity.h ! * config/cpu/i486/bits/atomicity.h ! * config/cpu/ia64/bits/atomicity.h ! * config/cpu/powerpc/bits/atomicity.h ! * config/cpu/sparc/sparc32/bits/atomicity.h ! * config/cpu/sparc/sparc64/bits/atomicity.h ! * config/os/aix/bits/atomicity.h ! * config/os/irix/bits/atomicity.h ! 2001-02-27 Benjamin Kosnik ! * include/bits/std_stdexcept.h (runtime_error): Make string ! member non-const. ! (logic_error): Same. ! * testsuite/19_diagnostics/stdexceptions.cc (test04): Add test. ! (test03): Fix. ! 2001-02-26 Benjamin Kosnik ! libstdc++/1972 ! libstdc++/2089 ! * include/bits/std_stdexcept.h (logic_error::logic_error): Use ! string object, not reference. ! (runtime_error::runtime_error): Same. ! * testsuite/19_diagnostics/stdexceptions.cc: New file. ! 2001-02-26 Phil Edwards ! * acinclude.m4 (GLIBCPP_CONFIGURE): Update required compiler version. ! (GLIBCPP_CHECK_COMPILER_FEATURES): Can safely assume new ! diagnostics. Remove WFMT_FLAGS. ! * configure.in: Replace WFMT_FLAGS with diagnostics options. ! * libsupc++/Makefile.am: Likewise. ! * src/Makefile.am: Likewise. ! * aclocal.m4: Regenerated. ! * configure: Regenerated. ! * Makefile.in: Regenerated. ! * libio/Makefile.in: Regenerated. ! * libmath/Makefile.in: Regenerated. ! * libsupc++/Makefile.in: Regenerated. ! * src/Makefile.in: Regenerated. ! 2001-02-26 Phil Edwards ! Fixes libstdc++/2079 ! * include/backward/iomanip.h: Expose manipulators to global ! namespace. ! * include/backward/iostream.h: Also expose std::ws. ! 2001-02-25 Greg Freemyer ! * libmath/mathconf.h (GET_LDOUBLE_MSW64): Fix thinko. ! 2001-02-23 Benjamin Kosnik ! * include/bits/codecvt.h: Use __builtin_alloca. ! * include/bits/ostream.tcc: Same. * include/bits/fstream.tcc: Same. ! 2001-02-23 Alexandre Oliva ! * mknumeric_limits (CC): Use VAR=${VAR=...} form. ! 2001-02-23 David Edelsohn ! * mknumeric_limits (CC): Use $BUILD_DIR/../../gcc/xgcc ! 2001-02-23 Phil Edwards ! c++/2052 ! * include/backward/iostream.h: Expose std::flush in old headers. ! 2001-02-23 Gabriel Dos Reis ! * mknumeric_limits: Remove special-casing on target. Use gcc ! instead of g++ to build gen-num-limits.cc ! 2001-02-22 Benjamin Kosnik ! * tests_flags.in (CXXFLAGS): Add -rpath to gcc build dir. ! * include/bits/codecvt.h: Use alloca instead of __extension__ for ! the time being. ! * include/bits/ostream.tcc: Same. ! * include/bits/std_ostream.h: Same. ! * include/bits/fstream.tcc: Same. ! * include/bits/locale_facets.tcc: Add typename. ! * include/bits/c++config (_GLIBCPP_FULLY_COMPLIANT_HEADERS): Enable. ! 2001-02-21 Phil Edwards ! * tests_flags.in: Remove -n flag from call to echo. ! 2001-02-20 Benjamin Kosnik ! * config/c_locale_gnu.h: Add clocale include. ! 2001-02-20 Phil Edwards ! * include/bits/stl_config.h: Remove file. ! * src/Makefile.am (base_headers): Remove from list. ! * configure: Regenerate. ! * Makefile.in: Ditto. ! * libio/Makefile.in: Ditto. ! * libmath/Makefile.in: Ditto. ! * libsupc++/Makefile.in: Ditto. ! * src/Makefile.in: Ditto. ! * include/bits/c++config: Move relevant macros to here. ! * include/backward/alloc.h: Include c++config.h instead. ! * include/backward/function.h: Ditto. ! * include/backward/heap.h: Ditto. ! * include/backward/pair.h: Ditto. ! * include/bits/pthread_allocimpl.h: Ditto. ! * include/bits/std_functional.h: Ditto. ! * include/bits/std_iterator.h: Ditto. ! * include/bits/std_numeric.h: Ditto. ! * include/bits/std_utility.h: Ditto. ! * include/bits/stl_algobase.h: Ditto. ! * include/bits/type_traits.h: Ditto. ! * src/stl-inst.cc: Ditto. ! 2001-02-19 Gabriel Dos Reis ! * include/bits/basic_file.h: Add #pragma system_header ! * include/bits/basic_ios.h: Ditto. ! * include/bits/basic_string.h: Ditto. ! * include/bits/char_traits.h: Ditto. ! * include/bits/codecvt.h: Ditto. ! * include/bits/cpp_type_traits.h: Ditto. ! * include/bits/fpos.h: Ditto. ! * include/bits/gslice.h: Ditto. ! * include/bits/gslice_array.h: Ditto. ! * include/bits/indirect_array.h: Ditto. ! * include/bits/ios_base.h: Ditto. ! * include/bits/limits_generic.h: Ditto. ! * include/bits/locale_facets.h: Ditto. ! * include/bits/localefwd.h: Ditto. ! * include/bits/mask_array.h: Ditto. ! * include/bits/sbuf_iter.h: Ditto. ! * include/bits/sequence_concepts.h: Ditto. ! * include/bits/slice.h: Ditto. ! * include/bits/slice_array.h: Ditto. ! * include/bits/std_algorithm.h: Likewise. ! * include/bits/std_bitset.h: Likewise. ! * include/bits/std_complex.h: Likewise. ! * include/bits/std_deque.h: Likewise. ! * include/bits/std_fstream.h: Likewise. ! * include/bits/std_functional.h: Likewise. ! * include/bits/std_iomanip.h: Likewise. ! * include/bits/std_ios.h: Likewise. ! * include/bits/std_iosfwd.h: Likewise. ! * include/bits/std_iostream.h: Likewise. ! * include/bits/std_istream.h: Likewise. ! * include/bits/std_iterator.h: Likewise. ! * include/bits/std_list.h: Likewise. ! * include/bits/std_locale.h: Likewise. ! * include/bits/std_map.h: Likewise. ! * include/bits/std_memory.h: Likewise. ! * include/bits/std_numeric.h: Likewise. ! * include/bits/std_ostream.h: Likewise. ! * include/bits/std_queue.h: Likewise. ! * include/bits/std_set.h: Likewise. ! * include/bits/std_sstream.h: Likewise. ! * include/bits/std_stack.h: Likewise. ! * include/bits/std_stdexcept.h: Likewise. ! * include/bits/std_streambuf.h: Likewise. ! * include/bits/std_string.h: Likewise. ! * include/bits/std_utility.h: Likewise. ! * include/bits/std_valarray.h: Likewise. ! * include/bits/std_vector.h: Likewise. ! * include/bits/stringfwd.h: Likewise. ! * include/bits/type_traits.h: Likewise. ! * include/bits/valarray_array.h: Likewise. ! * include/bits/valarray_meta.h: Likewise. ! 2001-02-19 Andreas Jaeger ! * config/cpu/sparc/sparc64/bits/atomicity.h (__compare_and_swap): ! Fix typo. ! 2001-02-16 Greg Bumgardner ! libstdc++/1734 ! * include/bits/std_ostream.h: Replaced usage of ! _Traits::_S_eos() with _CharT() as per section 17.2.2.1.3. ! * include/bits/char_traits.h: Removed non-standard ! methods that cannot be used elsewhere. ! libstdc++/1885 ! * include/bits/basic_ios.h: Uncommented #include of ! bits/basic_ios.tcc ! libstdc++/1897 ! * include/bits/codecvt.h: See next... ! * include/bits/fstream.tcc: See next... ! * include/bits/ostream.tcc: Add __extension__ ! to variable-length arrays. ! libstdc++/1967 ! * include/bits/localefwd.h: Changed int counter type to size_t. ! libstdc++/1968 ! * include/bits/std_fstream.h: Added typedef for __ctype_type. ! 2001-02-16 Benjamin Kosnik ! * testsuite/21_strings/char_traits.cc: Move to ... ! * testsuite/21_strings/char_traits_requirements.cc: ..here. ! * testsuite/21_strings/char_traits-int_type.cc: Move to ... ! * testsuite/21_strings/char_traits_typedefs.cc: ..here. ! 2001-02-16 Gabriel Dos Reis ! * libmath/mathconf.h (FINITE_P, INFINITE_P): Remove macro ! definitions. ! 2001-02-15 Benjamin Kosnik ! * include/bits/c++config: Revert. ! 2001-02-15 Mark Mitchell ! * include/bits/istream.tcc: Use ios_base::iostate in place of ! iostate throughout. Insert `typename' keyword where necessary. ! * include/bits/ostream.tcc: Insert `typename' keyword where ! necessary. ! 2001-02-15 Jeffrey Oldham ! * include/bits/c++config (_GLIBCPP_FULLY_COMPLIANT_HEADERS): ! Define so library is compliant. ! 2001-02-15 Anthony Green ! * acinclude.m4 (glibcpp_toolexeclibdir): Fix test for cross ! compilation. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-02-15 Rodney Brown ! * acinclude.m4 (GLIBCPP_CHECK_MATH_DECL_1): ! Include ieeefp.h for fpclass on UnixWare{2,7}. * aclocal.m4: Regenerate. * configure: Regenerate. ! * mkcheck.in (size_command): Do without GNU-grep when using ! size from binutils. ! ! 2001-02-15 Mark Mitchell ! ! Remove old ABI support from libsupc++. ! * libsupc++/cxxabi.h: Remove conditionally compiled code. ! * libsupc++/exception_support.cc: Likewise. ! * libsupc++/pure.cc: Likewise. ! * libsupc++/tinfo.cc: Likewise. ! * libsupc++/tinfo.h: Likewise. ! * libsupc++/tinfo2.cc: Likewise. ! * libsupc++/typeinfo: Likewise. ! * libsupc++/vec.cc: Likewise. ! ! 2001-02-15 Benjamin Kosnik ! ! Add support for -fno-exceptions. ! * include/bits/exception_support.h: Remove. ! * include/bits/basic_string.h: Remove exception_support. ! (string::_M_check): Replace __OUTOFRANGE with __throw_out_of_range. ! (string::at): Same. ! (string::substr): Same. ! * include/bits/basic_string.tcc (string::reserve): Replace ! __LENGTHERROR with __throw_length_error. ! (string::_S_create): Same. ! (string::resize): Same. ! (string::_M_replace): Same. ! (string::replace): Same. ! (string::copy): Replace __OUTOFRANGE with __throw_out_of_range. ! (string::compare): Same. ! * include/bits/stl_vector.h: Remove exception_support. ! * src/Makefile.am (base_headers): Remove here. ! * src/Makefile.in: Regenerate. ! ! * include/bits/stl_range_errors.h: Remove. ! * include/bits/stl_deque.h: Use __throw_range_error. ! * include/bits/std_deque.h: Include functexcept.h. ! * include/bits/std_vector.h: Same. ! * src/Makefile.am (base_headers): Remove here. ! * src/Makefile.in: Regenerate. ! * include/ext/stl_bvector.h (class __BVECTOR): Use __throw_range_error. ! * include/ext/bvector: Remove stl_range_errors.h ! ! * include/bits/c++config (_GLIBCPP_USE_EXCEPTIONS): Remove. ! ! * include/bits/functexcept.h: New file. ! * src/functexcept.cc: New file. Definitions for function-based ! exception routines. ! * src/Makefile.am (sources): Add functexcept.cc. ! * src/Makefile.in: Regenerate. ! ! * include/bits/stl_config.h (__STL_USE_EXCEPTIONS): Wrap with ! __EXCEPTIONS. ! ! * include/bits/localefwd.h: Include functexcept.h. ! * include/bits/std_iosfwd.h: Same. ! ! * include/bits/basic_ios.h: Use __throw_ios_failure instead of ! throw basic_ios::failure. ! * include/bits/fstream.tcc (filebuf::_M_allocate_buffers): ! Use __throw_exception_again. ! (filebuf::_M_filebuf_init): Same. ! * include/bits/streambuf.tcc (__copy_streambufs): Same. ! * include/bits/ostream.tcc (ostream::operator<<): Same. ! * include/bits/istream.tcc (istream::operator>>): Same. ! * include/bits/basic_string.tcc (string::_M_mutate): Same. ! (string::_S_construct): Same. ! (string::_M_clone): Same. ! * include/bits/locale_facets.tcc (use_facet(const locale&)): Use ! __throw_bad_cast. ! (num_put<_CharT, _OutIter>::do_put): Use __throw_exception_again. ! * src/localename.cc (locale::_Imp::_Imp(const _Impl&, size_t): Use ! __throw_exception_again. ! (locale::_Imp::_Imp(string, size_t): Same. ! (locale::_Imp::_M_replace_facet): Use __throw_runtime_error. ! * src/locale.cc (locale::_M_coalesce): Use __throw_exception_again. ! (locale::locale(const char*)): Use __throw_runtime_error. ! (locale::classic): Use __throw_exception_again. ! (locale::_S_normalize_category): Use __throw_runtime_error. ! ! * src/stdexcept.cc: Remove cruft. ! ! * libsupc++/exception_defines.h: New file. ! * libsupc++/new_opnt.cc: Include exception_defines.h. ! * libsupc++/vec.cc: Same. ! (__cxa_vec_new2): Use __throw_exception_again. ! (__cxa_vec_new3): Same. ! (__cxa_vec_ctor): Same. ! (__cxa_vec_delete3): Same. ! (__cxa_vec_cctor): Same. ! (__cxa_vec_delete2): Same. ! (__cxa_vec_dtor): Same. ! * libsupc++/exception_support.cc: Include exception_defines.h. Only ! compile exception-handling bits if __EXCEPTIONS is defined. ! Remove old ABI support. ! * libsupc++/new_op.cc (new): Include exception_defines.h. Use ! std::__throw_bad_alloc() instead of throw bad_alloc. ! * libsupc++/Makefile.am: Add exception_defines.h. ! * libsupc++/Makefile.in: Reformat. ! * libsupc++/*: Format. ! ! 2001-02-15 Phil Edwards ! ! * docs/html/configopts.html: Minor updates and typo fixes. ! * docs/html/faq/index.html: Updates of the "not really bugs" list. ! * docs/html/faq/index.txt: Regenerated. ! ! 2001-02-15 Gabriel Dos Reis ! * testsuite/lib/libstdc++.exp: Lift, temporarily, out of ! dejagnu/dg.exp. Adapt to log options used to run testcases. ! 2001-02-13 Gabriel Dos Reis ! * testsuite/lib/libstdc++.exp(dg-test): Lift temporarily from ! dejagnu/dg.exp. ! 2001-02-13 Dirk Mueller ! Phil Edwards ! * include/backward/function.h: Do not use rel_ops for older ! headers either. ! * include/backward/pair.h: Likewise. ! 2001-02-12 Mark Mitchell ! * src/locale.cc: Remove bogus locale::id definitions. ! 2001-02-11 Gabriel Dos Reis ! * include/bits/std_valarray.h: #undef _DEFINE_LOGICAL_OPERATOR, ! not _DEFINE_VALARRAY_OPERATOR which is not existent. ! * include/bits/valarray_meta.h (_RefFunClos<>_RefRunClos): Fix ! thinko in member initialisation. ! 2001-02-11 Gabriel Dos Reis ! * include/bits/std_valarray.h(valarray<>::shift): Avoid ! comparaison between signed and unsigned integer types. ! (valarray<>::cshift): Reformat. ! 2001-02-11 Alexandre Oliva ! * src/gen-num-limits.cc: Use sigsetjmp and siglongjmp if available. ! * mknumeric_limits: Compile it with -DHAVE_CONFIG_H. ! * configure.in: Test for sigsetjmp. ! * configure, config.h.in: Rebuilt. ! 2001-02-11 Gabriel Dos Reis ! * src/valarray-inst.cc (gslice::_Indexer::_Indexer): Don't flip ! lengths and strides. ! (__gslice_to_index): Document. ! 2001-02-11 Gabriel Dos Reis ! * include/bits/char_traits.h char_traits::int_type: Change ! to `int' to match 21.1.3.1/2. ! * testsuite/21_strings/char_traits-int_type.C: New test. ! 2001-02-10 Gabriel Dos Reis ! * testsuite/Makefile.am: New file. ! 2001-02-09 Nathan Sidwell ! * include/c_shadow/bits/std_cstdlib.h (lldiv_t): Fix typo. ! 2001-02-08 Loren J. Rittle ! * src/locale-inst.cc (fill_n): Instantiate with size_t arguments. ! 2001-02-08 David Edelsohn ! * configure.target (aix4*): Remove extra set of brackets. ! 2001-02-07 Benjamin Kosnik ! Clean up stdexcept. ! * include/bits/stringfwd.h: New file. ! * include/bits/stl_string_fwd.h: Remove. ! * include/bits/localefwd.h: Remove declaration for allocator. ! * include/bits/std_iosfwd: Same. ! * include/bits/std_string.h: Include it. ! * include/bits/std_ios.h: Remove include. ! * include/bits/basic_string.h: Tweak. ! * libsupc++/new: Format. ! * src/Makefile.am (base_headers): Add stringfwd.h, remove ! stl_string_fwd.h ! * src/Makefile.in: Regenerate. ! * include/bits/std_stdexcept.h: Rewrite. ! * src/stdexcept.cc: Same. ! 2001-02-06 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Deal with library ! install locations too. ! * aclocal.m4: Regenerate. ! * configure.in: Remove USE_LIBDIR. ! * configure: Regenerate. ! * src/Makefile.am (toolexecdir): Simplify, use ! glibcpp_toolexecdir, glibcpp_toolexeclibdir. ! * src/Makefile.in: Regenerate. ! * libsupc++/Makefile.am: Same. ! * libsupc++/Makefile.in: Regenerate. ! * src/Makefile.am: Just remove special rules for locale-inst.cc and ! misc-inst.cc as no longer necessary. ! Follow C++STYLE for naming non-static functions. ! * include/bits/ostream.tcc (_S_pad_char): Not static, rename to ! __pad_char. ! * include/bits/streambuf.tcc: Same. ! * include/bits/ostream.tcc: Same. ! * include/bits/istream.tcc: Same. ! * include/bits/locale_facets.tcc (_S_pad_numeric): To __pad_numeric. ! (_S_output_float): To __output_float. ! * include/bits/std_streambuf.h (_S_copy_streambufs): To ! __copy_streambufs. ! * include/bits/locale_facets.tcc (_S_build_float_format): To ! __build_float_format. ! (_S_format): To __output_integer. ! (_S_fill): To __pad. ! * src/locale.cc: Same. ! * src/misc-inst.cc: Fix formatting. Fix signature for wchar_t. Correct ! names. ! * include/bits/locale_facets.tcc (_S_group_digits): To ! __group_digits. ! * src/locale-inst.cc: Fixup names. Add use_facet instantiations ! for collate, numpunct. ! 2001-02-06 Phil Edwards ! * docs/html/configopts.html: Fix HTML markup. ! * docs/html/install.html: Bring up to date. ! * docs/html/17_intro/C++STYLE: Add global variable conventions. ! * docs/html/21_strings/howto.html: More notes. ! * docs/html/22_locale/howto.html: Fix HTML markup. ! * docs/html/27_io/howto.html: More notes. ! * docs/html/27_io/binary_iostreams_kanze.txt: New file. ! * docs/html/27_io/binary_iostreams_kuehl.txt: New file. ! 2001-02-06 Jeffrey Oldham ! * src/misc-inst.cc (_S_pad_char): Modify declaration's parameters ! to match header files. ! (_S_output_float): Likewise. ! (_S_copy_streambufs): Likewise. ! 2001-02-06 Hyman Rosen ! Phil Edwards ! * include/bits/std_istream.h (op>> signed,unsigned char): Must ! use reinterpret_cast, not static_cast. ! 2001-02-06 Benjamin Kosnik ! * acinclude.m4 (gxx_include_dir): Quote, fix regression. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-02-05 Benjamin Kosnik ! * include/bits/locale_facets.h (class moneypunct): Fix typos. ! * libsupc++/pure.cc: Revert. ! 2001-02-05 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_CHECK_MATH_DECL_1): New macro. ! (GLIBCPP_CHECK_MATH_DECL_2): New macro. ! (GLIBCPP_CHECK_MATH_DECL_3): New macro. ! (GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1): Use it, check for _* too. ! (GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_2): Same. ! (GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_3): Same. ! (GLIBCPP_CHECK_MATH_SUPPORT): Remove explicit checks for _* versions. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2001-02-05 Mark Mitchell ! * include/bits/locale_facets.tcc: Remove `static' keyword on ! function definitions. ! * include/bits/std_streambuf.h: Likewise. ! * src/Makefile.am: Remove use of -fimplicit-templates. ! * src/Makefile.in: Regenerated. ! * src/locale-inst.cc: Explicitly instantiate more functions. ! * src/misc-inst.cc: Likewise. ! * src/string-inst.cc: Likewise. ! 2001-02-05 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): New ! macro. Consolidate all the bits to do with where includes might be ! installed. * aclocal.m4: Regenerate. - * configure.in: Use it. * configure: Regenerate. - * src/Makefile.am (targetincludep): Use simplified rules. - (targetincludep): Rename gxx_target_include_dir. - (myincludep): Rename gxx_include_dir. - * src/Makefile.in: Regenerate. - * libsupc++/Makefile.am: Use simplified rules. - * libsupc++/Makefile.in: Regenerate. - - 2001-02-05 Benjamin Kosnik - - * include/c_std/bits/std_cerrno.h: Correct date format for copyright. - * include/c_std/bits/std_cctype.h: Same. - * include/c_std/bits/std_cassert.h: Same. - * include/c_std/bits/std_cstdarg.h: Same. - * include/c_std/bits/std_cstddef.h: Same. - - * include/c_std/bits/std_cstdio.h: Undefine all names brought into - namespace std. - * include/c_std/bits/std_ctime.h: Same. - * include/c_std/bits/std_clocale.h: Same. - * include/c_std/bits/std_cmath.h: Same. - * include/c_std/bits/std_csetjmp.h: Same. - * include/c_std/bits/std_csignal.h: Same. - * include/c_std/bits/std_cstring.h: Same. - * include/c_std/bits/std_cstdlib.h: Same. - * include/c_std/bits/std_cwchar.h: Same. - - 2001-02-05 Phil Edwards - - * testsuite/27_io/ios_base_members_static.cc: Swap order of tests. - - 2001-02-05 Mark Mitchell - - * src/string-inst.cc (string::_M_replace): Explicitly instantiate. - (string::_S_construct): Likewise. - - 2001-02-05 Gabriel Dos Reis - - * testsuite/config/default.exp: New file. - * testsuite/config: New directory. - - 2001-02-04 Mark Mitchell - - * libsupc++/typeinfo (__GXX_MERGED_TYPEINFO_NAMES): New macro. - * libsupc++/tinfo.cc (std::typeinfo::operator==): Use strcmp - whenever !__GXX_MERGED_TYPEINFO_NAMES. - * libsupc++/tinfo2.cc (std::typeinfo::before): Likewise. - - 2001-02-03 Alexandre Oliva - Gerald Pfeifer - - * Makefile.am (mkinstalldirs): Set. - * src/Makefile.am (mkinstalldirs): Set. - * libmath/Makefile.am (mkinstalldirs): Set. - * libsup++/Makefile.am (mkinstalldirs): Set. - * libio/Makefile.am (mkinstalldirs): Set. - * */Makefile.in: Regenerate. - - 2001-02-03 Benjamin Kosnik - - * include/bits/stl_threads.h (struct _STL_mutex_lock): Same. - * include/bits/localefwd.h: More initialization cleanups. - - 2001-02-03 Jeffrey A Law - - * include/bits/ios_base.h (_S_ios_fmtflags_end): Initialize - correctly targets with 16bit ints. - (_S_ios_openmode_end): Similarly. - (_S_ios_iostate_end): Similarly. - (_S_ios_Seekdir_end): Similarly. - - 2001-02-02 Phil Edwards - - * mkcheck.in: Also limit virtual memory size, for mmap-based mallocs. - - 2001-02-01 Alexandre Oliva - - * configure.in (toplevel_srcdir, auxdir): Set. - * acinclude.m4 (glibcpp_basedir): Set based on auxdir. - * aclocal.m4, configure, Makefile.in: Rebuilt. - * libio/Makefile.in, math/Makefile.in, src/Makefile.in: Likewise. - * libsupc++-v3/Makefile.am (INCLUDES): Use toplevel_srcdir. - * libsupc++-v3/Makefile.in: Rebuilt. - * libsupc++-v3/configure.in, libsupc++-v3/configure: Removed. - * libsupc++-v3/aclocal.m4, libsupc++-v3/config.h.in: Likewise. - - 2001-01-30 Benjamin Kosnik - - * config/c_locale_generic.cc: Remove langinfo include. - - 2001-01-29 Benjamin Kosnik - - Preliminary named locales. - * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): New macro. - * aclocal.m4: Regenerate. - * configure.in: Use it. - * configure: Regerate. - * src/Makefile.am (sources): Add c++locale.cc. - (build_headers): Add c++locale.h. - * src/Makefile.in: Regenerate. - * config/c_locale_gnu.h: New file. - * config/c_locale_gnu.cc: New file. Non-inline member functions - for named locales, gnu-specific. - * config/c_locale_generic.h: New file. - * config/c_locale_generic.cc: New file. Non-inline member - functions for named locales, generic version. - * docs/html/configopts.html: Add documentation on new options. - - * include/bits/locale_facets.h (class _Messages): Remove. - (class _Moneypunct): Remove. - * src/locale-inst.cc: Remove. - - * include/bits/locale_facets.h (class _Collate): Remove. - * src/locale-inst.cc (std): Remove. - * src/locale.cc: And here. - - * include/bits/localefwd.h (locale::_M_coalesce): New - function. Correctly put together multi-name locales. - (_Impl(const _Impl&, category, size_t)): Remove. - - * include/bits/localefwd.h (locale::_Impl): Remove _M_construct_* - member functions. - (_M_normalize_category_names): Remove. - (_M_replace_categories): Fix. - - * src/localename.cc (locale::_Impl::_M_construct_collate): Remove. - (locale::_Impl::_M_construct_ctype): Remove. - (locale::_Impl::_M_construct_monetary): Remove. - (locale::_Impl::_M_construct_numeric): Remove. - (locale::_Impl::_M_construct_time): Remove. - (locale::_Impl::_M_construct_messages): Remove. - - * include/bits/locale_facets.h (_Bad_use_facet): Remove. - (_Use_facet_failure_handle): Remove. - * src/locale.cc: Remove definitions. - * src/locale-inst.cc: And here. - - * testsuite/22_locale/ctor_copy_dtor.cc (test01): Fixup. Add tests. - - * src/localename.cc (locale::facet::_S_create_c_locale): Properly - create and error-check underlying locale object. - (locale::facet::_S_destroy_c_locale): Add, take care of properly - tearing down underlying locale object. - * include/bits/localefwd.h (locale::facet): Declare. - * testsuite/22_locale/members.cc: Don't test "fr_FR" locale for - correctness, as glibc apparently has incorrect info in it. Test - with it when it works again..... - - * include/bits/localefwd.h (locale::_Impl::__vec_string): - Remove. Number of categories is fixed at six, so just simplify and - make this an array of strings. - (locale::_Impl::_M_has_name): Remove. - (locale::_Impl::_M_name): Remove. - (locale::_Impl::_M_category_names): Turns into... - (locale::_Impl::_M_names): ...this. - (locale::_Impl::_M_has_same_name()): New function. - * src/localename.cc (locale::_Impl::~_Impl()): Remove here. - (locale::_Impl::_Impl(size_t __refs, string __str)): Simplify - signature. - * src/locale.cc (locale::name()): Construct mangled name - accurately reflecting combined locale categories. - - * src/locale.cc (locale::classic()): Don't initialize here. - * src/localename.cc (locale::_Impl::_Impl(size_t __num, size_t - __refs, bool __has_name, string __str): Do it here. - - * include/bits/localefwd.h: _S_categories_num to - _S_num_categories. _S_facets_num to _S_num_facets. - (locale::id::id()): Explicitly set _M_index to zero. - * src/locale.cc: Same. - - * src/locale.cc: (locale::locale(const char*)): Construct named - locales uniquely. - - * src/locale.cc: Remove numpunct_byname ctors. - * testsuite/22_locale/numpunct_byname.cc: New file. - * testsuite/22_locale/numpunct.cc: New file. - - * include/bits/localefwd.h (class locale): Change data members to - protected, from private. - (_Impl::_M_get_c_locale): Add member function. - (locale::facet::_M_get_global_impl()): Add member function. - * include/bits/locale_facets.h (numpunct::_M_init): Change to take - a __c_locale pointer. - (numpunct::numpunct( __c_locale*, size_t)): Add additonal ctor for - named locales. - * testsuite/22_locale/members.cc: New file, test name and combine. - - * include/bits/locale_facets.h (class numpunct): Remove class - _Punct and _Numpunct. Rewrite class numpunct to be correct for - named locales. - * include/bits/localefwd.h (locale::_Imp::_M_c_locale): Add. - * src/localename.cc (_Impl::~_Impl()): Call __frelocale. - (_Imp::_Impl(size_t, size_t, bool, string)) Initialize _M_c_locale. - * src/locale-inst.cc: Remove _Numpunct, _Punct instantiations. - * testsuite/22_locale/numpunct_char_members.cc: New file. - - 2001-01-28 Gabriel Dos Reis - - * testsuite/README: Add more comment. - * testsuite/lib/libstdc++.exp: Tweak comment. - - 2001-01-26 Benjamin Kosnik - - * libsupc++/pure.cc (writestr): Just use cstdio and std::fputs. - - 2001-01-25 Loren J. Rittle - - * testsuite/21_strings/inserters_extractors.cc: Remove - explicit reference to 'testsuite/'. - - 2001-01-25 Richard Henderson - - * config/cpu/alpha/bits/atomicity.h: Remove tricky .subsetion - bits. Fixes Tru64 build issues. - - 2001-01-25 Michael Sokolov ! * acinclude.m4 (GLIBCPP_CHECK_GNU_MAKE): Bourne shell portability bug ! (use ${MAKE-make}, not ${MAKE:-make}). ! * aclocal.m4, configure: Regenerate. ! ! 2001-01-25 Mark Mitchell ! ! * src/ios.cc: Remove accidental inclusion of in last ! checkin. ! ! * src/Makefile.am (sources): Add globals.cc. ! * src/Makefile.in: Regenerated. ! * src/globals.cc: New file. ! * src/ios.cc (cin): Don't define here, just declare extern. ! (cout): Likewise. ! (cerr): Likewise. ! (clog): Likewise. ! (wcin): Likewise. ! (wcout): Likewise. ! (wcerr): Likewise. ! (wclog): Likewise. ! ! 2001-01-25 Phil Edwards ! ! * include/bits/std_iterator.h: Do not include stl_relops.h. ! * include/bits/std_numeric.h: Ditto. ! * include/bits/stl_algobase.h: Ditto. ! * include/bits/stl_relops.h: Add comment warning about problems. ! ! 2001-01-25 Gabriel Dos Reis ! ! * testsuite/27_io/*.cc: Remove explicit reference to 'testsuite/' ! in testcases. Prepare for the DejaGnu based framework. ! * mkcheck.in: Adjust call to tests_flags. Don't mmkdir testsuite ! directory -- it is now mkcheck working directory. ! * tests_flags.in: Remove reference to $(top_srcdir). Use ! ${SRC_DIR} instead. ! * Makefile.am (check, check-install): Change mkcheck invocation ! logic. ! * Makefile.in: Regenerate. ! ! 2001-01-24 Mark Mitchell ! ! * config/os/aix/bits/atomicity.h (__compare_and_swap): Remove. ! (__always_swap): Likewise. ! 2001-01-23 Chris Demetriou ! * libsupc++/exception_support.cc (__terminate_func): Remove ! declaration. ! (__terminate_func_ptr): New typedef. ! (__terminate, __terminate_set_func): New extern function ! prototypes. ! (std::terminate): Use __terminate function. ! (std::set_terminate): Use __terminate_set_func function. ! 2001-01-23 Benjamin Kosnik ! * configure.target: Just use os_include_dir always. ! * configure.in: Remove calls to GLIBCPP_CHECK_CTYPE_SUPPORT. ! Link atomicity files and ctype files here. ! * configure: Regenerate. ! * acinclude.m4 (GLIBCPP_CHECK_CTYPE_SUPPORT): Remove. ! (GLIBCPP_ENABLE_ATOMICITY): Remove. ! * aclocal.m4: Regenerate. ! 2001-01-23 Chris Demetriou ! * configure.in: Place definition of MULTISUBDIR in ! libsupc++/Makefile as is done for src/Makefile. ! * configure: Regenerate. ! 2001-01-23 Phil Edwards ! * acinclude.m4: Cosmetic changes only. ! * aclocal.m4: Regenerated. ! * configure: Regenerated. ! * configure.target: Update documented list of changed variables. ! * docs/html/install.html: Fix typo. ! * docs/html/20_util/howto.html: More notes on auto_ptr. ! * docs/html/27_io/howto.html: More notes on streabufs. ! * docs/html/faq/index.html: Add rel_ops problem and mention the ! DEC as(1) .subsection difficulty. ! * docs/html/faq/index.txt: Regenerated. ! 2001-01-23 Mark Mitchell ! * ainclude.m4 (GLIBCPP_CHEC_MATH_DECLS_AND_LINKAGE_1): New macro. ! (GLIBCPP_CHECK_MATH_SUPPORT): Use it. ! (GLIBCPP_CHECK_TYPE_SUPPORT): Don't autoconf ctype information if ! its already provided in config.target. ! * aclocal.m4: Regenerated. ! * configure: Likewise. ! * configure.target: Set ctype_include_dir for lots of systems. ! * libsupc++/Makefile.am: Explicitly include --tag disable-shared. ! * libsupc++/Makefile.in: Regenerated. ! 2001-01-23 Gabriel Dos Reis ! * testsuite/lib/libstdc++.exp: Improve. Add support for @xxx# ! keyword capability. ! * testsuite/README: Add comment. ! 2001-01-21 Phil Edwards ! * docs/html/configopts.html: Update for current status. Fix HTML. ! * docs/html/install.html: Update for current status. ! 2001-01-20 Gabriel Dos Reis ! * testsuite/libstdc++.tests/tests.exp: New file. ! * testsuite/lib/libstdc++.exp: Itou. ! * testsuite/README: Itou. ! 2001-01-20 Gabriel Dos Reis ! * tests_flags.in: Just output the bare minimum to run tests. ! Let's the caller do its own arrangement. ! * mkcheck.in: Rename INC_PATH to INCLUDES. Adjust flags ! computations. ! 2001-01-19 Gabriel Dos Reis ! * testsuite/17_intro: Prepare testcases for new style DejaGnu ! framework. ! 2001-01-18 Gabriel Dos Reis ! * testsuite/libstdc++.tests, testsuite/lib: New directories. ! 2001-01-17 Loren J. Rittle ! * mkcheck.in: Construct file names that match $objdir structure. ! * testsuite/27_io/filebuf_members-1.txt: New file. ! * testsuite/27_io/ifstream_members-1.txt: New file. ! * testsuite/27_io/ostream_inserter_char-1.txt: New file. ! * testsuite/27_io/ios_base_members_static.cc (test02): Add test. ! * testsuite/27_io/ios_base_members_static-1.tst: Add expected output. ! 2001-01-17 Peter Schmid ! * testsuite/27_io/istream_sentry.cc (test02): Fix. ! 2001-01-17 Benjamin Kosnik ! libstdc++/1605 ! * include/bits/ios_base.h (ios_base::failure): Tighten up throw specs. ! * src/ios.cc (ios_base::failure): Make definitions match. ! * libsupc++/typeinfo (class bad_typeid): Add throw specs. ! (class bad_cast): Same. ! * libsupc++/exception (class exception): Add throw specs. ! * libsupc++/exception_support.cc (set_terminate): Add throw specs. ! (set_unexpected): Same. ! (uncaught_exception): Same. ! (what): Same. ! * docs/html/17_intro/C++STYLE (classname): Fix. ! 2001-01-16 Mark Mitchell ! * src/gen-num-limits.cc (INSTANTIATIONS): New macro. ! Use it do explicitly instantiate predicate and value for ! all the builtin Ts. ! 2001-01-16 Nathan Sidwell ! * libsupc++/exception_support.cc (__cp_pop_exception): Fix ! uninitialized thinko in last change. ! 2001-01-16 Mark Mitchell ! * libsupc++/exception_support.cc (__cp_pop_exception): Change ! prototype. ! 2001-01-16 Benjamin Kosnik ! * docs/html/17_intro/C++STYLE (classname): Add more existing ! and stylish patterns. ! libstdc++/944 ! * include/bits/istream.tcc (istream::sentry::sentry()): Set ! failbit if the state of the stream is not good. ! * testsuite/27_io/istream_sentry.cc (test02): Add test. ! * testsuite/27_io/istream_manip.cc (test01): Modify. ! libstdc++/1019 ! reported by Paolo Carlini ! * include/bits/istream.tcc (operator>>(istream&, string&)): Fix. ! * testsuite/21_strings/inserters_extractors.cc (test08): Add test. ! libstdc++/1057 ! * include/bits/std_streambuf.h (setp): Set _M_buf_size correctly. ! * include/bits/streambuf.tcc (xsputn): Remove outside if clause. ! (xsgetn): Same. Simplify. ! * testsuite/27_io/streambuf.cc (test04): Add testcases. ! reported by Larry Evans ! * include/bits/streambuf.tcc (streambuf::xsputn): Just check for ! equality with eof on returned value from overflow. ! 2001-01-14 Andreas Jaeger ! * libio/libio.h: Add test for glibc 2.0. ! 2001-01-12 Benjamin Kosnik ! * config/os/djgpp/bits/*: Fix dates. ! * include/bits/basic_string.h (_S_find(const _CharT* __beg, const ! _CharT* __end, _CharT __c): Remove. ! * include/bits/basic_string.tcc: Substitute traits::find for _S_find. ! * include/bits/char_traits.h: Tweak. ! 2001-01-12 Laurynas Biveinis ! * acinclude.m4 (GLIBCPP_CHECK_CTYPE_SUPPORT): check for DJGPP ! (LIB_AC_PROG_CXX): replace [/\\] with [\\/] to work around older ! bash bug. ! * aclocal.m4: regenerated. ! * configure.target: set os_include_dir to config/os/djgpp under DJGPP. ! * configure: regenerated. ! * config/os/djgpp, config/os/djgpp/bits: new directories. ! * config/os/djgpp/bits/ctype_base.h, ! config/os/djgpp/bits/ctype_inline.h, ! config/os/djgpp/bits/ctype_noninline.h, ! config/os/djgpp/bits/os_defines.h: new files. ! 2001-01-11 Joseph S. Myers ! * include/c_std/bits/std_cstdio.h: Undef printf. ! 2001-01-10 Benjamin Kosnik ! * src/ios.cc: Fix typo: change cout->wcout. ! * src/Makefile.am (targetincludep): Fix for version-specific-libs. ! * src/Makefile.in: Regenerate. ! 2001-01-10 Peter Schmid ! * include/bits/std_complex.h: Fix a typo. ! 2001-01-09 Benjamin Kosnik ! ! Fixes for libstdc++/1576 ! * src/stdstreams.cc: Initialize with NULL filebuf. Delete ! file, move contents into.... ! * src/ios.cc: ...Here. Put defines for iostreams objects and ! initialization routines into one file to simplify DSO interaction. ! * include/bits/std_iostream.h: Touch. ! * include/bits/ios_base.h (_S_synched_with_stdio): Make static. ! * src/Makefile.am (sources): Remove stdstreams.cc. ! * src/Makefile.in: Regenerate. ! 2001-01-10 Gabriel Dos Reis ! * tests_flags.in (check_directory): Fix typo. ! 2001-01-09 Peter Schmid ! * include/bits/std_complex.h: Fix a typo. ! 2001-01-09 Loren J. Rittle ! * config/os/bsd/freebsd/bits/ctype_inline.h (is): (Make right ! code path:) Remove magic constants and restructure to handle ! ctype.h bit mask layout changes more gracefully. (Make fast ! code path:) Use __maskrune (), if available. ! (is): Remove special case for digit and xdigit masks. ! 2001-01-09 Robert Lipe ! * include/c_std/bits/std_ctime.h: Undefine difftime. ! 2001-01-09 Alexandre Oliva ! * src/gen-num-limits.cc (signal_adapter): New template function. ! (signal_handler): Use it, instead of signal. ! (traps): Likewise. Install SIGTRAP handler too. Don't ! require both tests to trap to set trap_flag. ! 2001-01-08 Benjamin Kosnik ! * include/bits/fpos.h (fpos:::fpos(streamoff __pos)): Explicitly ! initialize mbstate_t member, name offset data members *off, not pos. ! * include/bits/fstream.tcc (filebuf::filebuf): Same. ! 2001-01-08 Benjamin Kosnik ! reported by Chris G. Demetriou ! * configure.in: Change -linux-* to -linux*. ! * configure: Regenerate. ! 2001-01-05 Benjamin Kosnik ! Fix 27_io/filebuf_members.cc ! * src/localename.cc (locale::_Impl::_Impl(const _Impl& __imp, ! const string& __name, category __cat, size_t __refs): Set ! _M_has_name with _M_name. ! * include/bits/localefwd.h (locale::operator!=): Protect member ! function call with this->. ! * src/locale.cc (locale::operator==): Make fast checks first. ! * include/bits/basic_ios.tcc (basic_ios::init): Simplify. ! * include/bits/ios_base.h (_M_synced_with_stdio): Add data member ! to ios_base::Init. ! * src/ios.cc (ios_base::Init::Init): Initialize here. ! (ios_base::sync_with_stdio): Set here. ! 2001-01-04 Loren J. Rittle ! * config/c_io_stdio.cc (__basic_file<_CharT>::sys_open()): On ! systems that support it, call dup() before fdopen(). ! 2001-01-03 Benjamin Kosnik ! * include/c_std/bits/std_cwctype.h: Include std_cwchar.h for wint_t. ! * testsuite/17_intro/header_cwctype.cc (main): New file. ! * src/Makefile.am (base_headers): Change. ! * include/bits/std_string.h: And here. ! * include/bits/string.tcc: Tweaks, move to... ! * include/bits/basic_string.tcc: ...Here. ! * src/string-inst.cc: Simplify, just instantiate the whole class, ! not member-by-member. ! 2001-01-02 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_ENABLD_CSTDIO): Add in default value. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * include/bits/c++config (__GLIBCPP__): Bump version number. ! * ChangeLog: Start new log for year 2001 ! * ChangeLog-2000: New file. ! * docs/html/configopts.html: Make sure default values are current, ! add commentary. ! 2001-01-01 Benjamin Kosnik ! * include/c_std/bits/std_cwchar.h: Same. ! * testsuite/17_intro/header_cwchar.cc: Same. ! * include/c_std/bits/std_ctime.h: Same. ! * testsuite/17_intro/header_ctime.cc: Same. ! * include/c_std/bits/std_cstdlib.h: Same. ! Clean up undefs, make consistent with cwchar and cmath, etc. ! * testsuite/17_intro/header_cstdlib.cc: Same. ! * include/c_std/bits/std_cstdio.h: Same here. ! * testsuite/17_intro/header_cstring.cc: Same. ! * include/c_std/bits/std_cstring.h: Include std_cstddef.h for size_t. ! * testsuite/17_intro/header_cstring.cc: New file. Check for ! size_t in namespace std. ! * include/c_std/bits/std_cwchar.h: Explicit checks for mbstate_t. ! * acconfig.h (HAVE_MBSTATE_T): Add. ! * config.h.in: Regenerate. ! * acinclude.m4(GLIBCPP_CHECK_WCHAR_T_SUPPORT): Always test for ! mbstate_t. ! * aclocal.m4: Regenerate. * configure: Regenerate. - * testsuite/17_intro/headers_c++.cc: New file. - * testsuite/17_intro/headers_c.cc: Small changes. - - 2001-01-01 David Billinghurst - - * tests_flags.in: Fix typo in usage. - - * tests_flags.in: Set target specific LIBS for cygwin. --- 1,2455 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-09 Jakub Jelinek ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Append all ! multilib dirs containing libgcc_s*.so.1 below gcc object dir to ! LD_LIBRARY_PATH. ! 2002-05-08 Alexandre Oliva ! * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ! script entry, and set LD to it when configuring multilibs. ! * configure: Rebuilt. ! 2002-05-06 Phil Edwards ! * docs/html/documentation.html: Fix broken link. ! 2002-05-03 Benjamin Kosnik ! PR libstdc++/6549. ! * include/bits/fstream.tcc (filebuf::_M_underflow_common): Revert. ! * testsuite/27_io/narrow_stream_objects.cc (test07): Add. ! 2002-05-02 Phil Edwards ! * docs/html/faq/index.html: Update list in #4.1. ! * docs/html/faq/index.txt: Regenerated. ! 2002-05-01 Phil Edwards ! * include/std/std_bitset.h: Fix doxygen comments. ! * docs/html/documentation.html: Minor tweaks for 3.1. ! * docs/html/27_io/howto.html: Likewise. ! * docs/html/ext/howto.html: Likewise, mention stdio_filebuf. ! * docs/html/faq/index.html: Likewise. ! * docs/html/faq/index.txt: Regenerated. ! 2002-05-01 Benjamin Kosnik ! PR libstdc++/6533 ! * include/bits/streambuf_iterator.h (istreambuf_iterator::_M_get): New. ! (istreambuf_iterator::equal): Use it. ! (istreambuf_iterator::operator*): Use it. ! 2002-05-01 Paolo Carlini ! ! PR libstdc++/6513 ! * include/bits/stl_uninitialized.h ! (uninitialized_copy(_InputIter, _InputIter, _ForwardIter)): ! Fix typo in 2001-07-17 commit: typedef _ValueType to ! iterator_traits<_ForwardIter> not <_InputIter>. ! * testsuite/23_containers/vector_ctor.cc: Add test04. ! 2002-04-30 John David Anglin ! PR libstdc++/6501 ! * include/c_std/std_cctype.h: Include bits/c++config.h. ! * config/os/hpux/bits/os_defines.h (_SB_CTYPE_MACROS): Define. ! 2002-04-30 Benjamin Kosnik ! * include/ext/stdio_filebuf.h: New file. ! * include/ext/enc_filebuf.h: New file. ! * config/io/basic_file_stdio.h (__basic_file::sys_open): Add fd ctor. ! * config/io/basic_file_stdio.cc: Same. ! * include/bits/fstream.tcc (filebuf::_M_allocate_internal_buffer): ! Remove _M_unbuf hacks. ! (filebuf::_M_destroy_internal_buffer): Same. ! (filebuf::filebuf(cfile, openmode, int_type): Remove definition. ! (filebuf::fd): Remove. ! * include/std/std_fstream.h (filebuf::_M_unbuf): Remove. ! (filebuf::filebuf(__c_file*, openmode, int_type)): Remove. ! (filebuf::fd): Remove. ! * src/ios.cc (ios_base::_S_ios_create): Change to use specialized ! filebufs. ! (ios_base::_S_ios_destroy): Same. ! * src/misc-inst.cc (file_filebuf): Add instantiation. ! * include/Makefile.am (ext_headers): Add ext_filebuf.h, ! stdio_filebuf.h. * include/Makefile.in: Regenerate. ! ! 2002-04-30 Benjamin Kosnik ! PR libstdc++/6511 ! * config/os/solaris/solaris2.7/bits/ctype_noninline.h: Fix typo. ! ! 2002-04-29 Benjamin Kosnik ! PR libstdc++/5820 ! * include/bits/fstream.tcc (basic_filebuf::_M_underflow_common): ! Check for eof. ! * include/bits/streambuf_iterator.h: Match stream_iterator.h. ! (istreambuf_iterator::operator++): Invalidate on eof. ! (istreambuf_iterator::operator++(int)): Same. ! (istreambuf_iterator::operator*): Same. ! ! 2002-04-29 Benjamin Kosnik ! PR libstdc++/5820 ! * config/io/basic_file_stdio.h (__basic_file::sys_getc): Return int. ! (__basic_file::sys_ungetc): Take int. ! * config/io/basic_file_stdio.cc (__basic_file::sys_ungetc): Same. ! * include/bits/fstream.tcc (basic_filebuf::_M_underflow_common): ! Use sys_getc for unbuffered input. ! * testsuite/27_io/narrow_stream_objects.cc (test06): New. ! ! * src/ios.cc (_M_grow_words): Adjust error checking. ! * testsuite/27_io/ios_base_storage.cc: Same. ! 2002-04-29 Rainer Orth ! * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Set all ! of LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, ! LD_LIBRARY64_PATH. ! 2002-04-28 Peter Schmid ! * include/ext/stl_hashtable.h: Import __iterator_category ! 2002-04-28 Paolo Carlini ! Peter Schmid ! * testsuite/ext/hash_set.cc: New testfile. ! 2002-04-26 Paolo Carlini ! * include/bits/basic_string.h (replace(__pos, __n1, __s, __n2): ! Fix and tighten __throw_length_error check. ! * testsuite/21_strings/replace.cc (test04): New. ! * testsuite/21_strings/replace.cc (test02, test03): Tweak. ! 2002-04-23 Loren J. Rittle ! * include/std/std_fstream.h (basic_filebuf::sync): Hoist ! unconditional flush on lower-layer handle to here... ! * include/bits/fstream.tcc (basic_filebuf::_M_really_overflow): ! ...from here. Optimize remaining _M_file.sync() call pattern. ! * testsuite/27_io/narrow_stream_objects.cc (test04): New test. ! (test05): Likewise. ! 2002-04-23 Jason Merrill ! * include/bits/fstream.tcc (basic_filebuf::seekoff): Fix for ! output-only filebufs. ! * include/std/std_fstream.h (basic_filebuf::_M_set_indeterminate): ! Likewise. ! (basic_filebuf::_M_set_determinate): Likewise. ! PR libstdc++/6414 ! * include/bits/fstream.tcc (basic_filebuf::seekoff): Adjust return ! value properly in the trivial case. ! * testsuite/27_io/istream_seeks.cc (test04): Make sure that ! tellg() returns the right value after a read. ! 2002-04-23 Hans-Peter Nilsson ! * config/cpu/mmix/bits/cpu_limits.h: New file. ! * configure.target (CPULIMITSH): Use it. ! 2002-04-20 Jason Merrill ! PR libstdc++/4150 ! * include/std/std_streambuf.h (basic_streambuf::_M_set_indeterminate): ! Move to filebuf. ! (basic_streambuf::_M_set_determinate): Likewise. ! (basic_streambuf::_M_is_indeterminate): Likewise. ! * include/bits/std_fstream.h (basic_filebuf::_M_filepos): New ! non-static data member. ! (basic_filebuf::_M_underflow_common): New non-static member function. ! (basic_filebuf::_M_underflow, _M_uflow): Call it. ! (basic_filebuf::sync): Avoid useless seeking. ! (basic_filebuf::_M_set_indeterminate): Move here from streambuf. ! Set _M_filepos. ! (basic_filebuf::_M_set_determinate): Likewise. ! (basic_filebuf::_M_is_indeterminate): Likewise. ! * include/bits/fstream.tcc (basic_filebuf::_M_really_overflow): Seek ! back to _M_out_beg if necessary. ! (basic_filebuf::seekoff): Likewise. ! (basic_filebuf::_M_underflow_common): Generalization of old ! underflow(). Don't seek back to _M_in_beg. ! * src/ios.cc: Lose _GLIBCPP_AVOID_FSEEK stuff. ! * config/os/solaris/solaris2.?/bits/os_defines.h: Likewise. ! * config/os/bsd/freebsd/bits/os_defines.h: Likewise. ! * config/os/mingw32/bits/os_defines.h: Likewise. ! * testsuite/27_io/filebuf_virtuals.cc (test05): Don't overspecify ! ungetc test. ! 2002-04-22 Benjamin Kosnik ! * include/bits/istream.tcc (istream::read): Fix. ! * testsuite/27_io/istream_unformatted.cc (main): Add. ! 2002-04-20 Benjamin Kosnik ! PR libstdc++/6360 ! * include/bits/istream.tcc (istream::ignore): Streamline, use ! delimiter as is. ! * include/bits/streambuf.tcc: Use this->gptr. ! * testsuite/27_io/istream_unformatted.cc (test08): Add test. ! 2002-04-19 Benjamin Kosnik ! * include/bits/localefwd.h (locale::id::_M_id): Do this correctly, ! as type safety is important, especially on solaris. ! * include/bits/istream.tcc (istream::read): Clean. ! (istream::readsome): Same. ! * locale.cc: Wrap lines. ! * testsuite/21_strings/inserters_extractors.cc: Tweaks. ! * testsuite/27_io/instantiations.cc (test): Add bool variable... ! * testsuite/21_strings/capacity.cc: Clean. ! 2002-04-19 Benjamin Kosnik ! * testsuite/27_io/filebuf_virtuals.cc: Add _S_pback_size instantiation. ! 2002-04-19 Benjamin Kosnik ! * config/linker-map.gnu (__malloc_alloc_template): Add. ! (__default_alloc_template): Same. ! * include/bits/stl_alloc.h (__malloc_alloc_template): Add extern ! template. ! (__default_alloc_template): Same. ! 2002-04-19 Benjamin Kosnik ! * src/concept-inst.cc (vector): Remove instantiations. ! * src/stl-inst.cc (vector::_M_insert_aux): Remove instantiation. ! (__malloc_alloc_template): Conditionalize. ! * include/bits/istream.tcc: Remove sputbackc calls. ! * testsuite/19_diagnostics/stdexceptions.cc: Fix comment. ! 2002-04-19 Benjamin Kosnik ! PR libstdc++/4164 ! Valgrind fixes. ! * config/io/basic_file_stdio.cc (__basic_file::~__basic_file): ! Call close. ! (__basic_file::close): Call fflush. Correct return if fclose ok. ! (__basic_file::is_open): Make const. ! Change __c_file_type to __c_file. ! * config/io/basic_file_stdio.h: Change __c_file_type to __c_file. ! (__basic_file::is_open): Make const. ! * config/io/c_io_stdio.h: Change __c_file_type to __c_file. ! * include/std/std_fstream.h (filebuf::_M_allocate_file): Remove. ! (filebuf::_M_unbuf): Add. ! (filebuf::_M_file): Change to non-pointer. ! (filebuf::_M_allocate_pback_buffer): Remove. ! * include/bits/fstream.tcc (filebuf::_M_allocate_file): Remove. ! (filebuf::_M_allocate_internal_buffer): Use _M_unbuf. ! Change initialization list for _M_file change. ! (filebuf::_M_allocate_pback_buffer): Remove. ! Change _M_file usage to reflect non-pointer data member. ! * config/locale/generic/c_locale.cc ! (locale::facet::_S_create_c_locale): Add parameter. ! * config/locale/generic/collate_members.cc: Change ! _M_compare_helper to _M_compare. ! Change _M_transform_helper to _M_transform. ! * config/locale/generic/monetary_members.cc: Changeup data types. ! Add dtors. ! * config/locale/generic/numeric_members.cc: Add dtors. ! * config/locale/generic/time_members.cc: Add dtors. ! * config/locale/gnu/c_locale.cc: Add parameter. ! * config/locale/gnu/collate_members.cc:Change ! _M_compare_helper to _M_compare. ! Change _M_transform_helper to _M_transform. ! * config/locale/gnu/ctype_members.cc: Better error checking. ! * config/os/gnu-linux/bits/ctype_noninline.h: Better error checking. ! * config/locale/gnu/messages_members.cc: Tweak comment. ! * config/locale/gnu/monetary_members.cc: Change data types. ! Add dtors. ! * config/locale/gnu/numeric_members.cc: Add dtors, better error ! checking. ! * config/locale/gnu/time_members.cc: Same. ! * config/locale/ieee_1003.1-2001/c_locale.cc ! (locale::facet::_S_create_c_locale): Add parameter. ! * config/locale/ieee_1003.1-2001/c_locale.h: Correct typedef. ! * config/locale/ieee_1003.1-2001/codecvt_specializations.h: Remove ! bogus ctor. ! * include/bits/locale_facets.h (moneypunct): Use string literals. ! Don't define dtor. ! (numpunct): Same. ! (__timepunct): Same. ! (locale::_Impl::_M_facets): Change from vector to array. ! (locale::_Impl::_M_names): Change from array of strings to array ! of string literals. ! (locale::facet::_S_create_c_locale): Add parameter. ! (locale::locale::_S_num_facets): Move to... ! (locale::_Impl::_M_facets_size): Here. ! * include/bits/locale_facets.tcc: Fixups for _M_facets, _M_name ! changes. ! * include/bits/localefwd.h: (locale::id::_M_id): Add member function. ! (locale::_Impl::_Impl(facet**, size_t, bool)): Add. ! (locale::_Impl::_Impl(string, size_t)): Change to ! (locale::_Impl::_Impl(const char*, size_t)): This. ! * include/bits/streambuf.tcc (streambuf::_S_pback_size): Define. ! * include/std/std_streambuf.h (streambuf::_M_pback_size): Change to ! (streambuf::_S_pback_size): This. ! * src/globals.cc: Add pre-allocations for "C" facets. ! * src/locale-inst.cc: Remove vector instantiations. ! * src/locale.cc: Remove vector include. Fixups for _M_names, ! _M_facets changes. ! * src/localename.cc: Same. ! * include/bits/stl_vector.h: Fix odd formatting. ! * include/bits/basic_string.tcc: Tweak comment. ! * libsupc++/new: Make sure parameters are uglified. ! * libsupc++/typeinfo: Same. ! * testsuite/22_locale/num_get_members_char.cc: Fixup. ! * testsuite/22_locale/num_get_members_wchar_t.cc: Same. ! * testsuite/27_io/filebuf_members.cc: Same. ! ! 2002-04-17 Phil Edwards ! * docs/doxygen/doxygroups.cc: New group on binary searching. ! * include/bits/stl_algo.h: Document binary searches and merges. ! * include/bits/stl_deque.h: The 'map' member is not the 'map' class. ! 2002-04-17 Phil Edwards ! * docs/doxygen/mainpage.html: Doxygen logo is now a PNG file. ! * docs/doxygen/run_doxygen: Bump required version. ! * docs/doxygen/user.cfg.in: Revert accidental change. ! * docs/html/faq/index.html: Reindent a block of links. ! (4.4): New note on using dlsym. ! * docs/html/faq/index.txt: Regenerated. ! 2002-04-16 Paolo Carlini ! * testsuite/24_iterators/rel_ops.cc: New test. ! ! 2002-04-16 Gabriel Dos Reis ! * include/bits/type_traits.h (__normal_iterator): Declare in ! __gnu_cxx. Adjust use at global namespace. ! * include/bits/stl_iterator.h (__normal_iterator): Move definition ! into __gnu_cxx::. Add more operator overloads. Tidy existing ones. ! * include/bits/basic_string.h (basic_string): Adjust use of ! __normal_iterator. ! * include/bits/stl_vector.h (_Alloc>): Likewise. ! * src/concept-inst.cc (__gnu_cxx): __normal_iterator<> is now here. ! * src/locale-inst.cc (__gnu_cxx): Likewise. ! * src/string-inst.cc (operator==): Instantiate in __gnu_cxx. ! 2002-04-15 Steve Ellcey ! * gcc/libstdc++-v3/config/os/hpux/bits/os_defines.h ! (strtoll, strtoull): In 64 bit mode HP-UX (IA64 and HPPA) ! does not define strtoll or strtoull, but does define strtol ! and strtoul which are the same since in 64 bit mode ! sizeof(long) == sizeof(long long). ! 2002-04-12 Phil Edwards ! * include/std/std_bitset.h: Doxygenate std::bitset<>. Clean up ! trailing spaces, indentation, and macro names. Make exception ! messages more informative. ! 2002-04-11 Richard Henderson ! * include/bits/fstream.tcc (basic_filebuf<>::open): Fix & ordering. ! * include/bits/ostream.tcc (basic_ostream<>::operator<<(long)): Same. ! (basic_ostream<>::operator<<(long long)): Same. ! 2002-04-11 Richard Henderson ! * config/linker-map.gnu: Add __gxx_personality_sj0. ! 2002-04-09 Benjamin Kosnik ! libstdc++/1072 ! * include/bits/localefwd.h (locale::_Impl::_M_facets): Change from ! pointer to vector. ! Remove forward declaration of vector. ! Include vector. ! * include/bits/locale_facets.tcc: Remove vector include. ! (use_locale): Adjust. ! (has_locale): Adjust. ! * src/locale.cc: Adjust. ! * src/localename.cc: Same. ! ! 2002-04-09 Benjamin Kosnik ! Richard Henderson ! * include/bits/sstream.tcc: Clean up bit ops. ! * include/bits/fstream.tcc: Same. ! 2002-04-09 Jakub Jelinek ! * include/bits/locale_facets.h (__num_base::_S_scale_hex): Remove. ! (__num_base::_S_scale_oct): Remove. ! * src/locale.cc (__num_base::_S_scale_hex): Remove. ! (__num_base::_S_scale_oct): Remove. ! 2002-04-09 Benjamin Kosnik ! libstdc++/6124 ! * testsuite/23_containers/bitset_members.cc: New test. ! * include/std/std_bitset.h (_Bit_count::_S_bit_count): Move.. ! (_S_bit_count): Here. ! (_First_one::_S_first_one): Move... ! (_S_first_one): Here. ! Format. ! * src/bitset.cc: Adjust. ! * config/linker-map.gnu: Export. ! 2002-04-08 Benjamin Kosnik ! libstdc++/5180 ! * include/bits/fstream.tcc (filebuf::seekpos): Fix. ! * include/std/std_fstream.h: Clean. ! * include/bits/ostream.tcc: Remove extraneous variables. ! * include/bits/sstream.tcc (stringbuf::seekoff): Be strict about ! open modes and which modes. ! (stringbuf::seekpos): Same. ! * testsuite/27_io/stringbuf_virtuals.cc: New tests. ! 2002-04-05 Jonathan Wakely ! * include/bits/stl_algo.h (unique_copy, __gcd, rotate, rotate_copy, ! random_shuffle, partition, stable_partition, sort, stable_sort, ! partial_sort, partial_sort_copy, nth_element): Doxygenate. ! 2002-04-05 David S. Miller ! * config/os/gnu-linux/bits/os_defines.h ! (__glibcpp_long_double_bits): Set to 64 on 32-bit Sparc. ! 2002-04-04 Benjamin Kosnik ! libstdc++/3457 ! via gawrilow@math.tu-berlin.de ! * acinclude.m4 (version_specific_libs): Fix combo usage with ! --with-gxx-include-dir. * aclocal.m4: Regenerate. ! * configure: Same. ! ! 2002-04-03 Benjamin Kosnik ! As per DR 184, libstdc++/3139 ! * include/std/std_limits.h (__glibcpp_bool_digits): Change to 1. ! (numeric_limits::is_iec559): False. ! (numeric_limits::is_modulo): False. ! * testsuite/27_io/ios_init.cc: Add instantiations. ! 2002-04-02 Benjamin Kosnik ! ! libstdc++/5268 ! * src/ios.cc: (ios_base::Init::_S_ios_destroy): Remove flush calls. ! * testsuite/27_io/ios_init.cc (tests04): Add test. ! libstdc++/3983 ! * include/bits/basic_ios.h (basic_ios::_M_get_fctype_ios): Remove. ! (basic_ios::_M_ios_fctype): Consistently name to _M_fctype. ! * include/bits/basic_ios.tcc: Same. Remove outdated comments. ! * include/bits/istream.tcc: Use _M_fctype, make consistent with ! ostream. ! * testsuite/27_io/ios_init.cc (tests03): Add test. ! ! 2002-04-02 Phil Edwards ! * include/Makefile.am (install-data-local): Use mkinstalldirs. ! * include/Makefile.in: Regenerate. ! 2002-04-01 Benjamin Kosnik ! libstdc++/5542 ! * acinclude: More extensive checks for msgfmt, --enable-nls. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! 2002-04-01 Phil Edwards ! * libsupc++/exception (__verbose_terminate_handler): Point to docs. ! * docs/doxygen/doxygroups.cc: Doxygen hooks for abi::__cxa_demangle. ! * docs/html/18_support/howto.html: Document the demangler. ! * docs/html/17_intro/howto.html: And link to it. ! * docs/doxygen/mainpage.html: Describe user-vs-maintainer docs. ! * docs/doxygen/run_doxygen: Print user-vs-maintainer. ! 2002-04-01 Phil Edwards ! * include/bits/c++config: Fix misplaced leading blanks on first line. ! 2002-04-01 Phil Edwards ! * config/linker-map.gnu: Export __verbose_terminate_handler. ! * libsupc++/Makefile.am (sources): Add cxa_demangle.c, dyn-string.c. ! Make new LTCOMPILE variable, use it in new special build rules. ! * libsupc++/Makefile.in: Rebuild. ! * src/vterminate.cc (__verbose_terminate_handler): Enable use of ! runtime __cxa_demangle. ! * docs/html/install.html: Update prereqs and instructions. ! * docs/html/19_diagnostics/howto.html: Bring naming for ! verbose_terminate_handler into line with reality. ! 2002-04-01 Benjamin Kosnik ! ! libstdc++/3129 ! * include/bits/basic_ios.h (basic_ios::_M_exception): Move. ! (basic_ios::_M_streambuf_state): Move. ! * include/bits/ios_base (ios_base): To here. ! * include/bits/ios_base.h (ios_base::_S_local_words): To ! _S_local_word_size. ! (ios_base::_M_word_array): To _M_local_word. ! (ios_base::_M_words_limit): To _M_word_size. ! (ios_base::_M_words): To _M_word. ! Comment. ! * include/bits/basic_ios.tcc: Adjust. ! * src/ios.cc (ios_base::_M_grow_words): Tweak. ! * testsuite/27_io/ios_base_storage.cc: Add tests. ! libstdc++/5207 ! Kenny Simpson ! * include/bits/ios_base.h: Fix. ! ! Richard Henderson ! * include/bits/ostream.tcc (ostream::operator<<(_CharT)): Correct ! last change. ! * include/bits/basic_string.h: Tweak formatting. ! ! 2002-04-01 Paolo Carlini ! * config/locale/ieee_1003.1-2001/codecvt_specializations.h ! (codecvt::do_out, codecvt::do_unshift, codecvt::do_in): ! By definition, sizeof(char) == 1. ! * include/bits/locale_facets.tcc (money_get::do_get, ! money_put::do_put): Ditto. ! * testsuite/21_strings/inserters_extractors.cc ! (test04): Ditto. ! 2002-03-30 Richard Henderson ! PR c++/3719 ! * libsupc++/eh_personality.cc (__cxa_call_unexpected): Copy handler ! data out of the exception struct before calling unexpectedHandler. ! 2002-03-28 Roger Sayle ! * include/c_std/std_cmath.h: To prevent problems overloading ! g++ builtins, use the double variants from the global namespace ! before defining float and long double variants in std::. ! 2002-03-28 Loren J. Rittle ! * testsuite/18_support/numeric_limits.cc (test_extrema): Fix typo. ! 2002-03-28 Paolo Carlini ! * testsuite/24_iterators/istream_iterator.cc ! (test02): New tests. ! 2002-03-28 Ulrich Weigand ! Paolo Carlini ! * testsuite/22_locale/codecvt_members_unicode_wchar_t.cc ! (test01): Protect the test with _GLIBCPP_USE_WCHAR_T; ! fix i_lit_base e_lit_base arrays, making them independent ! from the endianness of the platform; tweak UCS4 to UCS-4BE. ! 2002-03-27 Benjamin Kosnik ! * include/bits/ostream.tcc (ostream::operator<<(_CharT)): Always ! allocate at least a byte. ! * testsuite/18_support/numeric_limits.cc (test_extrema): Make ! debugger-friendly. ! * testsuite/27_io/streambuf.cc (test07): Fix. ! (test06): Enable. ! 2002-03-27 Phil Edwards ! Bulk documentation merge (copy) from trunk. ! * docs/doxygen/Intro.3, docs/doxygen/TODO, docs/doxygen/doxygroups.cc, ! docs/doxygen/mainpage.html, docs/doxygen/run_doxygen, ! docs/doxygen/tables.html, docs/doxygen/user.cfg.in, ! docs/html/Makefile, docs/html/17_intro/howto.html, ! docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html: ! Merge from trunk. ! 2002-03-27 Phil Edwards ! * include/bits/stl_algo.h: Remove @maint and @endmaint. * include/bits/stl_alloc.h: Likewise. * include/bits/stl_construct.h: Likewise. * include/bits/stl_deque.h: Likewise. * include/bits/stl_iterator_base_types.h: Likewise. * include/bits/stl_list.h: Likewise. * include/bits/stl_relops.h: Likewise. * include/bits/stl_tempbuf.h: Likewise. * include/bits/stl_vector.h: Likewise. ! * include/std/std_memory.h: Likewise. ! * include/bits/stl_deque.h: Point into tables.html and add @ingroup. ! * include/bits/stl_list.h: Likewise. ! * include/bits/stl_vector.h: Likewise. ! 2002-03-26 Benjamin Kosnik ! * include/c/: Guard with _CPP_. ! * include/c_std/: Same. ! * include/Makefile.am: Fixup install, link routines for null ! c_base_headers_extra scenarios. ! * include/Makefile.in: Regerate. ! 2002-03-25 Paolo Carlini ! Richard Henderson ! * testsuite/22_locale/codecvt_members_unicode_char.cc ! (test01, test02): make sure that the i_lit_base array ! is sufficiently aligned. ! 2002-03-25 Benjamin Kosnik ! * config/os/newlib/bits/ctype_noninline.h (ctype::classic): Set to ! _ctype_. ! 2002-03-25 Paolo Carlini ! * testsuite/22_locale/collate_byname.cc ! (test01): compare the result of collate::compare with ! that of collate::transform + string::compare, not with ! that of collate::transform + collate::compare; values ! returned by collate::compare are normalized, therefore ! test against +-1. ! 2002-03-25 Jakub Jelinek ! PR target/5676 ! * acinclude.m4 (GLIBCPP_ENABLE_SJLJ_EXCEPTIONS): Pass -fexceptions ! explicitly. ! * aclocal.m4: Rebuilt. * configure: Rebuilt. + * configure.target (mcore-*-pe*): Add -frtti -fno-exceptions + by default to c++ flags. ! 2002-03-25 Benjamin Kosnik ! Jakub Jelinek ! * config/locale/gnu/messages_members.h: Correct conditional. ! * config/locale/gnu/messages_members.cc: Same. ! * config/locale/gnu/time_members.cc: Same. ! 2002-03-25 Ulrich Weigand ! Paolo Carlini ! * testsuite/22_locale/codecvt_members_unicode_char.cc ! (test01, test02): Fix i_lit_base arrays, making them ! independent from the endianness of the platform. ! 2002-03-22 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_CHECK_COMPLEX_MATH_SUPP): Just test for ! signbit and __signbit directly. * aclocal.m4: Regenerate. * configure: Regenerate. + * config.h.in: Regenerate. + * libmath/Makefile.am: Simplify. + * libmath/Makefile.in: Regenerate. + * include/c_std/std_cmath.h: Update paths for include of cmath.tcc. ! * include/Makefile.am: Clean up handling of extra "C" header files. ! Add hooks for "C" compatibility headers. ! * include/Makefile.in: Regenerate. ! * include/c/*: Formatting tweaks, cleanups. ! * include/c_std/*: Same. ! 2002-03-22 Benjamin Kosnik ! * config/locale/gnu/messages_members.h: Add __uselocale bits. ! * config/locale/gnu/messages_members.cc: Same. ! * config/locale/gnu/time_members.cc: Same. ! 2002-03-22 Benjamin Kosnik ! * src/vterminate.cc: Format, -fno-exceptions cleanup. ! 2002-03-21 Rainer Orth ! * acinclude.m4 (GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3): New. ! (GLIBCPP_CONFIGURE_TESTSUITE): Use it to check for setenv. * aclocal.m4: Regenerate. ! * configure: Likewise. ! 2002-03-19 Paolo Carlini ! Ulrich Drepper ! * src/locale-inst.cc (__convert_from_v): Add an additional ! __size parameter in the declarations. ! * include/bits/locale_facets.tcc ! (__convert_from_v): When available (that is, ! _GLIBCPP_USE_C99 defined) use snprintf instead of sprintf. ! (num_put::_M_convert_float): Depending on _GLIBCPP_USE_C99 ! being defined or not, call and use __convert_from_v in the ! appropriate way. ! (num_put::_M_convert_int): Same here. ! (money_put::do_put(long double)): Same here. ! 2002-03-19 Phil Edwards ! * docs/html/faq/index.html (#3.6): Rewrap and close tags. * docs/html/faq/index.txt: Regenerate. ! 2002-03-19 Steve Ellcey ! * acinclude.m4 (GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS): Define ! GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS to set LIBUNWIND_FLAG if ! --enable-libunwind-exceptions is set. ! * configure.in (GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS): Call new ! macro to check for libunwind. * configure: Regenerate. ! * src/Makefile.am (libstdc___la_LDFLAGS): Add ! LIBUNWIND_FLAG to libstdc link line. * src/Makefile.in: Regenerate. ! 2002-03-19 Benjamin Kosnik ! * docs/html/faq/index.html: Add OS X workaround. ! * docs/html/17_intro/TODO: Update. ! 2002-03-18 Paolo Carlini ! * include/bits/locale_facets.tcc ! (money_put::do_put(long double)): Fix dimensioning of ! temporary buffers to avoid risk of overruns. ! (money_put::do_put(string)): Same for the buffer used to ! add the grouping chars. ! * testsuite/22_locale/money_put_members_char.cc: Add test06. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. ! * include/bits/locale_facets.tcc ! (collate::do_transform): Simplify. ! 2002-03-18 Phil Edwards ! * acinclude.m4 (GLIBCPP_CONFIGURE): Make indentation/spacing uniform. ! * configure.in: Add comments pointing the way for autoconf 2.5x. ! * aclocal.m4, config.h.in, configure: Regenerate. ! 2002-03-18 Philipp Thomas ! * include/backward/hash_map.h: hash, hashtable, hash_map and ! hash_multimap are in namespace __gnu_cxx. ! include/backward/hash_set.h: hash, hashtable, hash_set and ! hash_multiset are in namespace __gnu_cxx. ! include/backward/hashtable.h: hash and hashtable are in ! namespace __gnu_cxx. ! include/backward/rope.h: char_producer, sequence_buffer, ! rope, crope and wrope are in namespace __gnu_cxx. ! include/backward/slist.h: slist is in namespace __gnu_cxx. ! * testsuite/backward/header_hash_map_h.cc ! testsuite/backward/header_hash_set_h.cc ! testsuite/backward/header_hashtable_h.cc ! testsuite/backward/header_rope_h.cc ! testsuite/backward/header_slist_h.cc ! testsuite/backward/header_tempbuf_h.cc: New tests for ! checking that we're using the correct namespace. ! 2002-03-17 Jason Merrill ! PR c++/4381 ! * libsupc++/eh_personality.cc (get_adjusted_ptr): New static fn. ! (check_exception_spec): Call it. Take the thrown pointer. ! (__cxa_call_unexpected): Pass it. ! (PERSONALITY_FUNCTION): Likewise. Use get_adjusted_ptr. ! 2002-03-15 Anthony Green ! * configure.in: Remove useless is_mingw32. ! * configure: Rebuilt. ! 2002-03-15 Paolo Carlini ! * testsuite/22_locale/collate_members_char.cc ! (test01): compare the result of collate::compare with ! that of collate::transform + string::compare, not with ! that of collate::transform + collate::compare. ! (test01): values returned by collate::compare are ! normalized, therefore test against +-1. ! * testsuite/22_locale/collate_members_wchar_t.cc: Ditto. ! 2002-03-12 Loren Rittle ! reported by Peter Schmid ! * testsuite/thread/pthread4.cc: Lower nominal iteration counter. ! 2002-03-12 Benjamin Kosnik ! Per Liboriussen ! * config/os/gnu-linux/bits/ctype_noninline.h: Cast to ! unsigned char. ! * config/os/gnu-linux/bits/ctype_inline.h: Same. ! * config/os/irix/irix6.5/bits/ctype_inline.h: Same. ! * config/os/solaris/solaris2.5/bits/ctype_inline.h: Same. ! * config/os/solaris/solaris2.5/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.6/bits/ctype_inline.h: Same. ! * config/os/solaris/solaris2.6/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.7/bits/ctype_inline.h: Same. ! * config/os/solaris/solaris2.7/bits/ctype_noninline.h: Same. ! * testsuite/22_locale/ctype_members_char.cc (main): Add tests. ! 2002-03-12 Benjamin Kosnik ! * include/bits/basic_string.tcc (string::_S_construct(_InIter, ! _InIter, const _Alloc&, forward_iterator_tag): Check for null. ! (string::basic_string(const _CharT* __s, const _Alloc& __a)): Same. ! * testsuite/21_strings/ctor_copy_dtor.cc (test01): Re-enable, now ! that memory limits are in place. ! (test03): Add tests. ! 2002-03-11 Benjamin Kosnik ! * acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Check for wctype.h. * aclocal.m4: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. ! * include/c_std/std_cwctype.h: Guard. ! 2002-03-11 Chris Demetriou ! ! * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): Enhance check for ! whether GLIBCPP_CHECK_LINKER_FEATURES has been used. * aclocal.m4: Regenerate. * configure: Regenerate. ! 2002-03-11 Benjamin Kosnik ! * include/bits/stl_bvector.h: Fix warning. ! 2002-03-11 Richard Henderson ! * include/bits/stl_bvector.h (_Bit_type): New. Use throughout. ! 2002-03-11 Paolo Carlini ! * include/bits/locale_facets.tcc (collate::do_transform): ! Rewrite to fix problems with long transformed strings. ! * include/bits/locale_facets.tcc (time_put::do_put): ! Consider sizeof(char_type) in allocating the buffer. ! 2002-03-10 Anthony Green ! * configure.in: Support cross builds to mingw32 target. ! * configure: Rebuilt. ! 2002-03-08 Benjamin Kosnik ! * c_locale_generic.cc: Move to... ! * generic/c_locale.cc ! * c_locale_generic.h: Move to... ! * generic/c_locale.h ! * codecvt_specializations_generic.h: Move to... ! * generic/codecvt_specializations.h ! * collate_members_generic.cc: Move to... ! * generic/collate_members.cc ! * ctype_members_generic.cc: Move to... ! * generic/ctype_members.cc ! * messages_members_generic.cc: Move to... ! * generic/messages_members.cc ! * messages_members_generic.h: Move to... ! * generic/messages_members.h ! * moneypunct_members_generic.cc: Move to... ! * generic/monetary_members.cc ! * numpunct_members_generic.cc: Move to... ! * generic/numeric_members.cc ! * time_members_generic.cc: Move to... ! * generic/time_members.cc ! * c_locale_gnu.cc: Move to... ! * gnu/c_locale.cc ! * c_locale_gnu.h: Move to... ! * gnu/c_locale.h ! * collate_members_gnu.cc: Move to... ! * gnu/collate_members.cc ! * ctype_members_gnu.cc: Move to... ! * gnu/ctype_members.cc ! * messages_members_gnu.cc: Move to... ! * gnu/messages_members.cc ! * messages_members_gnu.h: Move to... ! * gnu/messages_members.h ! * moneypunct_members_gnu.cc: Move to... ! * gnu/monetary_members.cc ! * numpunct_members_gnu.cc: Move to... ! * gnu/numeric_members.cc ! * time_members_gnu.cc: Move to... ! * gnu/time_members.cc ! * c_locale_ieee_1003.1-200x.cc: Move to... ! * ieee_1003.1-2001/c_locale.cc ! * c_locale_ieee_1003.1-200x.h: Move to... ! * ieee_1003.1-2001/c_locale.h ! * codecvt_specializations_ieee_1003.1-200x.h: Move to... ! * ieee_1003.1-2001/codecvt_specializations.h ! * messages_members_ieee_1003.1-200x.cc: Move to... ! * ieee_1003.1-2001/messages_members.cc ! * messages_members_ieee_1003.1-200x.h: Move to... ! * ieee_1003.1-2001/messages_members.h ! * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Make consistent. * aclocal.m4: Regenerate. * configure: Regenerate. ! * src/Makefile.am (sources): Change to monetary and numeric. * src/Makefile.in: Regenerate. ! * docs/html/configopts.html: Update to ieee_1003.1-2001. ! 2002-03-08 scott snyder ! libstdc++/5875 ! * include/bits/locale_facets.tcc (num_put::_M_convert_float): ! Allow one more digit of precision. ! * testsuite/27_io/ostream_inserter_arith.cc: Test that we can ! write a double and read back in the same value. ! 2002-03-08 Benjamin Kosnik ! * include/std/std_limits.h: Move static const data members out of ! generic template, into base class __numeric_limits_base. ! * src/limits.cc: Add definitions. ! * config/linker-map.gnu: Add __numeric_limits_base. ! * testsuite/18_support/numeric_limits.cc: Declare test in scope. ! 2002-03-07 Benjamin Kosnik ! * include/bits/stl_alloc.h: Add extern implicit allocator ! instantiations. ! * include/bits/basic_string.tcc: Tweak. ! * include/bits/loqcale_facets.tcc: Remove default args. Add ! has_facet, use_facet extern instantiations. ! * src/stl-inst.cc: Add explicit instantiation. ! * src/locale-inst.cc: Clean. Remove locale member template ! instantiations. ! * testsuite/22_locale/operators.cc (test02): Enable. ! 2002-03-06 Benjamin Kosnik ! Stephen M. Webb ! * include/bits/stl_tree.h (_S_rb_tree_red): Make enum. ! (_S_rb_tree_black): Make enum. ! Clean. Format. ! * include/bits/stl_bvector.h (__WORD_BIT): To _M_word_bit, enum. ! * include/bits/stl_algo.h (__stl_chunk_size): _M_chunk_size, enum. ! (__stl_threshold): _M_threshold, enum. ! * src/stl-inst.cc: Same. ! * config/linker-map.gnu: Remove. ! * testsuite/23_containers/vector_bool.cc: New. ! 2002-03-08 Phil Edwards ! * include/bits/basic_string.h (basic_string::_S_construct): Fix ! names in declaration. ! (basic_string::compare): These are no longer optional. ! * include/bits/ostream.tcc: Tweak closing brace placement. ! * include/bits/stl_algo.h: Lots of initial doxygen comment hooks. ! * include/std/std_sstream.h: Fix typo in comment. ! * include/bits/locale_facets.tcc: Remove unneeded header inclusion. ! * src/locale.cc: Likewise. ! 2002-03-08 Phil Edwards ! PR libstdc++/5734 ! * include/bits/stl_vector.h (vector::push_back()): Guard with ! _GLIBCPP_DEPRECATED. ! 2002-03-05 Benjamin Kosnik ! * docs/html/17_intro/RELEASE-NOTES: Fix usage. ! * README (libmath): Make clear. ! 2002-03-05 Jakub Jelinek ! * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): Check for version ! script globbing in ld. ! * aclocal.m4: Rebuilt. ! * configure: Rebuilt. ! 2002-03-05 Benjamin Kosnik ! * docs/html/17_intro/RELEASE-NOTES: Update. ! * README: Format subdirectories. ! 2002-03-05 Paolo Carlini ! libstdc++/5816 ! * include/bits/locale_facets.tcc ! (num_get::_M_extract_float): Fix the parsing of __dec, since ! the standard prescribes that if no grouping characters are ! seen, no grouping check is applied. ! * testsuite/22_locale/num_get_members_char.cc: Add test05 ! distilled from the PR. ! * testsuite/22_locale/num_get_members_wchar_t.cc: Ditto. ! 2002-03-04 Craig Rodrigues ! * docs/html/17_intro/porting-howto.xml: Refer to ! http://www.oasis-open.org for docbookx.dtd. ! * docs/html/17_intro/porting-howto.html: Regenerated. ! 2002-03-03 Phil Edwards ! PR libstdc++/2955 ! * include/std/std_sstream.h: Remove trailing spaces. ! (basic_stringbuf::_M_stringbuf_init): Also check for ios_base::app. ! * testsuite/27_io/stringbuf.cc (test05, test06): New tests. ! 2002-03-03 Paolo Carlini ! * testsuite/22_locale/num_get_members_char.cc (test04): ! Use a named locale expecting grouping (de_DE). ! * testsuite/22_locale/num_get_members_wchar_t.cc (test04): ! Ditto. ! * testsuite/27_io/ios_manip_basefield.cc (test01): ! Extend coverage, uniform treatment of hexs and octs. ! 2002-03-01 Paolo Carlini ! * include/bits/locale_facets.tcc (num_get::_M_extract_int): ! Admit grouping for octals and hexadecimals too. ! * testsuite/22_locale/num_get_members_char.cc: Add test04. ! (test01): Tweak "." -> "," in void* test. ! * testsuite/22_locale/num_get_members_wchar_t.cc: Ditto. ! * testsuite/27_io/ios_manip_basefield.cc: Remove static keyword. ! * testsuite/27_io/ios_manip_fmtflags.cc: Remove two of them. ! * testsuite/27_io/ios_manip_basefield.cc (test01): ! Fix for 64 bit machines. ! 2002-02-28 Richard Henderson ! * config/linker-map.gnu: Export operator new with unsigned long, ! and with std::nothrow_t. Likewise operator delete. ! 2002-02-26 Benjamin Kosnik ! libstdc++/3983 ! * include/bits/basic_ios.tcc (basic_ios::init): Set _M_fill to zero. ! Adjust comment. ! * include/bits/basic_ios.h (basic_ios::_M_fill): Make mutable. ! (basic_ios::_M_fill_init): New. ! (basic_ios::fill()): Delay dealing with _M_fill. ! Adjust comment. ! * ios.cc (ios_base::ios_base()): Initialize _M_callbacks, _M_words. ! (ios_base::_M_call_callbacks): Adjust. ! * testsuite/27_io/ios_init.cc (test02): Adjust testcase. ! 2002-02-28 Loren Rittle ! * include/Makefile.am (thread_target_headers): Unconditionally ! stage and install gthr-posix.h. ! (${target_builddir}/gthr-posix.h): New rule cloned off ! ${target_builddir}/gthr-default.h. ! (${target_builddir}/gthr-default.h): Support chained inclusion ! of gthr support headers. ! * include/Makefile.in: Rebuilt. ! 2002-02-26 Paolo Carlini ! * include/bits/locale_facets.tcc (num_put::_M_widen_int): ! Group all the integral types, not only decs. ! * testsuite/27_io/ios_manip_basefield.cc (test01): Tweak existing ! tests, add a few more. ! 2002-02-25 Benjamin Kosnik ! * src/ios.cc (ios_base::~ios_base): Tweak. ! (ios_base::_M_call_callbacks): Deal with null __p. ! (ios_base::ios_base): Set _M_callbacks. ! * include/bits/basic_ios.tcc (basic_ios::init): Adjust comment. ! * testsuite/27_io/ios_init.cc (test02): Fix. ! * mkcheck.in (static_fail): Failed links go to output file. ! 2002-02-25 Phil Edwards ! * docs/html/faq/index.html: Update. ! * docs/html/faq/index.txt: Regenerate. ! 2002-02-22 Phil Edwards ! * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): Fix comment. ! * aclocal.m4: Regenerate. ! * docs/html/configopts.html: Document --enable-symvers. ! * config/linker-map.gnu: Break libsupc++ symbols out to their own tag. ! 2002-02-22 Philipp Thomas ! * include/backward/tempbuf.h: get_temporary_buffer and ! return_temporary_buffer are in namespace std, not in __gnu_cxx. ! 2002-02-21 Benjamin Kosnik ! * configure.in (target_alias): Default to yes. ! * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): Add check for shared ! libgcc to default case. ! 2002-02-20 Phil Edwards ! * acinclude.m4 (GLIBCPP_CHECK_LINKER_FEATURES): Also check version. ! (GLIBCPP_ENABLE_SYMVERS): Redo logic, use linker version. ! * configure.in (GLIBCPP_ENABLE_SYMVERS): Move later in the script. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * config/linker-map.dummy: New file. Contains nothing useful. ! 2002-02-20 Benjamin Kosnik ! * testsuite/22_locale/money_put_members_char.cc: Fix. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Fix. ! * testsuite/27_io/standard_manipulators.cc: New file. ! * testsuite/27_io/ios_manip_basefield.cc: Check results, now failing. ! * testsuite/27_io/ios_manip_fmtflags.cc: Use locale::classic(). ! 2002-02-20 Danny Smith ! * config/os/mingw32/bits/ctype_noninline.h ! (ctype::ctype): Remove default args from parm list. ! * config/os/djgpp/bits/ctype_noninline.h: Same. ! 2002-02-19 Benjamin Kosnik ! * include/std/std_iomanip.h: Inline, tweaks. ! * config/linker-map.gnu: Remove hacks. ! * testsuite/21_strings/capacity.cc: Add explicit instantiations. ! * testsuite/27_io/ios_init.cc: Same. ! * testsuite/22_locale/money_get_members_char.cc (test07): Fix. ! * testsuite/22_locale/money_get_members_wchar_t.cc (test07): Same. ! 2002-02-19 Benjamin Kosnik ! * config/linker-map.gnu: Export global vtable, typeinfo, guard ! variable, and thunk info as per CXXABI docs. ! 2002-02-19 Loren Rittle ! * include/Makefile.am: Use CONFIG_HEADER instead of ad hoc names. ! * include/Makefile.in: Rebuilt. ! 2002-02-18 Peter Schmid ! * testsuite/22_locale/collate_byname.cc (test01): Replace size4 ! with size3 for the string collations of str5. ! 2002-02-18 Paolo Carlini ! libstdc++/5708 ! * include/bits/locale_facets.tcc (money_put::do_put): ! For the space field use __fill instead of ' ', uniformly. ! * testsuite/22_locale/money_put_members_char.cc: ! Add test05 distilled from PR. ! (test01-02-03): Trim some '*' to ' '. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. ! 2002-02-18 Loren Rittle ! libstdc++/5697 ! * include/Makefile.am (thread_builddir): Remove (map all ! existing uses to target_builddir). ! (thread_headers): Rename to... ! (thread_target_headers): ...this. ! (stamp-thread): Remove. ! (stamp-target): Correctly state the position as built. ! Update all dependencies to match the new reality. Remove all ! dependency calculations on directories. ! * include/Makefile.in: Rebuilt. ! 2002-02-16 Benjamin Kosnik ! * include/bits/locale_facets.tcc: Add pragma GCC system_header. ! * include/bits/fstream.tcc: Same. ! * include/bits/sstream.tcc: Same. ! * include/bits/ostream.tcc: Same. ! * include/bits/istream.tcc: Same. ! * include/bits/streambuf.tcc: Same. ! * include/bits/basic_ios.tcc: Same. ! * include/bits/basic_string.tcc: Same. ! 2002-02-15 Benjamin Kosnik ! * include/std/std_iosfwd.h: Don't guard typedefs with ! _GLIBCPP_USE_WCHAR_T ! * include/bits/stringfwd.h: Same. ! 2002-02-15 Benjamin Kosnik ! * src/locale.cc (moneypunct_byname): Remove definitions. ! * include/std/std_streambuf.h (streambuf::operator=): Return. ! 2002-02-15 Benjamin Kosnik ! Tune for size. ! * src/string-inst.cc (string::_Rep::_S_terminal): Remove redundant ! explicit instantiation. ! (string::_Rep::_S_max_size): Same. ! * include/bits/basic_string.tcc: Add extern explicit ! instantiations for string, wstring. ! * include/bits/basic_ios.tcc: Add extern explicit instantiations ! for ios, wios. ! * include/bits/streambuf.tcc: Same, for streambuf, wstreambuf. ! * include/bits/istream.tcc: Same, for istream, wistream. ! * include/bits/ostream.tcc: Same for ostream, wostream, iostream, ! wiostream. ! * include/bits/sstream.tcc: Same, for stringbuf, wstringbuf, ! istringstream, wistringstream, ostringstream, wostringstream, ! stringstream, wstringstream. ! * include/bits/fstream.tcc: Same, for filebuf, wfilebuf, ifstream, ! wifstream, ofstream, wofstream, fstream, wfstream. ! * src/misc-inst.cc: Correct comments. ! Add iomanip instantiations for wide streams. ! * include/std/std_iomanip.h: Same. ! * include/bits/locale_facets.tcc: Same. ! * include/std/std_streambuf.h: Correct ! _GLIBCPP_FULLY_COMPLIANT_HEADERS guard. ! * include/std/std_sstream.h: Same. ! * include/std/std_ostream.h: Same. ! * include/std/std_istream.h: Same. ! * include/std/std_fstream.h: Same. ! * include/std/std_streambuf.h: Add definitions for private copy ! ctor and assignment operator. ! * include/std/std_istream.h: Remove declared but undefined copy ! ctor and assignment operator. This is taken care of in ios_base, ! so adding it in the derived class as well is superfluous. ! * include/std/std_ostream.h: Same. ! * include/bits/basic_ios.h (basic_ios::clear): Don't inline. ! * include/bits/basic_ios.tcc (basic_ios::clear): Move definition here. ! 2002-02-14 Benjamin Kosnik ! * config/linker-map.gnu: Change tag from GCC_3.1 to GLIBCPP_3.1. ! Add typeinfo bits. Smooth. ! * aclocal.m4: Regenerate. ! * configure: Same. ! * src/Makefile.in: Same. ! 2001-02-14 Joel Sherrill ! * config/cpu/m68k/bits/atomicity.h: Corrected for RTEMS targets ! which do not have a CAS instruction. ! 2002-02-14 Phil Edwards ! * acinclude.m4 (GLIBCPP_ENABLE_SYMVERS): New macro, initial revision. ! * configure.in: Call it. ! * config/linker-map.gnu: New file, initial incomplete revision. ! * src/Makefile.am: Optionally pass version script to the linker. ! * aclocal.m4: Regenerate. ! * configure: Regenerate. ! * src/Makefile.in: Regenerate. ! 2002-02-13 Benjamin Kosnik ! * src/localename.cc: Remove stdexcept include. ! * src/locale-inst.cc: Same. ! * src/locale.cc: Same. ! * src/functexcept.cc: Remove string includes. ! * include/std/std_bitset.h: Remove stdexcept include. ! * testsuite/23_containers/bitset_members.cc: Add stdexcept. ! * testsuite/23_containers/bitset_ctor.cc: Same. ! 2002-02-11 Benjamin Kosnik ! * include/bits/stl_algo (__stl_threshold): Declare external. ! (__stl_chunk_size): Same. ! * include/bits/stl_bvector.h (__WORD_BIT): Same. ! * include/bits/stl_tree.h (_S_rb_tree_red): Same. ! (_S_rb_tree_black): Same. ! * src/stl-inst.cc (__stl_threshold): Define. ! (__stl_chunk_size): Same. ! (__WORD_BIT): Same. ! (_S_rb_tree_red): Same. ! (_S_rb_tree_black): Same. ! * config/io/basic_file_libio.h (__basic_file): Add declarations. ! * include/bits/basic_file.h: Remove. ! * config/io/c_io_stdio.h: Remove _GLIBCPP_BASIC_FILE_ENCAPSULATION ! Declare generic types, specialization. ! * config/io/basic_file_stdio.cc: Definitions. ! * config/io/c_io_libio.h: Remove _GLIBCPP_BASIC_FILE_INHERITANCE. ! Declare generic types. ! * include/Makefile.am (bits_headers): Remove basic_file.h. ! (extra_target_headers): Change basic_file_model.h to basic_file.h. ! (stamp-target): Same. ! * include/bits/stl_alloc.h: Tweaks. ! * include/bits/localefwd.h: Same. ! 2002-02-11 Aaron W LaFramboise ! * include/bits/locale_facets.tcc (collate::do_hash): Fix. ! * testsuite/22_locale/collate_members_char.cc (test03): New test. ! * testsuite/22_locale/collate_members_wchar_t.cc (test03): Same. ! 2002-02-10 Phil Edwards ! * include/bits/stl_algo.h (transform (both signatures), generate_n): ! Use __typeof__ in concept checks. ! 2002-02-10 Jonathan Wakely ! * include/bits/stl_algo.h (__median, for_each, find, find_if, ! adjacent_find, count, count_if, search, search_n, swap_ranges, ! transform, replace, replace_if, replace_copy, replace_copy_if, ! generate, generate_n, remove_copy, remove_copy_if, remove, remove_if, ! unique, unique_copy, reverse, reverse_copy): Doxygenate. ! 2002-02-08 Benjamin Kosnik ! * include/bits/locale_facets.h ! (numpunct<_CharT>::_M_initialize_numpunct): Remove definition. ! (__timepunct<_CharT>::_M_initialize_timepunct): Same. ! (__timepunct<_CharT>::_M_put_helper): Same. ! (moneypunct<_CharT, _Intl>::_M_initialize_moneypunct): Same. ! * include/bits/fstream.tcc (filebuf::underflow): Remove ! __codecvt_type typedef. ! (filebuf::_M_convert_to_external): Same. ! 2002-02-08 Phil Edwards ! * docs/doxygen/TODO: Update. ! * docs/doxygen/doxygroups.cc: Tweak __gnu_cxx description. ! * docs/doxygen/mainpage.html: Add TODO list link. ! * docs/doxygen/user.cfg.in: Add @doctodo hook. ! * docs/doxygen/tables.html: New file, emoty structure only. ! * include/bits/stl_iterator.h: Doxygenate just about everything. ! * include/bits/stl_iterator_base_funcs.h: Ditto, clean up spaces. ! * include/bits/stl_iterator_base_types.h: Add notes. ! 2002-02-07 Stephan Buys ! * include/bits/stl_map.h: Tweak doxygen markup. ! * include/bits/stl_multimap.h: Doxygenate and remove extra spaces. * include/bits/stl_vector.h: Likewise. ! 2002-02-07 Benjamin Kosnik ! libstdc++/5286 ! libstdc++/3860 ! * include/std/std_fstream.h (filebuf::__file_type): Change to ! __basic_file. ! (filebuf::_M_convert_to_external): Declare. ! * include/bits/fstream.tcc (filebuf::_M_convert_to_external): Define ! codecvt bits for wide streams. ! (filebuf::_M_really_overflow): Use it. ! (filebuf::underflow): Use codecvt. ! * config/locale/codecvt_specializations_ieee_1003.1-200x.h: ! (codecvt<__enc_traits>::do_out): Deal with partial. ! (codecvt<__enc_traits>::do_encoding): Return something useful. ! * src/codecvt.cc (codecvt::do_encoding): Return sizeof ! wchar_t. ! * testsuite/22_locale/codecvt_members_unicode_char.cc (test01): ! Change expected encoding output. ! (test02): Same. ! * testsuite/22_locale/codecvt_members_wchar_t_char.cc (test01): Same. ! (test02): Same. ! 2002-02-07 Benjamin Kosnik ! Wolfgang Bangerth ! * include/bits/basic_ios.tcc (basic_ios::narrow): Add default value. ! (basic_ios::widen): Same. ! 2002-02-07 Paolo Carlini ! * testsuite/22_locale/money_get_members_char.cc: ! Add comment, tidy up. ! (test01): more "en_HK" tests (without showbase). ! * testsuite/22_locale/money_get_members_wchar_t.cc: Ditto. ! 2002-02-06 Loren Rittle ! * config/locale/c_locale_generic.cc: Do not trust ! _GLIBCPP_HAVE_STRTOF or _GLIBCPP_HAVE_STRTOLD as ! set by configure. ! 2002-02-06 Loren Rittle ! * acinclude.m4: Add C++ linkage check for strtof. ! * aclocal.m4: Rebuilt. ! * config.h.in: Rebuilt. ! * configure: Rebuilt. ! * config/locale/c_locale_generic.cc: Conditionally include ! . Improve handling and error checking of float ! and long double input for non-C99 configurations. ! 2002-02-06 Paolo Carlini ! * include/bits/locale_facets.tcc (money_get::do_get(string)): ! In case money_base::symbol deal properly with multi-char sign ! for patterns {X,Y,Z,symbol} and {X,Y,symbol,none}. ! * testsuite/22_locale/money_get_members_char.cc: Add test07. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Add test07. ! 2002-02-05 Paolo Carlini ! * include/bits/locale_facets.tcc (money_get::do_get(string)): ! First construct a tentative returned string, then, only if the ! parsing succeeds, copy it into the string passed by reference. ! * testsuite/22_locale/money_get_members_char.cc: Add test06. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Add test06. ! 2002-02-04 Phil Edwards ! * docs/doxygen/TODO: Impl-defined behavior now documented... ! * docs/html/17_intro/howto.html: ...here. ! * docs/doxygen/mainpage.doxy: Remove, rename... ! * docs/doxygen/mainpage.html: ...to this. Tweak HTML, add license. ! * docs/doxygen/style.css: Add small text. ! * docs/doxygen/run_doxygen: Adjust for new mainpage. ! * docs/doxygen/user.cfg.in: Likewise. ! 2002-02-04 Stephan Buys ! * include/bits/stl_map.h: Initial doxygen markup. ! * include/std/std_fstream.h: Initial doxygen markup. ! 2002-02-04 Paolo Carlini ! libstdc++/5579 ! * include/bits/locale_facets.tcc (money_get::do_get(string)): ! Deal correctly with !(__io.flags() & ios_base::showbase) ! for case money_base::symbol. ! * testsuite/22_locale/money_get_members_char.cc: Add test05. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Add test05. ! 2002-02-02 Paolo Carlini ! * testsuite/22_locale/operators.cc ! (gnu_collate::do_compare()): Add return statement to ! suppress "no return statement" warning. ! 2002-02-01 Paolo Carlini ! * testsuite/27_io/ostream_manip.cc: Enable test02. ! 2002-02-01 Phil Edwards ! * docs/html/documentation.html: Update for 3.0.96. ! * docs/html/faq/index.html: Update for 3.0.96. ! * docs/html/faq/index.txt: Regenerated. ! * docs/doxygen/TODO: Update notes. ! * docs/html/17_intro/howto.html: Initial impl-specific listing. ! 2002-01-31 Benjamin Kosnik ! * config/locale/codecvt_specializations_ieee_1003.1-200x.h: ! Initialize all data members in copy ctor. Make ctors explicit. ! (__enc_traits::__enc_traits()): Default ctor does nothing. ! (__enc_traits::_M_init): Guard against multiple iconv_opens. ! * include/std/std_sstream.h (basic_stringbuf): Make data members ! protected. ! * include/std/std_fstream.h (basic_filebuf): Same. ! * include/std/std_streambuf.h: Tweak. ! * include/bits/streambuf.tcc: Same. ! * include/bits/sstream.tcc: Same. * include/bits/fstream.tcc: Same. ! 2002-01-31 Loren Rittle ! * testsuite/22_locale/codecvt_members_char_char.cc: Do not ! allow NULL argument to be passed to setenv(). ! * testsuite/22_locale/codecvt_members_wchar_t_char.cc: Likewise. ! * testsuite/22_locale/collate_members_char.cc: Likewise. ! * testsuite/22_locale/collate_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/ctype_members_char.cc: Likewise. ! * testsuite/22_locale/ctype_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/messages_members_char.cc: Likewise. ! * testsuite/22_locale/money_get_members_char.cc: Likewise. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/money_put_members_char.cc: Likewise. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/moneypunct_members_char.cc: Likewise. ! * testsuite/22_locale/moneypunct_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/num_get_members_char.cc: Likewise. ! * testsuite/22_locale/num_get_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/num_put_members_char.cc: Likewise. ! * testsuite/22_locale/num_put_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/numpunct_members_char.cc: Likewise. ! * testsuite/22_locale/numpunct_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/time_get_members_char.cc: Likewise. ! * testsuite/22_locale/time_get_members_wchar_t.cc: Likewise. ! * testsuite/22_locale/time_put_members_char.cc: Likewise. ! * testsuite/22_locale/time_put_members_wchar_t.cc: Likewise. ! 2002-01-30 Benjamin Kosnik ! * config/locale/c_locale_gnu.cc: Same errno fixes as generic. ! * ChangeLog-2001: Fix spelling errors... ! * docs/html/17_intro/RELEASE-NOTES: Update. ! * docs/html/17_intro/TODO: Update. ! * README (file): Update. ! 2002-01-30 Loren Rittle ! * config/locale/c_locale_generic.cc: Check errno for ERANGE ! instead of non-zero to aid portability. ! 2002-01-30 Peter Schmid ! * docs/html/22_locale/messages.html: Fix example code. ! 2002-01-30 Richard Henderson ! * testsuite/27_io/ostream_inserter_arith.cc (test03_check): Break ! out from test03 and templatize. ! (test03): Use it. ! 2002-01-30 Paolo Carlini ! * config/locale/numpunct_members_gnu.cc ! (numpunct::_M_initialize_numpunct()): ! Fix initialization of _M_grouping for locales which have ! _M_thousands_sep == '\0'(L'\0', respectively). ! * testsuite/22_locale/numpunct_byname.cc (test02): Add test. ! 2002-01-30 Paolo Carlini ! * testsuite/27_io/ostream_inserter_arith.cc (test03): ! Better fix for 32/64 bit architectures, avoiding the ! implicit assumption that CHAR_BIT == 8. ! 2002-01-28 Phil Edwards ! * Makefile.am (doxygen, doxygen-maint, doxygen-man): Tweak targets. ! * Makefile.in: Regenerate. ! * docs/doxygen/run_doxygen: Update, mostly for man pages. ! * docs/doxygen/Intro.3: Update. ! * docs/doxygen/TODO: Update. ! * docs/doxygen/doxygroups.cc: Add namespace hook for __gnu_cxx. ! * docs/doxygen/mainpage.doxy: Update. ! * docs/doxygen/user.cfg.in: Update for header rename. Also ! regenerate comments and variables with 1.2.12. ! * docs/doxygen/maint.cfg.in: Remove file. ! * include/bits/stl_relops.h: Doxygenate. ! * include/bits/stl_tempbuf.h (std::_Temporary_buffer): Likewise. ! * include/c_std/std_cassert.h, include/c_std/std_cctype.h, ! include/c_std/std_cerrno.h, include/c_std/std_cfloat.h, ! include/c_std/std_ciso646.h, include/c_std/std_climits.h, ! include/c_std/std_clocale.h, include/c_std/std_cmath.h, ! include/c_std/std_csetjmp.h, include/c_std/std_csignal.h, ! include/c_std/std_cstdarg.h, include/c_std/std_cstddef.h, ! include/c_std/std_cstdio.h, include/c_std/std_cstdlib.h, ! include/c_std/std_cstring.h, include/c_std/std_ctime.h, ! include/c_std/std_cwchar.h, include/c_std/std_cwctype.h, ! include/ext/algorithm, include/ext/functional, include/ext/hash_map, ! include/ext/hash_set, include/ext/iterator, include/ext/memory, ! include/ext/numeric, include/ext/rb_tree, include/ext/rope, ! include/ext/ropeimpl.h, include/ext/slist, include/ext/stl_hash_fun.h, ! include/ext/stl_hashtable.h, include/ext/stl_rope.h, ! include/std/std_algorithm.h, include/std/std_bitset.h, ! include/std/std_complex.h, include/std/std_deque.h, ! include/std/std_fstream.h, include/std/std_functional.h, ! include/std/std_iomanip.h, include/std/std_ios.h, ! include/std/std_iosfwd.h, include/std/std_iostream.h, ! include/std/std_istream.h, include/std/std_iterator.h, ! include/std/std_limits.h, include/std/std_list.h, ! include/std/std_locale.h, include/std/std_map.h, ! include/std/std_memory.h, include/std/std_numeric.h, ! include/std/std_ostream.h, include/std/std_queue.h, ! include/std/std_set.h, include/std/std_sstream.h, ! include/std/std_stack.h, include/std/std_stdexcept.h, ! include/std/std_streambuf.h, include/std/std_string.h, ! include/std/std_utility.h, include/std/std_valarray.h, ! include/std/std_vector.h: Add/correct @file doxygen hook. ! * include/ext/memory: Doxygenate most of rest of file. ! * libsupc++/exception: Doxygen output formatting. ! * libsupc++/new: Say which header it is. ! * testsuite/lib/libstdc++-v3-dg.exp: Fix spacing. ! * docs/html/19_diagnostics/howto.html: Describe concept-checks switch. ! * docs/html/23_containers/howto.html: Describe O(n) list::size(). ! * docs/html/27_io/howto.html: Also link to Langer and Kreft text. ! 2002-01-28 Paolo Carlini ! Charles Leggett ! * testsuite/27_io/filebuf_members.cc (test_05): Add test. ! 2002-01-28 Paolo Carlini ! * testsuite/27_io/ostream_inserter_arith.cc (test03): ! Fix to deal correctly with both 32 bit and 64 bit architectures ! 2002-01-25 Loren Rittle ! * testsuite/thread/pthread1.cc: Use one condition variable ! per predicate instead of tricky use of one condition variable. ! 2002-01-25 Benjamin Kosnik ! * include/bits/fstream.tcc (filebuf::close()): Fix close for input ! streams. ! (filebuf::_M_really_overflow): Match indeterminate and sync calls. ! * testsuite/27_io/filebuf.cc: Compile only. ! * testsuite/27_io/filebuf_members.cc: Move tests to here. ! * testsuite/27_io/filebuf_virtuals.cc: And here. ! Revert sungetc, sync changes for expected values. ! * testsuite/27_io/filebuf-*: Move to... ! * testsuite/27_io/filebuf_virtuals-*: ...here. ! * testsuite/27_io/istream.cc: Compile only, activate. ! * testsuite/27_io/ostream.cc: Same. ! * testsuite/27_io/iostream.cc: New. ! * testsuite/27_io/iostream_members.cc: New. ! 2002-01-25 David Billinghurst ! * testsuite/thread/pthread1.cc: Enable on cygwin. ! * testsuite/thread/pthread2.cc: Likewise. ! * testsuite/thread/pthread3.cc: Likewise. ! * testsuite/thread/pthread4.cc: Likewise. ! * testsuite/thread/pthread5.cc: Likewise. ! * testsuite/thread/pthread6.cc: Likewise. ! 2002-01-24 Benjamin Kosnik ! * testsuite/27_io/ostream_inserter_char.cc (test07): New. ! 2002-01-24 Benjamin Kosnik ! * include/bits/basic_ios.h (basic_ios::_M_check_facet): Make ! const, tweak. ! (basic_ios::fill(char_type)): Use fill(). ! * include/bits/basic_ios.tcc (basic_ios::widen): Use _M_check_facet. ! (basic_ios::narrow): Same. ! (basic_ios::_M_cache_facets): Explicitly set cached facets to zero ! if they are invalid. ! (basic_ios::init): Comment. ! * testsuite/27_io/ios_init.cc (test02): New. ! 2002-01-24 Phil Edwards ! * include/bits/stl_tempbuf.h (_Temporary_buffer): Add doxygen hook. ! * include/bits/stl_algo.h: Include stl_tempbuf.h. ! * include/ext/memory: Do not include stl_tempbuf.h. ! (temporary_buffer): Add doxygen hook. ! (__get_temporary_buffer, get_temporary_buffer, ! return_temporary_buffer): Move back to std:: header... ! * include/std/std_memory.h: ...here. Do not include stl_tempbuf.h. ! * include/ext/rope: Do not include stl_tempbuf.h. ! * include/ext/stl_hashtable.h: Likewise. ! * include/std/std_algorithm.h: Likewise. ! * testsuite/20_util/temporary_buffer.cc: New file. ! 2002-01-24 andrew@andypo.net ! (tweaks, test and commit by Loren J. Rittle ) ! libstdc++/5432 ! * include/bits/ios_base.h: Use _Atomic_word for reference counts. ! * include/bits/localefwd.h: Likewise. ! Also use for std::locale::id::_S_highwater. ! * src/ios.cc (ios_base::xalloc): Use _Atomic_word. ! * src/locale.cc: Support new usage of _Atomic_word. ! (std::locale::classic): Guard entire function against reentry. ! * src/localename.cc: Support new usage of _Atomic_word. ! 2002-01-24 Benjamin Kosnik ! * testsuite/22_locale/num_put_members_wchar_t.cc (test03): Use ! _GLIBCPP_HAVE_SETENV. ! * testsuite/22_locale/codecvt_members_wchar_t_char.cc (test02): Same. ! * testsuite/22_locale/collate_members_char.cc (test02): Same. ! * testsuite/22_locale/ctype_members_char.cc (test03): Same. ! * testsuite/22_locale/ctype_members_wchar_t.cc (test03): Same. ! * testsuite/22_locale/messages_members_char.cc (test02): Same. ! * testsuite/22_locale/moneypunct_members_char.cc (test02): Same. ! * testsuite/22_locale/moneypunct_members_wchar_t.cc (test02): Same. ! * testsuite/22_locale/money_put_members_char.cc (test04): Same. ! * testsuite/22_locale/money_put_members_wchar_t.cc (test04): Same. ! * testsuite/22_locale/num_get_members_char.cc (test03): Same. ! * testsuite/22_locale/num_get_members_wchar_t.cc (test03): Same. ! * testsuite/22_locale/numpunct_members_char.cc (test02): Same. ! * testsuite/22_locale/numpunct_members_wchar_t.cc (test02): Same. ! * testsuite/22_locale/time_get_members_char.cc (test07): Same. ! * testsuite/22_locale/time_get_members_wchar_t.cc (test07): Same. ! * testsuite/22_locale/time_put_members_char.cc (test03): Same. ! * testsuite/22_locale/time_put_members_wchar_t.cc (test03): Same. ! * testsuite/22_locale/num_put_members_char.cc (test03): Same. ! * acinclude.m4 (GLIBCPP_CONFIGURE_TESTSUITE): Check for setenv. * aclocal.m4: Regenerate. * configure: Regenerate. ! * config.h.in: Regenerate. ! 2002-01-23 Loren Rittle ! * testsuite/thread/pthread1.cc: New test. ! * testsuite/thread/pthread2.cc: New test adapted from libstdc++/5347. ! * testsuite/thread/pthread3.cc: Likewise. ! * testsuite/thread/pthread4.cc: New test adapted from ! http://gcc.gnu.org/ml/gcc-bugs/2002-01/msg00679.html ! * testsuite/thread/pthread5.cc: New test adapted from libstdc++/5464. ! * testsuite/thread/pthread6.cc: New test adapted from libstdc++/5444. ! 2002-01-23 Richard Henderson ! PR libstdc++/5198 ! * config/cpu/m68k/bits/atomicity.h (__exchange_and_add): Only use ! CAS on the cpu variants that support it. Add versions that use ! TAS and that disable interrupts. ! (__atomic_add): Use __exchange_and_add to guarantee atomicity. ! 2002-01-23 Matt Kraai ! * include/bits/locale_facets.tcc: Remove old comments. ! 2002-01-23 Andreas Tobler ! * include/bits/locale_facets.tcc (__convert_to_v): Change template ! parameter to _Tv. ! (__convert_from_v): Same. ! 2002-01-23 Benjamin Kosnik ! * include/bits/locale_facets.h (num_get::_M_extract_int): Change ! prototype. ! * include/bits/locale_facets.tcc (num_get::_M_extract_int): Remove ! __max_digits checks, adjust arguments. ! (num_get::do_get(*)): Changeup. ! 2002-01-23 Loren Rittle ! * config/locale/c_locale_generic.cc: Fix typename usage. ! 2002-01-22 Benjamin Kosnik ! * config/locale/c_locale_generic.cc: Fix. ! 2002-01-22 Benjamin Kosnik ! * docs/html/22_locale/messages.html: Remove angle brackets. ! * docs/html/17_intro/TODO: Add. ! 2002-01-22 Paolo Carlini ! * testsuite/27_io/ios_manip_basefield.cc: Enable test02. ! * testsuite/27_io/ostream_inserter_arith.cc: Enable test03. ! * testsuite/27_io/ostream_inserter_char.cc: Enable test01. ! * testsuite/27_io/ostream_inserter_other.cc: Enable test04. ! 2002-01-22 Benjamin Kosnik ! Audit for LANG independence. ! * include/bits/localefwd.h: Tweaks. ! * include/bits/locale_facets.tcc (money_get::do_get(long double)): ! Use __convert_to_v. ! (time_get::do_get_year): Same. ! (__convert_from_v): Add. ! (num_put::_M_convert_float): Use. ! (num_put::_M_convert_int): Same. ! (money_put::do_put): Same. ! * src/locale-inst.cc: Add instantiations for __convert_from_v. ! * config/locale/time_members_gnu.cc: Cleanup setlocale usage. ! * config/locale/time_members_generic.cc: ! * config/locale/messages_members_gnu.cc: Same. ! * config/locale/messages_members_gnu.h: Same. ! * testsuite/22_locale/codecvt_members_wchar_t_char.cc (test02): New. ! * testsuite/22_locale/codecvt_members_char_char.cc (test02): New. ! * testsuite/22_locale/collate_members_wchar_t.cc (test02): New. ! * testsuite/22_locale/collate_members_char.cc (test02): New. ! * testsuite/22_locale/ctype_members_wchar_t.cc (test03): New. ! * testsuite/22_locale/ctype_members_char.cc (test03): New. ! * testsuite/22_locale/messages_members_char.cc (test02): New. ! * testsuite/22_locale/moneypunct_members_wchar_t.cc (test02): New. ! * testsuite/22_locale/moneypunct_members_char.cc (test02): New. ! * testsuite/22_locale/money_get_members_wchar_t.cc (test04): New. ! * testsuite/22_locale/money_get_members_char.cc (test04): New. ! * testsuite/22_locale/money_put_members_wchar_t.cc (test04): New. ! * testsuite/22_locale/money_put_members_char.cc (test04): New. ! * testsuite/22_locale/numpunct_members_wchar_t.cc (test02): New. ! * testsuite/22_locale/numpunct_members_char.cc (test02): New. ! * testsuite/22_locale/time_put_members_wchar_t.cc (test03): New. ! * testsuite/22_locale/time_put_members_char.cc (test03): New. ! * testsuite/22_locale/time_get_members_wchar_t.cc (test07): New. ! * testsuite/22_locale/time_get_members_char.cc (test07): New. ! * testsuite/22_locale/num_get_members_wchar_t.cc (test03): New. ! * testsuite/22_locale/num_get_members_char.cc (test03): New. ! * testsuite/22_locale/num_put_members_wchar_t.cc (test03): New. ! * testsuite/22_locale/num_put_members_char.cc (test03): New. ! * testsuite/22_locale/time_get_members_char.cc: Fixups for global ! locale issues. ! * testsuite/22_locale/time_get_members_char.cc: Same. ! 2002-01-22 Benjamin Kosnik ! libstdc++/5280 ! * include/bits/localefwd.h: Tweak comments. ! * include/bits/locale_facets.h (__convert_to_v): Add. ! * include/bits/locale_facets.tcc (num_get::do_get(double)): Use it. ! (num_get::do_get(float)): Same. ! (num_get::do_get(long double)): Same. ! (num_get::do_get(bool)): Same. ! (num_get::do_get(long)): Same. ! (num_get::do_get(long long)): Same. ! (num_get::do_get(unsigned int)): Same. ! (num_get::do_get(unsigned short)): Same. ! (num_get::do_get(unsigned long)): Same. ! (num_get::do_get(unsigned long long)): Same. ! * config/locale/c_locale_gnu.cc (__convert_to_v): Specialize. ! * config/locale/c_locale_generic.cc: Same. ! 2002-01-22 Loren Rittle ! * include/Makefile.am (c_base_builddir): Remove redundant slash. ! (std_builddir): Likewise. ! (std_headers_rename): Fix cut-n-paste typo. ! (install-data-local): Concat path per element instead of once to ! first element of list. ! * include/Makefile.in: Rebuilt. ! 2002-01-22 Benjamin Kosnik ! * config/os/aix/bits/ctype_noninline.h: Fix formatting. ! * config/os/bsd/netbsd/bits/ctype_noninline.h: Fix typo. ! * config/os/bsd/freebsd/bits/ctype_noninline.h: Fix formatting. ! 2002-01-20 Benjamin Kosnik ! * include/bits/locale_facets.h (ctype::classic_table): ! Remove definition. ! (ctype::_S_ctable): Remove. ! * config/os/gnu-linux/bits/ctype_noninline.h ! (ctype::_S_table): Remove definition. ! (ctype::classic_table): Define. ! (ctype::ctype): Replace _S_ctable with classic_table(). ! * config/os/aix/bits/ctype_noninline.h: Same. ! * config/os/bsd/freebsd/bits/ctype_noninline.h: Same. ! * config/os/bsd/netbsd/bits/ctype_noninline.h: Same. ! * config/os/djgpp/bits/ctype_noninline.h: Same. ! * config/os/generic/bits/ctype_noninline.h: Same. ! * config/os/gnu-linux/bits/ctype_noninline.h: Same. ! * config/os/hpux/bits/ctype_noninline.h: Same. ! * config/os/irix/irix5.2/bits/ctype_noninline.h: Same. ! * config/os/irix/irix6.5/bits/ctype_noninline.h: Same. ! * config/os/mingw32/bits/ctype_noninline.h: Same. ! * config/os/newlib/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.5/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.6/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.7/bits/ctype_noninline.h: Same. ! 2002-01-20 Danny Smith ! * config/os/mingw32/bits/ctype_noninline.h: Declare _ctype instead ! of _pctype. Use to define _S_ctable. Add definition for alternate ! ctor. Initialise _M_ctable to _S_ctable in ctors. ! (do_toupper, do_tolower): Use inline code appropriate for C-locale ! rather than ::toupper, ::tolower. ! 2002-01-18 Loren Rittle ! * testsuite/18_support/numeric_limits.cc (test_extrema): ! Add specialization for FreeBSD systems only to avoid losing test ! only due to extra precision unmentioned in system headers. ! 2002-01-18 David Billinghurst ! * config/os/irix/irix6.5/bits/ctype_noninline.h: Fix typo ! 2002-01-17 Nick Clifton ! * testsuite/testsuite_hooks.h: Fix comment typo. Memory ! limiting is only attempted if _GLIBCPP_MEM_LIMIT is defined. ! 2002-01-17 Peter Schmid ! * testsuite/22_locale/ctor_copy_dtor.cc: Remove check. ! 2002-01-17 David Edelsohn ! * configure.target: Define OPT_LDFLAGS for AIX case. ! 2002-01-17 Gabriel Dos Reis ! * include/std/std_limits.h (__glibcpp_float_has_quiet_NaN, ! __glibcpp_double_has_quiet_NaN): Correct mispelling. ! 2002-01-17 Andreas Tobler ! * config/os/solaris/solaris2.6/bits/ctype_noninline.h: Fix. ! 2002-01-16 David Edelsohn ! * acinclude.m4 (GLIBCPP_CHECK_LINKER_FEATURES): Do not clear ! SECTION_LDFLAGS and OPT_LDFLAGS. Fix ac_sectionLDflags type. * aclocal.m4: Regenerate. * configure: Regenerate. ! 2002-01-16 Benjamin Kosnik ! * include/Makefile.am (c_base_headers_rename): New. ! (c_base_headers_extra): New. ! (stamp-c_base): Modify. ! (install-data-local): Use both. ! * include/Makefile.in: Regenerate. ! * include/c/[cctype ciso646 cmath cstdarg cstdlib cerrno climits ! csetjmp cstddef cstring cwchar cassert cfloat clocale csignal ! cstdio ctime cwctype]: Move to.. ! * include/c/std_*: Here. ! * include/c_std/[cctype ciso646 cmath cstdarg cstdlib cerrno climits ! csetjmp cstddef cstring cwchar cassert cfloat clocale csignal ! cstdio ctime cwctype]: Move to.. ! * include/c_std/std_*: Here. ! Alexandre Oliva ! * include/Makefile.am (.PRECIOUS): Add rule. ! * include/Makefile.in: Regenerate. ! 2002-01-16 Benjamin Kosnik ! Peter Schmid ! * include/bits/stl_iterator.h (reverse_iterator::_M_current): ! Deuglify, should be current. ! (back_insert_iterator::_M_container): Deuglify, should be container. ! (front_insert_iterator::_M_container): Same. ! (insert_iterator::_M_container): Same. ! * testsuite/24_iterators/reverse_iterator.cc: Add check. ! * testsuite/24_iterators/back_insert_iterator.cc: Add check. ! * testsuite/24_iterators/front_insert_iterator.cc: Same. ! * testsuite/24_iterators/insert_iterator.cc: Same. ! 2002-01-16 Benjamin Kosnik ! * include/bits/locale_facets.h (ctype::classic_table): Make ! static. ! (ctype::_M_ctable): Make static, change name to _S_ctable. ! * config/os/gnu-linux/bits/ctype_noninline.h: Define _S_ctable. ! * config/os/solaris/solaris2.7/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.6/bits/ctype_noninline.h: Same. ! * config/os/solaris/solaris2.5/bits/ctype_noninline.h: Same. ! * config/os/newlib/bits/ctype_noninline.h: Same. ! * config/os/irix/irix6.5/bits/ctype_noninline.h: Same. ! * config/os/irix/irix5.2/bits/ctype_noninline.h: Same. ! * config/os/hpux/bits/ctype_noninline.h: Same. ! * config/os/djgpp/bits/ctype_noninline.h: Same. ! * config/os/bsd/netbsd/bits/ctype_noninline.h: Same. ! * config/os/bsd/freebsd/bits/ctype_noninline.h: Same. ! * config/os/aix/bits/ctype_noninline.h: Same. ! Testcase by Dietmar Kühl via Peter Schmid ! * testsuite/22_locale/ctype_members_char.cc (char>): Add test for ! classic_table(). ! 2002-01-16 Benjamin Kosnik ! * libmath/signbitl.c: Copyright years as list, not range. ! * libmath/Makefile.am: Same. ! * libmath/Makefie.in: Regenerate. ! * libmath/signbit.c: Same. ! * libmath/nan.c: Same. ! * libmath/copysignf.c: Same. ! * libmath/signbitf.c: Same. ! * testsuite/22_locale/money_get_members_char.cc: Same. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Same. ! * testsuite/22_locale/money_put_members_char.cc: Same. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Same. ! * testsuite/22_locale/time_get_members_char.cc: Same. ! * testsuite/22_locale/time_get_members_wchar_t.cc: Same. ! * testsuite/22_locale/time_put_members_char.cc: Same. ! * testsuite/22_locale/time_put_members_wchar_t.cc: Same. ! * testsuite/21_strings/nonmember.cc: Same. ! * testsuite/21_strings/compare.cc: Same. ! * testsuite/27_io/stringstream.cc: Same. ! * testsuite/27_io/stringbuf.cc: Same. ! * testsuite/27_io/filebuf.cc: Same. ! * testsuite/27_io/ios_manip_basefield.cc: Same. ! * testsuite/27_io/ios_manip_fmtflags.cc: Same. ! * include/bits/cpp_type_traits.h: Same. ! * include/bits/generic_shadow.h: Same. ! * include/bits/gslice_array.h: Same. ! * include/bits/gslice.h: Same. ! * include/bits/indirect_array.h: Same. ! * include/bits/slice_array.h: Same. ! * include/bits/sstream.tcc: Same. ! * include/bits/streambuf_iterator.h: Same. ! * include/bits/valarray_array.tcc: Same. ! * include/bits/valarray_meta.h: Same. ! * include/bits/valarray_array.h: Same. ! * config/os/mingw32/bits/ctype_noninline.h: Same. ! * config/os/mingw32/bits/ctype_base.h: Same. ! * config/os/hpux/bits/ctype_noninline.h: Same. ! * config/os/hpux/bits/ctype_base.h: Same. ! * config/os/gnu-linux/bits/ctype_noninline.h: Same. ! * config/os/gnu-linux/bits/ctype_base.h: Same. ! * config/os/generic/bits/ctype_noninline.h: Same. ! * config/os/generic/bits/ctype_base.h: Same. ! * libsupc++/tinfo.h: Tweaks. ! 2002-01-15 Benjamin Kosnik ! * testsuite/22_locale/num_put_members_wchar_t.cc (test02): Same. ! * testsuite/22_locale/num_put_members_char.cc (test01): Tweak. ! * testsuite/22_locale/ctype_members_char.cc: Tweak. ! 2002-01-15 Benjamin Kosnik ! * include/bits/locale_facets.tcc (num_put::do_put(bool): Fix. ! (num_put::do_put(void*)): Fix. ! * testsuite/22_locale/num_put_members_char.cc (test02): Add. ! * testsuite/22_locale/num_put_members_wchar_t.cc (test02): Add. ! * testsuite/22_locale/num_get_members_char.cc (test02): Add ! long double, void, bool types. ! * testsuite/22_locale/num_get_members_wchar_t.cc (test02): Add. ! 2002-01-15 Benjamin Kosnik ! Alexandre Oliva ! * libmath/Makefile.am (LINK): Add --tag CC. ! * libmath/Makefile.in: Regenerate. ! 2002-01-15 John David Anglin ! * config/os/hpux/bits/ctype_noninline.h: Use __SB_masks for address ! of character to attribute mapping table. ! 2002-01-15 David Billinghurst ! * testsuite/26_numerics/c99_classification_macros_c.cc ! Remove dg-error and dg-excess-errors comments. ! 2002-01-14 Benjamin Kosnik ! * include/bits/locale_facets.tcc (time_put::put): Correct output ! iterator positions. ! * testsuite/22_locale/time_put_members_char.cc (test02): Add. ! * testsuite/22_locale/time_put_members_wchar_t.cc (test02): Add. ! * testsuite/22_locale/time_get_members_wchar_t.cc (test06): Add. ! * testsuite/22_locale/time_get_members_char.cc (test06): Add. ! 2002-01-14 Craig Rodrigues ! * docs/html/17_intro/porting-howto.xml: Update filebuf section. ! 2002-01-14 Paolo Carlini ! Nathan Myers ! * include/bits/basic_string.h ! (replace(__pos, __n1, __s, __n2)): Optimize by avoiding ! temporaries (i.e., call _M_replace_safe) when possible. ! (replace(__pos, __n, __str)): Call replace(__pos, __n1, __s, __n2). ! (replace(__pos, __n1, __s)): Call replace(__pos, __n1, __s , __n2). ! (replace(__i1, __i2, __str)): Call replace(__i1, __i2, __s, __n). ! (replace(__i1, __i2, __s)): Call replace(__i1, __i2, __s, __n). ! (replace(__i1, __i2, __s, __n)): Call replace(__pos1, __n1, __s, __n2). ! * include/bits/basic_string.tcc ! (replace(__pos1, __n1, __str, __pos2, __n2)): Call ! replace(__pos, __n1, __s, __n2). ! * testsuite/21_strings/replace.cc (test03): New testcases. ! * include/bits/basic_string.h (insert(__pos, __s, __n)): ! Adjust comparison wrt overflow. ! 2002-01-12 Benjamin Kosnik ! * include/Makefile.am (std_headers_rename): New variable. ! (install-data-local): Use it. ! * include/Makefile.in: Regenerate. ! 2002-01-12 Benjamin Kosnik ! * include/bits/locale_facets.tcc (money_put::do_put(string): ! Correct output iterator value. ! * testsuite/22_locale/money_put_members_char.cc (test03): Add. ! * testsuite/22_locale/money_put_members_wchar_t.cc: Same. ! 2002-01-11 Phil Edwards ! * include/Makefile.am, include/Makefile.in (stamp-std): Fix typo from ! previous commit. ! 2002-01-11 Phil Edwards ! * include/Makefile.am (std_headers): Update list with new names. ! (stamp-std): Link to standardized name. ! * include/Makefile.in: Regenerate. ! * include/std/algorithm, include/std/bitset, include/std/complex, ! include/std/deque, include/std/fstream, include/std/functional, ! include/std/iomanip, include/std/ios, include/std/iosfwd, ! include/std/iostream, include/std/istream, include/std/iterator, ! include/std/limits, include/std/list, include/std/locale, ! include/std/map, include/std/memory, include/std/numeric, ! include/std/ostream, include/std/queue, include/std/set, ! include/std/sstream, include/std/stack, include/std/stdexcept, ! include/std/streambuf, include/std/string, include/std/utility, ! include/std/valarray, include/std/vector: Rename to... ! * include/std/std_algorithm.h, include/std/std_bitset.h, ! include/std/std_complex.h, include/std/std_deque.h, ! include/std/std_fstream.h, include/std/std_functional.h, ! include/std/std_iomanip.h, include/std/std_ios.h, ! include/std/std_iosfwd.h, include/std/std_iostream.h, ! include/std/std_istream.h, include/std/std_iterator.h, ! include/std/std_limits.h, include/std/std_list.h, ! include/std/std_locale.h, include/std/std_map.h, ! include/std/std_memory.h, include/std/std_numeric.h, ! include/std/std_ostream.h, include/std/std_queue.h, ! include/std/std_set.h, include/std/std_sstream.h, ! include/std/std_stack.h, include/std/std_stdexcept.h, ! include/std/std_streambuf.h, include/std/std_string.h, ! include/std/std_utility.h, include/std/std_valarray.h, ! include/std/std_vector.h: ...this. ! 2002-01-11 Loren Rittle ! * include/Makefile.am (extra_target_headers): New list of all ! target files built with ad hoc naming rules. ! (stamp-*): Handle LN_S failure in manner portable across make ! implementations. ! (install-data-local): Install header files from human-maintained ! file lists and directory components instead of non-robust find. ! * include/Makefile.in: Rebuilt. ! 2002-01-11 Benjamin Kosnik ! * include/bits/locale_facets.tcc (money_get::do_get(string)): ! Check for zero-length negative sign before adding it to output ! string. ! (money_get::do_get(long double)): Return beg. ! * testsuite/22_locale/money_get_members_char.cc (test02): Add ! iterator checks. ! * testsuite/22_locale/money_get_members_wchar_t.cc: Same. ! 2002-01-10 David Seymour ! libstdc++/5331 ! * include/bits/locale_facets.h (num_get<>): Return advanced iterator ! for _M_extract_float and _M_extract_int ! * include/bits/locale_facets.tcc (num_get<>::_M_extract_float) ! (num_get<>::_M_extract_int): Likewise, all callers changed ! * testsuite/22_locale/num_get_members_char.cc: Testcase ! 2002-01-09 Paolo Carlini ! * libsupc++/exception (bad_exception): Add comment. ! * libsupc++/new (bad_alloc): Same. ! * libsupc++/typeinfo (bad_cast, bad_typeid): Same. ! 2002-01-09 Paolo Carlini ! libstdc++/3150: revert 2001-11-30 commit. DR266 only means ! that the destructors should be removed from the descriptions ! in the standard: writing them explicitly allows the vtable ! heuristic to work. For additional information see: ! http://gcc.gnu.org/ml/libstdc++/2002-01/msg00090.html ! http://gcc.gnu.org/ml/libstdc++/2002-01/msg00110.html ! http://gcc.gnu.org/ml/libstdc++/2002-01/msg00155.html ! * libsupc++/exception (bad_exception::~bad_exception()): ! Reintroduce declaration. ! * libsupc++/new (bad_alloc::~bad_alloc()): Same. ! * libsupc++/typeinfo (bad_cast::~bad_cast()): Same. ! (bad_typeid::~bad_typeid()): Same. ! * libsupc++/eh_exception.cc (bad_exception::~bad_exception()): ! Reintroduce definition. ! * libsupc++/new_handler.cc (bad_alloc::~bad_alloc()): Same. ! * libsupc++/tinfo.cc (bad_cast::~bad_cast()): Same. ! (bad_typeid::~bad_typeid()): Same. ! 2002-01-09 Benjamin Kosnik ! * include/Makefile.am (c_base_srcdir): Remove duplicate '/'. ! * include/Makefile.in: Regenerate. ! 2002-01-09 Bo Thorsen ! * config/cpu/x86-64/bits/cpu_limits.h (__glibcpp_long_bits): Add ! definition. ! 2002-01-08 Benjamin Kosnik ! libstdc++/2913 ! libstdc++/4879 ! * include/bits/fstream.tcc (filebuf::_M_really_overflow): Test ! return value of _M_file->sync(). ! (filebuf::showmanyc): Check for is_open. ! * include/std/fstream (filebuf::sync): Tweak. ! * testsuite/27_io/filebuf.cc: Tweak. ! 2002-01-08 John Fardo ! Brad Garcia ! * testsuite/27_io/filebuf_members.cc: Add test. ! 2002-01-07 Benjamin Kosnik ! Craig Rodrigues ! libstdc++/5174 ! * po/Makefile.am (mkinstalldirs): Add. ! * po/Makefile.in: Regenerate. ! 2002-01-07 David Billinghurst ! * testsuite_flags.in: Add -fmessage-length=0 to CXXFLAGS * ! testsuite/lib/prune.exp: Delete lines ":In function ..." from ! compiler output. ! * testsuite/23_containers/map_operators.cc: Remove ! dg-excess-errors comment. ! * testsuite/23_containers/set_operators.cc: Likewise. ! 2002-01-06 Paolo Carlini ! * include/bits/stl_function.h: Remove two lines of comments; ! adjust copyright years. ! 2002-01-04 Benjamin Kosnik ! * include/Makefile.am (std_headers): Remove cXXX from list. ! (c_base_srcdir): No bits subdirectory. ! (c_base_builddir): Same. ! (c_base_headers): Adjust names, add ciso646. ! (bits_headers): Remove std_xxx.h headers. ! * include/Makefile.in: Regenerate. ! * include/ext/iterator: Adjust includes. ! * include/ext/ropeimpl.h: Same. ! * include/ext/stl_hash_fun.h: Same. ! * include/ext/algorithm: Same. ! * include/backward/bvector.h: Adjust includes. ! * include/backward/vector.h: Same. ! * include/backward/strstream: Same. ! * include/backward/streambuf.h: Same. ! * include/backward/stack.h: Same. ! * include/backward/set.h: Same. ! * include/backward/queue.h: Same. ! * include/backward/multiset.h: Same. ! * include/backward/multimap.h: Same. ! * include/backward/map.h: Same. ! * include/backward/list.h: Same. ! * include/backward/iterator.h: Same. ! * include/backward/iostream.h: Same. ! * include/backward/iomanip.h: Same. ! * include/backward/fstream.h: Same. ! * include/backward/deque.h: Same. ! * include/backward/complex.h: Same. ! * include/bits/std_algorithm.h: Move to... ! * include/std/algorithm: ...here. ! * include/bits/std_iosfwd.h, std_locale.h, std_stack.h, ! std_bitset.h, std_ios.h, std_map.h, std_stdexcept.h, ! std_complex.h, std_iostream.h, std_memory.h, std_streambuf.h, ! std_deque.h, std_istream.h, std_numeric.h, std_string.h, ! std_fstream.h, std_ostream.h, std_utility.h, std_iterator.h, ! std_queue.h, std_valarray.h, std_functional.h, std_limits.h, ! std_set.h, std_vector.h, std_iomanip.h, std_list.h, std_sstream.h: ! Same. ! * include/c_std/bits/std_cassert.h: Move to... ! * include/c_std/cassert: Here. ! * include/c_std/std_cctype.h, std_cerrno.h, std_cfloat.h, ! std_climits.h, std_clocale.h, std_cmath.h, std_csetjmp.h, ! std_csignal.h, std_cstdarg.h, std_cstddef.h, std_cstdio.h, ! std_cstdlib.h, std_cstring.h, std_ctime.h, std_cwchar.h, ! std_cwctype.h: Same. ! * include/c_std/cmath: Adjust cmath.tcc include. ! * include/c_std/cstdlib: Adjust includes. ! * include/c_std/cwchar: Same. ! * include/c_std/ctime: Same. ! * include/c_std/cstring: Same. ! * include/c_std/cstdio: Same. ! * include/c_std/bits: Remove directory. ! * include/c/bits/std_cassert.h: Move to... ! * include/c/cassert: Here. ! * include/c/std_cctype.h, std_cerrno.h, std_cfloat.h, ! std_climits.h, std_clocale.h, std_cmath.h, std_csetjmp.h, ! std_csignal.h, std_cstdarg.h, std_cstddef.h, std_cstdio.h, ! std_cstdlib.h, std_cstring.h, std_ctime.h, std_cwchar.h, ! std_cwctype.h: Same. ! * include/c/bits: Remove directory. ! * include/std/cwctype: Remove. ! * include/std/cwchar: Remove. ! * include/std/ctime: Remove. ! * include/std/cstring: Remove. ! * include/std/cstdlib: Remove. ! * include/std/cstdio: Remove. ! * include/std/cstddef: Remove. ! * include/std/cstdarg: Remove. ! * include/std/csignal: Remove. ! * include/std/csetjmp: Remove. ! * include/std/cmath: Remove. ! * include/std/clocale: Remove. ! * include/std/climits: Remove. ! * include/std/ciso646: Remove. ! * include/std/cfloat: Remove. ! * include/std/cerrno: Remove. ! * include/std/cctype: Remove. ! * include/std/cassert: Remove. ! * include/bits/fpos.h: Adjust includes, removing ! files and subsituting . ! * include/bits/valarray_array.h: Same. ! * include/bits/stl_uninitialized.h: Same. ! * include/bits/stl_alloc.h: Same. ! * include/bits/stl_algobase.h: Same. ! * include/bits/sstream.tcc: Same. ! * include/bits/pthread_allocimpl.h: Same. ! * include/bits/ostream.tcc: Same. ! * include/bits/localefwd.h: Same. ! * include/bits/locale_facets.tcc: Same. ! * include/bits/locale_facets.h: Same. ! * include/bits/istream.tcc: Same. ! * include/bits/char_traits.h: Same. ! * include/bits/boost_concept_check.h: Same. ! * include/bits/basic_file.h: Same. ! * include/std/bitset: Same. ! * include/std/complex: Same. ! * include/std/fstream: Same. ! * include/std/functional: Same. ! * include/std/ios: Same. ! * include/std/iostream: Same. ! * include/std/ostream: Same. ! * include/std/sstream: Same. ! * include/std/streambuf: Same. ! * include/std/string: Same. ! * include/std/iterator: Same. ! * include/std/valarray: Same. ! * src/ios.cc: Adjust includes. ! * src/valarray-inst.cc: Same. ! * src/string-inst.cc: Same. ! * src/stl-inst.cc: Same. ! * src/stdexcept.cc: Same. ! * src/misc-inst.cc: Same. ! * src/localename.cc: Same. ! * src/locale-inst.cc: Same. ! * src/locale.cc: Same. ! * src/limits.cc: Same. ! * src/concept-inst.cc: Same. ! * src/complex_io.cc: Same. ! * src/codecvt.cc: Same. ! * src/bitset.cc: Same. ! * src/cmath.cc: Same. ! 2002-01-04 Paolo Carlini ! * include/bits/stl_tree.h (rb_tree): Move to... ! * include/ext/rb_tree: ...here, new file. ! * include/Makefile.am (ext_headers): Add new file. ! * include/Makefile.in: Regenerate. ! * include/bits/stl_tempbuf.h (get_temporary_buffer + helper, ! return_temporary_buffer, struct temporary_buffer): Move to... ! * include/ext/memory: ...here. ! * testsuite/ext/headers.cc: Include . ! * include/backward/tempbuf.h: Include , tweak. ! * include/backward/tree.h: Include ! * include/bits/stl_numeric.h (power + helpers, iota): Move to... ! * include/ext/numeric: ...here, new file. ! * include/bits/stl_function.h (identity_element, unary_compose, ! binary_compose, compose1, compose2, identity, select1st, ! select2nd, project1st + helper, project2nd + helper, ! constant_void_fun + helper, constant_unary_fun + helper, ! costant_binary_fun + helper, constant0, constant1, constant2, ! subtractive_rng, mem_fun1, mem_fun1_ref): Move to... ! * include/ext/functional: ...here, new file. ! * include/Makefile.am (ext_headers): Add new files. ! * include/Makefile.in: Regenerate. ! * testsuite/ext/headers.cc: Include and ! . ! * include/backward/algo.h: Include , tweak. ! * include/backward/function.h: Include , tweak. ! * include/ext/ropeimpl.h: Include . ! 2002-01-03 Jeffrey A Law ! * config/os/hpux/bits/os_defines.h: Prefix __strtoll and ! __strtoull declarations with __extension__. ! 2002-01-03 David Billinghurst ! * testsuite/lib/prune.exp: Correct regular expression for ! -ffunction-sections ! 2002-01-02 Phil Edwards ! * include/bits/stl_algo.h (upper_bound, equal_range, binary_search): ! Change concept checks, as with lower_bound and PR 2054. ! * testsuite/ext/concept_checks.cc: Expand test to include those. ! 2002-01-02 Phil Edwards ! * include/bits/boost_concept_check.h: Import some changes from ! upsteam (Boost) version. ! 2002-01-02 Paolo Carlini ! * include/bits/stl_algobase.h (copy_n + helpers, ! lexicographical_compare_3way + helpers): Move to... ! * include/ext/algorithm: ...here. ! * include/bits/stl_uninitialized.h (uninitialized_copy_n + ! helpers): Move to... ! * include/ext/memory: ...here, new file. ! * include/Makefile.am (ext_headers): Add new file. ! * include/Makefile.in: Regenerate. ! * testsuite/ext/headers.cc: Include . ! * include/backward/algobase.h: Include and ! , tweak. ! * include/ext/ropeimpl.h: Include , tweak. ! * include/ext/stl_rope.h: Include , tweak. ! 2002-01-01 Roger Sayle ! * libmath/stubs.c (sinf,cosf): Implement stubs to enable the ! equivalent ___builtin__ versions. ! * include/c_shadow/bits/std_cmath.h: All __builtin math functions ! are available in libstdc++ as the necessary stub implementations ! are provided by libmath/stubs.c. ! 2002-01-01 Jason Thorpe ! * configure.in: Add support for NetBSD cross compiles. * configure: Regenerate. diff -Nrc3pad gcc-3.0.4/libstdc++-v3/ChangeLog-2000 gcc-3.1/libstdc++-v3/ChangeLog-2000 *** gcc-3.0.4/libstdc++-v3/ChangeLog-2000 Wed Jan 3 15:52:02 2001 --- gcc-3.1/libstdc++-v3/ChangeLog-2000 Fri Nov 23 16:29:00 2001 *************** *** 873,879 **** 2000-11-23 Gabriel Dos Reis * include/bits/ios_base.h (ios_base::failure::~failure, ! ios_base::failure::what): Move defintion to ... * src/ios.cc (ios_base::failure::~failure): ... here. src/ios.cc (ios::failure::what): Likewise. --- 873,879 ---- 2000-11-23 Gabriel Dos Reis * include/bits/ios_base.h (ios_base::failure::~failure, ! ios_base::failure::what): Move definition to ... * src/ios.cc (ios_base::failure::~failure): ... here. src/ios.cc (ios::failure::what): Likewise. *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 2043,2049 **** * acinclude.m4 (GLIBCPP_CHECK_OS): Link to os_defines.h. * aclocal.m4: Regenerate. ! * config/os/*/bits/os_defintes: Adjust copyright dates. 2000-10-08 Phil Edwards --- 2043,2049 ---- * acinclude.m4 (GLIBCPP_CHECK_OS): Link to os_defines.h. * aclocal.m4: Regenerate. ! * config/os/*/bits/os_defines: Adjust copyright dates. 2000-10-08 Phil Edwards *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 2768,2774 **** __codecvt_abstract_base in an attempt to point some light this way... Move __enc_traits and codecvt bits to codecvt.h. * src/locale-inst.cc: Remove codecvt ! explicit instantiation. Separate out codecvt instantations, simplify. * src/locale.cc: Move codecvt bits to codecvt.cc 2000-08-15 Alexandre Oliva --- 2768,2774 ---- __codecvt_abstract_base in an attempt to point some light this way... Move __enc_traits and codecvt bits to codecvt.h. * src/locale-inst.cc: Remove codecvt ! explicit instantiation. Separate out codecvt instantiations, simplify. * src/locale.cc: Move codecvt bits to codecvt.cc 2000-08-15 Alexandre Oliva *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 4796,4802 **** (ctype): Same. Move _S_touppper to _M_toupper and initialize in ctor. Move _S_tolower to _M_tolower and initialize in ctor. ! Move _S_table to _M_ctable and intialize in ctor. * bits/locale_facets.h (std): And here. * src/locale.cc (std): Tweak. * config/gnu-linux/ctype.cc: Change initialization here. --- 4796,4802 ---- (ctype): Same. Move _S_touppper to _M_toupper and initialize in ctor. Move _S_tolower to _M_tolower and initialize in ctor. ! Move _S_table to _M_ctable and initialize in ctor. * bits/locale_facets.h (std): And here. * src/locale.cc (std): Tweak. * config/gnu-linux/ctype.cc: Change initialization here. *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 4807,4813 **** * bits/localefwd.h: Tweak. * bits/std_streambuf.h: Tweak formatting. ! * testsuite/27_io/filebuf.cc: Remove BUFSIZ dependancies. 2000-03-05 Chip Salzenberg --- 4807,4813 ---- * bits/localefwd.h: Tweak. * bits/std_streambuf.h: Tweak formatting. ! * testsuite/27_io/filebuf.cc: Remove BUFSIZ dependencies. 2000-03-05 Chip Salzenberg *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 4822,4828 **** * std/strstream: New file. * stl/bits/std_strstream.h: New file. * bits/std_streambuf.h: Add public access. ! * src/Makefile.am: Add strstream sources to list of dependancies. * src/Makefile.in: Regenerate. 2000-03-03 2000 Gabriel Dos Reis --- 4822,4828 ---- * std/strstream: New file. * stl/bits/std_strstream.h: New file. * bits/std_streambuf.h: Add public access. ! * src/Makefile.am: Add strstream sources to list of dependencies. * src/Makefile.in: Regenerate. 2000-03-03 2000 Gabriel Dos Reis *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 5318,5324 **** * math/complex-stub.h (nan): And here. * Makefile.am (rebuild-stamp): Remove libio and libio ! dependancies. Plan to take out libio subdir and just merge with libio in top level gcc directory. Of course, this assumes there is a libio in the top level directory (ie ../src_dir). This will probably change the way this library is configured by default. --- 5318,5324 ---- * math/complex-stub.h (nan): And here. * Makefile.am (rebuild-stamp): Remove libio and libio ! dependencies. Plan to take out libio subdir and just merge with libio in top level gcc directory. Of course, this assumes there is a libio in the top level directory (ie ../src_dir). This will probably change the way this library is configured by default. *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 5928,5934 **** 1999-12-08 Benjamin Kosnik * bits/sstream.tcc (stringbuf::seekoff): Long overdue revamp. Make ! in and out buffers update independantly. * bits/basic_ios.h: Minor formatting. * bits/fstream.tcc (std): Fix indentation. --- 5928,5934 ---- 1999-12-08 Benjamin Kosnik * bits/sstream.tcc (stringbuf::seekoff): Long overdue revamp. Make ! in and out buffers update independently. * bits/basic_ios.h: Minor formatting. * bits/fstream.tcc (std): Fix indentation. *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 7161,7167 **** * bits/std_sstream.h (_M_init_stringbuf): New function. * bits/sstream.tcc: Tweak. ! * docs/27_io/iostreams_heirarchy.pdf: New file. * docs/17_intro/CHECKLIST (basic_string): Validation and acceptance. Wooo-hoo! --- 7161,7167 ---- * bits/std_sstream.h (_M_init_stringbuf): New function. * bits/sstream.tcc: Tweak. ! * docs/27_io/iostreams_hierarchy.pdf: New file. * docs/17_intro/CHECKLIST (basic_string): Validation and acceptance. Wooo-hoo! *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 7611,7617 **** converting "long double" to struct long_double. Probably should be done with one macro (HAVE_STRTOLD) at configure time. ! * bits/std_cmath.h: Comment out pow(double, int) defintion as gives re-declaration under hpux10.20. Revert previous change, as kills linux/x86, solaris 2.7, hpux builds. These should be done using autoconf, see std_cctype.h and the solutions started in --- 7611,7617 ---- converting "long double" to struct long_double. Probably should be done with one macro (HAVE_STRTOLD) at configure time. ! * bits/std_cmath.h: Comment out pow(double, int) definition as gives re-declaration under hpux10.20. Revert previous change, as kills linux/x86, solaris 2.7, hpux builds. These should be done using autoconf, see std_cctype.h and the solutions started in *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 8804,8810 **** * bits/char_traits.h: Remove fpos definitions from here. . . * bits/fpos.h: New file, put them here. Eventually, this may allow ! the severing of char_traits and fpos dependancies. * src/Makefile.in: Add fpos.h. * src/Makefile.am: Ditto. * bits/std_string.h: Add fpos.h include here. --- 8804,8810 ---- * bits/char_traits.h: Remove fpos definitions from here. . . * bits/fpos.h: New file, put them here. Eventually, this may allow ! the severing of char_traits and fpos dependencies. * src/Makefile.in: Add fpos.h. * src/Makefile.am: Ditto. * bits/std_string.h: Add fpos.h include here. *************** Thu Nov 2 10:11:45 2000 Mark P Mitchel *** 9698,9704 **** * bits/basic_string.h: Disable non-standard ctor declarations. * bits/string.tcc: Disable definitions as well. ! * src/string.cc: Disable dependancies. * bits/sbuf_iter.h (std): Add default to template parameter for ostreambuf_iterator and istreambuf_iterator. * bits/std_iosfwd.h: Change istreambuf_iterator to --- 9698,9704 ---- * bits/basic_string.h: Disable non-standard ctor declarations. * bits/string.tcc: Disable definitions as well. ! * src/string.cc: Disable dependencies. * bits/sbuf_iter.h (std): Add default to template parameter for ostreambuf_iterator and istreambuf_iterator. * bits/std_iosfwd.h: Change istreambuf_iterator to diff -Nrc3pad gcc-3.0.4/libstdc++-v3/ChangeLog-2001 gcc-3.1/libstdc++-v3/ChangeLog-2001 *** gcc-3.0.4/libstdc++-v3/ChangeLog-2001 Thu Jan 1 00:00:00 1970 --- gcc-3.1/libstdc++-v3/ChangeLog-2001 Thu Jan 31 02:05:16 2002 *************** *** 0 **** --- 1,6067 ---- + 2001-12-31 Paolo Carlini + + * include/ext/iterator: Add #include , tweak. + * testsuite/ext/headers.cc: Add . + + 2001-12-31 Paolo Carlini + + * include/backward/algo.h: Add two more using declarations. + * include/backward/iterator.h: Include , + add using declaration. + * include/ext/algorithm: Add #pragma GCC system_header. + + 2001-12-31 Phil Edwards + + * include/bits/stl_bvector.h: Change calls to 3-argument distance() + into standard 2-argument version. + * include/bits/stl_deque.h: Likewise. + * include/bits/stl_tempbuf.h: Likewise. + * include/bits/stl_tree.h: Likewise. + * include/bits/stl_vector.h: Likewise. + * include/ext/stl_hashtable.h: Likewise. + * include/bits/stl_iterator_base_funcs.h: Move distance() extension... + * include/ext/iterator: to here. New file. + * include/Makefile.am (ext_headers): Add new file, alphabetize. + * include/Makefile.in: Regenerate. + + 2001-12-31 Phil Edwards + + * include/bits/stl_deque.h: Doxygenate with initial/example hooks. + Clean up spacing and indentation. + + 2001-12-31 Paolo Carlini + + * include/ext/slist: Move into __gnu_cxx, + tweak, add using declarations. + + 2001-12-31 Paolo Carlini + + * include/ext/hash_map: Move into __gnu_cxx, + tweak, add using declarations. + * include/ext/hash_set: Ditto. + * include/ext/ropeimpl.h: Ditto. + * include/ext/stl_hash_fun.h: Ditto. + * include/ext/stl_hashtable.h: Ditto. + * include/ext/stl_rope.h: Ditto. + * src/ext-inst.cc: Tweak. + * testsuite/ext/rope.cc: Tweak. + + 2001-12-31 Paolo Carlini + + * include/backward/algo.h: Include , + tweak using declarations. + + 2001-12-29 Richard Henderson + + * config/os/hpux/bits/os_defines.h: Don't define __glibcpp_long_bits. + * config/os/hpux/bits/cpu_limits.h: New file. + * configure.target (CPULIMITSH): Use it. + + 2001-12-28 Richard Henderson + + * config/cpu/ia64/bits/cpu_limits.h: New file. + * config/os/osf/osf5.0/bits/cpu_limits.h: New file. + * configure.target (CPULIMITSH): Use them. + + 2001-12-28 Phil Edwards + + * include/bits/c++config: Move doxygen hook comment... + * docs/doxygen/doxygroups.cc: ...to here. + + 2001-12-28 Phil Edwards + + PR libstdc++/2054 + * include/bits/stl_algo.h (lower_bound): Relax concept checks. + * testsuite/ext/concept_checks.cc: New file. + + 2001-12-28 Paolo Carlini + + * include/bits/stl_algo.h (count returning void, + count_if returning void, __random_sample, random_sample, + random_sample_n, __is_heap, is_heap, is_sorted): Move to... + * include/ext/algorithm: ...here, new file. + * include/Makefile.am (ext_headers): Add new file. + * include/Makefile.in: Regenerate. + * testsuite/ext/headers.cc: Include . + + 2001-12-28 Paolo Carlini + Nathan Myers + + * include/bits/basic_string.h (insert(__pos, __s, __n)): + Optimize by avoiding temporaries and working in-place when possible. + (insert(__pos1, __str)): Call insert(__pos1, __str, __pos2, __n). + (insert(__pos1, __str, __pos2, __n)): Call insert(__pos, __s, __n). + * testsuite/21_strings/insert.cc (test02): New testcases. + + 2001-12-27 Phil Edwards + + * testsuite/testsuite_hooks.h (gnu_counting_struct): Add. + * testsuite/23_containers/deque_ctor.cc: New file. + + 2001-12-27 Paolo Carlini + + * include/bits/locale_facets.tcc (collate::do_transform): + Adjust implicit typename. + * config/locale/messages_members_generic.h (messages::open, + messages::do_open, messages::do_get): Adjust implicit typename. + * config/locale/messages_members_gnu.h (messages::open, + messages::do_open, messages::do_get): Adjust Implicit typename. + * config/locale/messages_members_ieee_1003.1-200x.h (messages::open, + messages::do_open, messages::do_get): Adjust implicit typename. + + 2001-12-27 Phil Edwards + + PR libstdc++/3829 + * src/misc-inst.cc: Many additional I/O-related instantiations. + * testsuite/27_io/instantiations.cc: New file. + + 2001-12-26 Benjamin Kosnik + + * testsuite/24_iterators/insert_iterator.cc (test02): Add. + * testsuite/24_iterators/front_insert_iterator.cc (test02): Add. + * testsuite/24_iterators/back_insert_iterator.cc (test02): Add. + * testsuite/24_iterators/reverse_iterator.cc (test02): Add. + + * include/bits/stl_iterator.h (reverse_iterator): Uglify member + current to _M_current. + (back_insert_iterator): Uglify member container to _M_container. + (front_insert_iterator): Same. + (insert_iterator): Same. + + 2001-12-25 Gabriel Dos Reis + + * include/bits/std_limits.h (__glibcpp_xxx_is_modulo): New + macros for signed types; default value is true. + (numeric_limits<>::is_modulo): Get value from corresponding + __glibcpp_xxx_is_modulo macro. + + 2001-12-23 Jeffrey A Law + + * config/os/hpux/bits/os_defines.h: Do not include <_sys/inttypes.h>. + Twiddle return types for strtoll and strtoull to avoid using + intmax_t and uintmax-t. + + 2001-12-22 Richard Henderson + + * configure.target (CPULIMITSH): Fix typo in alpha case. + + 2001-12-22 Jeffrey A Law + + * config/os/hpux/bits/os_defines.h: Update to avoid #defines + for strtoll and strtoull. + + 2001-12-21 Jeffrey A Law + + * config/os/hpux/bits/os_defines.h: Include + + * configure.target: Fix typo in hpux case. + + 2001-12-21 Paolo Carlini + + * include/ext/stl_rope.h (_Rope_iterator): + Add local typedef to fix implicit typename problems. + + 2001-12-19 Phil Edwards + + * docs/doxygen/Intro.3: New 'Allocators' module. + * docs/doxygen/TODO: Update. + * docs/doxygen/doxygroups.cc: Update. + * docs/doxygen/run_doxygen: Update. + + * include/bits/stl_alloc.h: Tweak doxygen hooks in comments. + * include/bits/std_memory.h: Doxygenate. + * include/bits/stl_iterator_base_types.h: Likewise. + * include/bits/stl_raw_storage_iter.h: Likewise. + * include/bits/stl_tempbuf.h: Likewise. + (get_temporary_buffer): Remove unused nonstandard overload. + * include/bits/stl_uninitialized.h: Likewise. + + * include/bits/stl_iterator_base_types.h (input_iterator, + output_iterator, forward_iterator, bidirectional_iterator, + random_access_iterator): Move old names... + * include/backward/iterator.h: ...to here. + * include/bits/stl_bvector.h: Update. + * include/ext/stl_rope.h: Update. + + 2001-12-19 Phil Edwards + + * docs/html/configopts.html: Describe recent options. + * docs/html/documentation.html: Point to new doxygen tarballs. + * docs/html/install.html: Brief updates. + * docs/html/17_intro/RELEASE-NOTES: Remove weird control character. + * docs/html/ext/howto.html: Fix typos, describe filebuf::fd(). + * docs/html/faq/index.html: Update for 3.0.95. + * docs/html/faq/index.txt: Regenerate. + + 2001-12-19 David Billinghurst + + libstdc++-v3/5148 + * testsuite/lib/libstdc++-v3-dg.exp: Append .exe to + executable filenames + + 2001-12-18 Benjamin Kosnik + + * docs/html/17_intro/TODO: Update. + * docs/html/17_intro/RELEASE-NOTES: Edits, update. + * README: Edit for clarity, update to reflect current directory + structure. + + 2001-12-18 Benjamin Kosnik + + * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Extended checking before + enabling gnu model. + * aclocal.m4: Rebuild. + * configure: Rebuild. + + 2001-12-18 Paolo Carlini + Nathan Myers + + * include/bits/basic_string.h (assign(__str, __pos, __n)): + Call assign(__s, __n). + (assign(__s, __n)): Terminate the string with _S_terminal. + + 2001-12-17 Benjamin Kosnik + + * include/bits/std_limits.h (__glibcpp_long_double_is_bounded): + Set to true, like float and double. + + 2001-12-17 David Billinghurst + + libstdc++/5136 + * testsuite/lib/prune.exp: New file + * testsuite/lib/libstdc++-v3-dg.exp: Use it + + 2001-12-17 Phil Edwards + + * include/bits/basic_file.h (__basic_file::fd): New function. + * config/io/basic_file_stdio.h (__basic_file::fd): Define. + * include/bits/std_fstream.h (basic_filebuf::fd): New function. + * include/bits/fstream.tcc (basic_filebuf::fd): Define. + * testsuite/27_io/filebuf_members.cc (test_02): New test. + + 2001-12-16 Nathan Sidwell + + * po/Makefile.am (.po.mo): Use POSIXLY_CORRECT argument ordering. + * po/Makefile.in: Regenerated. + + 2001-12-16 Paolo Carlini + + * testsuite/21_strings/assign.cc (test01): Add tests. + + 2001-12-15 Paolo Carlini + Nathan Myers + + * include/bits/basic_string.h + (assign(__str, __pos, __n), assign(__s, __n)): Optimize + by avoiding unnecessary temporaries. + (assign(__s)): Call assign(__s, __n). + * include/bits/basic_string.tcc (_M_replace_safe): Adjust comment. + * include/bits/std_string.h: include stl_function.h. + * testsuite/21_strings/assign.cc (test02, test03): New tests. + + 2001-12-15 Benjamin Kosnik + + * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Enable gnu locale model + on linux by default. + * aclocal.m4: Regenerate. + * configure: Regenerate. + + 2001-12-14 Benjamin Kosnik + + Clean up initialization and simplify caching of underlying "C" + default locale objects. + * src/localename.cc (locale::_Impl::_Impl(string, size_t): + Unconditionally create __clocale object for all named locales, + including "C" and "POSIX". + * config/locale/c_locale_generic.cc + (locale::facet::_S_create_c_locale): Always set __cloc to zero. + * config/locale/c_locale_gnu.cc: Always delete. + * include/bits/localefwd.h (locale::facet::_S_c_locale): New. + * src/locale.cc (locale::classic()): Initialize + locale::facet::_S_c_locale. + (locale::facet::_S_c_locale): Define. + + * include/bits/locale_facets.h: Add ctype_byname ctor + specialization. + * src/locale.cc: Add definition here. + * config/os/gnu-linux/bits/ctype_inline.h: Tweak. + * config/os/gnu-linux/bits/ctype_noninline.h: Adjust initializations. + * include/bits/locale_facets.h (ctype::_M_c_locale_ctype): Add. + Adjust ctors, dtors. + (ctype::_M_toupper): Remove const&. + (ctype::_M_tolower): Remove const&. + (ctype::_M_ctable): Remove const&. + + * include/bits/locale_facets.h (collate): Clean up initialization + of _M_c_locale_collate in ctors and dtors. + * config/locale/collate_members_gnu.cc: Always use extended + functions. + + * include/bits/locale_facets.h (messages): Clean up inits in ctor/dtor. + (messages_byname): Same. + * config/locale/messages_members_generic.h (messages::~messages): + Remove. + * config/locale/messages_members_gnu.h: Same. + + * include/bits/localefwd.h: Clean. Move dtor definitions to + * src/locale.cc: Here. + * testsuite/22_locale/facet.cc: Fix spelling. + + Named locale support for ctype. + * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add variable + ctype_members_* bits. + * aclocal.m4: Regenerate. + * configure: Regenerate. + * src/Makefile.am (sources): Add ctype.cc. + * src/Makefile.in: Regenerate. + * config/locale/ctype_members_generic.cc: New file. + * config/locale/ctype_members_gnu.cc: New file. + * src/locale.cc: Remove ctype definitions. + + 2001-12-13 Roger Sayle + + * acconfig.h: Test for __builtin_sqrt instead of + __builtin_fsqrt. + * acinclude.m4: Same. + * include/c_shadow/bits/std_cmath.h: Same. + * aclocal.m4: Regenerated. + * config.h.in: Regenerated. + * configure: Regenerated. + + 2001-12-13 Phil Edwards + + * docs/html/ext/howto.html: Fix typos. + + 2001-12-13 Benjamin Kosnik + + libstdc++/3679 + * src/locale.cc (locale::locale(const char*)): Deal with locales + named "". + * testsuite/22_locale/ctor_copy_dtor.cc (test01): Modify. + + 2001-12-12 Paolo Carlini + + * include/ext/ropeimpl.h (rope::_S_leaf_concat_char_iter, + _S_destr_leaf_concat_char_iter, _S_tree_concat, _S_concat_char_iter, + _S_destr_concat_char_iter, _S_concat, _S_substring, _S_balance) + : Adjust implicit typename. + * include/ext/stl_rope.h (_Rope_iterator::operator=, rope::npos): + Adjust implicit typename. + * testsuite/27_io/streambuf.cc: Adjust implicit typename. + + 2001-12-12 Benjamin Kosnik + + Named locale support for ctype. + * config/locale/c_locale_gnu.h (_GLIBCPP_C_LOCALE_GNU): New. + * config/os/gnu-linux/bits/ctype_noninline.h (ctype): Add + definitions for alternate constructor. + * config/os/solaris/solaris2.7/bits/ctype_noninline.h (ctype): Same. + * config/os/solaris/solaris2.6/bits/ctype_noninline.h (ctype): Same. + * config/os/solaris/solaris2.5/bits/ctype_noninline.h (ctype): Same. + * config/os/newlib/bits/ctype_noninline.h (ctype): Same. + * config/os/irix/irix6.5/bits/ctype_noninline.h (ctype): Same. + * config/os/irix/irix5.2/bits/ctype_noninline.h (ctype): Same. + * config/os/hpux/bits/ctype_noninline.h (ctype): Same. + * config/os/generic/bits/ctype_noninline.h (ctype): Same. + * config/os/djgpp/bits/ctype_noninline.h (ctype): Same. + * config/os/bsd/netbsd/bits/ctype_noninline.h (ctype): Same. + * config/os/bsd/freebsd/bits/ctype_noninline.h (ctype): Same. + * config/os/aix/bits/ctype_noninline.h (ctype): Same. + * include/bits/locale_facets.h (ctype<_CharT>): Remove dummy + definitions for all virtual functions. These are now explicitly + undefined for non-required factets, ie any non-char, non-wchar_t + instantiations. + * src/localename.cc (locale::_Impl::_Impl(string, size_t): Named + locales use alternate constructor for ctype facet. + * include/bits/locale_facets.h (ctype::ctype(__c_locale, const + mask*, bool, size_t): Add. + (ctype::ctype(__c_locale, size_t): Add. + * src/locale.cc (ctype::ctype(__c_locale, size_t)): Add + definition. + + * testsuite/22_locale/ctype_members_char.cc (test02): Add, mark + XFAIL for non-gnu locale models. + + 2001-12-12 Philip Martin + Ross Smith + Paolo Carlini + + libstdc++/5045 + * include/bits/std_limits.h (defines, numeric_limits::digits10): + Fix digits10 values for integral types. + * include/bits/locale_facets.tcc (num_get::do_get for integral types): + Tweak _M_extract_int call. + * testsuite/27_io/istream_extractor_arith.cc (test13, test12_aux): + Tweak overflowing number of digits. + * testsuite/18_support/numeric_limits.cc (test03): New testcase. + + 2001-12-11 Benjamin Kosnik + + * config/os/generic/bits/ctype_inline.h: Remove spaces. + * config/os/gnu-linux/bits/ctype_noninline.h: Same. + * include/bits/locale_facets.h (__num_base): Move double data + members to first in class. + * include/bits/locale_facets.tcc: Re-arrange, tweak. + * src/locale.cc: Clean. + *include/bits/stl_vector.h: Space typedefs. + + 2001-12-11 Phil Edwards + + * testsuite/ext/allocators.cc: New file. + + 2001-12-11 Jason Merrill + + * include/bits/locale_facets.tcc (_M_extract_int): Avoid + uninitialized warning. + + 2001-12-11 Loren Rittle + + * config/cpu/sparc/sparc32/bits/atomicity.h + (__Atomicity_lock<0>::_S_atomicity_lock): Add. + + 2001-12-10 Paolo Carlini + + * include/bits/basic_string.tcc (_M_replace_safe): Fix typos. + * include/bits/basic_string.h: Fix typos. + + 2001-12-10 Paolo Carlini + Nathan Myers + + * include/bits/basic_string.tcc (_M_replace_safe): New function. + (_M_replace(input_iterator_tag), append members): Use it. + (_M_replace(forward_iterator_tag)): Remove. + * include/bits/basic_string.h: Adjust declarations. + * src/string-inst.cc: Adjust declarations. + + 2001-12-09 Benjamin Kosnik + Philip Martin + + * include/bits/locale_facets.h (__num_base::_S_scale_hex): Add. + (__num_base::_S_scale_oct): Add. + * include/bits/locale_facets.tcc (_M_extract_int): Use them. + * src/locale.cc: Add definitions. + * testsuite/27_io/istream_extractor_arith.cc (main): Call test13. + + * testsuite/testsuite_hooks.h: Remove duplicate VERIFY define. + + 2001-12-07 Nathan Myers + Loren Rittle + + libstdc++/5037 + * config/cpu/sparc/sparc32/bits/atomicity.h + (struct __Atomicity_lock<__inst>): Add. + (__Atomicity_lock<__inst>::_S_atomicity_lock): Add. + (__exchange_and_add): Use __Atomicity_lock<0>::_S_atomicity_lock + instead of lock local to static function. + (__atomic_add): Likewise. + + 2001-12-07 Phil Edwards + + * src/globals.cc: Remove __GTHREADS guard. + + 2001-12-07 Paolo Carlini + + * include/bits/locale_facets.tcc (num_put::_M_convert_float): + Extend comment, reduce __cs_size for non-fixed outputs. + + 2001-12-07 Paolo Carlini + + * include/bits/basic_string.tcc (_M_mutate): Fix typo + in the previous check in. + + 2001-12-06 Paolo Carlini + Loren J. Rittle + + * include/bits/basic_string.tcc (_M_mutate, _M_clone): Implement + exponential growth policy to meet linear amortized time + requirements of the standard. + (_S_create): Adjust comment. + + 2001-12-06 Benjamin Kosnik + + libstdc++/3720 + * include/bits/locale_facets.tcc (num_put): Clean. + (num_get::_M_extract_float): Change argument to string. + (num_get::do_get(float)): Fixup. + (num_get::do_get(double)): Same. + (num_get::do_get(long double)): Same. + (num_get::_M_extract_int): Add maximum length parameter, __max. + (num_get::_M_extract_float): Correct zeros, use string. + * include/bits/locale_facets.h (num_get::_M_extract_float): Change + declaration here. + * src/locale.cc (__num_base::_S_atoms): Remove x, X. + * testsuite/27_io/istream_extractor_arith.cc (test13): Add. + + 2001-12-06 Philip Martin + + * testsuite/27_io/istream_extractor_arith.cc (test12): Add + tests for excess input digits. + + 2001-12-06 Phil Edwards + + * include/bits/std_bitset.h: Use GLIBCPP in multiple-inclusion guard. + * include/bits/stl_algo.h: Likewise. + * include/bits/stl_algobase.h: Likewise. + * include/bits/stl_bvector.h: Likewise. + * include/bits/stl_deque.h: Likewise. + * include/bits/stl_function.h: Likewise. + * include/bits/stl_iterator.h: Likewise. + * include/bits/stl_iterator_base_funcs.h: Likewise. + * include/bits/stl_iterator_base_types.h: Likewise. + * include/bits/stl_list.h: Likewise. + * include/bits/stl_multimap.h: Likewise. + * include/bits/stl_multiset.h: Likewise. + * include/bits/stl_pair.h: Likewise. + * include/bits/stl_queue.h: Likewise. + * include/bits/stl_set.h: Likewise. + * include/bits/stl_stack.h: Likewise. + * include/bits/stl_tempbuf.h: Likewise. + * include/bits/stl_tree.h: Likewise. + * include/bits/stl_vector.h: Likewise. + + * include/bits/stl_alloc.h: Use our own multiple inclusion guards. + Doxygenate more comments. Correct historical artifacts in comments. + (alloc, single_alloc): Uglify non-standard names. + (__default_alloc_template::_NFREELISTS): Calculate from other + parameters. + (__default_alloc_template::_S_free_list): Remove SunPro workaround. + (__default_alloc_template::_Lock): Mark as "unused". + * include/backward/alloc.h: Update. + * include/bits/stl_bvector.h: Likewise. + * include/ext/ropeimpl.h: Likewise. + * include/ext/stl_hashtable.h: Likewise. + + 2001-12-05 Benjamin Kosnik + + DR/282 + * include/bits/locale_facets.tcc (num_put::_M_widen_float): Add + grouping to floating point types. + * testsuite/27_io/ostream_inserter_arith.cc (test02): Add test. + + 2001-12-04 Paolo Carlini + + libstdc++/4402 + * testsuite/27_io/ostream_inserter_arith.cc (test02): Add testcase + from the PR. + * include/bits/locale_facets.tcc (num_put::_M_convert_float): + Deal properly with long ios_base::fixed floats. + (num_put::_M_widen_float): use + __len in __builtin_alloca call. + + 2001-12-04 Benjamin Kosnik + + * src/Makefile.am (sources): Add ext-inst.cc. + * src/Makefile.in: Regenerate. + * src/ext-inst.cc: New file. + * include/bits/stl_threads.h: Format. + * src/globals.cc: Add instantiation for _S_swap_lock. + + * testsuite/18_support/numeric_limits.cc: Add numeric_limits + instantiation. + + 2001-12-04 John David Anglin + + * testsuite/22_locale/numpunct_members_wchar_t.cc: Only compile + and execute test01 if _GLIBCPP_USE_WCHAR_T is defined. + * testsuite/26_numerics/complex_inserters_extractors.cc: Provide + for explicit instantiation of class std::basic_string >. + + 2001-12-03 Benjamin Kosnik + + * testsuite/22_locale/collate.cc: Compile-only. + * testsuite/22_locale/time_get.cc: Same. + * testsuite/22_locale/time_put.cc: Same. + * testsuite/22_locale/numpunct.cc: Same. + * testsuite/22_locale/num_put.cc: Same. + * testsuite/22_locale/num_get.cc: Same. + * testsuite/22_locale/moneypunct.cc: Same. + * testsuite/22_locale/money_get.cc: Same. + * testsuite/22_locale/messages.cc: Same. + * testsuite/22_locale/ctype.cc: Same. + + 2001-12-03 Benjamin Kosnik + + * src/string-inst.cc (string::_Rep::_S_terminal): Add static data + member instantiations. + + 2001-12-03 Steve Ellcey + + * libstdc++-v3/configure.in: Add support for hpux cross compiles, + combine common linux/hpux/generic cross compile support to reduce + redundent lines. + * libstdc++-v3/configure: Regenerate. + + 2001-12-03 Loren J. Rittle + + * docs/html/ext/howto.html: Update commentary. + * include/bits/c++config: Update threading configuration comment. + (__STL_GTHREADS): Remove macro definition. + (__STL_THREADS): Likewise. + * include/bits/stl_threads.h: Leave only the configuration + path which had been guarded by __STL_GTHREADS. Remove all + guards related to __STL_GTHREADS, __STL_SGI_THREADS, + __STL_PTHREADS, __STL_UITHREADS and __STL_WIN32THREADS. + * include/bits/stl_alloc.h: Leave only the configuration path + which had been guarded by __STL_THREADS. Remove configuration + path and guards for __STL_SGI_THREADS. + (__NODE_ALLOCATOR_THREADS): Remove macro definition. Unroll its use. + (__NODE_ALLOCATOR_LOCK): Likewise. + (__NODE_ALLOCATOR_UNLOCK): Likewise. + (_NOTHREADS): Remove guards related to macro. + * include/ext/stl_rope.h: Remove configuration path and guards + for __STL_SGI_THREADS. + * src/stl-inst.cc: Remove use of __NODE_ALLOCATOR_THREADS. + + 2001-12-02 Phil Edwards + + * docs/html/ext/howto.html: Update list of implemented DRs. + * docs/html/ext/lwg-active.html: Import R20 from upstream. + * docs/html/ext/lwg-defects.html: Import R20 from upstream. + + 2001-11-30 Benjamin Kosnik + + libstdc++/3150 + DR/266 + * libsupc++/exception (bad_exception::~bad_exception()): Remove + declaration. + * libsupc++/new (bad_alloc::~bad_alloc()): Remove. + * libsupc++/typeinfo (bad_cast::~bad_cast()): Remove. + (bad_typeid::~bad_typeid()): Remove. + * libsupc++/tinfo.cc (bad_cast::~bad_cast()): Remove definition. + (bad_typeid::~bad_typeid()): Same. + * libsupc++/new_handler.cc (bad_alloc::~bad_alloc()): Same. + * libsupc++/eh_exception.cc (bad_exception::~bad_exception()): Same. + + * include/bits/std_iomanip.h: Tweak. + + 2001-11-29 Paolo Carlini + + libstdc++/3655 + * include/bits/locale_facets.tcc (__pad): Add bool parameter to + correctly pad internal-adjusted const char*-type objects. + * include/bits/locale_facts.tcc (num_put::_M_insert): Update call. + * include/bits/ostream.tcc (operator<<(_CharT , char, const + _CharT*, const char*, const basic_string&): Update calls. + * src/locale-inst.tcc: Update declarations. + * testsuite/27_io/ostream_inserter_arith.cc (test04): Add test. + + 2001-11-29 Phil Edwards + + * docs/html/ext/howto.html: Finish allocator notes (inst and 3.0). + + 2001-11-29 Benjamin Kosnik + + * include/bits/locale_facets.tcc (num_get::do_get(long double)): + Fix __traits_type typo. + + 2001-11-28 Paolo Carlini + + * include/bits/locale_facets.tcc (__pad): Correctly pad + internal-adjusted hex numbers. + * testsuite/27_io/ostream_inserter_arith.cc: Add testcase. + + 2001-11-28 Paolo Carlini + Loren J. Rittle + + * include/bits/basic_string.h + (basic_string::_Rep::__default_excess, _S_excess_slop): + Unused, remove. + * include/bits/basic_string.tcc: Remove dead code. + * include/bits/c++config: Remove comment. + + 2001-11-28 Benjamin Kosnik + Jakub Jelinek + + * config/locale/moneypunct_members_gnu.cc + (moneypunct::_M_initialize_moneypunct): Correctly cast + for ia64, others. + * config/locale/numpunct_members_gnu.cc + (numpunct::_M_initialize_numpunct): Same. + + 2001-11-27 Benjamin Kosnik + + * include/bits/locale_facets.tcc: Formatting tweaks. + + * testsuite/23_containers/map_operators.cc: Don't xfail. + * testsuite/23_containers/set_operators.cc: Same. + * testsuite/backward/header_iterator_h.cc: Pass in -Wno-deprecated. + * testsuite/backward/header_deque_h.cc: Same. + + 2001-11-27 Loren J. Rittle + Paolo Carlini + + * include/bits/basic_string.tcc (basic_string::_Rep::_S_create): + Enforce allocation size blocking policy to reduce + fragmentation and enhance performance with common malloc + implementations. + + 2001-11-27 Benjamin Kosnik + + Numeric facets cleanup. + * include/bits/locale_facets.h (__num_base::_S_atoms): Add, remove + + and - signs. + (__num_base::_M_zero): Add + (__num_base::_M_e): Add. + (__num_base::_M_E): Add. + * include/bits/locale_facets.tcc (num_get::_M_extract): Remove. + (num_get::_M_extract_float): New. + (num_get::_M_extract_int): New. + * src/locale.cc (num_get::_M_extract): Remove. + + * include/bits/locale_facets.tcc (num_put::_M_insert_float): + Simplify, use _M_insert. + (num_put::do_put(bool)): Simplify, remove __pad. + (__pad): Remove. + (__pad_output): Change to __pad. + * include/bits/ostream.tcc: And here. + * src/locale-inst: Remove instantiations. + + * include/bits/locale_facets.h: Move helper functions in to class + num_put. + (num_put::_M_insert_float): Same, for __output_integer. + (num_put::_M_insert_int): Same, for __output_float. + (num_put::_M_insert): New. + (__num_base): Add. + (__num_base::_S_format_float): Move + __build_float_format into class __num_base. + (__num_base::_S_format_int): Move __build_int_format into class + __num_base. + * include/bits/locale_facets.tcc (__group_digits): Change to + (__add_grouping): This. + * src/locale-inst.cc: And here. Tweak instantiations. + * src/misc-inst.cc: Remove instantiations. + + * include/bits/ostream.tcc (__pad_char): Rename, adjust inserters + for new calling conventions, move to... + * include/bits/locale_facets.tcc (__pad_output): Here. Adjust + signature to make it useful for both ostream and num_put. + (__pad_numeric): Remove. + * src/misc-inst.cc: Remove instantiations. + * src/locale-inst.cc: Same. + + * include/bits/locale_facets.h (_Numeric_get): Remove. + (_Numeric_put): Remove. + (num_get::get(short)): Remove. + (num_get::get(int)): Remove. + (num_get::do_get(short)): Remove. + (num_get::do_get(int)): Remove. + * include/bits/istream.tcc (istream::operator>>(short)): Fix as + per DR 118. + (istream::operator>>(int)): Same. + + * include/bits/locale_facets.h (_Format_cache): Remove. + * include/bits/locale_facets.tcc: Same. + * src/locale.cc: Same. + * src/locale-inst.cc: Same. + * include/bits/ostream.tcc: Same. + * src/ios.cc (ios_base::imbue): Remove here as well. + + * testsuite/22_locale/num_get.cc: New file. + * testsuite/22_locale/num_get_members_char.cc: New file. + * testsuite/22_locale/num_get_members_wchar_t.cc: New. + * testsuite/22_locale/numpunct_members_wchar_t.cc: New file. + * testsuite/22_locale/num_put.cc: New file. + * testsuite/22_locale/num_put_members_char.cc: New file. + * testsuite/22_locale/num_put_members_wchar_t.cc: New file. + * testsuite/27_io/ostream_inserter_arith.cc: Fix. + * testsuite/27_io/istream_extractor_arith.cc: Fix. + + 2001-11-27 Phil Edwards + + * docs/html/explanations.html: New section, empty for now. + * docs/html/17_intro/howto.html: Cleanup. Move unrelated link... + * docs/html/23_containers/howto.html: ...to here. Break up and + rewrap threading discussion to emphasize warning. Move malloc text... + * docs/html/ext/howto.html: ...to here. New section. Describe + allocators and __USE_MALLOC effects. + * docs/html/ext/sgiexts.html: Mention their code. + + 2001-11-24 Joseph S. Myers + + * docs/doxygen/maint.cfg.in, docs/doxygen/user.cfg.in, + docs/html/27_io/binary_iostreams_kuehl.txt: Revert previous + changes. + + 2001-11-23 Phil Edwards + + * Makefile.am (doxygen-maint): The script isn't executable in CVS. + * Makefile.in: Regenerated. + * docs/doxygen/TODO: New file listing doxygen work to be done. + * docs/doxygen/run_doxygen: Fix up man pages. + * docs/doxygen/user.cfg.in: Insert maint-only toggles. + * docs/doxygen/maint.cfg.in: Copy from user.cfg and turn toggles on. + * include/bits/stl_construct.h: Use new hooks for internal functions. + + * docs/html/17_intro/TODO: Small updates. + * docs/html/faq/index.html: Likewise. + * docs/html/faq/index.txt: Regenerated. + + * include/bits/stl_alloc.h: Doxygenate, reindent comments, remove + SGI-isms and wrappers. + (simple_alloc, debug_alloc): Uglify class names. + (__default_alloc_template): Uglify "threads" template parameter and + update corresponding macros. + * include/backward/alloc.h: Bring up to date. + + 2001-11-23 Jason Merrill + + * src/vterminate.cc (__verbose_terminate_handler): Add leading + underscores. + + 2001-11-23 Joseph S. Myers + + * ChangeLog, docs/doxygen/maint.cfg.in, docs/doxygen/user.cfg.in, + docs/doxygen/doxygroups.cc, docs/doxygen/Intro.3, + docs/html/17_intro/BUGS, docs/html/17_intro/C++STYLE, + docs/html/17_intro/CHECKLIST, docs/html/17_intro/DESIGN, + docs/html/17_intro/howto.html, docs/html/17_intro/porting.html, + docs/html/17_intro/porting.texi, docs/html/18_support/howto.html, + docs/html/19_diagnostics/howto.html, docs/html/20_util/howto.html, + docs/html/21_strings/howto.html, + docs/html/23_containers/howto.html, + docs/html/26_numerics/howto.html, docs/html/27_io/howto.html, + docs/html/27_io/binary_iostreams_kuehl.txt, + docs/html/ext/sgiexts.html, docs/html/faq/index.html, + docs/html/faq/index.txt, testsuite/24_iterators/iterator.cc, + include/bits/basic_file.h, include/bits/locale_facets.h, + include/bits/locale_facets.tcc, include/bits/std_sstream.h, + include/ext/ropeimpl.h, include/ext/stl_rope.h, + libsupc++/tinfo.cc, libsupc++/cxxabi.h, libsupc++/typeinfo, + libsupc++/eh_throw.cc, acinclude.m4, aclocal.m4, configure, + configure.target, ChangeLog-2000: Fix spelling errors. + + * config/locale/moneypunct_members_gnu.cc, + include/bits/locale_facets.h: Fix spelling errors. + + 2001-11-22 Stephen M. Webb + + * testsuite/23_containers/list_capacity.cc: New file. + * testsuite/23_containers/list_ctor.cc: New file. + * testsuite/23_containers/list_modifiers.cc: New file. + * testsuite/23_containers/list_operators.cc: New file. + + 2001-11-22 Stephen M. Webb + + * include/bits/stl_list.h: Reformatted according to C++STYLE rules. + (size): Replaced nonstandard distance() call with the standard one. + (transfer): Uglified to _M_transfer. + + 2001-11-21 Paolo Carlini + + PR libstdc++/4548 + * include/bits/basic_string.tcc (basic_string::reserve): Never shrink + below the current size. + * testsuite/21_strings/capacity.cc (test02): Add test. + + 2001-11-19 Phil Edwards + + * docs/doxygen/Intro.3: More notes. + * docs/doxygen/style.css: Update to default style from Doxygen 1.2.10. + * include/bits/stl_algobase.h: Add doxygen hooks for functions. + * include/ext/hash_map: Add @file hook. + * include/ext/hash_set: Likewise. + * include/ext/rope: Likewise. + * include/ext/ropeimpl.h: Likewise. + * include/ext/slist: Likewise. + * include/ext/stl_hash_fun.h: Likewise. + * include/ext/stl_hashtable.h: Likewise. + * include/ext/stl_rope.h: Likewise. + + * docs/html/17_intro/license.html: Remove "experimental" sentence. + * docs/html/19_diagnostics/howto.html: Document new verbose + terminate handler. + * testsuite/27_io/filebuf.cc: Fix comment, move tweakable parameter + to more visible (closer to description) position. + + * libsupc++/eh_type.cc: Formatting tweak. + * libsupc++/exception: Likewise. + * src/vterminate.cc: Likewise. + + * docs/html/17_intro/porting.html: Regenerate. + * docs/html/faq/index.txt: Regenerate. + + 2001-11-18 Jason Merrill + + * libsupc++/eh_personality.cc (__cxa_call_unexpected): Take void*. + * libsupc++/eh_catch.cc (__cxa_begin_catch): Likewise. + * libsupc++/unwind-cxx.h: Adjust. + * src/Makefile.am (strstream.o): Pass -Wno-deprecated. + + * libsupc++/eh_type.cc (__cxa_current_exception_type): New file. + * libsupc++/cxxabi.h: Declare it. + * libsupc++/Makefile.am (sources): Add it. + * src/vterminate.cc (verbose_terminate_handler): New file. + * libsupc++/exception: Declare it. + * src/Makefile.am (sources): Add it. + + * src/Makefile.am (VPATH): Check the src directory before the top one. + + 2001-11-16 Paolo Carlini + + * include/bits/stl_deque.h (deque::erase()): Fix memory leak. + + 2001-11-16 Loren J. Rittle + + * docs/html/17_intro/howto.html (Thread-safety): Rename + section to ``The Standard C++ library and multithreading'' and + update information based on recent mailing list traffic. Move + all discussion of __USE_MALLOC to... + * docs/html/23_containers/howto.html (Containers and multithreading): + ...here and rework it based on recent mailing list traffic. + + 2001-11-15 Loren J. Rittle + + * docs/html/faq/index.html (Is libstdc++-v3 thread-safe?): Clarify + wording. + + 2001-11-15 + Loren J. Rittle + + libstc++/4219 + * include/bits/stl_alloc.h (alloc): Update to use __mem_interface. + (single_client_alloc): Likewise. + + 2001-11-08 Danny Smith + + * configure.target: Add os_include_dir for mingw32* target. + * docs/html/17_intro/porting.texi: Mention mingw32 as target benefiting + from _GLIBCPP_AVOID_FSEEK. + * config/os/mingw32/bits/ctype_base.h: New file. + * config/os/mingw32/bits/ctype_inline.h: New file. + * config/os/mingw32/bits/ctype_noninline.h: New file. + * config/os/mingw32/bits/os_defines.h: New file. + + 2001-11-07 Nathan Myers + + * docs/html/faq/index.html (5.8): New entry on ABIs. + * docs/html/faq/index.txt: Regenerate. + + 2001-11-07 Phil Edwards + + * docs/html/faq/index.html: Explain libsupc++, mention 'long long' + bugfixes on Solaris. + * docs/html/faq/index.txt: Regenerate. + + 2001-11-06 Phil Edwards + + * acinclude.m4 (GLIBCPP_ENABLE_LONG_LONG): Run the test in + LANG_CPLUSPLUS mode. + * aclocal.m4: Regenerate. + * configure: Regenerate. + + 2001-11-05 Phil Edwards + + * porting.texi: Move... + * docs/html/17_intro/porting.texi: ...to here. + * docs/html/Makefile: Add rule to rebuild... + * docs/html/17_intro/porting.html: ...this. New file. + + 2001-11-05 Felix Natter + + * docs/html/17_intro/porting-howto.xml: check in v0.9.4 + * docs/html/17_intro/porting-howto.html: regenerate + + 2001-11-02 Loren J. Rittle + + * include/bits/stl_threads.h (_Atomic_swap): Only enable path + when platform supports __GTHREAD_MUTEX_INIT. + + 2001-11-02 Phil Edwards + + * acconfig.h: Update comments. + * acinclude.m4 (GLIBCPP_ENABLE_C99): Move strtoll, strtoull tests... + (GLIBCPP_ENABLE_LONG_LONG): ...to here. Don't check enable_c99. + * aclocal.m4: Regenerate. + * config.h.in: Regenerate. + * configure: Regenerate. + + * include/bits/boost_concept_check.h: Unconditionally compile uses + of 'long long' which require only compiler support, not C lib support. + * include/bits/cpp_type_traits.h: Likewise. + * include/bits/std_limits.h: Likewise. + * include/bits/type_traits.h: Likewise. + * src/concept-inst.cc: Likewise. + * src/limits.cc: Likewise. + * include/c_shadow/stdlib.h: Compile conditionally on _GLIBCPP_USE_C99 + instead of _GLIBCPP_USE_LONG_LONG. + * include/c_shadow/bits/std_cstdlib.h: Likewise. + + 2001-11-02 Phil Edwards + + * config/io/c_io_stdio.h: Correct grammar in comments. + * docs/doxygen/Intro.3: Expand "top-level" man page. + * docs/doxygen/doxygroups.cc: New module definitions (comments). + * docs/doxygen/mainpage.doxy: Tweaks. + * docs/doxygen/run_doxygen: Update Doxygen version, massage man pages. + + Add @file hooks so that headers are considered to be documented. + * include/bits/basic_ios.h, include/bits/basic_file.h, + include/bits/basic_string.h, include/bits/boost_concept_check.h, + include/bits/char_traits.h, include/bits/codecvt.h, + include/bits/concept_check.h, include/bits/cpp_type_traits.h, + include/bits/fpos.h, include/bits/gslice.h, include/bits/gslice_array.h, + include/bits/indirect_array.h, include/bits/ios_base.h, + include/bits/locale_facets.h, include/bits/localefwd.h, + include/bits/mask_array.h, include/bits/pthread_allocimpl.h, + include/bits/slice.h, include/bits/slice_array.h, + include/bits/std_algorithm.h, include/bits/std_bitset.h, + include/bits/std_complex.h, include/bits/std_deque.h, + include/bits/std_fstream.h, include/bits/std_functional.h, + include/bits/std_iomanip.h, include/bits/std_ios.h, + include/bits/std_iosfwd.h, include/bits/std_iostream.h, + include/bits/std_istream.h, include/bits/std_iterator.h, + include/bits/std_limits.h, include/bits/std_list.h, + include/bits/std_locale.h, include/bits/std_map.h, + include/bits/std_memory.h, include/bits/std_numeric.h, + include/bits/std_ostream.h, include/bits/std_queue.h, + include/bits/std_set.h, include/bits/std_sstream.h, + include/bits/std_stack.h, include/bits/std_streambuf.h, + include/bits/std_string.h, include/bits/std_utility.h, + include/bits/std_valarray.h, include/bits/std_vector.h, + include/bits/stl_algo.h, include/bits/stl_alloc.h, + include/bits/stl_bvector.h, include/bits/stl_construct.h, + include/bits/stl_deque.h, include/bits/stl_heap.h, + include/bits/stl_iterator.h, include/bits/stl_iterator_base_funcs.h, + include/bits/stl_iterator_base_types.h, include/bits/stl_list.h, + include/bits/stl_map.h, include/bits/stl_multimap.h, + include/bits/stl_multiset.h, include/bits/stl_numeric.h, + include/bits/stl_pair.h, include/bits/stl_pthread_alloc.h, + include/bits/stl_queue.h, include/bits/stl_raw_storage_iter.h, + include/bits/stl_relops.h, include/bits/stl_set.h, + include/bits/stl_stack.h, include/bits/stl_tempbuf.h, + include/bits/stl_threads.h, include/bits/stl_tree.h, + include/bits/stl_uninitialized.h, include/bits/stl_vector.h, + include/bits/stream_iterator.h, include/bits/streambuf_iterator.h, + include/bits/stringfwd.h, include/bits/type_traits.h, + include/bits/valarray_array.h, include/bits/valarray_meta.h: + Add hooks, tweak comments only. + + * include/bits/stl_algobase.h (swap, min, iter_swap): Also + document these functions. + * include/bits/stl_function.h: Tweak link comments. + + 2001-11-01 Paolo Carlini + Benjamin Kosnik + + * testsuite/27_io/ios_manip_fmtflags.cc: Fix for non-interactive + output. + * include/bits/locale_facets.tcc (num_put::do_put(bool)): Fix. + + 2001-11-01 Egor Duda + + * config/os/newlib/bits/ctype_noninline.h + (ctype::do_toupper(char __c)): Check for proper character class. + (ctype::do_tolower(char __c)): Ditto. + + 2001-11-01 Phil Edwards + + * acinclude.m4: Fix spacing. + (GLIBCPP_ENABLE_CONCEPT_CHECKS): New macro. + * configure.in: Call here. + * acconfig.h: Add _GLIBCPP_CONCEPT_CHECKS. + * include/bits/boost_concept_check.h: Fix headers. + (__function_requires): Make inline. + * include/bits/c++config (_GLIBCPP_CONCEPT_CHECKS): Remove. + * aclocal.m4: Regenerate. + * config.h.in: Regenerate. + * configure: Regenerate. + + Move trailing ';' inside macro, PR libstdc++/3666. + * include/bits/concept_check.h: Add semicolon. + * include/bits/stl_algo.h: Remove semicolon. + * include/bits/stl_algobase.h: Likewise. + * include/bits/stl_deque.h: Likewise. + * include/bits/stl_heap.h: Likewise. + * include/bits/stl_iterator_base_funcs.h: Likewise. + * include/bits/stl_list.h: Likewise. + * include/bits/stl_map.h: Likewise. + * include/bits/stl_multimap.h: Likewise. + * include/bits/stl_multiset.h: Likewise. + * include/bits/stl_numeric.h: Likewise. + * include/bits/stl_queue.h: Likewise. + * include/bits/stl_set.h: Likewise. + * include/bits/stl_stack.h: Likewise. + * include/bits/stl_vector.h: Likewise. + * include/ext/hash_map: Likewise. + * include/ext/hash_set: Likewise. + * include/ext/slist: Likewise. + + * src/concept-inst.cc: New file with explicit instantiations. + * src/Makefile.am (sources): Add here, with special build rules. + * src/Makefile.in: Regenerate. + + 2001-11-01 Gabriel Dos Reis + + * include/bits/std_complex.h (_Norm_helper): New class template. + (norm): Tweak. + (abs): Tweak. Fix Thinko. + + 2001-10-31 Benjamin Kosnik + + libstdc++/4749 + * include/bits/codecvt.h: Add virtual member function declarations. + * src/codecvt.cc: Tweaks. + * testsuite/22_locale/codecvt.cc: Test compilation only, + non-required facets not required to have linkage. + + 2001-10-31 Edward E. Meyer + + libstdc++/4622 + * include/bits/std_complex.h (complex::operator/=): Correct sign. + + 2001-10-30 Paolo Carlini + Benjamin Kosnik + + libstdc++/4354 + * include/bits/basic_string.h: Tweaks. + * include/bits/basic_string.tcc (string::_M_replace(iterator, + iterator, _ForwardIter, _ForwardIter, forward_iterator_tag): Fix. + * src/string-inst.cc: Tweaks, add instantiation. + * testsuite/21_strings/replace.cc (test02): Add test. + * testsuite/21_strings/assign.cc (test01): New file. + + 2001-10-30 Jakub Jelinek + + * include/bits/stl_deque.h (_M_new_elements_at_front): Use + __throw_exception_again. + (_M_new_elements_at_back): Likewise. + + 2001-10-29 Benjamin Kosnik + + libstdc++/3647 + * include/bits/fstream.tcc (filebuf::showmanyc): Simplify. + * testsuite/27_io/filebuf.cc (test07): New test. + (test03): Modify showmanyc test. + + 2001-10-26 Benjamin Kosnik + + libstdc++/4503 + * config/locale/codecvt_specializations_ieee_1003.1-200x.h + (__enc_traits::~__enc_traits): Fix. + (__enc_traits::_M_init): Add error checking. + + 2001-10-25 Benjamin Kosnik + + libstdc++/4542 + * include/bits/locale_facets.tcc (time_get::_M_extract_name): Fix. + + 2001-10-25 Benjamin Kosnik + + libstdc++/4545 + * include/bits/ostream.tcc (ostream::operator<<(streambuf*)): Fix + exceptions. + * include/bits/istream.tcc (istream::operator>>(streambuf*): Make + consistent, where possible. + * include/bits/streambuf.tcc: Tweak. + + 2001-10-25 Brendan Kehoe + + libstdc++/4536 + * bits/ostream.tcc (seekp): Scope use as ios_base::failbit. + * bits/istream.tcc (seekg): Likewise. + + 2001-10-25 Benjamin Kosnik + Peter Schmid + Ulrich Weigand + + * config/os/gnu-linux/bits/os_defines.h: Set to 64 bit longs with + __s390x__ only. + * include/bits/std_limits.h: Fix wchar_t issues. + * config/os/aix/bits/os_defines.h: Fix. + + 2001-10-25 Benjamin Kosnik + + * include/bits/locale_facets.tcc (collate::do_transform): Fix. + + 2001-10-25 Phil Edwards + + * docs/html/documentation.html: Fix typo. + + 2001-10-23 Benjamin Kosnik + + Make -fno-exceptions work. + * config/locale/c_locale_gnu.cc: Use functexcept. + * include/bits/c++config (__stl_assert): Remove. + (__STL_USE_EXCEPTIONS): Same. + (__STL_TRY): Same. + (__STL_CATCH_ALL): Same. + (__STL_THROW): Same. + (__STL_RETHROW): Same. + (__STL_NOTHROW): Same. + (__STL_UNWIND): Same. + * include/bits/pthread_allocimpl.h: Fix. + * include/bits/std_bitset.h: Same. + * include/bits/std_list.h: Same. + * include/bits/std_memory.h: Same. + * include/bits/std_queue.h: Same. + * include/bits/stl_alloc.h: Same. + * include/bits/stl_deque.h: Same. + * include/bits/stl_list.h: Same. + * include/bits/stl_queue.h: Same. + * include/bits/stl_tempbuf.h: Same. + * include/bits/stl_tree.h: Same. + * include/bits/stl_uninitialized.h: Same. + * include/bits/stl_vector.h: Same. + * include/ext/ropeimpl.h: Same. + * include/ext/slist: Same. + * include/ext/stl_hashtable.h: Same. + * include/ext/stl_rope.h: Same. + * libsupc++/new_op.cc: Include cstdlib. + * libsupc++/eh_personality.cc: Add exception_defines include. Use + __throw_exception_again, tweak. + * libsupc++/eh_aux_runtime.cc: Include stdlib for abort. + * libsupc++/vec.cc: Tweak. + * src/functexcept.cc: Remove unused arguments. + * testsuite/23_containers/bitset_members.cc: Tweak. + + 2001-10-22 Benjamin Kosnik + + * config/cpu/i386/bits/limits.h: Move to... + * config/cpu/i386/bits/cpu_limits.h: ...here. + * config/cpu/cris/bits/cpu_limits.h: Same. + * config/cpu/powerpc/bits/cpu_limits.h: Same. + * config/cpu/x86-64/bits/cpu_limits.h: Same. + * config/cpu/alpha/bits/cpu_limits.h: New. + * config/cpu/m68k/bits/cpu_limits.h: New. + * config/cpu/s390/bits/cpu_limits.h: New. + * config/os/aix/bits/os_defines.h: Tweaks. + * config/os/bsd/freebsd/bits/os_defines.h: Same. + * config/os/bsd/netbsd/bits/os_defines.h: Same. + * config/os/djgpp/bits/os_defines.h: Same. + * config/os/generic/bits/os_defines.h: Same. + * config/os/gnu-linux/bits/os_defines.h: Same. + * config/os/hpux/bits/os_defines.h: Same. + * config/os/irix/irix5.2/bits/os_defines.h: Same. + * config/os/irix/irix6.5/bits/os_defines.h: Same. + * config/os/newlib/bits/os_defines.h: Same. + * config/os/solaris/solaris2.5/bits/os_defines.h: Same. + * config/os/solaris/solaris2.6/bits/os_defines.h: Same. + * config/os/solaris/solaris2.7/bits/os_defines.h: Same. + + * include/bits/c++config: Remove include. + * include/bits/limits_generic.h: Remove. + * include/bits/std_limits.h: Include cpu_limits.h. + * include/Makefile.am: Fixup. + * src/limits.cc: Tweak. + * src/limits_generic.cc: Remove. + * src/gen-num-limits.cc: Remove. + * mknumeric_limits: Remove. + + 2001-10-20 Brendan Kehoe + + * bits/type_traits.h (_Bool): Removed this type. + (__true_type, __false_type): Change to be plain structs. + * src/string-inst.cc (__destroy_aux): Change third parm to be + __false_type instead of _Bool. + * src/misc-inst.cc (__uninitialized_fill_n_aux, + __uninitialized_copy_aux): Likewise. + + 2001-10-19 Benjamin Kosnik + + * mkcheck.in (static_fail): Remove older memory limit functionality. + Disable E_TIME due to formatting issues. + + * README: Update. + + 2001-10-19 Brendan Kehoe + + * include/bits/std_complex.h: Default initialize second argument + of polar to 0, as specified in Library DR #79 + + 2001-10-19 Brendan Kehoe + + * include/bits/stl_raw_storage_iter.h (operator=): Fix to call + _Construct instead of construct. + + 2001-10-19 Brendan Kehoe + + * include/bits/basic_string.tcc (find_first_not_of): Take out check for + __n being non-zero, since the standard does not mandate that. + e.g., a search for "" in "" should yield position 0, not npos. + (find_last_not_of): Likewise. + + 2001-10-19 Brendan Kehoe + + * include/bits/stl_bvector.h (vector::_M_range_check): Fix + to throw out_of_range, not range_error, thus sayeth $23.1.1.13. + + 2001-10-19 Brendan Kehoe + + * include/bits/stl_iterator.h (reverse_iterator::current): Rename + member from _M_current, and change all uses; thus sayeth $24.4.1.1. + + 2001-10-19 Brendan Kehoe + + * include/bits/stl_algo.h (partial_sort): Add missing `>' on the + template parameter _ValueType. + + 2001-10-19 Brendan Kehoe + + * include/bits/std_limits.h: Clean up extra semicolons. + * include/bits/locale_facets.h: Likewise. + * include/bits/type_traits.h: Likewise. + + 2001-10-19 Brendan Kehoe + + * include/bits/localefwd.h (locale::combine): Add const for lib DR 14. + * include/bits/locale_facets.tcc (locale::combine): Likewise. + + 2001-10-19 Benjamin Kosnik + + * include/bits/locale_facets.h (__timepunct::_M_put_helper): + Declare specializations for char, wchar_t. + + 2001-10-19 Andreas Jaeger + + * config/cpu/x86-64/bits/limits.h: New file. + * config/cpu/x86-64/bits/atomicity.h: New file. + * configure.target: Add x86-64. + + 2001-10-17 Phil Edwards + + * docs/html/17_intro/howto.html: Remove 1999 links (and explain + why). Add link to recent message. + * docs/html/faq/index.html (5.6): Reformat text only; fixup
+ 	markup.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 
+ 2001-10-12  Loren J. Rittle  
+ 
+ 	* docs/html/faq/index.html (Is libstdc++-v3 thread-safe?): Update
+ 	based on Nathan's review.  Use Nathan's words.
+ 
+ 2001-10-11  Matt Kraai  
+ 
+ 	* docs/html/configopts.html: Quote StyleSheet attribute values.
+ 	* docs/html/documentation.html: Likewise.
+ 	* docs/html/explanations.html: Likewise.
+ 	* docs/html/install.html: Likewise.
+ 	* docs/html/17_intro/howto.html: Likewise.
+ 	* docs/html/17_intro/license.html: Likewise.
+ 	* docs/html/18_support/howto.html: Likewise.
+ 	* docs/html/19_diagnostics/howto.html: Likewise.
+ 	* docs/html/20_util/howto.html: Likewise.
+ 	* docs/html/21_strings/howto.html: Likewise.
+ 	* docs/html/22_locale/howto.html: Likewise.
+ 	* docs/html/23_containers/howto.html: Likewise.
+ 	* docs/html/24_iterators/howto.html: Likewise.
+ 	* docs/html/25_algorithms/howto.html: Likewise.
+ 	* docs/html/26_numerics/howto.html: Likewise.
+ 	* docs/html/27_io/howto.html: Likewise.
+ 	* docs/html/ext/howto.html: Likewise.
+ 	* docs/html/ext/sgiexts.html: Likewise.
+ 	* docs/html/faq/index.html: Likewise.
+ 
+ 2001-10-11  Loren J. Rittle  
+ 
+ 	* docs/html/faq/index.html (Is libstdc++-v3 thread-safe?): Rewrite.
+ 	* docs/html/23_containers/howto.html (Containers and multithreading):
+ 	Update.
+ 
+ 2001-10-09  Phil Edwards  
+ 
+ 	* docs/html/17_intro/howto.html:  Tweak markup and value type.
+ 	* docs/html/27_io/howto.html:  Tweak markup, describe setbuf() for
+ 	nonzero arguments, add new note on threading.
+ 	* docs/html/faq/index.html:  Update.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 
+ 2001-10-09  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  More HTML->XHTML and lowercasing of tags.
+ 	* docs/html/documentation.html:  Likewise.
+ 	* docs/html/explanations.html:  Likewise.
+ 	* docs/html/install.html:  Likewise.
+ 	* docs/html/17_intro/howto.html:  Likewise.
+ 	* docs/html/17_intro/license.html:  Likewise.  Tighten up language.
+ 	* docs/html/18_support/howto.html:  Likewise.
+ 	* docs/html/19_diagnostics/howto.html:  Likewise.
+ 	* docs/html/20_util/howto.html:  Likewise.
+ 	* docs/html/21_strings/howto.html:  Likewise.
+ 	* docs/html/22_locale/howto.html:  Likewise.
+ 	* docs/html/23_containers/howto.html:  Likewise.
+ 	* docs/html/24_iterators/howto.html:  Likewise.
+ 	* docs/html/25_algorithms/howto.html:  Likewise.
+ 	* docs/html/26_numerics/howto.html:  Likewise.
+ 	* docs/html/27_io/howto.html:  Likewise.
+ 	* docs/html/ext/howto.html:  Likewise.
+ 	* docs/html/ext/sgiexts.html:  Likewise.
+ 	* docs/html/faq/index.html:  Likewise.  Not so many absolute links.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 
+ 2001-10-07  Joseph S. Myers  
+ 
+ 	* docs/html/22_locale/locale.html, docs/html/faq/index.html: Fix
+ 	spelling errors of "separate" as "seperate", and corresponding
+ 	spelling errors of related words.
+ 	* docs/html/faq/index.txt: Regenerate.
+ 
+ 2001-10-05  Phil Edwards  
+ 
+ 	* config/cpu/alpha/bits/atomicity.h (__compare_and_swap):  Remove
+ 	unused function.
+ 	* config/cpu/arm/bits/atomicity.h:  Likewise.
+ 	* config/cpu/generic/bits/atomicity.h:  Likewise.
+ 	* config/cpu/i486/bits/atomicity.h:  Likewise.
+ 	* config/cpu/ia64/bits/atomicity.h:  Likewise.
+ 	* config/cpu/mips/bits/atomicity.h:  Likewise.
+ 	* config/cpu/powerpc/bits/atomicity.h:  Likewise.
+ 	* config/cpu/sparc/sparc32/bits/atomicity.h:  Likewise.
+ 	* config/cpu/sparc/sparc64/bits/atomicity.h:  Likewise.
+ 
+ 2001-10-04  Phil Edwards  
+ 
+ 	* docs/html/faq/index.html:  Describe DR #22, and a workaround.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 
+ 2001-10-04  Phil Edwards  
+ 
+ 	* docs/html/17_intro/COPYING.DOC:  New file, GFDL v1.1 from the FSF.
+ 	* docs/html/17_intro/license.html:  New file.  Explain the licenses
+ 	in use.
+ 
+ 	* docs/html/configopts.html:  Link to license.html.
+ 	* docs/html/documentation.html:  Likewise.
+ 	* docs/html/explanations.html:  Likewise.
+ 	* docs/html/install.html:  Likewise.
+ 	* docs/html/17_intro/howto.html:  Likewise.
+ 	* docs/html/18_support/howto.html:  Likewise.
+ 	* docs/html/19_diagnostics/howto.html:  Likewise.
+ 	* docs/html/20_util/howto.html:  Likewise.
+ 	* docs/html/21_strings/howto.html:  Likewise.
+ 	* docs/html/22_locale/howto.html:  Likewise.
+ 	* docs/html/23_containers/howto.html:  Likewise.
+ 	* docs/html/24_iterators/howto.html:  Likewise.
+ 	* docs/html/25_algorithms/howto.html:  Likewise.
+ 	* docs/html/26_numerics/howto.html:  Likewise.
+ 	* docs/html/27_io/howto.html:  Likewise.
+ 	* docs/html/ext/howto.html:  Likewise.
+ 	* docs/html/ext/sgiexts.html:  Likewise.
+ 	* docs/html/faq/index.html:  Likewise.  New question, linking to
+ 	the new license.html.
+ 
+ 2001-10-04  Phil Edwards  
+ 
+ 	* docs/html/17_intro/howto.html:  Fix mis-sed in header from 20010917.
+ 	* docs/html/18_support/howto.html:  Likewise.
+ 	* docs/html/19_diagnostics/howto.html:  Likewise.
+ 	* docs/html/20_util/howto.html:  Likewise.
+ 	* docs/html/21_strings/howto.html:  Likewise.
+ 	* docs/html/22_locale/howto.html:  Likewise.
+ 	* docs/html/23_containers/howto.html:  Likewise.
+ 	* docs/html/24_iterators/howto.html:  Likewise.
+ 	* docs/html/25_algorithms/howto.html:  Likewise.
+ 	* docs/html/26_numerics/howto.html:  Likewise.
+ 	* docs/html/27_io/howto.html:  Likewise.
+ 	* docs/html/ext/howto.html:  Likewise.
+ 	* docs/html/faq/index.html:  Likewise.  Spacing fix.
+ 
+ 2001-10-03  Dimitris Vyzovitis  
+ 
+ 	* include/bits/stl_threads.h (_Atomic_swap): New function.
+ 	(_Swap_lock_struct<__dummy>::_S_swap_lock): New data.
+ 	* testsuite/ext/rope.cc: New file.
+ 
+ 2001-10-02  Benjamin Kosnik  
+ 
+ 	* config/locale/time_members_gnu.h: Remove.
+ 	* config/locale/time_members_generic.h: Remove.
+ 	* config/locale/time_members_gnu.cc (__timepunct::_M_put_helper): Add.
+ 	* config/locale/time_members_generic.cc: Same.
+ 	* include/bits/locale_facets.h: Add data members.
+ 	(__timepunct::_M_put_helper): Change signature.
+ 	(__timepunct::_M_date_formats): Same.
+ 	(__timepunct::_M_time_formats): Same.
+ 	(__timepunct::_M_ampm): Add.
+ 	(__timepunct::_M_date_time_formats): Add.
+ 	(time_get::_M_extract_via_format): Add.
+ 	(time_get::_M_extract_time): Change to...
+ 	(time_get::_M_extract_num): ... this, modify signature.
+ 	* include/bits/locale_facets.tcc (time_get::do_get_year): Fix.
+ 	(time_get::do_get_time): Fix.
+ 	(time_get::do_get_date): Fix.
+ 
+ 	* acinclude.m4: Remove CTIME_H.
+ 	* aclocal.m4: Regenerate.
+ 	* include/Makefile.am: Same.
+ 	* include/Makefile.in: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 	* testsuite/22_locale/time_get_members_char.cc: Fix.
+ 	* testsuite/22_locale/time_get_members_wchar_t.cc: Add.
+ 	* testsuite/22_locale/time_put_members_wchar_t.cc: Add.
+ 
+ 2001-10-01  Hans-Peter Nilsson  
+ 
+ 	* config/cpu/cris/bits/atomicity.h: Correct file header.
+ 
+ 2001-09-29  Hans-Peter Nilsson  
+ 
+ 	* configure.target (LIMITSH): Set for cris.
+ 	(cpu_include_dir): Set for cris-*-*.
+ 	* config/cpu/cris/bits/atomicity.h: New file.
+ 	* config/cpu/cris/bits/limits.h: New file.
+ 
+ 2001-09-28  Benjamin Kosnik  
+ 
+ 	* config/locale/time_members_gnu.h (__timepunct::_M_get_helper): Add.
+ 	(__timepunct::_M_put_helper): Add.
+ 	* config/locale/time_members_generic.h: Same.
+ 	* include/bits/locale_facets.h (__match_parallel): Remove. Format.
+ 	(__timepunct): Add data members.
+ 	(__timepunct::_M_days): Add.
+ 	(__timepunct::_M_days_abbreviated): Add.
+ 	(__timepunct::_M_months): Add.
+ 	(__timepunct::_M_months_abbreviated): Add.
+ 	(__timepunct::_M_initialize_timepunct): Add.
+ 	* include/bits/locale_facets.tcc: Same.
+ 	* src/locale-inst.cc: Remove instantiations for __match_parallel.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add CTIME_CC.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/22_locale/time_put_members_char.cc: Mark XFAIL.
+ 	* testsuite/22_locale/time_put_members_char.cc (test01): New file.
+ 	* testsuite/22_locale/time_get.cc: New file.
+ 
+ 2001-09-28  Rainer Orth  
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Use
+ 	correct multilib builddir.
+ 	Properly locate libgcc_s.
+ 
+ 2001-09-27  Phil Edwards  
+ 
+ 	* include/std/*:  Add Doxygen hooks.
+ 	* docs/doxygen/Intro.3:  New file, general intro to the man pages.
+ 	* docs/doxygen/mainpage.doxy:  Formatting tweaks.  List our own links
+ 	rather than using a generated index.
+ 	* docs/doxygen/user.cfg.in:  Disable the index, enable man pages.
+ 	* docs/doxygen/run_doxygen:  Massage the generated man pages, using...
+ 	* docs/doxygen/stdheader.cc:  ...this new file.
+ 
+ 2001-09-26  Stan Shebs  
+ 
+ 	* include/Makefile.am: Remove RCS Id strings.
+ 	* src/Makefile.am: Ditto.
+ 	* docs/doxygen/run_doxygen: Ditto.
+ 	* docs/html/configopts.html: Ditto.
+ 	* docs/html/documentation.html: Ditto.
+ 	* docs/html/explanations.html: Ditto.
+ 	* docs/html/install.html: Ditto.
+ 	* docs/html/17_intro/howto.html: Ditto.
+ 	* docs/html/18_support/howto.html: Ditto.
+ 	* docs/html/19_diagnostics/howto.html: Ditto.
+ 	* docs/html/20_util/howto.html: Ditto.
+ 	* docs/html/21_strings/howto.html: Ditto.
+ 	* docs/html/22_locale/howto.html: Ditto.
+ 	* docs/html/23_containers/howto.html: Ditto.
+ 	* docs/html/24_iterators/howto.html: Ditto.
+ 	* docs/html/25_algorithms/howto.html: Ditto.
+ 	* docs/html/26_numerics/howto.html: Ditto.
+ 	* docs/html/27_io/howto.html: Ditto.
+ 	* docs/html/ext/howto.html: Ditto.
+ 	* docs/html/ext/sgiexts.html: Ditto.
+ 	* docs/html/faq/index.html: Ditto.
+ 	* docs/html/faq/index.txt: Ditto.
+ 
+ 2001-09-25  Phil Edwards  
+ 
+ 	* testsuite/21_strings/c_strings.cc (test01, test02):  Increase
+ 	`carray' size.
+ 
+ 2001-09-25  Phil Edwards  
+ 
+ 	* docs/html/20_util/howto.html:  Add anchor name.
+ 	* docs/html/23_containers/howto.html:  Line wrapping, another link.
+ 	* docs/html/25_algorithms/howto.html:  Another note.
+ 
+ 	* docs/html/ext/howto.html:  Link to SGI extensions.  List DRs and
+ 	link to them...
+ 	* docs/html/ext/lwg-active.html:  ...in this new file (from R19),
+ 	* docs/html/ext/lwg-defects.html:  and this new file (from R19).
+ 	* docs/html/ext/sgiexts.html:  New file.  Mention SGI extensions
+ 	carried over to libstdc++-v3.
+ 	* docs/html/faq/index.html:  Link to SGI extensions.  Mention the
+ 	"missing .." pseudobug.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 
+ 	* include/bits/ios_base.h:  DR-related comment cleanup.
+ 	* include/bits/istream.tcc:  Likewise.
+ 	* include/bits/locale_facets.h:  Likewise.
+ 	* include/bits/locale_facets.tcc:  Likewise.
+ 	* include/bits/ostream.tcc:  Likewise.
+ 	* include/bits/std_bitset.h:  Likewise.
+ 	* include/bits/std_iosfwd.h:  Likewise.
+ 	* include/bits/std_istream.h:  Likewise.
+ 	* include/bits/std_ostream.h:  Likewise.
+ 	* include/bits/std_streambuf.h:  Likewise.
+ 	* include/bits/stl_pair.h:  Likewise.
+ 	* include/bits/streambuf_iterator.h:  Likewise.
+ 
+ 	* include/bits/std_map.h:  Remove unused header inclusion guard
+ 	_CPP_BITS_STL_TREE_H from around bits/stl_tree.h.
+ 	* include/bits/std_set.h:  Likewise.
+ 
+ 	* include/bits/stl_function.h:  Doxygen markup.
+ 	* docs/doxygen/doxygroups.cc:  New file, specifying module grouping.
+ 	* libsupc++/typeinfo:  Doxygen markup tweak.
+ 
+ 2001-09-20  Scott Johnston 
+ 	    Peter Schmid 
+ 
+ 	* include/backward/alloc.h: Conditionally define malloc_alloc
+ 	* testsuite/backward/header_deque_h.cc: New file.
+ 
+ 2001-09-20  Sylvain Pion 
+ 
+ 	* libstdc++-v3/include/bits/locale_facets.tcc (money_put::do_put):
+ 	change variable name so that it works with -fno-for-scope.
+ 
+ 2001-09-20  Benjamin Kosnik  
+ 
+ 	* testsuite/22_locale/numpunct_members_char.cc (test01): Remove
+ 	redundant sanity checks.
+ 	* testsuite/22_locale/money_put_members_wchar_t.cc (test01): Same.
+ 	(test02): Same.
+ 	* testsuite/22_locale/money_put_members_char.cc (test01): Same.
+ 	(test02): Same.
+ 	* testsuite/22_locale/moneypunct_members_wchar_t.cc (test01): Same.
+ 	* testsuite/22_locale/moneypunct_members_char.cc (test01): Same.
+ 	* testsuite/22_locale/money_get_members_wchar_t.cc (test01): Same.
+ 	(test02): Same.
+ 	* testsuite/22_locale/money_get_members_char.cc (test01): Same.
+ 	(test02): Same.
+ 
+ 2001-09-19  Benjamin Kosnik  
+ 
+ 	Implement std::time_put.
+ 	* include/bits/locale_facets.h: Include time_members.h.
+ 	(__timepunct): New.
+ 	(time_put): Implement.
+ 	* include/bits/locale_facets.tcc (do_put): Put generic versions here.
+ 	* include/bits/localefwd.h: Bump number of facets.
+ 	* config/locale/time_members_generic.h: New file.
+ 	* config/locale/time_members_gnu.h: New file.
+ 	* config/locale/c_locale_generic.h: Include clocale.
+ 	* src/locale-inst.cc: Add use_facet instantiations for __timepunct.
+ 	* src/locale.cc: Add __timepunct initializations.
+ 	* src/localename.cc (locale::_Impl::_Impl(string, size_t)): Same.
+ 	* include/Makefile.am (stamp-target): Add time_members.h.
+ 	* include/Makefile.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add CTIME_H.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/22_locale/time_put.cc: New file.
+ 	* testsuite/22_locale/time_put_members_char.cc: New file.
+ 
+ 	* docs/html/22_locale/locale.html: Add note.
+ 
+ 2001-09-17  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  HTML to XHTML change.  Lowercase tags.
+ 	* docs/html/documentation.html:  Likewise.
+ 	* docs/html/explanations.html:  Likewise.
+ 	* docs/html/install.html:  Likewise.
+ 	* docs/html/17_intro/howto.html:  Likewise.
+ 	* docs/html/18_support/howto.html:  Likewise.
+ 	* docs/html/19_diagnostics/howto.html:  Likewise.
+ 	* docs/html/20_util/howto.html:  Likewise.
+ 	* docs/html/21_strings/howto.html:  Likewise.
+ 	* docs/html/22_locale/codecvt.html:  Likewise.
+ 	* docs/html/22_locale/ctype.html:  Likewise.
+ 	* docs/html/22_locale/howto.html:  Likewise.
+ 	* docs/html/22_locale/locale.html:  Likewise.
+ 	* docs/html/22_locale/messages.html:  Likewise.
+ 	* docs/html/23_containers/howto.html:  Likewise.
+ 	* docs/html/24_iterators/howto.html:  Likewise.
+ 	* docs/html/25_algorithms/howto.html:  Likewise.
+ 	* docs/html/26_numerics/howto.html:  Likewise.
+ 	* docs/html/27_io/howto.html:  Likewise.
+ 	* docs/html/ext/howto.html:  Likewise.
+ 	* docs/html/faq/index.html:  Likewise.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-09-14  Phil Edwards  
+ 
+ 	* docs/html/17_intro/headers_cc.txt:  "Sync"/copy real file over.
+ 	* docs/html/17_intro/howto.html:  Spacing and HTML markup fixes.
+ 	* docs/html/18_support/howto.html:  It won't compile; it's not code.
+ 	* docs/html/19_diagnostics/howto.html:  Point diagram seekers to
+ 	doxygen'd pages.
+ 	* docs/html/22_locale/howto.html:  Comment for future work.
+ 	* docs/html/23_containers/howto.html:  More comments.
+ 	* docs/html/25_algorithms/howto.html:  It's a comment, not a
+ 	blunt command to the reader.  (English grammar.)
+ 
+ 2001-09-14  Benjamin Kosnik  
+ 
+ 	* config/locale/moneypunct_members_gnu.cc: Fix initialization of
+ 	wchar_t members.
+ 	* testsuite/22_locale/money_get_members_wchar_t.cc (test02): New file.
+ 	* testsuite/22_locale/money_put_members_wchar_t.cc (test02): Fix.
+ 
+ 2001-09-14  Benjamin Kosnik  
+ 
+ 	* include/bits/locale_facets.tcc: Conditionalize use of strtold.
+ 
+ 2001-09-13  Alexandre Petit-Bianco  
+ 
+ 	* testsuite/22_locale/money_get_members_char.cc: Fixed typo in comment.
+ 	* testsuite/22_locale/money_put_members_char.cc: Likewise.
+ 	* testsuite/22_locale/money_put_members_wchar_t.cc: Likewise.
+ 
+ 2001-09-13  Benjamin Kosnik  
+ 
+ 	Implement std::money_get.
+ 	* include/bits/locale_facets.tcc (money_get::do_get): Implement.
+ 	* include/bits/locale_facets.h (money_get): Correct signatures.
+ 	* testsuite/22_locale/money_get.cc: New file.
+ 	* testsuite/22_locale/money_get_members_char.cc: New file.
+ 
+ 	* include/bits/locale_facets.tcc (__verify_grouping): New
+ 	function. Consolidate num_get and money_get group checking into
+ 	one function.
+ 	(money_get): Use it.
+ 	* src/locale.cc (num_get::_M_extract): Use it.
+ 	* src/locale-inst.cc: Add instantiation.
+ 
+ 2001-09-12  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_limits.h (numeric_limits::radix,
+ 	numeric_limits::epsilon:  Fix thinko.
+ 
+ 2001-09-10  Benjamin Kosnik  
+ 
+ 	* configure.in: Fix cross compiling math routines. Correct
+ 	comments for cross compiling and limits. Add floating point math
+ 	routines found in newlib.
+ 	* configure: Regenerate.
+ 	* acconfig.h: Add macros.
+ 	* config.h.in: Regenerate.
+ 
+ 2001-09-10  Benjamin Kosnik  
+ 
+ 	* config/locale/moneypunct_members_generic.cc
+ 	(money_base::_S_construct_pattern): Remove unused parameters.
+ 
+ 2001-09-10  Benjamin Kosnik  
+ 
+ 	* include/Makefile.am (stamp-target): Remove link to self.
+ 	* inclulde/Makefile.in: Regenerate.
+ 
+ 2001-09-09  Benjamin Kosnik  
+ 
+ 	Implement std::money_put.
+ 	* include/bits/locale_facets.h
+ 	(moneypunct::_M_initialize_moneypunct): Split up specializations
+ 	to account for _Intl.  More grody hacking to get around the
+ 	ill-considered use of const bool as a template parameter.
+ 	* config/locale/moneypunct_members_gnu.cc: And here.
+ 	* config/locale/moneypunct_members_generic.cc: And here.
+ 	* testsuite/22_locale/moneypunct_members_char.cc: Add tests.
+ 	* testsuite/22_locale/moneypunct.cc: Add tests.
+ 	* testsuite/22_locale/money_put_members_wchar_t.cc: New file.
+ 	* testsuite/22_locale/moneypunct_members_wchar_t.cc: New file.
+ 
+ 	* src/locale.cc (money_base::_S_construct_pattern): Move into
+ 	gnu-specific file.
+ 	* config/locale/moneypunct_members_gnu.cc: Add here.
+ 	* config/locale/moneypunct_members_generic.cc: Add generic version
+ 	here.
+ 
+ 	* include/bits/locale_facets.tcc (money_put::do_put): Move member
+ 	function definitions here.
+ 	* include/bits/locale_facets.h (money_put): Implement.
+ 	* src/locale-inst.cc: Add use_facet instantiations for moneypunct.
+ 	Correct money_get, money_put instantiations.
+ 	* src/locale.cc (money_base::_S_construct_pattern): Handle case
+ 	where __posn == 0.
+ 	* testsuite/22_locale/money_put_members_char.cc: Add tests.
+ 
+ 2001-09-05  Phil Edwards  
+ 
+ 	* testsuite_flags.in:  No longer need to search testsuite builddir.
+ 	* src/stl-inst.cc (__sink_unused_warning):  Unused, remove.
+ 	* Makefile.am:  The testsuite directory never needs to be made here.
+ 	* Makefile.in:  Regenerate.
+ 	* include/Makefile.in:  Regenerate.
+ 	* libio/Makefile.in:  Regenerate.
+ 	* libmath/Makefile.in:  Regenerate.
+ 	* libsupc++/Makefile.in:  Regenerate.
+ 	* po/Makefile.in:  Regenerate.
+ 	* src/Makefile.in:  Regenerate.
+ 	* testsuite/Makefile.in:  Regenerate.
+ 
+ 2001-09-04  Scott Johnston  
+ 	    Peter Schmid  
+ 
+ 	* include/backward/iterator.h: Include ,
+ 	remove reverse_bidirectional_iterator.
+ 	* testsuite/backward: New directory.
+ 	* testsuite/backward/header_iterator_h.cc: New file.
+ 
+ 2001-09-04  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_c*.h: Don't use include_next.
+ 
+ 2001-09-03  Richard Sandiford  
+ 
+ 	* libsupc++/eh_personality.cc (parse_lsda_header): Change type of
+ 	tmp from _Unwind_Ptr to _Unwind_Word.
+ 
+ 2001-08-31  Jason Merrill  
+ 
+ 	* libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Simplify
+ 	leb128 handling.
+ 
+ 2001-08-28  Loren J. Rittle  
+ 
+ 	* include/Makefile.am: Use toplevel_srcdir to refer to src files
+ 	outside this component.
+ 	* include/Makefile.in: Regenerate.
+ 
+ 2001-08-27  Benjamin Kosnik  
+ 
+ 	* config/locale/c_locale_gnu.cc: Move facet info to separate files...
+ 	* config/locale/c_locale_generic.cc: Same.
+ 	* config/locale/moneypunct_members_gnu.cc: New file.
+ 	* config/locale/moneypunct_members_generic.cc: New file.
+ 	* config/locale/numpunct_members_gnu.cc: New file.
+ 	* config/locale/numpunct_members_generic.cc: New file.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add moneypunct, numpunct
+ 	options.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* src/Makefile.am (sources): And here.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	Rename for consistency with rest of testsuite.
+ 	* testsuite/22_locale/codecvt.cc: New file.
+ 	* testsuite/22_locale/money_put.cc: New file.
+ 	* testsuite/22_locale/money_put_members_char.cc: New file.
+ 
+ 2001-08-27  Phil Edwards  
+ 
+ 	PR libstdc++/4143
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO):  Handle enable/disable
+ 	correctly for version-specific-runtime-libs.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate.
+ 
+ 2001-08-24  Loren J. Rittle  
+ 
+ 	* config/cpu/i386/bits/limits.h (__glibcpp_long_double_bits): Only
+ 	define if not already provided by per-OS file.
+ 	* config/os/bsd/freebsd/bits/os_defines.h (__glibcpp_long_double_bits):
+ 	Define.
+ 
+ 2001-08-24  Jan van Male 
+ 
+ 	* docs/html/17_intro/C++STYLE:  Fix typo.
+ 
+ 2001-08-24  Phil Edwards  
+ 
+ 	* docs/html/23_containers/howto.html:  Describe implementation of
+ 	insertion with hints.
+ 
+ 2001-08-24  Kenny Simpson  
+ 
+ 	libstdc++/3740
+ 	* include/bits/std_sstream.h (basic_ostringstream): Fix ctor.
+ 
+ 2001-08-24  Sylvain Pion 
+ 	    Phil Edwards  
+ 
+ 	PR libstdc++/3349
+ 	* include/bits/stl_tree.h (insert_unique):  Revert last change.
+ 	Values inserted at begin() must be less, not greater, than *begin()'s.
+ 	* testsuite/23_containers/map_insert.cc:  New file.
+ 
+ 2001-08-23  Benjamin Kosnik  
+ 
+ 	* config/locale/c_locale_gnu.cc: Minor tweaks.
+ 	(moneypunct): Implement.
+ 	* include/bits/locale_facets.h: Same.
+ 	* testsuite/22_locale/moneypunct.cc: New file.
+ 	* testsuite/22_locale/moneypunct_byname.cc: New file.
+ 	* testsuite/22_locale/moneypunct_char_members.cc: New file.
+ 
+ 2001-08-23  David Edelsohn  
+ 
+ 	* config/os/gnu-linux/bits/os_defines.h: Correct __s390__ definitions.
+ 	Set __powerpc__ long double definition based on __LONG_DOUBLE_128__.
+ 
+ 2001-08-23  Jason Merrill  
+ 
+ 	* testsuite_flags.in (build-includes): Re-add backward.
+ 
+ 2001-08-22  Benjamin Kosnik  
+ 
+ 	* testsuite/22_locale/collate_wchar_t_members.cc: Guard
+ 	with _GLIBCPP_USE_WCHAR_T.
+ 
+ 2001-08-21  Benjamin Kosnik  
+ 
+ 	* testsuite/22_locale/collate_byname.cc (test01): Fix.
+ 
+ 2001-08-18  Vladimir A Merzliakov  
+ 
+ 	* include/bits/locale_facets.tcc (collate::do_transform): Add typename.
+ 
+ 2001-08-18  Benjamin Kosnik  
+ 
+ 	* testsuite/22_locale/operators.cc: Add test.
+ 
+ 2001-08-17  Benjamin Kosnik  
+ 
+ 	Implement std::collate.
+ 	* config/locale/collate_specializations_gnu.cc: Add here, implement in
+ 	MT-safe way.
+ 	* config/locale/collate_specializations_generic.cc: Add here, but
+ 	in a less sophisticated manner.
+ 	* include/bits/locale_facets.tcc (collate): Add generic definition.
+ 	* include/bits/locale_facets.h (~collate): Mark virtual.
+ 	(collate::_M_compare_helper): New.
+ 	(collate::_M_transform_helper): New.
+ 	* src/locale.cc: Remove unnecessary specializations.
+ 	* src/string-inst.cc: Tweak instantiation of ctors.
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Do configury for collate.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* src/Makefile.am (sources): Add collate.cc.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* testsuite/22_locale/collate_byname.cc: New.
+ 	* testsuite/22_locale/collate.cc: New file.
+ 	* testsuite/22_locale/collate_char_members.cc: New file.
+ 	* testsuite/22_locale/collate_wchar_t_members.cc: New file.
+ 
+ 2001-08-16  Franz Sirl  
+ 
+ 	* configure.target: Set LIMITSH for powerpc-*-*.
+ 	* config/cpu/powerpc/bits/limits.h: New file.
+ 
+ 2001-08-16  Marc Espie 
+ 
+ 	* configure.in:  Check for .
+ 	* configure:  Rebuild.
+ 	* config.h.in:  Rebuild.
+ 	* libmath/mathconf.h:  Include  prior to
+ 	 if available.
+ 
+ 2001-08-15  Andreas Schwab  
+ 
+ 	* configure.target (cpu_include_dir): Set to `config/cpu/m68k' for
+ 	m68k and m680[246]0.
+ 	* config/cpu/m68k/bits/atomicity.h: New file.
+ 
+ 	* include/bits/std_limits.h [__glibcpp_long_double_bits == 96]:
+ 	Define appropriate long double limits for m68k extended floating
+ 	point.
+ 	(__glibcpp_f32_digits10): Corrected, off by one.
+ 	(__glibcpp_f80_digits10): Likewise.
+ 	(__glibcpp_f128_digits10): Likewise.
+ 	* config/os/gnu-linux/bits/os_defines.h
+ 	(__glibcpp_long_double_bits) [__mc68000__]: Define to 96.
+ 
+ 2001-08-15  Gabriel Dos Reis  
+ 
+ 	* testsuite/18_support/numeric_limits.cc: Add more tests.
+ 	* include/bits/std_limits.h (numeric_limits::max): Fix
+ 	typo.
+ 
+ 2001-08-14  Ulrich Weigand  
+ 
+ 	* configure.target (cpu_include_dir): Set to `config/cpu/s390'
+ 	for s390 and s390x.
+ 
+ 	* config/cpu/s390/bits/atomicity.h: New.
+ 
+ 2001-08-14  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_limits.h: Fix thinko.
+ 
+ 2001-08-14  Benjamin Kosnik  
+ 
+ 	* include/Makefile.am: Consolidate target rules. Don't clean stamp
+ 	files. Tweak target build directory stamp.
+ 	* include/Makefile.in: Regenerate.
+ 
+ 2001-08-14  Peter Schmid  
+ 
+ 	* libstdc++-v3/libmath/stubs.c: Fix PR/3988, replace
+ 	_GBLICPP_HAVE_LOGL with HAVE_LOGL
+ 
+ 2001-08-13  Benjamin Kosnik  
+ 
+ 	* configure.in (libtool_VERSION): Add.
+ 	(VERSION): Change to
+ 	(release_VERSION): This.
+ 	* configure: Regenerate.
+ 	* src/Makefile.am (libstdc___la_LDFLAGS): Use -version-info with
+ 	libtool_VERSION.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* intl/Makefile.am: Remove.
+ 	* intl/Makefile.in: Remove.
+ 	* intl: Remove.
+ 	* Makefile.am (SUBDIRS): Remove intl.
+ 	* po/Makefile.am (DISTFILES): Add string_literals.cc
+ 	(MSGFMT): Add.
+ 	* po/string_literals.cc: Add.
+ 	* po/POTFILES.in: Fix path.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Don't call AM_GNU_GETTEXT.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Remove AC_OUTPUT of intl/Makefile.
+ 
+ 	* include/backward/backward_warning.h: Clarify message.
+ 
+ 	* testsuite_flags.in (--cxxflags): Use same debug flags for
+ 	library and testsuite.
+ 
+ 	* include/Makefile.am (c_compatibility): Remove.
+ 	* include/Makefile.in: Regenerate.
+ 
+ 2001-08-13  Mark Mitchell  
+ 
+ 	* configure.in (LIMITS_INC_SRCDIR): New variable.
+ 	* configure.target (LIMITSH): New variable.
+ 	* porting.texi: Discuss numeric limits.
+ 	* config/cpu/generic/bits/limits.h: New file.
+ 	* config/cpu/i386/bits/limits.h: New file.
+ 	* include/Makefile.am: Install bits/limits.h.
+ 	* include/bits/c++config: Include bits/limits.h.
+ 
+ 2001-08-13  H.J. Lu  (hjl@gnu.org)
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-copy-files):
+ 	New. Copy files.
+ 	(libstdc++-v3-init ): Use it.
+ 
+ 2001-08-13  Gabriel Dos Reis  
+ 
+ 	* include/bits/ostream.tcc (__pad_char): Change toplevel '__fmt'
+ 	to '__adjust' to avoid shadowing in nested scope.
+ 
+ 2001-08-10  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_limits.h(__glibcpp_char_is_signed): Use
+ 	__CHAR_UNSIGNED__.
+ 
+ 	* config/os/gnu-linux/bits/os_defines.h(__glibcpp_char_is_signed):
+ 	Likewise.
+ 	* config/os/aix/bits/os_defines.h(__glibcpp_plain_char_is_signed):
+ 	Remove.
+ 
+ 2001-08-10  Loren J. Rittle  
+ 
+ 	* testsuite/testsuite_hooks.h (__set_testsuite_memlimit): Add
+ 	dummy default argument to the non-limit implementation.
+ 
+ 	bootstrap/3963
+ 	* include/Makefile.am: Use relative file path in rule to allow
+ 	colon in $(objdir).
+ 	* include/Makefile.in: Rebuilt.
+ 
+ 2001-08-10  Gunter Winkler  
+ 
+ 	* include/bits/std_complex.h (complex::operator*=,
+ 	complex::operator/=): Fix thinko.
+ 
+ 2001-08-10  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_limits.h: New file.
+ 	* include/Makefile.am (bits_headers): Add std_limits.h
+ 	(all-local): std_limits.h is no longer built.
+ 	(${target_builddir}/std_limits.h): Remove.
+ 	* include/Makefile.in: Regenerate.
+ 	* src/limits.cc: New file.
+ 	* src/Makefile.am (sources): Add limits.cc in replacement of
+ 	limitsMEMBERS.cc.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-08-09  Gabriel Dos Reis  
+ 
+ 	* src/gen-num-limits.cc (digits10): Fix thinko.
+ 
+ 2001-08-09  Benjamin Kosnik  
+ 
+ 	* po/Makefile.am (check-no): Add.
+ 	(check-yes): Same.
+ 	* po/Makefile.in: Regenerate.
+ 
+ 2001-08-09  Benjamin Kosnik  
+ 
+ 	* acconfig.h (_GLIBCPP_MEM_LIMITS): Define.
+ 	* config.h.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_CHECK_SETRLIMIT): Check for setrlimit
+ 	function.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Remove duplicate AM_CONFIG_HEADER.
+ 	(AM_CONFIG_HEADER): Remove testsuite/testsuite_hooks.h.
+ 	Only call GLIBCPP_CHECK_SETRLIMIT for native compiles.
+ 	* configure: Regenerate.
+ 	* testsuite_hooks.h.in: Move to...
+ 	* testsuite_hooks.h: Here, include c++config.h. Use it.
+ 
+ 	* Makefile.am (SUBDIRS): Move testsuite to last directory.
+ 	* Makefile.in: Regenerate.
+ 	* po/Makefile.am (stamp-po): Add.
+ 
+ 2001-08-09  David Edelsohn  
+ 
+ 	* config/os/aix/bits/os_defines.h: Define std_limits.h macros.
+ 	* config/os/generic/bits/os_defines.h: Likewise.
+ 	* config/os/gnu-linux/bits/os_defines.h: Likewise.
+ 	* config/os/hpux/bits/os_defines.h: Likewise.
+ 	* config/os/irix/irix6.5/bits/os_defines.h: Likewise.
+ 	* config/os/solaris/solaris2.7/bits/os_defines.h: Likewise.
+ 
+ 2001-08-08  Benjamin Kosnik  
+ 
+ 	* src/Makefile.am (libstdc___la_LDFLAGS): Use -release instead of
+ 	-version-info, use substituted VERSION info.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-08-07  Benjamin Kosnik  
+ 
+ 	Implement std::messages.
+ 	Make config a fully-nested directory.
+ 	* config/locale: New directory.
+ 	* config/c_locale_generic.cc: Move into locale subdirectory.
+ 	* config/c_locale_generic.h: Same.
+ 	* config/c_locale_gnu.cc: Same.
+ 	* config/c_locale_gnu.h: Same.
+ 	* config/c_locale_ieee_1003.1-200x.cc: Same.
+ 	* config/c_locale_ieee_1003.1-200x_.h: Same.
+ 	* config/codecvt_specializations_generic.h: Same.
+ 	* config/codecvt_specializations_ieee_1003.1-200x.h: Same.
+ 	* config/messages_members_gnu.h: Same.
+ 	* config/messaages_members_gnu.cc: Same.
+ 	* config/messages_members_generic.h: Same.
+ 	* config/messaages_members_generic.cc: Same.
+ 	* config/messages_members_ieee_1003.1-200x.h: Same.
+ 	* config/messaages_members_ieee_1003.1-200x.cc: Same.
+ 	* config/io: New directory.
+ 	* config/basic_file_libio.h: Move into io subdirectory.
+ 	* config/basic_file_libio.cc: Same.
+ 	* config/c_io_libio.h: Same.
+ 	* config/c_io_libio_codecvt.c: Same.
+ 	* config/basic_file_stdio.h: Same.
+ 	* config/basic_file_stdio.cc: Same.
+ 	* config/c_io_stdio.h: Same.
+ 
+ 	* po: New directory.
+ 	* po/POTFILES.in: New file.
+ 	* po/Makefile.am: New file.
+ 	* po/Makefile.in: New file.
+ 	* po/libstdc++.pot: Generic translation file.
+ 	* po/fr.po: Preliminary French translation.
+ 	* po/de.po: Preliminary German translation.
+ 	* intl: New directory.
+ 	* intl/Makefile.am: New file.
+ 	* intl/Makefile.in: New file.
+ 	* intl/string_literals.cc: New file.
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE): Bump VERSION to 3.1.0. Add
+ 	requisite setup for gettext. Re-arrange.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Don't call GLIBCPP_CHECK_COMPILER_VERSION.
+ 	Output Makefile bits for po and intl.
+ 	* configure: Regenerate.
+ 	* Makefile.am (SUBDIRS): Add intl, po. Add rule for dist.
+ 	* Makefile.in: Regenerate.
+ 	* acconfig.h: Add ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_STPCPY.
+ 	* config.h.in: Regenerate.
+ 
+ 	* acinclude.m4 (AC_REPLACE_STRINGFUNCS): Remove.
+ 
+ 	* include/Makefile.am (install-data-local): Don't install Makefile.
+ 	* include/Makefile.in: Regenerate.
+ 
+ 	* include/bits/locale_facet.h (locale::facet::_S_clone_c_locale):
+ 	Add member.
+ 	* config/locale/c_locale_gnu.cc (_S_clone_c_locale): Add definition.
+ 	* config/locale/c_locale_generic.cc: Same.
+ 	* config/locale/c_locale_ieee_1003.1-200x.cc: Same.
+ 
+ 	* include/bits/codecvt.h: Excise non-standard, non-required
+ 	bits. This includes __enc_traits, and partial specializations of
+ 	codecvt for __enc_traits.
+ 	* src/codecvt.cc (__enc_traits::_S_max_size): Guard
+ 	* config/codecvt_partials_ieee_1003.1-200x.h: New file.
+ 	* config/codecvt_partials_generic.h: New file.
+ 	* include/Makefile.am (allstamps): Add stamp-codecvt_model.
+ 	(stamp-codecvt_model): Add.
+ 	* include/Makefile.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add in codecvt configury.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/22_locale/codecvt_unicode_wchar_t.cc: Use macro guard.
+ 	* testsuite/22_locale/codecvt_unicode_char.cc: Same.
+ 	* testsuite/22_locale/ctor_copy_dtor.cc: And here.
+ 
+ 	* include/bits/localefwd.h (class locale::facet): Add __enc_traits
+ 	as a friend for _S_*_c_locale functions.
+ 	* include/bits/codecvt.h (__enc_traits::__enc_traits): Add locale
+ 	argument to default constructor so that CODESET information can be
+ 	deduced.
+ 	* include/bits/locale_facets.h (messages_byname):
+ 	Re-implement. Remove specializations.
+ 	* src/locale.cc (messages_byname): Remove specialization.
+ 	(messages_byname): Same.
+ 	* config/locale/c_locale_ieee_1003.1-200x.cc: New file.
+ 	* config/locale/c_locale_ieee_1003.1-200x.h: New file.
+ 	* config/locale/messages_members_ieee_1003.1-200x.cc: New file.
+ 	* config/locale/messages_members_ieee_1003.1-200x.h: New file.
+ 	* config/locale/messages_members_gnu.cc: New file.
+ 	* config/locale/messages_members_gnu.h: New file.
+ 	* config/locale/messages_members_generic.cc: New file.
+ 	* config/locale/messages_members_generic.h: New file.
+ 
+ 	* docs/html/configopts.html: Add documentation for new locale
+ 	model, ieee_1003.1. Adjust other flags for current defaults.
+ 	* docs/html/22_locale/locale.html: Update.
+ 	* docs/html/22_locale/howto.html: Add link to messages.html. Organize.
+ 	* docs/html/22_locale/messages.html: New.
+ 
+ 	* src/Makefile.am (sources): Add messages_virtuals.cc.
+ 	* src/Makefile.in: Regenerate.
+ 	* include/Makefile.am (allstamps): Add stamp-messages_model.
+ 	(stamp-messages_model): Add.
+ 	* include/Makefile.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add in messages configury.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 	* testsuite_flags.in (--cxxflags): Add LOCALEDIR.
+ 	* testsuite/lib/libstdc++-v3-dg.exp: Remove broken LD_LIBRARY_PATH
+ 	bits for Irix.
+ 	* acinclude (GLIBCPP_ENABLE_CLOCALE): Set glibcpp_localedir to the
+ 	build directories message catalog base directory, and export.
+ 	Eventually this should probably be made to deal with build and
+ 	install directories. For now, punt on this as the library itself
+ 	doesn't use message catalogs (yet).
+ 	* testsuite/22_locale/messages.cc: New file.
+ 	* testsuite/22_locale/messages_char_members.cc: New file.
+ 	* testsuite/22_locale/messages_byname.cc: New file.
+ 
+ 2001-08-06  Phil Edwards  
+ 
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE_TESTSUITE):  New macro, calls...
+ 	(GLIBCPP_CHECK_SETRLIMIT):  ...this new macro, which also uses...
+ 	(GLIBCPP_CHECK_SETRLIMIT_ancilliary):  ...this new macro.
+ 	* configure.in (AM_CONFIG_HEADER):  Also generate testsuite_hooks.h.
+ 	Call GLIBCPP_CONFIGURE_TESTSUITE.
+ 	* aclocal.m4:  Regenerate.
+ 	* config.h.in:  Regenerate.
+ 	* configure:  Regenerate.
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp:  Download new header instead
+ 	of old header.
+ 
+ 	* testsuite_flags.in:  Add build dir's testsuite to INCLUDES.
+ 	* testsuite/debug_assert.h:  Removed; contents merged into...
+ 	* testsuite/testsuite_hooks.h.in:  ...here.  New file.
+ 	* testsuite/17_intro/header_ciso646.cc:  No longer include
+ 	debug_assert.h, include testsuite_hooks.h instead.
+ 	* testsuite/17_intro/header_fstream.cc:  Likewise.
+ 	* testsuite/17_intro/header_iomanip.cc:  Likewise.
+ 	* testsuite/17_intro/header_ios.cc:  Likewise.
+ 	* testsuite/17_intro/header_iosfwd.cc:  Likewise.
+ 	* testsuite/17_intro/header_iostream.cc:  Likewise.
+ 	* testsuite/17_intro/header_istream.cc:  Likewise.
+ 	* testsuite/17_intro/header_ostream.cc:  Likewise.
+ 	* testsuite/17_intro/header_sstream.cc:  Likewise.
+ 	* testsuite/17_intro/header_streambuf.cc:  Likewise.
+ 	* testsuite/18_support/numeric_limits.cc:  Likewise.
+ 	* testsuite/19_diagnostics/stdexceptions.cc:  Likewise.
+ 	* testsuite/20_util/allocator_members.cc:  Likewise.
+ 	* testsuite/20_util/auto_ptr.cc:  Likewise.
+ 	* testsuite/20_util/pairs.cc:  Likewise.
+ 	* testsuite/21_strings/append.cc:  Likewise.
+ 	* testsuite/21_strings/capacity.cc:  Likewise.
+ 	* testsuite/21_strings/char_traits_requirements.cc:  Likewise.
+ 	* testsuite/21_strings/compare.cc:  Likewise.
+ 	* testsuite/21_strings/ctor_copy_dtor.cc:  Likewise.  Also set up
+ 	call to (disabled) __set_testsuite_memlimit() wrapper.
+ 	* testsuite/21_strings/element_access.cc:  Likewise.
+ 	* testsuite/21_strings/find.cc:  Likewise.
+ 	* testsuite/21_strings/insert.cc:  Likewise.  Also set up call to
+ 	(disabled) __set_testsuite_memlimit() wrapper.
+ 	* testsuite/21_strings/inserters_extractors.cc:  Likewise.
+ 	* testsuite/21_strings/invariants.cc:  Likewise.
+ 	* testsuite/21_strings/nonmember.cc:  Likewise.
+ 	* testsuite/21_strings/operations.cc:  Likewise.
+ 	* testsuite/21_strings/replace.cc:  Likewise.
+ 	* testsuite/21_strings/rfind.cc:  Likewise.
+ 	* testsuite/21_strings/substr.cc:  Likewise.
+ 	* testsuite/22_locale/codecvt_char_char.cc:  Likewise.
+ 	* testsuite/22_locale/codecvt_unicode_char.cc:  Likewise.
+ 	* testsuite/22_locale/codecvt_unicode_wchar_t.cc:  Likewise.
+ 	* testsuite/22_locale/codecvt_wchar_t_char.cc:  Likewise.
+ 	* testsuite/22_locale/ctor_copy_dtor.cc:  Likewise.
+ 	* testsuite/22_locale/ctype_char_members.cc:  Likewise.
+ 	* testsuite/22_locale/ctype_wchar_t_members.cc:  Likewise.
+ 	* testsuite/22_locale/facet.cc:  Likewise.
+ 	* testsuite/22_locale/global_templates.cc:  Likewise.
+ 	* testsuite/22_locale/members.cc:  Likewise.
+ 	* testsuite/22_locale/numpunct_byname.cc:  Likewise.
+ 	* testsuite/22_locale/numpunct_char_members.cc:  Likewise.
+ 	* testsuite/22_locale/operators.cc:  Likewise.
+ 	* testsuite/22_locale/static_members.cc:  Likewise.
+ 	* testsuite/23_containers/bitset_ctor.cc:  Likewise.
+ 	* testsuite/23_containers/bitset_members.cc:  Likewise.
+ 	* testsuite/23_containers/bitset_shift.cc:  Likewise.
+ 	* testsuite/23_containers/vector_capacity.cc:  Likewise.
+ 	* testsuite/23_containers/vector_ctor.cc:  Likewise.
+ 	* testsuite/23_containers/vector_element_access.cc:  Likewise.
+ 	* testsuite/23_containers/vector_modifiers.cc:  Likewise.
+ 	* testsuite/24_iterators/istreambuf_iterator.cc:  Likewise.
+ 	* testsuite/24_iterators/iterator.cc:  Likewise.
+ 	* testsuite/24_iterators/ostreambuf_iterator.cc:  Likewise.
+ 	* testsuite/25_algorithms/binary_search.cc:  Likewise.
+ 	* testsuite/25_algorithms/copy.cc:  Likewise.
+ 	* testsuite/25_algorithms/heap.cc:  Likewise.
+ 	* testsuite/25_algorithms/lower_bound.cc:  Likewise.
+ 	* testsuite/25_algorithms/min_max.cc:  Likewise.
+ 	* testsuite/25_algorithms/partition.cc:  Likewise.
+ 	* testsuite/25_algorithms/rotate.cc:  Likewise.
+ 	* testsuite/25_algorithms/sort.cc:  Likewise.
+ 	* testsuite/26_numerics/c_math.cc:  Likewise.
+ 	* testsuite/26_numerics/complex_inserters_extractors.cc:  Likewise.
+ 	* testsuite/26_numerics/complex_value.cc:  Likewise.
+ 	* testsuite/27_io/filebuf.cc:  Likewise.
+ 	* testsuite/27_io/filebuf_members.cc:  Likewise.
+ 	* testsuite/27_io/filebuf_virtuals.cc:  Likewise.
+ 	* testsuite/27_io/fpos.cc:  Likewise.
+ 	* testsuite/27_io/fstream_members.cc:  Likewise.
+ 	* testsuite/27_io/ifstream_members.cc:  Likewise.
+ 	* testsuite/27_io/ios_base_callbacks.cc:  Likewise.
+ 	* testsuite/27_io/ios_base_members_static.cc:  Likewise.
+ 	* testsuite/27_io/ios_base_storage.cc:  Likewise.
+ 	* testsuite/27_io/ios_ctor.cc:  Likewise.
+ 	* testsuite/27_io/ios_init.cc:  Likewise.
+ 	* testsuite/27_io/ios_manip_basefield.cc:  Likewise.
+ 	* testsuite/27_io/ios_manip_fmtflags.cc:  Likewise.
+ 	* testsuite/27_io/ios_members.cc:  Likewise.
+ 	* testsuite/27_io/istream_extractor_arith.cc:  Likewise.
+ 	* testsuite/27_io/istream_extractor_char.cc:  Likewise.
+ 	* testsuite/27_io/istream_extractor_other.cc:  Likewise.
+ 	* testsuite/27_io/istream_manip.cc:  Likewise.
+ 	* testsuite/27_io/istream_seeks.cc:  Likewise.
+ 	* testsuite/27_io/istream_sentry.cc:  Likewise.
+ 	* testsuite/27_io/istream_unformatted.cc:  Likewise.
+ 	* testsuite/27_io/istringstream_members.cc:  Likewise.
+ 	* testsuite/27_io/narrow_stream_objects.cc:  Likewise.
+ 	* testsuite/27_io/ofstream_members.cc:  Likewise.
+ 	* testsuite/27_io/ostream_inserter_arith.cc:  Likewise.
+ 	* testsuite/27_io/ostream_inserter_char.cc:  Likewise.
+ 	* testsuite/27_io/ostream_inserter_other.cc:  Likewise.
+ 	* testsuite/27_io/ostream_manip.cc:  Likewise.
+ 	* testsuite/27_io/ostream_seeks.cc:  Likewise.
+ 	* testsuite/27_io/ostream_unformatted.cc:  Likewise.
+ 	* testsuite/27_io/ostringstream_members.cc:  Likewise.
+ 	* testsuite/27_io/streambuf.cc:  Likewise.
+ 	* testsuite/27_io/stringbuf.cc:  Likewise.
+ 	* testsuite/27_io/stringbuf_virtuals.cc:  Likewise.
+ 	* testsuite/27_io/stringstream.cc:  Likewise.
+ 	* testsuite/27_io/stringstream_members.cc:  Likewise.
+ 	* testsuite/27_io/wide_stream_objects.cc:  Likewise.
+ 
+ 2001-07-31  Loren J. Rittle  
+ 
+ 	* src/gen-num-limits.cc:  Use __LONG_LONG_MAX__.
+ 
+ 2001-07-30  Benjamin Kosnik  
+ 
+ 	* configure.target: Remove mips from cpu table.
+ 	* config/cpu/mips/bits/atomicity.h: Remove generic
+ 	versions. Comment sgidefs include.
+ 
+ 2001-07-25  H.J. Lu 
+ 
+ 	* configure.target (cpu_include_dir): Set to `config/cpu/mips'
+ 	for mips.
+ 
+ 	* config/cpu/mips/bits/atomicity.h: New.
+ 
+ 2001-07-25  Gabriel Dos Reis  
+ 
+ 	* acinclude.m4: CHECK_MATH_DECL_AND_LINKAGE for hypot, hypotf,
+ 	hypotl, atan2f, atan2l.  Remove from REPLACE_MATHFUNCS list.
+ 	* aclocal.m4: Regenerate.
+ 	* config.h.in: Likewise.
+ 	* configure: Likewise.
+ 	* libmath/Makefile.am (EXTRA_LONG_DOUBLE_yes): Remove hypotl.c
+ 	(EXTRA_DIST): Remove hypot.c hypotf.c.
+ 	* libmath/Makefile.am: Regenerate.
+ 	* libmath/hypotf.c: Remove.
+ 	* libmath/hypot.c: Likewise.
+ 	* libmath/hypotl.c: Likewise.
+ 	* libmath/stubs.c: The macros seen here are HAVE_xxx, not
+ 	_GLIBCPP_HAVE_xxx.  Add long double versions.
+ 
+ 2001-07-23  David Edelsohn  
+ 
+ 	* include/bits/limits_generic.h (int): Set digits and digits10
+ 	appropriately for word size.
+ 	(unsigned int,long,unsigned long): Likewise.
+ 
+ 2001-07-19  Peter Schmid  
+ 
+ 	* include/bits/stl_algo.h : Fix typos.
+ 	* testsuite/25_algorithms/unique.cc: New file.
+ 
+ 2001-07-19  Phil Edwards  
+ 	    Mark Mitchell 
+ 
+ 	Merge from cp-parser-branch.
+ 	* include/bits/basic_string.h:  Qualify symbols with 'template'.
+ 	* include/bits/basic_string.tcc:  Likewise.
+ 	* include/bits/fstream.tcc:  Likewise.
+ 	* include/bits/istream.tcc:  Likewise.
+ 	* include/bits/sstream.tcc:  Likewise.
+ 	* include/bits/std_istream.h:  Likewise.
+ 	* include/bits/stl_iterator.h:  Likewise.
+ 	* include/bits/streambuf.tcc:  Likewise.
+ 	* src/gen-num-limits.cc:  Add 'template<>' to specializations.
+ 	* src/locale.cc:  Likewise.
+ 
+ 2001-07-19  Gabriel Dos Reis  
+ 	    Bert De Knuydt 
+ 
+ 	* src/gen-num-limits.cc (set_signals_handler): New function.
+ 	Factor out signals setting.  Set signal handler for SIGILL.
+ 
+ 2001-07-18  Phil Edwards  
+ 
+ 	* docs/html/27_io/howto.html:  Fix typo.
+ 	* docs/html/faq/index.html:  Minor updates for 3.0 all around.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-07-18  Stephen M. Webb  
+ 	    Roman Sulzhyk  
+ 
+ 	libstdc++/3599
+ 	* include/bits/ostream.tcc (ostream::put): Fixed error condition check.
+ 	* testsuite/27_io/streambuf.cc (test07): Added new regression test.
+ 
+ 2001-07-17  Stephen M. Webb   r
+ 
+ 	All occurrences of the __value_type() and __distance_type()
+ 	functions, which were required to support the HP STL, have been
+ 	removed along with all the auxiliary forwarding functions that
+ 	were required to support their use.
+ 
+ 	The __iterator_category() function was pretty much left alone
+ 	because there was no benefit to removing it and its use made code
+ 	just a little more readable.
+ 
+ 	Incidences of distance() with nonstandard argument list were
+ 	replaced by calls to the standard function (only in the files
+ 	affected by the removal of the other HP functions).
+ 
+ 	The signature of the rotate() algorithm was changed to match the
+ 	standard.
+ 
+ 	Headers were reformatted under C++STYLE guidelines (indentation,
+ 	linebreaks, typename keyword).
+ 
+ 	* include/bits/stl_algo.h: replaced __value_type() and
+ 	__distance_type() with iterator_traits, eliminated auxiliary
+ 	support functions required to support said function usage.
+ 	Changed nonstandard distance() call to standard call.
+ 
+ 	* include/bits/stl_algobase.h: Same.
+ 	* include/bits/stl_heap.h: Same.
+ 	* include/bits/stl_numeric.h: Same.
+ 	* include/bits/stl_uninitialized.h: Same.
+ 	* include/bits/stl_iterator_base_types.h (__value_type()):
+ 	Removed.
+ 	(__distance_type()): Removed.
+ 	(value_type()): Gone.
+ 	(distance_type()): Done in.
+ 	(iterator_category()): Hasta la vista, baby.
+ 
+ 	* include/bits/stl_iterator_base_funcs.h (iterator_category()):
+ 	Replaced with __iterator_category().
+ 	* include/backward/iterator.h: moved definition of value_type(),
+ 	distance_type(), and iterator_category() out of std:: and into
+ 	here.
+ 	* testsuite/23_containers/vector_ctor.cc (test03): New testcases.
+ 	* testsuite/23_containers/vector_modifiers.cc (test03): New testcases.
+ 	* testsuite/25_algorithms/rotate.cc: New testcase.
+ 	* testsuite/25_algorithms/copy.cc: New testcase.
+ 	* testsuite/25_algorithms/sort.cc: Same.
+ 	* testsuite/25_algorithms/heap.cc: Same.
+ 	* testsuite/25_algorithms/partition.cc: Same.
+ 	* testsuite/25_algorithms/binary_search.cc: Same.
+ 	* testsuite/26_numerics/sum_diff.cc: Ditto.
+ 
+ 001-07-17  Benjamin Kosnik  
+ 
+ 	* testsuite/README: Add notes on naming test cases.
+ 	* testsuite/22_locale/members.cc: Mark as xfail.
+ 	* testsuite/22_locale/numpunct_char_members.cc: Same.
+ 
+ 2001-07-16  Stephen M. Webb  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CHEADERS):  Use glibcpp_srcdir when
+ 	setting C_INCLUDE_DIR.
+ 	* configure.in:  Revert yesterday's LN_S change.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate.
+ 
+ 2001-07-15  Phil Edwards  
+ 
+ 	* configure.in:  Temporarily force LN_S to copy instead of symlink.
+ 	* configure:  Regenerate.
+ 
+ 2001-07-13  Phil Edwards  
+ 
+ 	* include/bits/std_sstream.h (basic_stringbuf::basic_stringbuf(string):
+ 	Initialize _M_string with pointer-and-size constructor, not just
+ 	pointer.  Fix some comments.
+ 	* testsuite/21_strings/ctor_copy_dtor.cc (test03):  New test.
+ 	* testsuite/27_io/stringbuf.cc (test02):  Remove unused variable.
+ 	(test03):  Add embedded-NUL tests.
+ 
+ 	* mkcheck.in:  When printing totals, match the order of the tests.
+ 	* include/bits/stringfwd.h:  Use same declaration keywords.
+ 	* include/bits/std_iosfwd.h:  Cosmetic spacing.
+ 
+ 2001-07-13  Stephen M. Webb  
+ 	    Loren J. Rittle  
+ 	    Phil Edwards  
+ 
+ 	* include/Makefile.am:  New file encapsulating header generation rules.
+ 	* Makefile.am (SUBDIRS):  Prepend 'include' directory.
+ 	* acinclude.m4:  Moved/removed rules for building various headers.
+ 	* configure.in (AC_OUTPUT):  Add include/Makefile.
+ 	* mkc++config:  Removed.
+ 
+ 	* testsuite_flags.in:  Changed build-includes to match new scheme.
+ 	* mknumeric_limits:  Likewise.
+ 	* libio/Makefile.am:  Changed INCLUDES to maatch new header scheme.
+ 	* libmath/Makefile.am:  Likewise.
+ 	* libsupc++/Makefile.am:  Likewise.
+ 	* src/Makefile.am:  Likewise; removed rules to build headers.
+ 	* libmath/mathconf.h:  Changed #include'd header names to match.
+ 	* libmath/stubs.c:  Likewise.
+ 	* src/gen-num-limits.cc:  Likewise.
+ 
+ 	* configure:  Regenerated.
+ 	* config.h.in:  Regenerated.
+ 	* aclocal.m4:  Regenerated.
+ 	* Makefile.in:  Regenerated.
+ 	* include/Makefile.in:  Regenerated.
+ 	* libio/Makefile.in:  Regenerated.
+ 	* libmath/Makefile.in:  Regenerated.
+ 	* libsupc++/Makefile.in:  Regenerated.
+ 	* src/Makefile.in:  Regenerated.
+ 	* testsuite/Makefile.in:  Regenerated.
+ 
+ 2001-07-11   Felix Natter  
+ 
+ 	* docs/html/17_intro/porting-howto.xml:  Initial checkin of
+ 	master copy.
+ 	* docs/html/17_intro/porting-howto.html:  check in v0.9.3
+ 
+ 2001-07-11  Phil Edwards  
+ 
+ 	* docs/doxygen/run_doxygen:  Don't keep output from previous run.
+ 	* docs/doxygen/user.cfg.in:  Tweaks.
+ 	* include/bits/c++config:  Documentation comments for Doxygen.
+ 	* include/bits/char_traits.h:  Likewise.
+ 	* include/bits/limits_generic.h:  Likewise.
+ 	* include/bits/std_stdexcept.h:  Likewise.
+ 	* include/bits/stl_pair.h:  Likewise.
+ 	* libsupc++/exception:  Likewise.
+ 	* libsupc++/new:  Likewise.
+ 	* libsupc++/typeinfo:  Likewise.
+ 	* libmath/Makefile.am:  Update and correct copyright.
+ 
+ 2001-07-10  Gabriel Dos Reis  
+ 
+ 	* acinclude.m4: Don't AC_REPLACE_MATHFUNCS expf and atan2f.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Same.
+ 
+ 2001-07-09  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  Fix thinko.
+ 	* docs/html/27_io/howto.html:  Fix thinko and HTML markup.
+ 	* include/bits/stl_iterator.h:  Fix typo.
+ 
+ 2001-07-09  Phil Edwards  
+ 
+ 	* docs/html/explanations.html:  New file.
+ 	* docs/html/configopts.html:  Link to it to provide more notes
+ 	on cstdio.  Minor markup and spacing fixes.
+ 	* docs/html/27_io/howto.html:  Talk about sync_with_stdio.
+ 
+ 2001-07-09  Kriang Lerdsuwanakij  
+ 
+ 	* include/bits/valarray_meta.h (_Expr::operator+): Use qualified id
+ 	for _Expr template template argument.
+ 	(_Expr::operator-): Likewise.
+ 	(_Expr::operator~): Likewise.
+ 	(_Expr::operator!): Likewise.
+ 	(_DEFINE_EXPR_UNARY_OPERATOR): Likewise.
+ 
+ 2001-07-06  Gabriel Dos Reis  
+ 
+ 	* libmath/Makefile.am (EXTRA_DIST): Remove atan2f.c and expf.c
+ 	* libmath/Makefile.in: Regenerate.
+ 	* libmath/expf.c: Remove.
+ 	* libmath/atan2f.c: Likewise.
+ 
+ 2001-07-06  Daniel Jacobowitz  
+ 
+ 	* configure.in: Remove NATIVE, NULL_TARGET.
+ 	Set CANADIAN only for Canadian crosses.  Set xcompiling
+ 	for both Canadian crosses and host-x-host crosses.
+ 	* configure: Regenerated.
+ 
+ 2001-07-06  Peter Schmid  
+ 
+ 	* include/bits/stl_vector.h (vector::_M_initialize_aux): Fix typo.
+ 
+ 2001-07-05  Jason Merrill  
+ 
+ 	* testsuite_flags.in (--build-includes): backward, not backwards.
+ 
+ 2001-07-04  Jeffrey Oldham  
+ 
+ 	* include/ext/ropeimpl.h (_Rope_RopeRep::_M_free_c_string):
+ 	Replace destroy by _Destroy.
+ 	(_Rope_RopeRep::_S_free_string): Likewise.
+ 	(rope::c_str()): Likewise.
+ 	* include/ext/slist (_Slist_base::_M_erase_after>): Likewise.
+ 	(_Slist_base::_M_erase_after): Likewise.
+ 	(slist::_M_create_node): Replace construct by _Construct.
+ 	(slist::pop_front): Replace destroy by _Destroy.
+ 	* include/ext/stl_hashtable.h (hashtable::_M_new_node): Replace
+ 	construct by _Construct.
+ 	(hashtable::_M_delete_node): Replace destroy by _Destroy.
+ 	* include/ext/stl_rope.h (rope::rope): Replace construct by
+ 	_Construct.
+ 	(rope::copy): Replace destroy by _Destroy.
+ 
+ 2001-07-03  Benjamin Kosnik  
+ 
+ 	* include/bits/localefwd.h: Format.
+ 	* include/bits/locale_facts.tcc (locale::combine): Adjust.
+ 	* src/locale.cc (locale::locale::(_Impl)): Don't call
+ 	_M_add_reference.
+ 	(locale::facet::_M_remove_reference): Simplify.
+ 	* src/globals.cc (locale_impl_c): New. Format.
+ 	(locale_c): New.
+ 	* src/ios.cc (ios_base::Init::Init): Increment _S_ios_base_init last.
+ 
+ 2001-07-02  Loren J. Rittle  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Protect variable from shell
+ 	expansion (thanks to Alexandre Oliva).
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-07-02  Benjamin Kosnik  
+ 
+ 	* src/locale.cc (locale::locale(const char*)): Make sure global
+ 	locales are initialized.
+ 	* include/bits/locale_facets.tcc (locale::combine): Refcout should
+ 	be zero, not one as it's return-by-value.
+ 	* testsuite/27_io/ios_base_callbacks.cc (test01): Don't check for
+ 	named locales here.
+ 	* testsuite/22_locale/ctor_copy_dtor.cc (test01): Instead, check
+ 	for it here.
+ 	(test02): Add test.
+ 	* libsupc++/eh_alloc.cc: Use climits, not limits.h.
+ 
+ 2001-07-02  Loren J. Rittle  
+ 
+ 	libstdc++/3284
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Portability enhancement.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-07-02  Loren J. Rittle  
+ 
+ 	libstdc++/3243
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Add relative path to
+ 	staged/installed area to support -I-.  Document.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-07-02  Loren J. Rittle  
+ 
+ 	libstdc++/2211
+ 	* src/ios.cc (ios_base::Init::_S_ios_create): Rename __bufsize to
+ 	__out_bufsize.  Add __in_bufsize, document it and use it.
+ 
+ 2001-07-01  Stephen M. Webb 
+ 
+ 	* include/bits/stl_construct.h (construct): Remove.
+ 	(destroy): Remove.
+ 	(__destroy): Replaced by use of iterator_traits.
+ 	* include/bits/stl_deque.h: replaced HP iterator functions with
+ 	iterator_traits.
+ 	(construct): changed to _Construct.
+ 	(destroy): changed to _Destroy.
+ 	* include/bits/stl_tempbuf.h: Same.
+ 	* include/bits/stl_tree.h: Same.
+ 	* include/bits/stl_vector.h: Same.
+ 	* include/backward/iterator.h (construct): moved definition to here.
+ 	(destroy): Same.
+ 
+ 2001-06-29  Benjamin Kosnik  
+ 
+ 	* include/bits/locale_facets.tcc (locale::combine): Clone _Impl.
+ 	before replacing facet.
+ 	* include/bits/localefwd.h (locale::_Impl::_M_remove_reference):
+ 	Correct decrement.
+ 	* src/localename.cc (locale::_Impl): Correct ctor initialization
+ 	lists. Initialize ref count with one. Simplify.
+ 	* src/locale.cc: Add comment.
+ 	* testsuite/22_locale/numpunct.cc (test01): Add derivation test.
+ 	* testsuite/22_locale/numpunct_char_members.cc (test01): Add tests.
+ 	* testsuite/22_locale/members.cc (test02): Fix.
+ 
+ 2001-06-27  Phil Edwards  
+ 
+ 	* include/backward/algo.h:  Add "GPL plus runtime exception" comment
+ 	block, this time for real.
+ 	* include/backward/algobase.h:  Likewise.
+ 	* include/backward/alloc.h:  Likewise.
+ 	* include/backward/bvector.h:  Likewise.
+ 	* include/backward/defalloc.h:  Likewise.
+ 	* include/backward/deque.h:  Likewise.
+ 	* include/backward/function.h:  Likewise.
+ 	* include/backward/hash_map.h:  Likewise.
+ 	* include/backward/hash_set.h:  Likewise.
+ 	* include/backward/hashtable.h:  Likewise.
+ 	* include/backward/heap.h:  Likewise.
+ 	* include/backward/iterator.h:  Likewise.
+ 	* include/backward/list.h:  Likewise.
+ 	* include/backward/map.h:  Likewise.
+ 	* include/backward/multimap.h:  Likewise.
+ 	* include/backward/multiset.h:  Likewise.
+ 	* include/backward/pair.h:  Likewise.
+ 	* include/backward/rope.h:  Likewise.
+ 	* include/backward/set.h:  Likewise.
+ 	* include/backward/slist.h:  Likewise.
+ 	* include/backward/stack.h:  Likewise.
+ 	* include/backward/strstream:  Likewise.
+ 	* include/backward/tempbuf.h:  Likewise.
+ 	* include/backward/tree.h:  Likewise.
+ 	* include/backward/vector.h:  Likewise.
+ 	* include/bits/pthread_allocimpl.h:  Likewise.
+ 	* include/bits/std_algorithm.h:  Likewise.
+ 	* include/bits/std_bitset.h:  Likewise.
+ 	* include/bits/std_deque.h:  Likewise.
+ 	* include/bits/std_functional.h:  Likewise.
+ 	* include/bits/std_iterator.h:  Likewise.
+ 	* include/bits/std_list.h:  Likewise.
+ 	* include/bits/std_map.h:  Likewise.
+ 	* include/bits/std_memory.h:  Likewise.
+ 	* include/bits/std_numeric.h:  Likewise.
+ 	* include/bits/std_queue.h:  Likewise.
+ 	* include/bits/std_set.h:  Likewise.
+ 	* include/bits/std_stack.h:  Likewise.
+ 	* include/bits/std_utility.h:  Likewise.
+ 	* include/bits/std_vector.h:  Likewise.
+ 	* include/bits/stl_algo.h:  Likewise.
+ 	* include/bits/stl_algobase.h:  Likewise.
+ 	* include/bits/stl_alloc.h:  Likewise.
+ 	* include/bits/stl_bvector.h:  Likewise.
+ 	* include/bits/stl_construct.h:  Likewise.
+ 	* include/bits/stl_deque.h:  Likewise.
+ 	* include/bits/stl_function.h:  Likewise.
+ 	* include/bits/stl_heap.h:  Likewise.
+ 	* include/bits/stl_iterator.h:  Likewise.
+ 	* include/bits/stl_iterator_base_funcs.h:  Likewise.
+ 	* include/bits/stl_iterator_base_types.h:  Likewise.
+ 	* include/bits/stl_list.h:  Likewise.
+ 	* include/bits/stl_map.h:  Likewise.
+ 	* include/bits/stl_multimap.h:  Likewise.
+ 	* include/bits/stl_multiset.h:  Likewise.
+ 	* include/bits/stl_numeric.h:  Likewise.
+ 	* include/bits/stl_pair.h:  Likewise.
+ 	* include/bits/stl_pthread_alloc.h:  Likewise.
+ 	* include/bits/stl_queue.h:  Likewise.
+ 	* include/bits/stl_raw_storage_iter.h:  Likewise.
+ 	* include/bits/stl_relops.h:  Likewise.
+ 	* include/bits/stl_set.h:  Likewise.
+ 	* include/bits/stl_stack.h:  Likewise.
+ 	* include/bits/stl_tempbuf.h:  Likewise.
+ 	* include/bits/stl_threads.h:  Likewise.
+ 	* include/bits/stl_tree.h:  Likewise.
+ 	* include/bits/stl_uninitialized.h:  Likewise.
+ 	* include/bits/stl_vector.h:  Likewise.
+ 	* include/bits/type_traits.h:  Likewise.
+ 	* include/ext/hash_map:  Likewise.
+ 	* include/ext/hash_set:  Likewise.
+ 	* include/ext/rope:  Likewise.
+ 	* include/ext/ropeimpl.h:  Likewise.
+ 	* include/ext/slist:  Likewise.
+ 	* include/ext/stl_hash_fun.h:  Likewise.
+ 	* include/ext/stl_hashtable.h:  Likewise.
+ 	* include/ext/stl_rope.h:  Likewise.
+ 	* src/bitset.cc:  Likewise.
+ 	* src/strstream.cc:  Likewise.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 	                     
+ 
+ 	libstdc++/3272
+ 	* include/bits/streambuf.tcc (__copy_streambufs): Don't set eofbit.
+ 	* testsuite/27_io/ostream_inserter_other.cc (test04): Add test.
+ 	* testsuite/27_io/istream_extractor_other.cc: Fix.
+ 
+ 2001-06-26  Zoltan Hidvegi  
+ 
+ 	* acinclude.m4 (glibcpp_toolexeclibdir): Make multilib safe.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 
+ 	* include/bits/stream_iterator.h (istream_iterator): Add copy ctor.
+ 	(ostream_iterator): Same.
+ 	* include/bits/stl_iterator.h (front_insert_iterator::operator=):
+ 	Change argument to const_reference.
+ 	(back_insert_iterator): Same.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 
+ 	* include/bits/sbuf_iter.h: Change to..
+ 	* include/bits/streambuf_iterator.h: This.
+ 	* include/bits/stl_iterator.h: Take out of here...
+ 	* include/bits/stream_iterator.h: Add.
+ 	* src/Makefile.am (base_headers): Add streambuf_iterator,
+ 	stream_iterator.h
+ 	* src/Makefile.in: Regenerate.
+ 	* include/bits/std_string.h: Adjust includes.
+ 	* include/bits/basic_ios.h: Same.
+ 	* include/bits/locale_facets.tcc: Same.
+ 	* include/bits/std_iosfwd.h: Same.
+ 
+ 	* include/bits/std_iterator.h: Add istream, ostream includes.
+ 	* include/bits/stl_iterator.h: Tweak.
+ 	* testsuite/24_iterators/ostream_iterator.cc: Add test.
+ 	* testsuite/24_iterators/istream_iterator.cc: Same.
+ 	* testsuite/23_containers/multiset.cc: Add iterator include.
+ 
+ 2001-06-26  Phil Edwards  
+ 
+ 	* acinclude.m4:  Clean extraneous tabs, rewrap 'test' lines.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate.
+ 
+ 2001-06-26  Felix Natter  
+ 
+ 	* docs/html/17_intro/porting-howto.html:  Fixed some errors.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 
+ 	* include/bits/stl_iterator.h (istream_iterator::operator->): Fix
+ 	return values.
+ 	(istream_iterator::operator*): Same.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 	    Alexandre Petit-Bianco  
+ 
+ 	* testsuite/21_strings/element_access.cc (test01): Chill Out Cafe
+ 	is on 41st, not 14th.
+ 
+ 2001-06-26  Benjamin Kosnik  
+ 
+ 	* include/bits/std_iterator.h: Include sbuf_iter.h via std_ios.h.
+ 
+ 	* include/bits/stl_iterator.h (istream_iterator): Inherit from
+ 	iterator.
+ 	(ostream_iterator): Same.
+ 	* testsuite/24_iterators/istream_iterator.cc: New file.
+ 	* testsuite/24_iterators/ostream_iterator.cc: New file.
+ 
+ 	* include/bits/sbuf_iter.h: Remove self typedef.
+ 	* testsuite/24_iterators/ostreambuf_iterator.cc: Add test.
+ 	* testsuite/24_iterators/istreambuf_iterator.cc: Add test.
+ 
+ 	* include/bits/stl_iterator.h (reverse_iterator): Remove
+ 	extraneous typedefs. Add typename.
+ 	(__normal_iterator): Remove typedefs referring to self. Add typename.
+ 	(reverse_bidiretional_iterator): Remove, not longer required.
+ 
+ 2001-06-26  Gabriel Dos Reis  
+ 
+ 	* include/bits/stl_iterator.h (__normal_iterator<>): Qualify
+ 	dependent names with `typename'.  Bring in various required
+ 	iterator_traits members.  Can't imagine why that used to work.
+ 
+ 2001-06-25  Phil Edwards  
+ 	    Kurt Garloff 
+ 
+ 	PR libstdc++/3377
+ 	* src/cmath.cc:  New [version of an old] file; instantiate
+ 	__cmath_power to start with.
+ 	* src/Makefile.am (sources):  Add cmath.cc (and alphabetize).
+ 	* Makefile.in:  Regenerate.
+ 	* libio/Makefile.in:  Regenerate.
+ 	* libmath/Makefile.in:  Regenerate.
+ 	* libsupc++/Makefile.in:  Regenerate.
+ 	* src/Makefile.in:  Regenerate.
+ 	* testsuite/Makefile.in:  Regenerate.
+ 
+ 2001-06-24  Gabriel Dos Reis  
+ 
+ 	* libmath/stubs.c: Fix thinko.
+ 
+ 2001-06-24  David Edelsohn 
+ 
+ 	* libmath/stubs.c (sqrtf): Define.
+ 	(tanf): Correct typo.
+ 
+ 2001-06-22  Benjamin Kosnik  
+ 
+ 	* include/bits/stl_iterator.h (reverse_iterator): Inherit from
+ 	iterator.
+ 	(back_insert_iterator): Same.
+ 	(front_insert_iterator): Same.
+ 	(insert_iterator): Same.
+ 
+ 	* testsuite/20_util/raw_storage_iterator.cc: Modify.
+ 	* testsuite/24_iterators/reverse_iterator.cc: New file.
+ 	* testsuite/24_iterators/back_insert_iterator.cc: New file.
+ 	* testsuite/24_iterators/front_insert_iterator.cc: New file.
+ 	* testsuite/24_iterators/insert_iterator.cc: New file.
+ 
+ 2001-06-22  Phil Edwards  
+ 
+ 	* include/*:  Revert comment/license change from yesterday for all
+ 	except libsupc++/unwind-cxx.h.
+ 	* src/bitset.cc:  Likewise.
+ 	* src/strstream.cc:  Likewise.
+ 
+ 2001-06-22  Gabriel Dos Reis  
+ 
+ 	* libmath/stubs.c: New file.
+ 	(tanhf): Fix typo.
+ 	(powf): Likewise.
+ 
+ 	* libmath/Makefile.am (libmath_la_SOURCES): Add.
+ 	* libmath/Makefile.in.  Regenerate.
+ 
+ 2001-06-21  Phil Edwards  
+ 
+ 	* include/backward/algo.h:  Add "GPL plus runtime exception" comment.
+ 	* include/backward/algobase.h:  Likewise.
+ 	* include/backward/alloc.h:  Likewise.
+ 	* include/backward/bvector.h:  Likewise.
+ 	* include/backward/defalloc.h:  Likewise.
+ 	* include/backward/deque.h:  Likewise.
+ 	* include/backward/function.h:  Likewise.
+ 	* include/backward/hash_map.h:  Likewise.
+ 	* include/backward/hash_set.h:  Likewise.
+ 	* include/backward/hashtable.h:  Likewise.
+ 	* include/backward/heap.h:  Likewise.
+ 	* include/backward/iterator.h:  Likewise.
+ 	* include/backward/list.h:  Likewise.
+ 	* include/backward/map.h:  Likewise.
+ 	* include/backward/multimap.h:  Likewise.
+ 	* include/backward/multiset.h:  Likewise.
+ 	* include/backward/pair.h:  Likewise.
+ 	* include/backward/rope.h:  Likewise.
+ 	* include/backward/set.h:  Likewise.
+ 	* include/backward/slist.h:  Likewise.
+ 	* include/backward/stack.h:  Likewise.
+ 	* include/backward/strstream:  Likewise.
+ 	* include/backward/tempbuf.h:  Likewise.
+ 	* include/backward/tree.h:  Likewise.
+ 	* include/backward/vector.h:  Likewise.
+ 	* include/bits/pthread_allocimpl.h:  Likewise.
+ 	* include/bits/std_algorithm.h:  Likewise.
+ 	* include/bits/std_bitset.h:  Likewise.
+ 	* include/bits/std_deque.h:  Likewise.
+ 	* include/bits/std_functional.h:  Likewise.
+ 	* include/bits/std_iterator.h:  Likewise.
+ 	* include/bits/std_list.h:  Likewise.
+ 	* include/bits/std_map.h:  Likewise.
+ 	* include/bits/std_memory.h:  Likewise.
+ 	* include/bits/std_numeric.h:  Likewise.
+ 	* include/bits/std_queue.h:  Likewise.
+ 	* include/bits/std_set.h:  Likewise.
+ 	* include/bits/std_stack.h:  Likewise.
+ 	* include/bits/std_utility.h:  Likewise.
+ 	* include/bits/std_vector.h:  Likewise.
+ 	* include/bits/stl_algo.h:  Likewise.
+ 	* include/bits/stl_algobase.h:  Likewise.
+ 	* include/bits/stl_alloc.h:  Likewise.
+ 	* include/bits/stl_bvector.h:  Likewise.
+ 	* include/bits/stl_construct.h:  Likewise.
+ 	* include/bits/stl_deque.h:  Likewise.
+ 	* include/bits/stl_function.h:  Likewise.
+ 	* include/bits/stl_heap.h:  Likewise.
+ 	* include/bits/stl_iterator.h:  Likewise.
+ 	* include/bits/stl_iterator_base_funcs.h:  Likewise.
+ 	* include/bits/stl_iterator_base_types.h:  Likewise.
+ 	* include/bits/stl_list.h:  Likewise.
+ 	* include/bits/stl_map.h:  Likewise.
+ 	* include/bits/stl_multimap.h:  Likewise.
+ 	* include/bits/stl_multiset.h:  Likewise.
+ 	* include/bits/stl_numeric.h:  Likewise.
+ 	* include/bits/stl_pair.h:  Likewise.
+ 	* include/bits/stl_pthread_alloc.h:  Likewise.
+ 	* include/bits/stl_queue.h:  Likewise.
+ 	* include/bits/stl_raw_storage_iter.h:  Likewise.
+ 	* include/bits/stl_relops.h:  Likewise.
+ 	* include/bits/stl_set.h:  Likewise.
+ 	* include/bits/stl_stack.h:  Likewise.
+ 	* include/bits/stl_tempbuf.h:  Likewise.
+ 	* include/bits/stl_threads.h:  Likewise.
+ 	* include/bits/stl_tree.h:  Likewise.
+ 	* include/bits/stl_uninitialized.h:  Likewise.
+ 	* include/bits/stl_vector.h:  Likewise.
+ 	* include/bits/type_traits.h:  Likewise.
+ 	* include/ext/hash_map:  Likewise.
+ 	* include/ext/hash_set:  Likewise.
+ 	* include/ext/rope:  Likewise.
+ 	* include/ext/ropeimpl.h:  Likewise.
+ 	* include/ext/slist:  Likewise.
+ 	* include/ext/stl_hash_fun.h:  Likewise.
+ 	* include/ext/stl_hashtable.h:  Likewise.
+ 	* include/ext/stl_rope.h:  Likewise.
+ 	* libsupc++/unwind-cxx.h:  Likewise.
+ 	* src/bitset.cc:  Likewise.
+ 	* src/strstream.cc:  Likewise.
+ 
+ 2001-06-21  Gabriel Dos Reis  
+ 
+ 	* include/bits/indirect_array.h (indirect_array<>::operator=):
+ 	Make copy and assignment operator public.  Implement.  Format.
+ 
+ 	* include/bits/valarray_array.h (__valarray_copy): Add overloads
+ 	for copy between index arrays.  Format.
+ 
+ 2001-06-19  Benjamin Kosnik  
+ 
+ 	* mknumeric_limits: Add static definitions, format.
+ 	* testsuite/18_support/numeric_limits.cc (test02): Add test.
+ 
+ 	* include/c_std/bits/std_cwchar.h: Include ctime.
+ 	* testsuite/17_intro/header_cwchar.cc : Check.
+ 
+ 	* include/c_std/bits/std_cwctype.h: Inject wctype.
+ 	* testsuite/17_intro/header_cwctype.cc: Update.
+ 
+ 2001-06-18  Benjamin Kosnik  
+ 
+ 	* include/bits/stl_raw_storage_iter.h: Format. Correct derivation.
+ 	* testsuite/20_util/raw_storage_iterator.cc: Same.
+ 
+ 	* include/bits/stl_alloc.h (_S_chunk_alloc): Change malloc to
+ 	operator new.
+ 	(__mem_interface): New typedef for switching between malloc and new.
+ 	* testsuite/20_util/allocator_members.cc: New file.
+ 
+ 	* testsuite/20_util/comparisons.cc: New file.
+ 	* testsuite/20_util/pairs.cc: New file.
+ 
+ 2001-06-15  Phil Edwards  
+ 
+ 	* docs/html/documentation.html:  Point to new doxygen'ed collection.
+ 
+ 2001-06-14  Nathan Sidwell  
+ 
+ 	* configure.in (auxdir): Replace by ...
+ 	(toprel): ... new variable.
+ 	(toplevel_srcdir): Construct from $toprel.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Use $toprel
+ 	rather than .. to locate gcc source directory.
+ 	(GLIBCPP_CONFIGURE): Replace $auxdir with $srcdir/$toprel.
+ 	* aclocal.m4, configure: Rebuilt.
+ 
+ 2001-06-13  John David Anglin  
+ 
+ 	(Approved by Mark and Benjamin.  Applied by Loren.)
+ 
+ 	* src/globals.cc: Define globals _GLIBCPP_mutex_init (),
+ 	_GLIBCPP_mutex_address_init (), _GLIBCPP_once, _GLIBCPP_mutex
+ 	and _GLIBCPP_mutex_address.
+ 	* include/bits/stl_threads.h (_STL_mutex_lock): Use above to provide
+ 	once-only runtime initialization of _M_lock mutex when
+ 	__GTHREAD_MUTEX_INIT_FUNCTION is defined.
+ 	(__STL_MUTEX_INITIALIZER): Provide initializer for _STL_mutex_lock
+ 	for __GTHREAD_MUTEX_INIT_FUNCTION case.
+ 
+ 2001-06-13  Gabriel Dos Reis  
+ 
+ 	* testsuite/26_numerics/slice_array_assignment.cc (main): New test.
+ 
+ 	* include/bits/slice_array.h (slice_array<>::operator=): Make
+ 	public and implement.
+ 	(slice_array<>::slice_array): Make copy-constructor public.
+ 
+ 	* include/bits/valarray_array.h (__valarray_copy): Add another
+ 	overload to copy between strided arrays.
+ 
+ 2001-06-13  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE): Bump version to 3.0.0.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* include/bits/c++config (__GLIBCPP__): Update date.
+ 
+ 2001-06-12  Benjamin Kosnik  
+ 
+ 	* include/bits/fpos.h (fpos::operator-): Don't return reference,
+ 	return original, non-modified version.
+ 	(fpos::operator+): Same.
+ 	* testsuite/27_io/fpos.cc: Add test.
+ 
+ 2001-06-12  Loren J. Rittle  
+ 
+ 	libstdc++/2071
+ 	* porting.texi: Add documentation about libstdc++-v3-specific
+ 	macros that are currently included in os_defines.h files.
+ 
+ 	* config/basic_file_stdio.h (sys_getc): New method.
+ 	(sys_ungetc): New method.
+ 	* include/bits/basic_file.h: (sys_getc): New method signature.
+ 	(sys_ungetc): New method signature.
+ 
+ 	* include/bits/fstream.tcc (underflow): Add conditional code
+ 	paths which avoid using short seeks on streams (especially
+ 	useful when the stream might be interactive or a pipe).  At
+ 	the moment, this alternate path only avoids seeking when the
+ 	``buffer size'' of underflow() is 1 since the C standard only
+ 	guarantees buffer space for one ungetc (this technique could
+ 	be extended since *-*-solaris* supports buffering for 4 calls
+ 	to ungetc and *-*-*bsd* supports buffering limited only by
+ 	memory resources).  Also, _GLIBCPP_AVOID_FSEEK must be defined
+ 	in a port's os_defines.h file for this alternate path to even
+ 	be considered.  As a bonus, the idiom of using getc/ungetc
+ 	requires no system calls whereas fseek maps to one or two
+ 	system call(s) on many platforms.
+ 
+ 	* config/os/bsd/freebsd/bits/os_defines.h (_GLIBCPP_AVOID_FSEEK):
+ 	Define it.
+ 	* config/os/solaris/solaris2.5/bits/os_defines.h
+ 	(_GLIBCPP_AVOID_FSEEK): Likewise.
+ 	* config/os/solaris/solaris2.6/bits/os_defines.h
+ 	(_GLIBCPP_AVOID_FSEEK): Likewise.
+ 	* config/os/solaris/solaris2.7/bits/os_defines.h
+ 	(_GLIBCPP_AVOID_FSEEK): Likewise.
+ 
+ 2001-06-12  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_COMPILER_VERSION): Change to
+ 	AC_TRY_COMPILE, so that the built compiler is checked, and
+ 	bootstraps or cross compiles with an older compile still work.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-06-12  Benjamin Kosnik  
+ 
+ 	libstdc++/3142
+ 	* include/bits/std_sstream.h: Add allocator_type, as per DR 251.
+ 
+ 	libstdc++/3141
+ 	* include/bits/istream.tcc (getline, get): Fix as per DR 243.
+ 
+ 	libstdc++/3140
+ 	* include/bits/std_bitset.h (bitset::set): Fix as per DR 186.
+ 
+ 	libstdc++/3139
+ 	* include/bits/limits_generic.h: Fix as per DR 184.
+ 
+ 2001-06-11  Benjamin Kosnik  
+ 
+ 	libstdc++/3126
+ 	* include/bits/basic_string.h (string::compare): Adjust signatures
+ 	as per DR 5.
+ 	* include/bits/basic_string.tcc: And here.
+ 
+ 	libstdc++/2346
+ 	* config/c_io_stdio.h: Remove whitespace.
+ 	* testsuite/27_io/istream_seeks.cc (test03): Add regression.
+ 	(test02): Add regression.
+ 	* testsuite/27_io/istream_seeks-3.tst: New file.
+ 
+ 2001-06-11  Phil Edwards  
+ 
+ 	* README:  Update to reflect reality.
+ 	* acinclude.m4:  Update descriptions, fix typos.  Comment changes only.
+ 	* configure.in:  Make certain target_alias is set and subst'd for 2.50.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate (with 2.13).
+ 
+ 2001-06-11  Benjamin Kosnik  
+ 
+ 	libstdc++/3114
+ 	* include/bits/ostream.tcc (ostream::seekp): Add error checking as
+ 	per DR 129.
+ 	* include/bits/istream.tcc (istream::seekg): Same.
+ 	* testsuite/27_io/istream_seeks.cc: Fix.
+ 
+ 	libstdc++/3113
+ 	* include/bits/stl_function.h (binder2nd): Fix as per DR 109.
+ 	(binder1st): Same.
+ 	* include/bits/std_queue.h: Add c++config.h.
+ 	* testsuite/20_util/binders.cc: New test.
+ 
+ 2001-06-11  Matthias Klose  
+ 	    Phil Edwards  
+ 
+ 	* docs/doxygen/run_doxygen (find_doxygen):  Tweak version check.
+ 	(main script):  Echo more information.
+ 
+ 2001-06-10  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cwchar.h: Alphabetize.
+ 	* include/bits/char_traits.h: Tweak.
+ 	* acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Check for
+ 	everything used by std_cwchar.h.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Regenerate.
+ 	* config.h.in: Regenerate.
+ 
+ 2001-06-10  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_C99): Add stdio.h checking.
+ 	Add checking for strtof, _Exit in stdlib.h
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Regenerate.
+ 	* include/c_std/bits/std_cstdio.h: Alphabetize lists.
+ 	(snprintf): Put C99 functions into __gnu_cxx namespace.
+ 	(vfscanf): Same.
+ 	(vscanf): Same.
+ 	(vsnprintf): Same.
+ 	(vsscanf): Same.
+ 	* include/c_std/bits/std_cstdlib.h: Alphabetize lists. Put undefs
+ 	for C99 functions within _GLIBCPP_USE_C99 guard.
+ 	(_Exit): Same.
+ 	(strtof): Same.
+ 	(strtold): Same.
+ 	* include/bits/locale_facets.tcc: Check if C99 is enabled.
+ 	* include/c_std/bits/std_cwchar.h (__gnu_cxx): Put undefs within
+ 	C99 guard.
+ 	* include/c_std/bits/cmath.tcc: Formatting tweak.
+ 	* include/c_std/bits/std_cmath.h: Same.
+ 
+ 2001-06-10  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cstdio.h: Include cstddef for size_t.
+ 
+ 2001-06-09  Alexandre Oliva  
+ 	    Stephen L Moshier  
+ 
+ 	* acinclude.m4 (AC_EXEEXT): Work around in case it expands to
+ 	nothing, as in autoconf 2.50.
+ 	* configure: Rebuilt.
+ 
+ 2001-06-09  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cwchar.h: Remove size_t injection,
+ 	include std_cstddef.
+ 	* include/c_std/bits/std_ctime.h: Same.
+ 	* include/c_std/bits/std_cstring.h: Same.
+ 	* include/c_std/bits/std_cstdlib.h: Same.
+ 
+ 	* include/c_std/bits/std_cstdio.h: Remove vsnprintf, snprintf.
+ 	* include/c_std/bits/std_cctype.h: Remove isblank.
+ 
+ 2001-06-09  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Check for fgetwc,
+ 	fgetws.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* include/c_std/bits/std_cwchar.h: Remove duplicate fgetwc
+ 	injection, guard fgetwc, fgetws.
+ 	* include/c_std/bits/std_cstdio.h: Remove superfluous includes.
+ 	* include/c_std/bits/std_clocale.h: And here.
+ 	* include/c_std/bits/std_cctype.h: And here.
+ 	* include/c_std/bits/std_cstdlib.h (strtof): Guard strtof injection.
+ 
+ 	* config/basic_file_stdio.h: Don't include unistd.h.
+ 	* config/c_io_stdio.h: Don't use compatibility headers.
+ 	* libsupc++/eh_terminate.cc: Qualify abort.
+ 	(__terminate): And here.
+ 	* libsupc++/eh_catch.cc (__cxa_end_catch): Qualify abort.
+ 
+ 2001-06-08  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cstdlib.h: Remove _Exit, strtof injections.
+ 
+ 2001-06-08  Benjamin Kosnik  
+ 
+ 	libstdc++/2767
+ 	libstdc++/2989
+ 	libstdc++/2992
+ 	* include/std/*: Add copyright notice.
+ 	* include/c_std/bits/*: Use using statements instead of extern "C".
+ 	* include/c_std/bits/std_cmath.h: Don't overload double versions
+ 	of math functions with __buitin versions, use global version to
+ 	prevent ambiguities. Remove define hacks.
+ 	* include/c_std/bits/std_cwchar.h: Using declarations for "C"
+ 	functions that have changed signatures and std::
+ 	declarations. Remove define hacks.
+ 	* include/c_std/bits/std_cwchar.h: Same, plus remove ambiguous
+ 	__builtins in std::. Remove define hacks.
+ 	* testsuite/17_intro/headers_c.cc: Add tests.
+ 	* testsuite/17_intro/headers_c++.cc: Add test.
+ 
+ 2001-06-07  Loren J. Rittle  
+ 	    John David Anglin  
+ 
+ 	c++/3082
+ 	* libsupc++/eh_alloc.cc: Ensure that required macros are
+ 	defined before including gthr.h.  Ensure that we get the
+ 	version of gthr.h for which we know how to provide a
+ 	configuration.
+ 	* libsupc++/eh_globals.cc: Likewise.  And, bring the threading
+ 	code path into line with the current EH model.  Use std, where
+ 	appropriate.
+ 
+ 2001-06-07  Loren J. Rittle  
+ 	    John David Anglin  
+ 
+ 	* config/threads-no.h: Remove file.
+ 	* config/threads-posix.h: Remove file.
+ 
+ 	* acconfig.h (_GLIBCPP_USE_THREADS): Remove.
+ 	(_GLIBCPP_SUPPORTS_WEAK): Add (required by namespace-clean gthr*.h).
+ 	(_GLIBCPP_HAVE_GTHR_DEFAULT): Likewise.
+ 	* config.h.in: Regenerate.
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Completely rework to
+ 	setup and use gthr*.h files.  In particular, make gthr.h files
+ 	namespace-clean in the staging area (they don't have to be for
+ 	libgcc.a).
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 	* src/Makefile.am (build_headers): Remove bits/c++threads.h
+ 	and add bits/gthr.h bits/gthr-single.h bits/gthr-default.h.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* include/bits/c++config: Cleanup threading configuration macros.
+ 	In particular, define __STL_GTHREADS macro which controls...
+ 	* include/bits/stl_threads.h: ...a brand new gthr.h-based
+ 	configuration here.
+ 
+ 	* config/c_io_stdio.h: Include staged gthr.h instead of local
+ 	thread configuration file.  Always use __gthread_mutex_t
+ 	instead of __mutext_type (or int).
+ 	* include/bits/std_fstream.h: Likewise.
+ 
+ 	* docs/html/17_intro/howto.html: Remove placeholder comment in
+ 	case this configuration patch didn't make it.  Add advice that
+ 	section only applies if configured with --enable-threads.
+ 	* docs/html/23_containers/howto.html: Reword to make clear
+ 	that _PTHREADS is no longer required for any port to be
+ 	correctly using STL with threads.  Add advice that section
+ 	only applies if configured with --enable-threads.
+ 
+ 2001-06-06  Benjamin Kosnik  
+ 
+ 	* src/string-inst.cc (_Rep::_S_max_size): Add instantiation.
+ 
+ 2001-06-05  Benjamin Kosnik  
+ 
+ 	libstdc++/3045
+ 	* include/bits/basic_ios.tcc: Formatting tweaks.
+ 	* include/bits/ios_base.h: Formatting tweaks.
+ 	* src/ios.cc (ios_base::Init::_S_ios_create): Use filebufs here.
+ 	(ios_base::Init::_S_ios_destroy): ..and here. Explicitly call dtors.
+ 	* src/globals.cc: Allocate filebufs for standard streams here.
+ 	(buf_cout, buf_cin, buf_cerr): Like so.
+ 	(buf_wcout, buf_wcin, buf_wcerr): And so.
+ 	* testsuite/27_io/ios_init.cc: Add.
+ 
+ 2001-06-04  Brendan Kehoe  
+ 	    Benjamin Kosnik  
+ 
+ 	libstdc++/3017
+ 	* include/bits/locale_facets.h (ctype<_CharT>): Add definitions
+ 	for generic ctype virtuals.
+ 	* src/locale.cc: Minor tweaks, naming consistency.
+ 	* testsuite/22_locale/ctype.cc: Add test.
+ 
+ 2001-06-04  Kenny Simpson 
+ 	    Phil Edwards  
+ 
+ 	PR libstdc++/3035 and PR libstdc++/3036
+ 	* include/bits/stl_pair.h:  Fix pair ctor and make_pair according
+ 	to LWG DR 181 and 265.
+ 
+ 2001-06-04  Phil Edwards  
+ 
+ 	PR libstdc++/3034
+ 	* include/bits/stl_multiset.h (find, lower_bound, upper_bound,
+ 	equal_range):  Add const overloads as per LWG DR 214.
+ 	* include/bits/stl_set.h:  Likewise.
+ 
+ 2001-06-04  Brendan Kehoe  
+ 	    Phil Edwards  
+ 
+ 	PR libstdc++/3018
+ 	* include/bits/std_bitset.h (bitset::test):  Fix __pos >= _Nb
+ 	comparison; all positions must be < _Nb.
+ 	* testsuite/23_containers/bitset_members.cc:  New file.
+ 
+ 2001-06-04  Brendan Kehoe  
+ 
+ 	PR libstdc++/3016
+ 	* include/bits/stl_queue.h (classes queue, priority_queue):  Fix
+ 	ctors to match the standard.
+ 
+ 2001-06-04  Jeffrey Oldham  
+ 
+ 	* include/bits/char_traits.h (move): Reverse qualification of
+ 	memmove with std::.
+ 	(copy): Reverse qualification of memcpy with std::.
+ 
+ 2001-06-04  Jeffrey Oldham  
+ 
+ 	* include/bits/char_traits.h (move): Qualify memmove with std::.
+ 	(copy): Qualify memcpy with std::.
+ 	* testsuite/27_io/filebuf_virtuals.cc (test01): Qualify strlen and
+ 	strncmp with std::.
+ 	(test02): Likewise.
+ 	* testsuite/27_io/stringbuf_virtuals.cc (test01): Likewise.
+ 
+ 2001-06-04  Hans-Peter Nilsson  
+ 
+ 	* libsupc++/Makefile.am (install-glibcppinstallHEADERS,
+ 	uninstall-glibcppinstallHEADERS): Have explicit rules catering to
+ 	SUN make VPATH peculiarities.
+ 	* libsupc++/Makefile.in: Regenerate.
+ 
+ 2001-06-01  Hans-Peter Nilsson  
+ 
+ 	* src/Makefile.am (VPATH): Delimit with ":", not space.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* configure.in (use of GLIBCPP_CHECK_GNU_MAKE): Don't fail if GNU
+ 	make isn't found.
+ 	* configure: Regenerate.
+ 
+ 2001-05-31  scott snyder  
+ 
+ 	libstdc++/2976
+ 	* include/bits/istream.tcc: Include std_ostream.h.
+ 
+ 2001-05-31  Benjamin Kosnik  
+ 
+ 	libstdc++/2997
+ 	* src/bitset.cc: Qualify size_t with std::.
+ 
+ 2001-05-30  Benjamin Kosnik  
+ 
+ 	* acconfig.h (_GLIBCPP_BUGGY_FLOAT_COMPLEX): Remove.
+ 	(_GLIBCPP_BUGGY_COMPLEX): Remove.
+ 	* config.h.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_CHECK_COMPLEX_MATH_COMPILER_SUPPORT): Remove.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Don't call it.
+ 	* configure: Regenerate.
+ 
+ 	libstdc++/2970
+ 	* src/complex_io.cc (operator<<(ostream&, const complex&): Fix.
+ 	* testsuite/26_numerics/complex_inserters_extractors.cc (test01):
+ 	New test.
+ 
+ 	libstdc++/2985
+ 	* include/bits/std_complex.h: Include sstream. Put definitions for
+ 	complex inserters and extractors here, and remove them from...
+ 	* src/complex_io.cc: ...here.
+ 	* include/bits/basic_ios.h (basic_ios::__numput_type): Add _Traits
+ 	parameter.
+ 	(basic_ios::__numget_type): Same.
+ 	* include/bits/std_istream.h: Same.
+ 	* include/bits/std_ostream.h: Same.
+ 	* include/bits/sbuf_iter.h (ostreambuf_iterator): Fix typo in base
+ 	class iterator template arguments.
+ 	* src/locale-inst.cc: Add explicit has_facet instantiations.
+ 	* include/bits/basic_ios.h (basic_ios::_M_get_fctype_ios): Remove.
+ 	(_M_get_fnumput): Remove.
+ 	(_M_get_fnumget): Remove.
+ 	(basic_ios::_M_check_facet): New function.
+ 	(basic_ios::_M_cache_facets): New function.
+ 	* include/bits/basic_ios.tcc: Definition for _M_cache_facets.
+ 	(basic_ios::imbue): Call _M_cache_facets.
+ 	(basic_ios::init): Same.
+ 	* include/bits/istream.tcc: Format, use _M_check_facet.
+ 	* include/bits/ostream.tcc: Same.
+ 	* include/bits/locale_facets.tcc (__output_float): Change
+ 	signature, add _Traits.
+ 	* testsuite/26_numerics/complex_inserters_extractors.cc (test02):
+ 	New test.
+ 
+ 2001-05-30  Loren J. Rittle  
+ 
+ 	* include/bits/c++config (__USE_MALLOC): Do not define it.
+ 	Document why not and give pointers to more information.
+ 
+ 	* docs/html/23_containers/howto.html: Update documentation
+ 	to reflect recent understanding of problem.
+ 	* docs/html/17_intro/howto.html: Likewise.
+ 
+ 2001-05-30  Phil Edwards  
+ 
+ 	* docs/doxygen/user.cfg.in:  Minor addition.
+ 	* docs/html/documentation.html:  Reorganize.  Put most-looked-at
+ 	stuff first.
+ 	* docs/html/install.html:  Update for 3.0.  HTML fixups.
+ 	* docs/html/17_intro/howto.html:  Likewise.
+ 	* docs/html/18_support/howto.html:  Likewise.
+ 	* docs/html/19_diagnostics/howto.html:  Likewise.
+ 	* docs/html/20_util/howto.html:  Likewise.
+ 	* docs/html/23_containers/howto.html:  Likewise.
+ 	* docs/html/24_iterators/howto.html:  Likewise.  More notes.
+ 	* docs/html/25_algorithms/howto.html:  Likewise.
+ 	* docs/html/26_numerics/howto.html:  Likewise.  More notes.
+ 	* docs/html/27_io/howto.html:  Likewise.
+ 	* docs/html/ext/howto.html:  Likewise.
+ 	* docs/html/faq/index.html:  Likewise.
+ 	* docs/html/faq/index.txt:  Regenerate.
+ 	* docs/html/27_io/iostreams_hierarchy.pdf:  Remove in favor of
+ 	Doxygen-created documentation.
+ 
+ 2001-05-30  Rainer Orth  
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Use
+ 	get_multilibs to find gcc.
+ 
+ 2001-05-30  Phil Edwards  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_C99):  Reorder output messages.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate.
+ 
+ 2001-05-29  Gabriel Dos Reis  
+ 
+ 	* include/c_std/bits/std_cstdlib.h:: Move C99 thingies to __gnu_cxx::.
+ 	* include/c_std/bits/std_cwchar.h (__gnu_cxx): Likewise.
+ 
+ 2001-05-27  Gabriel Dos Reis  
+ 
+ 	* include/c_std/bits/std_cmath.h: Move C99 functions in __gnu_cxx::.
+ 	* include/c_std/bits/std_cstdlib.h: Same.
+ 	* include/c_std/bits/std_cwchar.h: Same.
+ 
+ 2001-05-30  Loren J. Rittle  
+ 
+ 	* docs/html/17_intro/howto.html: Update link.
+ 	* docs/html/23_containers/howto.html: Likewise.  Add new link.
+ 
+ 2001-05-26  Gabriel Dos Reis  
+ 
+ 	* include/c_std/bits/std_cmath.h (sqrt): #undef.
+ 
+ 2001-05-23  Rainer Orth  
+ 
+ 	* mknumeric_limits: Stop if gen-num-limits dies.
+ 
+ 2001-05-25  Benjamin Kosnik  
+ 
+ 	other/2931
+ 	* acinclude.m4 (GLIBCPP_ENABLE_C99): Use AC_TRY_COMPILE.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Same.
+ 
+ 2001-05-24  Rainer Orth  
+ 	    Phil Edwards  
+ 	    Alexandre Oliva  
+ 
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Set glibcpp_srcdir
+ 	in an amd-safe manner. Revert glibcpp_prefixdir.
+ 
+ 2001-05-25  Gabriel Dos Reis  
+ 
+ 	* include/c_std/bits/std_cmath.h: Tweak.  #define away abs, cos,
+ 	fabs, sin, sqrt.  They are now implemented in terms of __builtin_
+ 	variants.
+ 
+ 2001-05-24  Benjamin Kosnik  
+ 
+ 	libstdc++/2830
+ 	* testsuite/21_strings/inserters_extractors.cc (test09): New test.
+ 	* include/bits/ostream.tcc: Format to match istream.tcc.
+ 	(operator<<(basic_ostream __out, const basic_string __s)): Fix.
+ 
+ 2001-05-24  Phil Edwards  
+ 
+ 	* libsupc++/eh_alloc.cc (__cxa_allocate_exception):  Qualify
+ 	malloc with std:: .
+ 	(__cxa_free_exception):  Likewise with free.
+ 
+ 2001-05-24  Mark Mitchell  
+ 
+ 	* include/c_std/bin/std_cstring.h: #define away all global
+ 	functions we will redeclare in namespace `std'.
+ 	* libsupc++/eh_alloc.cc (__cxa_allocate_exception): Use
+ 	std::memset, instead of memset.
+ 	* testsuite/19_diagnostics/stdexceptions.cc: Use `std::strcmp',
+ 	not plain `strcmp'.
+ 	* testsuite/21_strings/c_strings.cc: Use `std::strcpy' instead of
+ 	plain `strcpy'.
+ 
+ 2001-05-24  Benjamin Kosnik  
+ 
+ 	libstdc++/2832
+ 	* include/bits/basic_ios.tcc: Small tweak.
+ 	* include/bits/std_fstream.h (ifstream): Add buffer member. Adjust
+ 	ctors and dtors, and rdbuf settings.
+ 	(ofstream): Same.
+ 	(fstream): Same.
+ 	* include/bits/std_sstream.h: Same, but for stringstream classes.
+ 	* testsuite/27_io/ostringstream_members.cc: New.
+ 	* testsuite/27_io/stringstream_members.cc: New.
+ 	* testsuite/27_io/fstream_members.cc: New.
+ 	* testsuite/27_io/ifstream_members.cc: Add test.
+ 	* testsuite/27_io/istringstream_members.cc: Add test.
+ 	* testsuite/27_io/ofstream_members.cc: Add test.
+ 
+ 2001-05-24  Gabriel Dos Reis  
+ 
+ 	* include/bits/c++config(__NO_MATH_INLINES): Move to...
+ 	* config/os/gnu-linux/bits/os_defines.h: ...here.
+ 
+ 2001-05-24  Gabriel Dos Reis  
+ 
+ 	* include/bits/c++config (__NO_MATH_INLINES): New macro.
+ 	* testsuite/26_numerics/fabs_inline.cc (main): New test.
+ 
+ 2001-05-22  Benjamin Kosnik  
+ 
+ 	libstdc++/2841
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Set
+ 	ld_library_path.
+ 	(libstdc++-v3_set_ld_library_path): New, copied from g++.exp.
+ 	(libstdc++-v3-finish): Remove.
+ 	(libstdc++-v3_exit): Remove.
+ 
+ 2001-05-22  Phil Edwards  
+ 
+ 	* docs/html/documentation.html:  Point to doxygen output.
+ 
+ 2001-05-21  Benjamin Kosnik  
+ 
+ 	* mkcheck.in (static_fail): Remove S_FLAG decoration on output.
+ 
+ 	* include/bits/std_sstream.h (stringbuf::setbuf): Require both
+ 	arguments to be non-null.
+ 	* include/bits/fstream.tcc (filebuf::_M_allocate_buffers): Only
+ 	try allocations if allocated size is greater than zero.
+ 	(filebuf::_M_filebuf_init): Change to
+ 	(filebuf::_M_allocate_file): Which is what it does now.
+ 	(filebuf::_M_allocate_bufers): Change to
+ 	(filebuf::_M_allocate_internal_buffer): This, and create
+ 	(filebuf::_M_allocate_pback_buffer): New.
+ 	(filebuf::_M_destroy_internal_buffer): New.
+ 	(filebuf::_M_buf_allocated): New data member.
+ 	(filebuf::setbuf): Use new logic, allow use of external buffer.
+ 	* testsuite/27_io/stringbuf_virtuals.cc: New file.
+ 	* testsuite/27_io/filebuf_virtuals.cc: New file.
+ 
+ 2001-05-21  Stephen M. Webb  
+ 
+ 	* include/c_std/bits/std_cstring.h (memchr): Define "C" functions to
+ 	__glibcpp_memchr.
+ 	(strchr): Same, but to __glibcpp_strchr.
+ 	(strpbrk): Same.
+ 	(strrchr): Same.
+ 	(strstr): Same.
+ 	* include/c_std/bits/std_cwchar.h (wcschr): Same.
+ 	(wcsbrk): Same.
+ 	(wcsrchr): Same.
+ 	(wcsstr): Same.
+ 	(wmemchr): Same.
+ 
+ 2001-05-21  Benjamin Kosnik  
+ 
+ 	* testsuite/21_strings/c_strings.cc (main): Fix.
+ 
+ 2001-05-19  Phil Edwards  
+ 
+ 	* acinclude.m4:  Fix --help spacing, correct comments.
+ 	* aclocal.m4:  Regenerate.
+ 	* configure:  Regenerate.
+ 	* mkcheck.in:  Add usage comments.
+ 	* docs/html/documentation.html:  Point to doxygen'd tarball.
+ 
+ 2001-05-18  Benjamin Kosnik  
+ 
+ 	* testsuite/README: Add notes.
+ 
+ 	* src/Makefile.am (libstdc++.INC): Remove.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	Phil Edwards 
+ 	* mkcheck.in: Add missing '#'.
+ 
+ 2001-05-18  Angela Marie Thomas 
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init): Set flags
+ 	appropriately for remote testing and testing installed files without
+ 	a build dir.
+ 
+ 2001-05-18  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Set glibcpp_srcdir
+ 	amd glibcpp_prefixdir with absolute paths.
+ 
+ 	* include/bits/c++config (__GLIBCPP__): Bump.
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE): Correct version number.
+ 
+ 2001-05-18  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_valarray.h (valarray<>::operator[] const):
+ 	Return a const reference.
+ 	* testsuite/26_numerics/valarray_const_bracket.cc: New test.
+ 
+ 2001-05-18  Alexandre Oliva  
+ 
+ 	* configure.target (ATOMICITYH): Actually use AIX-specific code on
+ 	earlier versions of AIX 4.*.
+ 
+ 2001-05-18  Angela Marie Thomas 
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-dg-test):  Set
+ 	output_file based on the name of the testcase.
+ 
+ 2001-05-18  Angela Marie Thomas 
+ 
+ 	* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3-init):  Build
+ 	gluefile and use it if needs_status_wrapper is set.
+ 
+ 2001-05-18  Alexandre Oliva  
+ 
+ 	* configure.target (ATOMICITYH): Use cpu/generic code on earlier
+ 	versions of AIX.
+ 
+ 2001-05-17  Alexandre Oliva  
+ 
+ 	* configure.target (ATOMICITYH): Don't use AIX 4.3-specific code
+ 	on earlier versions of AIX.
+ 
+ 2001-05-15  Benjamin Kosnik  
+ 
+ 	* testsuite_flags.in (query): Add backwards, ext directories.
+ 
+ 2001-05-15  Mark Mitchell  
+ 
+ 	* porting.texi: Correct documentation about handling
+ 	_LARRGEFILE_SOURCE and its ilk.
+ 	* config/os/solaris/solaris2.5/bits/os_defines.h: Remove
+ 	definitions of _XOPEN_SOURCE, _LARGEFILE64_SOURCE, and
+ 	__EXTENSIONS__.
+ 	* config/os/solaris/solaris2.6/bits/os_defines.h: Likewise.
+ 	* config/os/solaris/solaris2.7/bits/os_defines.h: Likewise.
+ 
+ 2001-05-15  Zack Weinberg  
+ 
+ 	* testsuite/21_strings/inserters_extractors.cc,
+ 	testsuite/27_io/istream_unformatted.cc,
+ 	testsuite/27_io/stringstream.cc:
+ 	Replace multi-line string constants with C89-style
+ 	concatenated string constants.
+ 
+ 2001-05-14  Richard Henderson  
+ 
+ 	* mknumeric_limits: Build with -fno-exceptions.
+ 
+ 2001-05-13   Benjamin Kosnik  
+ 
+ 	Switch over to new harness.
+ 	* testsuite_flags.in: Tweaks via Gaby.
+ 	* testsuite/Makefile.am: Change tool to libstdc++-v3.
+ 	(EXPECT): Quote directly.
+ 	(RUNTEST): Same.
+ 	* configure.in: Output testsuite_flags.
+ 	* acinclude.m4: Substitute src, bld, and prefix dirs.
+ 	Remove glibcpp_expect, glibcpp_runtestflags.
+ 	* Makefile.am (RUNTESTFLAGS): Pass this down to subdirs.
+ 	* mkcheck.in: Port to new interface.
+ 
+ 	* aclocal.m4: Regerate.
+ 	* configure: Regnerate.
+ 	* Makefile.in: Regnerate.
+ 	* */Makefile.in: Regenerate.
+ 
+ 	* tests_flags.in: Remove.
+ 	* testsuite/lib/libstdc++.exp: Remove.
+ 	* testsuite/libstdc++.tests/tests.exp: Remove.
+ 
+ 2001-05-13  Alexandre Oliva  
+ 
+ 	* configure.target: Remove detection of AIX pthread multilib, now
+ 	obtained from `gcc -v'.
+ 
+ 2001-05-13  John David Anglin  
+ 
+ 	* mkcheck.in (setup_size_command): Use Berkeley "-B" mode with GNU
+ 	size.  Add hpux case for HP size.
+ 
+ 2001-05-11   Benjamin Kosnik  
+ 
+ 	* testsuite_flags.in: New, simplified interface.
+ 	* testsuite/lib/libstdc++-v3-dg.exp: New test harness.
+ 	* testsuite/libstdc++-v3.dg: Add.
+ 	* testsuite/libstdc++-v3.dg/dg.exp: Add.
+ 
+ 2001-05-11   Benjamin Kosnik  
+ 
+ 	* testsuite/*/*.cc: Remove spaces, make sure testcases return zero.
+ 	* testsuite/config/default.exp: Update bugs email address.
+ 
+ 2001-05-11  Richard Henderson  
+ 
+ 	* libsupc++/eh_personality.cc: Include unwind-pe.h.  Remove
+ 	all pointer encoding logic.
+ 	(struct lsda_header_info): Add ttype_base.
+ 	(get_ttype_entry): Use it instead of a context.
+ 	(check_exception_spec): Likewise.
+ 	(PERSONALITY_FUNCTION): Initialize ttype_base.  Store it in
+ 	the c++ exception header for __cxa_call_unexpected.
+ 	(__cxa_call_unexpected): Use it.
+ 
+ 2001-05-09  Benjamin Kosnik  
+ 
+ 	* testsuite/lib/libstdc++.exp: Use libgloss.exp. Call
+ 	libgloss_link_flags to find crt0.o for targets that use libgloss
+ 	instead of newlib.
+ 	Change LDFLAGS to LIBS.
+ 	Consistently name procedures libstdc++-XXX.
+ 	* testsuite/libstdc++.tests/tests.exp: Use new procedure names.
+ 
+ 2001-05-08  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cstring.h (memchr): Correct definitions.
+ 	(strchr): Same.
+ 	(strpbrk): Same.
+ 	(strrchr): Same.
+ 	(strstr): Same.
+ 	* include/c_std/bits/std_cwchar.h (wcschr): Same.
+ 	(wcsbrk): Same.
+ 	(wcsrchr): Same.
+ 	(wcsstr): Same.
+ 	(wmemchr): Same.
+ 	* testsuite/21_strings/c_strings.cc: Add tests.
+ 
+ 2001-05-07  Benjamin Kosnik  
+ 
+ 	libstdc++/2523
+ 	* include/bits/std_fstream.h (basic_filebuf): Change signature.
+ 	* include/bits/fstream.tcc (basic_filebuf): Change bool argument
+ 	to int_type, pass in buffer size info.
+ 	* include/bits/std_streambuf.h (_M_is_indeterminate): Check for
+ 	unbuffered situation.
+ 	(underflow): Remove codecvt bits for the time being.
+ 	* include/bits/istream.tcc (istream::sentry): Avoid sputbackc call.
+ 	* include/bits/locale_facets.tcc (_M_extract): Cache dereference
+ 	values from iterators, clean.
+ 	* src/locale.cc: Ditto.
+ 	* include/bits/sbuf_iter.h: Format.
+ 	* src/ios.cc: Explicitly pass in buffer sizes at creation time.
+ 	* testsuite/27_io/narrow_stream_objects.cc: Add tests.
+ 	* testsuite/27_io/filebuf.cc: Tweaks.
+ 	* testsuite/27_io/filebuf_members.cc: Tweaks.
+ 
+ 2001-05-07  Mark Mitchell  
+ 
+ 	* config/os/solaris/solaris2.7/bits/os_defines.h
+ 	(_LARGEFILE_SOURCE): Define it.
+ 
+ 2001-05-03  Alexandre Oliva  
+ 
+ 	* configure.in (LIBSUPCXX_PICFLAGS): Set it to -prefer-pic or
+ 	-prefer-non-pic depending on whether libtool has shared libraries
+ 	enabled or disabled.
+ 	* libsupc++/Makefile.am (LIBSUPCXX_CXXFLAGS): Set to
+ 	$(LIBSUPCXX_PICFLAGS).
+ 	* configure, */Makefile.in: Rebuilt.
+ 
+ 2001-05-01  Benjamin Kosnik  
+ 
+ 	* include/bits/sbuf_iter.h (istreambuf_iterator): Correct.
+ 	* testsuite/24_iterators/istreambuf_iterator.cc (test02): Add test.
+ 
+ 	* include/bits/std_sstream.h (stringbuf): Leak
+ 	copied string.
+ 	* testsuite/24_iterators/ostreambuf_iterator.cc: Correct.
+ 
+ 2001-05-01  Tom Browder  
+ 
+ 	* docs/html/ext/howto.html:  Fix typo.
+ 
+ 2001-05-01  Gabriel Dos Reis  
+ 
+ 	* testsuite/libstdc++.tests/tests.exp: Add comment.
+ 
+ 2001-05-01  Gabriel Dos Reis  
+ 
+ 	* testsuite/libstdc++.tests/tests.exp: Set ulimits.
+ 
+ 2001-04-30  Mark Mitchell  
+ 
+ 	* porting.texi: Use the GFDL.
+ 
+ 2001-04-30  Benjamin Kosnik  
+ 
+ 	libstdc++/2627
+ 	* testsuite/24_iterators/ostreambuf_iterator.cc: New file.
+ 	* include/bits/sbuf_iter.h (ostreambuf_iterator): Remove bogus
+ 	specializations.
+ 
+ 2001-04-30  Benjamin Kosnik  
+ 
+ 	libstdc++/2964
+ 	* include/bits/stl_iterator_base_funcs.h (__advance): Fix.
+ 
+ 2001-04-28  Phil Edwards  
+ 
+ 	* docs/doxygen/run_doxygen:  Minor tweaks.
+ 	* docs/doxygen/style.css:  New file.
+ 	* docs/doxygen/user.cfg.in:  Update using "doxygen -u" to get the
+ 	latest parameters available.  Use style.css.
+ 
+ 2001-04-27  Benjamin Kosnik  
+ 
+ 	* docs/doxygen/mainpage.doxy: New.
+ 	* docs/doxygen/user.cfg.in: Change default configuration. Single
+ 	frame, other tweaks.
+ 
+ 2001-04-26  Mark Mitchell  
+ 
+ 	* docs/html/17_intro/BADNAMES: Remove EGCS reference.
+ 	Indicate obsolete nature of thelist for G++ 3.0.
+ 
+ 2001-04-26  Alexandre Oliva  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_THREADS): Obtain
+ 	target_thread_file with `gcc -v'.
+ 	* aclocal.m4, configure: Rebuilt.
+ 
+ 2001-04-25  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cmath.h (std): Explicitly inject c99 names.
+ 	* include/c_std/bits/std_cstdlib.h (std): Same, except for llabs.
+ 	* include/c_std/bits/std_cwchar.h (std): Same.
+ 	* acconfig.h (std): Remove c99 injection into std.
+ 	* config.h.in: Regenerate.
+ 
+ 	* testsuite/README: Fix typo.
+ 
+ 	* include/bits/codecvt.h: Remove warnings.
+ 
+ 2001-04-24  Peter Schmid  
+ 
+ 	* include/ext/slist: Include required header files.
+ 
+ 2001-04-23  Loren J. Rittle  
+ 
+ 	* include/c_std/bits/std_cerrno.h (errno): Define macro from
+ 	identifier declared with external linkage, if needed.
+ 	* include/c_std/bits/std_csetjmp.h (setjmp): Likewise.
+ 	* include/c_std/bits/std_cstdarg.h (va_end): Likewise.
+ 
+ 2001-04-23  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (CXX): Set to glibcpp_CXX so that in-directory
+ 	re-configures find the build compiler.
+ 	(GLIBCPP_ENABLE_C99): Do all fp-tests with 0.0, not 0. Fixes
+ 	libstdc++/2609.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-04-20  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLE_LONG_LONG): Make sure required C99
+ 	support is enabled correctly before long long is activated.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 	* include/backward/backward_warning.h: Format correctly.
+ 
+ 	* testsuite/26_numerics/c99_classification_macros_c.cc: Add.
+ 	* testsuite/26_numerics/c99_classification_macros_c++.cc: Add.
+ 	* testsuite/26_numerics/c99_macros.cc: Remove.
+ 
+ 2001-04-20  Phil Edwards  
+ 
+ 	* include/bits/stl_bvector.h:  Replace __ITERATOR_CATEGORY with
+ 	__iterator_category.
+ 
+ 2001-04-19  Benjamin Kosnik  
+ 
+ 	* acconfig.h (_GLIBCPP_USE_C99): Add.
+ 	* config.h.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_C99): New macro. Test for ISO/IEC
+ 	9899: 1999 support.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in (GLIBCPP_ENABLE_C99): Use it, on by default.
+ 	* configure: Regenerate.
+ 	* configure.in (GLIBCPP_ENABLE_LONG_LONG): Set default to yes.
+ 	* configure: Regenerate.
+ 	* include/c_std/bits/std_cwchar.h: Put wcstold, wcstoll, wcstoull
+ 	into c99.
+ 	* include/c_std/bits/std_cmath.h: Bring C99 functions into c99
+ 	namespace.
+ 	* include/c_std/bits/std_cstdlib.h: Same.
+ 	* docs/html/configopts.html: Update.
+ 	* testsuite/26_numerics/c99_macros.cc: Edit, use cmath instead of
+ 	math.h
+ 	(test_c99_classify): Add.
+ 	* config/os/gnu-linux/bits/os_defines.h (_GNU_SOURCE): Remove.
+ 	(_ISOC99_SOURCE): Remove.
+ 
+ 	* include/bits/stl_algo.h: Use _GLIBCPP_HAVE_DRAND48.
+ 	* include/bits/c++config (__STL_ASSERTIONS): Simplify.
+ 	* acinclude.m4 (GLIBCPP_CHECK_STDLIB_SUPPORT): Add check for drand48.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-04-19  Phil Edwards  
+ 
+ 	* Makefile.am (doxygen):  Assume script is missing execute perms.
+ 	* Makefile.in:  Regenerated.
+ 	* docs/doxygen/user.cfg.in:  Add class diagrams and source browsing.
+ 
+ 2001-04-17  Loren J. Rittle  
+ 
+ 	* testsuite/27_io/istream_seeks.cc: Inform DejaGnu of required files.
+ 
+ 2001-04-17  Benjamin Kosnik  
+ 
+ 	* testsuite/23_containers/map_operators.cc: Add dg-excess-errors.
+ 	* testsuite/23_containers/set_operators.cc: Same.
+ 
+ 	* include/bits/c++config: Add _GLIBCPP_CONCEPT_CHECKS. Disable by
+ 	default.
+ 	(__GLIBCPP__): Bump from value of last release.
+ 	* include/bits/concept_check.h: Default to off, edit comments.
+ 	* src/stl-inst.cc: Use _GLIBCPP_CONCEPT_CHECKS.
+ 	* src/Makefile.am (AM_CXXFLAGS): Remove _GLIBCPP_NO_CONCEPT_CHECKS.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-04-14  Martin Reinecke 
+ 
+ 	* include/bits/boost_concept_check.h(_Mutable_ContainerConcept):
+ 	Properly uglify member.
+ 
+ 2001-04-13  Phil Edwards  
+ 
+ 	* include/bits/stl_algobase.h (equal):  Use EqualOpConcept instead
+ 	of EqualityCo
+ 	mparableConcept.
+ 
+ 2001-04-13  Phil Edwards  
+ 
+ 	* include/bits/boost_concept_check.h:  Uglify, fork from Boost.
+ 	* include/bits/concept_check.h:  Uglify.
+ 	* include/bits/stl_algo.h:  Likewise.
+ 	* include/bits/stl_algobase.h:  Likewise.
+ 	* include/bits/stl_deque.h:  Likewise.
+ 	* include/bits/stl_heap.h:  Likewise.
+ 	* include/bits/stl_iterator_base_funcs.h:  Likewise.
+ 	* include/bits/stl_list.h:  Likewise.
+ 	* include/bits/stl_map.h:  Likewise.
+ 	* include/bits/stl_multimap.h:  Likewise.
+ 	* include/bits/stl_multiset.h:  Likewise.
+ 	* include/bits/stl_numeric.h:  Likewise.
+ 	* include/bits/stl_queue.h:  Likewise.
+ 	* include/bits/stl_set.h:  Likewise.
+ 	* include/bits/stl_stack.h:  Likewise.
+ 	* include/bits/stl_vector.h:  Likewise.
+ 	* include/ext/hash_map:  Likewise.
+ 	* include/ext/hash_set:  Likewise.
+ 	* include/ext/slist:  Likewise.
+ 
+ 2001-04-13  Gabriel Dos Reis  
+ 
+ 	* testsuite/23_containers/set_operators.cc: Just try to compile.
+ 	Mark as XFAIL.
+ 	* testsuite/23_containers/map_operators.cc: Same.
+ 
+ 2001-04-12  Jason Merrill  
+ 
+ 	* testsuite/lib/libstdc++.exp (libstdc++-dg-test): Prepend "./" to
+ 	output_file.
+ 	(dg-test): Revert rth's change.
+ 
+ 2001-04-12  Nathan Sidwell  
+ 
+ 	* libsupc++/eh_alloc.cc (__cxa_allocate_exception): Don't
+ 	terminate holding the mutex. Make sure size fits in EMERGENCY_OBJ_SIZE.
+ 
+ 2001-04-12  Gabriel Dos Reis  
+ 
+ 	* testsuite/README: Add DejaGnu specific documentation.
+ 
+ 2001-04-11  Benjamin Kosnik  
+ 
+ 	* acinclude.m4: AC_CHECK_TOOL for expect.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/Makefile.am (RUNTEST): Use substituted.
+ 	(EXPECT): Same.
+ 
+ 	* configure.in: Remove xcompiling substitution.
+ 	* tests_flags.in (CROSS_LIB_PATH): Remove.
+ 	(xcompiling): Remove.
+ 	(CXX): Use substituted CXX.
+ 
+ 2001-04-11  Richard Henderson  
+ 
+ 	* testsuite/lib/libstdc++.exp: Specify path for output_file.
+ 
+ 2001-04-08  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_valarray.h(valarray<>::operator[]): Make
+ 	inline.
+ 
+ 2001-04-06  Gabriel Dos Reis  
+ 
+ 	* testsuite/25_algorithms/equal.cc: New test.
+ 
+ 2001-04-06  Joe Buck  
+ 
+ 	* stl_algobase.h (std::equal): avoid use of possibly-undefined
+ 	operator != (one line patch).
+ 
+ 2001-04-06   Benjamin Kosnik  
+ 
+ 	* include/backward/backward_warning.h: Re-enable.
+ 
+ 2001-04-06  Benjamin Kosnik  
+ 	    Alexandre Oliva  
+ 
+ 	* tests_flags.in (CROSS_LIB_PATH): Add as -B flag.
+ 
+ 2001-04-06  Gabriel Dos Reis  
+ 
+ 	* include/c_std/bits/std_cmath.h: Get rid of C99 math macros.
+ 	* testsuite/26_numerics/c99_macros.cc: Add test.
+ 
+ 2001-04-06  Phil Edwards  
+ 
+ 	* docs/html/faq/index.html:  Update for 2.92, grab from RELEASE-NOTES.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-04-06  Benjamin Kosnik  
+ 
+ 	* include/backward/backward_warning.h: Temporarily disable until
+ 	g++ testsuite changes go in.
+ 	* tests_flags.in (CROSS_LIB_PATH): Add.
+ 
+ 2001-04-05  Benjamin Kosnik  
+ 
+ 	Warn when using backward headers.
+ 	* include/backward/algo.h: Include warning file.
+ 	* include/backward/vector.h: Same.
+ 	* include/backward/tree.h: Same.
+ 	* include/backward/tempbuf.h: Same.
+ 	* include/backward/strstream: Same.
+ 	* include/backward/streambuf.h: Same.
+ 	* include/backward/stream.h: Same.
+ 	* include/backward/stack.h: Same.
+ 	* include/backward/slist.h: Same.
+ 	* include/backward/set.h: Same.
+ 	* include/backward/rope.h:
+ 	* include/backward/queue.h: Same.
+ 	* include/backward/pair.h: Same.
+ 	* include/backward/ostream.h: Same.
+ 	* include/backward/new.h: Same.
+ 	* include/backward/multiset.h: Same.
+ 	* include/backward/multimap.h: Same.
+ 	* include/backward/map.h: Same.
+ 	* include/backward/list.h: Same.
+ 	* include/backward/iterator.h: Same.
+ 	* include/backward/istream.h: Same.
+ 	* include/backward/iostream.h:
+ 	* include/backward/iomanip.h:
+ 	* include/backward/heap.h: Same.
+ 	* include/backward/hashtable.h:
+ 	* include/backward/hash_set.h:
+ 	* include/backward/hash_map.h:
+ 	* include/backward/function.h:
+ 	* include/backward/fstream.h:
+ 	* include/backward/deque.h:
+ 	* include/backward/defalloc.h: Same.
+ 	* include/backward/complex.h: Same.
+ 	* include/backward/bvector.h:
+ 	* include/backward/alloc.h:
+ 	* include/backward/algobase.h: Same.
+ 
+ 	* include/backward/backward_warning.h: New file.
+ 	* src/Makefile.am (backward_headers): Add backward_warning.h
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-04-05  Benjamin Kosnik  
+ 
+ 	* src/Makefile.am (myinstalldirs): Make sure backward directory is
+ 	created.
+ 	(myinstallheaders): Install backward headers in backward directory.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-04-05  Benjamin Kosnik  
+ 
+ 	Prepare for libstdc++-2.92.
+ 	* docs/html/17_intro/RELEASE-NOTES (New): Update.
+ 	* docs/html/configopts.html: Fix formatting.
+ 	* README (file): Updates.
+ 	* include/bits/c++config (__GLIBCPP__): Update.
+ 
+ 2001-04-05  Phil Edwards  
+ 
+ 	* docs/doxygen/run_doxygen:  Check for the existence of Doxygen.
+ 
+ 2001-04-04  Phil Edwards  
+ 
+ 	* docs/doxygen/user.cfg.in:  Extract all non-private members;
+ 	reduce confusing documentation output.
+ 
+ 2001-04-04  Geoffrey Keating  
+ 
+ 	* include/backward/fstream.h: Add missing semicolons.
+ 
+ 2001-04-03  Benjamin Kosnik  
+ 
+ 	* include/bits/fstream.tcc: Add bool parameter to filebuf ctor.
+ 	* include/bits/ios_base.h(ios_base::Init): Remove _M_cout, _M_cin,
+ 	_M_cerr, _M_wcout, _M_wcin, _M_wcerr.
+ 	(ios_base::Init::_S_ios_create): New.
+ 	(ios_base::Init::_S_ios_destroy): New.
+ 	* include/bits/std_fstream.h: Change ctor args.
+ 	* src/ios.cc (ios_base::Init::Init): Use _S_ios_create.
+ 	(ios_base::Init::~Init): Use _S_ios_destroy.
+ 	(ios_base::sync_with_stdio): Use new members.
+ 	* testsuite/27_io/filebuf_members.cc: Fix calling conventions for
+ 	filebuf ctor.
+ 
+ 2001-04-03  Peter Schmid  
+ 
+ 	* include/backward/fstream.h:  Expose streampos to global
+ 	namespace.
+ 
+ 2001-04-03  Peter Schmid  
+ 
+ 	* include/bits/stl_iterator_base_types.h: Fix typo
+ 
+ 2001-04-03  Andreas Schwab  
+ 
+ 	* include/backward/fstream.h: Define filebuf and wfilebuf.
+ 
+ 2001-04-02  Phil Edwards  
+ 
+ 	New concept checking implementation.
+ 	* docs/html/19_diagnostics/howto.html:  Document.
+ 	* docs/html/17_intro/concept_check.diff:  New file, for reference.
+ 	* include/bits/boost_concept_check.h:  New file from Boost.
+ 	* include/bits/c++config:  Update comments.
+ 
+ 	* include/bits/concept_check.h:  New file.
+ 	* include/bits/concept_checks.h:  Removed.
+ 	* include/bits/container_concepts.h:  Removed.
+ 	* include/bits/sequence_concepts.h:  Removed.
+ 	* include/bits/stl_iterator_base.h:  Removed; split into...
+ 	* include/bits/stl_iterator_base_funcs.h:  ...this new file...
+ 	* include/bits/stl_iterator_base_types.h:  ...and this new file.
+ 
+ 	* include/bits/sbuf_iter.h:  Update to use new implementation.
+ 	* include/bits/std_iterator.h:  Likewise.
+ 	* include/bits/std_memory.h:  Likewise.
+ 	* include/bits/stl_algo.h:  Likewise.
+ 	* include/bits/stl_algobase.h:  Likewise.
+ 	* include/bits/stl_construct.h:  Likewise.
+ 	* include/bits/stl_deque.h:  Likewise.
+ 	* include/bits/stl_heap.h:  Likewise.
+ 	* include/bits/stl_list.h:  Likewise.
+ 	* include/bits/stl_map.h:  Likewise.
+ 	* include/bits/stl_multimap.h:  Likewise.
+ 	* include/bits/stl_multiset.h:  Likewise.
+ 	* include/bits/stl_numeric.h:  Likewise.
+ 	* include/bits/stl_queue.h:  Likewise.
+ 	* include/bits/stl_set.h:  Likewise.
+ 	* include/bits/stl_stack.h:  Likewise.
+ 	* include/bits/stl_uninitialized.h:  Likewise.
+ 	* include/bits/stl_vector.h:  Likewise.
+ 	* include/ext/hash_map:  Likewise.
+ 	* include/ext/hash_set:  Likewise.
+ 	* include/ext/slist:  Likewise.
+ 	* include/ext/stl_hashtable.h:  Likewise.
+ 
+ 	* src/Makefile.am (base_headers):  Update list of headers.
+ 	* Makefile.in:  Regenerated.
+ 	* src/Makefile.in:  Regenerated.
+ 	* libio/Makefile.in:  Regenerated.
+ 	* libmath/Makefile.in:  Regenerated.
+ 	* libsupc++/Makefile.in:  Regenerated.
+ 	* testsuite/Makefile.in:  Regenerated.
+ 
+ 	* docs/html/install.html:  Update contact information.
+ 	* docs/html/17_intro/howto.html:  Ditto.
+ 	* docs/html/18_support/howto.html:  Ditto.
+ 	* docs/html/20_util/howto.html:  Ditto.
+ 	* docs/html/21_strings/howto.html:  Ditto.
+ 	* docs/html/22_locale/howto.html:  Ditto.
+ 	* docs/html/23_containers/howto.html:  Ditto.
+ 	* docs/html/24_iterators/howto.html:  Ditto.
+ 	* docs/html/25_algorithms/howto.html:  Ditto.
+ 	* docs/html/26_numerics/howto.html:  Ditto.
+ 	* docs/html/27_io/howto.html:  Ditto.
+ 	* docs/html/faq/index.html:  Ditto, plus info on new checking code.
+ 	* docs/html/ext/howto.html:  Ditto, plus info on new checking code.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-04-02  Zack Weinberg  
+ 
+ 	* testsuite/lib/libstdc++.exp (dg-test): Annotate result
+ 	messages with $which_library as well as $tool_flags and
+ 	${dg-extra-tool-flags}.  Factor out annotation text into
+ 	a single variable.
+ 
+ 2001-04-02  Stephen M. Webb  
+ 
+ 	* include/c_std/bits/std_cstring.h: Fix for const-correctness.
+ 	* include/c_std/bits/std_cwchar.h: Same.
+ 	* testsuite/21_strings/c_strings.cc: Add.
+ 
+ 2001-04-01  Benjamin Kosnik  
+ 
+ 	* docs/html/configopts.html: Add --enable-sjlj-exceptions docs.
+ 
+ 2001-04-01  Zack Weinberg  
+ 
+ 	* tests_flags.in: Use test a = b, not test a == b which is not
+ 	portable.
+ 
+ 2001-03-31  Benjamin Kosnik  
+ 
+ 	* configure.target: Remove duplicate aix entry.
+ 
+ 2001-03-30  Benjamin Kosnik  
+ 
+ 	* include/ext/stl_bvector.h: Move to...
+ 	* include/bits/stl_vector.h: ...here.
+ 	* include/ext/bvector: Move to...
+ 	* include/backward/bvector.h: ...here.
+ 	* include/bits/std_vector.h: Change stl_bvector include.
+ 	* include/bits/std_queue.h: Remove bvector include.
+ 	* include/ext/tree: Insert using rb_tree, move to...
+ 	* include/backward/tree.h: ...here.
+ 	* include/backward/hash_map.h: Include ext/hash_map.
+ 	* include/backward/hash_set.h: Include ext/hash_set.
+ 	* include/backward/queue.h: New file.
+ 	* include/backward/stack.h: Edit.
+ 	* include/backward/algo.h: Same.
+ 	* include/backward/algobase.h: Same.
+ 	* include/backward/alloc.h: Same.
+ 	* include/backward/function.h: Same.
+ 	* include/backward/iomanip.h: Same.
+ 	* include/backward/istream.h: Same.
+ 	* include/backward/iterator.h: Same.
+ 	* include/backward/list.h: Same.
+ 	* include/backward/map.h: Same.
+ 	* include/backward/multimap.h: Same.
+ 	* include/backward/multiset.h: Same.
+ 	* include/backward/ostream.h: Same.
+ 	* include/backward/pair.h: Same
+ 	* include/backward/rope.h: Same.
+ 	* include/backward/set.h: Same.
+ 	* include/backward/stream.h: Same.
+ 	* include/backward/strstream.h: Same.
+ 	* include/backward/tempbuf.h: Same.
+ 	* src/Makefile.am (ext_headers): Edit.
+ 	* src/Makefile.in: Regenerate.
+ 	* testsuite/ext/headers.cc (main): Fix.
+ 	* mkcheck.in: Fix.
+ 
+ 2001-03-30  Phil Edwards  
+ 
+ 	* tests_flags.in (LIBS):  Pass correct path for installed testing.
+ 
+ 2001-03-28  Benjamin Kosnik  
+ 
+ 	* mkcheck.in (LIBTOOL): Don't construct -B argument here...
+ 	* tests_flags.in (CXX): Construct here.
+ 	(static_fail): Don't remove compile.out. Format with spaces.
+ 	(INCLUDES): Deal with xcompiling.
+ 	* configure.in (xcompiling): Substitute.
+ 	* testsuite/Makefile.am: Snake libjava configury.
+ 	* testsuite/Makefile.in: Regenerate.
+ 	* testsuite/23_containers/map_operators.cc: Tweaks.
+ 	* testsuite/23_containers/set_operators.cc: Tweaks.
+ 
+ 2001-03-28  Gabriel Dos Reis  
+ 
+ 	Enable dejagnu testing framework.
+ 	* configure.in: Generate testsuite/Makefile.
+ 	* configure: Regenerate.
+ 	* Makefile.am (check-install): Change rule from this...
+ 	(check-script-install): ...to this.
+ 	(check): Change rule from this...
+ 	(check-script):...to this.
+ 	* Makefile.in: Regenerate.
+ 
+ 2001-03-28  Alexandre Oliva  
+ 
+ 	* libsupc++/Makefile.am (CXXLINK): Add --tag disable-shared after
+ 	--tag CXX.
+ 	(LIBTOOL): Let automake take care of its definition.
+ 	* libsupc++/Makefile.in: Rebuilt.
+ 
+ 2001-03-28  Richard Henderson  
+ 
+ 	IA-64 ABI Exception Handling:
+ 	* acinclude.m4 (GLIBCPP_ENABLE_SJLJ_EXCEPTIONS): New.
+ 	* configure.in: Use it.
+ 	* Makefile.in, aclocal.m4, config.h.in, configure: Regenerate.
+ 	* libsupc++/Makefile.am (sources): Update files list.
+ 	* libsupc++/Makefile.in: Regenerate.
+ 	* libsupc++/eh_alloc.cc, libsupc++/eh_aux_runtime.cc: New files.
+ 	* libsupc++/eh_catch.cc, libsupc++/eh_exception.cc: New files.
+ 	* libsupc++/eh_globals.cc, libsupc++/eh_personality.cc: New files.
+ 	* libsupc++/eh_terminate.cc, libsupc++/eh_throw.cc: New files.
+ 	* libsupc++/exception_support.cc: Remove.
+ 	* libsupc++/exception_support.h: Remove.
+ 	* libsupc++/pure.cc: Use std::terminate.
+ 	* libsupc++/tinfo2.cc (__throw_type_match_rtti_2): Remove.
+ 	(__is_pointer): Remove.
+ 	* libsupc++/unwind-cxx.h: New file.
+ 	* libsupc++/vec.cc (uncatch_exception): Update for new abi.
+ 
+ 2001-03-27  Alexandre Oliva  
+ 
+ 	* libsupc++/Makefile.am (CXXLINK): Use CXX again, and choose
+ 	CXX tag explicitly.
+ 	* src/Makefile.am (CXXLINK): Likewise.
+ 	* libsupc++/Makefile.in, src/Makefile.in: Rebuilt.
+ 
+ 2001-03-27  Benjamin Kosnik  
+ 
+ 	* include/bits/c++config (_STL_USE_CONCEPT_CHECKS): Disable by default.
+ 
+ 2001-03-26  Peter Schmid  
+ 
+ 	* libstdc++-v3/tests_flags.in: Change the order of libstdc++
+ 	  and libc
+ 
+ 2001-03-26  Benjamin Kosnik  
+ 
+ 	* include/bits/basic_file.h (get_fileno): Remove.
+ 	(_M_fileno): Remove.
+ 	(_M_cfile_created): Add.
+ 	(basic_file::basic_file(__c_file_type*, openmode): Add.
+ 	(basic_file::basic_file(int, const char*, openmode): Remove.
+ 	* include/bits/fstream.tcc (basic_fstream::basic_filebuf(int __fd,
+ 	const char*, ios_base::openmode): Don't allocate
+ 	internal buffers. Turn off internal buffers.
+ 	(basic_filebuf::overflow): Remove test for null buffer.
+ 	(basic_filebuf::_M_really_overflow): Same. Allow unbuffered use.
+ 	* include/bits/streambuf.cc: Tweak.
+ 	* include/bits/std_ostream.h: Tweak.
+ 	* config/basic_file_libio.h: Same.
+ 	* config/basic_file_stdio.h: Same.
+ 	* src/ios.cc (ios_base::Init::Init()): Unbuffer stdout by default.
+ 	* testsuite/27_io/filebuf_members.cc: Tweaks.
+ 	* testsuite/27_io/ios_base_members_static.cc: Tweaks.
+ 
+ 2001-03-24  Phil Edwards  
+ 
+ 	* Makefile.am:  New targets, doxygen and doxygen-maint.
+ 	* Makefile.in:  Regenerated.
+ 	* docs/doxygen/run_doxygen:  Finally implemented.
+ 	* docs/doxygen/maint.cfg.in:  New file.
+ 	* docs/doxygen/user.cfg.in:  New file.
+ 
+ 2001-03-24  Phil Edwards  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_COMPILER_FEATURES):  Update comment.
+ 	* src/Makefile.am:  Replace leading spaces with tabs on continuation
+ 	lines.
+ 	* aclocal.m4:  Regenerated.
+ 	* configure:  Ditto.
+ 	* Makefile.in:  Ditto.
+ 	* src/Makefile.in:  Ditto.
+ 	* libio/Makefile.in:  Ditto.
+ 	* libmath/Makefile.in:  Ditto.
+ 	* libsupc++/Makefile.in:  Ditto.
+ 
+ 2001-03-24  Phil Edwards  
+ 
+ 	* docs/html/19_diagnostics/howto.html:  HTML fixup.  Describe
+ 	concept-checking code and current status of same.
+ 	* docs/html/ext/howto.html:  Ditto.
+ 	* docs/html/faq/index.html:  Ditto.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-03-24  Phil Edwards  
+ 
+ 	* include/bits/std_bitset.h:  Include ostream and istream headers
+ 	instead of iostream.
+ 
+ 2001-03-22  Greg Bumgardner 
+ 
+ 	* include/bits/ostream.tcc: Use __builtin_alloca.
+ 
+ 2001-03-22  Benjamin Kosnik  
+ 
+ 	* src/misc-inst.cc (__sink_unused_warning): Move to...
+ 	* src/locale-inst.cc (__sink_unused_warning): Move to...
+ 	* src/stl-inst.cc: Here.
+ 	* include/bits/c++config (_STL_NO_CONCEPT_CHECKS): Add define,
+ 	commented it out.
+ 
+ 2001-03-21  Theodore Papadopoulo  
+ 
+ 	* intclude/bits/basic_file.h: Fix typos in comments.
+ 
+ 2001-03-20  Richard Henderson  
+ 
+ 	* src/gen-num-limits.cc: Instantiate for wchar_t.
+ 	* config/os/aix/bits/ctype_base.h (mask): Use unsigned int.
+ 
+ 2001-03-20  Jason Merrill  
+ 
+ 	* libsupc++/vec.cc (__cxa_vec_cleanup): New fn.
+ 	(__cxa_vec_ctor, __cxa_vec_cctor, __cxa_vec_dtor): Call it.
+ 	* libsupc++/cxxabi.h: Declare it.
+ 
+ 2001-03-16  Alexandre Oliva  
+ 
+ 	* src/gen-num-limits.cc (signal_adapter): Overloaded to match
+ 	signal_func with an unspecified argument list.
+ 
+ 2001-03-15  Benjamin Kosnik  
+ 
+ 	* tests_flags.in (CXXFLAGS): Link libstdc++ before libsupc++.
+ 
+ 2001-03-15  Gabriel Dos Reis  
+ 
+ 	* include/bits/basic_string.tcc (operator+): Fix thinko.
+ 
+ 2001-03-14  Benjamin Kosnik  
+ 
+ 	libstdc++/2020
+ 	* include/bits/std_streambuf.h: Remove cached locale facets.
+ 	(basic_streambuf::_M_buf_fctype): Remove.
+ 	(basic_streambuf::~basic_streambuf): Remove here.
+ 	(basic_streambuf::basic_streambuf): Same.
+ 	(basic_streambuf::imbue): Same.
+ 	* include/bits/fstream.tcc (filebuf::imbue): Remove _M_buf_fctype.
+ 	* include/bits/std_fstream.h (basic_filebuf::_M_fcvt): Remove.
+ 	(basic_filebuf::~basic_filebuf()): Remove here.
+ 	* include/bits/fstream.tcc (basic_filebuf::basic_filebuf): Same.
+ 	(basic_filebuf::imbue): Same.
+ 	* include/bits/localefwd.h (_Count_ones): Remove.
+ 	(locale::_S_num_categories): Just use 6, since this doesn't
+ 	actually change, ever.
+ 	* include/bits/locale_facets.tcc (has_facet): Simplify.
+ 	(use_facet): Same.
+ 	* testsuite/27_io/filebuf.cc (test06): Add tests.
+ 
+ 2001-03-13  Steve Ellcey  
+ 
+ 	* libstdc++-v3/config/os/hpux/bits/ctype_base.h: Make ctype masks
+ 	match HP-UX ctype.h header file.
+ 
+ 2001-03-13  Andris Pavenis 
+ 
+ 	* config/djgpp/bits/ctype_noninline.h: Fix typo and remove
+ 	duplicate definitions of __dj_ctype_*
+ 
+ 2001-03-13  Benjamin Kosnik  
+ 
+ 	* libsupc++/new: Remove pragma interface.
+ 	* libsupc++/typeinfo: Same.
+ 	* libsupc++/exception: Same.
+ 	* libsupc++/new_handler.cc: Remove pragma implementation.
+ 	(bad_alloc::~bad_alloc()): Add.
+ 	* libsupc++/exception_support.cc: Same.
+ 	(exception::~exception): Add.
+ 	(bad_exception::~bad_exception): Add.
+ 	* libsupc++/tinfo.cc: Same.
+ 	(bad_cast::~bad_cast): Add.
+ 	(bad_typeid::~bad_typeid): Add.
+ 
+ 2001-03-13  Phil Edwards  
+ 
+ 	* mkcheck.in:  Fix IFS regression for non-bash-2.01 hosts.
+ 
+ 2001-03-12  Felix Lee  
+ 
+ 	* mkcheck.in: workaround for bash 2.01 IFS bug.
+ 
+ 2001-03-12  Benjamin Kosnik  
+ 
+ 	Fixups for -fno-for-scope
+ 	* include/bits/locale_facets.tcc (__match_parallel): Fixup.
+ 	* src/valarray-inst.cc (__gslice_to_index): Same.
+ 
+ 2001-03-12  Rodney Brown  
+ 
+ 	* src/gen-num-limits.cc (traps) [SPECIALIZE_TRAPPING]: Add fflush
+ 	prior to trapping signal (UnixWare 7 workaround).
+ 
+ 2001-03-12  Craig Rodrigues  
+ 
+ 	* include/backward/hashtable.h: Same.
+ 	* include/backward/rope.h: Fix include.
+ 
+ 2001-03-12  Benjamin Kosnik  
+ 
+ 	* include/backward/vector.h: Include std_vector.h.
+ 
+ 	* include/bits/istream.tcc (basic_istream<_CharT, _Traits>&
+ 	operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)):
+ 	Fix typo.
+ 
+ 2001-03-11  Peter Schmid  
+ 
+ 	* include/ext/stl_hashtable.h: Change type of __n to size_t
+ 	* include/backward/bvector.h: Include 
+ 
+ 2001-03-09  Gabriel Dos Reis  
+ 
+ 	* include/bits/istream.tcc ( basic_istream<_CharT, _Traits>&
+ 	operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)):
+ 	Use streamsize, not int_type.
+ 
+ 2001-03-08  Benjamin Kosnik  
+ 
+ 	* testsuite/27_io/streambuf.cc (test06): New test, disabled at the
+ 	moment.
+ 
+ 2001-03-08  Andreas Schwab  
+ 
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Fix syntax in test
+ 	command.
+ 	* aclocal.m4, configure: Regenerated.
+ 
+ 2001-03-07  Benjamin Kosnik  
+ 
+ 	* include/bits/std_iosfwd.h: Remove string forward decls here.
+ 	* include/bits/stringfwd.h: Add forward decls for char_traits
+ 	specializations.
+ 	* config/c_io_libio.h (wstreamoff): Delete.
+ 	* config/c_io_stdio.h (wstreamoff): Same.
+ 	* include/bits/char_traits.h: Use streamoff not wstreamoff for
+ 	char_traits::off_type.
+ 	Remove duplicate typedefs.
+ 	* include/bits/fpos.h: Define streampos/wstreampos here.
+ 	* testsuite/27_io/istream_seeks.cc (test04): Explicitly cast int
+ 	values to off_type.
+ 	(test05): Same.
+ 	Changeup output files.
+ 	* testsuite/27_io/istream_unformatted.cc: Change output files.
+ 	* testsuite/27_io/istream_seeks-1.txt: Add.
+ 	* testsuite/27_io/istream_seeks-2.tst: Add.
+ 	* testsuite/27_io/istream_seeks-1.tst: Add.
+ 	* testsuite/27_io/istream_unformatted-2.tst: Delete.
+ 	* testsuite/27_io/istream_unformatted-3.tst: Delete.
+ 	* testsuite/27_io/istream_unformatted-3.txt: Delete.
+ 
+ 2001-03-07  Alexandre Oliva  
+ 
+ 	Add Irix 5.2, 6.3 support.
+ 	* config/os/irix/bits: Renamed to...
+ 	* config/os/irix/irix6.5/bits: this.
+ 	* config/os/irix/irix5.2/bits: New, copied from irix6.5/bits.
+ 	* config/os/irix/irix5.2/bits/ctype_base.h: Use _U, _L, _N,
+ 	_X, _S, _P, _C and _B instead of IRIX-6.5 _IS* macros.
+ 	* config/os/irix/irix5.2/bits/ctype_noninline.h
+ 	(ctype::ctype): Initialize _M_table with __ctype.
+ 	* configure.target: Adjust.
+ 
+ 2001-03-06  Benjamin Kosnik  
+ 
+ 	libstdc++/2181
+ 	* include/bits/istream.tcc (basic_istream<_CharT, _Traits>::
+ 	operator>>(__istream_type& (*__pf)(__istream_type&)): Don't use
+ 	sentry.
+ 	(basic_istream<_CharT, _Traits>:: operator>>(__ios_type&
+ 	(*__pf)(__ios_type&)): Same.
+ 	(basic_istream<_CharT, _Traits>:: operator>>(ios_base&
+ 	(*__pf)(ios_base&))): Same.
+ 	* testsuite/27_io/istream_extractor_other.cc: Add tests.
+ 	* testsuite/27_io/istream_manip.cc (test01): Fix.
+ 
+ 2001-03-06  Nathan Myers  
+ 	    Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cerrno.h: Don't define errno in std::.
+ 	* testsuite/17_intro/header_cerrno.cc (test01): New file.
+ 	* testsuite/17_intro/header_cassert.cc (test01): New file.
+ 	* testsuite/17_intro/header_cstddef.cc (test01): New file.
+ 	* testsuite/17_intro/header_csetjmp.cc (test01): New file.
+ 	* testsuite/17_intro/header_cstdarg.cc (test01): New file.
+ 
+ 2001-03-05  scott snyder  
+ 
+ 	libstdc++/2190
+ 	* include/c_std/bits/std_cmath.h: Move abs(long), div(long,long)
+ 	from here...
+ 	* include/c_std/bits/std_cstdlib.h: ... to here.
+ 	* testsuite/17_intro/header_cstdlib.cc: Add test.
+ 
+ 2001-03-05  Stephen M. Webb  
+ 
+ 	* libsupc++/vec.cc (__cxxa_vec_new2): Qualify size_t.
+ 
+ 2001-03-05  Laurynas Biveinis  
+ 
+ 	* config/os/djgpp/ctype_base.h (ctype_base): fix __to_type
+ 	definition. Replace enum with static const variables.
+ 
+ 	* config/os/djgpp/ctype_inline.h (ctype::is): remove
+ 	throw specification, fix typos, use .
+ 	(ctype::scan_is): remove throw specification.
+ 	(ctype::scan_not): likewise.
+ 
+ 	* config/os/djgpp/ctype_noninline.h (ctype::ctype): fix typo.
+ 	(ctype::do_toupper(char)): use .
+ 	(ctype::do_toupper(char *, const char *)): likewise.
+ 	(ctype::do_tolower(char)): likewise.
+ 	(ctype::do_tolower(char *, const char *)): likewise.
+ 
+ 2001-03-04  Phil Edwards  
+ 
+ 	http://gcc.gnu.org/ml/libstdc++/2001-03/msg00015.html
+ 	* include/backward/algo.h:  Use std not __STD.  Remove unneeded
+ 	macros and "never happens" code.  Adjust to C++STYLE guidelines.
+ 	* include/backward/algobase.h:  Likewise.
+ 	* include/backward/alloc.h:  Likewise.
+ 	* include/backward/bvector.h:  Likewise.
+ 	* include/backward/deque.h:  Likewise.
+ 	* include/backward/function.h:  Likewise.
+ 	* include/backward/hash_map.h:  Likewise.
+ 	* include/backward/hash_set.h:  Likewise.
+ 	* include/backward/hashtable.h:  Likewise.
+ 	* include/backward/heap.h:  Likewise.
+ 	* include/backward/iterator.h:  Likewise.
+ 	* include/backward/list.h:  Likewise.
+ 	* include/backward/map.h:  Likewise.
+ 	* include/backward/multimap.h:  Likewise.
+ 	* include/backward/multiset.h:  Likewise.
+ 	* include/backward/pair.h:  Likewise.
+ 	* include/backward/rope.h:  Likewise.
+ 	* include/backward/set.h:  Likewise.
+ 	* include/backward/slist.h:  Likewise.
+ 	* include/backward/stack.h:  Likewise.
+ 	* include/backward/strstream:  Likewise.
+ 	* include/backward/tempbuf.h:  Likewise.
+ 	* include/backward/tree.h:  Likewise.
+ 	* include/backward/vector.h:  Likewise.
+ 	* include/bits/basic_ios.h:  Likewise.
+ 	* include/bits/basic_ios.tcc:  Likewise.
+ 	* include/bits/basic_string.h:  Likewise.
+ 	* include/bits/c++config:  Likewise.
+ 	* include/bits/concept_checks.h:  Likewise.
+ 	* include/bits/fpos.h:  Likewise.
+ 	* include/bits/fstream.tcc:  Likewise.
+ 	* include/bits/functexcept.h:  Likewise.
+ 	* include/bits/ios_base.h:  Likewise.
+ 	* include/bits/istream.tcc:  Likewise.
+ 	* include/bits/mask_array.h:  Likewise.
+ 	* include/bits/ostream.tcc:  Likewise.
+ 	* include/bits/pthread_allocimpl.h:  Likewise.
+ 	* include/bits/sbuf_iter.h:  Likewise.
+ 	* include/bits/slice.h:  Likewise.
+ 	* include/bits/slice_array.h:  Likewise.
+ 	* include/bits/sstream.tcc:  Likewise.
+ 	* include/bits/std_bitset.h:  Likewise.
+ 	* include/bits/std_fstream.h:  Likewise.
+ 	* include/bits/std_iomanip.h:  Likewise.
+ 	* include/bits/std_ios.h:  Likewise.
+ 	* include/bits/std_istream.h:  Likewise.
+ 	* include/bits/std_iterator.h:  Likewise.
+ 	* include/bits/std_memory.h:  Likewise.
+ 	* include/bits/std_ostream.h:  Likewise.
+ 	* include/bits/std_sstream.h:  Likewise.
+ 	* include/bits/std_streambuf.h:  Likewise.
+ 	* include/bits/std_string.h:  Likewise.
+ 	* include/bits/std_valarray.h:  Likewise.
+ 	* include/bits/stl_algo.h:  Likewise.
+ 	* include/bits/stl_algobase.h:  Likewise.
+ 	* include/bits/stl_alloc.h:  Likewise.
+ 	* include/bits/stl_construct.h:  Likewise.
+ 	* include/bits/stl_deque.h:  Likewise.
+ 	* include/bits/stl_function.h:  Likewise.
+ 	* include/bits/stl_heap.h:  Likewise.
+ 	* include/bits/stl_iterator.h:  Likewise.
+ 	* include/bits/stl_iterator_base.h:  Likewise.
+ 	* include/bits/stl_list.h:  Likewise.
+ 	* include/bits/stl_map.h:  Likewise.
+ 	* include/bits/stl_multimap.h:  Likewise.
+ 	* include/bits/stl_multiset.h:  Likewise.
+ 	* include/bits/stl_numeric.h:  Likewise.
+ 	* include/bits/stl_pair.h:  Likewise.
+ 	* include/bits/stl_pthread_alloc.h:  Likewise.
+ 	* include/bits/stl_queue.h:  Likewise.
+ 	* include/bits/stl_raw_storage_iter.h:  Likewise.
+ 	* include/bits/stl_relops.h:  Likewise.
+ 	* include/bits/stl_set.h:  Likewise.
+ 	* include/bits/stl_stack.h:  Likewise.
+ 	* include/bits/stl_tempbuf.h:  Likewise.
+ 	* include/bits/stl_threads.h:  Likewise.
+ 	* include/bits/stl_tree.h:  Likewise.
+ 	* include/bits/stl_uninitialized.h:  Likewise.
+ 	* include/bits/stl_vector.h:  Likewise.
+ 	* include/bits/streambuf.tcc:  Likewise.
+ 	* include/bits/type_traits.h:  Likewise.
+ 	* include/bits/valarray_meta.h:  Likewise.
+ 	* include/ext/bvector:  Likewise.
+ 	* include/ext/hash_map:  Likewise.
+ 	* include/ext/hash_set:  Likewise.
+ 	* include/ext/ropeimpl.h:  Likewise.
+ 	* include/ext/slist:  Likewise.
+ 	* include/ext/stl_bvector.h:  Likewise.
+ 	* include/ext/stl_hash_fun.h:  Likewise.
+ 	* include/ext/stl_hashtable.h:  Likewise.
+ 	* include/ext/stl_rope.h:  Likewise.
+ 	* src/complex_io.cc:  Likewise.
+ 	* src/ios.cc:  Likewise.
+ 	* src/locale-inst.cc:  Likewise.
+ 	* src/locale.cc:  Likewise.
+ 	* src/localename.cc:  Likewise.
+ 	* src/misc-inst.cc:  Likewise.
+ 	* src/stdexcept.cc:  Likewise.
+ 	* src/stl-inst.cc:  Likewise.
+ 	* src/strstream.cc:  Likewise.
+ 	* src/valarray-inst.cc:  Likewise.
+ 
+ 2001-03-03  Benjamin Kosnik  
+ 
+ 	* src/misc-inst.cc (__copy_streambufs): Fix typo for alpha.
+ 
+ 2001-03-02  Peter Schmid  
+ 
+ 	* include/bits/istream.tcc: change type of __extracted to __size_type
+ 
+ 2001-03-02  Benjamin Kosnik  
+ 
+ 	* src/wstring-inst.cc: New file.
+ 	* src/Makefile.am (EXTRA_LTLIBRARIES): Remove.
+ 	(libinst_wstring_la_SOURCES): Remove.
+ 	(libstdc___la_LIBADD): Remove libinst_wstring_la.
+ 	(sources): Add wstring-inst.cc
+ 	* acinclude.m4 (GLIBCPP_CHECK_WCHAR_T_SUPPORT): Remove
+ 	libinst_wstring_la.
+ 
+ 2001-03-02  Peter Schmid  
+ 
+ 	* src/locale.cc: initialise __ret with zero
+ 	* src/strstream.cc:cast gptr to int_type
+ 
+ 2001-03-01  Phil Edwards  
+ 
+ 	* docs/html/faq/index.html:  Update broken links.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-02-28  Benjamin Kosnik  
+ 
+ 	libstdc++/2064
+ 	* configure.target: Change irix* to irix6.5* in target_os table.
+ 
+ 2001-02-28  Benjamin Kosnik  
+ 
+ 	libstdc++/2103
+ 	* include/bits/c++config (__GLIBCPP__): Bump number in
+ 	anticipation of 2.92.
+ 
+ 	* include/bits/codecvt.h: Fix typo.
+ 	* include/bits/basic_file.h (__basic_file): Don't use _M_wfile for
+ 	stdio model.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CSTDIO): Enable wchar_t
+ 	instantiations for stdio model.
+ 
+ 2001-02-28  Phil Edwards  
+ 
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE):  Remove GLIBCPP_CFLAGS
+ 	  and GLIBCPP_CXXFLAGS as unused variables.
+ 	* configure.host:  Likewise.
+ 	* configure.target:  Likewise.
+ 	* aclocal.m4:  Regenerated.
+ 	* configure:  Regenerated.
+ 	* Makefile.in:  Regenerated.
+ 	* libio/Makefile.in:  Regenerated.
+ 	* libmath/Makefile.in:  Regenerated.
+ 	* libsupc++/Makefile.in:  Regenerated.
+ 	* src/Makefile.in:  Regenerated.
+ 
+ 2001-02-27  Benjamin Kosnik  
+ 
+ 	libstdc++/1886
+ 	* include/bits/basic_file.h: Include basic_file_model.h.
+ 	* config/c_io_libio.cc: Move to...
+ 	* config/basic_file_libio.cc: Here.
+ 	* config/basic_file_libio.h: New file.
+ 	* config/c_io_stdio.cc: Move to...
+ 	* config/basic_file_stdio.cc: Here.
+ 	* config/basic_file_stdio.h: New file.
+ 	* config/c_io_libio.h: Tweak.
+ 	* config/c_io_stdio.h: Tweak.
+ 	* src/Makefile.am (build_headers): Add basic_file_model.h.
+ 	(sources): Add basic_file.cc, remove c++io.cc.
+ 	* src/Makefile.in: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CSTDIO): Add support for
+ 	basic_file_model.h and basic_file.cc.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/27_io/filebuf.cc (test05): Add regression.
+ 
+ 2001-02-27  Benjamin Kosnik  
+ 
+ 	Correct license.
+ 	* config/cpu/alpha/bits/atomicity.h: Change.
+ 	* config/cpu/arm/bits/atomicit3y.h
+ 	* config/cpu/generic/bits/atomicity.h
+ 	* config/cpu/i386/bits/atomicity.h
+ 	* config/cpu/i486/bits/atomicity.h
+ 	* config/cpu/ia64/bits/atomicity.h
+ 	* config/cpu/powerpc/bits/atomicity.h
+ 	* config/cpu/sparc/sparc32/bits/atomicity.h
+ 	* config/cpu/sparc/sparc64/bits/atomicity.h
+ 	* config/os/aix/bits/atomicity.h
+ 	* config/os/irix/bits/atomicity.h
+ 
+ 2001-02-27  Benjamin Kosnik  
+ 
+ 	* include/bits/std_stdexcept.h (runtime_error): Make string
+ 	member non-const.
+ 	(logic_error): Same.
+ 	* testsuite/19_diagnostics/stdexceptions.cc (test04): Add test.
+ 	(test03): Fix.
+ 
+ 2001-02-26  Benjamin Kosnik  
+ 
+ 	libstdc++/1972
+ 	libstdc++/2089
+ 	* include/bits/std_stdexcept.h (logic_error::logic_error): Use
+ 	string object, not reference.
+ 	(runtime_error::runtime_error): Same.
+ 	* testsuite/19_diagnostics/stdexceptions.cc: New file.
+ 
+ 2001-02-26  Phil Edwards  
+ 
+ 	* acinclude.m4 (GLIBCPP_CONFIGURE):  Update required compiler version.
+ 	  (GLIBCPP_CHECK_COMPILER_FEATURES):  Can safely assume new
+ 	  diagnostics.  Remove WFMT_FLAGS.
+ 	* configure.in:  Replace WFMT_FLAGS with diagnostics options.
+ 	* libsupc++/Makefile.am:  Likewise.
+ 	* src/Makefile.am:  Likewise.
+ 	* aclocal.m4:  Regenerated.
+ 	* configure:  Regenerated.
+ 	* Makefile.in:  Regenerated.
+ 	* libio/Makefile.in:  Regenerated.
+ 	* libmath/Makefile.in:  Regenerated.
+ 	* libsupc++/Makefile.in:  Regenerated.
+ 	* src/Makefile.in:  Regenerated.
+ 
+ 2001-02-26  Phil Edwards  
+ 
+ 	Fixes libstdc++/2079
+ 	* include/backward/iomanip.h:  Expose  manipulators to global
+ 	  namespace.
+ 	* include/backward/iostream.h:  Also expose std::ws.
+ 
+ 2001-02-25  Greg Freemyer 
+ 
+ 	* libmath/mathconf.h (GET_LDOUBLE_MSW64): Fix thinko.
+ 
+ 2001-02-23  Benjamin Kosnik  
+ 
+ 	* include/bits/codecvt.h: Use __builtin_alloca.
+ 	* include/bits/ostream.tcc: Same.
+ 	* include/bits/fstream.tcc: Same.
+ 
+ 2001-02-23  Alexandre Oliva 
+ 
+ 	* mknumeric_limits (CC): Use VAR=${VAR=...} form.
+ 
+ 2001-02-23  David Edelsohn 
+ 
+ 	* mknumeric_limits (CC): Use $BUILD_DIR/../../gcc/xgcc
+ 
+ 2001-02-23  Phil Edwards  
+ 
+ 	c++/2052
+ 	* include/backward/iostream.h:  Expose std::flush in old headers.
+ 
+ 2001-02-23  Gabriel Dos Reis  
+ 
+ 	* mknumeric_limits: Remove special-casing on target.  Use gcc
+ 	instead of g++ to build gen-num-limits.cc
+ 
+ 2001-02-22  Benjamin Kosnik  
+ 
+ 	* tests_flags.in (CXXFLAGS): Add -rpath to gcc build dir.
+ 
+ 	* include/bits/codecvt.h: Use alloca instead of __extension__ for
+ 	the time being.
+ 	* include/bits/ostream.tcc: Same.
+ 	* include/bits/std_ostream.h: Same.
+ 	* include/bits/fstream.tcc: Same.
+ 	* include/bits/locale_facets.tcc: Add typename.
+ 	* include/bits/c++config (_GLIBCPP_FULLY_COMPLIANT_HEADERS): Enable.
+ 
+ 2001-02-21  Phil Edwards  
+ 
+ 	* tests_flags.in:  Remove -n flag from call to echo.
+ 
+ 2001-02-20  Benjamin Kosnik  
+ 
+ 	* config/c_locale_gnu.h: Add clocale include.
+ 
+ 2001-02-20  Phil Edwards  
+ 
+ 	* include/bits/stl_config.h:  Remove file.
+ 	* src/Makefile.am (base_headers):  Remove from list.
+ 	* configure:  Regenerate.
+ 	* Makefile.in:  Ditto.
+ 	* libio/Makefile.in:  Ditto.
+ 	* libmath/Makefile.in:  Ditto.
+ 	* libsupc++/Makefile.in:  Ditto.
+ 	* src/Makefile.in:  Ditto.
+ 
+ 	* include/bits/c++config:  Move relevant macros to here.
+ 	* include/backward/alloc.h:  Include c++config.h instead.
+ 	* include/backward/function.h:  Ditto.
+ 	* include/backward/heap.h:  Ditto.
+ 	* include/backward/pair.h:  Ditto.
+ 	* include/bits/pthread_allocimpl.h:  Ditto.
+ 	* include/bits/std_functional.h:  Ditto.
+ 	* include/bits/std_iterator.h:  Ditto.
+ 	* include/bits/std_numeric.h:  Ditto.
+ 	* include/bits/std_utility.h:  Ditto.
+ 	* include/bits/stl_algobase.h:  Ditto.
+ 	* include/bits/type_traits.h:  Ditto.
+ 	* src/stl-inst.cc:  Ditto.
+ 
+ 2001-02-19  Gabriel Dos Reis  
+ 
+ 	* include/bits/basic_file.h: Add #pragma system_header
+ 	* include/bits/basic_ios.h: Ditto.
+ 	* include/bits/basic_string.h: Ditto.
+ 	* include/bits/char_traits.h: Ditto.
+ 	* include/bits/codecvt.h: Ditto.
+ 	* include/bits/cpp_type_traits.h:  Ditto.
+ 	* include/bits/fpos.h: Ditto.
+ 	* include/bits/gslice.h: Ditto.
+ 	* include/bits/gslice_array.h: Ditto.
+ 	* include/bits/indirect_array.h: Ditto.
+ 	* include/bits/ios_base.h: Ditto.
+ 	* include/bits/limits_generic.h: Ditto.
+ 	* include/bits/locale_facets.h: Ditto.
+ 	* include/bits/localefwd.h: Ditto.
+ 	* include/bits/mask_array.h: Ditto.
+ 	* include/bits/sbuf_iter.h: Ditto.
+ 	* include/bits/sequence_concepts.h: Ditto.
+ 	* include/bits/slice.h: Ditto.
+ 	* include/bits/slice_array.h: Ditto.
+ 	* include/bits/std_algorithm.h: Likewise.
+ 	* include/bits/std_bitset.h: Likewise.
+ 	* include/bits/std_complex.h: Likewise.
+ 	* include/bits/std_deque.h: Likewise.
+ 	* include/bits/std_fstream.h: Likewise.
+ 	* include/bits/std_functional.h: Likewise.
+ 	* include/bits/std_iomanip.h: Likewise.
+ 	* include/bits/std_ios.h: Likewise.
+ 	* include/bits/std_iosfwd.h: Likewise.
+ 	* include/bits/std_iostream.h: Likewise.
+ 	* include/bits/std_istream.h: Likewise.
+ 	* include/bits/std_iterator.h: Likewise.
+ 	* include/bits/std_list.h: Likewise.
+ 	* include/bits/std_locale.h: Likewise.
+ 	* include/bits/std_map.h: Likewise.
+ 	* include/bits/std_memory.h: Likewise.
+ 	* include/bits/std_numeric.h: Likewise.
+ 	* include/bits/std_ostream.h: Likewise.
+ 	* include/bits/std_queue.h: Likewise.
+ 	* include/bits/std_set.h: Likewise.
+ 	* include/bits/std_sstream.h: Likewise.
+ 	* include/bits/std_stack.h: Likewise.
+ 	* include/bits/std_stdexcept.h: Likewise.
+ 	* include/bits/std_streambuf.h: Likewise.
+ 	* include/bits/std_string.h: Likewise.
+ 	* include/bits/std_utility.h: Likewise.
+ 	* include/bits/std_valarray.h: Likewise.
+ 	* include/bits/std_vector.h: Likewise.
+ 	* include/bits/stringfwd.h: Likewise.
+ 	* include/bits/type_traits.h: Likewise.
+ 	* include/bits/valarray_array.h: Likewise.
+ 	* include/bits/valarray_meta.h: Likewise.
+ 
+ 2001-02-19  Andreas Jaeger  
+ 
+ 	* config/cpu/sparc/sparc64/bits/atomicity.h (__compare_and_swap):
+ 	Fix typo.
+ 
+ 2001-02-16  Greg Bumgardner 
+ 
+ 	libstdc++/1734
+ 	* include/bits/std_ostream.h: Replaced usage of
+ 	_Traits::_S_eos() with _CharT() as per section 17.2.2.1.3.
+ 	* include/bits/char_traits.h: Removed non-standard
+ 	methods that cannot be used elsewhere.
+ 
+ 	libstdc++/1885
+ 	* include/bits/basic_ios.h: Uncommented #include of
+ 	bits/basic_ios.tcc
+ 
+ 	libstdc++/1897
+ 	* include/bits/codecvt.h: See next...
+ 	* include/bits/fstream.tcc: See next...
+ 	* include/bits/ostream.tcc: Add __extension__
+ 	to variable-length arrays.
+ 
+ 	libstdc++/1967
+ 	* include/bits/localefwd.h: Changed int counter type to size_t.
+ 
+ 	libstdc++/1968
+ 	* include/bits/std_fstream.h: Added typedef for __ctype_type.
+ 
+ 2001-02-16  Benjamin Kosnik  
+ 
+ 	* testsuite/21_strings/char_traits.cc: Move to ...
+ 	* testsuite/21_strings/char_traits_requirements.cc: ..here.
+ 	* testsuite/21_strings/char_traits-int_type.cc: Move to ...
+ 	* testsuite/21_strings/char_traits_typedefs.cc: ..here.
+ 
+ 2001-02-16  Gabriel Dos Reis  
+ 
+ 	* libmath/mathconf.h (FINITE_P, INFINITE_P): Remove macro
+ 	definitions.
+ 
+ 2001-02-15  Benjamin Kosnik  
+ 
+ 	* include/bits/c++config: Revert.
+ 
+ 2001-02-15  Mark Mitchell  
+ 
+ 	* include/bits/istream.tcc: Use ios_base::iostate in place of
+ 	iostate throughout.  Insert `typename' keyword where necessary.
+ 	* include/bits/ostream.tcc: Insert `typename' keyword where
+ 	necessary.
+ 
+ 2001-02-15  Jeffrey Oldham  
+ 
+ 	* include/bits/c++config (_GLIBCPP_FULLY_COMPLIANT_HEADERS):
+ 	Define so library is compliant.
+ 
+ 2001-02-15  Anthony Green  
+ 
+ 	* acinclude.m4 (glibcpp_toolexeclibdir): Fix test for cross
+ 	compilation.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-02-15  Rodney Brown  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_MATH_DECL_1):
+ 	Include ieeefp.h for fpclass on UnixWare{2,7}.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* mkcheck.in (size_command): Do without GNU-grep when using
+ 	size from binutils.
+ 
+ 2001-02-15  Mark Mitchell  
+ 
+ 	Remove old ABI support from libsupc++.
+ 	* libsupc++/cxxabi.h: Remove conditionally compiled code.
+ 	* libsupc++/exception_support.cc: Likewise.
+ 	* libsupc++/pure.cc: Likewise.
+ 	* libsupc++/tinfo.cc: Likewise.
+ 	* libsupc++/tinfo.h: Likewise.
+ 	* libsupc++/tinfo2.cc: Likewise.
+ 	* libsupc++/typeinfo: Likewise.
+ 	* libsupc++/vec.cc: Likewise.
+ 
+ 2001-02-15  Benjamin Kosnik  
+ 
+ 	Add support for -fno-exceptions.
+ 	* include/bits/exception_support.h: Remove.
+ 	* include/bits/basic_string.h: Remove exception_support.
+ 	(string::_M_check): Replace __OUTOFRANGE with __throw_out_of_range.
+ 	(string::at): Same.
+ 	(string::substr): Same.
+ 	* include/bits/basic_string.tcc (string::reserve): Replace
+ 	__LENGTHERROR with __throw_length_error.
+ 	(string::_S_create): Same.
+ 	(string::resize): Same.
+ 	(string::_M_replace): Same.
+ 	(string::replace): Same.
+ 	(string::copy): Replace __OUTOFRANGE with __throw_out_of_range.
+ 	(string::compare): Same.
+ 	* include/bits/stl_vector.h: Remove exception_support.
+ 	* src/Makefile.am (base_headers): Remove here.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* include/bits/stl_range_errors.h: Remove.
+ 	* include/bits/stl_deque.h: Use __throw_range_error.
+ 	* include/bits/std_deque.h: Include functexcept.h.
+ 	* include/bits/std_vector.h: Same.
+ 	* src/Makefile.am (base_headers): Remove here.
+ 	* src/Makefile.in: Regenerate.
+ 	* include/ext/stl_bvector.h (class __BVECTOR): Use __throw_range_error.
+ 	* include/ext/bvector: Remove stl_range_errors.h
+ 
+ 	* include/bits/c++config (_GLIBCPP_USE_EXCEPTIONS): Remove.
+ 
+ 	* include/bits/functexcept.h: New file.
+ 	* src/functexcept.cc: New file. Definitions for function-based
+ 	exception routines.
+ 	* src/Makefile.am (sources): Add functexcept.cc.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 	* include/bits/stl_config.h (__STL_USE_EXCEPTIONS): Wrap with
+ 	__EXCEPTIONS.
+ 
+ 	* include/bits/localefwd.h: Include functexcept.h.
+ 	* include/bits/std_iosfwd.h: Same.
+ 
+ 	* include/bits/basic_ios.h: Use __throw_ios_failure instead of
+ 	throw basic_ios::failure.
+ 	* include/bits/fstream.tcc (filebuf::_M_allocate_buffers):
+ 	Use __throw_exception_again.
+ 	(filebuf::_M_filebuf_init): Same.
+ 	* include/bits/streambuf.tcc (__copy_streambufs): Same.
+ 	* include/bits/ostream.tcc (ostream::operator<<): Same.
+ 	* include/bits/istream.tcc (istream::operator>>): Same.
+ 	* include/bits/basic_string.tcc (string::_M_mutate): Same.
+ 	(string::_S_construct): Same.
+ 	(string::_M_clone): Same.
+ 	* include/bits/locale_facets.tcc (use_facet(const locale&)): Use
+ 	__throw_bad_cast.
+ 	(num_put<_CharT, _OutIter>::do_put): Use __throw_exception_again.
+ 	* src/localename.cc (locale::_Imp::_Imp(const _Impl&, size_t): Use
+ 	__throw_exception_again.
+ 	(locale::_Imp::_Imp(string, size_t): Same.
+ 	(locale::_Imp::_M_replace_facet): Use __throw_runtime_error.
+ 	* src/locale.cc (locale::_M_coalesce): Use __throw_exception_again.
+ 	(locale::locale(const char*)): Use __throw_runtime_error.
+ 	(locale::classic): Use __throw_exception_again.
+ 	(locale::_S_normalize_category): Use __throw_runtime_error.
+ 
+ 	* src/stdexcept.cc: Remove cruft.
+ 
+ 	* libsupc++/exception_defines.h: New file.
+ 	* libsupc++/new_opnt.cc: Include exception_defines.h.
+ 	* libsupc++/vec.cc: Same.
+ 	(__cxa_vec_new2): Use __throw_exception_again.
+ 	(__cxa_vec_new3): Same.
+ 	(__cxa_vec_ctor): Same.
+ 	(__cxa_vec_delete3): Same.
+ 	(__cxa_vec_cctor): Same.
+ 	(__cxa_vec_delete2): Same.
+ 	(__cxa_vec_dtor): Same.
+ 	* libsupc++/exception_support.cc: Include exception_defines.h. Only
+ 	compile exception-handling bits if __EXCEPTIONS is defined.
+ 	Remove old ABI support.
+ 	* libsupc++/new_op.cc (new): Include exception_defines.h. Use
+ 	std::__throw_bad_alloc() instead of throw bad_alloc.
+ 	* libsupc++/Makefile.am: Add exception_defines.h.
+ 	* libsupc++/Makefile.in: Reformat.
+ 	* libsupc++/*: Format.
+ 
+ 2001-02-15  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  Minor updates and typo fixes.
+ 	* docs/html/faq/index.html:  Updates of the "not really bugs" list.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-02-15  Gabriel Dos Reis  
+ 
+ 	* testsuite/lib/libstdc++.exp: Lift, temporarily, out of
+ 	dejagnu/dg.exp.  Adapt to log options used to run testcases.
+ 
+ 2001-02-13  Gabriel Dos Reis  
+ 
+ 	* testsuite/lib/libstdc++.exp(dg-test): Lift temporarily from
+ 	dejagnu/dg.exp.
+ 
+ 2001-02-13  Dirk Mueller 
+ 	    Phil Edwards  
+ 
+ 	* include/backward/function.h:  Do not use rel_ops for older
+ 	  headers either.
+ 	* include/backward/pair.h:  Likewise.
+ 
+ 2001-02-12  Mark Mitchell  
+ 
+ 	* src/locale.cc: Remove bogus locale::id definitions.
+ 
+ 2001-02-11  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_valarray.h: #undef _DEFINE_LOGICAL_OPERATOR,
+ 	not _DEFINE_VALARRAY_OPERATOR which is not existent.
+ 
+ 	* include/bits/valarray_meta.h (_RefFunClos<>_RefRunClos): Fix
+ 	thinko in member initialisation.
+ 
+ 2001-02-11  Gabriel Dos Reis  
+ 
+ 	* include/bits/std_valarray.h(valarray<>::shift): Avoid
+ 	comparaison between signed and unsigned integer types.
+ 	(valarray<>::cshift): Reformat.
+ 
+ 2001-02-11  Alexandre Oliva  
+ 
+ 	* src/gen-num-limits.cc: Use sigsetjmp and siglongjmp if available.
+ 	* mknumeric_limits: Compile it with -DHAVE_CONFIG_H.
+ 	* configure.in: Test for sigsetjmp.
+ 	* configure, config.h.in: Rebuilt.
+ 
+ 2001-02-11  Gabriel Dos Reis  
+ 
+ 	* src/valarray-inst.cc (gslice::_Indexer::_Indexer): Don't flip
+ 	lengths and strides.
+ 	(__gslice_to_index): Document.
+ 
+ 2001-02-11  Gabriel Dos Reis  
+ 
+ 	* include/bits/char_traits.h char_traits::int_type: Change
+ 	to `int' to match 21.1.3.1/2.
+ 
+ 	* testsuite/21_strings/char_traits-int_type.C: New test.
+ 
+ 2001-02-10  Gabriel Dos Reis  
+ 
+ 	* testsuite/Makefile.am: New file.
+ 
+ 2001-02-09  Nathan Sidwell  
+ 
+ 	* include/c_shadow/bits/std_cstdlib.h (lldiv_t): Fix typo.
+ 
+ 2001-02-08  Loren J. Rittle  
+ 
+ 	* src/locale-inst.cc (fill_n): Instantiate with size_t arguments.
+ 
+ 2001-02-08  David Edelsohn  
+ 
+ 	* configure.target (aix4*): Remove extra set of brackets.
+ 
+ 2001-02-07  Benjamin Kosnik  
+ 
+ 	Clean up stdexcept.
+ 	* include/bits/stringfwd.h: New file.
+ 	* include/bits/stl_string_fwd.h: Remove.
+ 	* include/bits/localefwd.h: Remove declaration for allocator.
+ 	* include/bits/std_iosfwd: Same.
+ 	* include/bits/std_string.h: Include it.
+ 	* include/bits/std_ios.h: Remove include.
+ 	* include/bits/basic_string.h: Tweak.
+ 	* libsupc++/new: Format.
+ 	* src/Makefile.am (base_headers): Add stringfwd.h, remove
+ 	stl_string_fwd.h
+ 	* src/Makefile.in: Regenerate.
+ 	* include/bits/std_stdexcept.h: Rewrite.
+ 	* src/stdexcept.cc: Same.
+ 
+ 2001-02-06  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): Deal with library
+ 	install locations too.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Remove USE_LIBDIR.
+ 	* configure: Regenerate.
+ 	* src/Makefile.am (toolexecdir): Simplify, use
+ 	glibcpp_toolexecdir, glibcpp_toolexeclibdir.
+ 	* src/Makefile.in: Regenerate.
+ 	* libsupc++/Makefile.am: Same.
+ 	* libsupc++/Makefile.in: Regenerate.
+ 
+ 	* src/Makefile.am: Just remove special rules for locale-inst.cc and
+ 	misc-inst.cc as no longer necessary.
+ 
+ 	Follow C++STYLE for naming non-static functions.
+ 	* include/bits/ostream.tcc (_S_pad_char): Not static, rename to
+ 	__pad_char.
+ 	* include/bits/streambuf.tcc: Same.
+ 	* include/bits/ostream.tcc: Same.
+ 	* include/bits/istream.tcc: Same.
+ 	* include/bits/locale_facets.tcc (_S_pad_numeric): To __pad_numeric.
+ 	(_S_output_float): To __output_float.
+ 	* include/bits/std_streambuf.h (_S_copy_streambufs): To
+ 	__copy_streambufs.
+ 	* include/bits/locale_facets.tcc (_S_build_float_format): To
+ 	__build_float_format.
+ 	(_S_format): To __output_integer.
+ 	(_S_fill): To __pad.
+ 	* src/locale.cc: Same.
+ 	* src/misc-inst.cc: Fix formatting. Fix signature for wchar_t. Correct
+ 	names.
+ 	* include/bits/locale_facets.tcc (_S_group_digits): To
+ 	__group_digits.
+ 	* src/locale-inst.cc: Fixup names. Add use_facet instantiations
+ 	for collate, numpunct.
+ 
+ 2001-02-06  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  Fix HTML markup.
+ 	* docs/html/install.html:  Bring up to date.
+ 	* docs/html/17_intro/C++STYLE:  Add global variable conventions.
+ 	* docs/html/21_strings/howto.html:  More notes.
+ 	* docs/html/22_locale/howto.html:  Fix HTML markup.
+ 	* docs/html/27_io/howto.html:  More notes.
+ 	* docs/html/27_io/binary_iostreams_kanze.txt:  New file.
+ 	* docs/html/27_io/binary_iostreams_kuehl.txt:  New file.
+ 
+ 2001-02-06  Jeffrey Oldham  
+ 
+ 	* src/misc-inst.cc (_S_pad_char): Modify declaration's parameters
+ 	to match header files.
+ 	(_S_output_float): Likewise.
+ 	(_S_copy_streambufs): Likewise.
+ 
+ 2001-02-06  Hyman Rosen  
+ 	    Phil Edwards  
+ 
+ 	* include/bits/std_istream.h (op>> signed,unsigned char):  Must
+ 	  use reinterpret_cast, not static_cast.
+ 
+ 2001-02-06  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (gxx_include_dir): Quote, fix regression.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-02-05  Benjamin Kosnik  
+ 
+ 	* include/bits/locale_facets.h (class moneypunct): Fix typos.
+ 	* libsupc++/pure.cc: Revert.
+ 
+ 2001-02-05  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_MATH_DECL_1): New macro.
+ 	(GLIBCPP_CHECK_MATH_DECL_2): New macro.
+ 	(GLIBCPP_CHECK_MATH_DECL_3): New macro.
+ 	(GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1): Use it, check for _* too.
+ 	(GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_2): Same.
+ 	(GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_3): Same.
+ 	(GLIBCPP_CHECK_MATH_SUPPORT): Remove explicit checks for _* versions.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2001-02-05  Mark Mitchell  
+ 
+ 	* include/bits/locale_facets.tcc: Remove `static' keyword on
+ 	function definitions.
+ 	* include/bits/std_streambuf.h: Likewise.
+ 	* src/Makefile.am: Remove use of -fimplicit-templates.
+ 	* src/Makefile.in: Regenerated.
+ 	* src/locale-inst.cc: Explicitly instantiate more functions.
+ 	* src/misc-inst.cc: Likewise.
+ 	* src/string-inst.cc: Likewise.
+ 
+ 2001-02-05  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_EXPORT_INSTALL_INFO): New
+ 	macro. Consolidate all the bits to do with where includes might be
+ 	installed.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Use it.
+ 	* configure: Regenerate.
+ 	* src/Makefile.am (targetincludep): Use simplified rules.
+ 	(targetincludep): Rename gxx_target_include_dir.
+ 	(myincludep): Rename gxx_include_dir.
+ 	* src/Makefile.in: Regenerate.
+ 	* libsupc++/Makefile.am: Use simplified rules.
+ 	* libsupc++/Makefile.in: Regenerate.
+ 
+ 2001-02-05  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cerrno.h: Correct date format for copyright.
+ 	* include/c_std/bits/std_cctype.h: Same.
+ 	* include/c_std/bits/std_cassert.h: Same.
+ 	* include/c_std/bits/std_cstdarg.h: Same.
+ 	* include/c_std/bits/std_cstddef.h: Same.
+ 
+ 	* include/c_std/bits/std_cstdio.h: Undefine all names brought into
+ 	namespace std.
+ 	* include/c_std/bits/std_ctime.h: Same.
+ 	* include/c_std/bits/std_clocale.h: Same.
+ 	* include/c_std/bits/std_cmath.h: Same.
+ 	* include/c_std/bits/std_csetjmp.h: Same.
+ 	* include/c_std/bits/std_csignal.h: Same.
+ 	* include/c_std/bits/std_cstring.h: Same.
+ 	* include/c_std/bits/std_cstdlib.h: Same.
+ 	* include/c_std/bits/std_cwchar.h: Same.
+ 
+ 2001-02-05  Phil Edwards  
+ 
+ 	* testsuite/27_io/ios_base_members_static.cc:  Swap order of tests.
+ 
+ 2001-02-05  Mark Mitchell  
+ 
+ 	* src/string-inst.cc (string::_M_replace): Explicitly instantiate.
+ 	(string::_S_construct): Likewise.
+ 
+ 2001-02-05  Gabriel Dos Reis  
+ 
+ 	* testsuite/config/default.exp: New file.
+ 	* testsuite/config: New directory.
+ 
+ 2001-02-04  Mark Mitchell  
+ 
+ 	* libsupc++/typeinfo (__GXX_MERGED_TYPEINFO_NAMES): New macro.
+ 	* libsupc++/tinfo.cc (std::typeinfo::operator==): Use strcmp
+ 	whenever !__GXX_MERGED_TYPEINFO_NAMES.
+ 	* libsupc++/tinfo2.cc (std::typeinfo::before): Likewise.
+ 
+ 2001-02-03  Alexandre Oliva  
+ 	    Gerald Pfeifer  
+ 
+ 	* Makefile.am (mkinstalldirs): Set.
+ 	* src/Makefile.am (mkinstalldirs): Set.
+ 	* libmath/Makefile.am (mkinstalldirs): Set.
+ 	* libsup++/Makefile.am (mkinstalldirs): Set.
+ 	* libio/Makefile.am (mkinstalldirs): Set.
+ 	* */Makefile.in: Regenerate.
+ 
+ 2001-02-03  Benjamin Kosnik  
+ 
+ 	* include/bits/stl_threads.h (struct _STL_mutex_lock): Same.
+ 	* include/bits/localefwd.h: More initialization cleanups.
+ 
+ 2001-02-03  Jeffrey A Law  
+ 
+ 	* include/bits/ios_base.h (_S_ios_fmtflags_end): Initialize
+ 	correctly targets with 16bit ints.
+ 	(_S_ios_openmode_end): Similarly.
+ 	(_S_ios_iostate_end): Similarly.
+ 	(_S_ios_Seekdir_end): Similarly.
+ 
+ 2001-02-02  Phil Edwards  
+ 
+ 	* mkcheck.in:  Also limit virtual memory size, for mmap-based mallocs.
+ 
+ 2001-02-01  Alexandre Oliva  
+ 
+ 	* configure.in (toplevel_srcdir, auxdir): Set.
+ 	* acinclude.m4 (glibcpp_basedir): Set based on auxdir.
+ 	* aclocal.m4, configure, Makefile.in: Rebuilt.
+ 	* libio/Makefile.in, math/Makefile.in, src/Makefile.in: Likewise.
+ 	* libsupc++-v3/Makefile.am (INCLUDES): Use toplevel_srcdir.
+ 	* libsupc++-v3/Makefile.in: Rebuilt.
+ 	* libsupc++-v3/configure.in, libsupc++-v3/configure: Removed.
+ 	* libsupc++-v3/aclocal.m4, libsupc++-v3/config.h.in: Likewise.
+ 
+ 2001-01-30   Benjamin Kosnik  
+ 
+ 	* config/c_locale_generic.cc: Remove langinfo include.
+ 
+ 2001-01-29  Benjamin Kosnik  
+ 
+ 	Preliminary named locales.
+ 	* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): New macro.
+ 	* aclocal.m4: Regenerate.
+ 	* configure.in: Use it.
+ 	* configure: Regerate.
+ 	* src/Makefile.am (sources): Add c++locale.cc.
+ 	(build_headers): Add c++locale.h.
+ 	* src/Makefile.in: Regenerate.
+ 	* config/c_locale_gnu.h: New file.
+ 	* config/c_locale_gnu.cc: New file. Non-inline member functions
+ 	for named locales, gnu-specific.
+ 	* config/c_locale_generic.h: New file.
+ 	* config/c_locale_generic.cc: New file. Non-inline member
+ 	functions for named locales, generic version.
+ 	* docs/html/configopts.html: Add documentation on new options.
+ 
+ 	* include/bits/locale_facets.h (class _Messages): Remove.
+ 	(class _Moneypunct): Remove.
+ 	* src/locale-inst.cc: Remove.
+ 
+ 	* include/bits/locale_facets.h (class _Collate): Remove.
+ 	* src/locale-inst.cc (std): Remove.
+ 	* src/locale.cc: And here.
+ 
+ 	* include/bits/localefwd.h (locale::_M_coalesce): New
+ 	function. Correctly put together multi-name locales.
+ 	(_Impl(const _Impl&, category, size_t)): Remove.
+ 
+ 	* include/bits/localefwd.h (locale::_Impl): Remove _M_construct_*
+ 	member functions.
+ 	(_M_normalize_category_names): Remove.
+ 	(_M_replace_categories): Fix.
+ 
+ 	* src/localename.cc (locale::_Impl::_M_construct_collate): Remove.
+ 	(locale::_Impl::_M_construct_ctype): Remove.
+ 	(locale::_Impl::_M_construct_monetary): Remove.
+ 	(locale::_Impl::_M_construct_numeric): Remove.
+ 	(locale::_Impl::_M_construct_time): Remove.
+ 	(locale::_Impl::_M_construct_messages): Remove.
+ 
+ 	* include/bits/locale_facets.h (_Bad_use_facet): Remove.
+ 	(_Use_facet_failure_handle): Remove.
+ 	* src/locale.cc: Remove definitions.
+ 	* src/locale-inst.cc: And here.
+ 
+ 	* testsuite/22_locale/ctor_copy_dtor.cc (test01): Fixup. Add tests.
+ 
+ 	* src/localename.cc (locale::facet::_S_create_c_locale): Properly
+ 	create and error-check underlying locale object.
+ 	(locale::facet::_S_destroy_c_locale): Add, take care of properly
+ 	tearing down underlying locale object.
+ 	* include/bits/localefwd.h (locale::facet): Declare.
+ 	* testsuite/22_locale/members.cc: Don't test "fr_FR" locale for
+ 	correctness, as glibc apparently has incorrect info in it. Test
+ 	with it when it works again.....
+ 
+ 	* include/bits/localefwd.h (locale::_Impl::__vec_string):
+ 	Remove. Number of categories is fixed at six, so just simplify and
+ 	make this an array of strings.
+ 	(locale::_Impl::_M_has_name): Remove.
+ 	(locale::_Impl::_M_name): Remove.
+ 	(locale::_Impl::_M_category_names): Turns into...
+ 	(locale::_Impl::_M_names): ...this.
+ 	(locale::_Impl::_M_has_same_name()): New function.
+ 	* src/localename.cc (locale::_Impl::~_Impl()): Remove here.
+ 	(locale::_Impl::_Impl(size_t __refs, string __str)): Simplify
+ 	signature.
+ 	* src/locale.cc (locale::name()): Construct mangled name
+ 	accurately reflecting combined locale categories.
+ 
+ 	* src/locale.cc (locale::classic()): Don't initialize here.
+ 	* src/localename.cc (locale::_Impl::_Impl(size_t __num, size_t
+ 	__refs, bool __has_name, string __str): Do it here.
+ 
+ 	* include/bits/localefwd.h: _S_categories_num to
+ 	_S_num_categories. _S_facets_num to _S_num_facets.
+ 	(locale::id::id()): Explicitly set _M_index to zero.
+ 	* src/locale.cc: Same.
+ 
+ 	* src/locale.cc: (locale::locale(const char*)): Construct named
+ 	locales uniquely.
+ 
+ 	* src/locale.cc: Remove numpunct_byname ctors.
+ 	* testsuite/22_locale/numpunct_byname.cc: New file.
+ 	* testsuite/22_locale/numpunct.cc: New file.
+ 
+ 	* include/bits/localefwd.h (class locale): Change data members to
+ 	protected, from private.
+ 	(_Impl::_M_get_c_locale): Add member function.
+ 	(locale::facet::_M_get_global_impl()): Add member function.
+ 	* include/bits/locale_facets.h (numpunct::_M_init): Change to take
+ 	a __c_locale pointer.
+ 	(numpunct::numpunct( __c_locale*, size_t)): Add additonal ctor for
+ 	named locales.
+ 	* testsuite/22_locale/members.cc: New file, test name and combine.
+ 
+ 	* include/bits/locale_facets.h (class numpunct): Remove class
+ 	_Punct and _Numpunct. Rewrite class numpunct to be correct for
+ 	named locales.
+ 	* include/bits/localefwd.h (locale::_Imp::_M_c_locale): Add.
+ 	* src/localename.cc (_Impl::~_Impl()): Call __frelocale.
+ 	(_Imp::_Impl(size_t, size_t, bool, string)) Initialize _M_c_locale.
+ 	* src/locale-inst.cc: Remove _Numpunct, _Punct instantiations.
+ 	* testsuite/22_locale/numpunct_char_members.cc: New file.
+ 
+ 2001-01-28  Gabriel Dos Reis  
+ 
+ 	* testsuite/README: Add more comment.
+ 	* testsuite/lib/libstdc++.exp: Tweak comment.
+ 
+ 2001-01-26  Benjamin Kosnik  
+ 
+ 	* libsupc++/pure.cc (writestr): Just use cstdio and std::fputs.
+ 
+ 2001-01-25  Loren J. Rittle  
+ 
+ 	* testsuite/21_strings/inserters_extractors.cc: Remove
+ 	explicit reference to 'testsuite/'.
+ 
+ 2001-01-25  Richard Henderson  
+ 
+ 	* config/cpu/alpha/bits/atomicity.h: Remove tricky .subsetion
+ 	bits. Fixes Tru64 build issues.
+ 
+ 2001-01-25  Michael Sokolov  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_GNU_MAKE): Bourne shell portability bug
+ 	(use ${MAKE-make}, not ${MAKE:-make}).
+ 	* aclocal.m4, configure: Regenerate.
+ 
+ 2001-01-25  Mark Mitchell  
+ 
+ 	* src/ios.cc: Remove accidental inclusion of  in last
+ 	checkin.
+ 
+ 	* src/Makefile.am (sources): Add globals.cc.
+ 	* src/Makefile.in: Regenerated.
+ 	* src/globals.cc: New file.
+ 	* src/ios.cc (cin): Don't define here, just declare extern.
+ 	(cout): Likewise.
+ 	(cerr): Likewise.
+ 	(clog): Likewise.
+ 	(wcin): Likewise.
+ 	(wcout): Likewise.
+ 	(wcerr): Likewise.
+ 	(wclog): Likewise.
+ 
+ 2001-01-25  Phil Edwards  
+ 
+ 	* include/bits/std_iterator.h:  Do not include stl_relops.h.
+ 	* include/bits/std_numeric.h:  Ditto.
+ 	* include/bits/stl_algobase.h:  Ditto.
+ 	* include/bits/stl_relops.h:  Add comment warning about problems.
+ 
+ 2001-01-25  Gabriel Dos Reis  
+ 
+ 	* testsuite/27_io/*.cc: Remove explicit reference to 'testsuite/'
+ 	in testcases.  Prepare for the DejaGnu based framework.
+ 	* mkcheck.in: Adjust call to tests_flags.  Don't mmkdir testsuite
+ 	directory -- it is now mkcheck working directory.
+ 	* tests_flags.in: Remove reference to $(top_srcdir).  Use
+ 	${SRC_DIR} instead.
+ 	* Makefile.am (check, check-install): Change mkcheck invocation
+ 	logic.
+ 	* Makefile.in: Regenerate.
+ 
+ 2001-01-24  Mark Mitchell  
+ 
+ 	* config/os/aix/bits/atomicity.h (__compare_and_swap): Remove.
+ 	(__always_swap): Likewise.
+ 
+ 2001-01-23  Chris Demetriou  
+ 
+ 	* libsupc++/exception_support.cc (__terminate_func): Remove
+ 	declaration.
+ 	(__terminate_func_ptr): New typedef.
+ 	(__terminate, __terminate_set_func): New extern function
+ 	prototypes.
+ 	(std::terminate): Use __terminate function.
+ 	(std::set_terminate): Use __terminate_set_func function.
+ 
+ 2001-01-23  Benjamin Kosnik  
+ 
+ 	* configure.target: Just use os_include_dir always.
+ 	* configure.in: Remove calls to GLIBCPP_CHECK_CTYPE_SUPPORT.
+ 	Link atomicity files and ctype files here.
+ 	* configure: Regenerate.
+ 	* acinclude.m4 (GLIBCPP_CHECK_CTYPE_SUPPORT): Remove.
+ 	(GLIBCPP_ENABLE_ATOMICITY): Remove.
+ 	* aclocal.m4: Regenerate.
+ 
+ 2001-01-23  Chris Demetriou  
+ 
+ 	* configure.in: Place definition of MULTISUBDIR in
+ 	libsupc++/Makefile as is done for src/Makefile.
+ 	* configure: Regenerate.
+ 
+ 2001-01-23  Phil Edwards  
+ 
+ 	* acinclude.m4:  Cosmetic changes only.
+ 	* aclocal.m4:  Regenerated.
+ 	* configure:  Regenerated.
+ 	* configure.target:  Update documented list of changed variables.
+ 	* docs/html/install.html:  Fix typo.
+ 	* docs/html/20_util/howto.html:  More notes on auto_ptr.
+ 	* docs/html/27_io/howto.html:  More notes on streabufs.
+ 	* docs/html/faq/index.html:  Add rel_ops problem and mention the
+ 	  DEC as(1) .subsection difficulty.
+ 	* docs/html/faq/index.txt:  Regenerated.
+ 
+ 2001-01-23  Mark Mitchell  
+ 
+ 	* ainclude.m4 (GLIBCPP_CHEC_MATH_DECLS_AND_LINKAGE_1): New macro.
+ 	(GLIBCPP_CHECK_MATH_SUPPORT): Use it.
+ 	(GLIBCPP_CHECK_TYPE_SUPPORT): Don't autoconf ctype information if
+ 	its already provided in config.target.
+ 	* aclocal.m4: Regenerated.
+ 	* configure: Likewise.
+ 	* configure.target: Set ctype_include_dir for lots of systems.
+ 	* libsupc++/Makefile.am: Explicitly include --tag disable-shared.
+ 	* libsupc++/Makefile.in: Regenerated.
+ 
+ 2001-01-23  Gabriel Dos Reis  
+ 
+ 	* testsuite/lib/libstdc++.exp: Improve.  Add support for @xxx#
+ 	keyword capability.
+ 
+ 	* testsuite/README: Add comment.
+ 
+ 2001-01-21  Phil Edwards  
+ 
+ 	* docs/html/configopts.html:  Update for current status.  Fix HTML.
+ 	* docs/html/install.html:  Update for current status.
+ 
+ 2001-01-20  Gabriel Dos Reis  
+ 
+ 	* testsuite/libstdc++.tests/tests.exp: New file.
+ 	* testsuite/lib/libstdc++.exp: Itou.
+ 	* testsuite/README: Itou.
+ 
+ 2001-01-20  Gabriel Dos Reis  
+ 
+ 	* tests_flags.in: Just output the bare minimum to run tests.
+ 	Let's the caller do its own arrangement.
+ 
+ 	* mkcheck.in: Rename INC_PATH to INCLUDES.  Adjust flags
+ 	computations.
+ 
+ 2001-01-19  Gabriel Dos Reis  
+ 
+ 	* testsuite/17_intro: Prepare testcases for new style DejaGnu
+ 	framework.
+ 
+ 2001-01-18  Gabriel Dos Reis  
+ 
+ 	* testsuite/libstdc++.tests, testsuite/lib: New directories.
+ 
+ 2001-01-17  Loren J. Rittle  
+ 
+ 	* mkcheck.in: Construct file names that match $objdir structure.
+ 	* testsuite/27_io/filebuf_members-1.txt: New file.
+ 	* testsuite/27_io/ifstream_members-1.txt: New file.
+ 	* testsuite/27_io/ostream_inserter_char-1.txt: New file.
+ 
+ 	* testsuite/27_io/ios_base_members_static.cc (test02): Add test.
+ 	* testsuite/27_io/ios_base_members_static-1.tst: Add expected output.
+ 
+ 2001-01-17  Peter Schmid  
+ 
+ 	* testsuite/27_io/istream_sentry.cc (test02): Fix.
+ 
+ 2001-01-17  Benjamin Kosnik  
+ 
+ 	libstdc++/1605
+ 	* include/bits/ios_base.h (ios_base::failure): Tighten up throw specs.
+ 	* src/ios.cc (ios_base::failure): Make definitions match.
+ 	* libsupc++/typeinfo (class bad_typeid): Add throw specs.
+ 	(class bad_cast): Same.
+ 	* libsupc++/exception (class exception): Add throw specs.
+ 	* libsupc++/exception_support.cc (set_terminate): Add throw specs.
+ 	(set_unexpected): Same.
+ 	(uncaught_exception): Same.
+ 	(what): Same.
+ 
+ 	* docs/html/17_intro/C++STYLE (classname): Fix.
+ 
+ 2001-01-16  Mark Mitchell  
+ 
+ 	* src/gen-num-limits.cc (INSTANTIATIONS): New macro.
+ 	Use it do explicitly instantiate predicate and value for
+ 	all the builtin Ts.
+ 
+ 2001-01-16  Nathan Sidwell  
+ 
+ 	* libsupc++/exception_support.cc (__cp_pop_exception): Fix
+ 	uninitialized thinko in last change.
+ 
+ 2001-01-16  Mark Mitchell  
+ 
+ 	* libsupc++/exception_support.cc (__cp_pop_exception): Change
+ 	prototype.
+ 
+ 2001-01-16  Benjamin Kosnik  
+ 
+ 	* docs/html/17_intro/C++STYLE (classname): Add more existing
+ 	and stylish patterns.
+ 
+ 	libstdc++/944
+ 	* include/bits/istream.tcc (istream::sentry::sentry()): Set
+ 	failbit if the state of the stream is not good.
+ 	* testsuite/27_io/istream_sentry.cc (test02): Add test.
+ 	* testsuite/27_io/istream_manip.cc (test01): Modify.
+ 
+ 	libstdc++/1019
+ 	reported by Paolo Carlini 
+ 	* include/bits/istream.tcc (operator>>(istream&, string&)): Fix.
+ 	* testsuite/21_strings/inserters_extractors.cc (test08): Add test.
+ 
+ 	libstdc++/1057
+ 	* include/bits/std_streambuf.h (setp): Set _M_buf_size correctly.
+ 	* include/bits/streambuf.tcc (xsputn): Remove outside if clause.
+ 	(xsgetn): Same. Simplify.
+ 	* testsuite/27_io/streambuf.cc (test04): Add testcases.
+ 
+ 	reported by Larry Evans 
+ 	* include/bits/streambuf.tcc (streambuf::xsputn): Just check for
+ 	equality with eof on returned value from overflow.
+ 
+ 2001-01-14  Andreas Jaeger  
+ 
+ 	* libio/libio.h: Add test for glibc 2.0.
+ 
+ 2001-01-12  Benjamin Kosnik  
+ 
+ 	* config/os/djgpp/bits/*: Fix dates.
+ 
+ 	* include/bits/basic_string.h (_S_find(const _CharT* __beg, const
+ 	_CharT* __end, _CharT __c): Remove.
+ 	* include/bits/basic_string.tcc: Substitute traits::find for _S_find.
+ 	* include/bits/char_traits.h: Tweak.
+ 
+ 2001-01-12  Laurynas Biveinis  
+ 
+ 	* acinclude.m4 (GLIBCPP_CHECK_CTYPE_SUPPORT): check for DJGPP 
+ 	(LIB_AC_PROG_CXX): replace [/\\] with [\\/] to work around older
+ 	bash bug.
+ 	* aclocal.m4: regenerated.
+ 	* configure.target: set os_include_dir to config/os/djgpp under DJGPP.
+ 	* configure: regenerated.
+ 	* config/os/djgpp, config/os/djgpp/bits: new directories.
+ 	* config/os/djgpp/bits/ctype_base.h,
+ 	config/os/djgpp/bits/ctype_inline.h,
+ 	config/os/djgpp/bits/ctype_noninline.h,
+ 	config/os/djgpp/bits/os_defines.h: new files.
+ 
+ 2001-01-11   Joseph S. Myers  
+ 
+ 	* include/c_std/bits/std_cstdio.h: Undef printf.
+ 
+ 2001-01-10  Benjamin Kosnik  
+ 
+ 	* src/ios.cc: Fix typo: change cout->wcout.
+ 
+ 	* src/Makefile.am (targetincludep): Fix for version-specific-libs.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-01-10  Peter Schmid  
+ 
+ 	 * include/bits/std_complex.h: Fix a typo.
+ 
+ 2001-01-09  Benjamin Kosnik  
+ 			     
+ 
+ 	Fixes for libstdc++/1576
+ 	* src/stdstreams.cc: Initialize with NULL filebuf. Delete
+ 	file, move contents into....
+ 	* src/ios.cc: ...Here. Put defines for iostreams objects and
+ 	initialization routines into one file to simplify DSO interaction.
+ 	* include/bits/std_iostream.h: Touch.
+ 	* include/bits/ios_base.h (_S_synched_with_stdio): Make static.
+ 	* src/Makefile.am (sources): Remove stdstreams.cc.
+ 	* src/Makefile.in: Regenerate.
+ 
+ 2001-01-10  Gabriel Dos Reis  
+ 
+ 	* tests_flags.in (check_directory): Fix typo.
+ 
+ 2001-01-09  Peter Schmid  
+ 
+ 	 * include/bits/std_complex.h: Fix a typo.
+ 
+ 2001-01-09  Loren J. Rittle  
+ 
+ 	* config/os/bsd/freebsd/bits/ctype_inline.h (is): (Make right
+ 	code path:) Remove magic constants and restructure to handle
+ 	ctype.h bit mask layout changes more gracefully.  (Make fast
+ 	code path:) Use __maskrune (), if available.
+ 	(is): Remove special case for digit and xdigit masks.
+ 
+ 2001-01-09  Robert Lipe 
+ 
+ 	* include/c_std/bits/std_ctime.h: Undefine difftime.
+ 
+ 2001-01-09  Alexandre Oliva  
+ 
+ 	* src/gen-num-limits.cc (signal_adapter): New template function.
+ 	(signal_handler): Use it, instead of signal.
+ 	(traps): Likewise.  Install SIGTRAP handler too.  Don't
+ 	require both tests to trap to set trap_flag.
+ 
+ 2001-01-08  Benjamin Kosnik  
+ 
+ 	* include/bits/fpos.h (fpos:::fpos(streamoff __pos)): Explicitly
+ 	initialize mbstate_t member, name offset data members *off, not pos.
+ 	* include/bits/fstream.tcc (filebuf::filebuf): Same.
+ 
+ 2001-01-08  Benjamin Kosnik  
+ 
+ 	reported by Chris G. Demetriou 
+ 	* configure.in: Change -linux-* to -linux*.
+ 	* configure: Regenerate.
+ 
+ 2001-01-05  Benjamin Kosnik  
+ 
+ 	Fix 27_io/filebuf_members.cc
+ 	* src/localename.cc (locale::_Impl::_Impl(const _Impl& __imp,
+ 	const string& __name, category __cat, size_t __refs): Set
+ 	_M_has_name with _M_name.
+ 	* include/bits/localefwd.h (locale::operator!=): Protect member
+ 	function call with this->.
+ 	* src/locale.cc (locale::operator==): Make fast checks first.
+ 	* include/bits/basic_ios.tcc (basic_ios::init): Simplify.
+ 
+ 	* include/bits/ios_base.h (_M_synced_with_stdio): Add data member
+ 	to ios_base::Init.
+ 	* src/ios.cc (ios_base::Init::Init): Initialize here.
+ 	(ios_base::sync_with_stdio): Set here.
+ 
+ 2001-01-04  Loren J. Rittle  
+ 
+ 	* config/c_io_stdio.cc (__basic_file<_CharT>::sys_open()): On
+ 	systems that support it, call dup() before fdopen().
+ 
+ 2001-01-03  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cwctype.h: Include std_cwchar.h for wint_t.
+ 	* testsuite/17_intro/header_cwctype.cc (main): New file.
+ 
+ 	* src/Makefile.am (base_headers): Change.
+ 	* include/bits/std_string.h: And here.
+ 	* include/bits/string.tcc: Tweaks, move to...
+ 	* include/bits/basic_string.tcc: ...Here.
+ 	* src/string-inst.cc: Simplify, just instantiate the whole class,
+ 	not member-by-member.
+ 
+ 2001-01-02  Benjamin Kosnik  
+ 
+ 	* acinclude.m4 (GLIBCPP_ENABLD_CSTDIO): Add in default value.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 	* include/bits/c++config (__GLIBCPP__): Bump version number.
+ 
+ 	* ChangeLog: Start new log for year 2001
+ 	* ChangeLog-2000: New file.
+ 
+ 	* docs/html/configopts.html: Make sure default values are current,
+ 	add commentary.
+ 
+ 2001-01-01  Benjamin Kosnik  
+ 
+ 	* include/c_std/bits/std_cwchar.h: Same.
+ 	* testsuite/17_intro/header_cwchar.cc: Same.
+ 	* include/c_std/bits/std_ctime.h: Same.
+ 	* testsuite/17_intro/header_ctime.cc: Same.
+ 	* include/c_std/bits/std_cstdlib.h: Same.
+ 	Clean up undefs, make consistent with cwchar and cmath, etc.
+ 	* testsuite/17_intro/header_cstdlib.cc: Same.
+ 	* include/c_std/bits/std_cstdio.h: Same here.
+ 	* testsuite/17_intro/header_cstring.cc: Same.
+ 	* include/c_std/bits/std_cstring.h: Include std_cstddef.h for size_t.
+ 	* testsuite/17_intro/header_cstring.cc: New file. Check for
+ 	size_t in namespace std.
+ 
+ 	* include/c_std/bits/std_cwchar.h: Explicit checks for mbstate_t.
+ 	* acconfig.h (HAVE_MBSTATE_T): Add.
+ 	* config.h.in: Regenerate.
+ 	* acinclude.m4(GLIBCPP_CHECK_WCHAR_T_SUPPORT): Always test for
+ 	mbstate_t.
+ 	* aclocal.m4: Regenerate.
+ 	* configure: Regenerate.
+ 	* testsuite/17_intro/headers_c++.cc: New file.
+ 	* testsuite/17_intro/headers_c.cc: Small changes.
+ 
+ 2001-01-01  David Billinghurst 
+ 
+ 	* tests_flags.in: Fix typo in usage.
+ 
+ 	* tests_flags.in: Set target specific LIBS for cygwin.
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/Makefile.am gcc-3.1/libstdc++-v3/Makefile.am
*** gcc-3.0.4/libstdc++-v3/Makefile.am	Wed Sep  5 22:44:19 2001
--- gcc-3.1/libstdc++-v3/Makefile.am	Mon Jan 28 22:13:02 2002
***************
*** 1,6 ****
  ## Makefile for the toplevel directory of the GNU C++ Standard library.
  ##
! ## Copyright (C) 1997,1998, 1999, 2000, 2001 Free Software Foundation, Inc.
  ##
  ## This file is part of the libstdc++ version 3 distribution.
  ## Process this file with automake to produce Makefile.in.
--- 1,7 ----
  ## Makefile for the toplevel directory of the GNU C++ Standard library.
  ##
! ## Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
! ## Free Software Foundation, Inc.
  ##
  ## This file is part of the libstdc++ version 3 distribution.
  ## Process this file with automake to produce Makefile.in.
***************
*** 24,30 ****
  AUTOMAKE_OPTIONS = 1.3 cygnus
  MAINT_CHARSET = latin1
  
! SUBDIRS = include libio libmath libsupc++ src testsuite
  
  mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
  
--- 25,31 ----
  AUTOMAKE_OPTIONS = 1.3 cygnus
  MAINT_CHARSET = latin1
  
! SUBDIRS = include libio libmath libsupc++ src po testsuite 
  
  mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
  
*************** check-script-install: $(top_builddir)/mk
*** 43,61 ****
  	  cd testsuite; \
  	  @glibcpp_builddir@/mkcheck 1)
  
! # These two rules might seem messy, but are hella worth it.
  doxygen:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  outdir=`pwd`; \
  	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=user $${srcdir} $${outdir})
  
  doxygen-maint:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  outdir=`pwd`; \
! 	  ${srcdir}/docs/doxygen/run_doxygen --mode=maint $${srcdir} $${outdir})
  
! .PHONY: doxygen doxygen-maint
  
  # Multilib support.
  MAKEOVERRIDES=
--- 44,69 ----
  	  cd testsuite; \
  	  @glibcpp_builddir@/mkcheck 1)
  
! # These rules are messy, but are hella worth it.
  doxygen:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
  	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=user $${srcdir} $${builddir})
  
  doxygen-maint:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
! 	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=maint $${srcdir} $${builddir})
  
! doxygen-man:
! 	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
! 	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=man $${srcdir} $${builddir})
! 
! .PHONY: doxygen doxygen-maint doxygen-man
  
  # Multilib support.
  MAKEOVERRIDES=
*************** AM_MAKEFLAGS = \
*** 137,141 ****
  	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
  	"DESTDIR=$(DESTDIR)" \
  	"WERROR=$(WERROR)" 
- 
- 
--- 145,147 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/Makefile.in gcc-3.1/libstdc++-v3/Makefile.in
*** gcc-3.0.4/libstdc++-v3/Makefile.in	Mon Jan 14 18:29:05 2002
--- gcc-3.1/libstdc++-v3/Makefile.in	Tue Apr  2 02:46:03 2002
*************** target_triplet = @target@
*** 66,120 ****
  AR = @AR@
  AS = @AS@
  ATOMICITY_INC_SRCDIR = @ATOMICITY_INC_SRCDIR@
  BASIC_FILE_H = @BASIC_FILE_H@
  CC = @CC@
  CCODECVT_C = @CCODECVT_C@
  CLOCALE_H = @CLOCALE_H@
  CPP = @CPP@
  CSHADOW_FLAGS = @CSHADOW_FLAGS@
  CSTDIO_H = @CSTDIO_H@
  CXX = @CXX@
  CXXCPP = @CXXCPP@
  C_INCLUDE_DIR = @C_INCLUDE_DIR@
  DEBUG_FLAGS = @DEBUG_FLAGS@
  DLLTOOL = @DLLTOOL@
  EXEEXT = @EXEEXT@
  EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@
  GCJ = @GCJ@
  GCJFLAGS = @GCJFLAGS@
  GLIBCPP_INCLUDES = @GLIBCPP_INCLUDES@
  GLIBCPP_IS_CROSS_COMPILING = @GLIBCPP_IS_CROSS_COMPILING@
  LIBIO_INCLUDES = @LIBIO_INCLUDES@
  LIBMATHOBJS = @LIBMATHOBJS@
  LIBMATH_INCLUDES = @LIBMATH_INCLUDES@
- LIBSTRINGOBJS = @LIBSTRINGOBJS@
  LIBSUPCXX_INCLUDES = @LIBSUPCXX_INCLUDES@
  LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
  LIBTOOL = @LIBTOOL@
! LIMITS_INC_SRCDIR = @LIMITS_INC_SRCDIR@
  LN_S = @LN_S@
  MAINT = @MAINT@
  MAKEINFO = @MAKEINFO@
  OBJDUMP = @OBJDUMP@
  OBJEXT = @OBJEXT@
  OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@
  OPT_LDFLAGS = @OPT_LDFLAGS@
  OS_INC_SRCDIR = @OS_INC_SRCDIR@
  PACKAGE = @PACKAGE@
  RANLIB = @RANLIB@
  SECTION_FLAGS = @SECTION_FLAGS@
  SECTION_LDFLAGS = @SECTION_LDFLAGS@
  STRIP = @STRIP@
  TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
! USE_COMPLEX_LONG_DOUBLE = @USE_COMPLEX_LONG_DOUBLE@
  VERSION = @VERSION@
  WARN_FLAGS = @WARN_FLAGS@
  WERROR = @WERROR@
  enable_shared = @enable_shared@
  enable_static = @enable_static@
  glibcpp_CXX = @glibcpp_CXX@
  glibcpp_basedir = @glibcpp_basedir@
  glibcpp_builddir = @glibcpp_builddir@
  glibcpp_prefixdir = @glibcpp_prefixdir@
  glibcpp_srcdir = @glibcpp_srcdir@
  glibcpp_thread_h = @glibcpp_thread_h@
--- 66,146 ----
  AR = @AR@
  AS = @AS@
  ATOMICITY_INC_SRCDIR = @ATOMICITY_INC_SRCDIR@
+ AWK = @AWK@
  BASIC_FILE_H = @BASIC_FILE_H@
+ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+ CATALOGS = @CATALOGS@
+ CATOBJEXT = @CATOBJEXT@
  CC = @CC@
  CCODECVT_C = @CCODECVT_C@
+ CCODECVT_H = @CCODECVT_H@
  CLOCALE_H = @CLOCALE_H@
+ CMESSAGES_H = @CMESSAGES_H@
  CPP = @CPP@
+ CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
  CSHADOW_FLAGS = @CSHADOW_FLAGS@
  CSTDIO_H = @CSTDIO_H@
  CXX = @CXX@
  CXXCPP = @CXXCPP@
  C_INCLUDE_DIR = @C_INCLUDE_DIR@
+ DATADIRNAME = @DATADIRNAME@
  DEBUG_FLAGS = @DEBUG_FLAGS@
  DLLTOOL = @DLLTOOL@
  EXEEXT = @EXEEXT@
  EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@
  GCJ = @GCJ@
  GCJFLAGS = @GCJFLAGS@
+ GENCAT = @GENCAT@
+ GLIBC21 = @GLIBC21@
  GLIBCPP_INCLUDES = @GLIBCPP_INCLUDES@
  GLIBCPP_IS_CROSS_COMPILING = @GLIBCPP_IS_CROSS_COMPILING@
+ GMOFILES = @GMOFILES@
+ GMSGFMT = @GMSGFMT@
+ INSTOBJEXT = @INSTOBJEXT@
+ INTLBISON = @INTLBISON@
+ INTLLIBS = @INTLLIBS@
+ INTLOBJS = @INTLOBJS@
+ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+ LIBICONV = @LIBICONV@
  LIBIO_INCLUDES = @LIBIO_INCLUDES@
  LIBMATHOBJS = @LIBMATHOBJS@
  LIBMATH_INCLUDES = @LIBMATH_INCLUDES@
  LIBSUPCXX_INCLUDES = @LIBSUPCXX_INCLUDES@
  LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@
  LIBTOOL = @LIBTOOL@
! LIBUNWIND_FLAG = @LIBUNWIND_FLAG@
  LN_S = @LN_S@
  MAINT = @MAINT@
  MAKEINFO = @MAKEINFO@
+ MKINSTALLDIRS = @MKINSTALLDIRS@
+ MSGFMT = @MSGFMT@
  OBJDUMP = @OBJDUMP@
  OBJEXT = @OBJEXT@
  OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@
  OPT_LDFLAGS = @OPT_LDFLAGS@
  OS_INC_SRCDIR = @OS_INC_SRCDIR@
  PACKAGE = @PACKAGE@
+ POFILES = @POFILES@
+ POSUB = @POSUB@
  RANLIB = @RANLIB@
  SECTION_FLAGS = @SECTION_FLAGS@
  SECTION_LDFLAGS = @SECTION_LDFLAGS@
  STRIP = @STRIP@
  TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
! USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
! USE_NLS = @USE_NLS@
  VERSION = @VERSION@
  WARN_FLAGS = @WARN_FLAGS@
  WERROR = @WERROR@
+ check_msgfmt = @check_msgfmt@
  enable_shared = @enable_shared@
  enable_static = @enable_static@
  glibcpp_CXX = @glibcpp_CXX@
+ glibcpp_MOFILES = @glibcpp_MOFILES@
+ glibcpp_POFILES = @glibcpp_POFILES@
  glibcpp_basedir = @glibcpp_basedir@
  glibcpp_builddir = @glibcpp_builddir@
+ glibcpp_localedir = @glibcpp_localedir@
  glibcpp_prefixdir = @glibcpp_prefixdir@
  glibcpp_srcdir = @glibcpp_srcdir@
  glibcpp_thread_h = @glibcpp_thread_h@
*************** glibcpp_toolexeclibdir = @glibcpp_toolex
*** 123,134 ****
  gxx_include_dir = @gxx_include_dir@
  ifGNUmake = @ifGNUmake@
  libio_la = @libio_la@
  toplevel_srcdir = @toplevel_srcdir@
  
  AUTOMAKE_OPTIONS = 1.3 cygnus
  MAINT_CHARSET = latin1
  
! SUBDIRS = include libio libmath libsupc++ src testsuite
  
  mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
  
--- 149,162 ----
  gxx_include_dir = @gxx_include_dir@
  ifGNUmake = @ifGNUmake@
  libio_la = @libio_la@
+ libtool_VERSION = @libtool_VERSION@
+ release_VERSION = @release_VERSION@
  toplevel_srcdir = @toplevel_srcdir@
  
  AUTOMAKE_OPTIONS = 1.3 cygnus
  MAINT_CHARSET = latin1
  
! SUBDIRS = include libio libmath libsupc++ src po testsuite 
  
  mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
  
*************** check-script-install: $(top_builddir)/mk
*** 471,489 ****
  	  cd testsuite; \
  	  @glibcpp_builddir@/mkcheck 1)
  
! # These two rules might seem messy, but are hella worth it.
  doxygen:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  outdir=`pwd`; \
  	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=user $${srcdir} $${outdir})
  
  doxygen-maint:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  outdir=`pwd`; \
! 	  ${srcdir}/docs/doxygen/run_doxygen --mode=maint $${srcdir} $${outdir})
  
! .PHONY: doxygen doxygen-maint
  
  # Multilib Makefile bits.
  .PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
--- 499,524 ----
  	  cd testsuite; \
  	  @glibcpp_builddir@/mkcheck 1)
  
! # These rules are messy, but are hella worth it.
  doxygen:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
  	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=user $${srcdir} $${builddir})
  
  doxygen-maint:
  	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
! 	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=maint $${srcdir} $${builddir})
  
! doxygen-man:
! 	-(srcdir=`cd ${top_srcdir}; pwd`; \
! 	  builddir=`pwd`; \
! 	  /bin/sh ${srcdir}/docs/doxygen/run_doxygen \
! 	            --mode=man $${srcdir} $${builddir})
! 
! .PHONY: doxygen doxygen-maint doxygen-man
  
  # Multilib Makefile bits.
  .PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/README gcc-3.1/libstdc++-v3/README
*** gcc-3.0.4/libstdc++-v3/README	Mon Jun 11 19:40:26 2001
--- gcc-3.1/libstdc++-v3/README	Tue Mar  5 21:22:14 2002
***************
*** 1,72 ****
  file: libstdc++-v3/README
  
! New users may wish to point their web browsers to the file documentation.html
! in the 'docs/html' subdirectory.  It contains brief building instructions and
! notes on how to configure the library in interesting ways.
! 
  
! Instructions for configuring and building this snapshot appear
! in docs/html/install.html.
  
! This directory contains the files needed to create [a still broken
! subset of] an ISO Standard C++ Library.
  
  It has subdirectories:
  
    docs
!      Files in HTML and text format that document usage, quirks of the
!      implementation, and contributor checklists.
  
!   include/bits
!      Files included by standard headers and by other files in
!      the bits directory.  Includes a set of files bits/std_xxxx.h
!      that implement the standard headers .
  
!   include/std
!      Files meant to be found by #include  directives in
!      standard-conforming user programs.  These headers are not
!      referred to by other headers, because such dependencies
!      confuse Make (leading it to delete them, all too often).
!      Installations may substitute symbolic links in place of
!      these files.
  
!   include/ext
!      Headers that define extensions to the standard library.  No
!      standard header refers to any of them.
  
!   include/backward
!      Headers provided for backward compatibility, such as .
!      They are not used in this library.
  
!   include/c_shadow
!      Headers intended to shadow standard C headers provided by an
!      underlying OS or C library, and other headers depended on directly
!      by C++ headers (e.g. unistd.h).  These are meant to wrap the names
!      defined there into the _C_legacy namespace.
!      [NB: this can be enabled via --enable-cheaders=c_shadow]
  
!   include/c
!      Headers intended to directly include standard C headers. 
!      [NB: this can be enabled via --enable-cheaders=c]
  
!   include/c_std
!      Headers intended to include standard C headers, and put select
!      names into the std:: namespace.
!      [NB: this is the default, and is the same as --enable-cheaders=c_std]
  
    src
!      Files that are used in constructing the library, but are not
!      installed.
  
!   testsuites/17_* to 27_*
!      Test programs are here, and may be used to begin to exercise the 
!      library.  Support for "make check" and "make check-install" is
!      complete, and runs through all the subdirectories here when this
!      command is issued from the build directory.  Please note that
!      "make check" requires DejaGNU 1.4 or later to be installed.  Please
!      note that "make check-script" calls the script mkcheck, which
!      requires bash, and which may need the paths to bash adjusted to
!      work properly, as /bin/bash is assumed.
  
  Other subdirectories contain variant versions of certain files
  that are meant to be copied or linked by the configure script.
--- 1,72 ----
  file: libstdc++-v3/README
  
! New users may wish to point their web browsers to the file
! documentation.html in the 'docs/html' subdirectory.  It contains brief
! building instructions and notes on how to configure the library in
! interesting ways.
  
! Instructions for configuring and building appear in
! docs/html/install.html.
  
! This directory contains the files needed to create an ISO Standard C++
! Library.
  
  It has subdirectories:
  
    docs
!     Files in HTML and text format that document usage, quirks of the
!     implementation, and contributor checklists.
  
!   include
!     All header files for the C++ library are within this directory,
!     modulo specific runtime-related files that are in the libsupc++
!     directory.
  
!     include/std
!       Files meant to be found by #include  directives in
!       standard-conforming user programs.  
  
!     include/c
!       Headers intended to directly include standard C headers. 
!       [NB: this can be enabled via --enable-cheaders=c]
  
!     include/c_std
!       Headers intended to include standard C headers, and put select
!       names into the std:: namespace.
!       [NB: this is the default, and is the same as --enable-cheaders=c_std]
  
!     include/c_shadow
!       Headers intended to shadow standard C headers provided by an
!       underlying OS or C library, and other headers depended on directly
!       by C++ headers (e.g. unistd.h).  These are meant to wrap the names
!       defined there into the _C_legacy namespace.
!       [NB: this can be enabled via --enable-cheaders=c_shadow]
  
!     include/bits
!       Files included by standard headers and by other files in
!       the bits directory. 
  
!     include/backward
!       Headers provided for backward compatibility, such as .
!       They are not used in this library.
! 
!     include/ext
!       Headers that define extensions to the standard library.  No
!       standard header refers to any of them.
  
    src
!     Files that are used in constructing the library, but are not
!     installed.
  
!   testsuites/[thread, 17_* to 27_*]
!     Test programs are here, and may be used to begin to exercise the 
!     library.  Support for "make check" and "make check-install" is
!     complete, and runs through all the subdirectories here when this
!     command is issued from the build directory.  Please note that
!     "make check" requires DejaGNU 1.4 or later to be installed.  Please
!     note that "make check-script" calls the script mkcheck, which
!     requires bash, and which may need the paths to bash adjusted to
!     work properly, as /bin/bash is assumed.
  
  Other subdirectories contain variant versions of certain files
  that are meant to be copied or linked by the configure script.
*************** Currently these are:
*** 74,101 ****
  
    config/cpu
    config/os
  
! Files needed only to construct the library, but not installed,
! are in src/.  Files to be copied as part of an installation are
! all found in the subdirectories mentioned above.  (A configure
! script may link files from another directory into one of these.)
  
! In a normal installation the bits/ directory is copied
! under the std/ directory, and arranged to be searched only
! when an include directive specifies a filename of "bits/..."
! or .  When building the library, we use
  
!   -I. -Iinclude/std -Iinclude -Iconfig/os/* -Iconfig/cpu/*
  
! to get the same effect.
  
  Note that glibc also has a bits/ subdirectory.  We will either
  need to be careful not to collide with names in its bits/
  directory; or rename bits to (e.g.) cppbits/.
  
- To install libstdc++ you need GNU make.  The makefiles do not work with
- any other make.
- 
  In files throughout the system, lines marked with an "XXX" indicate
  a bug or incompletely-implemented feature.  Lines marked "XXX MT"
  indicate a place that may require attention for multi-thread safety.
--- 74,102 ----
  
    config/cpu
    config/os
+   config/io
+   config/locale
  
! In addition, three subdirectories are convenience libraries:
  
!   libio
!     Contains the subset of the GNU libio library needed for
!     C++. Currently not used.
  
!   libmath
!     Support routines needed for C++ math. Only needed if the
!     underlying "C" implementation is non-existent, in particular
!     required or optimal long double, long long, and C99 functionality.
  
!   libsupc++
!     Contains the runtime library for C++, including exception
!     handling and memory allocation and deallocation, RTTI, terminate
!     handlers, etc.
  
  Note that glibc also has a bits/ subdirectory.  We will either
  need to be careful not to collide with names in its bits/
  directory; or rename bits to (e.g.) cppbits/.
  
  In files throughout the system, lines marked with an "XXX" indicate
  a bug or incompletely-implemented feature.  Lines marked "XXX MT"
  indicate a place that may require attention for multi-thread safety.
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/acconfig.h gcc-3.1/libstdc++-v3/acconfig.h
*** gcc-3.0.4/libstdc++-v3/acconfig.h	Fri Nov  2 22:39:01 2001
--- gcc-3.1/libstdc++-v3/acconfig.h	Fri Dec 14 21:06:32 2001
***************
*** 1,5 ****
--- 1,15 ----
  // acconfig.h symbols and macros for libstdc++ v3 -*- C++ -*-
  
+ // Defines libstdc++ version.
+ #undef PACKAGE
+ #undef VERSION
+ 
+ // Needed for gettext.
+ #undef ENABLE_NLS
+ #undef HAVE_CATGETS
+ #undef HAVE_GETTEXT
+ #undef HAVE_STPCPY
+ 
  // Define if GCC supports weak symbols.
  #undef _GLIBCPP_SUPPORTS_WEAK
  
***************
*** 24,29 ****
--- 34,42 ----
  // Define if using setrlimit to limit memory usage during 'make check'.
  #undef _GLIBCPP_MEM_LIMITS
  
+ // Define to use concept checking code from the boost libraries.
+ #undef _GLIBCPP_CONCEPT_CHECKS
+ 
  // Define if you have the atan2f function.
  #undef _GLIBCPP_HAVE_ATAN2F 
  
***************
*** 42,47 ****
--- 55,72 ----
  // Define if you have the modfl function.
  #undef HAVE_MODFL
  
+ // Define if you have the expf function.
+ #undef HAVE_EXPF
+ 
+ // Define if you have the expl function.
+ #undef HAVE_EXPL
+ 
+ // Define if you have the hypotf function.
+ #undef HAVE_HYPOTF
+ 
+ // Define if you have the hypotl function.
+ #undef HAVE_HYPOTL
+ 
  // Define if the compiler/host combination has __builtin_abs
  #undef HAVE___BUILTIN_ABS
  
***************
*** 75,82 ****
  // Define if the compiler/host combination has __builtin_sinl
  #undef HAVE___BUILTIN_SINL
  
! // Define if the compiler/host combination has __builtin_fsqrt
! #undef HAVE___BUILTIN_FSQRT
  
  // Define if the compiler/host combination has __builtin_sqrtf
  #undef HAVE___BUILTIN_SQRTF
--- 100,107 ----
  // Define if the compiler/host combination has __builtin_sinl
  #undef HAVE___BUILTIN_SINL
  
! // Define if the compiler/host combination has __builtin_sqrt
! #undef HAVE___BUILTIN_SQRT
  
  // Define if the compiler/host combination has __builtin_sqrtf
  #undef HAVE___BUILTIN_SQRTF
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/acinclude.m4 gcc-3.1/libstdc++-v3/acinclude.m4
*** gcc-3.0.4/libstdc++-v3/acinclude.m4	Fri Jan 18 22:58:24 2002
--- gcc-3.1/libstdc++-v3/acinclude.m4	Thu Apr  4 21:35:31 2002
*************** AC_DEFUN(GLIBCPP_CONFIGURE, [
*** 12,22 ****
      *)   AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
     esac], [multilib=yes])dnl
  
    glibcpp_basedir=$srcdir/$toprel/$1/libstdc++-v3
    AC_SUBST(glibcpp_basedir)
  
-   AM_INIT_AUTOMAKE(libstdc++, 3.0.0)
- 
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
    ifdef([AC_PROG_CC_G],[],[define([AC_PROG_CC_G],defn([_AC_PROG_CC_G]))])
--- 12,70 ----
      *)   AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
     esac], [multilib=yes])dnl
  
+   # When building with srcdir == objdir, links to the source files will
+   # be created in directories within the target_subdir.  We have to
+   # adjust toplevel_srcdir accordingly, so that configure finds
+   # install-sh and other auxiliary files that live in the top-level
+   # source directory.
+   if test "${srcdir}" = "."; then
+     if test -z "${with_target_subdir}"; then
+       toprel=".."
+     else
+       if test "${with_target_subdir}" != "."; then
+         toprel="${with_multisrctop}../.."
+       else
+         toprel="${with_multisrctop}.."
+       fi
+     fi
+   else
+     toprel=".."
+   fi
+   AC_CONFIG_AUX_DIR(${srcdir}/$toprel)
+   toplevel_srcdir=\${top_srcdir}/$toprel
+   AC_SUBST(toplevel_srcdir)
+ 
+   # Export build and source directories.
+   # These need to be absolute paths, yet at the same time need to
+   # canonicalize only relative paths, because then amd will not unmount
+   # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
+   glibcpp_builddir=`pwd`
+   case $srcdir in
+   [\\/$]* | ?:[\\/]*) glibcpp_srcdir=${srcdir} ;;
+   *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
+   esac
+   AC_SUBST(glibcpp_builddir)
+   AC_SUBST(glibcpp_srcdir)
+ 
+   dnl This is here just to satisfy automake.
+   ifelse(not,equal,[AC_CONFIG_AUX_DIR(..)])
+ 
+   AC_PROG_AWK
+   # Will set LN_S to either 'ln -s' or 'ln'.  With autoconf 2.5x, can also
+   # be 'cp -p' if linking isn't available.
+   #ac_cv_prog_LN_S='cp -p'
+   AC_PROG_LN_S
+ 
+   # We use these options to decide which functions to include.
+   AC_ARG_WITH(target-subdir,
+   [  --with-target-subdir=SUBDIR
+                           configuring in a subdirectory])
+   AC_ARG_WITH(cross-host,
+   [  --with-cross-host=HOST  configuring with a cross compiler])
+ 
    glibcpp_basedir=$srcdir/$toprel/$1/libstdc++-v3
    AC_SUBST(glibcpp_basedir)
  
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
    ifdef([AC_PROG_CC_G],[],[define([AC_PROG_CC_G],defn([_AC_PROG_CC_G]))])
*************** AC_DEFUN(GLIBCPP_CONFIGURE, [
*** 24,116 ****
    ifdef([AC_PROG_CXX_G],[],[define([AC_PROG_CXX_G],defn([_AC_PROG_CXX_G]))])
    ifdef([AC_PROG_CXX_GNU],[],[define([AC_PROG_CXX_GNU],defn([_AC_PROG_CXX_GNU]))])
  
! #  AC_PROG_CC
! 
! # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
! # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
! # are probably using a cross compiler, which will not be able to fully
! # link an executable.  This should really be fixed in autoconf
! # itself.
  
! AC_DEFUN(LIB_AC_PROG_CC,
! [AC_BEFORE([$0], [AC_PROG_CPP])dnl
! dnl Fool anybody using AC_PROG_CC.
! AC_PROVIDE([AC_PROG_CC])
! AC_CHECK_PROG(CC, gcc, gcc)
! if test -z "$CC"; then
!   AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
!   test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
! fi
  
! AC_PROG_CC_GNU
  
! if test $ac_cv_prog_gcc = yes; then
!   GCC=yes
! dnl Check whether -g works, even if CFLAGS is set, in case the package
! dnl plays around with CFLAGS (such as to build both debugging and
! dnl normal versions of a library), tasteless as that idea is.
!   ac_test_CFLAGS="${CFLAGS+set}"
!   ac_save_CFLAGS="$CFLAGS"
!   CFLAGS=
!   AC_PROG_CC_G
!   if test "$ac_test_CFLAGS" = set; then
!     CFLAGS="$ac_save_CFLAGS"
!   elif test $ac_cv_prog_cc_g = yes; then
!     CFLAGS="-g -O2"
    else
!     CFLAGS="-O2"
    fi
! else
!   GCC=
!   test "${CFLAGS+set}" = set || CFLAGS="-g"
! fi
! ])
! 
! LIB_AC_PROG_CC
  
! # Can't just call these here as g++ requires libstc++ to be built....
! #  AC_PROG_CXX
  
! # Likewise for AC_PROG_CXX.
! AC_DEFUN(LIB_AC_PROG_CXX,
! [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
! dnl Fool anybody using AC_PROG_CXX.
! AC_PROVIDE([AC_PROG_CXX])
! # Use glibcpp_CXX so that we do not cause CXX to be cached with the
! # flags that come in CXX while configuring libstdc++.  They're different
! # from those used for all other target libraries.  If CXX is set in
! # the environment, respect that here.
! glibcpp_CXX=$CXX
! AC_CHECK_PROGS(glibcpp_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
! AC_SUBST(glibcpp_CXX)
! CXX=$glibcpp_CXX
! test -z "$glibcpp_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
  
! AC_PROG_CXX_GNU
  
! if test $ac_cv_prog_gxx = yes; then
!   GXX=yes
! dnl Check whether -g works, even if CXXFLAGS is set, in case the package
! dnl plays around with CXXFLAGS (such as to build both debugging and
! dnl normal versions of a library), tasteless as that idea is.
!   ac_test_CXXFLAGS="${CXXFLAGS+set}"
!   ac_save_CXXFLAGS="$CXXFLAGS"
!   CXXFLAGS=
!   AC_PROG_CXX_G
!   if test "$ac_test_CXXFLAGS" = set; then
!     CXXFLAGS="$ac_save_CXXFLAGS"
!   elif test $ac_cv_prog_cxx_g = yes; then
!     CXXFLAGS="-g -O2"
    else
!     CXXFLAGS="-O2"
    fi
! else
!   GXX=
!   test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
! fi
! ])
  
! LIB_AC_PROG_CXX
  
    AC_CHECK_TOOL(AS, as)
    AC_CHECK_TOOL(AR, ar)
--- 72,163 ----
    ifdef([AC_PROG_CXX_G],[],[define([AC_PROG_CXX_G],defn([_AC_PROG_CXX_G]))])
    ifdef([AC_PROG_CXX_GNU],[],[define([AC_PROG_CXX_GNU],defn([_AC_PROG_CXX_GNU]))])
  
!   # AC_PROG_CC
!   # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
!   # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
!   # are probably using a cross compiler, which will not be able to fully
!   # link an executable.  This is addressed in later versions of autoconf.
  
!   AC_DEFUN(LIB_AC_PROG_CC,
!   [AC_BEFORE([$0], [AC_PROG_CPP])dnl
!   dnl Fool anybody using AC_PROG_CC.
!   AC_PROVIDE([AC_PROG_CC])
!   AC_CHECK_PROG(CC, gcc, gcc)
!   if test -z "$CC"; then
!     AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
!     test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
!   fi
  
!   AC_PROG_CC_GNU
  
!   if test $ac_cv_prog_gcc = yes; then
!     GCC=yes
!   dnl Check whether -g works, even if CFLAGS is set, in case the package
!   dnl plays around with CFLAGS (such as to build both debugging and
!   dnl normal versions of a library), tasteless as that idea is.
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS=
!     AC_PROG_CC_G
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     elif test $ac_cv_prog_cc_g = yes; then
!       CFLAGS="-g -O2"
!     else
!       CFLAGS="-O2"
!     fi
    else
!     GCC=
!     test "${CFLAGS+set}" = set || CFLAGS="-g"
    fi
!   ])
  
!   LIB_AC_PROG_CC
  
!   # Likewise for AC_PROG_CXX.  We can't just call it directly because g++
!   # will try to link in libstdc++.
!   AC_DEFUN(LIB_AC_PROG_CXX,
!   [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
!   dnl Fool anybody using AC_PROG_CXX.
!   AC_PROVIDE([AC_PROG_CXX])
!   # Use glibcpp_CXX so that we do not cause CXX to be cached with the
!   # flags that come in CXX while configuring libstdc++.  They're different
!   # from those used for all other target libraries.  If CXX is set in
!   # the environment, respect that here.
!   glibcpp_CXX=$CXX
!   AC_CHECK_PROGS(glibcpp_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
!   AC_SUBST(glibcpp_CXX)
!   CXX=$glibcpp_CXX
!   test -z "$glibcpp_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
  
!   AC_PROG_CXX_GNU
  
!   if test $ac_cv_prog_gxx = yes; then
!     GXX=yes
!     dnl Check whether -g works, even if CXXFLAGS is set, in case the package
!     dnl plays around with CXXFLAGS (such as to build both debugging and
!     dnl normal versions of a library), tasteless as that idea is.
!     ac_test_CXXFLAGS="${CXXFLAGS+set}"
!     ac_save_CXXFLAGS="$CXXFLAGS"
!     CXXFLAGS=
!     AC_PROG_CXX_G
!     if test "$ac_test_CXXFLAGS" = set; then
!       CXXFLAGS="$ac_save_CXXFLAGS"
!     elif test $ac_cv_prog_cxx_g = yes; then
!       CXXFLAGS="-g -O2"
!     else
!       CXXFLAGS="-O2"
!     fi
    else
!     GXX=
!     test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
    fi
!   ])
  
!   LIB_AC_PROG_CXX
! 
!   # For some reason, gettext needs this.
!   AC_ISC_POSIX
  
    AC_CHECK_TOOL(AS, as)
    AC_CHECK_TOOL(AR, ar)
*************** LIB_AC_PROG_CXX
*** 123,130 ****
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which cant create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we dont execute it, since we dont care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
--- 170,177 ----
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which can't create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we don't execute it, since we don't care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
*************** LIB_AC_PROG_CXX
*** 144,149 ****
--- 191,197 ----
    # This does for the target what configure.host does for the host.  In
    # addition to possibly modifying the same flags, it also sets up symlinks.
    GLIBCPP_CHECK_TARGET
+ 
  ])
  
  
*************** AC_DEFUN(GLIBCPP_CHECK_COMPILER_FEATURES
*** 209,215 ****
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" && test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    AC_MSG_RESULT($ac_fdsections)
--- 257,264 ----
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" &&
!      test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    AC_MSG_RESULT($ac_fdsections)
*************** dnl safe (like an empty string).
*** 227,232 ****
--- 276,283 ----
  dnl
  dnl Define SECTION_LDFLAGS='-Wl,--gc-sections' if possible.
  dnl Define OPT_LDFLAGS='-Wl,-O1' if possible.
+ dnl Define LD, with_gnu_ld, and (possibly) glibcpp_gnu_ld_version as
+ dnl side-effects of testing.
  dnl
  dnl GLIBCPP_CHECK_LINKER_FEATURES
  AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, [
*************** AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, 
*** 237,244 ****
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    AC_REQUIRE([AC_PROG_LD])
  
    # Set --gc-sections.
!   if test "$ac_cv_prog_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
--- 288,319 ----
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    AC_REQUIRE([AC_PROG_LD])
  
+   # The name set by libtool depends on the version of libtool.  Shame on us
+   # for depending on an impl detail, but c'est la vie.  Older versions used
+   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
+   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
+   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
+   # set (hence we're using an older libtool), then set it.
+   if test x${with_gnu_ld+set} != xset; then
+     if test x${ac_cv_prog_gnu_ld+set} != xset; then
+       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
+       with_gnu_ld=no
+     else
+       with_gnu_ld=$ac_cv_prog_gnu_ld
+     fi
+   fi
+ 
+   # Start by getting the version number.  I think the libtool test already
+   # does some of this, but throws away the result.
+   changequote(,)
+   ldver=`$LD --version 2>/dev/null | head -1 | \
+          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
+   changequote([,])
+   glibcpp_gnu_ld_version=`echo $ldver | \
+          $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
+ 
    # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
*************** AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, 
*** 276,282 ****
    fi
  
    # Set linker optimization flags.
!   if test x"$ac_cv_prog_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
--- 351,357 ----
    fi
  
    # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 331,337 ****
      GLIBCPP_CHECK_MATH_DECL_1(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 406,412 ----
      GLIBCPP_CHECK_MATH_DECL_1(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 398,404 ****
      GLIBCPP_CHECK_MATH_DECL_2(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 473,479 ----
      GLIBCPP_CHECK_MATH_DECL_2(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 444,450 ****
      GLIBCPP_CHECK_MATH_DECL_3(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 519,525 ----
      GLIBCPP_CHECK_MATH_DECL_3(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_STDLIB_DECL_AND_L
*** 479,484 ****
--- 554,588 ----
  
  
  dnl
+ dnl Check to see if the (stdlib function) argument passed is
+ dnl 1) declared when using the c++ compiler
+ dnl 2) has "C" linkage
+ dnl
+ dnl argument 1 is name of function to check
+ dnl
+ dnl ASSUMES argument is a function with THREE parameters
+ dnl
+ dnl GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3
+ AC_DEFUN(GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3, [
+   AC_MSG_CHECKING([for $1 declaration])
+   if test x${glibcpp_cv_func_$1_use+set} != xset; then
+     AC_CACHE_VAL(glibcpp_cv_func_$1_use, [
+       AC_LANG_SAVE
+       AC_LANG_CPLUSPLUS
+       AC_TRY_COMPILE([#include ], 
+                      [ $1(0, 0, 0);], 
+                      [glibcpp_cv_func_$1_use=yes], [glibcpp_cv_func_$1_use=no])
+       AC_LANG_RESTORE
+     ])
+   fi
+   AC_MSG_RESULT($glibcpp_cv_func_$1_use)
+   if test x$glibcpp_cv_func_$1_use = x"yes"; then
+     AC_CHECK_FUNCS($1)    
+   fi
+ ])
+ 
+ 
+ dnl
  dnl Because the builtins are picky picky picky about the arguments they take, 
  dnl do an explict linkage tests here.
  dnl Check to see if the (math function) argument passed is
*************** dnl check for __builtin_fabl
*** 533,539 ****
  dnl check for __builtin_labs
  dnl check for __builtin_sqrtf
  dnl check for __builtin_sqrtl
! dnl check for __builtin_fsqrt
  dnl check for __builtin_sinf
  dnl check for __builtin_sin
  dnl check for __builtin_sinl
--- 637,643 ----
  dnl check for __builtin_labs
  dnl check for __builtin_sqrtf
  dnl check for __builtin_sqrtl
! dnl check for __builtin_sqrt
  dnl check for __builtin_sinf
  dnl check for __builtin_sin
  dnl check for __builtin_sinl
*************** AC_DEFUN(GLIBCPP_CHECK_BUILTIN_MATH_SUPP
*** 552,558 ****
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_labs)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtf)
!   GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_fsqrt)
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtl)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinf)
--- 656,662 ----
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_labs)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtf)
!   GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrt)
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtl)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinf)
*************** AC_DEFUN(GLIBCPP_CHECK_BUILTIN_MATH_SUPP
*** 582,588 ****
      AC_DEFINE(HAVE___BUILTIN_SIN)
      AC_DEFINE(HAVE___BUILTIN_SINF)
      AC_DEFINE(HAVE___BUILTIN_SINL)
!     AC_DEFINE(HAVE___BUILTIN_FSQRT)
      AC_DEFINE(HAVE___BUILTIN_SQRTF)
      AC_DEFINE(HAVE___BUILTIN_SQRTL)
    fi
--- 686,692 ----
      AC_DEFINE(HAVE___BUILTIN_SIN)
      AC_DEFINE(HAVE___BUILTIN_SINF)
      AC_DEFINE(HAVE___BUILTIN_SINL)
!     AC_DEFINE(HAVE___BUILTIN_SQRT)
      AC_DEFINE(HAVE___BUILTIN_SQRTF)
      AC_DEFINE(HAVE___BUILTIN_SQRTL)
    fi
*************** AC_DEFUN(GLIBCPP_CHECK_STDLIB_SUPPORT, [
*** 607,612 ****
--- 711,717 ----
    CXXFLAGS='-fno-builtins -D_GNU_SOURCE'
  
    GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtold)
+   GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtof)
    AC_CHECK_FUNCS(drand48)
  
    CXXFLAGS="$ac_save_CXXFLAGS"
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_SUPPORT, [
*** 652,657 ****
--- 757,763 ----
    GLIBCPP_CHECK_MATH_DECLS_AND_LINKAGES_1(float round,
                                            float_round,
                                            ceilf floorf)
+   GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(expf)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(isnanf)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(isinff)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_2(atan2f)
*************** AC_DEFUN(GLIBCPP_CHECK_COMPLEX_MATH_SUPP
*** 738,754 ****
    AC_CHECK_LIB(m, main)
    AC_REPLACE_MATHFUNCS(nan copysignf)
  
    dnl Compile the long double complex functions only if the function 
    dnl provides the non-complex long double functions that are needed.
    dnl Currently this includes copysignl, which should be
    dnl cached from the GLIBCPP_CHECK_MATH_SUPPORT macro, above.
-   USE_COMPLEX_LONG_DOUBLE=no
    if test x$ac_cv_func_copysignl = x"yes"; then
!     USE_COMPLEX_LONG_DOUBLE=yes
!     AC_REPLACE_MATHFUNCS(signbitl)
    fi
  
!   AC_SUBST(USE_COMPLEX_LONG_DOUBLE)
  ])
  
  
--- 844,862 ----
    AC_CHECK_LIB(m, main)
    AC_REPLACE_MATHFUNCS(nan copysignf)
  
+   dnl For __signbit to signbit conversions.
+   AC_CHECK_FUNCS([__signbit], , [LIBMATHOBJS="$LIBMATHOBJS signbit.lo"])
+   AC_CHECK_FUNCS([__signbitf], , [LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"])
+ 
    dnl Compile the long double complex functions only if the function 
    dnl provides the non-complex long double functions that are needed.
    dnl Currently this includes copysignl, which should be
    dnl cached from the GLIBCPP_CHECK_MATH_SUPPORT macro, above.
    if test x$ac_cv_func_copysignl = x"yes"; then
!     AC_CHECK_FUNCS([__signbitl], , [LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"])
    fi
  
!   AC_SUBST(LIBMATHOBJS)
  ])
  
  
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 788,798 ****
  
    dnl Sanity check for existence of ISO C99 headers for extended encoding.
    AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
!   AC_CHECK_HEADER(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
    
    dnl Only continue checking if the ISO C99 headers exist and support is on.
!   if test x"$ac_has_wchar_h" = xyes && test x"$ac_has_wctype_h" = xyes \
!      && test x"$enable_c_mbchar" != xno; then
        
      dnl Test wchar.h for WCHAR_MIN, WCHAR_MAX, which is needed before
      dnl numeric_limits can instantiate type_traits
--- 896,907 ----
  
    dnl Sanity check for existence of ISO C99 headers for extended encoding.
    AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
!   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
    
    dnl Only continue checking if the ISO C99 headers exist and support is on.
!   if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
        
      dnl Test wchar.h for WCHAR_MIN, WCHAR_MAX, which is needed before
      dnl numeric_limits can instantiate type_traits
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 827,834 ****
      ac_wfuncs=no)
  
      AC_MSG_CHECKING([for ISO C99 wchar_t support])
!     if test x"$has_weof" = xyes && test x"$has_wchar_minmax" = xyes \
!        && test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
--- 936,944 ----
      ac_wfuncs=no)
  
      AC_MSG_CHECKING([for ISO C99 wchar_t support])
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 851,858 ****
      LIBS="$ac_save_LIBS"
  
      AC_MSG_CHECKING([for XPG2 wchar_t support])
!     if test x"$ac_has_iconv_h" = xyes && test x"$ac_has_langinfo_h" = xyes \
!        && test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
--- 961,969 ----
      LIBS="$ac_save_LIBS"
  
      AC_MSG_CHECKING([for XPG2 wchar_t support])
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 862,869 ****
      dnl At the moment, only enable wchar_t specializations if all the
      dnl above support is present.
      AC_MSG_CHECKING([for enabled wchar_t specializations])
!     if test x"$ac_isoC99_wchar_t" = xyes \
!     && test x"$ac_XPG2_wchar_t" = xyes; then
        AC_DEFINE(_GLIBCPP_USE_WCHAR_T)
        AC_MSG_RESULT("yes")
      else
--- 973,980 ----
      dnl At the moment, only enable wchar_t specializations if all the
      dnl above support is present.
      AC_MSG_CHECKING([for enabled wchar_t specializations])
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
        AC_DEFINE(_GLIBCPP_USE_WCHAR_T)
        AC_MSG_RESULT("yes")
      else
*************** dnl
*** 972,979 ****
  dnl Check for which locale library to use:  gnu or generic.
  dnl
  dnl GLIBCPP_ENABLE_CLOCALE
! dnl --enable-clocale=gnu sets config/c_locale_gnu.cc and friends
! dnl --enable-clocale=generic sets config/c_locale_generic.cc and friends
  dnl 
  dnl default is generic
  dnl
--- 1083,1090 ----
  dnl Check for which locale library to use:  gnu or generic.
  dnl
  dnl GLIBCPP_ENABLE_CLOCALE
! dnl --enable-clocale=gnu sets config/locale/c_locale_gnu.cc and friends
! dnl --enable-clocale=generic sets config/locale/c_locale_generic.cc and friends
  dnl 
  dnl default is generic
  dnl
*************** AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
*** 984,1006 ****
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    ], 
    if test x$enable_clocale = xno; then
!      enable_clocale=generic
    fi,
!      enable_clocale=generic)
  
    enable_clocale_flag=$enable_clocale
  
!   dnl Check if a valid locale package
    case x${enable_clocale_flag} in
      xgnu)
-       CLOCALE_H=config/c_locale_gnu.h
-       CLOCALE_CC=config/c_locale_gnu.cc
        AC_MSG_RESULT(gnu)
        ;;
!     xgeneric)
!       CLOCALE_H=config/c_locale_generic.h
!       CLOCALE_CC=config/c_locale_generic.cc
        AC_MSG_RESULT(generic)
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
--- 1095,1218 ----
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    ], 
    if test x$enable_clocale = xno; then
!      enable_clocale=no
    fi,
!      enable_clocale=no)
  
    enable_clocale_flag=$enable_clocale
  
!   dnl Probe for locale support if no specific model is specified.
!   dnl Default to "generic"
!   if test x$enable_clocale_flag = xno; then
!     case x${target_os} in
!       xlinux* | xgnu*)
! 	AC_EGREP_CPP([_GLIBCPP_ok], [
!         #include 
!         #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) 
!           _GLIBCPP_ok
!         #endif
!         ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
! 
! 	# Test for bugs early in glibc-2.2.x series
!   	if test x$enable_clocale_flag = xgnu; then
!     	  AC_TRY_RUN([
! 	  #define _GNU_SOURCE 1
! 	  #include 
! 	  int main()
! 	  {
!   	    const char __one[] = "Äuglein Augmen";
!   	    const char __two[] = "Äuglein";
!   	    int i;
!   	    int j;
!   	    __locale_t	loc;
!    	    __locale_t	loc_dup;
!   	    loc = __newlocale(1 << LC_ALL, "de_DE", 0);
!   	    loc_dup = __duplocale(loc);
!   	    i = __strcoll_l(__one, __two, loc);
!   	    j = __strcoll_l(__one, __two, loc_dup);
!   	    return 0;
! 	  }
! 	  ], 
! 	  [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
! 	  [enable_clocale_flag=generic])
!   	fi
! 
! 	# ... at some point put __strxfrm_l tests in as well.
!         ;;
!       *)
! 	enable_clocale_flag=generic
! 	;;
!     esac
!   fi
! 
!   dnl Deal with gettext issues.
!   AC_ARG_ENABLE(nls,
!   [  --enable-nls            use Native Language Support (default)],
!   , enable_nls=yes)
!   USE_NLS=no
! 
!   dnl Set configure bits for specified locale package
    case x${enable_clocale_flag} in
+     xgeneric)
+       AC_MSG_RESULT(generic)
+ 
+       CLOCALE_H=config/locale/generic/c_locale.h
+       CLOCALE_CC=config/locale/generic/c_locale.cc
+       CCODECVT_H=config/locale/generic/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/generic/messages_members.h
+       CMESSAGES_CC=config/locale/generic/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
+       ;;
      xgnu)
        AC_MSG_RESULT(gnu)
+ 
+       # Declare intention to use gettext, and add support for specific
+       # languages.
+       # For some reason, ALL_LINGUAS has to be before AM_GNU_GETTEXT
+       ALL_LINGUAS="de fr"
+ 
+       # Don't call AM_GNU_GETTEXT here. Instead, assume glibc.
+       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
+       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
+ 	USE_NLS=yes
+       fi
+ 
+       # Export the build objects.
+       for ling in $ALL_LINGUAS; do \
+         glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \
+         glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \
+       done
+       AC_SUBST(glibcpp_MOFILES)
+       AC_SUBST(glibcpp_POFILES)
+ 
+       CLOCALE_H=config/locale/gnu/c_locale.h
+       CLOCALE_CC=config/locale/gnu/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/gnu/collate_members.cc
+       CCTYPE_CC=config/locale/gnu/ctype_members.cc
+       CMESSAGES_H=config/locale/gnu/messages_members.h
+       CMESSAGES_CC=config/locale/gnu/messages_members.cc
+       CMONEY_CC=config/locale/gnu/monetary_members.cc
+       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
+       CTIME_CC=config/locale/gnu/time_members.cc
        ;;
!     xieee_1003.1-2001)
        AC_MSG_RESULT(generic)
+ 
+       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
+       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
+       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
*************** AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
*** 1008,1015 ****
--- 1220,1241 ----
        ;;
    esac
  
+   # This is where the testsuite looks for locale catalogs, using the
+   # -DLOCALEDIR define during testsuite compilation.
+   glibcpp_localedir=${glibcpp_builddir}/po/share/locale
+   AC_SUBST(glibcpp_localedir)
+ 
+   AC_SUBST(USE_NLS)
    AC_SUBST(CLOCALE_H)
+   AC_SUBST(CCODECVT_H)
+   AC_SUBST(CMESSAGES_H)
    AC_LINK_FILES($CLOCALE_CC, src/c++locale.cc)
+   AC_LINK_FILES($CCOLLATE_CC, src/collate.cc)
+   AC_LINK_FILES($CCTYPE_CC, src/ctype.cc)
+   AC_LINK_FILES($CMESSAGES_CC, src/messages.cc)
+   AC_LINK_FILES($CMONEY_CC, src/monetary.cc)
+   AC_LINK_FILES($CNUMERIC_CC, src/numeric.cc)
+   AC_LINK_FILES($CTIME_CC, src/time.cc)
  ])
  
  
*************** dnl
*** 1017,1023 ****
  dnl Check for which I/O library to use:  libio, or something specific.
  dnl
  dnl GLIBCPP_ENABLE_CSTDIO
! dnl --enable-cstdio=libio sets config/c_io_libio.h and friends
  dnl 
  dnl default is stdio
  dnl
--- 1243,1249 ----
  dnl Check for which I/O library to use:  libio, or something specific.
  dnl
  dnl GLIBCPP_ENABLE_CSTDIO
! dnl --enable-cstdio=libio sets config/io/c_io_libio.h and friends
  dnl 
  dnl default is stdio
  dnl
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1037,1045 ****
    dnl Check if a valid I/O package
    case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/c_io_libio.h
!       BASIC_FILE_H=config/basic_file_libio.h
!       BASIC_FILE_CC=config/basic_file_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
--- 1263,1271 ----
    dnl Check if a valid I/O package
    case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/io/c_io_libio.h
!       BASIC_FILE_H=config/io/basic_file_libio.h
!       BASIC_FILE_CC=config/io/basic_file_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1094,1102 ****
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/c_io_stdio.h
!       BASIC_FILE_H=config/basic_file_stdio.h
!       BASIC_FILE_CC=config/basic_file_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
--- 1320,1328 ----
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/io/c_io_stdio.h
!       BASIC_FILE_H=config/io/basic_file_stdio.h
!       BASIC_FILE_CC=config/io/basic_file_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1113,1119 ****
    AC_LINK_FILES($BASIC_FILE_CC, src/basic_file.cc)
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/c_io_libio_codecvt.c
    AC_SUBST(CCODECVT_C)
    # 2000-08-04 bkoz hack
  
--- 1339,1345 ----
    AC_LINK_FILES($BASIC_FILE_CC, src/basic_file.cc)
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/io/c_io_libio_codecvt.c
    AC_SUBST(CCODECVT_C)
    # 2000-08-04 bkoz hack
  
*************** void foo()
*** 1193,1199 ****
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS=-S
     if AC_TRY_EVAL(ac_compile); then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
--- 1419,1425 ----
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS="-S -fexceptions"
     if AC_TRY_EVAL(ac_compile); then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
*************** EOF
*** 1205,1211 ****
     rm -f conftest*])
     if test x$enable_sjlj_exceptions = xyes; then
       AC_DEFINE(_GLIBCPP_SJLJ_EXCEPTIONS, 1,
! 	[Define if the compiler is configured for setjmp/longjmp exceptions.])
       ac_exception_model_name=sjlj
     elif test x$enable_sjlj_exceptions = xno; then
       ac_exception_model_name="call frame"
--- 1431,1437 ----
     rm -f conftest*])
     if test x$enable_sjlj_exceptions = xyes; then
       AC_DEFINE(_GLIBCPP_SJLJ_EXCEPTIONS, 1,
!         [Define if the compiler is configured for setjmp/longjmp exceptions.])
       ac_exception_model_name=sjlj
     elif test x$enable_sjlj_exceptions = xno; then
       ac_exception_model_name="call frame"
*************** EOF
*** 1218,1223 ****
--- 1444,1478 ----
  
  
  dnl
+ dnl Check for libunwind exception handling support. If enabled then
+ dnl we assume that the _Unwind_* functions that make up the Unwind ABI
+ dnl (_Unwind_RaiseException, _Unwind_Resume, etc.) are defined by
+ dnl libunwind instead of libgcc and that libstdc++ has a dependency
+ dnl on libunwind as well as libgcc.
+ dnl
+ dnl GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS
+ dnl --enable-libunwind-exceptions forces the use of libunwind.
+ dnl --disable-libunwind-exceptions assumes there is no libunwind.
+ dnl
+ dnl Define _GLIBCPP_LIBUNWIND_EXCEPTIONS if requested.
+ dnl
+ AC_DEFUN(GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS, [
+   AC_MSG_CHECKING([for use of libunwind])
+   AC_ARG_ENABLE(libunwind-exceptions,
+   [  --enable-libunwind-exceptions  force use of libunwind for exceptions],
+   use_libunwind_exceptions=$enableval,
+   use_libunwind_exceptions=no)
+   AC_MSG_RESULT($use_libunwind_exceptions)
+   dnl Option parsed, now set things appropriately
+   if test x"$use_libunwind_exceptions" = xyes; then
+     LIBUNWIND_FLAG="-lunwind"
+   else
+     LIBUNWIND_FLAG=""
+   fi
+   AC_SUBST(LIBUNWIND_FLAG)
+ ])
+ 
+ dnl
  dnl Check for ISO/IEC 9899:1999 "C99" support.
  dnl
  dnl GLIBCPP_ENABLE_C99
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1234,1240 ****
  
    AC_ARG_ENABLE(c99,
    changequote(<<, >>)dnl
!   <<--enable-c99      turns on 'ISO/IEC 9899:1999 support' [default=>>GLIBCPP_ENABLE_C99_DEFAULT],
    changequote([, ])dnl
    [case "$enableval" in
     yes) enable_c99=yes ;;
--- 1489,1495 ----
  
    AC_ARG_ENABLE(c99,
    changequote(<<, >>)dnl
!   <<--enable-c99            turns on 'ISO/IEC 9899:1999 support' [default=>>GLIBCPP_ENABLE_C99_DEFAULT],
    changequote([, ])dnl
    [case "$enableval" in
     yes) enable_c99=yes ;;
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1276,1282 ****
  		  void foo(char* fmt, ...)
  		  {va_list args; va_start(args, fmt);
  	          vfscanf(stderr, "%i", args);}],
! 	          [],, [ac_c99_stdio=no])	
    AC_TRY_COMPILE([#include 
  		  #include 
  		  void foo(char* fmt, ...)
--- 1531,1537 ----
  		  void foo(char* fmt, ...)
  		  {va_list args; va_start(args, fmt);
  	          vfscanf(stderr, "%i", args);}],
! 	          [],, [ac_c99_stdio=no])
    AC_TRY_COMPILE([#include 
  		  #include 
  		  void foo(char* fmt, ...)
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1334,1342 ****
    AC_MSG_RESULT($ac_c99_wchar)
  
    AC_MSG_CHECKING([for enabled ISO C99 support])
!   if test x"$ac_c99_math" = x"no" || test x"$ac_c99_stdio" = x"no" \
!       || test x"$ac_c99_stdlib" = x"no" \
!       || test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    AC_MSG_RESULT($enable_c99)
--- 1589,1598 ----
    AC_MSG_RESULT($ac_c99_wchar)
  
    AC_MSG_CHECKING([for enabled ISO C99 support])
!   if test x"$ac_c99_math" = x"no" ||
!      test x"$ac_c99_stdio" = x"no" ||
!      test x"$ac_c99_stdlib" = x"no" ||
!      test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    AC_MSG_RESULT($enable_c99)
*************** changequote([, ])
*** 1436,1442 ****
      c_shadow) 
          CSHADOW_FLAGS="-fno-builtin"
          C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
-         AC_DEFINE(_GLIBCPP_USE_SHADOW_HEADERS)
          ;;
      c_std)   
          CSHADOW_FLAGS=""
--- 1692,1697 ----
*************** changequote([, ])
*** 1450,1456 ****
  
    AC_SUBST(CSHADOW_FLAGS)
    AC_SUBST(C_INCLUDE_DIR)
!   AM_CONDITIONAL(GLIBCPP_USE_CSHADOW, test "$enable_cheaders" = c_shadow)
  ])
  
  
--- 1705,1712 ----
  
    AC_SUBST(CSHADOW_FLAGS)
    AC_SUBST(C_INCLUDE_DIR)
!   AM_CONDITIONAL(GLIBCPP_C_HEADERS_C, test "$enable_cheaders" = c)
!   AM_CONDITIONAL(GLIBCPP_C_HEADERS_C_STD, test "$enable_cheaders" = c_std)
  ])
  
  
*************** dnl  GLIBCPP_EXPORT_INSTALL_INFO
*** 1535,1542 ****
  dnl  calculates gxx_install_dir
  dnl  exports glibcpp_toolexecdir
  dnl  exports glibcpp_toolexeclibdir
- dnl  exports glibcpp_builddir
- dnl  exports glibcpp_srcdir
  dnl  exports glibcpp_prefixdir
  dnl
  dnl Assumes cross_compiling bits already done, and with_cross_host in
--- 1791,1796 ----
*************** dnl particular
*** 1544,1562 ****
  dnl
  dnl GLIBCPP_EXPORT_INSTALL_INFO
  AC_DEFUN(GLIBCPP_EXPORT_INSTALL_INFO, [
! 
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
- 
- # Export build and source directories.
- # These need to be absolute paths, yet at the same time need to
- # canonicalize only relative paths, because then amd will not unmount
- # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
- glibcpp_builddir=`pwd`
- case $srcdir in
- [\\/$]* | ?:[\\/]*) glibcpp_srcdir=${srcdir} ;;
- *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
- esac
  glibcpp_prefixdir=${prefix}
  
  AC_MSG_CHECKING([for interface version number])
--- 1798,1807 ----
  dnl
  dnl GLIBCPP_EXPORT_INSTALL_INFO
  AC_DEFUN(GLIBCPP_EXPORT_INSTALL_INFO, [
! # Assumes glibcpp_builddir, glibcpp_srcdir are alreay set up and
! # exported correctly in GLIBCPP_CONFIGURE.
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
  glibcpp_prefixdir=${prefix}
  
  AC_MSG_CHECKING([for interface version number])
*************** if test $version_specific_libs = yes; th
*** 1602,1608 ****
    gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    changequote([,])dnl
--- 1847,1855 ----
    gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   if test x"$gxx_include_dir" = x"no"; then
!     gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
!   fi
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    changequote([,])dnl
*************** fi
*** 1617,1623 ****
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
--- 1864,1871 ----
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" &&
!      test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
*************** fi
*** 1629,1636 ****
  AC_MSG_CHECKING([for install location])
  AC_MSG_RESULT($gxx_include_dir)
  
- AC_SUBST(glibcpp_builddir)
- AC_SUBST(glibcpp_srcdir)
  AC_SUBST(glibcpp_prefixdir)
  AC_SUBST(gxx_include_dir)
  AC_SUBST(glibcpp_toolexecdir)
--- 1877,1882 ----
*************** AC_SUBST(glibcpp_toolexeclibdir)
*** 1638,1665 ****
  ])
  
  
- # Check whether LC_MESSAGES is available in .
- # Ulrich Drepper , 1995.
- #
- # This file file be copied and used freely without restrictions.  It can
- # be used in projects which are not available under the GNU Public License
- # but which still want to provide support for the GNU gettext functionality.
- # Please note that the actual code is *not* freely available.
- 
- # serial 1
- 
- AC_DEFUN(AC_LC_MESSAGES, [
-   AC_CHECK_HEADER(locale.h, [
-     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
-       [AC_TRY_LINK([#include ], [return LC_MESSAGES],
-        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
-     if test $ac_cv_val_LC_MESSAGES = yes; then
-       AC_DEFINE(HAVE_LC_MESSAGES)
-     fi
-   ])
- ])
- 
- 
  # Check for functions in math library.
  # Ulrich Drepper , 1998.
  #
--- 1884,1889 ----
*************** AC_DEFUN(AC_LC_MESSAGES, [
*** 1672,1697 ****
  
  dnl AC_REPLACE_MATHFUNCS(FUNCTION...)
  AC_DEFUN(AC_REPLACE_MATHFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])
! AC_SUBST(LIBMATHOBJS)dnl
! ])
! 
! 
! # Check for string functions.
! # Ulrich Drepper , 1998.
! #
! # This file can be copied and used freely without restrictions.  It can
! # be used in projects which are not available under the GNU Public License
! # but which still want to provide support for the GNU gettext functionality.
! # Please note that the actual code is *not* freely available.
! 
! # serial 1
! 
! dnl AC_REPLACE_STRINGFUNCS(FUNCTION...)
! AC_DEFUN(AC_REPLACE_STRINGFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBSTRINGOBJS="$LIBSTRINGOBJS ${ac_func}.lo"])
! AC_SUBST(LIBSTRINGOBJS)dnl
! ])
  
  
  dnl This macro searches for a GNU version of make.  If a match is found, the
--- 1896,1902 ----
  
  dnl AC_REPLACE_MATHFUNCS(FUNCTION...)
  AC_DEFUN(AC_REPLACE_MATHFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])])
  
  
  dnl This macro searches for a GNU version of make.  If a match is found, the
*************** AC_DEFUN(GLIBCPP_CHECK_SETRLIMIT, [
*** 1791,1799 ****
      # Check for rlimit, setrlimit.
      AC_CACHE_VAL(ac_setrlimit, [
        AC_TRY_COMPILE([#include 
!                       #include 
!                      ],
!                      [ struct rlimit r; setrlimit(0, &r);],
                       [ac_setrlimit=yes], [ac_setrlimit=no])
      ])
    fi
--- 1996,2004 ----
      # Check for rlimit, setrlimit.
      AC_CACHE_VAL(ac_setrlimit, [
        AC_TRY_COMPILE([#include 
! 		      #include 
! 		     ], 
!                      [ struct rlimit r; setrlimit(0, &r);], 
                       [ac_setrlimit=yes], [ac_setrlimit=no])
      ])
    fi
*************** dnl
*** 1816,1821 ****
--- 2021,2029 ----
  dnl GLIBCPP_CONFIGURE_TESTSUITE  [no args]
  AC_DEFUN(GLIBCPP_CONFIGURE_TESTSUITE, [
    GLIBCPP_CHECK_SETRLIMIT
+ 
+   # Look for setenv, so that extended locale tests can be performed.
+   GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
  ])
  
  
*************** AC_DEFUN([AC_PROG_LD])
*** 1830,1832 ****
--- 2038,2186 ----
  ])
  
  
+ # Check whether LC_MESSAGES is available in .
+ # Ulrich Drepper , 1995.
+ #
+ # This file file be copied and used freely without restrictions.  It can
+ # be used in projects which are not available under the GNU Public License
+ # but which still want to provide support for the GNU gettext functionality.
+ # Please note that the actual code is *not* freely available.
+ 
+ # serial 1
+ 
+ AC_DEFUN(AC_LC_MESSAGES, [
+   AC_CHECK_HEADER(locale.h, [
+     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
+       [AC_TRY_LINK([#include ], [return LC_MESSAGES],
+        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
+     if test $ac_cv_val_LC_MESSAGES = yes; then
+       AC_DEFINE(HAVE_LC_MESSAGES)
+     fi
+   ])
+ ])
+ 
+ 
+ dnl
+ dnl Check for whether the Boost-derived checks should be turned on.
+ dnl
+ dnl GLIBCPP_ENABLE_CONCEPT_CHECKS
+ dnl --enable-concept-checks turns them on.
+ dnl --disable-concept-checks leaves them off.
+ dnl  +  Usage:  GLIBCPP_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
+ dnl       Where DEFAULT is either `yes' or `no'.  If ommitted, it
+ dnl       defaults to `no'.
+ AC_DEFUN(GLIBCPP_ENABLE_CONCEPT_CHECKS, [dnl
+ define([GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT], ifelse($1, yes, yes, no))dnl
+ AC_ARG_ENABLE(concept-checks,
+ changequote(<<, >>)dnl
+ <<  --enable-concept-checks use Boost-derived template checks [default=>>GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT],
+ changequote([, ])dnl
+ [case "$enableval" in
+  yes) enable_concept_checks=yes ;;
+  no)  enable_concept_checks=no ;;
+  *)   AC_MSG_ERROR([Unknown argument to enable/disable concept checks]) ;;
+  esac],
+ enable_concept_checks=GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT)dnl
+ dnl Option parsed, now set things appropriately
+ if test x"$enable_concept_checks" = xyes; then
+   AC_DEFINE(_GLIBCPP_CONCEPT_CHECKS)
+ fi
+ ])
+ 
+ 
+ dnl
+ dnl Add version tags to symbols in shared library (or not), additionally
+ dnl marking other symbols as private/local (or not).
+ dnl
+ dnl GLIBCPP_ENABLE_SYMVERS
+ dnl --enable-symvers=style adds a version script to the linker call when
+ dnl       creating the shared library.  The choice of version script is
+ dnl       controlled by 'style'.
+ dnl --disable-symvers does not.
+ dnl  +  Usage:  GLIBCPP_ENABLE_SYMVERS[(DEFAULT)]
+ dnl       Where DEFAULT is either `yes' or `no'.  If ommitted, it
+ dnl       defaults to `no'.  Passing `yes' tries to choose a default style
+ dnl       based on linker characteristics.  Passing 'no' disables versioning.
+ AC_DEFUN(GLIBCPP_ENABLE_SYMVERS, [dnl
+ define([GLIBCPP_ENABLE_SYMVERS_DEFAULT], ifelse($1, yes, yes, no))dnl
+ AC_ARG_ENABLE(symvers,
+ changequote(<<, >>)dnl
+ <<  --enable-symvers=style  enables symbol versioning of the shared library [default=>>GLIBCPP_ENABLE_SYMVERS_DEFAULT],
+ changequote([, ])dnl
+ [case "$enableval" in
+  yes) enable_symvers=yes ;;
+  no)  enable_symvers=no ;;
+  # other names here, just as sanity checks
+  #gnu|sun|etcetera) enable_symvers=$enableval ;;
+  gnu) enable_symvers=$enableval ;;
+  *)   AC_MSG_ERROR([Unknown argument to enable/disable symvers]) ;;
+  esac],
+ enable_symvers=GLIBCPP_ENABLE_SYMVERS_DEFAULT)dnl
+ 
+ # If we never went through the GLIBCPP_CHECK_LINKER_FEATURES macro, then we
+ # don't know enough about $LD to do tricks... 
+ if test x$enable_shared = xno || 
+ 	test x$LD = x || 
+ 	test x$glibcpp_gnu_ld_version = x; then
+   enable_symvers=no
+ fi
+ 
+ # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
+ AC_MSG_CHECKING([for shared libgcc])
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=' -lgcc_s'
+ AC_TRY_LINK( , [return 0], glibcpp_shared_libgcc=yes, glibcpp_shared_libgcc=no)
+ CFLAGS="$ac_save_CFLAGS"
+ AC_MSG_RESULT($glibcpp_shared_libgcc)
+ 
+ # For GNU ld, we need at least this version.  It's 2.12 in the same format
+ # as the tested-for version.  See GLIBCPP_CHECK_LINKER_FEATURES for more.
+ glibcpp_min_gnu_ld_version=21200
+ 
+ # Check to see if unspecified "yes" value can win, given results
+ # above.  
+ if test $enable_symvers = yes ; then
+   if test $with_gnu_ld = yes &&
+     test $glibcpp_shared_libgcc = yes ;
+   then
+     if test $glibcpp_gnu_ld_version -ge $glibcpp_min_gnu_ld_version ; then
+         enable_symvers=gnu
+     else
+       ac_test_CFLAGS="${CFLAGS+set}"
+       ac_save_CFLAGS="$CFLAGS"
+       CFLAGS='-shared -Wl,--version-script,conftest.map'
+       enable_symvers=no
+       changequote(,)
+       echo 'FOO { global: f[a-z]o; local: *; };' > conftest.map
+       changequote([,])
+       AC_TRY_LINK([int foo;],, enable_symvers=gnu)
+       if test "$ac_test_CFLAGS" = set; then
+ 	CFLAGS="$ac_save_CFLAGS"
+       else
+ 	# this is the suspicious part
+ 	CFLAGS=''
+       fi
+       rm -f conftest.map
+     fi
+   else
+     # just fail for now
+     enable_symvers=no
+   fi
+ fi
+ 
+ dnl Everything parsed; figure out what file to use.
+ case $enable_symvers in
+   no)
+       LINKER_MAP=config/linker-map.dummy
+       ;;
+   gnu)
+       LINKER_MAP=config/linker-map.gnu
+       ;;
+ esac
+ 
+ AC_LINK_FILES($LINKER_MAP, src/linker.map)
+ AM_CONDITIONAL(GLIBCPP_BUILD_VERSIONED_SHLIB, test $enable_symvers != no)
+ AC_MSG_CHECKING([versioning on shared library symbols])
+ AC_MSG_RESULT($enable_symvers)
+ ])
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/aclocal.m4 gcc-3.1/libstdc++-v3/aclocal.m4
*** gcc-3.0.4/libstdc++-v3/aclocal.m4	Fri Jan 18 22:58:24 2002
--- gcc-3.1/libstdc++-v3/aclocal.m4	Thu Apr  4 21:35:31 2002
*************** AC_DEFUN(GLIBCPP_CONFIGURE, [
*** 24,34 ****
      *)   AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
     esac], [multilib=yes])dnl
  
    glibcpp_basedir=$srcdir/$toprel/$1/libstdc++-v3
    AC_SUBST(glibcpp_basedir)
  
-   AM_INIT_AUTOMAKE(libstdc++, 3.0.0)
- 
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
    ifdef([AC_PROG_CC_G],[],[define([AC_PROG_CC_G],defn([_AC_PROG_CC_G]))])
--- 24,82 ----
      *)   AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
     esac], [multilib=yes])dnl
  
+   # When building with srcdir == objdir, links to the source files will
+   # be created in directories within the target_subdir.  We have to
+   # adjust toplevel_srcdir accordingly, so that configure finds
+   # install-sh and other auxiliary files that live in the top-level
+   # source directory.
+   if test "${srcdir}" = "."; then
+     if test -z "${with_target_subdir}"; then
+       toprel=".."
+     else
+       if test "${with_target_subdir}" != "."; then
+         toprel="${with_multisrctop}../.."
+       else
+         toprel="${with_multisrctop}.."
+       fi
+     fi
+   else
+     toprel=".."
+   fi
+   AC_CONFIG_AUX_DIR(${srcdir}/$toprel)
+   toplevel_srcdir=\${top_srcdir}/$toprel
+   AC_SUBST(toplevel_srcdir)
+ 
+   # Export build and source directories.
+   # These need to be absolute paths, yet at the same time need to
+   # canonicalize only relative paths, because then amd will not unmount
+   # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
+   glibcpp_builddir=`pwd`
+   case $srcdir in
+   [\\/$]* | ?:[\\/]*) glibcpp_srcdir=${srcdir} ;;
+   *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
+   esac
+   AC_SUBST(glibcpp_builddir)
+   AC_SUBST(glibcpp_srcdir)
+ 
+   dnl This is here just to satisfy automake.
+   ifelse(not,equal,[AC_CONFIG_AUX_DIR(..)])
+ 
+   AC_PROG_AWK
+   # Will set LN_S to either 'ln -s' or 'ln'.  With autoconf 2.5x, can also
+   # be 'cp -p' if linking isn't available.
+   #ac_cv_prog_LN_S='cp -p'
+   AC_PROG_LN_S
+ 
+   # We use these options to decide which functions to include.
+   AC_ARG_WITH(target-subdir,
+   [  --with-target-subdir=SUBDIR
+                           configuring in a subdirectory])
+   AC_ARG_WITH(cross-host,
+   [  --with-cross-host=HOST  configuring with a cross compiler])
+ 
    glibcpp_basedir=$srcdir/$toprel/$1/libstdc++-v3
    AC_SUBST(glibcpp_basedir)
  
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
    ifdef([AC_PROG_CC_G],[],[define([AC_PROG_CC_G],defn([_AC_PROG_CC_G]))])
*************** AC_DEFUN(GLIBCPP_CONFIGURE, [
*** 36,128 ****
    ifdef([AC_PROG_CXX_G],[],[define([AC_PROG_CXX_G],defn([_AC_PROG_CXX_G]))])
    ifdef([AC_PROG_CXX_GNU],[],[define([AC_PROG_CXX_GNU],defn([_AC_PROG_CXX_GNU]))])
  
! #  AC_PROG_CC
! 
! # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
! # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
! # are probably using a cross compiler, which will not be able to fully
! # link an executable.  This should really be fixed in autoconf
! # itself.
  
! AC_DEFUN(LIB_AC_PROG_CC,
! [AC_BEFORE([$0], [AC_PROG_CPP])dnl
! dnl Fool anybody using AC_PROG_CC.
! AC_PROVIDE([AC_PROG_CC])
! AC_CHECK_PROG(CC, gcc, gcc)
! if test -z "$CC"; then
!   AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
!   test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
! fi
  
! AC_PROG_CC_GNU
  
! if test $ac_cv_prog_gcc = yes; then
!   GCC=yes
! dnl Check whether -g works, even if CFLAGS is set, in case the package
! dnl plays around with CFLAGS (such as to build both debugging and
! dnl normal versions of a library), tasteless as that idea is.
!   ac_test_CFLAGS="${CFLAGS+set}"
!   ac_save_CFLAGS="$CFLAGS"
!   CFLAGS=
!   AC_PROG_CC_G
!   if test "$ac_test_CFLAGS" = set; then
!     CFLAGS="$ac_save_CFLAGS"
!   elif test $ac_cv_prog_cc_g = yes; then
!     CFLAGS="-g -O2"
    else
!     CFLAGS="-O2"
    fi
! else
!   GCC=
!   test "${CFLAGS+set}" = set || CFLAGS="-g"
! fi
! ])
! 
! LIB_AC_PROG_CC
  
! # Can't just call these here as g++ requires libstc++ to be built....
! #  AC_PROG_CXX
  
! # Likewise for AC_PROG_CXX.
! AC_DEFUN(LIB_AC_PROG_CXX,
! [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
! dnl Fool anybody using AC_PROG_CXX.
! AC_PROVIDE([AC_PROG_CXX])
! # Use glibcpp_CXX so that we do not cause CXX to be cached with the
! # flags that come in CXX while configuring libstdc++.  They're different
! # from those used for all other target libraries.  If CXX is set in
! # the environment, respect that here.
! glibcpp_CXX=$CXX
! AC_CHECK_PROGS(glibcpp_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
! AC_SUBST(glibcpp_CXX)
! CXX=$glibcpp_CXX
! test -z "$glibcpp_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
  
! AC_PROG_CXX_GNU
  
! if test $ac_cv_prog_gxx = yes; then
!   GXX=yes
! dnl Check whether -g works, even if CXXFLAGS is set, in case the package
! dnl plays around with CXXFLAGS (such as to build both debugging and
! dnl normal versions of a library), tasteless as that idea is.
!   ac_test_CXXFLAGS="${CXXFLAGS+set}"
!   ac_save_CXXFLAGS="$CXXFLAGS"
!   CXXFLAGS=
!   AC_PROG_CXX_G
!   if test "$ac_test_CXXFLAGS" = set; then
!     CXXFLAGS="$ac_save_CXXFLAGS"
!   elif test $ac_cv_prog_cxx_g = yes; then
!     CXXFLAGS="-g -O2"
    else
!     CXXFLAGS="-O2"
    fi
! else
!   GXX=
!   test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
! fi
! ])
  
! LIB_AC_PROG_CXX
  
    AC_CHECK_TOOL(AS, as)
    AC_CHECK_TOOL(AR, ar)
--- 84,175 ----
    ifdef([AC_PROG_CXX_G],[],[define([AC_PROG_CXX_G],defn([_AC_PROG_CXX_G]))])
    ifdef([AC_PROG_CXX_GNU],[],[define([AC_PROG_CXX_GNU],defn([_AC_PROG_CXX_GNU]))])
  
!   # AC_PROG_CC
!   # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
!   # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
!   # are probably using a cross compiler, which will not be able to fully
!   # link an executable.  This is addressed in later versions of autoconf.
  
!   AC_DEFUN(LIB_AC_PROG_CC,
!   [AC_BEFORE([$0], [AC_PROG_CPP])dnl
!   dnl Fool anybody using AC_PROG_CC.
!   AC_PROVIDE([AC_PROG_CC])
!   AC_CHECK_PROG(CC, gcc, gcc)
!   if test -z "$CC"; then
!     AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
!     test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
!   fi
  
!   AC_PROG_CC_GNU
  
!   if test $ac_cv_prog_gcc = yes; then
!     GCC=yes
!   dnl Check whether -g works, even if CFLAGS is set, in case the package
!   dnl plays around with CFLAGS (such as to build both debugging and
!   dnl normal versions of a library), tasteless as that idea is.
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS=
!     AC_PROG_CC_G
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     elif test $ac_cv_prog_cc_g = yes; then
!       CFLAGS="-g -O2"
!     else
!       CFLAGS="-O2"
!     fi
    else
!     GCC=
!     test "${CFLAGS+set}" = set || CFLAGS="-g"
    fi
!   ])
  
!   LIB_AC_PROG_CC
  
!   # Likewise for AC_PROG_CXX.  We can't just call it directly because g++
!   # will try to link in libstdc++.
!   AC_DEFUN(LIB_AC_PROG_CXX,
!   [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
!   dnl Fool anybody using AC_PROG_CXX.
!   AC_PROVIDE([AC_PROG_CXX])
!   # Use glibcpp_CXX so that we do not cause CXX to be cached with the
!   # flags that come in CXX while configuring libstdc++.  They're different
!   # from those used for all other target libraries.  If CXX is set in
!   # the environment, respect that here.
!   glibcpp_CXX=$CXX
!   AC_CHECK_PROGS(glibcpp_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
!   AC_SUBST(glibcpp_CXX)
!   CXX=$glibcpp_CXX
!   test -z "$glibcpp_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
  
!   AC_PROG_CXX_GNU
  
!   if test $ac_cv_prog_gxx = yes; then
!     GXX=yes
!     dnl Check whether -g works, even if CXXFLAGS is set, in case the package
!     dnl plays around with CXXFLAGS (such as to build both debugging and
!     dnl normal versions of a library), tasteless as that idea is.
!     ac_test_CXXFLAGS="${CXXFLAGS+set}"
!     ac_save_CXXFLAGS="$CXXFLAGS"
!     CXXFLAGS=
!     AC_PROG_CXX_G
!     if test "$ac_test_CXXFLAGS" = set; then
!       CXXFLAGS="$ac_save_CXXFLAGS"
!     elif test $ac_cv_prog_cxx_g = yes; then
!       CXXFLAGS="-g -O2"
!     else
!       CXXFLAGS="-O2"
!     fi
    else
!     GXX=
!     test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
    fi
!   ])
  
!   LIB_AC_PROG_CXX
! 
!   # For some reason, gettext needs this.
!   AC_ISC_POSIX
  
    AC_CHECK_TOOL(AS, as)
    AC_CHECK_TOOL(AR, ar)
*************** LIB_AC_PROG_CXX
*** 135,142 ****
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which cant create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we dont execute it, since we dont care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
--- 182,189 ----
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which can't create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we don't execute it, since we don't care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
*************** LIB_AC_PROG_CXX
*** 156,161 ****
--- 203,209 ----
    # This does for the target what configure.host does for the host.  In
    # addition to possibly modifying the same flags, it also sets up symlinks.
    GLIBCPP_CHECK_TARGET
+ 
  ])
  
  
*************** AC_DEFUN(GLIBCPP_CHECK_COMPILER_FEATURES
*** 221,227 ****
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" && test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    AC_MSG_RESULT($ac_fdsections)
--- 269,276 ----
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" &&
!      test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    AC_MSG_RESULT($ac_fdsections)
*************** dnl safe (like an empty string).
*** 239,244 ****
--- 288,295 ----
  dnl
  dnl Define SECTION_LDFLAGS='-Wl,--gc-sections' if possible.
  dnl Define OPT_LDFLAGS='-Wl,-O1' if possible.
+ dnl Define LD, with_gnu_ld, and (possibly) glibcpp_gnu_ld_version as
+ dnl side-effects of testing.
  dnl
  dnl GLIBCPP_CHECK_LINKER_FEATURES
  AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, [
*************** AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, 
*** 249,256 ****
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    AC_REQUIRE([AC_PROG_LD])
  
    # Set --gc-sections.
!   if test "$ac_cv_prog_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
--- 300,331 ----
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    AC_REQUIRE([AC_PROG_LD])
  
+   # The name set by libtool depends on the version of libtool.  Shame on us
+   # for depending on an impl detail, but c'est la vie.  Older versions used
+   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
+   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
+   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
+   # set (hence we're using an older libtool), then set it.
+   if test x${with_gnu_ld+set} != xset; then
+     if test x${ac_cv_prog_gnu_ld+set} != xset; then
+       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
+       with_gnu_ld=no
+     else
+       with_gnu_ld=$ac_cv_prog_gnu_ld
+     fi
+   fi
+ 
+   # Start by getting the version number.  I think the libtool test already
+   # does some of this, but throws away the result.
+   changequote(,)
+   ldver=`$LD --version 2>/dev/null | head -1 | \
+          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
+   changequote([,])
+   glibcpp_gnu_ld_version=`echo $ldver | \
+          $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
+ 
    # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
*************** AC_DEFUN(GLIBCPP_CHECK_LINKER_FEATURES, 
*** 288,294 ****
    fi
  
    # Set linker optimization flags.
!   if test x"$ac_cv_prog_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
--- 363,369 ----
    fi
  
    # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 343,349 ****
      GLIBCPP_CHECK_MATH_DECL_1(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 418,424 ----
      GLIBCPP_CHECK_MATH_DECL_1(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 410,416 ****
      GLIBCPP_CHECK_MATH_DECL_2(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 485,491 ----
      GLIBCPP_CHECK_MATH_DECL_2(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_DECL_AND_LIN
*** 456,462 ****
      GLIBCPP_CHECK_MATH_DECL_3(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi	
    fi
  ])
  
--- 531,537 ----
      GLIBCPP_CHECK_MATH_DECL_3(_$1)
      if test x$glibcpp_cv_func__$1_use = x"yes"; then
        AC_CHECK_FUNCS(_$1)    
!     fi
    fi
  ])
  
*************** AC_DEFUN(GLIBCPP_CHECK_STDLIB_DECL_AND_L
*** 491,496 ****
--- 566,600 ----
  
  
  dnl
+ dnl Check to see if the (stdlib function) argument passed is
+ dnl 1) declared when using the c++ compiler
+ dnl 2) has "C" linkage
+ dnl
+ dnl argument 1 is name of function to check
+ dnl
+ dnl ASSUMES argument is a function with THREE parameters
+ dnl
+ dnl GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3
+ AC_DEFUN(GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3, [
+   AC_MSG_CHECKING([for $1 declaration])
+   if test x${glibcpp_cv_func_$1_use+set} != xset; then
+     AC_CACHE_VAL(glibcpp_cv_func_$1_use, [
+       AC_LANG_SAVE
+       AC_LANG_CPLUSPLUS
+       AC_TRY_COMPILE([#include ], 
+                      [ $1(0, 0, 0);], 
+                      [glibcpp_cv_func_$1_use=yes], [glibcpp_cv_func_$1_use=no])
+       AC_LANG_RESTORE
+     ])
+   fi
+   AC_MSG_RESULT($glibcpp_cv_func_$1_use)
+   if test x$glibcpp_cv_func_$1_use = x"yes"; then
+     AC_CHECK_FUNCS($1)    
+   fi
+ ])
+ 
+ 
+ dnl
  dnl Because the builtins are picky picky picky about the arguments they take, 
  dnl do an explict linkage tests here.
  dnl Check to see if the (math function) argument passed is
*************** dnl check for __builtin_fabl
*** 545,551 ****
  dnl check for __builtin_labs
  dnl check for __builtin_sqrtf
  dnl check for __builtin_sqrtl
! dnl check for __builtin_fsqrt
  dnl check for __builtin_sinf
  dnl check for __builtin_sin
  dnl check for __builtin_sinl
--- 649,655 ----
  dnl check for __builtin_labs
  dnl check for __builtin_sqrtf
  dnl check for __builtin_sqrtl
! dnl check for __builtin_sqrt
  dnl check for __builtin_sinf
  dnl check for __builtin_sin
  dnl check for __builtin_sinl
*************** AC_DEFUN(GLIBCPP_CHECK_BUILTIN_MATH_SUPP
*** 564,570 ****
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_labs)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtf)
!   GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_fsqrt)
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtl)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinf)
--- 668,674 ----
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_labs)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtf)
!   GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrt)
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtl)
  
    GLIBCPP_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinf)
*************** AC_DEFUN(GLIBCPP_CHECK_BUILTIN_MATH_SUPP
*** 594,600 ****
      AC_DEFINE(HAVE___BUILTIN_SIN)
      AC_DEFINE(HAVE___BUILTIN_SINF)
      AC_DEFINE(HAVE___BUILTIN_SINL)
!     AC_DEFINE(HAVE___BUILTIN_FSQRT)
      AC_DEFINE(HAVE___BUILTIN_SQRTF)
      AC_DEFINE(HAVE___BUILTIN_SQRTL)
    fi
--- 698,704 ----
      AC_DEFINE(HAVE___BUILTIN_SIN)
      AC_DEFINE(HAVE___BUILTIN_SINF)
      AC_DEFINE(HAVE___BUILTIN_SINL)
!     AC_DEFINE(HAVE___BUILTIN_SQRT)
      AC_DEFINE(HAVE___BUILTIN_SQRTF)
      AC_DEFINE(HAVE___BUILTIN_SQRTL)
    fi
*************** AC_DEFUN(GLIBCPP_CHECK_STDLIB_SUPPORT, [
*** 619,624 ****
--- 723,729 ----
    CXXFLAGS='-fno-builtins -D_GNU_SOURCE'
  
    GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtold)
+   GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtof)
    AC_CHECK_FUNCS(drand48)
  
    CXXFLAGS="$ac_save_CXXFLAGS"
*************** AC_DEFUN(GLIBCPP_CHECK_MATH_SUPPORT, [
*** 664,669 ****
--- 769,775 ----
    GLIBCPP_CHECK_MATH_DECLS_AND_LINKAGES_1(float round,
                                            float_round,
                                            ceilf floorf)
+   GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(expf)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(isnanf)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_1(isinff)
    GLIBCPP_CHECK_MATH_DECL_AND_LINKAGE_2(atan2f)
*************** AC_DEFUN(GLIBCPP_CHECK_COMPLEX_MATH_SUPP
*** 750,766 ****
    AC_CHECK_LIB(m, main)
    AC_REPLACE_MATHFUNCS(nan copysignf)
  
    dnl Compile the long double complex functions only if the function 
    dnl provides the non-complex long double functions that are needed.
    dnl Currently this includes copysignl, which should be
    dnl cached from the GLIBCPP_CHECK_MATH_SUPPORT macro, above.
-   USE_COMPLEX_LONG_DOUBLE=no
    if test x$ac_cv_func_copysignl = x"yes"; then
!     USE_COMPLEX_LONG_DOUBLE=yes
!     AC_REPLACE_MATHFUNCS(signbitl)
    fi
  
!   AC_SUBST(USE_COMPLEX_LONG_DOUBLE)
  ])
  
  
--- 856,874 ----
    AC_CHECK_LIB(m, main)
    AC_REPLACE_MATHFUNCS(nan copysignf)
  
+   dnl For __signbit to signbit conversions.
+   AC_CHECK_FUNCS([__signbit], , [LIBMATHOBJS="$LIBMATHOBJS signbit.lo"])
+   AC_CHECK_FUNCS([__signbitf], , [LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"])
+ 
    dnl Compile the long double complex functions only if the function 
    dnl provides the non-complex long double functions that are needed.
    dnl Currently this includes copysignl, which should be
    dnl cached from the GLIBCPP_CHECK_MATH_SUPPORT macro, above.
    if test x$ac_cv_func_copysignl = x"yes"; then
!     AC_CHECK_FUNCS([__signbitl], , [LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"])
    fi
  
!   AC_SUBST(LIBMATHOBJS)
  ])
  
  
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 800,810 ****
  
    dnl Sanity check for existence of ISO C99 headers for extended encoding.
    AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
!   AC_CHECK_HEADER(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
    
    dnl Only continue checking if the ISO C99 headers exist and support is on.
!   if test x"$ac_has_wchar_h" = xyes && test x"$ac_has_wctype_h" = xyes \
!      && test x"$enable_c_mbchar" != xno; then
        
      dnl Test wchar.h for WCHAR_MIN, WCHAR_MAX, which is needed before
      dnl numeric_limits can instantiate type_traits
--- 908,919 ----
  
    dnl Sanity check for existence of ISO C99 headers for extended encoding.
    AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
!   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
    
    dnl Only continue checking if the ISO C99 headers exist and support is on.
!   if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
        
      dnl Test wchar.h for WCHAR_MIN, WCHAR_MAX, which is needed before
      dnl numeric_limits can instantiate type_traits
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 839,846 ****
      ac_wfuncs=no)
  
      AC_MSG_CHECKING([for ISO C99 wchar_t support])
!     if test x"$has_weof" = xyes && test x"$has_wchar_minmax" = xyes \
!        && test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
--- 948,956 ----
      ac_wfuncs=no)
  
      AC_MSG_CHECKING([for ISO C99 wchar_t support])
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 863,870 ****
      LIBS="$ac_save_LIBS"
  
      AC_MSG_CHECKING([for XPG2 wchar_t support])
!     if test x"$ac_has_iconv_h" = xyes && test x"$ac_has_langinfo_h" = xyes \
!        && test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
--- 973,981 ----
      LIBS="$ac_save_LIBS"
  
      AC_MSG_CHECKING([for XPG2 wchar_t support])
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
*************** AC_DEFUN(GLIBCPP_CHECK_WCHAR_T_SUPPORT, 
*** 874,881 ****
      dnl At the moment, only enable wchar_t specializations if all the
      dnl above support is present.
      AC_MSG_CHECKING([for enabled wchar_t specializations])
!     if test x"$ac_isoC99_wchar_t" = xyes \
!     && test x"$ac_XPG2_wchar_t" = xyes; then
        AC_DEFINE(_GLIBCPP_USE_WCHAR_T)
        AC_MSG_RESULT("yes")
      else
--- 985,992 ----
      dnl At the moment, only enable wchar_t specializations if all the
      dnl above support is present.
      AC_MSG_CHECKING([for enabled wchar_t specializations])
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
        AC_DEFINE(_GLIBCPP_USE_WCHAR_T)
        AC_MSG_RESULT("yes")
      else
*************** dnl
*** 984,991 ****
  dnl Check for which locale library to use:  gnu or generic.
  dnl
  dnl GLIBCPP_ENABLE_CLOCALE
! dnl --enable-clocale=gnu sets config/c_locale_gnu.cc and friends
! dnl --enable-clocale=generic sets config/c_locale_generic.cc and friends
  dnl 
  dnl default is generic
  dnl
--- 1095,1102 ----
  dnl Check for which locale library to use:  gnu or generic.
  dnl
  dnl GLIBCPP_ENABLE_CLOCALE
! dnl --enable-clocale=gnu sets config/locale/c_locale_gnu.cc and friends
! dnl --enable-clocale=generic sets config/locale/c_locale_generic.cc and friends
  dnl 
  dnl default is generic
  dnl
*************** AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
*** 996,1018 ****
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    ], 
    if test x$enable_clocale = xno; then
!      enable_clocale=generic
    fi,
!      enable_clocale=generic)
  
    enable_clocale_flag=$enable_clocale
  
!   dnl Check if a valid locale package
    case x${enable_clocale_flag} in
      xgnu)
-       CLOCALE_H=config/c_locale_gnu.h
-       CLOCALE_CC=config/c_locale_gnu.cc
        AC_MSG_RESULT(gnu)
        ;;
!     xgeneric)
!       CLOCALE_H=config/c_locale_generic.h
!       CLOCALE_CC=config/c_locale_generic.cc
        AC_MSG_RESULT(generic)
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
--- 1107,1230 ----
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    ], 
    if test x$enable_clocale = xno; then
!      enable_clocale=no
    fi,
!      enable_clocale=no)
  
    enable_clocale_flag=$enable_clocale
  
!   dnl Probe for locale support if no specific model is specified.
!   dnl Default to "generic"
!   if test x$enable_clocale_flag = xno; then
!     case x${target_os} in
!       xlinux* | xgnu*)
! 	AC_EGREP_CPP([_GLIBCPP_ok], [
!         #include 
!         #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) 
!           _GLIBCPP_ok
!         #endif
!         ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
! 
! 	# Test for bugs early in glibc-2.2.x series
!   	if test x$enable_clocale_flag = xgnu; then
!     	  AC_TRY_RUN([
! 	  #define _GNU_SOURCE 1
! 	  #include 
! 	  int main()
! 	  {
!   	    const char __one[] = "Äuglein Augmen";
!   	    const char __two[] = "Äuglein";
!   	    int i;
!   	    int j;
!   	    __locale_t	loc;
!    	    __locale_t	loc_dup;
!   	    loc = __newlocale(1 << LC_ALL, "de_DE", 0);
!   	    loc_dup = __duplocale(loc);
!   	    i = __strcoll_l(__one, __two, loc);
!   	    j = __strcoll_l(__one, __two, loc_dup);
!   	    return 0;
! 	  }
! 	  ], 
! 	  [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
! 	  [enable_clocale_flag=generic])
!   	fi
! 
! 	# ... at some point put __strxfrm_l tests in as well.
!         ;;
!       *)
! 	enable_clocale_flag=generic
! 	;;
!     esac
!   fi
! 
!   dnl Deal with gettext issues.
!   AC_ARG_ENABLE(nls,
!   [  --enable-nls            use Native Language Support (default)],
!   , enable_nls=yes)
!   USE_NLS=no
! 
!   dnl Set configure bits for specified locale package
    case x${enable_clocale_flag} in
+     xgeneric)
+       AC_MSG_RESULT(generic)
+ 
+       CLOCALE_H=config/locale/generic/c_locale.h
+       CLOCALE_CC=config/locale/generic/c_locale.cc
+       CCODECVT_H=config/locale/generic/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/generic/messages_members.h
+       CMESSAGES_CC=config/locale/generic/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
+       ;;
      xgnu)
        AC_MSG_RESULT(gnu)
+ 
+       # Declare intention to use gettext, and add support for specific
+       # languages.
+       # For some reason, ALL_LINGUAS has to be before AM_GNU_GETTEXT
+       ALL_LINGUAS="de fr"
+ 
+       # Don't call AM_GNU_GETTEXT here. Instead, assume glibc.
+       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
+       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
+ 	USE_NLS=yes
+       fi
+ 
+       # Export the build objects.
+       for ling in $ALL_LINGUAS; do \
+         glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \
+         glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \
+       done
+       AC_SUBST(glibcpp_MOFILES)
+       AC_SUBST(glibcpp_POFILES)
+ 
+       CLOCALE_H=config/locale/gnu/c_locale.h
+       CLOCALE_CC=config/locale/gnu/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/gnu/collate_members.cc
+       CCTYPE_CC=config/locale/gnu/ctype_members.cc
+       CMESSAGES_H=config/locale/gnu/messages_members.h
+       CMESSAGES_CC=config/locale/gnu/messages_members.cc
+       CMONEY_CC=config/locale/gnu/monetary_members.cc
+       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
+       CTIME_CC=config/locale/gnu/time_members.cc
        ;;
!     xieee_1003.1-2001)
        AC_MSG_RESULT(generic)
+ 
+       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
+       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
+       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
*************** AC_DEFUN(GLIBCPP_ENABLE_CLOCALE, [
*** 1020,1027 ****
--- 1232,1253 ----
        ;;
    esac
  
+   # This is where the testsuite looks for locale catalogs, using the
+   # -DLOCALEDIR define during testsuite compilation.
+   glibcpp_localedir=${glibcpp_builddir}/po/share/locale
+   AC_SUBST(glibcpp_localedir)
+ 
+   AC_SUBST(USE_NLS)
    AC_SUBST(CLOCALE_H)
+   AC_SUBST(CCODECVT_H)
+   AC_SUBST(CMESSAGES_H)
    AC_LINK_FILES($CLOCALE_CC, src/c++locale.cc)
+   AC_LINK_FILES($CCOLLATE_CC, src/collate.cc)
+   AC_LINK_FILES($CCTYPE_CC, src/ctype.cc)
+   AC_LINK_FILES($CMESSAGES_CC, src/messages.cc)
+   AC_LINK_FILES($CMONEY_CC, src/monetary.cc)
+   AC_LINK_FILES($CNUMERIC_CC, src/numeric.cc)
+   AC_LINK_FILES($CTIME_CC, src/time.cc)
  ])
  
  
*************** dnl
*** 1029,1035 ****
  dnl Check for which I/O library to use:  libio, or something specific.
  dnl
  dnl GLIBCPP_ENABLE_CSTDIO
! dnl --enable-cstdio=libio sets config/c_io_libio.h and friends
  dnl 
  dnl default is stdio
  dnl
--- 1255,1261 ----
  dnl Check for which I/O library to use:  libio, or something specific.
  dnl
  dnl GLIBCPP_ENABLE_CSTDIO
! dnl --enable-cstdio=libio sets config/io/c_io_libio.h and friends
  dnl 
  dnl default is stdio
  dnl
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1049,1057 ****
    dnl Check if a valid I/O package
    case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/c_io_libio.h
!       BASIC_FILE_H=config/basic_file_libio.h
!       BASIC_FILE_CC=config/basic_file_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
--- 1275,1283 ----
    dnl Check if a valid I/O package
    case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/io/c_io_libio.h
!       BASIC_FILE_H=config/io/basic_file_libio.h
!       BASIC_FILE_CC=config/io/basic_file_libio.cc
        AC_MSG_RESULT(libio)
  
        # see if we are on a system with libio native (ie, linux)
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1106,1114 ****
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/c_io_stdio.h
!       BASIC_FILE_H=config/basic_file_stdio.h
!       BASIC_FILE_CC=config/basic_file_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
--- 1332,1340 ----
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/io/c_io_stdio.h
!       BASIC_FILE_H=config/io/basic_file_stdio.h
!       BASIC_FILE_CC=config/io/basic_file_stdio.cc
        AC_MSG_RESULT(stdio)
  
        # We're not using stdio.
*************** AC_DEFUN(GLIBCPP_ENABLE_CSTDIO, [
*** 1125,1131 ****
    AC_LINK_FILES($BASIC_FILE_CC, src/basic_file.cc)
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/c_io_libio_codecvt.c
    AC_SUBST(CCODECVT_C)
    # 2000-08-04 bkoz hack
  
--- 1351,1357 ----
    AC_LINK_FILES($BASIC_FILE_CC, src/basic_file.cc)
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/io/c_io_libio_codecvt.c
    AC_SUBST(CCODECVT_C)
    # 2000-08-04 bkoz hack
  
*************** void foo()
*** 1205,1211 ****
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS=-S
     if AC_TRY_EVAL(ac_compile); then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
--- 1431,1437 ----
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS="-S -fexceptions"
     if AC_TRY_EVAL(ac_compile); then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
*************** EOF
*** 1217,1223 ****
     rm -f conftest*])
     if test x$enable_sjlj_exceptions = xyes; then
       AC_DEFINE(_GLIBCPP_SJLJ_EXCEPTIONS, 1,
! 	[Define if the compiler is configured for setjmp/longjmp exceptions.])
       ac_exception_model_name=sjlj
     elif test x$enable_sjlj_exceptions = xno; then
       ac_exception_model_name="call frame"
--- 1443,1449 ----
     rm -f conftest*])
     if test x$enable_sjlj_exceptions = xyes; then
       AC_DEFINE(_GLIBCPP_SJLJ_EXCEPTIONS, 1,
!         [Define if the compiler is configured for setjmp/longjmp exceptions.])
       ac_exception_model_name=sjlj
     elif test x$enable_sjlj_exceptions = xno; then
       ac_exception_model_name="call frame"
*************** EOF
*** 1230,1235 ****
--- 1456,1490 ----
  
  
  dnl
+ dnl Check for libunwind exception handling support. If enabled then
+ dnl we assume that the _Unwind_* functions that make up the Unwind ABI
+ dnl (_Unwind_RaiseException, _Unwind_Resume, etc.) are defined by
+ dnl libunwind instead of libgcc and that libstdc++ has a dependency
+ dnl on libunwind as well as libgcc.
+ dnl
+ dnl GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS
+ dnl --enable-libunwind-exceptions forces the use of libunwind.
+ dnl --disable-libunwind-exceptions assumes there is no libunwind.
+ dnl
+ dnl Define _GLIBCPP_LIBUNWIND_EXCEPTIONS if requested.
+ dnl
+ AC_DEFUN(GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS, [
+   AC_MSG_CHECKING([for use of libunwind])
+   AC_ARG_ENABLE(libunwind-exceptions,
+   [  --enable-libunwind-exceptions  force use of libunwind for exceptions],
+   use_libunwind_exceptions=$enableval,
+   use_libunwind_exceptions=no)
+   AC_MSG_RESULT($use_libunwind_exceptions)
+   dnl Option parsed, now set things appropriately
+   if test x"$use_libunwind_exceptions" = xyes; then
+     LIBUNWIND_FLAG="-lunwind"
+   else
+     LIBUNWIND_FLAG=""
+   fi
+   AC_SUBST(LIBUNWIND_FLAG)
+ ])
+ 
+ dnl
  dnl Check for ISO/IEC 9899:1999 "C99" support.
  dnl
  dnl GLIBCPP_ENABLE_C99
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1246,1252 ****
  
    AC_ARG_ENABLE(c99,
    changequote(<<, >>)dnl
!   <<--enable-c99      turns on 'ISO/IEC 9899:1999 support' [default=>>GLIBCPP_ENABLE_C99_DEFAULT],
    changequote([, ])dnl
    [case "$enableval" in
     yes) enable_c99=yes ;;
--- 1501,1507 ----
  
    AC_ARG_ENABLE(c99,
    changequote(<<, >>)dnl
!   <<--enable-c99            turns on 'ISO/IEC 9899:1999 support' [default=>>GLIBCPP_ENABLE_C99_DEFAULT],
    changequote([, ])dnl
    [case "$enableval" in
     yes) enable_c99=yes ;;
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1288,1294 ****
  		  void foo(char* fmt, ...)
  		  {va_list args; va_start(args, fmt);
  	          vfscanf(stderr, "%i", args);}],
! 	          [],, [ac_c99_stdio=no])	
    AC_TRY_COMPILE([#include 
  		  #include 
  		  void foo(char* fmt, ...)
--- 1543,1549 ----
  		  void foo(char* fmt, ...)
  		  {va_list args; va_start(args, fmt);
  	          vfscanf(stderr, "%i", args);}],
! 	          [],, [ac_c99_stdio=no])
    AC_TRY_COMPILE([#include 
  		  #include 
  		  void foo(char* fmt, ...)
*************** AC_DEFUN(GLIBCPP_ENABLE_C99, [dnl
*** 1346,1354 ****
    AC_MSG_RESULT($ac_c99_wchar)
  
    AC_MSG_CHECKING([for enabled ISO C99 support])
!   if test x"$ac_c99_math" = x"no" || test x"$ac_c99_stdio" = x"no" \
!       || test x"$ac_c99_stdlib" = x"no" \
!       || test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    AC_MSG_RESULT($enable_c99)
--- 1601,1610 ----
    AC_MSG_RESULT($ac_c99_wchar)
  
    AC_MSG_CHECKING([for enabled ISO C99 support])
!   if test x"$ac_c99_math" = x"no" ||
!      test x"$ac_c99_stdio" = x"no" ||
!      test x"$ac_c99_stdlib" = x"no" ||
!      test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    AC_MSG_RESULT($enable_c99)
*************** changequote([, ])
*** 1448,1454 ****
      c_shadow) 
          CSHADOW_FLAGS="-fno-builtin"
          C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
-         AC_DEFINE(_GLIBCPP_USE_SHADOW_HEADERS)
          ;;
      c_std)   
          CSHADOW_FLAGS=""
--- 1704,1709 ----
*************** changequote([, ])
*** 1462,1468 ****
  
    AC_SUBST(CSHADOW_FLAGS)
    AC_SUBST(C_INCLUDE_DIR)
!   AM_CONDITIONAL(GLIBCPP_USE_CSHADOW, test "$enable_cheaders" = c_shadow)
  ])
  
  
--- 1717,1724 ----
  
    AC_SUBST(CSHADOW_FLAGS)
    AC_SUBST(C_INCLUDE_DIR)
!   AM_CONDITIONAL(GLIBCPP_C_HEADERS_C, test "$enable_cheaders" = c)
!   AM_CONDITIONAL(GLIBCPP_C_HEADERS_C_STD, test "$enable_cheaders" = c_std)
  ])
  
  
*************** dnl  GLIBCPP_EXPORT_INSTALL_INFO
*** 1547,1554 ****
  dnl  calculates gxx_install_dir
  dnl  exports glibcpp_toolexecdir
  dnl  exports glibcpp_toolexeclibdir
- dnl  exports glibcpp_builddir
- dnl  exports glibcpp_srcdir
  dnl  exports glibcpp_prefixdir
  dnl
  dnl Assumes cross_compiling bits already done, and with_cross_host in
--- 1803,1808 ----
*************** dnl particular
*** 1556,1574 ****
  dnl
  dnl GLIBCPP_EXPORT_INSTALL_INFO
  AC_DEFUN(GLIBCPP_EXPORT_INSTALL_INFO, [
! 
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
- 
- # Export build and source directories.
- # These need to be absolute paths, yet at the same time need to
- # canonicalize only relative paths, because then amd will not unmount
- # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
- glibcpp_builddir=`pwd`
- case $srcdir in
- [\\/$]* | ?:[\\/]*) glibcpp_srcdir=${srcdir} ;;
- *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
- esac
  glibcpp_prefixdir=${prefix}
  
  AC_MSG_CHECKING([for interface version number])
--- 1810,1819 ----
  dnl
  dnl GLIBCPP_EXPORT_INSTALL_INFO
  AC_DEFUN(GLIBCPP_EXPORT_INSTALL_INFO, [
! # Assumes glibcpp_builddir, glibcpp_srcdir are alreay set up and
! # exported correctly in GLIBCPP_CONFIGURE.
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
  glibcpp_prefixdir=${prefix}
  
  AC_MSG_CHECKING([for interface version number])
*************** if test $version_specific_libs = yes; th
*** 1614,1620 ****
    gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    changequote([,])dnl
--- 1859,1867 ----
    gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   if test x"$gxx_include_dir" = x"no"; then
!     gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
!   fi
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    changequote([,])dnl
*************** fi
*** 1629,1635 ****
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
--- 1876,1883 ----
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" &&
!      test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
*************** fi
*** 1641,1648 ****
  AC_MSG_CHECKING([for install location])
  AC_MSG_RESULT($gxx_include_dir)
  
- AC_SUBST(glibcpp_builddir)
- AC_SUBST(glibcpp_srcdir)
  AC_SUBST(glibcpp_prefixdir)
  AC_SUBST(gxx_include_dir)
  AC_SUBST(glibcpp_toolexecdir)
--- 1889,1894 ----
*************** AC_SUBST(glibcpp_toolexeclibdir)
*** 1650,1677 ****
  ])
  
  
- # Check whether LC_MESSAGES is available in .
- # Ulrich Drepper , 1995.
- #
- # This file file be copied and used freely without restrictions.  It can
- # be used in projects which are not available under the GNU Public License
- # but which still want to provide support for the GNU gettext functionality.
- # Please note that the actual code is *not* freely available.
- 
- # serial 1
- 
- AC_DEFUN(AC_LC_MESSAGES, [
-   AC_CHECK_HEADER(locale.h, [
-     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
-       [AC_TRY_LINK([#include ], [return LC_MESSAGES],
-        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
-     if test $ac_cv_val_LC_MESSAGES = yes; then
-       AC_DEFINE(HAVE_LC_MESSAGES)
-     fi
-   ])
- ])
- 
- 
  # Check for functions in math library.
  # Ulrich Drepper , 1998.
  #
--- 1896,1901 ----
*************** AC_DEFUN(AC_LC_MESSAGES, [
*** 1684,1709 ****
  
  dnl AC_REPLACE_MATHFUNCS(FUNCTION...)
  AC_DEFUN(AC_REPLACE_MATHFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])
! AC_SUBST(LIBMATHOBJS)dnl
! ])
! 
! 
! # Check for string functions.
! # Ulrich Drepper , 1998.
! #
! # This file can be copied and used freely without restrictions.  It can
! # be used in projects which are not available under the GNU Public License
! # but which still want to provide support for the GNU gettext functionality.
! # Please note that the actual code is *not* freely available.
! 
! # serial 1
! 
! dnl AC_REPLACE_STRINGFUNCS(FUNCTION...)
! AC_DEFUN(AC_REPLACE_STRINGFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBSTRINGOBJS="$LIBSTRINGOBJS ${ac_func}.lo"])
! AC_SUBST(LIBSTRINGOBJS)dnl
! ])
  
  
  dnl This macro searches for a GNU version of make.  If a match is found, the
--- 1908,1914 ----
  
  dnl AC_REPLACE_MATHFUNCS(FUNCTION...)
  AC_DEFUN(AC_REPLACE_MATHFUNCS,
! [AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])])
  
  
  dnl This macro searches for a GNU version of make.  If a match is found, the
*************** AC_DEFUN(GLIBCPP_CHECK_SETRLIMIT, [
*** 1803,1811 ****
      # Check for rlimit, setrlimit.
      AC_CACHE_VAL(ac_setrlimit, [
        AC_TRY_COMPILE([#include 
!                       #include 
!                      ],
!                      [ struct rlimit r; setrlimit(0, &r);],
                       [ac_setrlimit=yes], [ac_setrlimit=no])
      ])
    fi
--- 2008,2016 ----
      # Check for rlimit, setrlimit.
      AC_CACHE_VAL(ac_setrlimit, [
        AC_TRY_COMPILE([#include 
! 		      #include 
! 		     ], 
!                      [ struct rlimit r; setrlimit(0, &r);], 
                       [ac_setrlimit=yes], [ac_setrlimit=no])
      ])
    fi
*************** dnl
*** 1828,1833 ****
--- 2033,2041 ----
  dnl GLIBCPP_CONFIGURE_TESTSUITE  [no args]
  AC_DEFUN(GLIBCPP_CONFIGURE_TESTSUITE, [
    GLIBCPP_CHECK_SETRLIMIT
+ 
+   # Look for setenv, so that extended locale tests can be performed.
+   GLIBCPP_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
  ])
  
  
*************** AC_DEFUN([AC_PROG_LD])
*** 1842,1847 ****
--- 2050,2785 ----
  ])
  
  
+ # Check whether LC_MESSAGES is available in .
+ # Ulrich Drepper , 1995.
+ #
+ # This file file be copied and used freely without restrictions.  It can
+ # be used in projects which are not available under the GNU Public License
+ # but which still want to provide support for the GNU gettext functionality.
+ # Please note that the actual code is *not* freely available.
+ 
+ # serial 1
+ 
+ AC_DEFUN(AC_LC_MESSAGES, [
+   AC_CHECK_HEADER(locale.h, [
+     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
+       [AC_TRY_LINK([#include ], [return LC_MESSAGES],
+        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
+     if test $ac_cv_val_LC_MESSAGES = yes; then
+       AC_DEFINE(HAVE_LC_MESSAGES)
+     fi
+   ])
+ ])
+ 
+ 
+ dnl
+ dnl Check for whether the Boost-derived checks should be turned on.
+ dnl
+ dnl GLIBCPP_ENABLE_CONCEPT_CHECKS
+ dnl --enable-concept-checks turns them on.
+ dnl --disable-concept-checks leaves them off.
+ dnl  +  Usage:  GLIBCPP_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
+ dnl       Where DEFAULT is either `yes' or `no'.  If ommitted, it
+ dnl       defaults to `no'.
+ AC_DEFUN(GLIBCPP_ENABLE_CONCEPT_CHECKS, [dnl
+ define([GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT], ifelse($1, yes, yes, no))dnl
+ AC_ARG_ENABLE(concept-checks,
+ changequote(<<, >>)dnl
+ <<  --enable-concept-checks use Boost-derived template checks [default=>>GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT],
+ changequote([, ])dnl
+ [case "$enableval" in
+  yes) enable_concept_checks=yes ;;
+  no)  enable_concept_checks=no ;;
+  *)   AC_MSG_ERROR([Unknown argument to enable/disable concept checks]) ;;
+  esac],
+ enable_concept_checks=GLIBCPP_ENABLE_CONCEPT_CHECKS_DEFAULT)dnl
+ dnl Option parsed, now set things appropriately
+ if test x"$enable_concept_checks" = xyes; then
+   AC_DEFINE(_GLIBCPP_CONCEPT_CHECKS)
+ fi
+ ])
+ 
+ 
+ dnl
+ dnl Add version tags to symbols in shared library (or not), additionally
+ dnl marking other symbols as private/local (or not).
+ dnl
+ dnl GLIBCPP_ENABLE_SYMVERS
+ dnl --enable-symvers=style adds a version script to the linker call when
+ dnl       creating the shared library.  The choice of version script is
+ dnl       controlled by 'style'.
+ dnl --disable-symvers does not.
+ dnl  +  Usage:  GLIBCPP_ENABLE_SYMVERS[(DEFAULT)]
+ dnl       Where DEFAULT is either `yes' or `no'.  If ommitted, it
+ dnl       defaults to `no'.  Passing `yes' tries to choose a default style
+ dnl       based on linker characteristics.  Passing 'no' disables versioning.
+ AC_DEFUN(GLIBCPP_ENABLE_SYMVERS, [dnl
+ define([GLIBCPP_ENABLE_SYMVERS_DEFAULT], ifelse($1, yes, yes, no))dnl
+ AC_ARG_ENABLE(symvers,
+ changequote(<<, >>)dnl
+ <<  --enable-symvers=style  enables symbol versioning of the shared library [default=>>GLIBCPP_ENABLE_SYMVERS_DEFAULT],
+ changequote([, ])dnl
+ [case "$enableval" in
+  yes) enable_symvers=yes ;;
+  no)  enable_symvers=no ;;
+  # other names here, just as sanity checks
+  #gnu|sun|etcetera) enable_symvers=$enableval ;;
+  gnu) enable_symvers=$enableval ;;
+  *)   AC_MSG_ERROR([Unknown argument to enable/disable symvers]) ;;
+  esac],
+ enable_symvers=GLIBCPP_ENABLE_SYMVERS_DEFAULT)dnl
+ 
+ # If we never went through the GLIBCPP_CHECK_LINKER_FEATURES macro, then we
+ # don't know enough about $LD to do tricks... 
+ if test x$enable_shared = xno || 
+ 	test x$LD = x || 
+ 	test x$glibcpp_gnu_ld_version = x; then
+   enable_symvers=no
+ fi
+ 
+ # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
+ AC_MSG_CHECKING([for shared libgcc])
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=' -lgcc_s'
+ AC_TRY_LINK( , [return 0], glibcpp_shared_libgcc=yes, glibcpp_shared_libgcc=no)
+ CFLAGS="$ac_save_CFLAGS"
+ AC_MSG_RESULT($glibcpp_shared_libgcc)
+ 
+ # For GNU ld, we need at least this version.  It's 2.12 in the same format
+ # as the tested-for version.  See GLIBCPP_CHECK_LINKER_FEATURES for more.
+ glibcpp_min_gnu_ld_version=21200
+ 
+ # Check to see if unspecified "yes" value can win, given results
+ # above.  
+ if test $enable_symvers = yes ; then
+   if test $with_gnu_ld = yes &&
+     test $glibcpp_shared_libgcc = yes ;
+   then
+     if test $glibcpp_gnu_ld_version -ge $glibcpp_min_gnu_ld_version ; then
+         enable_symvers=gnu
+     else
+       ac_test_CFLAGS="${CFLAGS+set}"
+       ac_save_CFLAGS="$CFLAGS"
+       CFLAGS='-shared -Wl,--version-script,conftest.map'
+       enable_symvers=no
+       changequote(,)
+       echo 'FOO { global: f[a-z]o; local: *; };' > conftest.map
+       changequote([,])
+       AC_TRY_LINK([int foo;],, enable_symvers=gnu)
+       if test "$ac_test_CFLAGS" = set; then
+ 	CFLAGS="$ac_save_CFLAGS"
+       else
+ 	# this is the suspicious part
+ 	CFLAGS=''
+       fi
+       rm -f conftest.map
+     fi
+   else
+     # just fail for now
+     enable_symvers=no
+   fi
+ fi
+ 
+ dnl Everything parsed; figure out what file to use.
+ case $enable_symvers in
+   no)
+       LINKER_MAP=config/linker-map.dummy
+       ;;
+   gnu)
+       LINKER_MAP=config/linker-map.gnu
+       ;;
+ esac
+ 
+ AC_LINK_FILES($LINKER_MAP, src/linker.map)
+ AM_CONDITIONAL(GLIBCPP_BUILD_VERSIONED_SHLIB, test $enable_symvers != no)
+ AC_MSG_CHECKING([versioning on shared library symbols])
+ AC_MSG_RESULT($enable_symvers)
+ ])
+ 
+ 
+ #serial 1
+ # This test replaces the one in autoconf.
+ # Currently this macro should have the same name as the autoconf macro
+ # because gettext's gettext.m4 (distributed in the automake package)
+ # still uses it.  Otherwise, the use in gettext.m4 makes autoheader
+ # give these diagnostics:
+ #   configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+ #   configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+ 
+ undefine([AC_ISC_POSIX])
+ 
+ AC_DEFUN([AC_ISC_POSIX],
+   [
+     dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+     AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+   ]
+ )
+ 
+ # Add --enable-maintainer-mode option to configure.
+ # From Jim Meyering
+ 
+ # serial 1
+ 
+ AC_DEFUN([AM_MAINTAINER_MODE],
+ [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+   dnl maintainer-mode is disabled by default
+   AC_ARG_ENABLE(maintainer-mode,
+ [  --enable-maintainer-mode enable make rules and dependencies not useful
+                           (and sometimes confusing) to the casual installer],
+       USE_MAINTAINER_MODE=$enableval,
+       USE_MAINTAINER_MODE=no)
+   AC_MSG_RESULT($USE_MAINTAINER_MODE)
+   AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
+   MAINT=$MAINTAINER_MODE_TRUE
+   AC_SUBST(MAINT)dnl
+ ]
+ )
+ 
+ # Define a conditional.
+ 
+ AC_DEFUN([AM_CONDITIONAL],
+ [AC_SUBST($1_TRUE)
+ AC_SUBST($1_FALSE)
+ if $2; then
+   $1_TRUE=
+   $1_FALSE='#'
+ else
+   $1_TRUE='#'
+   $1_FALSE=
+ fi])
+ 
+ # Macro to add for using GNU gettext.
+ # Ulrich Drepper , 1995.
+ #
+ # This file can be copied and used freely without restrictions.  It can
+ # be used in projects which are not available under the GNU Public License
+ # but which still want to provide support for the GNU gettext functionality.
+ # Please note that the actual code is *not* freely available.
+ 
+ # serial 9
+ 
+ dnl Usage: AM_WITH_NLS([TOOLSYMBOL], [NEEDSYMBOL], [LIBDIR]).
+ dnl If TOOLSYMBOL is specified and is 'use-libtool', then a libtool library
+ dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+ dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+ dnl    AM-DISABLE-SHARED). Otherwise, a static library
+ dnl    $(top_builddir)/intl/libintl.a will be created.
+ dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+ dnl    implementations (in libc or libintl) without the ngettext() function
+ dnl    will be ignored.
+ dnl LIBDIR is used to find the intl libraries.  If empty,
+ dnl    the value `$(top_builddir)/intl/' is used.
+ dnl
+ dnl The result of the configuration is one of three cases:
+ dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+ dnl    and used.
+ dnl    Catalog format: GNU --> install in $(datadir)
+ dnl    Catalog extension: .mo after installation, .gmo in source tree
+ dnl 2) GNU gettext has been found in the system's C library.
+ dnl    Catalog format: GNU --> install in $(datadir)
+ dnl    Catalog extension: .mo after installation, .gmo in source tree
+ dnl 3) No internationalization, always use English msgid.
+ dnl    Catalog format: none
+ dnl    Catalog extension: none
+ dnl The use of .gmo is historical (it was needed to avoid overwriting the
+ dnl GNU format catalogs when building on a platform with an X/Open gettext),
+ dnl but we keep it in order not to force irrelevant filename changes on the
+ dnl maintainers.
+ dnl
+ AC_DEFUN([AM_WITH_NLS],
+   [AC_MSG_CHECKING([whether NLS is requested])
+     dnl Default is enabled NLS
+     AC_ARG_ENABLE(nls,
+       [  --disable-nls           do not use Native Language Support],
+       USE_NLS=$enableval, USE_NLS=yes)
+     AC_MSG_RESULT($USE_NLS)
+     AC_SUBST(USE_NLS)
+ 
+     BUILD_INCLUDED_LIBINTL=no
+     USE_INCLUDED_LIBINTL=no
+     INTLLIBS=
+ 
+     dnl If we use NLS figure out what method
+     if test "$USE_NLS" = "yes"; then
+       AC_DEFINE(ENABLE_NLS, 1,
+         [Define to 1 if translation of program messages to the user's native language
+    is requested.])
+       AC_MSG_CHECKING([whether included gettext is requested])
+       AC_ARG_WITH(included-gettext,
+         [  --with-included-gettext use the GNU gettext library included here],
+         nls_cv_force_use_gnu_gettext=$withval,
+         nls_cv_force_use_gnu_gettext=no)
+       AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+ 
+       nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+       if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+         dnl User does not insist on using GNU NLS library.  Figure out what
+         dnl to use.  If GNU gettext is available we use this.  Else we have
+         dnl to fall back to GNU NLS library.
+ 	CATOBJEXT=NONE
+ 
+         dnl Add a version number to the cache macros.
+         define(gt_cv_func_gnugettext_libc, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libc])
+         define(gt_cv_func_gnugettext_libintl, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libintl])
+ 
+ 	AC_CHECK_HEADER(libintl.h,
+ 	  [AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+ 	    [AC_TRY_LINK([#include 
+ extern int _nl_msg_cat_cntr;],
+ 	       [bindtextdomain ("", "");
+ return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
+ 	       gt_cv_func_gnugettext_libc=yes,
+ 	       gt_cv_func_gnugettext_libc=no)])
+ 
+ 	   if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ 	     AC_CACHE_CHECK([for GNU gettext in libintl],
+ 	       gt_cv_func_gnugettext_libintl,
+ 	       [gt_save_LIBS="$LIBS"
+ 		LIBS="$LIBS -lintl $LIBICONV"
+ 		AC_TRY_LINK([#include 
+ extern int _nl_msg_cat_cntr;],
+ 		  [bindtextdomain ("", "");
+ return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
+ 		  gt_cv_func_gnugettext_libintl=yes,
+ 		  gt_cv_func_gnugettext_libintl=no)
+ 		LIBS="$gt_save_LIBS"])
+ 	   fi
+ 
+ 	   dnl If an already present or preinstalled GNU gettext() is found,
+ 	   dnl use it.  But if this macro is used in GNU gettext, and GNU
+ 	   dnl gettext is already preinstalled in libintl, we update this
+ 	   dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+ 	   if test "$gt_cv_func_gnugettext_libc" = "yes" \
+ 	      || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+ 		   && test "$PACKAGE" != gettext; }; then
+ 	     AC_DEFINE(HAVE_GETTEXT, 1,
+                [Define if the GNU gettext() function is already present or preinstalled.])
+ 
+ 	     if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ 	       dnl If iconv() is in a separate libiconv library, then anyone
+ 	       dnl linking with libintl{.a,.so} also needs to link with
+ 	       dnl libiconv.
+ 	       INTLLIBS="-lintl $LIBICONV"
+ 	     fi
+ 
+ 	     gt_save_LIBS="$LIBS"
+ 	     LIBS="$LIBS $INTLLIBS"
+ 	     AC_CHECK_FUNCS(dcgettext)
+ 	     LIBS="$gt_save_LIBS"
+ 
+ 	     AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ 	       [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+ 	     if test "$MSGFMT" != "no"; then
+ 	       AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ 	     fi
+ 
+ 	     AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ 	       [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ 
+ 	     CATOBJEXT=.gmo
+ 	   fi
+ 	])
+ 
+         if test "$CATOBJEXT" = "NONE"; then
+ 	  dnl GNU gettext is not found in the C library.
+ 	  dnl Fall back on GNU gettext library.
+ 	  nls_cv_use_gnu_gettext=yes
+         fi
+       fi
+ 
+       if test "$nls_cv_use_gnu_gettext" = "yes"; then
+         dnl Mark actions used to generate GNU NLS library.
+         INTLOBJS="\$(GETTOBJS)"
+         AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ 	  [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
+         AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+         AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ 	  [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+         AC_SUBST(MSGFMT)
+ 	BUILD_INCLUDED_LIBINTL=yes
+ 	USE_INCLUDED_LIBINTL=yes
+         CATOBJEXT=.gmo
+ 	INTLLIBS="ifelse([$3],[],\$(top_builddir)/intl,[$3])/libintl.ifelse([$1], use-libtool, [l], [])a $LIBICONV"
+ 	LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+       fi
+ 
+       dnl Test whether we really found GNU xgettext.
+       if test "$XGETTEXT" != ":"; then
+ 	dnl If it is no GNU xgettext we define it as : so that the
+ 	dnl Makefiles still can work.
+ 	if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ 	  : ;
+ 	else
+ 	  AC_MSG_RESULT(
+ 	    [found xgettext program is not GNU xgettext; ignore it])
+ 	  XGETTEXT=":"
+ 	fi
+       fi
+ 
+       dnl We need to process the po/ directory.
+       POSUB=po
+     fi
+     AC_OUTPUT_COMMANDS(
+      [for ac_file in $CONFIG_FILES; do
+         # Support "outfile[:infile[:infile...]]"
+         case "$ac_file" in
+           *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+         esac
+         # PO directories have a Makefile.in generated from Makefile.in.in.
+         case "$ac_file" in */Makefile.in)
+           # Adjust a relative srcdir.
+           ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+           ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+           ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+           case "$ac_given_srcdir" in
+             .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+             /*) top_srcdir="$ac_given_srcdir" ;;
+             *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+           esac
+           if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+             rm -f "$ac_dir/POTFILES"
+             echo creating "$ac_dir/POTFILES"
+             sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
+             echo creating "$ac_dir/Makefile"
+             sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+           fi
+           ;;
+         esac
+       done])
+ 
+ 
+     dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+     dnl to 'yes' because some of the testsuite requires it.
+     if test "$PACKAGE" = gettext; then
+       BUILD_INCLUDED_LIBINTL=yes
+     fi
+ 
+     dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+     dnl because plural.y uses bison specific features. It requires at least
+     dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+     dnl compile.
+     dnl bison is only needed for the maintainer (who touches plural.y). But in
+     dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+     dnl the rule in general Makefile. Now, some people carelessly touch the
+     dnl files or have a broken "make" program, hence the plural.c rule will
+     dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+     dnl present or too old.
+     AC_CHECK_PROGS([INTLBISON], [bison])
+     if test -z "$INTLBISON"; then
+       ac_verc_fail=yes
+     else
+       dnl Found it, now check the version.
+       AC_MSG_CHECKING([version of bison])
+ changequote(<<,>>)dnl
+       ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison .* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+       case $ac_prog_version in
+         '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+         1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+ changequote([,])dnl
+            ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+         *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+       esac
+       AC_MSG_RESULT([$ac_prog_version])
+     fi
+     if test $ac_verc_fail = yes; then
+       INTLBISON=:
+     fi
+ 
+     dnl These rules are solely for the distribution goal.  While doing this
+     dnl we only have to keep exactly one list of the available catalogs
+     dnl in configure.in.
+     for lang in $ALL_LINGUAS; do
+       GMOFILES="$GMOFILES $lang.gmo"
+       POFILES="$POFILES $lang.po"
+     done
+ 
+     dnl Make all variables we use known to autoconf.
+     AC_SUBST(BUILD_INCLUDED_LIBINTL)
+     AC_SUBST(USE_INCLUDED_LIBINTL)
+     AC_SUBST(CATALOGS)
+     AC_SUBST(CATOBJEXT)
+     AC_SUBST(GMOFILES)
+     AC_SUBST(INTLLIBS)
+     AC_SUBST(INTLOBJS)
+     AC_SUBST(POFILES)
+     AC_SUBST(POSUB)
+ 
+     dnl For backward compatibility. Some configure.ins may be using this.
+     nls_cv_header_intl=
+     nls_cv_header_libgt=
+ 
+     dnl For backward compatibility. Some Makefiles may be using this.
+     DATADIRNAME=share
+     AC_SUBST(DATADIRNAME)
+ 
+     dnl For backward compatibility. Some Makefiles may be using this.
+     INSTOBJEXT=.mo
+     AC_SUBST(INSTOBJEXT)
+ 
+     dnl For backward compatibility. Some Makefiles may be using this.
+     GENCAT=gencat
+     AC_SUBST(GENCAT)
+   ])
+ 
+ dnl Usage: Just like AM_WITH_NLS, which see.
+ AC_DEFUN([AM_GNU_GETTEXT],
+   [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+    AC_REQUIRE([AC_PROG_CC])dnl
+    AC_REQUIRE([AC_CANONICAL_HOST])dnl
+    AC_REQUIRE([AC_PROG_RANLIB])dnl
+    AC_REQUIRE([AC_ISC_POSIX])dnl
+    AC_REQUIRE([AC_HEADER_STDC])dnl
+    AC_REQUIRE([AC_C_CONST])dnl
+    AC_REQUIRE([AC_C_INLINE])dnl
+    AC_REQUIRE([AC_TYPE_OFF_T])dnl
+    AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+    AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+    AC_REQUIRE([AC_FUNC_MMAP])dnl
+    AC_REQUIRE([jm_GLIBC21])dnl
+ 
+    AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+ stdlib.h string.h unistd.h sys/param.h])
+    AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \
+ getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
+ strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
+ 
+    AM_ICONV
+    AM_LANGINFO_CODESET
+    AM_LC_MESSAGES
+    AM_WITH_NLS([$1],[$2],[$3])
+ 
+    if test "x$CATOBJEXT" != "x"; then
+      if test "x$ALL_LINGUAS" = "x"; then
+        LINGUAS=
+      else
+        AC_MSG_CHECKING(for catalogs to be installed)
+        NEW_LINGUAS=
+        for presentlang in $ALL_LINGUAS; do
+          useit=no
+          for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do
+            # Use the presentlang catalog if desiredlang is
+            #   a. equal to presentlang, or
+            #   b. a variant of presentlang (because in this case,
+            #      presentlang can be used as a fallback for messages
+            #      which are not translated in the desiredlang catalog).
+            case "$desiredlang" in
+              "$presentlang"*) useit=yes;;
+            esac
+          done
+          if test $useit = yes; then
+            NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+          fi
+        done
+        LINGUAS=$NEW_LINGUAS
+        AC_MSG_RESULT($LINGUAS)
+      fi
+ 
+      dnl Construct list of names of catalog files to be constructed.
+      if test -n "$LINGUAS"; then
+        for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+      fi
+    fi
+ 
+    dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+    dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+    dnl Try to locate is.
+    MKINSTALLDIRS=
+    if test -n "$ac_aux_dir"; then
+      MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+    fi
+    if test -z "$MKINSTALLDIRS"; then
+      MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+    fi
+    AC_SUBST(MKINSTALLDIRS)
+ 
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=ifelse([$1], use-libtool, [l], [])
+    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+   ])
+ 
+ # Search path for a program which passes the given test.
+ # Ulrich Drepper , 1996.
+ #
+ # This file can be copied and used freely without restrictions.  It can
+ # be used in projects which are not available under the GNU Public License
+ # but which still want to provide support for the GNU gettext functionality.
+ # Please note that the actual code is *not* freely available.
+ 
+ # serial 1
+ 
+ dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+ dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+ AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+ [# Extract the first word of "$2", so it can be a program name with args.
+ set dummy $2; ac_word=[$]2
+ AC_MSG_CHECKING([for $ac_word])
+ AC_CACHE_VAL(ac_cv_path_$1,
+ [case "[$]$1" in
+   /*)
+   ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+   ;;
+   *)
+   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+   for ac_dir in ifelse([$5], , $PATH, [$5]); do
+     test -z "$ac_dir" && ac_dir=.
+     if test -f $ac_dir/$ac_word; then
+       if [$3]; then
+ 	ac_cv_path_$1="$ac_dir/$ac_word"
+ 	break
+       fi
+     fi
+   done
+   IFS="$ac_save_ifs"
+ dnl If no 4th arg is given, leave the cache variable unset,
+ dnl so AC_PATH_PROGS will keep looking.
+ ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+ ])dnl
+   ;;
+ esac])dnl
+ $1="$ac_cv_path_$1"
+ if test -n "[$]$1"; then
+   AC_MSG_RESULT([$]$1)
+ else
+   AC_MSG_RESULT(no)
+ fi
+ AC_SUBST($1)dnl
+ ])
+ 
+ #serial 2
+ 
+ # Test for the GNU C Library, version 2.1 or newer.
+ # From Bruno Haible.
+ 
+ AC_DEFUN([jm_GLIBC21],
+   [
+     AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+       ac_cv_gnu_library_2_1,
+       [AC_EGREP_CPP([Lucky GNU user],
+ 	[
+ #include 
+ #ifdef __GNU_LIBRARY__
+  #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+   Lucky GNU user
+  #endif
+ #endif
+ 	],
+ 	ac_cv_gnu_library_2_1=yes,
+ 	ac_cv_gnu_library_2_1=no)
+       ]
+     )
+     AC_SUBST(GLIBC21)
+     GLIBC21="$ac_cv_gnu_library_2_1"
+   ]
+ )
+ 
+ #serial AM2
+ 
+ dnl From Bruno Haible.
+ 
+ AC_DEFUN([AM_ICONV],
+ [
+   dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+   dnl those with the standalone portable GNU libiconv installed).
+ 
+   AC_ARG_WITH([libiconv-prefix],
+ [  --with-libiconv-prefix=DIR  search for libiconv in DIR/include and DIR/lib], [
+     for dir in `echo "$withval" | tr : ' '`; do
+       if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi
+       if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi
+     done
+    ])
+ 
+   AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+     am_cv_func_iconv="no, consider installing GNU libiconv"
+     am_cv_lib_iconv=no
+     AC_TRY_LINK([#include 
+ #include ],
+       [iconv_t cd = iconv_open("","");
+        iconv(cd,NULL,NULL,NULL,NULL);
+        iconv_close(cd);],
+       am_cv_func_iconv=yes)
+     if test "$am_cv_func_iconv" != yes; then
+       am_save_LIBS="$LIBS"
+       LIBS="$LIBS -liconv"
+       AC_TRY_LINK([#include 
+ #include ],
+         [iconv_t cd = iconv_open("","");
+          iconv(cd,NULL,NULL,NULL,NULL);
+          iconv_close(cd);],
+         am_cv_lib_iconv=yes
+         am_cv_func_iconv=yes)
+       LIBS="$am_save_LIBS"
+     fi
+   ])
+   if test "$am_cv_func_iconv" = yes; then
+     AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+     AC_MSG_CHECKING([for iconv declaration])
+     AC_CACHE_VAL(am_cv_proto_iconv, [
+       AC_TRY_COMPILE([
+ #include 
+ #include 
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ #if defined(__STDC__) || defined(__cplusplus)
+ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+ #else
+ size_t iconv();
+ #endif
+ ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+       am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+     am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+     AC_MSG_RESULT([$]{ac_t:-
+          }[$]am_cv_proto_iconv)
+     AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+       [Define as const if the declaration of iconv() needs const.])
+   fi
+   LIBICONV=
+   if test "$am_cv_lib_iconv" = yes; then
+     LIBICONV="-liconv"
+   fi
+   AC_SUBST(LIBICONV)
+ ])
+ 
+ #serial AM1
+ 
+ dnl From Bruno Haible.
+ 
+ AC_DEFUN([AM_LANGINFO_CODESET],
+ [
+   AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+     [AC_TRY_LINK([#include ],
+       [char* cs = nl_langinfo(CODESET);],
+       am_cv_langinfo_codeset=yes,
+       am_cv_langinfo_codeset=no)
+     ])
+   if test $am_cv_langinfo_codeset = yes; then
+     AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+       [Define if you have  and nl_langinfo(CODESET).])
+   fi
+ ])
+ 
+ # Check whether LC_MESSAGES is available in .
+ # Ulrich Drepper , 1995.
+ #
+ # This file can be copied and used freely without restrictions.  It can
+ # be used in projects which are not available under the GNU Public License
+ # but which still want to provide support for the GNU gettext functionality.
+ # Please note that the actual code is *not* freely available.
+ 
+ # serial 2
+ 
+ AC_DEFUN([AM_LC_MESSAGES],
+   [if test $ac_cv_header_locale_h = yes; then
+     AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+       [AC_TRY_LINK([#include ], [return LC_MESSAGES],
+        am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+     if test $am_cv_val_LC_MESSAGES = yes; then
+       AC_DEFINE(HAVE_LC_MESSAGES, 1,
+         [Define if your  file defines LC_MESSAGES.])
+     fi
+   fi])
  
  # Do all the work for Automake.  This macro actually does too much --
  # some checks are only needed if your package does certain things.
*************** else
*** 1935,1973 ****
  fi
  AC_SUBST($1)])
  
- # Add --enable-maintainer-mode option to configure.
- # From Jim Meyering
- 
- # serial 1
- 
- AC_DEFUN([AM_MAINTAINER_MODE],
- [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
-   dnl maintainer-mode is disabled by default
-   AC_ARG_ENABLE(maintainer-mode,
- [  --enable-maintainer-mode enable make rules and dependencies not useful
-                           (and sometimes confusing) to the casual installer],
-       USE_MAINTAINER_MODE=$enableval,
-       USE_MAINTAINER_MODE=no)
-   AC_MSG_RESULT($USE_MAINTAINER_MODE)
-   AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
-   MAINT=$MAINTAINER_MODE_TRUE
-   AC_SUBST(MAINT)dnl
- ]
- )
- 
- # Define a conditional.
- 
- AC_DEFUN([AM_CONDITIONAL],
- [AC_SUBST($1_TRUE)
- AC_SUBST($1_FALSE)
- if $2; then
-   $1_TRUE=
-   $1_FALSE='#'
- else
-   $1_TRUE='#'
-   $1_FALSE=
- fi])
- 
  # Like AC_CONFIG_HEADER, but automatically create stamp file.
  
  AC_DEFUN([AM_CONFIG_HEADER],
--- 2873,2878 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/basic_file_libio.cc gcc-3.1/libstdc++-v3/config/basic_file_libio.cc
*** gcc-3.0.4/libstdc++-v3/config/basic_file_libio.cc	Wed Feb 28 06:45:35 2001
--- gcc-3.1/libstdc++-v3/config/basic_file_libio.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,194 ****
- // Wrapper of C-language FILE struct -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 27.8  File-based streams
- //
- 
- #include 
- 
- namespace std 
- {
-   // __basic_file definitions
-   __basic_file::__basic_file(__c_lock* __lock)
-   {
- #ifdef _IO_MTSAFE_IO
-     _lock = __lock;
- #endif
-     // Don't set the orientation of the stream when initializing.
- #ifdef _GLIBCPP_USE_WCHAR_T
-     _IO_no_init(this, 0, 0, &_M_wfile, 0);
- #else /* !defined(_GLIBCPP_USE_WCHAR_T) */
-     _IO_no_init(this, 0, 0, NULL, 0);
- #endif /* !defined(_GLIBCPP_USE_WCHAR_T) */
-     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_file_jumps;
-     _IO_file_init((_IO_FILE_plus*)this);
-   }
- 
-   // NB: Unused.
-   int 
-   __basic_file::overflow(int __c) 
-   { return _IO_file_overflow(this, __c); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::underflow()  
-   { return _IO_file_underflow(this); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::uflow()  
-   { return _IO_default_uflow(this); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::pbackfail(int __c) 
-   { return _IO_default_pbackfail(this, __c); }
-  
-   streamsize 
-   __basic_file::xsputn(const char* __s, streamsize __n)
-   { return _IO_file_xsputn(this, __s, __n); }
- 
-   streamoff
-   __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
- 			      ios_base::openmode __mode)
-   { return _IO_file_seekoff(this, __off, __way, __mode); }
- 
-   streamoff
-   __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode)
-   { return _IO_file_seekoff(this, __pos, ios_base::beg, __mode); }
- 
-  // NB: Unused.
-   streambuf* 
-   __basic_file::setbuf(char* __b, int __len)
-   { return (streambuf*) _IO_file_setbuf(this,__b, __len); }
- 
-  int 
-   __basic_file::sync()
-   { return _IO_file_sync(this); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::doallocate() 
-   { return _IO_file_doallocate(this); }
- 
-   // __basic_file definitions
- #ifdef _GLIBCPP_USE_WCHAR_T
-   __basic_file::__basic_file(__c_lock* __lock)
-   {
- #ifdef _IO_MTSAFE_IO
-     _lock = __lock;
- #endif
-     // Don't set the orientation of the stream when initializing.
-     _IO_no_init(this, 0, 0, &_M_wfile, &_IO_wfile_jumps);
-     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_wfile_jumps;
-     _IO_file_init((_IO_FILE_plus*)this);
- 
-     // In addition, need to allocate the buffer...
-     _IO_wdoallocbuf(this);
-     // Setup initial positions for this buffer...
-     //    if (!(_flags & _IO_NO_READS))
-     _IO_wsetg(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base,
- 	      _wide_data->_IO_buf_base);
-     //    if (!(_flags & _IO_NO_WRITES))
-     _IO_wsetp(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base);
-     
-     // Setup codecvt bits...
-     _codecvt = &__c_libio_codecvt;
-     
-     // Do the same for narrow bits...
-     if (_IO_write_base == NULL)
-       {
- 	_IO_doallocbuf(this);
- 	//      if (!(_flags & _IO_NO_READS))
- 	_IO_setg(this, _IO_buf_base, _IO_buf_base, _IO_buf_base);
- 	//    if (!(_flags & _IO_NO_WRITES))
- 	_IO_setp(this, _IO_buf_base, _IO_buf_base);
-       }
-   }
- 
-  int 
-   __basic_file::overflow(int __c) 
-   { return _IO_wfile_overflow(this, __c); }
- 
-   int 
-   __basic_file::underflow()  
-   { return _IO_wfile_underflow(this); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::uflow()  
-   { return _IO_wdefault_uflow(this); }
- 
-   // NB: Unused.
-   int 
-   __basic_file::pbackfail(int __c) 
-   { return _IO_wdefault_pbackfail(this, __c); }
- 
-   streamsize 
-   __basic_file::xsputn(const wchar_t* __s, streamsize __n)
-   { return _IO_wfile_xsputn(this, __s, __n); }
-   
-   streamoff
-   __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
- 				 ios_base::openmode __mode)
-   { return _IO_wfile_seekoff(this, __off, __way, __mode); }
- 
-   streamoff
-   __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode)
-   { return _IO_wfile_seekoff(this, __pos, ios_base::beg, __mode); }
- 
-    streambuf* 
-   __basic_file::setbuf(wchar_t* __b, int __len)
-   { return (streambuf*) _IO_wfile_setbuf(this,__b, __len); }
- 
-    int 
-   __basic_file::sync()
-   { return _IO_wfile_sync(this); }
- 
-   int 
-   __basic_file::doallocate() 
-   { return _IO_wfile_doallocate(this); }
- #endif
- 
-   // Need to instantiate base class here for type-info bits, etc
-   template struct __basic_file_base;
-   template class __basic_file;
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template struct __basic_file_base;
-   template class __basic_file;
- #endif
- }  // namespace std
- 
- 
- 
- 
- 
- 
- 
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/basic_file_libio.h gcc-3.1/libstdc++-v3/config/basic_file_libio.h
*** gcc-3.0.4/libstdc++-v3/config/basic_file_libio.h	Mon May 14 19:48:54 2001
--- gcc-3.1/libstdc++-v3/config/basic_file_libio.h	Thu Jan  1 00:00:00 1970
***************
*** 1,285 ****
- // Wrapper of C-language FILE struct -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 27.8  File-based streams
- //
- 
- #include 
- 
- namespace std 
- {
-   // __basic_file specializations
-   template<>
-     __basic_file::__basic_file(__c_lock* __lock);
- 
-   template<>
-     int 
-     __basic_file::overflow(int __c);
- 
-   template<>
-     int 
-     __basic_file::underflow();
- 
-   template<>
-     int 
-     __basic_file::uflow();
- 
-   template<>
-     int 
-     __basic_file::pbackfail(int __c);
- 
-   template<>
-     streamsize 
-     __basic_file::xsputn(const char* __s, streamsize __n);
- 
-   template<>
-     streamoff
-     __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
- 				ios_base::openmode __mode);
- 
-   template<>
-     streamoff
-     __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode);
- 
-   template<>
-     streambuf* 
-     __basic_file::setbuf(char* __b, int __len);
- 
-   template<>
-     int 
-     __basic_file::sync();
- 
-   template<>
-     int 
-     __basic_file::doallocate();
- 
-   // __basic_file specializations
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template<>
-     __basic_file::__basic_file(__c_lock* __lock);
- 
-   template<>
-     int 
-     __basic_file::overflow(int __c);
- 
-   template<>
-     int 
-     __basic_file::underflow();
- 
-   template<>
-     int 
-     __basic_file::uflow();
- 
-   template<>
-     int 
-     __basic_file::pbackfail(int __c);
- 
-   template<>
-     streamsize 
-     __basic_file::xsputn(const wchar_t* __s, streamsize __n);
- 
-   template<>
-     streamoff
-     __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
- 				ios_base::openmode __mode);
- 
-   template<>
-     streamoff
-     __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode);
- 
-   template<>
-     streambuf* 
-     __basic_file::setbuf(wchar_t* __b, int __len);
- 
-   template<>
-     int 
-     __basic_file::sync();
- 
-   template<>
-     int 
-     __basic_file::doallocate();
- #endif
- 
-   template
-     __basic_file<_CharT>::~__basic_file()
-     { _IO_file_finish(this, 0); }
-       
-   template
-     void 
-     __basic_file<_CharT>::_M_open_mode(ios_base::openmode __mode, 
- 				       int& __p_mode, int& __rw_mode, 
- 				       char* /*__c_mode*/)
-     {  
- #ifdef O_BINARY
-       bool __testb = __mode & ios_base::binary;
- #endif
-       bool __testi = __mode & ios_base::in;
-       bool __testo = __mode & ios_base::out;
-       bool __testt = __mode & ios_base::trunc;
-       bool __testa = __mode & ios_base::app;
-       
-       if (!__testi && __testo && !__testt && !__testa)
- 	{
- 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
- 	  __rw_mode = _IO_NO_READS;
- 	}
-       if (!__testi && __testo && !__testt && __testa)
- 	{
- 	  __p_mode = O_WRONLY | O_APPEND | O_CREAT;
- 	  __rw_mode = _IO_NO_READS | _IO_IS_APPENDING;
- 	}
-       if (!__testi && __testo && __testt && !__testa)
- 	{
- 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
- 	  __rw_mode = _IO_NO_READS;
- 	}
-       if (__testi && !__testo && !__testt && !__testa)
- 	{
- 	  __p_mode = O_RDONLY;
- 	  __rw_mode = _IO_NO_WRITES;
- 	}
-       if (__testi && __testo && !__testt && !__testa)
- 	{
- 	  __p_mode = O_RDWR;
- 	  __rw_mode = 0;
- 	}
-       if (__testi && __testo && __testt && !__testa)
- 	{
- 	  __p_mode = O_RDWR | O_TRUNC | O_CREAT;
- 	  __rw_mode = 0;
- 	}
- #ifdef O_BINARY
-       if (__testb)
- 	__p_mode |= O_BINARY;
- #endif	   
-     }
-   
-   template
-     __basic_file<_CharT>*
-     __basic_file<_CharT>::sys_open(__c_file_type* __f, 
- 				   ios_base::openmode __mode) 
-     {
-       __basic_file* __ret = NULL;
-       int __fd = fileno(__f);
-       int __p_mode = 0;
-       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
-       char __c_mode[4];
-       
-       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
- 
-       if (!_IO_file_is_open(this))
- 	{
- 	  _fileno = __fd;
- 	  _flags &= ~(_IO_NO_READS + _IO_NO_WRITES);
- 	  _flags |= _IO_DELETE_DONT_CLOSE;
- 	  _offset = _IO_pos_BAD;
- 	  int __mask = _IO_NO_READS + _IO_NO_WRITES + _IO_IS_APPENDING;
- 	  _IO_mask_flags(this, __rw_mode, __mask);
- 	}
- 
-       return __ret;
-     }
-   
-   template
-     __basic_file<_CharT>* 
-     __basic_file<_CharT>::open(const char* __name, ios_base::openmode __mode, 
- 			       int __prot)
-     {
-       __basic_file* __ret = NULL;
-       int __p_mode = 0;
-       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
-       char __c_mode[4];
- 
-       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
-       if (!_IO_file_is_open(this))
- 	{
- 	  __c_file_type* __f;
- 	  __f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
- 	  __ret = __f ? this: NULL;
- 	}
-       return __ret;
-     }
-   
-   template
-     bool 
-     __basic_file<_CharT>::is_open() { return _fileno >= 0; }
-   
-   template
-     __basic_file<_CharT>* 
-     __basic_file<_CharT>::close()
-     { 
-       return _IO_file_close_it(this) ? static_cast<__basic_file*>(NULL) : this;
-     }
-  
-   template
-     streamsize 
-     __basic_file<_CharT>::xsgetn(_CharT* __s, streamsize __n)
-     { return _IO_file_xsgetn(this, __s, __n); }
- 
-   // NB: Unused.
-   template
-     streamsize 
-     __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
-     { return _IO_file_read(this, __s, __n); }
- 
-   // NB: Unused.    
-   template
-     streamsize 
-     __basic_file<_CharT>::sys_write(const _CharT* __s, streamsize __n) 
-     { return _IO_file_write(this, __s, __n); }
- 
-   // NB: Unused.
-   template
-     streamoff
-     __basic_file<_CharT>::sys_seek(streamoff __pos, ios_base::seekdir __way)
-     { return _IO_file_seek(this, __pos, __way); }
-   
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::sys_close() 
-     { return _IO_file_close(this); }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::sys_stat(void* __v) 
-     { return _IO_file_stat(this, __v); }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::showmanyc() { return EOF; }
- 
-   // NB: Unused.
-   template
-     void 
-     __basic_file<_CharT>::imbue(void* /*__v*/) { }
- }  // namespace std
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/basic_file_stdio.cc gcc-3.1/libstdc++-v3/config/basic_file_stdio.cc
*** gcc-3.0.4/libstdc++-v3/config/basic_file_stdio.cc	Wed Feb 28 06:45:35 2001
--- gcc-3.1/libstdc++-v3/config/basic_file_stdio.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- // Wrapper of C-language FILE struct -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 27.8  File-based streams
- //
- 
- #include 
- 
- namespace std 
- {
-   template class __basic_file;
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template class __basic_file;
- #endif
- }  // namespace std
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/basic_file_stdio.h gcc-3.1/libstdc++-v3/config/basic_file_stdio.h
*** gcc-3.0.4/libstdc++-v3/config/basic_file_stdio.h	Tue Jun 12 23:10:02 2001
--- gcc-3.1/libstdc++-v3/config/basic_file_stdio.h	Thu Jan  1 00:00:00 1970
***************
*** 1,252 ****
- // Wrapper of C-language FILE struct -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 27.8  File-based streams
- //
- 
- namespace std 
- {
-   // Generic definitions for __basic_file
-   template
-     __basic_file<_CharT>::__basic_file(__c_lock* /*__lock*/) 
-     : _M_cfile(NULL), _M_cfile_created(false) { }
- 
-   template
-     __basic_file<_CharT>::~__basic_file()
-     {
-       if (this->is_open())
- 	{
- 	  fflush(_M_cfile);
- 	  this->close();
- 	}
-     }
-       
-   template
-     void 
-     __basic_file<_CharT>::_M_open_mode(ios_base::openmode __mode, 
- 				       int& /*__p_mode*/, int& /*__rw_mode*/, 
- 				       char* __c_mode)
-     {  
-       bool __testb = __mode & ios_base::binary;
-       bool __testi = __mode & ios_base::in;
-       bool __testo = __mode & ios_base::out;
-       bool __testt = __mode & ios_base::trunc;
-       bool __testa = __mode & ios_base::app;
-       
-       if (!__testi && __testo && !__testt && !__testa)
- 	strcpy(__c_mode, "w");
-       if (!__testi && __testo && !__testt && __testa)
- 	strcpy(__c_mode, "a");
-       if (!__testi && __testo && __testt && !__testa)
- 	strcpy(__c_mode, "w");
-       if (__testi && !__testo && !__testt && !__testa)
- 	strcpy(__c_mode, "r");
-       if (__testi && __testo && !__testt && !__testa)
- 	strcpy(__c_mode, "r+");
-       if (__testi && __testo && __testt && !__testa)
- 	strcpy(__c_mode, "w+");
-       if (__testb)
- 	strcat(__c_mode, "b");
-     }
-   
-   template
-     __basic_file<_CharT>*
-     __basic_file<_CharT>::sys_open(__c_file_type* __file, ios_base::openmode) 
-     {
-       __basic_file* __ret = NULL;
- 
-       if (!this->is_open() && __file)
- 	{
- 	  _M_cfile = __file;
- 	  _M_cfile_created = false;
- 	  __ret = this;
- 	}
- 
-       return __ret;
-     }
- 
-   template
-     _CharT
-     __basic_file<_CharT>::sys_getc()
-     {
-       return getc (_M_cfile);
-     }
- 
-   template
-     _CharT
-     __basic_file<_CharT>::sys_ungetc(_CharT __s)
-     {
-       return ungetc (__s, _M_cfile);
-     }
-   
-   template
-     __basic_file<_CharT>* 
-     __basic_file<_CharT>::open(const char* __name, ios_base::openmode __mode, 
- 			       int /*__prot*/)
-     {
-       __basic_file* __ret = NULL;
-       int __p_mode = 0;
-       int __rw_mode = 0;
-       char __c_mode[4];
-       
-       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
- 
-       if (!this->is_open())
- 	{
- 	  if ((_M_cfile = fopen(__name, __c_mode)))
- 	    {
- 	      _M_cfile_created = true;
- 	      __ret = this;
- 	    }
- 	}
-       return __ret;
-     }
-   
-   template
-     bool 
-     __basic_file<_CharT>::is_open() { return _M_cfile != 0; }
-   
-   template
-     __basic_file<_CharT>* 
-     __basic_file<_CharT>::close()
-     { 
-       __basic_file* __retval = static_cast<__basic_file*>(NULL);
-       if (_M_cfile_created && fclose(_M_cfile))
- 	__retval = this;
-       return __retval;
-     }
-  
-   template
-     streamsize 
-     __basic_file<_CharT>::xsgetn(_CharT* __s, streamsize __n)
-     { return fread(__s, 1, __n, _M_cfile); }
- 
-   template
-     streamsize 
-     __basic_file<_CharT>::xsputn(const _CharT* __s, streamsize __n)
-     { return fwrite(__s, 1, __n, _M_cfile); }
-  
-   template
-     streamoff
-     __basic_file<_CharT>::seekoff(streamoff __off, ios_base::seekdir __way, 
- 				  ios_base::openmode /*__mode*/)
-     { fseek(_M_cfile, __off, __way); return ftell(_M_cfile); }
- 
-   template
-     streamoff
-     __basic_file<_CharT>::seekpos(streamoff __pos, 
- 				  ios_base::openmode /*__mode*/)
-     { fseek(_M_cfile, __pos, ios_base::beg); return ftell(_M_cfile); }
- 
-   template
-     int 
-     __basic_file<_CharT>::sync()
-     { return fflush(_M_cfile); }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::overflow(int /*__c*/) 
-     { return EOF; }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::underflow()  
-     { return EOF; } 
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::uflow()  
-     { return EOF; }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::pbackfail(int /*__c*/) 
-     { return EOF; } 
-  
-  // NB: Unused.
-   template
-     streambuf* 
-     __basic_file<_CharT>::setbuf(_CharT* /*__b*/, int /*__len*/)
-     { return reinterpret_cast(this); }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::doallocate() 
-     { return EOF; }
- 
-   // NB: Unused.
-   template
-     streamsize 
-     __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
-     { return fread(__s, 1, __n, _M_cfile); }
- 
-   // NB: Unused.    
-   template
-     streamsize 
-     __basic_file<_CharT>::sys_write(const _CharT* __s, streamsize __n) 
-     { return fwrite(__s, 1, __n, _M_cfile); }
- 
-   // NB: Unused.
-   template
-     streamoff
-     __basic_file<_CharT>::sys_seek(streamoff __pos, ios_base::seekdir __way)
-     { 
-       fseek(_M_cfile, __pos, __way); 
-       return ftell(_M_cfile); 
-     }
-   
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::sys_close() 
-     { return fclose(_M_cfile); }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::sys_stat(void* /*__v*/) 
-     { return EOF; }
- 
-   // NB: Unused.
-   template
-     int 
-     __basic_file<_CharT>::showmanyc() 
-     { return EOF; }
- 
-   // NB: Unused.
-   template
-     void 
-     __basic_file<_CharT>::imbue(void* /*__v*/) { }
- }  // namespace std
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_io_libio.h gcc-3.1/libstdc++-v3/config/c_io_libio.h
*** gcc-3.0.4/libstdc++-v3/config/c_io_libio.h	Mon May 14 19:48:54 2001
--- gcc-3.1/libstdc++-v3/config/c_io_libio.h	Thu Jan  1 00:00:00 1970
***************
*** 1,114 ****
- // underlying io library  -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- // c_io_libio.h - Defines for using the GNU libio
- 
- #ifndef _CPP_IO_LIBIO_H
- #define _CPP_IO_LIBIO_H 1
- 
- #include 
- 
- namespace std 
- {
- // from fpos.h
-   typedef _IO_ssize_t 	streamsize; // Signed integral type
-   typedef _IO_ssize_t 	wstreamsize;
- 
- #if defined(_G_IO_IO_FILE_VERSION) && _G_IO_IO_FILE_VERSION == 0x20001
-   typedef _IO_off64_t 	streamoff;
-   typedef _IO_fpos64_t 	__c_streampos;
- #else
-   typedef _IO_off_t 	streamoff;
-   typedef _IO_fpos_t 	__c_streampos;
- #endif
- 
- #ifdef _GLIBCPP_USE_THREADS
-   typedef _IO_lock_t   __c_lock;
- #else
-   typedef int          __c_lock;
- #endif
- 
- // from basic_file.h
- #define _GLIBCPP_BASIC_FILE_INHERITANCE 1
-   typedef _IO_FILE 	__c_file_type;
-   typedef _IO_wide_data __c_wfile_type;
- 
- #ifdef _GLIBCPP_USE_WCHAR_T
-   extern "C" _IO_codecvt __c_libio_codecvt;
- #endif 
- 
- // from ios_base.h
-   struct __ios_flags
-   {
-     typedef short __int_type;
- 
-     static const __int_type _S_boolalpha =	_IO_BAD_SEEN;
-     static const __int_type _S_dec =		_IO_DEC;
-     static const __int_type _S_fixed = 		_IO_FIXED;
-     static const __int_type _S_hex =		_IO_HEX;
-     static const __int_type _S_internal = 	_IO_INTERNAL;
-     static const __int_type _S_left =          	_IO_LEFT;
-     static const __int_type _S_oct =		_IO_OCT;
-     static const __int_type _S_right =		_IO_RIGHT;
-     static const __int_type _S_scientific =	_IO_SCIENTIFIC;
-     static const __int_type _S_showbase =      	_IO_SHOWBASE;
-     static const __int_type _S_showpoint =	_IO_SHOWPOINT;
-     static const __int_type _S_showpos =       	_IO_SHOWPOS;
-     static const __int_type _S_skipws =		_IO_SKIPWS;
-     static const __int_type _S_unitbuf =       	_IO_UNITBUF;
-     static const __int_type _S_uppercase =	_IO_UPPERCASE;
-     static const __int_type _S_adjustfield =	_IO_LEFT | _IO_RIGHT
-     						| _IO_INTERNAL;
-     static const __int_type _S_basefield =	_IO_DEC | _IO_OCT | _IO_HEX;
-     static const __int_type _S_floatfield =	_IO_SCIENTIFIC | _IO_FIXED;
- 
-     // 27.4.2.1.3  Type ios_base::iostate
-     static const __int_type _S_badbit =		_IO_BAD_SEEN;
-     static const __int_type _S_eofbit =		_IO_EOF_SEEN;
-     static const __int_type _S_failbit =       	_IO_ERR_SEEN;
- 
-     // 27.4.2.1.4  Type openmode
-     static const __int_type _S_app =		_IOS_APPEND;
-     static const __int_type _S_ate =		_IOS_ATEND;
-     static const __int_type _S_bin =		_IOS_BIN;
-     static const __int_type _S_in =		_IOS_INPUT;
-     static const __int_type _S_out =		_IOS_OUTPUT;
-     static const __int_type _S_trunc =		_IOS_TRUNC;
-   };
- }
- 
- #endif // _CPP_IO_LIBIO_H
- 
- 
- 
- 
- 
- 
- 
- 
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_io_libio_codecvt.c gcc-3.1/libstdc++-v3/config/c_io_libio_codecvt.c
*** gcc-3.0.4/libstdc++-v3/config/c_io_libio_codecvt.c	Sun Oct 29 21:52:54 2000
--- gcc-3.1/libstdc++-v3/config/c_io_libio_codecvt.c	Thu Jan  1 00:00:00 1970
***************
*** 1,153 ****
- /* Copyright (C) 2000 Free Software Foundation, Inc.
-    This file is part of the GNU IO Library.
- 
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU General Public License as
-    published by the Free Software Foundation; either version 2, or (at
-    your option) any later version.
- 
-    This library 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 this library; see the file COPYING.  If not, write to
-    the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-    MA 02111-1307, USA.
- 
-    As a special exception, if you link this library with files
-    compiled with a GNU compiler to produce an executable, this does
-    not cause the resulting executable to be covered by the GNU General
-    Public License.  This exception does not however invalidate any
-    other reasons why the executable file might be covered by the GNU
-    General Public License.  */
- 
- /* Slightly modified from glibc/libio/iofwide.c */
- 
- #include 
- 
- #ifdef _GLIBCPP_USE_WCHAR_T
- 
- /* Prototypes of libio's codecvt functions.  */
- static enum __codecvt_result 
- do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
-        const wchar_t *from_start, const wchar_t *from_end,
-        const wchar_t **from_stop, char *to_start, char *to_end, 
-        char **to_stop);
- 
- static enum __codecvt_result 
- do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, char *to_start, 
- 	   char *to_end, char **to_stop);
- 
- static enum __codecvt_result 
- do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, 
-       const char *from_start, const char *from_end, const char **from_stop, 
-       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop);
- 
- static int 
- do_encoding(struct _IO_codecvt *codecvt);
- 
- static int 
- do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, 
- 	  const char *from_start, const char *from_end, _IO_size_t max);
- 
- static int 
- do_max_length(struct _IO_codecvt *codecvt);
- 
- static int 
- do_always_noconv(struct _IO_codecvt *codecvt);
- 
- 
- /* The functions used in `codecvt' for libio are always the same.  */
- struct _IO_codecvt __c_libio_codecvt =
- {
-   .__codecvt_destr = NULL,		/* Destructor, never used.  */
-   .__codecvt_do_out = do_out,
-   .__codecvt_do_unshift = do_unshift,
-   .__codecvt_do_in = do_in,
-   .__codecvt_do_encoding = do_encoding,
-   .__codecvt_do_always_noconv = do_always_noconv,
-   .__codecvt_do_length = do_length,
-   .__codecvt_do_max_length = do_max_length
- };
- 
- static enum __codecvt_result
- do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
-        const wchar_t *from_start, const wchar_t *from_end,
-        const wchar_t **from_stop, char *to_start, char *to_end,
-        char **to_stop)
- {
-   enum __codecvt_result res = __codecvt_ok;
- 
-   while (from_start < from_end)
-     {
-       if (to_start >= to_end)
- 	{
- 	  res = __codecvt_partial;
- 	  break;
- 	}
-       *to_start++ = (char) *from_start++;
-     }
- 
-   *from_stop = from_start;
-   *to_stop = to_start;
- 
-   return res;
- }
- 
- 
- static enum __codecvt_result
- do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
- 	   char *to_start, char *to_end, char **to_stop)
- {
-   *to_stop = to_start;
-   return __codecvt_ok;
- }
- 
- 
- static enum __codecvt_result
- do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
-       const char *from_start, const char *from_end, const char **from_stop,
-       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop)
- {
-   enum __codecvt_result res = __codecvt_ok;
- 
-   while (from_start < from_end)
-     {
-       if (to_start >= to_end)
- 	{
- 	  res = __codecvt_partial;
- 	  break;
- 	}
-       *to_start++ = (wchar_t) *from_start++;
-     }
- 
-   *from_stop = from_start;
-   *to_stop = to_start;
- 
-   return res;
- }
- 
- 
- static int
- do_encoding(struct _IO_codecvt *codecvt)
- { return 1; }
- 
- 
- static int
- do_always_noconv(struct _IO_codecvt *codecvt)
- { return 0; }
- 
- 
- static int
- do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
- 	  const char *from_start, const char *from_end, _IO_size_t max)
- { return from_end - from_start; }
- 
- 
- static int
- do_max_length(struct _IO_codecvt *codecvt)
- { return 1; }
- 
- #endif /* _GLIBCPP_USE_WCHAR_T */
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_io_stdio.h gcc-3.1/libstdc++-v3/config/c_io_stdio.h
*** gcc-3.0.4/libstdc++-v3/config/c_io_stdio.h	Tue Jun 12 02:30:05 2001
--- gcc-3.1/libstdc++-v3/config/c_io_stdio.h	Thu Jan  1 00:00:00 1970
***************
*** 1,94 ****
- // underlying io library  -*- C++ -*-
- 
- // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- // c_io_stdio.h - Defines for using "C" stdio.h
- 
- #ifndef _CPP_IO_STDIO_H
- #define _CPP_IO_STDIO_H 1
- 
- #include 
- #include 
- #include 
- 
- namespace std 
- {
- // from fpos.h
-   typedef long  	streamoff;
-   typedef ptrdiff_t	streamsize; // Signed integral type
- #if _GLIBCPP_USE_WCHAR_T
-   typedef ptrdiff_t	wstreamsize;
- #endif
-   typedef fpos_t  	__c_streampos;
- 
-   typedef __gthread_mutex_t __c_lock;
- 
- // from basic_file.h
- #define _GLIBCPP_BASIC_FILE_ENCAPSULATION 1
-   typedef FILE __c_file_type;
- 
- // from ios_base.h
-   struct __ios_flags
-   {
-     typedef short __int_type;
- 
-     static const __int_type _S_boolalpha =	0x0001;
-     static const __int_type _S_dec =		0x0002;
-     static const __int_type _S_fixed = 		0x0004;
-     static const __int_type _S_hex =		0x0008;
-     static const __int_type _S_internal = 	0x0010;
-     static const __int_type _S_left =   	0x0020;
-     static const __int_type _S_oct =		0x0040;
-     static const __int_type _S_right =		0x0080;
-     static const __int_type _S_scientific =	0x0100;
-     static const __int_type _S_showbase =       0x0200;
-     static const __int_type _S_showpoint =	0x0400;
-     static const __int_type _S_showpos =	0x0800;
-     static const __int_type _S_skipws =		0x1000;
-     static const __int_type _S_unitbuf =	0x2000;
-     static const __int_type _S_uppercase =	0x4000;
-     static const __int_type _S_adjustfield =	0x0020 | 0x0080 | 0x0010;
-     static const __int_type _S_basefield =	0x0002 | 0x0040 | 0x0008;
-     static const __int_type _S_floatfield =	0x0100 | 0x0004;
- 
-     // 27.4.2.1.3  Type ios_base::iostate
-     static const __int_type _S_badbit =		0x01;
-     static const __int_type _S_eofbit =		0x02;
-     static const __int_type _S_failbit =       	0x04;
- 
-     // 27.4.2.1.4  Type openmode
-     static const __int_type _S_app =		0x01;
-     static const __int_type _S_ate =		0x02;
-     static const __int_type _S_bin =		0x04;
-     static const __int_type _S_in =		0x08;
-     static const __int_type _S_out =		0x10;
-     static const __int_type _S_trunc =		0x20;
-   };
- }
- 
- #endif // _CPP_IO_STDIO_H
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_locale_generic.cc gcc-3.1/libstdc++-v3/config/c_locale_generic.cc
*** gcc-3.0.4/libstdc++-v3/config/c_locale_generic.cc	Tue Jan 30 17:21:50 2001
--- gcc-3.1/libstdc++-v3/config/c_locale_generic.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,107 ****
- // Wrapper for underlying C-language localization -*- C++ -*-
- 
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 22.8  Standard locale categories.
- //
- 
- // Written by Benjamin Kosnik 
- 
- #include 
- 
- namespace std 
- {
-   void
-   locale::facet::_S_create_c_locale(__c_locale& /*__cloc*/, const char*)
-   { }
- 
-   void
-   locale::facet::_S_destroy_c_locale(__c_locale& /*__cloc*/)
-   { }
- 
-   template<> 
-     void
-     numpunct::_M_initialize_numpunct(__c_locale /*__cloc*/)
-     {
-       // "C" locale
-       _M_decimal_point = '.';
-       _M_thousands_sep = ',';
-       _M_grouping = "";
-       _M_truename = "true";
-       _M_falsename = "false";
-     }
-       
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template<> 
-     void
-     numpunct::_M_initialize_numpunct(__c_locale /*__cloc*/)
-     {
-       // "C" locale
-       _M_decimal_point = L'.';
-       _M_thousands_sep = L',';
-       _M_grouping = "";
-       _M_truename = L"true";
-       _M_falsename = L"false";
-     }
- #endif
- 
-   template<> 
-     void
-     moneypunct::_M_initialize_moneypunct(__c_locale /*__cloc*/)
-     {
-       // "C" locale
-       _M_decimal_point = '.';
-       _M_thousands_sep = ',';
-       _M_grouping = "";
-       _M_curr_symbol = string_type();
-       _M_positive_sign = string_type();
-       _M_negative_sign = string_type();
-       _M_frac_digits = 0;
-       _M_pos_format = money_base::_S_default_pattern;
-       _M_neg_format = money_base::_S_default_pattern;
-     }
- 
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template<> 
-     void
-     moneypunct::_M_initialize_moneypunct(__c_locale /*__cloc*/)
-     {
-       // "C" locale
-       _M_decimal_point = L'.';
-       _M_thousands_sep = L',';
-       _M_grouping = "";
-       _M_curr_symbol = string_type();
-       _M_positive_sign = string_type();
-       _M_negative_sign = string_type();
-       _M_frac_digits = 0;
-       _M_pos_format = money_base::_S_default_pattern;
-       _M_neg_format = money_base::_S_default_pattern;
-     }
- #endif
- }  // namespace std
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_locale_generic.h gcc-3.1/libstdc++-v3/config/c_locale_generic.h
*** gcc-3.0.4/libstdc++-v3/config/c_locale_generic.h	Tue Jan 30 09:18:50 2001
--- gcc-3.1/libstdc++-v3/config/c_locale_generic.h	Thu Jan  1 00:00:00 1970
***************
*** 1,39 ****
- // Wrapper for underlying C-language localization -*- C++ -*-
- 
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 22.8  Standard locale categories.
- //
- 
- // Written by Benjamin Kosnik 
- 
- namespace std
- {
-   typedef int*			__c_locale;
- }
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_locale_gnu.cc gcc-3.1/libstdc++-v3/config/c_locale_gnu.cc
*** gcc-3.0.4/libstdc++-v3/config/c_locale_gnu.cc	Tue Jan 30 09:18:50 2001
--- gcc-3.1/libstdc++-v3/config/c_locale_gnu.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,204 ****
- // Wrapper for underlying C-language localization -*- C++ -*-
- 
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 22.8  Standard locale categories.
- //
- 
- // Written by Benjamin Kosnik 
- 
- #include 
- #include 
- #include 
- 
- namespace std 
- {
-   void
-   locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s)
-   {
-     // XXX
-     // perhaps locale::categories could be made equivalent to LC_*_MASK
-     //    _M_c_locale = __newlocale(1 << LC_ALL, __str.c_str(), NULL);
-     //    _M_c_locale = __newlocale(locale::all, __str.c_str(), NULL);
-     __cloc = __newlocale(LC_ALL, __s, NULL);
-     if (!__cloc)
-       {
- 	// This named locale is not supported by the underlying OS.
- 	throw runtime_error("attempt to create locale from unknown name");
-       }
-   }
-   
-   void
-   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
-   {
-     if (__cloc)
-       __freelocale(__cloc); 
-   }
- 
-   template<> 
-     void
-     numpunct::_M_initialize_numpunct(__c_locale __cloc)
-     {
-       if (!__cloc)
- 	{
- 	  // "C" locale
- 	  _M_decimal_point = '.';
- 	  _M_thousands_sep = ',';
- 	  _M_grouping = "";
- 	}
-       else
- 	{
- 	  // Named locale.
- 	  _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc));
- 	  _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc));
- 	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
- 	}
-       // NB: There is no way to extact this info from posix locales.
-       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
-       _M_truename = "true";
-       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
-       _M_falsename = "false";
-     }
-       
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template<> 
-     void
-     numpunct::_M_initialize_numpunct(__c_locale __cloc)
-     {
-       if (!__cloc)
- 	{
- 	  // "C" locale
- 	  _M_decimal_point = L'.';
- 	  _M_thousands_sep = L',';
- 	  _M_grouping = "";
- 	}
-       else
- 	{
- 	  // Named locale.
- 	  _M_decimal_point = reinterpret_cast(__nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc));
- 	  _M_thousands_sep = reinterpret_cast(__nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC,__cloc));
- 	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
- 	}
-       // NB: There is no way to extact this info from posix locales.
-       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
-       _M_truename = L"true";
-       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
-       _M_falsename = L"false";
-     }
- #endif
- 
-   template<> 
-     void
-     moneypunct::_M_initialize_moneypunct(__c_locale __cloc)
-     {
-       if (!__cloc)
- 	{
- 	  // "C" locale
- 	  _M_decimal_point = '.';
- 	  _M_thousands_sep = ',';
- 	  _M_grouping = "";
- 	  _M_curr_symbol = string_type();
- 	  _M_positive_sign = string_type();
- 	  _M_negative_sign = string_type();
- 	  _M_frac_digits = 0;
- 	  _M_pos_format = money_base::_S_default_pattern;
- 	  _M_neg_format = money_base::_S_default_pattern;
- 	}
-       else
- 	{
- 	  // Named locale.
- 	  _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc));
- 	  _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc));
- 	  _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
- 	  _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
- 	  _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
- 	  if (intl)
- 	    {
- 	      _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
- 	      _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc));
- 	      char __ppreceeds = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, 
- 						   __cloc));
- 	      char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
- 	      char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
- 	      _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace, 
- 						   __pposn);
- 	      char __npreceeds = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, 
- 						   __cloc));
- 	      char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
- 	      char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
- 	      _M_neg_format = _S_construct_pattern(__npreceeds, __nspace, 
- 						   __nposn);
- 	    }
- 	  else
- 	    {
- 	      _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
- 	      _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
- 	      char __ppreceeds = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
- 	      char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
- 	      char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
- 	      _M_pos_format = _S_construct_pattern(__ppreceeds, __pspace, 
- 						   __pposn);
- 	      char __npreceeds = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
- 	      char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
- 	      char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
- 	      _M_neg_format = _S_construct_pattern(__npreceeds, __nspace, 
- 						   __nposn);
- 	    }
- 	}
-     }
- 
- #ifdef _GLIBCPP_USE_WCHAR_T
-   template<> 
-     void
-     moneypunct::_M_initialize_moneypunct(__c_locale /*__cloc*/)
-     {
-       // XXX implement
-       // "C" locale
-       _M_decimal_point = L'.';
-       _M_thousands_sep = L',';
-       _M_grouping = "";
-       _M_curr_symbol = string_type();
-       _M_positive_sign = string_type();
-       _M_negative_sign = string_type();
-       _M_frac_digits = 0;
-       _M_pos_format = money_base::_S_default_pattern;
-       _M_neg_format = money_base::_S_default_pattern;
-     }
- #endif
- }  // namespace std
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/c_locale_gnu.h gcc-3.1/libstdc++-v3/config/c_locale_gnu.h
*** gcc-3.0.4/libstdc++-v3/config/c_locale_gnu.h	Mon May 14 19:48:54 2001
--- gcc-3.1/libstdc++-v3/config/c_locale_gnu.h	Thu Jan  1 00:00:00 1970
***************
*** 1,41 ****
- // Wrapper for underlying C-language localization -*- C++ -*-
- 
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- //
- // ISO C++ 14882: 22.8  Standard locale categories.
- //
- 
- // Written by Benjamin Kosnik 
- 
- #include 
- 
- namespace std
- {
-   typedef __locale_t		__c_locale;
- }
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/alpha/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/alpha/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/alpha/bits/atomicity.h	Wed Feb 28 00:04:02 2001
--- gcc-3.1/libstdc++-v3/config/cpu/alpha/bits/atomicity.h	Fri Oct  5 18:43:41 2001
*************** __atomic_add (volatile _Atomic_word* __m
*** 73,97 ****
        : "m" (*__mem), "r"(__val));
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long __oldval, long __newval)
- {
-   int __ret;
- 
-   __asm__ __volatile__ (
-       "\n$Lcas_%=:\n\t"
-       "ldq_l  %0,%4\n\t"
-       "cmpeq  %0,%2,%0\n\t"
-       "beq    %0,3f\n\t"
-       "mov    %3,%0\n\t"
-       "stq_c  %0,%1\n\t"
-       "beq    %0,$Lcas_%=\n\t"
-       "mb"
-       : "=&r"(__ret), "=m"(*__p)
-       : "r"(__oldval), "r"(__newval), "m"(*__p));
- 
-   return __ret;
- }
- 
  #endif /* atomicity.h */
--- 73,76 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/alpha/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/alpha/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/alpha/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/alpha/bits/cpu_limits.h	Tue Oct 23 21:40:28 2001
***************
*** 0 ****
--- 1,38 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_bits 64
+ 
+ #define __glibcpp_long_double_bits 64
+ 
+ #endif
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/arm/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/arm/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/arm/bits/atomicity.h	Wed Feb 28 00:04:03 2001
--- gcc-3.1/libstdc++-v3/config/cpu/arm/bits/atomicity.h	Fri Oct  5 18:43:41 2001
*************** __atomic_add (volatile _Atomic_word *__m
*** 127,189 ****
  #endif
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long __oldval, long __newval)
- {
-   int __result;
-   long __tmp;
- #ifdef __thumb__
-   /* Since this function is inlined, we can't be sure of the alignment.  */
-   __asm__ __volatile__ (
- 	"ldr     %0, 4f \n\t"
- 	"bx      %0 \n\t"
- 	".align 0 \n"
- 	"4:\t"
- 	".word   0f \n\t"
- 	".code 32 \n"
- 	"0:\t"
- 	"ldr     %1, [%2] \n\t"
-         "mov     %0, #0 \n\t"
-         "cmp     %1, %4 \n\t"
-         "bne     1f \n\t"
-         "swp     %0, %3, [%2] \n\t"
-         "cmp     %1, %0 \n\t"
-         "swpne   %1, %0, [%2] \n\t"
-         "bne     0b \n\t"
-         "mov     %0, #1 \n"
- 	"1:\t"
- 	"ldr     %1, 2f \n\t"
- 	"bx      %1 \n"
- 	"2:\t"
- 	".word   3f \n\t"
- 	".code 16\n"
- 	"3:\n"
- 	: "=&l"(__result), "=&r"(__tmp) 
- 	: "r" (__p), "r" (__newval), "r" (__oldval) 
- 	: "cc", "memory");
- #else
-   __asm__ __volatile__ (
- 	"\n"
- 	"0:\t"
- 	"ldr     %1, [%2] \n\t"
- 	"mov     %0, #0 \n\t"
- 	"cmp     %1, %4 \n\t"
- 	"bne     1f \n\t"
- 	"swp     %0, %3, [%2] \n\t"
- 	"cmp     %1, %0 \n\t"
- 	"swpne   %1, %0, [%2] \n\t"
- 	"bne     0b \n\t"
- 	"mov     %0, #1 \n"
- 	"1:\n\t"
- 	""
- 	: "=&r"(__result), "=&r"(__tmp) 
- 	: "r" (__p), "r" (__newval), "r" (__oldval) 
- 	: "cc", "memory");
- #endif
-   return __result;
- }
- 
  static inline long
  __attribute__ ((__unused__))
  __always_swap (volatile long *__p, long __newval)
--- 127,132 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/cris/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/cris/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/cris/bits/atomicity.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/cris/bits/atomicity.h	Mon Oct  1 16:57:44 2001
***************
*** 0 ****
--- 1,79 ----
+ // Low-level functions for atomic operations: CRIS version  -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _BITS_ATOMICITY_H
+ #define _BITS_ATOMICITY_H	1
+ 
+ // This entity must not cross a page boundary.
+ typedef int _Atomic_word __attribute__ ((__aligned__ (4)));
+ 
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add (_Atomic_word* __mem, int __val)
+ {
+   int __tmp;
+   _Atomic_word __result;
+ 
+ #if (__CRIS_arch_version >= 10)
+   __asm__ __volatile__ (" clearf		\n"
+ 			"0:			\n"
+ 			" move.d %4,%2		\n"
+ 			" move.d [%3],%0	\n"
+ 			" add.d %0,%2		\n"
+ 			" ax			\n"
+ 			" move.d %2,[%3]	\n"
+ 			" bwf 0b		\n"
+ 			" clearf		\n"
+ 			:  "=&r" (__result), "=m" (*__mem), "=&r" (__tmp)
+ 			: "r" (__mem), "g" (__val), "m" (*__mem)
+ 			: "memory");
+ #else
+   __asm__ __volatile__ (" move $ccr,$r9		\n"
+ 			" di			\n"
+ 			" move.d %4,%2		\n"
+ 			" move.d [%3],%0	\n"
+ 			" add.d %0,%2		\n"
+ 			" move.d %2,[%3]	\n"
+ 			" move $r9,$ccr		\n"
+ 			:  "=&r" (__result), "=m" (*__mem), "=&r" (__tmp)
+ 			: "r" (__mem), "g" (__val), "m" (*__mem)
+ 			: "memory", "r9");
+ #endif
+ 
+   return __result;
+ }
+ 
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add (_Atomic_word* __mem, int __val)
+ {
+   __exchange_and_add (__mem, __val);
+ }
+ 
+ #endif /* atomicity.h */
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/cris/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/cris/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/cris/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/cris/bits/cpu_limits.h	Tue Oct 23 21:40:28 2001
***************
*** 0 ****
--- 1,33 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_double_bits 64
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/generic/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/generic/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/generic/bits/atomicity.h	Wed Feb 28 00:04:04 2001
--- gcc-3.1/libstdc++-v3/config/cpu/generic/bits/atomicity.h	Fri Oct  5 18:43:42 2001
*************** __atomic_add (_Atomic_word* __mem, int _
*** 48,62 ****
    *__mem += __val;
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (long *__p, long __oldval, long __newval)
- {
-   if (*__p != __oldval)
-     return 0;
- 
-   *__p = __newval;
-   return 1;
- }
- 
  #endif /* atomicity.h */
--- 48,51 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/generic/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/generic/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/generic/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/generic/bits/cpu_limits.h	Tue Oct 23 21:40:28 2001
***************
*** 0 ****
--- 1,41 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ // Nothing is defined in the generic file.  In that way, we fall back
+ // on the defaults in std_limits.h.
+ 
+ // If you need to override these defaults, you can either use a
+ // CPU-specific version (in which case you must modify
+ // configure.target) or you must add the overrides to your
+ // os_defines.h.  In general, if all systems for your CPU use the
+ // same values, it is best to use a cpu-specific configuration file.
+ 
+ #endif
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/i386/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/i386/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/i386/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/i386/bits/cpu_limits.h	Tue Oct 23 21:40:28 2001
***************
*** 0 ****
--- 1,33 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_double_bits 80
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/i386/bits/limits.h gcc-3.1/libstdc++-v3/config/cpu/i386/bits/limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/i386/bits/limits.h	Mon Aug 13 22:22:26 2001
--- gcc-3.1/libstdc++-v3/config/cpu/i386/bits/limits.h	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- #ifndef _GLIBCPP_CPU_LIMITS
- #define _GLIBCPP_CPU_LIMITS 1
- 
- #define __glibcpp_long_double_bits 80
- 
- #endif
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/i486/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/i486/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/i486/bits/atomicity.h	Wed Feb 28 00:04:05 2001
--- gcc-3.1/libstdc++-v3/config/cpu/i486/bits/atomicity.h	Fri Oct  5 18:43:42 2001
*************** __atomic_add (volatile _Atomic_word* __m
*** 52,70 ****
  			: : "ir" (__val), "m" (*__mem) : "memory");
  }
  
- static inline char
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long* __p, long __oldval, long __newval)
- {
-   char __ret;
-   long __readval;
- 
-   __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
-                         : "=q" (__ret), "=m" (*__p), "=a" (__readval)
-                         : "r" (__newval), "m" (*__p), "a" (__oldval));
-   return __ret;
- }
- 
  #endif /* atomicity.h */
  
  
--- 52,57 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/ia64/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/ia64/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/ia64/bits/atomicity.h	Wed Feb 28 00:04:06 2001
--- gcc-3.1/libstdc++-v3/config/cpu/ia64/bits/atomicity.h	Fri Oct  5 18:43:42 2001
*************** __atomic_add (volatile _Atomic_word* __m
*** 48,58 ****
    __sync_fetch_and_add (__mem, __val);
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long __oldval, long __newval)
- {
-   return __sync_bool_compare_and_swap (__p, __oldval, __newval);
- }
- 
  #endif /* atomicity.h */
--- 48,51 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/ia64/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/ia64/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/ia64/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/ia64/bits/cpu_limits.h	Sat Dec 29 01:19:51 2001
***************
*** 0 ****
--- 1,36 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_bits 64
+ 
+ // While sizeof(long double) == 16, the format is the same as the x86.
+ #define __glibcpp_long_double_bits 80
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/m68k/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/m68k/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/m68k/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/m68k/bits/cpu_limits.h	Tue Oct 23 21:40:28 2001
***************
*** 0 ****
--- 1,35 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_double_bits 96
+ 
+ #endif
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/mips/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/mips/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/mips/bits/atomicity.h	Mon Sep 10 20:11:05 2001
--- gcc-3.1/libstdc++-v3/config/cpu/mips/bits/atomicity.h	Fri Oct  5 18:43:43 2001
*************** __atomic_add (volatile _Atomic_word *__m
*** 75,105 ****
       : "memory");
  }
  
- static inline int
- __attribute__ ((unused))
- __compare_and_swap (volatile long int *__p, long int __oldval,
- 		    long int __newval)
- {
-   long int __ret;
- 
-   __asm__ __volatile__
-     ("/* Inline compare & swap */\n\t"
-      "1:\n\t"
-      "ll	%0,%4\n\t"
-      ".set	push\n"
-      ".set	noreorder\n\t"
-      "bne	%0,%2,2f\n\t"
-      "move	%0,%3\n\t"
-      ".set	pop\n\t"
-      "sc	%0,%1\n\t"
-      "beqz	%0,1b\n"
-      "2:\n\t"
-      "/* End compare & swap */"
-      : "=&r" (__ret), "=m" (*__p)
-      : "r" (__oldval), "r" (__newval), "m" (*__p)
-      : "memory");
- 
-   return __ret;
- }
- 
  #endif /* atomicity.h */
--- 75,78 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/mmix/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/mmix/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/mmix/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/mmix/bits/cpu_limits.h	Tue Apr 23 20:32:10 2002
***************
*** 0 ****
--- 1,34 ----
+ // Copyright (C) 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_bits 64
+ #define __glibcpp_long_double_bits 64
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Wed Feb 28 00:04:08 2001
--- gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Fri Oct  5 18:43:43 2001
*************** __atomic_add (volatile _Atomic_word *__m
*** 69,96 ****
  	: "cr0", "memory");
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long int __oldval, long int __newval)
- {
-   int __res;
-   __asm__ __volatile__ (
- 	"/* Inline compare & swap */\n"
- 	"0:\t"
- 	"lwarx    %0,0,%1  \n\t"
- 	"sub%I2c. %0,%0,%2 \n\t"
- 	"cntlzw   %0,%0 \n\t"
- 	"bne-     1f \n\t"
- 	"stwcx.   %3,0,%1 \n\t"
- 	"bne-     0b \n"
- 	"1:\n\t"
- 	"/* End compare & swap */"
- 	: "=&b"(__res)
- 	: "r"(__p), "Ir"(__oldval), "r"(__newval)
- 	: "cr0", "memory");
-   return __res >> 5;
- }
- 
  static inline long
  __attribute__ ((__unused__))
  __always_swap (volatile long *__p, long int __newval)
--- 69,74 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/cpu_limits.h	Tue Oct 23 21:40:29 2001
***************
*** 0 ****
--- 1,38 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #ifndef __LONG_DOUBLE_128__
+ #define __glibcpp_long_double_bits 64
+ #endif
+ 
+ #endif
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/limits.h gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/powerpc/bits/limits.h	Thu Aug 16 19:09:53 2001
--- gcc-3.1/libstdc++-v3/config/cpu/powerpc/bits/limits.h	Thu Jan  1 00:00:00 1970
***************
*** 1,33 ****
- // Copyright (C) 2001 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library 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 this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- #ifndef _GLIBCPP_CPU_LIMITS
- #define _GLIBCPP_CPU_LIMITS 1
- 
- #define __glibcpp_long_double_bits 64
- 
- #endif
--- 0 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/s390/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/s390/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/s390/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/s390/bits/cpu_limits.h	Fri Oct 26 02:13:29 2001
***************
*** 0 ****
--- 1,33 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_double_bits 64
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/sparc/sparc32/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/sparc/sparc32/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/sparc/sparc32/bits/atomicity.h	Thu Jan  3 06:16:54 2002
--- gcc-3.1/libstdc++-v3/config/cpu/sparc/sparc32/bits/atomicity.h	Tue Dec 11 09:41:40 2001
***************
*** 1,6 ****
  // Low-level functions for atomic operations: Sparc32 version  -*- C++ -*-
  
! // Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Low-level functions for atomic operations: Sparc32 version  -*- C++ -*-
  
! // Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
*************** __atomic_add (volatile _Atomic_word* __m
*** 85,117 ****
  		       : "memory");
  }
  
- static int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long __oldval, long __newval)
- {
-   static unsigned char __lock;
-   long __ret, __tmp;
- 
-   __asm__ __volatile__("1:	ldstub	[%1], %0\n\t"
- 		       "	cmp	%0, 0\n\t"
- 		       "	bne	1b\n\t"
- 		       "	 nop"
- 		       : "=&r" (__tmp)
- 		       : "r" (&__lock)
- 		       : "memory");
-   if (*__p != __oldval)
-     __ret = 0;
-   else
-     {
-       *__p = __newval;
-       __ret = 1;
-     }
-   __asm__ __volatile__("stb	%%g0, [%0]"
- 		       : /* no outputs */
- 		       : "r" (&__lock)
- 		       : "memory");
- 
-   return __ret;
- }
- 
  #endif /* atomicity.h */
--- 85,88 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/sparc/sparc64/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/sparc/sparc64/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/sparc/sparc64/bits/atomicity.h	Wed Feb 28 00:04:10 2001
--- gcc-3.1/libstdc++-v3/config/cpu/sparc/sparc64/bits/atomicity.h	Fri Oct  5 18:43:43 2001
*************** __atomic_add (volatile _Atomic_word* __m
*** 67,93 ****
  		       : "memory");
  }
  
- static inline int
- __attribute__ ((__unused__))
- __compare_and_swap (volatile long *__p, long __oldval, long __newval)
- {
-   register int __tmp;
-   register long __tmp2;
- 
-   __asm__ __volatile__("1:	ldx	[%4], %0\n\t"
- 		       "	mov	%2, %1\n\t"
- 		       "	cmp	%0, %3\n\t"
- 		       "	bne,a,pn %%xcc, 2f\n\t"
- 		       "	 mov	0, %0\n\t"
- 		       "	casx	[%4], %0, %1\n\t"
- 		       "	sub	%0, %1, %0\n\t"
- 		       "	brnz,pn	%0, 1b\n\t"
- 		       "	 mov	1, %0\n\t"
- 		       "2:"
- 		       : "=&r" (__tmp), "=&r" (__tmp2)
- 		       : "r" (__newval), "r" (__oldval), "r" (__p)
- 		       : "memory");
-   return __tmp;
- }
- 
  #endif /* atomicity.h */
--- 67,70 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/x86-64/bits/atomicity.h gcc-3.1/libstdc++-v3/config/cpu/x86-64/bits/atomicity.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/x86-64/bits/atomicity.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/x86-64/bits/atomicity.h	Fri Oct 19 06:34:01 2001
***************
*** 0 ****
--- 1,55 ----
+ // Low-level functions for atomic operations: AMD x86-64, -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _BITS_ATOMICITY_H
+ #define _BITS_ATOMICITY_H	1
+ 
+ typedef int _Atomic_word;
+ 
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add (volatile _Atomic_word *__mem, int __val)
+ {
+   register _Atomic_word __result;
+   __asm__ __volatile__ ("lock; xaddl %0,%2"
+ 			: "=r" (__result)
+                         : "0" (__val), "m" (*__mem)
+                         : "memory");
+   return __result;
+ }
+ 
+ static inline void
+ __attribute__ ((__unused__))
+ __atomic_add (volatile _Atomic_word* __mem, int __val)
+ {
+   __asm__ __volatile__ ("lock; addl %0,%1"
+ 			: : "ir" (__val), "m" (*__mem) : "memory");
+ }
+ 
+ #endif /* atomicity.h */
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/cpu/x86-64/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/cpu/x86-64/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/cpu/x86-64/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/cpu/x86-64/bits/cpu_limits.h	Wed Jan  9 13:45:47 2002
***************
*** 0 ****
--- 1,35 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_bits 64
+ 
+ #define __glibcpp_long_double_bits 80
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/basic_file_libio.cc gcc-3.1/libstdc++-v3/config/io/basic_file_libio.cc
*** gcc-3.0.4/libstdc++-v3/config/io/basic_file_libio.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/basic_file_libio.cc	Wed Aug  8 02:48:57 2001
***************
*** 0 ****
--- 1,194 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include 
+ 
+ namespace std 
+ {
+   // __basic_file definitions
+   __basic_file::__basic_file(__c_lock* __lock)
+   {
+ #ifdef _IO_MTSAFE_IO
+     _lock = __lock;
+ #endif
+     // Don't set the orientation of the stream when initializing.
+ #ifdef _GLIBCPP_USE_WCHAR_T
+     _IO_no_init(this, 0, 0, &_M_wfile, 0);
+ #else /* !defined(_GLIBCPP_USE_WCHAR_T) */
+     _IO_no_init(this, 0, 0, NULL, 0);
+ #endif /* !defined(_GLIBCPP_USE_WCHAR_T) */
+     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_file_jumps;
+     _IO_file_init((_IO_FILE_plus*)this);
+   }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::overflow(int __c) 
+   { return _IO_file_overflow(this, __c); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::underflow()  
+   { return _IO_file_underflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::uflow()  
+   { return _IO_default_uflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::pbackfail(int __c) 
+   { return _IO_default_pbackfail(this, __c); }
+  
+   streamsize 
+   __basic_file::xsputn(const char* __s, streamsize __n)
+   { return _IO_file_xsputn(this, __s, __n); }
+ 
+   streamoff
+   __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 			      ios_base::openmode __mode)
+   { return _IO_file_seekoff(this, __off, __way, __mode); }
+ 
+   streamoff
+   __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode)
+   { return _IO_file_seekoff(this, __pos, ios_base::beg, __mode); }
+ 
+  // NB: Unused.
+   streambuf* 
+   __basic_file::setbuf(char* __b, int __len)
+   { return (streambuf*) _IO_file_setbuf(this,__b, __len); }
+ 
+  int 
+   __basic_file::sync()
+   { return _IO_file_sync(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::doallocate() 
+   { return _IO_file_doallocate(this); }
+ 
+   // __basic_file definitions
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   __basic_file::__basic_file(__c_lock* __lock)
+   {
+ #ifdef _IO_MTSAFE_IO
+     _lock = __lock;
+ #endif
+     // Don't set the orientation of the stream when initializing.
+     _IO_no_init(this, 0, 0, &_M_wfile, &_IO_wfile_jumps);
+     _IO_JUMPS((_IO_FILE_plus *) this) = &_IO_wfile_jumps;
+     _IO_file_init((_IO_FILE_plus*)this);
+ 
+     // In addition, need to allocate the buffer...
+     _IO_wdoallocbuf(this);
+     // Setup initial positions for this buffer...
+     //    if (!(_flags & _IO_NO_READS))
+     _IO_wsetg(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base,
+ 	      _wide_data->_IO_buf_base);
+     //    if (!(_flags & _IO_NO_WRITES))
+     _IO_wsetp(this, _wide_data->_IO_buf_base, _wide_data->_IO_buf_base);
+     
+     // Setup codecvt bits...
+     _codecvt = &__c_libio_codecvt;
+     
+     // Do the same for narrow bits...
+     if (_IO_write_base == NULL)
+       {
+ 	_IO_doallocbuf(this);
+ 	//      if (!(_flags & _IO_NO_READS))
+ 	_IO_setg(this, _IO_buf_base, _IO_buf_base, _IO_buf_base);
+ 	//    if (!(_flags & _IO_NO_WRITES))
+ 	_IO_setp(this, _IO_buf_base, _IO_buf_base);
+       }
+   }
+ 
+  int 
+   __basic_file::overflow(int __c) 
+   { return _IO_wfile_overflow(this, __c); }
+ 
+   int 
+   __basic_file::underflow()  
+   { return _IO_wfile_underflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::uflow()  
+   { return _IO_wdefault_uflow(this); }
+ 
+   // NB: Unused.
+   int 
+   __basic_file::pbackfail(int __c) 
+   { return _IO_wdefault_pbackfail(this, __c); }
+ 
+   streamsize 
+   __basic_file::xsputn(const wchar_t* __s, streamsize __n)
+   { return _IO_wfile_xsputn(this, __s, __n); }
+   
+   streamoff
+   __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				 ios_base::openmode __mode)
+   { return _IO_wfile_seekoff(this, __off, __way, __mode); }
+ 
+   streamoff
+   __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode)
+   { return _IO_wfile_seekoff(this, __pos, ios_base::beg, __mode); }
+ 
+    streambuf* 
+   __basic_file::setbuf(wchar_t* __b, int __len)
+   { return (streambuf*) _IO_wfile_setbuf(this,__b, __len); }
+ 
+    int 
+   __basic_file::sync()
+   { return _IO_wfile_sync(this); }
+ 
+   int 
+   __basic_file::doallocate() 
+   { return _IO_wfile_doallocate(this); }
+ #endif
+ 
+   // Need to instantiate base class here for type-info bits, etc
+   template struct __basic_file_base;
+   template class __basic_file;
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template struct __basic_file_base;
+   template class __basic_file;
+ #endif
+ }  // namespace std
+ 
+ 
+ 
+ 
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/basic_file_libio.h gcc-3.1/libstdc++-v3/config/io/basic_file_libio.h
*** gcc-3.0.4/libstdc++-v3/config/io/basic_file_libio.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/basic_file_libio.h	Tue Feb 12 04:35:54 2002
***************
*** 0 ****
--- 1,498 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ /** @file basic_file.h
+  *  This is an internal header file, included by other library headers.
+  *  You should not attempt to use it directly.
+  */
+ 
+ #ifndef _CPP_BASIC_FILE
+ #define _CPP_BASIC_FILE 1
+ 
+ #pragma GCC system_header
+ 
+ #include 
+ #include 
+ #include 
+ 
+ namespace std 
+ {
+   // Ulrich is going to make some detailed comment here, explaining
+   // all this unpleasantness, providing detailed performance analysis
+   // as to why we have to do all this lame vtable hacking instead of a
+   // sane, function-based approach. This verbiage will provide a clear
+   // and detailed description of the whole object-layout,
+   // vtable-swapping, sordid history of this hack.
+   template
+     struct __basic_file_base: public __c_file_type
+     {
+       virtual 
+       ~__basic_file_base() { };
+ 
+       virtual int 
+       overflow(int __c = EOF) = 0;
+ 
+       virtual int 
+       underflow() = 0;
+ 
+       virtual int 
+       uflow() = 0;
+ 
+       virtual int 
+       pbackfail(int __c) = 0;
+ 
+       virtual streamsize 
+       xsputn(const _CharT* __s, streamsize __n) = 0;
+ 
+       virtual streamsize 
+       xsgetn(_CharT* __s, streamsize __n) = 0;
+ 
+       virtual streamoff
+       seekoff(streamoff __off, ios_base::seekdir __way,
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
+ 
+       virtual streamoff
+       seekpos(streamoff __pos, 
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out) = 0;
+ 
+       virtual streambuf* 
+       setbuf(_CharT* __b, int __len) = 0;
+ 
+       virtual int 
+       sync() = 0;
+ 
+       virtual int 
+       doallocate() = 0;
+ 
+       virtual streamsize 
+       sys_read(_CharT* __s, streamsize __n) = 0;
+ 
+       virtual streamsize 
+       sys_write(const _CharT* __s, streamsize __n) = 0;
+ 
+       virtual streamoff
+       sys_seek(streamoff __off, ios_base::seekdir __way) = 0;
+ 
+       virtual int 
+       sys_close() = 0;
+ 
+       virtual int 
+       sys_stat(void* __v) = 0;
+ 
+       virtual int 
+       showmanyc() = 0;
+ 
+       virtual void 
+       imbue(void* __v) = 0;
+     };
+ 
+   // Some of these member functions are based on libio/filebuf.cc.
+   // Also note that the order and number of virtual functions has to precisely
+   // match the order and number in the _IO_jump_t struct defined in libioP.h.
+   template
+     class __basic_file: public __basic_file_base<_CharT>
+     {
+ # ifdef _GLIBCPP_USE_WCHAR_T
+       __c_wfile_type	_M_wfile;
+ # endif
+ 
+     public:
+       __basic_file(__c_lock* __lock = 0);
+       
+       void 
+       _M_open_mode(ios_base::openmode __mode, int& __p_mode, int& __rw_mode, 
+ 		   char* __c_mode);
+       
+       // Equivalent to the normal fopen function.
+       __basic_file* 
+       open(const char* __name, ios_base::openmode __mode, int __prot = 0664);
+ 
+       // Used for opening the standard streams, cin, cout, cerr, clog,
+       // and their wide-stream equivalents. Instead of calling open, it
+       // just sets
+       //  - for libio:  __c_file_type->_fileno and the respective _flags bits
+       //  - for stdio:  _M_cfile = __file and some internal flags
+       // and returns.
+       __basic_file*
+       sys_open(__c_file_type* __file, ios_base::openmode __mode);
+ 
+       _CharT
+       sys_getc();
+ 
+       _CharT
+       sys_ungetc(_CharT);
+ 
+       __basic_file* 
+       close(); 
+ 
+       bool 
+       is_open();
+ 
+       int 
+       fd();
+ 
+       // NB: Must match FILE specific jump table starting here--this
+       // means all virtual functions starting with the dtor must match,
+       // slot by slot. For glibc-based dystems, this means the _IO_FILE
+       // as the FILE struct and _IO_jump_t as the jump table.
+       virtual 
+       ~__basic_file(); // Takes the place of __finish.
+ 
+       virtual int 
+       overflow(int __c = EOF);
+ 
+       virtual int 
+       underflow();
+ 
+       virtual int 
+       uflow();
+ 
+       virtual int 
+       pbackfail(int __c);
+ 
+       // A complex "write" function that sets all of __c_file_type's
+       // pointers and associated data members correctly and manages its
+       // relation to the external byte sequence.
+       virtual streamsize 
+       xsputn(const _CharT* __s, streamsize __n);
+ 
+       // A complex "read" function that sets all of __c_file_type's
+       // pointers and associated data members correctly and manages its
+       // relation to the external byte sequence.
+       virtual streamsize 
+       xsgetn(_CharT* __s, streamsize __n);
+ 
+       // A complex "seekoff" function that sets all of __c_file_type's
+       // pointers and associated data members correctly and manages its
+       // relation to the external byte sequence.
+       virtual streamoff
+       seekoff(streamoff __off, ios_base::seekdir __way,
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
+ 
+       // A complex "seekpos" function that sets all of __c_file_type's
+       // pointers and associated data members correctly and manages its
+       // relation to the external byte sequence.
+       virtual streamoff
+       seekpos(streamoff __pos, 
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
+ 
+       virtual streambuf* 
+       setbuf(_CharT* __b, int __len);
+ 
+       virtual int 
+       sync();
+ 
+       virtual int 
+       doallocate();
+ 
+       // A simple read function for the external byte sequence, that
+       // does no mucking around with or setting of the pointers or flags
+       // in __c_file_type.
+       virtual streamsize 
+       sys_read(_CharT* __s, streamsize __n);
+ 
+       // A simple write function for the external byte sequence, that
+       // does no mucking around with or setting of the pointers or flags
+       // in __c_file_type.
+       virtual streamsize 
+       sys_write(const _CharT* __s, streamsize __n);
+ 
+       // A simple seek function for the external byte sequence, that
+       // does no mucking around with or setting of the pointers or flags
+       // in __c_file_type.
+       virtual streamoff
+       sys_seek(streamoff __off, ios_base::seekdir __way);
+ 
+       virtual int 
+       sys_close();
+ 
+       virtual int 
+       sys_stat(void* __v);
+ 
+       virtual int 
+       showmanyc();
+ 
+       virtual void 
+       imbue(void* __v);
+     };
+ 
+   // __basic_file specializations
+   template<>
+     __basic_file::__basic_file(__c_lock* __lock);
+ 
+   template<>
+     int 
+     __basic_file::overflow(int __c);
+ 
+   template<>
+     int 
+     __basic_file::underflow();
+ 
+   template<>
+     int 
+     __basic_file::uflow();
+ 
+   template<>
+     int 
+     __basic_file::pbackfail(int __c);
+ 
+   template<>
+     streamsize 
+     __basic_file::xsputn(const char* __s, streamsize __n);
+ 
+   template<>
+     streamoff
+     __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				ios_base::openmode __mode);
+ 
+   template<>
+     streamoff
+     __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode);
+ 
+   template<>
+     streambuf* 
+     __basic_file::setbuf(char* __b, int __len);
+ 
+   template<>
+     int 
+     __basic_file::sync();
+ 
+   template<>
+     int 
+     __basic_file::doallocate();
+ 
+   // __basic_file specializations
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     __basic_file::__basic_file(__c_lock* __lock);
+ 
+   template<>
+     int 
+     __basic_file::overflow(int __c);
+ 
+   template<>
+     int 
+     __basic_file::underflow();
+ 
+   template<>
+     int 
+     __basic_file::uflow();
+ 
+   template<>
+     int 
+     __basic_file::pbackfail(int __c);
+ 
+   template<>
+     streamsize 
+     __basic_file::xsputn(const wchar_t* __s, streamsize __n);
+ 
+   template<>
+     streamoff
+     __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 				ios_base::openmode __mode);
+ 
+   template<>
+     streamoff
+     __basic_file::seekpos(streamoff __pos, ios_base::openmode __mode);
+ 
+   template<>
+     streambuf* 
+     __basic_file::setbuf(wchar_t* __b, int __len);
+ 
+   template<>
+     int 
+     __basic_file::sync();
+ 
+   template<>
+     int 
+     __basic_file::doallocate();
+ #endif
+ 
+   template
+     __basic_file<_CharT>::~__basic_file()
+     { _IO_file_finish(this, 0); }
+       
+   template
+     void 
+     __basic_file<_CharT>::_M_open_mode(ios_base::openmode __mode, 
+ 				       int& __p_mode, int& __rw_mode, 
+ 				       char* /*__c_mode*/)
+     {  
+ #ifdef O_BINARY
+       bool __testb = __mode & ios_base::binary;
+ #endif
+       bool __testi = __mode & ios_base::in;
+       bool __testo = __mode & ios_base::out;
+       bool __testt = __mode & ios_base::trunc;
+       bool __testa = __mode & ios_base::app;
+       
+       if (!__testi && __testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS;
+ 	}
+       if (!__testi && __testo && !__testt && __testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_APPEND | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS | _IO_IS_APPENDING;
+ 	}
+       if (!__testi && __testo && __testt && !__testa)
+ 	{
+ 	  __p_mode = O_WRONLY | O_TRUNC | O_CREAT;
+ 	  __rw_mode = _IO_NO_READS;
+ 	}
+       if (__testi && !__testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDONLY;
+ 	  __rw_mode = _IO_NO_WRITES;
+ 	}
+       if (__testi && __testo && !__testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDWR;
+ 	  __rw_mode = 0;
+ 	}
+       if (__testi && __testo && __testt && !__testa)
+ 	{
+ 	  __p_mode = O_RDWR | O_TRUNC | O_CREAT;
+ 	  __rw_mode = 0;
+ 	}
+ #ifdef O_BINARY
+       if (__testb)
+ 	__p_mode |= O_BINARY;
+ #endif	   
+     }
+   
+   template
+     __basic_file<_CharT>*
+     __basic_file<_CharT>::sys_open(__c_file_type* __f, 
+ 				   ios_base::openmode __mode) 
+     {
+       __basic_file* __ret = NULL;
+       int __fd = fileno(__f);
+       int __p_mode = 0;
+       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+       char __c_mode[4];
+       
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+ 
+       if (!_IO_file_is_open(this))
+ 	{
+ 	  _fileno = __fd;
+ 	  _flags &= ~(_IO_NO_READS + _IO_NO_WRITES);
+ 	  _flags |= _IO_DELETE_DONT_CLOSE;
+ 	  _offset = _IO_pos_BAD;
+ 	  int __mask = _IO_NO_READS + _IO_NO_WRITES + _IO_IS_APPENDING;
+ 	  _IO_mask_flags(this, __rw_mode, __mask);
+ 	}
+ 
+       return __ret;
+     }
+   
+   template
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::open(const char* __name, ios_base::openmode __mode, 
+ 			       int __prot)
+     {
+       __basic_file* __ret = NULL;
+       int __p_mode = 0;
+       int __rw_mode = _IO_NO_READS + _IO_NO_WRITES; 
+       char __c_mode[4];
+ 
+       _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+       if (!_IO_file_is_open(this))
+ 	{
+ 	  __c_file_type* __f;
+ 	  __f = _IO_file_open(this, __name, __p_mode, __prot, __rw_mode, 0);
+ 	  __ret = __f ? this: NULL;
+ 	}
+       return __ret;
+     }
+   
+   template
+     bool 
+     __basic_file<_CharT>::is_open() { return _fileno >= 0; }
+   
+   template
+     __basic_file<_CharT>* 
+     __basic_file<_CharT>::close()
+     { 
+       return _IO_file_close_it(this) ? static_cast<__basic_file*>(NULL) : this;
+     }
+  
+   template
+     streamsize 
+     __basic_file<_CharT>::xsgetn(_CharT* __s, streamsize __n)
+     { return _IO_file_xsgetn(this, __s, __n); }
+ 
+   // NB: Unused.
+   template
+     streamsize 
+     __basic_file<_CharT>::sys_read(_CharT* __s, streamsize __n) 
+     { return _IO_file_read(this, __s, __n); }
+ 
+   // NB: Unused.    
+   template
+     streamsize 
+     __basic_file<_CharT>::sys_write(const _CharT* __s, streamsize __n) 
+     { return _IO_file_write(this, __s, __n); }
+ 
+   // NB: Unused.
+   template
+     streamoff
+     __basic_file<_CharT>::sys_seek(streamoff __pos, ios_base::seekdir __way)
+     { return _IO_file_seek(this, __pos, __way); }
+   
+   // NB: Unused.
+   template
+     int 
+     __basic_file<_CharT>::sys_close() 
+     { return _IO_file_close(this); }
+ 
+   // NB: Unused.
+   template
+     int 
+     __basic_file<_CharT>::sys_stat(void* __v) 
+     { return _IO_file_stat(this, __v); }
+ 
+   // NB: Unused.
+   template
+     int 
+     __basic_file<_CharT>::showmanyc() { return EOF; }
+ 
+   // NB: Unused.
+   template
+     void 
+     __basic_file<_CharT>::imbue(void* /*__v*/) { }
+ }  // namespace std
+ 
+ #endif	// _CPP_BASIC_FILE
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/basic_file_stdio.cc gcc-3.1/libstdc++-v3/config/io/basic_file_stdio.cc
*** gcc-3.0.4/libstdc++-v3/config/io/basic_file_stdio.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/basic_file_stdio.cc	Tue Apr 30 19:05:41 2002
***************
*** 0 ****
--- 1,187 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ #include 
+ 
+ namespace std 
+ {
+   // Definitions for __basic_file.
+   __basic_file::__basic_file(__c_lock* /*__lock*/) 
+   : _M_cfile(NULL), _M_cfile_created(false) { }
+ 
+   __basic_file::~__basic_file()
+   { this->close(); }
+       
+   void 
+   __basic_file::_M_open_mode(ios_base::openmode __mode, int&, int&, 
+ 				   char* __c_mode)
+   {  
+     bool __testb = __mode & ios_base::binary;
+     bool __testi = __mode & ios_base::in;
+     bool __testo = __mode & ios_base::out;
+     bool __testt = __mode & ios_base::trunc;
+     bool __testa = __mode & ios_base::app;
+       
+     if (!__testi && __testo && !__testt && !__testa)
+       strcpy(__c_mode, "w");
+     if (!__testi && __testo && !__testt && __testa)
+       strcpy(__c_mode, "a");
+     if (!__testi && __testo && __testt && !__testa)
+       strcpy(__c_mode, "w");
+     if (__testi && !__testo && !__testt && !__testa)
+       strcpy(__c_mode, "r");
+     if (__testi && __testo && !__testt && !__testa)
+       strcpy(__c_mode, "r+");
+     if (__testi && __testo && __testt && !__testa)
+       strcpy(__c_mode, "w+");
+     if (__testb)
+       strcat(__c_mode, "b");
+   }
+   
+   __basic_file*
+   __basic_file::sys_open(__c_file* __file, ios_base::openmode) 
+   {
+     __basic_file* __ret = NULL;
+     if (!this->is_open() && __file)
+       {
+  	_M_cfile = __file;
+  	_M_cfile_created = false;
+   	__ret = this;
+       }
+     return __ret;
+   }
+   
+   __basic_file*
+   __basic_file::sys_open(int __fd, ios_base::openmode __mode, 
+ 			       bool __del) 
+   {
+     __basic_file* __ret = NULL;
+     int __p_mode = 0;
+     int __rw_mode = 0;
+     char __c_mode[4];
+     
+     _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+     if (!this->is_open() && (_M_cfile = fdopen(__fd, __c_mode)))
+       {
+ 	// Iff __del is true, then close will fclose the fd.
+ 	_M_cfile_created = __del;
+ 
+ 	if (__fd == 0)
+ 	  setvbuf(_M_cfile, reinterpret_cast(NULL), _IONBF, 0);
+ 
+ 	__ret = this;
+       }
+     return __ret;
+   }
+ 
+   int
+   __basic_file::sys_getc() 
+   { return getc(_M_cfile); }
+ 
+   int
+   __basic_file::sys_ungetc(int __c) 
+   { return ungetc(__c, _M_cfile); }
+   
+   __basic_file* 
+   __basic_file::open(const char* __name, ios_base::openmode __mode, 
+ 			   int /*__prot*/)
+   {
+     __basic_file* __ret = NULL;
+     int __p_mode = 0;
+     int __rw_mode = 0;
+     char __c_mode[4];
+       
+     _M_open_mode(__mode, __p_mode, __rw_mode, __c_mode);
+ 
+     if (!this->is_open())
+       {
+ 	if ((_M_cfile = fopen(__name, __c_mode)))
+ 	  {
+ 	    _M_cfile_created = true;
+ 	    __ret = this;
+ 	  }
+       }
+     return __ret;
+   }
+   
+   bool 
+   __basic_file::is_open() const 
+   { return _M_cfile != 0; }
+   
+   int 
+   __basic_file::fd() 
+   { return fileno(_M_cfile) ; }
+   
+   __basic_file* 
+   __basic_file::close()
+   { 
+     __basic_file* __retval = static_cast<__basic_file*>(NULL);
+     if (this->is_open())
+       {
+ 	fflush(_M_cfile);
+ 	if ((_M_cfile_created && fclose(_M_cfile) == 0) || !_M_cfile_created)
+ 	  {
+ 	    _M_cfile = 0;
+ 	    __retval = this;
+ 	  }
+       }
+     return __retval;
+   }
+  
+   streamsize 
+   __basic_file::xsgetn(char* __s, streamsize __n)
+   { return fread(__s, 1, __n, _M_cfile); }
+   
+   streamsize 
+   __basic_file::xsputn(const char* __s, streamsize __n)
+   { return fwrite(__s, 1, __n, _M_cfile); }
+   
+   streamoff
+   __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, 
+ 			      ios_base::openmode /*__mode*/)
+   { 
+     fseek(_M_cfile, __off, __way); 
+     return ftell(_M_cfile); 
+   }
+ 
+   streamoff
+   __basic_file::seekpos(streamoff __pos, ios_base::openmode /*__mode*/)
+   { 
+     fseek(_M_cfile, __pos, ios_base::beg); 
+     return ftell(_M_cfile); 
+   }
+   
+   int 
+   __basic_file::sync() 
+   { return fflush(_M_cfile); }
+ }  // namespace std
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/basic_file_stdio.h gcc-3.1/libstdc++-v3/config/io/basic_file_stdio.h
*** gcc-3.0.4/libstdc++-v3/config/io/basic_file_stdio.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/basic_file_stdio.h	Tue Apr 30 19:05:42 2002
***************
*** 0 ****
--- 1,114 ----
+ // Wrapper of C-language FILE struct -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 27.8  File-based streams
+ //
+ 
+ /** @file basic_file.h
+  *  This is an internal header file, included by other library headers.
+  *  You should not attempt to use it directly.
+  */
+ 
+ #ifndef _CPP_BASIC_FILE
+ #define _CPP_BASIC_FILE 1
+ 
+ #pragma GCC system_header
+ 
+ #include 
+ #include 
+ 
+ namespace std 
+ {
+   // Generic declaration.
+   template
+     class __basic_file; 
+ 
+   // Specialization.
+   template<>
+     class __basic_file
+     {
+       // Underlying data source/sink.
+       __c_file* 	_M_cfile;
+       // True iff we opened _M_cfile, and thus must close it ourselves.
+       bool 		_M_cfile_created;
+ 
+     public:
+       __basic_file(__c_lock* __lock = 0);
+       
+       void 
+       _M_open_mode(ios_base::openmode __mode, int& __p_mode, int& __rw_mode, 
+ 		   char* __c_mode);
+       
+       __basic_file* 
+       open(const char* __name, ios_base::openmode __mode, int __prot = 0664);
+ 
+       __basic_file*
+       sys_open(__c_file* __file, ios_base::openmode);
+ 
+       __basic_file*
+       sys_open(int __fd, ios_base::openmode __mode, bool __del);
+ 
+       int
+       sys_getc();
+ 
+       int
+       sys_ungetc(int);
+ 
+       __basic_file* 
+       close(); 
+ 
+       bool 
+       is_open() const;
+ 
+       int 
+       fd();
+ 
+       ~__basic_file();
+ 
+       streamsize 
+       xsputn(const char* __s, streamsize __n);
+ 
+       streamsize 
+       xsgetn(char* __s, streamsize __n);
+ 
+       streamoff
+       seekoff(streamoff __off, ios_base::seekdir __way,
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
+ 
+       streamoff
+       seekpos(streamoff __pos, 
+ 	      ios_base::openmode __mode = ios_base::in | ios_base::out);
+ 
+       int 
+       sync();
+     };
+ }  // namespace std
+ 
+ #endif	// _CPP_BASIC_FILE
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/c_io_libio.h gcc-3.1/libstdc++-v3/config/io/c_io_libio.h
*** gcc-3.0.4/libstdc++-v3/config/io/c_io_libio.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/c_io_libio.h	Tue Feb 12 04:35:54 2002
***************
*** 0 ****
--- 1,113 ----
+ // underlying io library  -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ // c_io_libio.h - Defines for using the GNU libio
+ 
+ #ifndef _CPP_IO_LIBIO_H
+ #define _CPP_IO_LIBIO_H 1
+ 
+ #include 
+ 
+ namespace std 
+ {
+ // from fpos.h
+   typedef _IO_ssize_t 	streamsize; // Signed integral type
+   typedef _IO_ssize_t 	wstreamsize;
+ 
+ #if defined(_G_IO_IO_FILE_VERSION) && _G_IO_IO_FILE_VERSION == 0x20001
+   typedef _IO_off64_t 	streamoff;
+   typedef _IO_fpos64_t 	__c_streampos;
+ #else
+   typedef _IO_off_t 	streamoff;
+   typedef _IO_fpos_t 	__c_streampos;
+ #endif
+ 
+ #ifdef _GLIBCPP_USE_THREADS
+   typedef _IO_lock_t   __c_lock;
+ #else
+   typedef int          __c_lock;
+ #endif
+ 
+ // from basic_file.h
+   typedef _IO_FILE 	__c_file_type;
+   typedef _IO_wide_data __c_wfile_type;
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   extern "C" _IO_codecvt __c_libio_codecvt;
+ #endif 
+ 
+ // from ios_base.h
+   struct __ios_flags
+   {
+     typedef short __int_type;
+ 
+     static const __int_type _S_boolalpha =	_IO_BAD_SEEN;
+     static const __int_type _S_dec =		_IO_DEC;
+     static const __int_type _S_fixed = 		_IO_FIXED;
+     static const __int_type _S_hex =		_IO_HEX;
+     static const __int_type _S_internal = 	_IO_INTERNAL;
+     static const __int_type _S_left =          	_IO_LEFT;
+     static const __int_type _S_oct =		_IO_OCT;
+     static const __int_type _S_right =		_IO_RIGHT;
+     static const __int_type _S_scientific =	_IO_SCIENTIFIC;
+     static const __int_type _S_showbase =      	_IO_SHOWBASE;
+     static const __int_type _S_showpoint =	_IO_SHOWPOINT;
+     static const __int_type _S_showpos =       	_IO_SHOWPOS;
+     static const __int_type _S_skipws =		_IO_SKIPWS;
+     static const __int_type _S_unitbuf =       	_IO_UNITBUF;
+     static const __int_type _S_uppercase =	_IO_UPPERCASE;
+     static const __int_type _S_adjustfield =	_IO_LEFT | _IO_RIGHT
+     						| _IO_INTERNAL;
+     static const __int_type _S_basefield =	_IO_DEC | _IO_OCT | _IO_HEX;
+     static const __int_type _S_floatfield =	_IO_SCIENTIFIC | _IO_FIXED;
+ 
+     // 27.4.2.1.3  Type ios_base::iostate
+     static const __int_type _S_badbit =		_IO_BAD_SEEN;
+     static const __int_type _S_eofbit =		_IO_EOF_SEEN;
+     static const __int_type _S_failbit =       	_IO_ERR_SEEN;
+ 
+     // 27.4.2.1.4  Type openmode
+     static const __int_type _S_app =		_IOS_APPEND;
+     static const __int_type _S_ate =		_IOS_ATEND;
+     static const __int_type _S_bin =		_IOS_BIN;
+     static const __int_type _S_in =		_IOS_INPUT;
+     static const __int_type _S_out =		_IOS_OUTPUT;
+     static const __int_type _S_trunc =		_IOS_TRUNC;
+   };
+ }
+ 
+ #endif // _CPP_IO_LIBIO_H
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/c_io_libio_codecvt.c gcc-3.1/libstdc++-v3/config/io/c_io_libio_codecvt.c
*** gcc-3.0.4/libstdc++-v3/config/io/c_io_libio_codecvt.c	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/c_io_libio_codecvt.c	Wed Aug  8 02:48:58 2001
***************
*** 0 ****
--- 1,153 ----
+ /* Copyright (C) 2000 Free Software Foundation, Inc.
+    This file is part of the GNU IO Library.
+ 
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2, or (at
+    your option) any later version.
+ 
+    This library 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 this library; see the file COPYING.  If not, write to
+    the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
+    MA 02111-1307, USA.
+ 
+    As a special exception, if you link this library with files
+    compiled with a GNU compiler to produce an executable, this does
+    not cause the resulting executable to be covered by the GNU General
+    Public License.  This exception does not however invalidate any
+    other reasons why the executable file might be covered by the GNU
+    General Public License.  */
+ 
+ /* Slightly modified from glibc/libio/iofwide.c */
+ 
+ #include 
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+ 
+ /* Prototypes of libio's codecvt functions.  */
+ static enum __codecvt_result 
+ do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
+        const wchar_t *from_start, const wchar_t *from_end,
+        const wchar_t **from_stop, char *to_start, char *to_end, 
+        char **to_stop);
+ 
+ static enum __codecvt_result 
+ do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, char *to_start, 
+ 	   char *to_end, char **to_stop);
+ 
+ static enum __codecvt_result 
+ do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, 
+       const char *from_start, const char *from_end, const char **from_stop, 
+       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop);
+ 
+ static int 
+ do_encoding(struct _IO_codecvt *codecvt);
+ 
+ static int 
+ do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep, 
+ 	  const char *from_start, const char *from_end, _IO_size_t max);
+ 
+ static int 
+ do_max_length(struct _IO_codecvt *codecvt);
+ 
+ static int 
+ do_always_noconv(struct _IO_codecvt *codecvt);
+ 
+ 
+ /* The functions used in `codecvt' for libio are always the same.  */
+ struct _IO_codecvt __c_libio_codecvt =
+ {
+   .__codecvt_destr = NULL,		/* Destructor, never used.  */
+   .__codecvt_do_out = do_out,
+   .__codecvt_do_unshift = do_unshift,
+   .__codecvt_do_in = do_in,
+   .__codecvt_do_encoding = do_encoding,
+   .__codecvt_do_always_noconv = do_always_noconv,
+   .__codecvt_do_length = do_length,
+   .__codecvt_do_max_length = do_max_length
+ };
+ 
+ static enum __codecvt_result
+ do_out(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
+        const wchar_t *from_start, const wchar_t *from_end,
+        const wchar_t **from_stop, char *to_start, char *to_end,
+        char **to_stop)
+ {
+   enum __codecvt_result res = __codecvt_ok;
+ 
+   while (from_start < from_end)
+     {
+       if (to_start >= to_end)
+ 	{
+ 	  res = __codecvt_partial;
+ 	  break;
+ 	}
+       *to_start++ = (char) *from_start++;
+     }
+ 
+   *from_stop = from_start;
+   *to_stop = to_start;
+ 
+   return res;
+ }
+ 
+ 
+ static enum __codecvt_result
+ do_unshift(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
+ 	   char *to_start, char *to_end, char **to_stop)
+ {
+   *to_stop = to_start;
+   return __codecvt_ok;
+ }
+ 
+ 
+ static enum __codecvt_result
+ do_in(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
+       const char *from_start, const char *from_end, const char **from_stop,
+       wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop)
+ {
+   enum __codecvt_result res = __codecvt_ok;
+ 
+   while (from_start < from_end)
+     {
+       if (to_start >= to_end)
+ 	{
+ 	  res = __codecvt_partial;
+ 	  break;
+ 	}
+       *to_start++ = (wchar_t) *from_start++;
+     }
+ 
+   *from_stop = from_start;
+   *to_stop = to_start;
+ 
+   return res;
+ }
+ 
+ 
+ static int
+ do_encoding(struct _IO_codecvt *codecvt)
+ { return 1; }
+ 
+ 
+ static int
+ do_always_noconv(struct _IO_codecvt *codecvt)
+ { return 0; }
+ 
+ 
+ static int
+ do_length(struct _IO_codecvt *codecvt, __c_mbstate_t *statep,
+ 	  const char *from_start, const char *from_end, _IO_size_t max)
+ { return from_end - from_start; }
+ 
+ 
+ static int
+ do_max_length(struct _IO_codecvt *codecvt)
+ { return 1; }
+ 
+ #endif /* _GLIBCPP_USE_WCHAR_T */
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/io/c_io_stdio.h gcc-3.1/libstdc++-v3/config/io/c_io_stdio.h
*** gcc-3.0.4/libstdc++-v3/config/io/c_io_stdio.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/io/c_io_stdio.h	Fri Apr 19 07:58:59 2002
***************
*** 0 ****
--- 1,93 ----
+ // underlying io library  -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ // c_io_stdio.h - Defines for using "C" stdio.h
+ 
+ #ifndef _CPP_IO_STDIO_H
+ #define _CPP_IO_STDIO_H 1
+ 
+ #include 
+ #include 
+ #include 
+ 
+ namespace std 
+ {
+ // for fpos.h
+   typedef long  	streamoff;
+   typedef ptrdiff_t	streamsize; // Signed integral type
+ #if _GLIBCPP_USE_WCHAR_T
+   typedef ptrdiff_t	wstreamsize;
+ #endif
+   typedef fpos_t  	__c_streampos;
+ 
+   typedef __gthread_mutex_t __c_lock;
+ 
+ // for basic_file.h
+   typedef FILE __c_file;
+ 
+ // for ios_base.h
+   struct __ios_flags
+   {
+     typedef short __int_type;
+ 
+     static const __int_type _S_boolalpha =	0x0001;
+     static const __int_type _S_dec =		0x0002;
+     static const __int_type _S_fixed = 		0x0004;
+     static const __int_type _S_hex =		0x0008;
+     static const __int_type _S_internal = 	0x0010;
+     static const __int_type _S_left =   	0x0020;
+     static const __int_type _S_oct =		0x0040;
+     static const __int_type _S_right =		0x0080;
+     static const __int_type _S_scientific =	0x0100;
+     static const __int_type _S_showbase =       0x0200;
+     static const __int_type _S_showpoint =	0x0400;
+     static const __int_type _S_showpos =	0x0800;
+     static const __int_type _S_skipws =		0x1000;
+     static const __int_type _S_unitbuf =	0x2000;
+     static const __int_type _S_uppercase =	0x4000;
+     static const __int_type _S_adjustfield =	0x0020 | 0x0080 | 0x0010;
+     static const __int_type _S_basefield =	0x0002 | 0x0040 | 0x0008;
+     static const __int_type _S_floatfield =	0x0100 | 0x0004;
+ 
+     // 27.4.2.1.3  Type ios_base::iostate
+     static const __int_type _S_badbit =		0x01;
+     static const __int_type _S_eofbit =		0x02;
+     static const __int_type _S_failbit =       	0x04;
+ 
+     // 27.4.2.1.4  Type openmode
+     static const __int_type _S_app =		0x01;
+     static const __int_type _S_ate =		0x02;
+     static const __int_type _S_bin =		0x04;
+     static const __int_type _S_in =		0x08;
+     static const __int_type _S_out =		0x10;
+     static const __int_type _S_trunc =		0x20;
+   };
+ }
+ 
+ #endif // _CPP_IO_STDIO_H
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/linker-map.dummy gcc-3.1/libstdc++-v3/config/linker-map.dummy
*** gcc-3.0.4/libstdc++-v3/config/linker-map.dummy	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/linker-map.dummy	Wed Feb 20 22:10:39 2002
***************
*** 0 ****
--- 1,7 ----
+ # 
+ # This is a placeholder file.  It does nothing and is not used.
+ # 
+ # If you are seeing this file as your linker script (named linker.map), then
+ # either 1) the configuration process determined that symbol versioning should
+ # not be done, or 2) you specifically turned it off.
+ # 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/linker-map.gnu gcc-3.1/libstdc++-v3/config/linker-map.gnu
*** gcc-3.0.4/libstdc++-v3/config/linker-map.gnu	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/linker-map.gnu	Fri Apr 19 08:28:13 2002
***************
*** 0 ****
--- 1,113 ----
+ ## Linker script for GNU ld 2.11.94+ only.
+ ##
+ ## Copyright (C) 2002 Free Software Foundation, Inc.
+ ##
+ ## This file is part of the libstdc++ version 3 distribution.
+ ##
+ ## This file is part of the GNU ISO C++ Library.  This library is free
+ ## software; you can redistribute it and/or modify it under the
+ ## terms of the GNU General Public License as published by the
+ ## Free Software Foundation; either version 2, or (at your option)
+ ## any later version.
+ ##
+ ## This library 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 this library; see the file COPYING.  If not, write to the Free
+ ## Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ ## USA.
+ 
+ 
+ GLIBCPP_3.1 {
+ 
+   global:
+ 
+     # Names inside the 'extern' block are demangled names.
+     # All but the last are terminated with a semicolon.
+     extern "C++"
+     {
+       std::[A-Za-z]*;
+       std::__throw_*;
+       std::__basic_file*;
+       std::__num_base*;
+       std::__timepunct*;
+       std::__numeric_limits_base*;
+       std::_S_bit_count;
+       std::_S_first_one;
+       std::__default_alloc_template*;
+       std::__malloc_alloc_template*
+     };
+ 
+     # Names not in an 'extern' block are mangled names.
+     _ZSt9has_facet*;
+ 
+     # operator new(unsigned)
+     _Znwj;
+     # operator new(unsigned, std::nothrow_t const&)
+     _ZnwjRKSt9nothrow_t;
+     # operator new(unsigned long)
+     _Znwm;
+     # operator new(unsigned long, std::nothrow_t const&)
+     _ZnwmRKSt9nothrow_t;
+ 
+     # operator delete(void*)
+     _ZdlPv;
+     # operator delete(void*, std::nothrow_t const&)
+     _ZdlPvRKSt9nothrow_t;
+ 
+     # operator new[](unsigned)
+     _Znaj;
+     # operator new[](unsigned, std::nothrow_t const&)
+     _ZnajRKSt9nothrow_t;
+     # operator new[](unsigned long)
+     _Znam;
+     # operator new[](unsigned long, std::nothrow_t const&)
+     _ZnamRKSt9nothrow_t;
+ 
+     # operator delete[](void*)
+     _ZdaPv;
+     # operator delete[](void*, std::nothrow_t const&)
+     _ZdaPvRKSt9nothrow_t;
+ 
+     # vtable	
+     _ZTV*;  
+     _ZTT*;
+ 
+     # typeinfo
+     _ZTI*;
+     _ZTS*;
+ 
+     # function-scope static objects requires a guard variable.
+     _ZGV*;
+ 
+     # virtual function thunks
+     _ZTh*;
+     _ZTv*;
+     _ZTc*;
+ 
+     # std::__convert_to_v
+     _ZSt14__convert_to_v*;
+ 
+   local:
+     *;
+ };
+ 
+ 
+ # Symbols in the support library (libsupc++) have their own tag.
+ CXXABI_1 {
+ 
+   global:
+     __cxa_*;
+     __gxx_personality_v0;
+     __gxx_personality_sj0;
+     __dynamic_cast;
+ 
+     # __gnu_cxx::_verbose_terminate_handler()
+     _ZN9__gnu_cxx27__verbose_terminate_handlerEv;
+ 
+   local:
+     *;
+ };
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/c_locale.cc gcc-3.1/libstdc++-v3/config/locale/generic/c_locale.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/c_locale.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/c_locale.cc	Fri Apr 19 07:59:01 2002
***************
*** 0 ****
--- 1,220 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ #ifdef _GLIBCPP_HAVE_IEEEFP_H
+ #include 
+ #endif
+ 
+ namespace std 
+ {
+   // Specializations for all types used in num_get.
+   template<>
+     void
+     __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, 
+ 		   const __c_locale&, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+       {
+ 	char* __sanity;
+ 	errno = 0;
+ 	long __l = strtol(__s, &__sanity, __base);
+ 	if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	  __v = __l;
+ 	else
+ 	  __err |= ios_base::failbit;
+       }
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, unsigned long& __v, 
+ 		   ios_base::iostate& __err, const __c_locale&, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  unsigned long __ul = strtoul(__s, &__sanity, __base);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ul;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+ #ifdef _GLIBCPP_USE_LONG_LONG
+   template<>
+     void
+     __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, 
+ 		   const __c_locale&, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  long long __ll = strtoll(__s, &__sanity, __base);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ll;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, unsigned long long& __v, 
+ 		   ios_base::iostate& __err, const __c_locale&, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{      
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  unsigned long long __ull = strtoull(__s, &__sanity, __base);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ull;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}  
+     }
+ #endif
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
+ 		   const __c_locale&, int) 	      
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  // Assumes __s formatted for "C" locale.
+ 	  const char* __old = setlocale(LC_ALL, "C");
+ 	  char* __sanity;
+ 	  errno = 0;
+ #if defined(_GLIBCPP_USE_C99)
+ 	  float __f = strtof(__s, &__sanity);
+ #else
+ 	  double __d = strtod(__s, &__sanity);
+ 	  float __f = static_cast(__d);
+ #ifdef _GLIBCPP_HAVE_FINITEF
+ 	  if (!finitef (__f))
+ 	    errno = ERANGE;
+ #elif defined (_GLIBCPP_HAVE_FINITE)
+ 	  if (!finite (static_cast (__f)))
+ 	    errno = ERANGE;
+ #elif defined (_GLIBCPP_HAVE_ISINF)
+ 	  if (isinf (static_cast (__f)))
+ 	    errno = ERANGE;
+ #else
+ 	  if (fabs(__d) > numeric_limits::max())
+ 	    errno = ERANGE;
+ #endif
+ #endif
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __f;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	  setlocale(LC_ALL, __old);
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
+ 		   const __c_locale&, int) 
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  // Assumes __s formatted for "C" locale.
+ 	  const char* __old = setlocale(LC_ALL, "C");
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  double __d = strtod(__s, &__sanity);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __d;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	  setlocale(LC_ALL, __old);
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, long double& __v, 
+ 		   ios_base::iostate& __err, const __c_locale&, int) 
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  // Assumes __s formatted for "C" locale.
+ 	  const char* __old = setlocale(LC_ALL, "C");
+ #if defined(_GLIBCPP_USE_C99)
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  long double __ld = strtold(__s, &__sanity);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ld;
+ #else
+ 	  typedef char_traits::int_type int_type;
+ 	  long double __ld;
+ 	  errno = 0;
+ 	  int __p = sscanf(__s, "%Lf", &__ld);
+ 	  if (errno == ERANGE)
+ 	    __p = 0;
+ #ifdef _GLIBCPP_HAVE_FINITEL
+ 	  if ((__p == 1) && !finitel (__ld))
+ 	    __p = 0;
+ #endif
+ 	  if (__p && static_cast(__p) != char_traits::eof())
+ 	    __v = __ld;
+ #endif
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	  setlocale(LC_ALL, __old);
+ 	}
+     }
+ 
+   void
+   locale::facet::_S_create_c_locale(__c_locale& __cloc, const char*, 
+ 				    __c_locale)
+   { __cloc = NULL; }
+ 
+   void
+   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
+   { __cloc = NULL; }
+ 
+   __c_locale
+   locale::facet::_S_clone_c_locale(__c_locale&)
+   { return __c_locale(); }
+ }  // namespace std
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/c_locale.h gcc-3.1/libstdc++-v3/config/locale/generic/c_locale.h
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/c_locale.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/c_locale.h	Mon Mar 11 21:12:52 2002
***************
*** 0 ****
--- 1,41 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   typedef int*			__c_locale;
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/codecvt_specializations.h gcc-3.1/libstdc++-v3/config/locale/generic/codecvt_specializations.h
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/codecvt_specializations.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/codecvt_specializations.h	Mon Mar 11 21:12:52 2002
***************
*** 0 ****
--- 1,38 ----
+ // Locale support (codecvt) -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.1.5 Template class codecvt
+ //
+ 
+ // Warning: this file is not meant for user inclusion.  Use .
+ 
+ // Written by Benjamin Kosnik 
+ 
+ // XXX dummy file
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/collate_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/collate_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/collate_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/collate_members.cc	Fri Apr 19 07:59:01 2002
***************
*** 0 ****
--- 1,72 ----
+ // std::collate implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.4.1.2  collate virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // These are basically extensions to char_traits, and perhaps should
+   // be put there instead of here.
+   template<>
+     int 
+     collate::_M_compare(const char* __one, const char* __two) const
+     { 
+       int __cmp = strcoll(__one, __two);
+       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+     }
+   
+   template<>
+     size_t
+     collate::_M_transform(char* __to, const char* __from, 
+ 				size_t __n) const
+     { return strxfrm(__to, __from, __n); }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     int 
+     collate::_M_compare(const wchar_t* __one, 
+ 				 const wchar_t* __two) const
+     {
+       int __cmp = wcscoll(__one, __two);
+       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+     }
+   
+   template<>
+     size_t
+     collate::_M_transform(wchar_t* __to, const wchar_t* __from,
+ 				   size_t __n) const
+     { return wcsxfrm(__to, __from, __n); }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/ctype_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/ctype_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/ctype_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/ctype_members.cc	Mon Mar 11 21:12:52 2002
***************
*** 0 ****
--- 1,195 ----
+ // std::ctype implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // NB: The other ctype specializations are in src/locale.cc and
+   // various /config/os/* files.
+   template<>
+     ctype_byname::ctype_byname(const char* __s, size_t __refs)
+     : ctype(0, false, __refs) 
+     { 	
+       _S_destroy_c_locale(_M_c_locale_ctype);
+       _S_create_c_locale(_M_c_locale_ctype, __s); 
+     }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T  
+   ctype::__wmask_type
+   ctype::_M_convert_to_wmask(const mask __m) const
+   {
+     __wmask_type __ret;
+     switch (__m)
+       {
+       case space:
+ 	__ret = wctype("space");
+ 	break;
+       case print:
+ 	__ret = wctype("print");
+ 	break;
+       case cntrl:
+ 	__ret = wctype("cntrl");
+ 	break;
+       case upper:
+ 	__ret = wctype("upper");
+ 	break;
+       case lower:
+ 	__ret = wctype("lower");
+ 	break;
+       case alpha:
+ 	__ret = wctype("alpha");
+ 	break;
+       case digit:
+ 	__ret = wctype("digit");
+ 	break;
+       case punct:
+ 	__ret = wctype("punct");
+ 	break;
+       case xdigit:
+ 	__ret = wctype("xdigit");
+ 	break;
+       case alnum:
+ 	__ret = wctype("alnum");
+ 	break;
+       case graph:
+ 	__ret = wctype("graph");
+ 	break;
+       default:
+ 	__ret = 0;
+       }
+     return __ret;
+   };
+   
+   wchar_t
+   ctype::do_toupper(wchar_t __c) const
+   { return towupper(__c); }
+ 
+   const wchar_t*
+   ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi)
+       {
+         *__lo = towupper(*__lo);
+         ++__lo;
+       }
+     return __hi;
+   }
+   
+   wchar_t
+   ctype::do_tolower(wchar_t __c) const
+   { return towlower(__c); }
+   
+   const wchar_t*
+   ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi)
+       {
+         *__lo = towlower(*__lo);
+         ++__lo;
+       }
+     return __hi;
+   }
+ 
+   bool
+   ctype::
+   do_is(mask __m, char_type __c) const
+   { return static_cast(iswctype(__c, _M_convert_to_wmask(__m))); }
+   
+   const wchar_t* 
+   ctype::
+   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
+   {
+     while (__lo < __hi && !this->do_is(*__m, *__lo))
+       ++__lo;
+     return __lo;
+   }
+   
+   const wchar_t* 
+   ctype::
+   do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi && !this->do_is(__m, *__lo))
+       ++__lo;
+     return __lo;
+   }
+ 
+   const wchar_t*
+   ctype::
+   do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+   {
+     while (__lo < __hi && this->do_is(__m, *__lo) != 0)
+       ++__lo;
+     return __lo;
+   }
+ 
+   wchar_t
+   ctype::
+   do_widen(char __c) const
+   { return btowc(__c); }
+   
+   const char* 
+   ctype::
+   do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
+   {
+     mbstate_t __state;
+     memset(static_cast(&__state), 0, sizeof(mbstate_t));
+     mbsrtowcs(__dest, &__lo, __hi - __lo, &__state);
+     return __hi;
+   }
+ 
+   char
+   ctype::
+   do_narrow(wchar_t __wc, char __dfault) const
+   { 
+     int __c = wctob(__wc);
+     return (__c == EOF ? __dfault : static_cast(__c)); 
+   }
+ 
+   const wchar_t*
+   ctype::
+   do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
+ 	    char* __dest) const
+   {
+     mbstate_t __state;
+     memset(static_cast(&__state), 0, sizeof(mbstate_t));
+     size_t __len = __hi - __lo;
+     size_t __conv = wcsrtombs(__dest, &__lo, __len, &__state);
+     if (__conv == __len)
+       *__dest = __dfault;
+     return __hi;
+   }
+ #endif //  _GLIBCPP_USE_WCHAR_T
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/messages_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/messages_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/messages_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/messages_members.cc	Mon Mar 11 21:12:52 2002
***************
*** 0 ****
--- 1,45 ----
+ // std::messages implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // Specializations
+   template<>
+     string
+     messages::do_get(catalog, int, int, const string& __dfault) const
+     { return __dfault; }
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/messages_members.h gcc-3.1/libstdc++-v3/config/locale/generic/messages_members.h
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/messages_members.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/messages_members.h	Mon Mar 11 21:12:52 2002
***************
*** 0 ****
--- 1,58 ----
+ // std::messages implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+   // Non-virtual member functions.
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::open(const basic_string& __s, const locale& __loc, 
+ 			   const char*) const
+     { return this->do_open(__s, __loc); }
+ 
+   // Virtual member functions.
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::do_open(const basic_string&, const locale&) const
+     { return 0; }
+ 
+   template
+     typename messages<_CharT>::string_type  
+     messages<_CharT>::do_get(catalog, int, int, 
+ 			     const string_type& __dfault) const
+     { return __dfault; }
+ 
+   template
+     void    
+     messages<_CharT>::do_close(catalog) const 
+     { }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/monetary_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/monetary_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/monetary_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/monetary_members.cc	Fri Apr 19 07:59:01 2002
***************
*** 0 ****
--- 1,127 ----
+ // std::moneypunct implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // Construct and return valid pattern consisting of some combination of:
+   // space none symbol sign value
+   money_base::pattern
+   money_base::_S_construct_pattern(char, char, char)
+   { return _S_default_pattern; }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = '.';
+       _M_thousands_sep = ',';
+       _M_grouping = "";
+       _M_curr_symbol = "";
+       _M_positive_sign = "";
+       _M_negative_sign = "";
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = '.';
+       _M_thousands_sep = ',';
+       _M_grouping = "";
+       _M_curr_symbol = "";
+       _M_positive_sign = "";
+       _M_negative_sign = "";
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = L'.';
+       _M_thousands_sep = L',';
+       _M_grouping = "";
+       _M_curr_symbol = L"";
+       _M_positive_sign = L"";
+       _M_negative_sign = L"";
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = L'.';
+       _M_thousands_sep = L',';
+       _M_grouping = "";
+       _M_curr_symbol = L"";
+       _M_positive_sign = L"";
+       _M_negative_sign = L"";
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/numeric_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/numeric_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/numeric_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/numeric_members.cc	Fri Apr 19 07:59:01 2002
***************
*** 0 ****
--- 1,73 ----
+ // std::numpunct implementation details, generic version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = '.';
+       _M_thousands_sep = ',';
+       _M_grouping = "";
+       _M_truename = "true";
+       _M_falsename = "false";
+     }
+ 
+   template<> 
+     numpunct::~numpunct()
+     { }
+       
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = L'.';
+       _M_thousands_sep = L',';
+       _M_grouping = "";
+       _M_truename = L"true";
+       _M_falsename = L"false";
+     }
+ 
+   template<> 
+     numpunct::~numpunct()
+     { }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/generic/time_members.cc gcc-3.1/libstdc++-v3/config/locale/generic/time_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/generic/time_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/generic/time_members.cc	Fri Apr 19 07:59:01 2002
***************
*** 0 ****
--- 1,202 ----
+ // std::time_get, std::time_put implementation, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
+ // ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   template<>
+     __timepunct::~__timepunct()
+     {
+       if (_M_c_locale_timepunct != _S_c_locale)
+ 	_S_destroy_c_locale(_M_c_locale_timepunct); 
+     }
+ 
+   template<>
+     void
+     __timepunct::
+     _M_put(char* __s, size_t __maxlen, const char* __format, 
+ 	   const tm* __tm) const
+     {
+       const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+       strftime(__s, __maxlen, __format, __tm);
+       setlocale(LC_ALL, __old);
+     }
+ 
+   template<> 
+     void
+     __timepunct::_M_initialize_timepunct(__c_locale)
+     { 
+       // "C" locale
+       _M_date_format = "%m/%d/%Y";
+       _M_date_era_format = "%m/%d/%Y";
+       _M_time_format = "%H:%M:%S";
+       _M_time_era_format = "%H:%M:%S";
+       _M_date_time_format = "";
+       _M_date_time_era_format = "";
+       _M_am = "AM";
+       _M_pm = "PM";
+       _M_am_pm_format = "";
+ 	  
+       // Day names, starting with "C"'s Sunday.
+       _M_day1 = "Sunday";
+       _M_day2 = "Monday";
+       _M_day3 = "Tuesday";
+       _M_day4 = "Wednesday";
+       _M_day5 = "Thursday";
+       _M_day6 = "Friday";
+       _M_day7 = "Saturday";
+ 
+       // Abbreviated day names, starting with "C"'s Sun.
+       _M_day_a1 = "Sun";
+       _M_day_a2 = "Mon";
+       _M_day_a3 = "Tue";
+       _M_day_a4 = "Wed";
+       _M_day_a5 = "Thu";
+       _M_day_a6 = "Fri";
+       _M_day_a7 = "Sat";
+ 
+       // Month names, starting with "C"'s January.
+       _M_month01 = "January";
+       _M_month02 = "February";
+       _M_month03 = "March";
+       _M_month04 = "April";
+       _M_month05 = "May";
+       _M_month06 = "June";
+       _M_month07 = "July";
+       _M_month08 = "August";
+       _M_month09 = "September";
+       _M_month10 = "October";
+       _M_month11 = "November";
+       _M_month12 = "December";
+ 
+       // Abbreviated month names, starting with "C"'s Jan.
+       _M_month_a01 = "Jan";
+       _M_month_a02 = "Feb";
+       _M_month_a03 = "Mar";
+       _M_month_a04 = "Apr";
+       _M_month_a05 = "May";
+       _M_month_a06 = "Jun";
+       _M_month_a07 = "July";
+       _M_month_a08 = "Aug";
+       _M_month_a09 = "Sep";
+       _M_month_a10 = "Oct";
+       _M_month_a11 = "Nov";
+       _M_month_a12 = "Dec";
+     }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     __timepunct::~__timepunct()
+     {
+       if (_M_c_locale_timepunct != _S_c_locale)
+ 	_S_destroy_c_locale(_M_c_locale_timepunct); 
+     }
+ 
+   template<>
+     void
+     __timepunct::
+     _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
+ 	   const tm* __tm) const
+     {
+       const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+       wcsftime(__s, __maxlen, __format, __tm);
+       setlocale(LC_ALL, __old);
+     }
+ 
+   template<> 
+     void
+     __timepunct::_M_initialize_timepunct(__c_locale)
+     {
+       // "C" locale
+       _M_date_format = L"%m/%d/%y";
+       _M_date_era_format = L"%m/%d/%y";
+       _M_time_format = L"%H:%M:%S";
+       _M_time_era_format = L"%H:%M:%S";
+       _M_date_time_format = L"";
+       _M_date_time_era_format = L"";
+       _M_am = L"AM";
+       _M_pm = L"PM";
+       _M_am_pm_format = L"";
+ 
+       // Day names, starting with "C"'s Sunday.
+       _M_day1 = L"Sunday";
+       _M_day2 = L"Monday";
+       _M_day3 = L"Tuesday";
+       _M_day4 = L"Wednesday";
+       _M_day5 = L"Thursday";
+       _M_day6 = L"Friday";
+       _M_day7 = L"Saturday";
+ 
+       // Abbreviated day names, starting with "C"'s Sun.
+       _M_day_a1 = L"Sun";
+       _M_day_a2 = L"Mon";
+       _M_day_a3 = L"Tue";
+       _M_day_a4 = L"Wed";
+       _M_day_a5 = L"Thu";
+       _M_day_a6 = L"Fri";
+       _M_day_a7 = L"Sat";
+ 
+       // Month names, starting with "C"'s January.
+       _M_month01 = L"January";
+       _M_month02 = L"February";
+       _M_month03 = L"March";
+       _M_month04 = L"April";
+       _M_month05 = L"May";
+       _M_month06 = L"June";
+       _M_month07 = L"July";
+       _M_month08 = L"August";
+       _M_month09 = L"September";
+       _M_month10 = L"October";
+       _M_month11 = L"November";
+       _M_month12 = L"December";
+ 
+       // Abbreviated month names, starting with "C"'s Jan.
+       _M_month_a01 = L"Jan";
+       _M_month_a02 = L"Feb";
+       _M_month_a03 = L"Mar";
+       _M_month_a04 = L"Apr";
+       _M_month_a05 = L"May";
+       _M_month_a06 = L"Jun";
+       _M_month_a07 = L"July";
+       _M_month_a08 = L"Aug";
+       _M_month_a09 = L"Sep";
+       _M_month_a10 = L"Oct";
+       _M_month_a11 = L"Nov";
+       _M_month_a12 = L"Dec";
+     }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/c_locale.cc gcc-3.1/libstdc++-v3/config/locale/gnu/c_locale.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/c_locale.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/c_locale.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,185 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ #include 
+ #include 
+ 
+ namespace std 
+ {
+   template<>
+     void
+     __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, 
+ 		   const __c_locale& __cloc, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+       {
+ 	char* __sanity;
+ 	errno = 0;
+ 	long __l = __strtol_l(__s, &__sanity, __base, __cloc);
+ 	if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	  __v = __l;
+ 	else
+ 	  __err |= ios_base::failbit;
+       }
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, unsigned long& __v, 
+ 		   ios_base::iostate& __err, const __c_locale& __cloc, 
+ 		   int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ul;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+ #ifdef _GLIBCPP_USE_LONG_LONG
+   template<>
+     void
+     __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, 
+ 		   const __c_locale& __cloc, int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ll;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, unsigned long long& __v, 
+ 		   ios_base::iostate& __err, const __c_locale& __cloc, 
+ 		   int __base)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{      
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, 
+ 						  __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ull;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}  
+     }
+ #endif
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
+ 		   const __c_locale& __cloc, int)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  float __f = __strtof_l(__s, &__sanity, __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __f;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
+ 		   const __c_locale& __cloc, int)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  double __d = __strtod_l(__s, &__sanity, __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __d;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+   template<>
+     void
+     __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
+ 		   const __c_locale& __cloc, int)
+     {
+       if (!(__err & ios_base::failbit))
+ 	{
+ 	  char* __sanity;
+ 	  errno = 0;
+ 	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
+           if (__sanity != __s && *__sanity == '\0' && errno != ERANGE)
+ 	    __v = __ld;
+ 	  else
+ 	    __err |= ios_base::failbit;
+ 	}
+     }
+ 
+   void
+   locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
+ 				    __c_locale __old)
+   {
+     __cloc = __newlocale(1 << LC_ALL, __s, __old);
+     if (!__cloc)
+       {
+ 	// This named locale is not supported by the underlying OS.
+ 	__throw_runtime_error("attempt to create locale from unknown name");
+       }
+   }
+   
+   void
+   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
+   { __freelocale(__cloc); }
+ 
+   __c_locale
+   locale::facet::_S_clone_c_locale(__c_locale& __cloc)
+   { return __duplocale(__cloc); }
+ }  // namespace std
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/c_locale.h gcc-3.1/libstdc++-v3/config/locale/gnu/c_locale.h
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/c_locale.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/c_locale.h	Mon Mar 11 21:12:54 2002
***************
*** 0 ****
--- 1,46 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ #include 		// For codecvt
+ #include 		// For codecvt using iconv, iconv_t
+ #include  		// For messages
+ 
+ #define _GLIBCPP_C_LOCALE_GNU 1
+ 
+ namespace std
+ {
+   typedef __locale_t		__c_locale;
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/collate_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/collate_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/collate_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/collate_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,72 ----
+ // std::collate implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.4.1.2  collate virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // These are basically extensions to char_traits, and perhaps should
+   // be put there instead of here.
+   template<>
+     int 
+     collate::_M_compare(const char* __one, const char* __two) const
+     { 
+       int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
+       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+     }
+   
+   template<>
+     size_t
+     collate::_M_transform(char* __to, const char* __from, 
+ 				size_t __n) const 
+     { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     int 
+     collate::_M_compare(const wchar_t* __one, 
+ 				 const wchar_t* __two) const
+     {
+       int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
+       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+     }
+   
+   template<>
+     size_t
+     collate::_M_transform(wchar_t* __to, const wchar_t* __from,
+ 				   size_t __n) const
+     { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/ctype_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/ctype_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/ctype_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/ctype_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,202 ----
+ // std::ctype implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // NB: The other ctype specializations are in src/locale.cc and
+   // various /config/os/* files.
+   template<>
+     ctype_byname::ctype_byname(const char* __s, size_t __refs)
+     : ctype(0, false, __refs) 
+     { 	
+       if (_M_c_locale_ctype != _S_c_locale)
+ 	_S_destroy_c_locale(_M_c_locale_ctype);
+       _S_create_c_locale(_M_c_locale_ctype, __s); 
+       _M_toupper = _M_c_locale_ctype->__ctype_toupper;
+       _M_tolower = _M_c_locale_ctype->__ctype_tolower;
+       _M_table = _M_c_locale_ctype->__ctype_b;
+     }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T  
+   ctype::__wmask_type
+   ctype::_M_convert_to_wmask(const mask __m) const
+   {
+     __wmask_type __ret;
+     switch (__m)
+       {
+       case space:
+ 	__ret = __wctype_l("space", _M_c_locale_ctype);
+ 	break;
+       case print:
+ 	__ret = __wctype_l("print", _M_c_locale_ctype);
+ 	break;
+       case cntrl:
+ 	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
+ 	break;
+       case upper:
+ 	__ret = __wctype_l("upper", _M_c_locale_ctype);
+ 	break;
+       case lower:
+ 	__ret = __wctype_l("lower", _M_c_locale_ctype);
+ 	break;
+       case alpha:
+ 	__ret = __wctype_l("alpha", _M_c_locale_ctype);
+ 	break;
+       case digit:
+ 	__ret = __wctype_l("digit", _M_c_locale_ctype);
+ 	break;
+       case punct:
+ 	__ret = __wctype_l("punct", _M_c_locale_ctype);
+ 	break;
+       case xdigit:
+ 	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
+ 	break;
+       case alnum:
+ 	__ret = __wctype_l("alnum", _M_c_locale_ctype);
+ 	break;
+       case graph:
+ 	__ret = __wctype_l("graph", _M_c_locale_ctype);
+ 	break;
+       default:
+ 	__ret = 0;
+       }
+     return __ret;
+   };
+   
+   wchar_t
+   ctype::do_toupper(wchar_t __c) const
+   { return __towupper_l(__c, _M_c_locale_ctype); }
+ 
+   const wchar_t*
+   ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi)
+       {
+         *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
+         ++__lo;
+       }
+     return __hi;
+   }
+   
+   wchar_t
+   ctype::do_tolower(wchar_t __c) const
+   { return __towlower_l(__c, _M_c_locale_ctype); }
+   
+   const wchar_t*
+   ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi)
+       {
+         *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
+         ++__lo;
+       }
+     return __hi;
+   }
+ 
+   bool
+   ctype::
+   do_is(mask __m, char_type __c) const
+   { 
+     return static_cast(__iswctype_l(__c, _M_convert_to_wmask(__m), 
+ 					  _M_c_locale_ctype)); 
+   }
+   
+   const wchar_t* 
+   ctype::
+   do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
+   {
+     while (__lo < __hi && !this->do_is(*__m, *__lo))
+       ++__lo;
+     return __lo;
+   }
+   
+   const wchar_t* 
+   ctype::
+   do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
+   {
+     while (__lo < __hi && !this->do_is(__m, *__lo))
+       ++__lo;
+     return __lo;
+   }
+ 
+   const wchar_t*
+   ctype::
+   do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+   {
+     while (__lo < __hi && this->do_is(__m, *__lo) != 0)
+       ++__lo;
+     return __lo;
+   }
+ 
+   wchar_t
+   ctype::
+   do_widen(char __c) const
+   { return btowc(__c); }
+   
+   const char* 
+   ctype::
+   do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
+   {
+     mbstate_t __state;
+     memset(static_cast(&__state), 0, sizeof(mbstate_t));
+     mbsrtowcs(__dest, &__lo, __hi - __lo, &__state);
+     return __hi;
+   }
+ 
+   char
+   ctype::
+   do_narrow(wchar_t __wc, char __dfault) const
+   { 
+     int __c = wctob(__wc);
+     return (__c == EOF ? __dfault : static_cast(__c)); 
+   }
+ 
+   const wchar_t*
+   ctype::
+   do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
+ 	    char* __dest) const
+   {
+     mbstate_t __state;
+     memset(static_cast(&__state), 0, sizeof(mbstate_t));
+     size_t __len = __hi - __lo;
+     size_t __conv = wcsrtombs(__dest, &__lo, __len, &__state);
+     if (__conv == __len)
+       *__dest = __dfault;
+     return __hi;
+   }
+ #endif //  _GLIBCPP_USE_WCHAR_T
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/messages_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/messages_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/messages_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/messages_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,57 ----
+ // std::messages implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // Specializations.
+   template<>
+     string
+     messages::do_get(catalog, int, int, const string& __dfault) const
+     {
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+       __c_locale __old = __uselocale(_M_c_locale_messages);
+       const char* __msg = const_cast(gettext(__dfault.c_str()));
+       __uselocale(__old);
+       return string(__msg);
+ #else
+       const char* __old = setlocale(LC_ALL, _M_name_messages);
+       const char* __msg = gettext(__dfault.c_str());
+       setlocale(LC_ALL, __old);
+       return string(__msg);
+ #endif
+     }
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/messages_members.h gcc-3.1/libstdc++-v3/config/locale/gnu/messages_members.h
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/messages_members.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/messages_members.h	Mon Mar 25 20:29:16 2002
***************
*** 0 ****
--- 1,78 ----
+ // std::messages implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+   // Non-virtual member functions.
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::open(const basic_string& __s, const locale& __loc, 
+ 			   const char* __dir) const
+     { 
+       bindtextdomain(__s.c_str(), __dir);
+       return this->do_open(__s, __loc); 
+     }
+ 
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::do_open(const basic_string& __s, 
+ 			      const locale&) const
+     { 
+       // No error checking is done, assume the catalog exists and can
+       // be used.
+       textdomain(__s.c_str());
+       return 0;
+     }
+ 
+   template
+     typename messages<_CharT>::string_type  
+     messages<_CharT>::do_get(catalog, int, int, 
+ 			     const string_type& __dfault) const
+     { 
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+       __c_locale __old = __uselocale(_M_c_locale_messages);
+       char* __msg = gettext(_M_convert_to_char(__dfault));
+       __uselocale(__old);
+       return _M_convert_from_char(__msg);
+ #else
+       const char* __old = setlocale(LC_ALL, _M_name_messages);
+       char* __msg = gettext(_M_convert_to_char(__dfault));
+       setlocale(LC_ALL, __old);
+       return _M_convert_from_char(__msg);
+ #endif
+     }
+ 
+   template
+     void    
+     messages<_CharT>::do_close(catalog) const 
+     { }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/monetary_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/monetary_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/monetary_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/monetary_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,501 ----
+ // std::moneypunct implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // Construct and return valid pattern consisting of some combination of:
+   // space none symbol sign value
+   money_base::pattern
+   money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
+   { 
+     pattern __ret;
+ 
+     // This insanely complicated routine attempts to construct a valid
+     // pattern for use with monyepunct. A couple of invariants:
+ 
+     // if (__precedes) symbol -> value
+     // else value -> symbol
+     
+     // if (__space) space
+     // else none
+ 
+     // none == never first
+     // space never first or last
+ 
+     // Any elegant implementations of this are welcome.
+     switch (__posn)
+       {
+       case 0:
+       case 1:
+ 	// 1 The sign precedes the value and symbol.
+ 	if (__space)
+ 	  {
+ 	    // Pattern starts with sign.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[1] = symbol;
+ 		__ret.field[2] = space;
+ 		__ret.field[3] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[1] = value;
+ 		__ret.field[2] = space;
+ 		__ret.field[3] = symbol;
+ 	      }
+ 	    __ret.field[0] = sign;
+ 	  }
+ 	else
+ 	  {
+ 	    // Pattern starts with sign and ends with none.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[1] = symbol;
+ 		__ret.field[2] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[1] = value;
+ 		__ret.field[2] = symbol;
+ 	      }
+ 	    __ret.field[0] = sign;
+ 	    __ret.field[3] = none;
+ 	  }
+ 	break;
+       case 2:
+ 	// 2 The sign follows the value and symbol.
+ 	if (__space)
+ 	  {
+ 	    // Pattern either ends with sign.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = symbol;
+ 		__ret.field[1] = space;
+ 		__ret.field[2] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = space;
+ 		__ret.field[2] = symbol;
+ 	      }
+ 	    __ret.field[3] = sign;
+ 	  }
+ 	else
+ 	  {
+ 	    // Pattern ends with sign then none.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = symbol;
+ 		__ret.field[1] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = symbol;
+ 	      }
+ 	    __ret.field[2] = sign;
+ 	    __ret.field[3] = none;
+ 	  }
+ 	break;
+       case 3:
+ 	// 3 The sign immediately precedes the symbol.
+ 	if (__space)
+ 	  {
+ 	    // Have space.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = sign;
+ 		__ret.field[1] = symbol;
+ 		__ret.field[2] = space;
+ 		__ret.field[3] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = space;
+ 		__ret.field[2] = sign;
+ 		__ret.field[3] = symbol;
+ 	      }
+ 	  }
+ 	else
+ 	  {
+ 	    // Have none.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = sign;
+ 		__ret.field[1] = symbol;
+ 		__ret.field[2] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = sign;
+ 		__ret.field[2] = symbol;
+ 	      }
+ 	    __ret.field[3] = none;
+ 	  }
+ 	break;
+       case 4:
+ 	// 4 The sign immediately follows the symbol. 
+ 	if (__space)
+ 	  {
+ 	    // Have space.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = symbol;
+ 		__ret.field[1] = sign;
+ 		__ret.field[2] = space;
+ 		__ret.field[3] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = space;
+ 		__ret.field[2] = symbol;
+ 		__ret.field[3] = sign;
+ 	      }
+ 	  }
+ 	else
+ 	  {
+ 	    // Have none.
+ 	    if (__precedes)
+ 	      {
+ 		__ret.field[0] = symbol;
+ 		__ret.field[1] = sign;
+ 		__ret.field[2] = value;
+ 	      }
+ 	    else
+ 	      {
+ 		__ret.field[0] = value;
+ 		__ret.field[1] = symbol;
+ 		__ret.field[2] = sign;
+ 	      }
+ 	    __ret.field[3] = none;
+ 	  }
+ 	break;
+       default:
+ 	;
+       }
+     return __ret;
+   }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = '.';
+ 	  _M_thousands_sep = ',';
+ 	  _M_grouping = "";
+ 	  _M_curr_symbol = "";
+ 	  _M_positive_sign = "";
+ 	  _M_negative_sign = "";
+ 	  _M_frac_digits = 0;
+ 	  _M_pos_format = money_base::_S_default_pattern;
+ 	  _M_neg_format = money_base::_S_default_pattern;
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc));
+ 	  _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc));
+ 	  _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
+ 	  _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
+ 
+ 	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
+ 	  if (!__nposn)
+ 	    _M_negative_sign = "()";
+ 	  else
+ 	    _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
+ 
+ 	  // _Intl == true
+ 	  _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
+ 	  _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc));
+ 	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
+ 	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
+ 	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
+ 	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn);
+ 	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
+ 	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
+ 	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
+ 	}
+     }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = '.';
+ 	  _M_thousands_sep = ',';
+ 	  _M_grouping = "";
+ 	  _M_curr_symbol = "";
+ 	  _M_positive_sign = "";
+ 	  _M_negative_sign = "";
+ 	  _M_frac_digits = 0;
+ 	  _M_pos_format = money_base::_S_default_pattern;
+ 	  _M_neg_format = money_base::_S_default_pattern;
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc));
+ 	  _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc));
+ 	  _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
+ 	  _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
+ 
+ 	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
+ 	  if (!__nposn)
+ 	    _M_negative_sign = "()";
+ 	  else
+ 	    _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
+ 
+ 	  // _Intl == false
+ 	  _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
+ 	  _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
+ 	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
+ 	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
+ 	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
+ 	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn);
+ 	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
+ 	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
+ 	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
+ 	}
+     }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     { }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = L'.';
+ 	  _M_thousands_sep = L',';
+ 	  _M_grouping = "";
+ 	  _M_curr_symbol = L"";
+ 	  _M_positive_sign = L"";
+ 	  _M_negative_sign = L"";
+ 	  _M_frac_digits = 0;
+ 	  _M_pos_format = money_base::_S_default_pattern;
+ 	  _M_neg_format = money_base::_S_default_pattern;
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w);
+ 
+ 	  _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w);
+ 	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
+ 
+ 	  mbstate_t __state;
+ 	  size_t __len;
+ 	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
+ 	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
+ 	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
+ 
+ 	  // NB: Should swich to __cloc's ctype info first.
+ 	  __len = strlen(__cpossign);
+ 	  if (__len)
+ 	    {
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__cpossign, __len, &__state);
+ 	      _M_positive_sign = __wcs;
+ 	    }
+ 	  else
+ 	    _M_positive_sign = L"";
+ 
+ 	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
+ 	  __len = strlen(__cnegsign);
+ 	  if (!__nposn)
+ 	    _M_negative_sign = L"()";
+ 	  else if (__len)
+ 	    { 
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__cnegsign, __len, &__state);
+ 	      _M_negative_sign = __wcs;
+ 	    }
+ 	  else
+ 	    _M_negative_sign = L"";
+ 
+ 	  // _Intl == true.
+ 	  __len = strlen(__ccurr);
+ 	  if (__len)
+ 	    {
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__ccurr, __len, &__state);
+ 	      _M_curr_symbol = __wcs;
+ 	    }
+ 	  else
+ 	    _M_curr_symbol = L"";
+ 
+ 	  _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc));
+ 	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
+ 	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
+ 	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
+ 	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn);
+ 	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
+ 	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
+ 	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
+ 	}
+     }
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = L'.';
+ 	  _M_thousands_sep = L',';
+ 	  _M_grouping = "";
+ 	  _M_curr_symbol = L"";
+ 	  _M_positive_sign = L"";
+ 	  _M_negative_sign = L"";
+ 	  _M_frac_digits = 0;
+ 	  _M_pos_format = money_base::_S_default_pattern;
+ 	  _M_neg_format = money_base::_S_default_pattern;
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w);
+ 	  _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w);
+ 	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
+ 
+ 	  mbstate_t __state;
+ 	  size_t __len;
+ 	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
+ 	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
+ 	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
+ 
+ 	  // NB: Should swich to __cloc's ctype info first.
+ 	  __len = strlen(__cpossign);
+ 	  if (__len)
+ 	    {
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__cpossign, __len, &__state);
+ 	      _M_positive_sign = __wcs;
+ 	    }
+ 	  else
+ 	    _M_positive_sign = L"";
+ 
+ 	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
+ 	  __len = strlen(__cnegsign);
+ 	  if (!__nposn)
+ 	    _M_negative_sign = L"()";
+ 	  else if (__len)
+ 	    { 
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__cnegsign, __len, &__state);
+ 	      _M_negative_sign = __wcs;
+ 	    }
+ 	  else
+ 	    _M_negative_sign = L"";
+ 
+ 	  // _Intl == true.
+ 	  __len = strlen(__ccurr);
+ 	  if (__len)
+ 	    {
+ 	      ++__len;
+ 	      memset(&__state, 0, sizeof(mbstate_t));
+ 	      wchar_t* __wcs = new wchar_t[__len];
+ 	      mbsrtowcs(__wcs, &__ccurr, __len, &__state);
+ 	      _M_curr_symbol = __wcs;
+ 	    }
+ 	  else
+ 	    _M_curr_symbol = L"";
+ 
+ 	  _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
+ 	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
+ 	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
+ 	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
+ 	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn);
+ 	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
+ 	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
+ 	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn);
+ 	}
+     }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     {
+       if (wcslen(_M_positive_sign))
+ 	delete [] _M_positive_sign;
+       if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0))
+ 	delete [] _M_negative_sign;
+       if (wcslen(_M_curr_symbol))
+ 	delete [] _M_curr_symbol;
+     }
+ 
+   template<> 
+     moneypunct::~moneypunct()
+     {
+       if (wcslen(_M_positive_sign))
+ 	delete [] _M_positive_sign;
+       if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0))
+ 	delete [] _M_negative_sign;
+       if (wcslen(_M_curr_symbol))
+ 	delete [] _M_curr_symbol;
+     }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/numeric_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/numeric_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/numeric_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/numeric_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,106 ----
+ // std::numpunct implementation details, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = '.';
+ 	  _M_thousands_sep = ',';
+ 	  _M_grouping = "";
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc));
+ 	  _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc));
+ 	  // Check for NUL, which implies no grouping.
+ 	  if (_M_thousands_sep == '\0')
+ 	    _M_grouping = "";
+ 	  else
+ 	    _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
+ 	}
+       // NB: There is no way to extact this info from posix locales.
+       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
+       _M_truename = "true";
+       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
+       _M_falsename = "false";
+     }
+  
+   template<> 
+     numpunct::~numpunct()
+     { }
+    
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_decimal_point = L'.';
+ 	  _M_thousands_sep = L',';
+ 	  _M_grouping = "";
+ 	}
+       else
+ 	{
+ 	  // Named locale.
+ 	  _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w);
+ 	  _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w);
+ 	  if (_M_thousands_sep == L'\0')
+ 	    _M_grouping = "";
+ 	  else
+ 	    _M_grouping = __nl_langinfo_l(GROUPING, __cloc);
+ 	}
+       // NB: There is no way to extact this info from posix locales.
+       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
+       _M_truename = L"true";
+       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
+       _M_falsename = L"false";
+     }
+ 
+   template<> 
+     numpunct::~numpunct()
+     { }
+  #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/gnu/time_members.cc gcc-3.1/libstdc++-v3/config/locale/gnu/time_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/gnu/time_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/gnu/time_members.cc	Fri Apr 19 07:59:03 2002
***************
*** 0 ****
--- 1,336 ----
+ // std::time_get, std::time_put implementation, GNU version -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
+ // ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   template<>
+     __timepunct::~__timepunct()
+     {
+       if (_M_c_locale_timepunct != _S_c_locale)
+ 	_S_destroy_c_locale(_M_c_locale_timepunct); 
+     }
+ 
+   template<>
+     void
+     __timepunct::
+     _M_put(char* __s, size_t __maxlen, const char* __format, 
+ 	   const tm* __tm) const
+     {
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+       __strftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
+ #else
+       const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+       strftime(__s, __maxlen, __format, __tm);
+       setlocale(LC_ALL, __old);
+ #endif
+     }
+ 
+   template<> 
+     void
+     __timepunct::_M_initialize_timepunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_date_format = "%m/%d/%y";
+ 	  _M_date_era_format = "%m/%d/%y";
+ 	  _M_time_format = "%H:%M:%S";
+ 	  _M_time_era_format = "%H:%M:%S";
+ 	  _M_date_time_format = "";
+ 	  _M_date_time_era_format = "";
+ 	  _M_am = "AM";
+ 	  _M_pm = "PM";
+ 	  _M_am_pm_format = "";
+ 
+ 	  // Day names, starting with "C"'s Sunday.
+ 	  _M_day1 = "Sunday";
+ 	  _M_day2 = "Monday";
+ 	  _M_day3 = "Tuesday";
+ 	  _M_day4 = "Wednesday";
+ 	  _M_day5 = "Thursday";
+ 	  _M_day6 = "Friday";
+ 	  _M_day7 = "Saturday";
+ 
+ 	  // Abbreviated day names, starting with "C"'s Sun.
+ 	  _M_day_a1 = "Sun";
+ 	  _M_day_a2 = "Mon";
+ 	  _M_day_a3 = "Tue";
+ 	  _M_day_a4 = "Wed";
+ 	  _M_day_a5 = "Thu";
+ 	  _M_day_a6 = "Fri";
+ 	  _M_day_a7 = "Sat";
+ 
+ 	  // Month names, starting with "C"'s January.
+ 	  _M_month01 = "January";
+ 	  _M_month02 = "February";
+ 	  _M_month03 = "March";
+ 	  _M_month04 = "April";
+ 	  _M_month05 = "May";
+ 	  _M_month06 = "June";
+ 	  _M_month07 = "July";
+ 	  _M_month08 = "August";
+ 	  _M_month09 = "September";
+ 	  _M_month10 = "October";
+ 	  _M_month11 = "November";
+ 	  _M_month12 = "December";
+ 
+ 	  // Abbreviated month names, starting with "C"'s Jan.
+ 	  _M_month_a01 = "Jan";
+ 	  _M_month_a02 = "Feb";
+ 	  _M_month_a03 = "Mar";
+ 	  _M_month_a04 = "Apr";
+ 	  _M_month_a05 = "May";
+ 	  _M_month_a06 = "Jun";
+ 	  _M_month_a07 = "July";
+ 	  _M_month_a08 = "Aug";
+ 	  _M_month_a09 = "Sep";
+ 	  _M_month_a10 = "Oct";
+ 	  _M_month_a11 = "Nov";
+ 	  _M_month_a12 = "Dec";
+ 	}
+       else
+ 	{
+ 	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
+ 
+ 	  _M_date_format = __nl_langinfo_l(D_FMT, __cloc);
+ 	  _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
+ 	  _M_time_format = __nl_langinfo_l(T_FMT, __cloc);
+ 	  _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
+ 	  _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
+ 	  _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc);
+ 	  _M_am = __nl_langinfo_l(AM_STR, __cloc);
+ 	  _M_pm = __nl_langinfo_l(PM_STR, __cloc);
+ 	  _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
+ 
+ 	  // Day names, starting with "C"'s Sunday.
+ 	  _M_day1 = __nl_langinfo_l(DAY_1, __cloc);
+ 	  _M_day2 = __nl_langinfo_l(DAY_2, __cloc);
+ 	  _M_day3 = __nl_langinfo_l(DAY_3, __cloc);
+ 	  _M_day4 = __nl_langinfo_l(DAY_4, __cloc);
+ 	  _M_day5 = __nl_langinfo_l(DAY_5, __cloc);
+ 	  _M_day6 = __nl_langinfo_l(DAY_6, __cloc);
+ 	  _M_day7 = __nl_langinfo_l(DAY_7, __cloc);
+ 
+ 	  // Abbreviated day names, starting with "C"'s Sun.
+ 	  _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc);
+ 	  _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc);
+ 	  _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc);
+ 	  _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc);
+ 	  _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc);
+ 	  _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc);
+ 	  _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc);
+ 
+ 	  // Month names, starting with "C"'s January.
+ 	  _M_month01 = __nl_langinfo_l(MON_1, __cloc);
+ 	  _M_month02 = __nl_langinfo_l(MON_2, __cloc);
+ 	  _M_month03 = __nl_langinfo_l(MON_3, __cloc);
+ 	  _M_month04 = __nl_langinfo_l(MON_4, __cloc);
+ 	  _M_month05 = __nl_langinfo_l(MON_5, __cloc);
+ 	  _M_month06 = __nl_langinfo_l(MON_6, __cloc);
+ 	  _M_month07 = __nl_langinfo_l(MON_7, __cloc);
+ 	  _M_month08 = __nl_langinfo_l(MON_8, __cloc);
+ 	  _M_month09 = __nl_langinfo_l(MON_9, __cloc);
+ 	  _M_month10 = __nl_langinfo_l(MON_10, __cloc);
+ 	  _M_month11 = __nl_langinfo_l(MON_11, __cloc);
+ 	  _M_month12 = __nl_langinfo_l(MON_12, __cloc);
+ 
+ 	  // Abbreviated month names, starting with "C"'s Jan.
+ 	  _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc);
+ 	  _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc);
+ 	  _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc);
+ 	  _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc);
+ 	  _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc);
+ 	  _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc);
+ 	  _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc);
+ 	  _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc);
+ 	  _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc);
+ 	  _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc);
+ 	  _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc);
+ 	  _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc);
+ 	}
+     }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<>
+     __timepunct::~__timepunct()
+     {
+       if (_M_c_locale_timepunct != _S_c_locale)
+ 	_S_destroy_c_locale(_M_c_locale_timepunct); 
+     }
+ 
+   template<>
+     void
+     __timepunct::
+     _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
+ 	   const tm* __tm) const
+     {
+ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+       __wcsftime_l(__s, __maxlen, _M_c_locale_timepunct, __format, __tm);
+ #else
+       const char* __old = setlocale(LC_ALL, _M_name_timepunct);
+       wcsftime(__s, __maxlen, __format, __tm);
+       setlocale(LC_ALL, __old);
+ #endif
+     }
+ 
+   template<> 
+     void
+     __timepunct::_M_initialize_timepunct(__c_locale __cloc)
+     {
+       if (__cloc == _S_c_locale)
+ 	{
+ 	  // "C" locale
+ 	  _M_date_format = L"%m/%d/%y";
+ 	  _M_date_era_format = L"%m/%d/%y";
+ 	  _M_time_format = L"%H:%M:%S";
+ 	  _M_time_era_format = L"%H:%M:%S";
+ 	  _M_date_time_format = L"";
+ 	  _M_date_time_era_format = L"";
+ 	  _M_am = L"AM";
+ 	  _M_pm = L"PM";
+ 	  _M_am_pm_format = L"";
+ 
+ 	  // Day names, starting with "C"'s Sunday.
+ 	  _M_day1 = L"Sunday";
+ 	  _M_day2 = L"Monday";
+ 	  _M_day3 = L"Tuesday";
+ 	  _M_day4 = L"Wednesday";
+ 	  _M_day5 = L"Thursday";
+ 	  _M_day6 = L"Friday";
+ 	  _M_day7 = L"Saturday";
+ 
+ 	  // Abbreviated day names, starting with "C"'s Sun.
+ 	  _M_day_a1 = L"Sun";
+ 	  _M_day_a2 = L"Mon";
+ 	  _M_day_a3 = L"Tue";
+ 	  _M_day_a4 = L"Wed";
+ 	  _M_day_a5 = L"Thu";
+ 	  _M_day_a6 = L"Fri";
+ 	  _M_day_a7 = L"Sat";
+ 
+ 	  // Month names, starting with "C"'s January.
+ 	  _M_month01 = L"January";
+ 	  _M_month02 = L"February";
+ 	  _M_month03 = L"March";
+ 	  _M_month04 = L"April";
+ 	  _M_month05 = L"May";
+ 	  _M_month06 = L"June";
+ 	  _M_month07 = L"July";
+ 	  _M_month08 = L"August";
+ 	  _M_month09 = L"September";
+ 	  _M_month10 = L"October";
+ 	  _M_month11 = L"November";
+ 	  _M_month12 = L"December";
+ 
+ 	  // Abbreviated month names, starting with "C"'s Jan.
+ 	  _M_month_a01 = L"Jan";
+ 	  _M_month_a02 = L"Feb";
+ 	  _M_month_a03 = L"Mar";
+ 	  _M_month_a04 = L"Apr";
+ 	  _M_month_a05 = L"May";
+ 	  _M_month_a06 = L"Jun";
+ 	  _M_month_a07 = L"July";
+ 	  _M_month_a08 = L"Aug";
+ 	  _M_month_a09 = L"Sep";
+ 	  _M_month_a10 = L"Oct";
+ 	  _M_month_a11 = L"Nov";
+ 	  _M_month_a12 = L"Dec";
+ 	}
+       else
+ 	{
+ 	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
+ 
+ 	  _M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc));
+ 	  _M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc));
+ 	  _M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc));
+ 	  _M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc));
+ 	  _M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc));
+ 	  _M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc));
+ 	  _M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc));
+ 	  _M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc));
+ 	  _M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc));
+ 
+ 	  // Day names, starting with "C"'s Sunday.
+ 	  _M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc));
+ 	  _M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc));
+ 	  _M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc));
+ 	  _M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc));
+ 	  _M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc));
+ 	  _M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc));
+ 	  _M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc));
+ 
+ 	  // Abbreviated day names, starting with "C"'s Sun.
+ 	  _M_day_a1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc));
+ 	  _M_day_a2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc));
+ 	  _M_day_a3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc));
+ 	  _M_day_a4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc));
+ 	  _M_day_a5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc));
+ 	  _M_day_a6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc));
+ 	  _M_day_a7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc));
+ 
+ 	  // Month names, starting with "C"'s January.
+ 	  _M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc));
+ 	  _M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc));
+ 	  _M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc));
+ 	  _M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc));
+ 	  _M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc));
+ 	  _M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc));
+ 	  _M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc));
+ 	  _M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc));
+ 	  _M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc));
+ 	  _M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc));
+ 	  _M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc));
+ 	  _M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc));
+ 
+ 	  // Abbreviated month names, starting with "C"'s Jan.
+ 	  _M_month_a01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc));
+ 	  _M_month_a02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc));
+ 	  _M_month_a03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc));
+ 	  _M_month_a04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc));
+ 	  _M_month_a05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc));
+ 	  _M_month_a06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc));
+ 	  _M_month_a07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc));
+ 	  _M_month_a08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc));
+ 	  _M_month_a09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc));
+ 	  _M_month_a10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc));
+ 	  _M_month_a11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc));
+ 	  _M_month_a12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc));
+ 	}
+     }
+ #endif
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.cc gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.cc	Fri Apr 19 07:59:04 2002
***************
*** 0 ****
--- 1,112 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std 
+ {
+   void
+   locale::facet::_S_create_c_locale(__c_locale&, const char*, __c_locale*)
+   { }
+ 
+   void
+   locale::facet::_S_destroy_c_locale(__c_locale&)
+   { }
+ 
+   __c_locale
+   locale::facet::_S_clone_c_locale(__c_locale&)
+   { return __c_locale(); }
+ 
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = '.';
+       _M_thousands_sep = ',';
+       _M_grouping = "";
+       _M_truename = "true";
+       _M_falsename = "false";
+     }
+       
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     numpunct::_M_initialize_numpunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = L'.';
+       _M_thousands_sep = L',';
+       _M_grouping = "";
+       _M_truename = L"true";
+       _M_falsename = L"false";
+     }
+ #endif
+ 
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = '.';
+       _M_thousands_sep = ',';
+       _M_grouping = "";
+       _M_curr_symbol = string_type();
+       _M_positive_sign = string_type();
+       _M_negative_sign = string_type();
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   template<> 
+     void
+     moneypunct::_M_initialize_moneypunct(__c_locale)
+     {
+       // "C" locale
+       _M_decimal_point = L'.';
+       _M_thousands_sep = L',';
+       _M_grouping = "";
+       _M_curr_symbol = string_type();
+       _M_positive_sign = string_type();
+       _M_negative_sign = string_type();
+       _M_frac_digits = 0;
+       _M_pos_format = money_base::_S_default_pattern;
+       _M_neg_format = money_base::_S_default_pattern;
+     }
+ #endif
+ }  // namespace std
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.h gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.h
*** gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/c_locale.h	Fri Apr 19 07:59:04 2002
***************
*** 0 ****
--- 1,44 ----
+ // Wrapper for underlying C-language localization -*- C++ -*-
+ 
+ // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.8  Standard locale categories.
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ #include 		// For codecvt
+ #include 		// For codecvt using iconv, iconv_t
+ #include  		// For messages
+ 
+ namespace std
+ {
+   typedef int*			__c_locale;
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h
*** gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h	Fri Apr 19 07:59:04 2002
***************
*** 0 ****
--- 1,460 ----
+ // Locale support (codecvt) -*- C++ -*-
+ 
+ // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.1.5 Template class codecvt
+ //
+ 
+ // Warning: this file is not meant for user inclusion.  Use .
+ 
+ // Written by Benjamin Kosnik 
+ 
+   // XXX
+   // Define this here to codecvt.cc can have _S_max_size definition.
+ #define _GLIBCPP_USE___ENC_TRAITS 1
+ 
+   // Extension to use icov for dealing with character encodings,
+   // including conversions and comparisons between various character
+   // sets.  This object encapsulates data that may need to be shared between
+   // char_traits, codecvt and ctype.
+   class __enc_traits
+   {
+   public:
+     // Types: 
+     // NB: A conversion descriptor subsumes and enhances the
+     // functionality of a simple state type such as mbstate_t.
+     typedef iconv_t	__desc_type;
+     
+   protected:
+     // Data Members:
+     // Max size of charset encoding name
+     static const int 	_S_max_size = 32;
+     // Name of internal character set encoding.
+     char	       	_M_int_enc[_S_max_size];
+     // Name of external character set encoding.
+     char  	       	_M_ext_enc[_S_max_size];
+ 
+     // Conversion descriptor between external encoding to internal encoding.
+     __desc_type		_M_in_desc;
+     // Conversion descriptor between internal encoding to external encoding.
+     __desc_type		_M_out_desc;
+ 
+     // Details the byte-order marker for the external encoding, if necessary.
+     int			_M_ext_bom;
+ 
+     // Details the byte-order marker for the internal encoding, if necessary.
+     int			_M_int_bom;
+ 
+   public:
+     explicit __enc_traits() 
+     : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) 
+     {
+       memset(_M_int_enc, 0, _S_max_size);
+       memset(_M_ext_enc, 0, _S_max_size);
+     }
+ 
+     explicit __enc_traits(const char* __int, const char* __ext, 
+ 			  int __ibom = 0, int __ebom = 0)
+     : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0)
+     {
+       strncpy(_M_int_enc, __int, _S_max_size);
+       strncpy(_M_ext_enc, __ext, _S_max_size);
+     }
+ 
+     // 21.1.2 traits typedefs
+     // p4
+     // typedef STATE_T state_type
+     // requires: state_type shall meet the requirements of
+     // CopyConstructible types (20.1.3)
+     __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0)
+     {
+       strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size);
+       strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size);
+       _M_ext_bom = __obj._M_ext_bom;
+       _M_int_bom = __obj._M_int_bom;
+     }
+ 
+     // Need assignment operator as well.
+     __enc_traits&
+     operator=(const __enc_traits& __obj)
+     {
+       strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size);
+       strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size);
+       _M_in_desc = 0;
+       _M_out_desc = 0;
+       _M_ext_bom = __obj._M_ext_bom;
+       _M_int_bom = __obj._M_int_bom;
+     }
+ 
+     ~__enc_traits()
+     {
+       __desc_type __err = reinterpret_cast(-1);
+       if (_M_in_desc && _M_in_desc != __err) 
+ 	iconv_close(_M_in_desc);
+       if (_M_out_desc && _M_out_desc != __err) 
+ 	iconv_close(_M_out_desc);
+     } 
+ 
+     void
+     _M_init()
+     {
+       const __desc_type __err = reinterpret_cast(-1);
+       if (!_M_in_desc)
+ 	{
+ 	  _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc);
+ 	  if (_M_in_desc == __err)
+ 	    __throw_runtime_error("creating iconv input descriptor failed.");
+ 	}
+       if (!_M_out_desc)
+ 	{
+ 	  _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc);
+ 	  if (_M_out_desc == __err)
+ 	    __throw_runtime_error("creating iconv output descriptor failed.");
+ 	}
+     }
+ 
+     bool
+     _M_good()
+     { 
+       const __desc_type __err = reinterpret_cast(-1);
+       bool __test = _M_in_desc && _M_in_desc != __err; 
+       __test &=  _M_out_desc && _M_out_desc != __err;
+       return __test;
+     }
+ 
+     const __desc_type* 
+     _M_get_in_descriptor()
+     { return &_M_in_desc; }
+ 
+     const __desc_type* 
+     _M_get_out_descriptor()
+     { return &_M_out_desc; }
+ 
+     int 
+     _M_get_external_bom()
+     { return _M_ext_bom; }
+ 
+     int 
+     _M_get_internal_bom()
+     { return _M_int_bom; }
+ 
+     const char* 
+     _M_get_internal_enc()
+     { return _M_int_enc; }
+ 
+     const char* 
+     _M_get_external_enc()
+     { return _M_ext_enc; }
+   };
+ 
+   // Partial specialization
+   // This specialization takes advantage of iconv to provide code
+   // conversions between a large number of character encodings.
+   template
+     class codecvt<_InternT, _ExternT, __enc_traits>
+     : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits>
+     {
+     public:      
+       // Types:
+       typedef codecvt_base::result			result;
+       typedef _InternT 					intern_type;
+       typedef _ExternT 					extern_type;
+       typedef __enc_traits 				state_type;
+       typedef __enc_traits::__desc_type 		__desc_type;
+       typedef __enc_traits				__enc_type;
+ 
+       // Data Members:
+       static locale::id 		id;
+ 
+       explicit 
+       codecvt(size_t __refs = 0)
+       : __codecvt_abstract_base(__refs)
+       { }
+ 
+       explicit 
+       codecvt(__enc_type* __enc, size_t __refs = 0)
+       : __codecvt_abstract_base(__refs)
+       { }
+ 
+     protected:
+       virtual 
+       ~codecvt() { }
+ 
+       virtual result
+       do_out(state_type& __state, const intern_type* __from, 
+ 	     const intern_type* __from_end, const intern_type*& __from_next,
+ 	     extern_type* __to, extern_type* __to_end,
+ 	     extern_type*& __to_next) const;
+ 
+       virtual result
+       do_unshift(state_type& __state, extern_type* __to, 
+ 		 extern_type* __to_end, extern_type*& __to_next) const;
+ 
+       virtual result
+       do_in(state_type& __state, const extern_type* __from, 
+ 	    const extern_type* __from_end, const extern_type*& __from_next,
+ 	    intern_type* __to, intern_type* __to_end, 
+ 	    intern_type*& __to_next) const;
+ 
+       virtual int 
+       do_encoding() const throw();
+ 
+       virtual bool 
+       do_always_noconv() const throw();
+ 
+       virtual int 
+       do_length(const state_type&, const extern_type* __from, 
+ 		const extern_type* __end, size_t __max) const;
+ 
+       virtual int 
+       do_max_length() const throw();
+     };
+ 
+   template
+     locale::id 
+     codecvt<_InternT, _ExternT, __enc_traits>::id;
+ 
+   // This adaptor works around the signature problems of the second
+   // argument to iconv():  SUSv2 and others use 'const char**', but glibc 2.2
+   // uses 'char**', which matches the POSIX 1003.1-2001 standard.
+   // Using this adaptor, g++ will do the work for us.
+   template
+     inline size_t
+     __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*),
+                     iconv_t __cd, char** __inbuf, size_t* __inbytes,
+                     char** __outbuf, size_t* __outbytes)
+     { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); }
+ 
+   template
+     codecvt_base::result
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_out(state_type& __state, const intern_type* __from, 
+ 	   const intern_type* __from_end, const intern_type*& __from_next,
+ 	   extern_type* __to, extern_type* __to_end,
+ 	   extern_type*& __to_next) const
+     {
+       result __ret = error;
+       if (__state._M_good())
+ 	{
+ 	  typedef state_type::__desc_type	__desc_type;
+ 	  const __desc_type* __desc = __state._M_get_out_descriptor();
+ 	  const size_t __fmultiple = sizeof(intern_type);
+ 	  size_t __fbytes = __fmultiple * (__from_end - __from);
+ 	  const size_t __tmultiple = sizeof(extern_type);
+ 	  size_t __tbytes = __tmultiple * (__to_end - __to); 
+ 	  
+ 	  // Argument list for iconv specifies a byte sequence. Thus,
+ 	  // all to/from arrays must be brutally casted to char*.
+ 	  char* __cto = reinterpret_cast(__to);
+ 	  char* __cfrom;
+ 	  size_t __conv;
+ 
+ 	  // Some encodings need a byte order marker as the first item
+ 	  // in the byte stream, to designate endian-ness. The default
+ 	  // value for the byte order marker is NULL, so if this is
+ 	  // the case, it's not necessary and we can just go on our
+ 	  // merry way.
+ 	  int __int_bom = __state._M_get_internal_bom();
+ 	  if (__int_bom)
+ 	    {	  
+ 	      size_t __size = __from_end - __from;
+ 	      intern_type* __cfixed = static_cast(__builtin_alloca(sizeof(intern_type) * (__size + 1)));
+ 	      __cfixed[0] = static_cast(__int_bom);
+ 	      char_traits::copy(__cfixed + 1, __from, __size);
+ 	      __cfrom = reinterpret_cast(__cfixed);
+ 	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+                                         &__fbytes, &__cto, &__tbytes); 
+ 	    }
+ 	  else
+ 	    {
+ 	      intern_type* __cfixed = const_cast(__from);
+ 	      __cfrom = reinterpret_cast(__cfixed);
+ 	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, 
+ 				       &__cto, &__tbytes); 
+ 	    }
+ 
+ 	  if (__conv != size_t(-1))
+ 	    {
+ 	      __from_next = reinterpret_cast(__cfrom);
+ 	      __to_next = reinterpret_cast(__cto);
+ 	      __ret = ok;
+ 	    }
+ 	  else 
+ 	    {
+ 	      if (__fbytes < __fmultiple * (__from_end - __from))
+ 		{
+ 		  __from_next = reinterpret_cast(__cfrom);
+ 		  __to_next = reinterpret_cast(__cto);
+ 		  __ret = partial;
+ 		}
+ 	      else
+ 		__ret = error;
+ 	    }
+ 	}
+       return __ret; 
+     }
+ 
+   template
+     codecvt_base::result
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_unshift(state_type& __state, extern_type* __to, 
+ 	       extern_type* __to_end, extern_type*& __to_next) const
+     {
+       result __ret = error;
+       if (__state._M_good())
+ 	{
+ 	  typedef state_type::__desc_type	__desc_type;
+ 	  const __desc_type* __desc = __state._M_get_in_descriptor();
+ 	  const size_t __tmultiple = sizeof(intern_type);
+ 	  size_t __tlen = __tmultiple * (__to_end - __to); 
+ 	  
+ 	  // Argument list for iconv specifies a byte sequence. Thus,
+ 	  // all to/from arrays must be brutally casted to char*.
+ 	  char* __cto = reinterpret_cast(__to);
+ 	  size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL,
+                                           &__cto, &__tlen); 
+ 	  
+ 	  if (__conv != size_t(-1))
+ 	    {
+ 	      __to_next = reinterpret_cast(__cto);
+ 	      if (__tlen == __tmultiple * (__to_end - __to))
+ 		__ret = noconv;
+ 	      else if (__tlen == 0)
+ 		__ret = ok;
+ 	      else
+ 		__ret = partial;
+ 	    }
+ 	  else 
+ 	    __ret = error;
+ 	}
+       return __ret; 
+     }
+    
+   template
+     codecvt_base::result
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_in(state_type& __state, const extern_type* __from, 
+ 	  const extern_type* __from_end, const extern_type*& __from_next,
+ 	  intern_type* __to, intern_type* __to_end, 
+ 	  intern_type*& __to_next) const
+     { 
+       result __ret = error;
+       if (__state._M_good())
+ 	{
+ 	  typedef state_type::__desc_type	__desc_type;
+ 	  const __desc_type* __desc = __state._M_get_in_descriptor();
+ 	  const size_t __fmultiple = sizeof(extern_type);
+ 	  size_t __flen = __fmultiple * (__from_end - __from);
+ 	  const size_t __tmultiple = sizeof(intern_type);
+ 	  size_t __tlen = __tmultiple * (__to_end - __to); 
+ 	  
+ 	  // Argument list for iconv specifies a byte sequence. Thus,
+ 	  // all to/from arrays must be brutally casted to char*.
+ 	  char* __cto = reinterpret_cast(__to);
+ 	  char* __cfrom;
+ 	  size_t __conv;
+ 
+ 	  // Some encodings need a byte order marker as the first item
+ 	  // in the byte stream, to designate endian-ness. The default
+ 	  // value for the byte order marker is NULL, so if this is
+ 	  // the case, it's not necessary and we can just go on our
+ 	  // merry way.
+ 	  int __ext_bom = __state._M_get_external_bom();
+ 	  if (__ext_bom)
+ 	    {	  
+ 	      size_t __size = __from_end - __from;
+ 	      extern_type* __cfixed =  static_cast(__builtin_alloca(sizeof(extern_type) * (__size + 1)));
+ 	      __cfixed[0] = static_cast(__ext_bom);
+ 	      char_traits::copy(__cfixed + 1, __from, __size);
+ 	      __cfrom = reinterpret_cast(__cfixed);
+ 	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+                                        &__flen, &__cto, &__tlen); 
+ 	    }
+ 	  else
+ 	    {
+ 	      extern_type* __cfixed = const_cast(__from);
+ 	      __cfrom = reinterpret_cast(__cfixed);
+ 	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom,
+                                        &__flen, &__cto, &__tlen); 
+ 	    }
+ 
+ 	  
+ 	  if (__conv != size_t(-1))
+ 	    {
+ 	      __from_next = reinterpret_cast(__cfrom);
+ 	      __to_next = reinterpret_cast(__cto);
+ 	      __ret = ok;
+ 	    }
+ 	  else 
+ 	    {
+ 	      if (__flen < static_cast(__from_end - __from))
+ 		{
+ 		  __from_next = reinterpret_cast(__cfrom);
+ 		  __to_next = reinterpret_cast(__cto);
+ 		  __ret = partial;
+ 		}
+ 	      else
+ 		__ret = error;
+ 	    }
+ 	}
+       return __ret; 
+     }
+   
+   template
+     int 
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_encoding() const throw()
+     {
+       int __ret = 0;
+       if (sizeof(_ExternT) <= sizeof(_InternT))
+ 	__ret = sizeof(_InternT)/sizeof(_ExternT);
+       return __ret; 
+     }
+   
+   template
+     bool 
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_always_noconv() const throw()
+     { return false; }
+   
+   template
+     int 
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_length(const state_type&, const extern_type* __from, 
+ 	      const extern_type* __end, size_t __max) const
+     { return min(__max, static_cast(__end - __from)); }
+ 
+ #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
+ // 74.  Garbled text for codecvt::do_max_length
+   template
+     int 
+     codecvt<_InternT, _ExternT, __enc_traits>::
+     do_max_length() const throw()
+     { return 1; }
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc
*** gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.cc	Mon Mar 11 21:12:57 2002
***************
*** 0 ****
--- 1,49 ----
+ // std::messages implementation details, IEEE 1003.1-200x version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+ #include 
+ 
+ namespace std
+ {
+   // Specializations
+   template<>
+     string
+     messages::do_get(catalog __c, int __setid, int __msgid, 
+ 			   const string& __dfault) const
+     {
+       nl_catd __nlc = reinterpret_cast(__c);
+       return string(catgets(__nlc, __setid, __msgid, __dfault.c_str())); 
+     }
+ }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.h gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.h
*** gcc-3.0.4/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/locale/ieee_1003.1-2001/messages_members.h	Mon Mar 11 21:12:57 2002
***************
*** 0 ****
--- 1,70 ----
+ // std::messages implementation details, IEEE 1003.1-200x version -*- C++ -*-
+ 
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.2.7.1.2  messages virtual functions
+ //
+ 
+ // Written by Benjamin Kosnik 
+ 
+   // Non-virtual member functions.
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::open(const basic_string& __s, const locale& __loc, 
+ 			   const char*) const
+     { return this->do_open(__s, __loc); }
+ 
+   // Virtual member functions.
+   template
+     messages<_CharT>::~messages()
+     { }
+ 
+   template
+     typename messages<_CharT>::catalog 
+     messages<_CharT>::do_open(const basic_string& __s, 
+ 			      const locale&) const
+     { return reinterpret_cast(catopen(__s.c_str(), NL_CAT_LOCALE)); }
+ 
+   template
+     typename messages<_CharT>::string_type  
+     messages<_CharT>::do_get(catalog __c, int __setid, int __msgid, 
+ 			     const string_type& __dfault) const
+     {
+       nl_catd __nlc = reinterpret_cast(__c);
+       char* __msg = catgets(__nlc, __setid, __msgid, 
+ 			    _M_convert_to_char(__dfault));
+       return _M_convert_from_char(__msg);
+     }
+ 
+   template
+     void    
+     messages<_CharT>::do_close(catalog __c) const 
+     { catclose(reinterpret_cast(__c)); }
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/aix/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/aix/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/aix/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/aix/bits/ctype_noninline.h	Tue Jan 22 16:09:24 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 32,43 ****
  //
    
  // Information as gleaned from /usr/include/ctype.h
!   
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 32,54 ----
  //
    
  // Information as gleaned from /usr/include/ctype.h
! 
!   const ctype_base::mask*
!   ctype::classic_table() throw()
!   { return 0; }
! 
!   ctype::ctype(__c_locale, const mask* __table, bool __del, 
! 		     size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
! 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/aix/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/aix/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/aix/bits/os_defines.h	Sat Aug 11 18:12:17 2001
--- gcc-3.1/libstdc++-v3/config/os/aix/bits/os_defines.h	Fri Oct 26 02:13:29 2001
***************
*** 30,49 ****
  #ifndef _GLIBCPP_OS_DEFINES
  #define _GLIBCPP_OS_DEFINES
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
  #undef _XOPEN_SOURCE
  #define _XOPEN_SOURCE 500
  #undef _XOPEN_SOURCE_EXTENDED
  #define _XOPEN_SOURCE_EXTENDED 1
  
! /* off64_t */
  #ifndef _LARGE_FILE_API
  #define _LARGE_FILE_API
  #endif
  
! /* atomic types */
  #ifndef _ALL_SOURCE
  #define _ALL_SOURCE
  #endif
--- 30,49 ----
  #ifndef _GLIBCPP_OS_DEFINES
  #define _GLIBCPP_OS_DEFINES
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  #undef _XOPEN_SOURCE
  #define _XOPEN_SOURCE 500
  #undef _XOPEN_SOURCE_EXTENDED
  #define _XOPEN_SOURCE_EXTENDED 1
  
! // off64_t
  #ifndef _LARGE_FILE_API
  #define _LARGE_FILE_API
  #endif
  
! // atomic types
  #ifndef _ALL_SOURCE
  #define _ALL_SOURCE
  #endif
***************
*** 55,64 ****
  #undef _G_USING_THUNKS
  #define _G_USING_THUNKS 0
  
- #define __glibcpp_long_double_bits 64
- 
  #if !defined(_AIX51) || !defined(__64BIT__)
  #define __glibcpp_wchar_t_bits 16
  #endif
  
  #ifdef __64BIT__
--- 55,63 ----
  #undef _G_USING_THUNKS
  #define _G_USING_THUNKS 0
  
  #if !defined(_AIX51) || !defined(__64BIT__)
  #define __glibcpp_wchar_t_bits 16
+ #define __glibcpp_wchar_t_is_signed false
  #endif
  
  #ifdef __64BIT__
***************
*** 66,69 ****
  #endif
  
  #endif
- 
--- 65,67 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/bsd/freebsd/bits/ctype_noninline.h	Tue Jan 22 16:09:25 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,43 ****
    
  // Information as gleaned from /usr/include/ctype.h
    
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,54 ----
    
  // Information as gleaned from /usr/include/ctype.h
    
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return 0; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL), 
+   _M_table(__table ? __table : classic_table()) 
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/bsd/freebsd/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/bsd/freebsd/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/bsd/freebsd/bits/os_defines.h	Tue Jun 12 23:10:03 2001
--- gcc-3.1/libstdc++-v3/config/os/bsd/freebsd/bits/os_defines.h	Mon Apr 22 20:28:27 2002
***************
*** 29,42 ****
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! #define _GLIBCPP_AVOID_FSEEK 1
  
  #endif
- 
- 
--- 29,39 ----
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
! #define __glibcpp_long_double_bits __glibcpp_double_bits
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/bsd/netbsd/bits/ctype_noninline.h	Tue Jan 22 16:09:25 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,43 ****
    
  // Information as gleaned from /usr/include/ctype.h
    
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(NULL), _M_table(__table == 0 ? (_ctype_ + 1) : __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,52 ----
    
  // Information as gleaned from /usr/include/ctype.h
    
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return 0; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL), _M_table(__table ? __table : _ctype_ + 1)
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), _M_table(__table ? __table : _ctype_ + 1)
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/bsd/netbsd/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/bsd/netbsd/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/bsd/netbsd/bits/os_defines.h	Tue Dec  5 23:25:08 2000
--- gcc-3.1/libstdc++-v3/config/os/bsd/netbsd/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 27,47 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
! 
! /* Settings for NetBSD.  */
! 
! /* __off_t is a typedef declared in stdio.h.  */
! /* #define __off_t off_t */
  
! /* We don't have off64_t */
! /* #define __off64_t off64_t */
  
  #define __ssize_t ssize_t
  
  #endif
- 
- 
--- 27,38 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  #define __ssize_t ssize_t
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/djgpp/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/djgpp/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/djgpp/bits/ctype_noninline.h	Mon May 14 19:48:54 2001
--- gcc-3.1/libstdc++-v3/config/os/djgpp/bits/ctype_noninline.h	Wed Feb 20 17:18:00 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,47 ****
    
  // Information as gleaned from DJGPP 
  
!   ctype::ctype(const mask* __table = 0, bool __del = false, 
! 	size_t __refs = 0) 
!     : __ctype_abstract_base(__refs), 
!       _M_del(__table != 0 && __del), 
!       _M_toupper(__dj_ctype_toupper), 
!       _M_tolower(__dj_ctype_tolower),
!       _M_ctable(NULL), 
!       _M_table(__table == 0 ? __dj_ctype_flags : __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,54 ----
    
  // Information as gleaned from DJGPP 
  
!   const ctype_base::mask*
!   ctype::classic_table() throw()
!   { return 0; }
! 
!   ctype::ctype(__c_locale, const mask* __table, bool __del, 
! 		     size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(__dj_ctype_toupper), _M_tolower(__dj_ctype_tolower),
!   _M_table(__table ? __table : __dj_ctype_flags)  
!   { }
! 
!   ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(__dj_ctype_toupper), _M_tolower(__dj_ctype_tolower),
!   _M_table(__table ? __table : __dj_ctype_flags)  
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/djgpp/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/djgpp/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/djgpp/bits/os_defines.h	Fri Jan 12 19:39:07 2001
--- gcc-3.1/libstdc++-v3/config/os/djgpp/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 29,39 ****
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES
! 
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
  #define __off_t off_t
  #define __off64_t off64_t
--- 29,38 ----
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  #define __off_t off_t
  #define __off64_t off64_t
***************
*** 42,44 ****
--- 41,45 ----
  // FIXME: should there be '#undef POSIX_SOURCE'?
  
  #endif
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_base.h gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_base.h
*** gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_base.h	Thu Dec 14 07:20:36 2000
--- gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_base.h	Wed Jan 16 19:57:27 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_inline.h	Tue Dec 19 19:48:59 2000
--- gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_inline.h	Wed Dec 12 03:22:23 2001
***************
*** 123,130 ****
        ++__low;
      return __low;
    }
- 
- 
- 
- 
- 
--- 123,125 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/generic/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/generic/bits/ctype_noninline.h	Mon Jan 21 04:08:48 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,7 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
! //  Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 32,43 ****
  //
    
  // Information as gleaned from /usr/include/ctype.h
!   
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,55 ----
  //
    
  // Information as gleaned from /usr/include/ctype.h
! 
!   const ctype_base::mask*
!   ctype::classic_table() throw()
!   { return 0; }
! 
!   ctype::ctype(__c_locale, const mask* __table, bool __del, 
! 		     size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table == 0 ? classic_table() : __table) 
!   { }
! 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table == 0 ? classic_table() : __table) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/generic/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/generic/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/generic/bits/os_defines.h	Sat Aug 11 18:12:17 2001
--- gcc-3.1/libstdc++-v3/config/os/generic/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 29,41 ****
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
  
  // System-specific #define, typedefs, corrections, etc, go here.  This
  // file will come before all others.
  
- #ifdef __alpha__
- #define __glibcpp_long_bits 64
- #endif
- 
  #endif
--- 29,37 ----
  
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
  // System-specific #define, typedefs, corrections, etc, go here.  This
  // file will come before all others.
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_base.h gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_base.h
*** gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_base.h	Thu Dec 14 07:20:36 2000
--- gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_base.h	Wed Jan 16 19:57:27 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_inline.h	Tue Dec 19 19:48:59 2000
--- gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_inline.h	Wed Mar 13 06:45:23 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 37,50 ****
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[__c] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = _M_table[*__low++];
      return __high;
    }
  
--- 37,50 ----
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[static_cast(__c)] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = _M_table[static_cast(*__low++)];
      return __high;
    }
  
***************
*** 52,58 ****
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && !(_M_table[*__low] & __m))
        ++__low;
      return __low;
    }
--- 52,59 ----
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && !(_M_table[static_cast(*__low)] & __m))
        ++__low;
      return __low;
    }
***************
*** 62,72 ****
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[*__low] & __m) != 0)
        ++__low;
      return __low;
    }
- 
- 
- 
- 
--- 63,69 ----
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[static_cast(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h	Thu Dec 14 07:20:36 2000
--- gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/ctype_noninline.h	Fri Apr 19 07:59:07 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,7 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
! // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 39,60 ****
    using _C_legacy::__ctype_b;
  #endif
  
    ctype::ctype(const mask* __table, bool __del, size_t __refs) : 
    __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
    _M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
!   _M_ctable(__ctype_b), _M_table(__table == 0 ? _M_ctable : __table) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[static_cast(__c)]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[static_cast(*__low)];
  	++__low;
        }
      return __high;
--- 40,84 ----
    using _C_legacy::__ctype_b;
  #endif
  
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return __ctype_b; }  
+   
+ #if _GLIBCPP_C_LOCALE_GNU
+   ctype::ctype(__c_locale __cloc, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del)
+   {
+     _M_c_locale_ctype = _S_clone_c_locale(__cloc);
+     _M_toupper = _M_c_locale_ctype->__ctype_toupper;
+     _M_tolower = _M_c_locale_ctype->__ctype_tolower;
+     _M_table = __table ? __table : _M_c_locale_ctype->__ctype_b;
+   }
+ #else
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
+   _M_table(__table ? __table : classic_table())
+   { _M_c_locale_ctype = _S_c_locale; }
+ #endif
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) : 
    __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
    _M_toupper(__ctype_toupper), _M_tolower(__ctype_tolower),
!   _M_table(__table ? __table : classic_table())
!   { _M_c_locale_ctype = _S_c_locale; }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[static_cast(__c)]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[static_cast(*__low)];
  	++__low;
        }
      return __high;
***************
*** 62,88 ****
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[static_cast(__c)]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[static_cast(*__low)];
  	++__low;
        }
      return __high;
    }
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
--- 86,100 ----
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[static_cast(__c)]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[static_cast(*__low)];
  	++__low;
        }
      return __high;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/gnu-linux/bits/os_defines.h	Fri Aug 24 17:38:36 2001
--- gcc-3.1/libstdc++-v3/config/os/gnu-linux/bits/os_defines.h	Fri Apr  5 13:44:54 2002
***************
*** 27,36 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
  #define _GLIBCPP_OS_DEFINES 1
  
  // This keeps isanum, et al from being propagated as macros.
  #define __NO_CTYPE 1
  
--- 27,38 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
  #define _GLIBCPP_OS_DEFINES 1
  
+ // System-specific #define, typedefs, corrections, etc, go here.  This
+ // file will come before all others.
+ 
  // This keeps isanum, et al from being propagated as macros.
  #define __NO_CTYPE 1
  
*************** typedef __loff_t __off64_t;
*** 56,83 ****
  // our definitions.
  #define __NO_MATH_INLINES
  
! #endif /* not glibc 2.1 or higher.  */
  
! # if defined __GLIBC__ && __GLIBC__ >= 2
  // We must not see the optimized string functions GNU libc defines.
! #  define __NO_STRING_INLINES
! # endif
! 
! #if defined (__powerpc__) || defined (__s390__)
! #define __glibcpp_wchar_t_is_signed true
  #endif
  
! #if defined (__alpha__) || defined (__powerpc64__) || (defined (__sparc__) && defined(__arch64__)) || defined (__s390x__)
  #define __glibcpp_long_bits 64
  #endif
  
! #if defined (__alpha__) || (defined (__powerpc__) && !defined (__LONG_DOUBLE_128__)) || defined (__s390__)
  #define __glibcpp_long_double_bits 64
  #endif
  
- #if defined (__mc68000__)
- #define __glibcpp_long_double_bits 96
  #endif
- 
- #endif
- 
--- 58,76 ----
  // our definitions.
  #define __NO_MATH_INLINES
  
! #endif 
  
! #if defined __GLIBC__ && __GLIBC__ >= 2
  // We must not see the optimized string functions GNU libc defines.
! #define __NO_STRING_INLINES
  #endif
  
! #if defined(__powerpc64__) || defined(__s390x__) || (defined(__sparc__) && defined(__arch64__))
  #define __glibcpp_long_bits 64
  #endif
  
! #if defined(__sparc__) && !defined(__arch64__)
  #define __glibcpp_long_double_bits 64
  #endif
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/os/hpux/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/hpux/bits/cpu_limits.h	Sat Dec 29 19:18:32 2001
***************
*** 0 ****
--- 1,35 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #ifdef __LP64__
+ #define __glibcpp_long_bits 64
+ #endif
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/ctype_base.h gcc-3.1/libstdc++-v3/config/os/hpux/bits/ctype_base.h
*** gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/ctype_base.h	Wed Mar 14 04:29:32 2001
--- gcc-3.1/libstdc++-v3/config/os/hpux/bits/ctype_base.h	Wed Jan 16 19:57:28 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/hpux/bits/ctype_noninline.h	Mon Jan 21 04:08:49 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,7 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 
! // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 32,43 ****
  //
    
  // Information as gleaned from /usr/include/ctype.h
!   
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(NULL), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,55 ----
  //
    
  // Information as gleaned from /usr/include/ctype.h
! 
!   const ctype_base::mask*
!   ctype::classic_table() throw()
!   { return 0; }
! 
!   ctype::ctype(__c_locale, const mask* __table, bool __del, 
! 		     size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : (const mask *) __SB_masks) 
!   { }
! 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : (const mask *) __SB_masks) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/hpux/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/hpux/bits/os_defines.h	Sat Aug 11 18:12:17 2001
--- gcc-3.1/libstdc++-v3/config/os/hpux/bits/os_defines.h	Tue Apr 30 19:29:24 2002
***************
*** 27,46 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! #ifdef __LP64__
! #define __glibcpp_long_bits 64
! #endif
  
  #endif
--- 27,79 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! #define __glibcpp_wchar_t_is_signed false
! 
! // Use macro form of ctype functions to ensure __SB_masks is defined.
! #define _SB_CTYPE_MACROS 1
! 
! /* HP-UX, for reasons unknown choose to use a different name for
!    the string to [unsigned] long long conversion routines.
! 
!    Furthermore, instead of having the prototypes in stdlib.h like
!    everyone else, they put them into a non-standard header
!    .  Ugh.
! 
!     defines a variety of things, some of which we 
!    probably do not want.  So we don't want to include it here.
  
+    Luckily we can just declare strtoll and strtoull with the
+    __asm extension which effectively renames calls at the
+    source level without namespace pollution.
+ 
+    Also note that the compiler defines _INCLUDE_LONGLONG for C++
+    unconditionally, which makes intmax_t and uintmax_t long long
+    types.
+ 
+    We also force _GLIBCPP_USE_LONG_LONG here so that we don't have
+    to bastardize configure to deal with this sillyness.  */
+ namespace std {
+ #ifndef __LP64__
+   __extension__ extern "C" long long strtoll (const char *, char **, int)
+     __asm  ("__strtoll");
+   __extension__ extern "C" unsigned long long strtoull (const char *, char **, int)
+     __asm  ("__strtoull");
+ #else
+   __extension__ extern "C" long long strtoll (const char *, char **, int)
+     __asm  ("strtol");
+   __extension__ extern "C" unsigned long long strtoull (const char *, char **, int)
+     __asm  ("strtoul");
+ #endif
+ }
+ #define _GLIBCPP_USE_LONG_LONG 1
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/irix/irix5.2/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/irix/irix5.2/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/irix/irix5.2/bits/ctype_noninline.h	Fri Mar 16 03:31:44 2001
--- gcc-3.1/libstdc++-v3/config/os/irix/irix5.2/bits/ctype_noninline.h	Mon Jan 21 04:08:50 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2001 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,7 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2001, 2002
! //  Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,42 ****
    
  // Information as gleaned from /usr/include/ctype.h
  
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
    : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!     _M_toupper(NULL), _M_tolower(NULL), _M_ctable(NULL), 
!     _M_table(!__table ? __ctype : __table)
    { }
  
    char
--- 34,54 ----
    
  // Information as gleaned from /usr/include/ctype.h
  
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return 0; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs)
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL), 
+   _M_table(!__table ? __ctype : __table)
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
    : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(!__table ? __ctype : __table)
    { }
  
    char
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/irix/irix5.2/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/irix/irix5.2/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/irix/irix5.2/bits/os_defines.h	Fri Mar 16 03:31:44 2001
--- gcc-3.1/libstdc++-v3/config/os/irix/irix5.2/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 27,58 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! /* We need large file support.  There are two ways to turn it on:
!    by defining either _LARGEFILE64_SOURCE or _SGI_SOURCE.  However,
!    it does not actually work to define only the former, as then
!     is invalid: `st_blocks' is defined to be a macro,
!    but then used as a field name.  So, we have to turn on 
!    _SGI_SOURCE.  That only works if _POSIX_SOURCE is turned off,
!    so we have to explicitly turn it off.  (Some of the libio C files
!    explicitly try to turn it on.)  _SGI_SOURCE is actually turned on 
!    implicitly via the command-line.  */
  #undef _POSIX_SOURCE
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! /* GCC does not use thunks on IRIX.  */
  #define _G_USING_THUNKS 0
  
  #endif
- 
- 
- 
--- 27,54 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
! // We need large file support.  There are two ways to turn it on: by
! // defining either _LARGEFILE64_SOURCE or _SGI_SOURCE.  However, it
! // does not actually work to define only the former, as then
! //  is invalid: `st_blocks' is defined to be a macro, but
! // then used as a field name.  So, we have to turn on _SGI_SOURCE.
! // That only works if _POSIX_SOURCE is turned off, so we have to
! // explicitly turn it off.  (Some of the libio C files explicitly try
! // to turn it on.)  _SGI_SOURCE is actually turned on implicitly via
! // the command-line.
  #undef _POSIX_SOURCE
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! // GCC does not use thunks on IRIX.
  #define _G_USING_THUNKS 0
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_inline.h	Fri Mar 16 03:31:44 2001
--- gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_inline.h	Wed Mar 13 06:45:25 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 37,50 ****
    bool
    ctype::
    is(mask __m, char __c) const
!   { return (_M_table)[__c] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = (_M_table)[*__low++];
      return __high;
    }
  
--- 37,50 ----
    bool
    ctype::
    is(mask __m, char __c) const
!   { return (_M_table)[static_cast(__c)] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = (_M_table)[static_cast(*__low++)];
      return __high;
    }
  
***************
*** 52,58 ****
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && !((_M_table)[*__low] & __m))
        ++__low;
      return __low;
    }
--- 52,59 ----
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && !((_M_table)[static_cast(*__low)] & __m))
        ++__low;
      return __low;
    }
***************
*** 61,72 ****
    ctype::
    scan_not(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && ((_M_table + 1)[*__low] & __m) != 0)
        ++__low;
      return __low;
    }
- 
- 
- 
- 
- 
--- 62,69 ----
    ctype::
    scan_not(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && ((_M_table + 1)[static_cast(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_noninline.h	Fri Mar 16 03:31:44 2001
--- gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/ctype_noninline.h	Mon Jan 21 04:08:50 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,44 ****
    
  // Information as gleaned from /usr/include/ctype.h
  
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
    : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!     _M_toupper(NULL), _M_tolower(NULL), _M_ctable(NULL), 
!     _M_table(!__table ? 
!              (const mask*) (__libc_attr._ctype_tbl->_class + 1) : __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
--- 33,56 ----
    
  // Information as gleaned from /usr/include/ctype.h
  
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return 0; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs)
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL), 
+   _M_table(!__table ? 
+ 	   (const mask*) (__libc_attr._ctype_tbl->_class + 1) : __table) 
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
    : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(!__table ? 
! 	   (const mask*) (__libc_attr._ctype_tbl->_class + 1) : __table) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/irix/irix6.5/bits/os_defines.h	Sat Aug 11 18:12:17 2001
--- gcc-3.1/libstdc++-v3/config/os/irix/irix6.5/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 27,55 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES
  
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! /* We need large file support.  There are two ways to turn it on:
!    by defining either _LARGEFILE64_SOURCE or _SGI_SOURCE.  However,
!    it does not actually work to define only the former, as then
!     is invalid: `st_blocks' is defined to be a macro,
!    but then used as a field name.  So, we have to turn on 
!    _SGI_SOURCE.  That only works if _POSIX_SOURCE is turned off,
!    so we have to explicitly turn it off.  (Some of the libio C files
!    explicitly try to turn it on.)  _SGI_SOURCE is actually turned on 
!    implicitly via the command-line.  */
  #undef _POSIX_SOURCE
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! /* GCC does not use thunks on IRIX.  */
  #define _G_USING_THUNKS 0
  
  #define __glibcpp_long_double_bits 64
--- 27,54 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
! // We need large file support.  There are two ways to turn it on: by
! // defining either _LARGEFILE64_SOURCE or _SGI_SOURCE.  However, it
! // does not actually work to define only the former, as then
! //  is invalid: `st_blocks' is defined to be a macro, but
! // then used as a field name.  So, we have to turn on _SGI_SOURCE.
! // That only works if _POSIX_SOURCE is turned off, so we have to
! // explicitly turn it off.  (Some of the libio C files explicitly try
! // to turn it on.)  _SGI_SOURCE is actually turned on implicitly via
! // the command-line.
  #undef _POSIX_SOURCE
  
  #define __off_t off_t
  #define __off64_t off64_t
  #define __ssize_t ssize_t
  
! // GCC does not use thunks on IRIX. 
  #define _G_USING_THUNKS 0
  
  #define __glibcpp_long_double_bits 64
***************
*** 60,62 ****
--- 59,62 ----
  #endif
  
  #endif
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_base.h gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_base.h
*** gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_base.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_base.h	Wed Jan 16 19:57:29 2002
***************
*** 0 ****
--- 1,58 ----
+ // Locale support -*- C++ -*-
+ 
+ // Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.1  Locales
+ //
+   
+ // Information, as gleaned from /mingw32/include/ctype.h.
+   
+   struct ctype_base
+   {
+     // Non-standard typedefs.
+     typedef const int* 		__to_type;
+ 
+     // NB: Offsets into ctype::_M_table force a particular size
+     // on the mask type. Because of this, we don't use an enum.
+     typedef unsigned short 	mask;   
+     static const mask upper    	= _UPPER;
+     static const mask lower 	= _LOWER;
+     static const mask alpha 	= _ALPHA;
+     static const mask digit 	= _DIGIT;
+     static const mask xdigit 	= _HEX;
+     static const mask space 	= _SPACE;
+     static const mask print 	= (_BLANK | _PUNCT| _ALPHA | _DIGIT);
+     static const mask graph 	= (_PUNCT | _ALPHA | _DIGIT);
+     static const mask cntrl 	= _CONTROL;
+     static const mask punct 	= _PUNCT;
+     static const mask alnum 	= (_ALPHA | _DIGIT);
+   };
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_inline.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_inline.h	Thu Nov  8 20:52:28 2001
***************
*** 0 ****
--- 1,71 ----
+ // Locale support -*- C++ -*-
+ 
+ // Copyright (C) 2000 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.1  Locales
+ //
+   
+ // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
+ // functions go in ctype.cc
+ 
+ 
+   bool
+   ctype::
+   is(mask __m, char __c) const
+   {
+ 	return (_M_table[static_cast(__c) ] & __m); 
+   }
+    
+  
+   const char*
+   ctype::
+   is(const char* __low, const char* __high, mask* __vec) const 
+   {
+     while (__low < __high)
+       *__vec++ = _M_table[static_cast(*__low++)];
+     return __high;
+   }
+ 
+   const char*
+   ctype::
+   scan_is(mask __m, const char* __low, const char* __high) const
+   {
+     while (__low < __high && !this->is(__m, *__low))
+       ++__low;
+     return __low;
+   }
+ 
+   const char*
+   ctype::
+   scan_not(mask __m, const char* __low, const char* __high) const
+   {
+     while (__low < __high && this->is(__m, *__low) != 0)
+       ++__low;
+     return __low;
+   }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/ctype_noninline.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/mingw32/bits/ctype_noninline.h	Wed Feb 20 17:18:00 2002
***************
*** 0 ****
--- 1,89 ----
+ // Locale support -*- C++ -*-
+ 
+ // Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ //
+ // ISO C++ 14882: 22.1  Locales
+ //
+   
+ // Information as gleaned from /mingw32/include/ctype.h.
+ 
+   // This should be in mingw's ctype.h but isn't in older versions
+   // Static classic C-locale table.  _ctype[0] is EOF
+   extern "C"  unsigned short  __declspec(dllimport) _ctype[];
+ 
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return _ctype + 1; }  
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL),
+   _M_table(__table ? __table : classic_table())  
+   { }
+ 
+   ctype::ctype(const mask* __table, bool __del, size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL),
+   _M_table(__table ? __table : classic_table()) 
+   { }
+ 
+   char
+   ctype::do_toupper(char __c) const
+   { return (this->is(ctype_base::lower, __c) ? (__c - 'a' + 'A') : __c); }
+ 
+   const char*
+   ctype::do_toupper(char* __low, const char* __high) const
+   {
+     while (__low < __high)
+       {
+ 	*__low = this->do_toupper(*__low);
+ 	++__low;
+       }
+     return __high;
+   }
+ 
+   char
+   ctype::do_tolower(char __c) const
+   { return (this->is(ctype_base::upper, __c) ? (__c - 'A' + 'a') : __c); }
+ 
+   const char* 
+   ctype::do_tolower(char* __low, const char* __high) const
+   {
+     while (__low < __high)
+       {
+ 	*__low = this->do_tolower(*__low);
+ 	++__low;
+       }
+     return __high;
+   }
+ 
+ 
+ 
+ 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/mingw32/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/mingw32/bits/os_defines.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/mingw32/bits/os_defines.h	Mon Apr 22 20:28:28 2002
***************
*** 0 ****
--- 1,37 ----
+ // Specific definitions for generic platforms  -*- C++ -*-
+ 
+ // Copyright (C) 2000 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ 
+ #ifndef _GLIBCPP_OS_DEFINES
+ #  define _GLIBCPP_OS_DEFINES
+ 
+ // System-specific #define, typedefs, corrections, etc, go here.  This
+ // file will come before all others.
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h	Thu Dec  7 20:49:09 2000
--- gcc-3.1/libstdc++-v3/config/os/newlib/bits/ctype_noninline.h	Mon Mar 25 23:39:17 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,49 ****
    
  // Information as gleaned from /usr/include/ctype.h
    
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(_ctype_), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
    { 
      int __x = __c;
!     return (this->is(ctype_base::upper, __c) ? (__x - 'A' + 'a') : __x);
    }
  
    const char*
--- 33,60 ----
    
  // Information as gleaned from /usr/include/ctype.h
    
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return _ctype_; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(NULL), _M_tolower(NULL), 
+   _M_table(__table ? __table : classic_table()) 
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
    { 
      int __x = __c;
!     return (this->is(ctype_base::lower, __c) ? (__x - 'a' + 'A') : __x);
    }
  
    const char*
***************
*** 61,67 ****
    ctype::do_tolower(char __c) const
    { 
      int __x = __c;
!     return (this->is(ctype_base::lower, __c) ? (__x - 'A' + 'a') : __x);
    }
  
    const char* 
--- 72,78 ----
    ctype::do_tolower(char __c) const
    { 
      int __x = __c;
!     return (this->is(ctype_base::upper, __c) ? (__x - 'A' + 'a') : __x);
    }
  
    const char* 
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/newlib/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/newlib/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/newlib/bits/os_defines.h	Wed Oct 25 12:50:05 2000
--- gcc-3.1/libstdc++-v3/config/os/newlib/bits/os_defines.h	Tue Oct 23 21:40:29 2001
***************
*** 27,41 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
! 
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
  
  #endif
- 
- 
--- 27,36 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
+ // System-specific #define, typedefs, corrections, etc, go here.  This
+ // file will come before all others.
  
  #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/osf/osf5.0/bits/cpu_limits.h gcc-3.1/libstdc++-v3/config/os/osf/osf5.0/bits/cpu_limits.h
*** gcc-3.0.4/libstdc++-v3/config/os/osf/osf5.0/bits/cpu_limits.h	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/config/os/osf/osf5.0/bits/cpu_limits.h	Sat Dec 29 01:19:51 2001
***************
*** 0 ****
--- 1,35 ----
+ // Copyright (C) 2001 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library 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 this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction.  Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License.  This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+ 
+ #ifndef _GLIBCPP_CPU_LIMITS
+ #define _GLIBCPP_CPU_LIMITS 1
+ 
+ #define __glibcpp_long_bits 64
+ 
+ #define __glibcpp_long_double_bits 128
+ 
+ #endif
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_inline.h	Tue Dec 19 19:48:59 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_inline.h	Wed Mar 13 06:45:26 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 37,50 ****
    bool
    ctype::
    is(mask __m, char __c) const
!   { return (_M_table + 1)[(unsigned char)(__c)] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = (_M_table + 1)[(unsigned char) (*__low++)];
      return __high;
    }
  
--- 37,50 ----
    bool
    ctype::
    is(mask __m, char __c) const
!   { return (_M_table + 1)[static_cast(__c)] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = (_M_table + 1)[static_cast(*__low++)];
      return __high;
    }
  
***************
*** 52,58 ****
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && !((_M_table + 1)[(unsigned char)(*__low)] & __m))
        ++__low;
      return __low;
    }
--- 52,59 ----
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && !((_M_table + 1)[static_cast(*__low)] & __m))
        ++__low;
      return __low;
    }
***************
*** 62,68 ****
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && ((_M_table + 1)[(unsigned char)(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
--- 63,69 ----
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && ((_M_table + 1)[static_cast(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h	Thu Dec  7 20:49:10 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/ctype_noninline.h	Wed Mar 13 06:45:26 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Cygnus Solutions
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 32,47 ****
  //
    
  // Information as gleaned from /usr/include/ctype.h
!   
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(NULL), _M_tolower(NULL),
!       _M_ctable(__ctype), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
!   { return ((_M_table + 258)[static_cast(__c)]); }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
--- 32,58 ----
  //
    
  // Information as gleaned from /usr/include/ctype.h
! 
!   const ctype_base::mask*
!   ctype::classic_table() throw()
!   { return 0; }
! 
!   ctype::ctype(__c_locale, const mask* __table, bool __del, 
! 		     size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
! 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(NULL), _M_tolower(NULL), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
!   { return ((_M_table + 258)[static_cast(__c)]); }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
***************
*** 56,62 ****
  
    char
    ctype::do_tolower(char __c) const
!   { return ((_M_table + 258)[static_cast(__c)]); }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
--- 67,73 ----
  
    char
    ctype::do_tolower(char __c) const
!   { return ((_M_table + 258)[static_cast(__c)]); }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
***************
*** 68,72 ****
        }
      return __high;
    }
- 
- 
--- 79,81 ----
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.5/bits/os_defines.h	Tue Jun 12 23:10:04 2001
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.5/bits/os_defines.h	Mon Apr 22 20:28:29 2002
***************
*** 27,40 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! #define _GLIBCPP_AVOID_FSEEK 1
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
--- 27,37 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_inline.h	Thu Dec 14 09:19:56 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_inline.h	Wed Mar 13 06:45:28 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 37,43 ****
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[__c] & __m; }
  
    const char*
    ctype::
--- 37,43 ----
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[static_cast(__c)] & __m; }
  
    const char*
    ctype::
***************
*** 46,52 ****
      const int __bitmasksize = sizeof(mask) * 8;
      for (;__low < __high; ++__vec, ++__low)
        {
! 	mask __m = _M_table[*__low];
  	int __i = 0; // Lowest bitmask value from ctype_base.
  	while (__i < __bitmasksize && !(__m & static_cast(1 << __i)))
  	  ++__i;
--- 46,52 ----
      const int __bitmasksize = sizeof(mask) * 8;
      for (;__low < __high; ++__vec, ++__low)
        {
! 	mask __m = _M_table[static_cast(*__low)];
  	int __i = 0; // Lowest bitmask value from ctype_base.
  	while (__i < __bitmasksize && !(__m & static_cast(1 << __i)))
  	  ++__i;
***************
*** 59,65 ****
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && !(_M_table[*__low] & __m))
        ++__low;
      return __low;
    }
--- 59,66 ----
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && !(_M_table[static_cast(*__low)] & __m))
        ++__low;
      return __low;
    }
***************
*** 69,75 ****
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[*__low] & __m) != 0)
        ++__low;
      return __low;
    }
--- 70,76 ----
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[static_cast(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h	Thu Dec  7 20:49:10 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/ctype_noninline.h	Wed Mar 13 06:45:28 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Cygnus Solutions
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,54 ****
    
  // Information as gleaned from /usr/include/ctype.h
    
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(__trans_upper), _M_tolower(__trans_lower),
!       _M_ctable(__ctype_mask), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[(int) __c]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[(int) *__low];
  	++__low;
        }
      return __high;
--- 33,65 ----
    
  // Information as gleaned from /usr/include/ctype.h
    
+   const ctype_base::mask*
+   ctype::classic_table() throw()
+   { return 0; }  
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs) 
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(__trans_upper), _M_tolower(__trans_lower), 
+   _M_table(__table ? __table : classic_table()) 
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs) 
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(__trans_upper), _M_tolower(__trans_lower), 
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[static_cast(__c)]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[static_cast(*__low)];
  	++__low;
        }
      return __high;
***************
*** 56,69 ****
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[(int) __c]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[(int) *__low];
  	++__low;
        }
      return __high;
--- 67,80 ----
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[static_cast(__c)]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[static_cast(*__low)];
  	++__low;
        }
      return __high;
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.6/bits/os_defines.h	Tue Jun 12 23:10:05 2001
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.6/bits/os_defines.h	Mon Apr 22 20:28:30 2002
***************
*** 27,40 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! #define _GLIBCPP_AVOID_FSEEK 1
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
--- 27,37 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_inline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_inline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_inline.h	Tue Dec 19 19:49:00 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_inline.h	Wed Mar 13 06:45:29 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,6 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 37,50 ****
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[__c] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = _M_table[*__low++];
      return __high;
    }
  
--- 37,50 ----
    bool
    ctype::
    is(mask __m, char __c) const
!   { return _M_table[static_cast(__c)] & __m; }
  
    const char*
    ctype::
    is(const char* __low, const char* __high, mask* __vec) const
    {
      while (__low < __high)
!       *__vec++ = _M_table[static_cast(*__low++)];
      return __high;
    }
  
***************
*** 52,58 ****
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high && !(_M_table[*__low] & __m))
        ++__low;
      return __low;
    }
--- 52,59 ----
    ctype::
    scan_is(mask __m, const char* __low, const char* __high) const
    {
!     while (__low < __high 
! 	   && !(_M_table[static_cast(*__low)] & __m))
        ++__low;
      return __low;
    }
***************
*** 62,68 ****
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[*__low] & __m) != 0)
        ++__low;
      return __low;
    }
--- 63,69 ----
    scan_not(mask __m, const char* __low, const char* __high) const
    {
      while (__low < __high 
! 	   && (_M_table[static_cast(*__low)] & __m) != 0)
        ++__low;
      return __low;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h	Thu Dec  7 20:49:10 2000
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/ctype_noninline.h	Tue Apr 30 09:19:28 2002
***************
*** 1,6 ****
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997-1999, 2000 Cygnus Solutions
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
--- 1,7 ----
  // Locale support -*- C++ -*-
  
! // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
! // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
  // software; you can redistribute it and/or modify it under the
***************
*** 33,54 ****
    
  // Information as gleaned from /usr/include/ctype.h
    
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
!     : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!       _M_toupper(__trans_upper), _M_tolower(__trans_lower),
!       _M_ctable(__ctype_mask), _M_table(__table == 0 ? _M_ctable: __table) 
!     { }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[(int) __c]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[(int) *__low];
  	++__low;
        }
      return __high;
--- 34,66 ----
    
  // Information as gleaned from /usr/include/ctype.h
    
+   const ctype_base::mask* 
+   ctype::classic_table() throw()
+   { return __ctype_mask; }
+ 
+   ctype::ctype(__c_locale, const mask* __table, bool __del, 
+ 		     size_t __refs)
+   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
+   _M_toupper(__trans_upper), _M_tolower(__trans_lower),
+   _M_table(__table ? __table : classic_table()) 
+   { }
+ 
    ctype::ctype(const mask* __table, bool __del, size_t __refs)
!   : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del), 
!   _M_toupper(__trans_upper), _M_tolower(__trans_lower),
!   _M_table(__table ? __table : classic_table()) 
!   { }
  
    char
    ctype::do_toupper(char __c) const
!   { return _M_toupper[static_cast(__c)]; }
  
    const char*
    ctype::do_toupper(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_toupper[static_cast(*__low)];
  	++__low;
        }
      return __high;
***************
*** 56,72 ****
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[(int) __c]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[(int) *__low];
  	++__low;
        }
      return __high;
    }
- 
- 
--- 68,82 ----
  
    char
    ctype::do_tolower(char __c) const
!   { return _M_tolower[static_cast(__c)]; }
  
    const char* 
    ctype::do_tolower(char* __low, const char* __high) const
    {
      while (__low < __high)
        {
! 	*__low = _M_tolower[static_cast(*__low)];
  	++__low;
        }
      return __high;
    }
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/os_defines.h gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/os_defines.h
*** gcc-3.0.4/libstdc++-v3/config/os/solaris/solaris2.7/bits/os_defines.h	Sat Aug 11 18:12:17 2001
--- gcc-3.1/libstdc++-v3/config/os/solaris/solaris2.7/bits/os_defines.h	Mon Apr 22 20:28:32 2002
***************
*** 27,40 ****
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
- 
  #ifndef _GLIBCPP_OS_DEFINES
! #  define _GLIBCPP_OS_DEFINES
! 
! /* System-specific #define, typedefs, corrections, etc, go here.  This
!    file will come before all others. */
  
! #define _GLIBCPP_AVOID_FSEEK 1
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
--- 27,37 ----
  // invalidate any other reasons why the executable file might be covered by
  // the GNU General Public License.
  
  #ifndef _GLIBCPP_OS_DEFINES
! #define _GLIBCPP_OS_DEFINES 1
  
! // System-specific #define, typedefs, corrections, etc, go here.  This
! // file will come before all others.
  
  // These are typedefs which libio assumes are already in place (because
  // they really are, under Linux).
***************
*** 45,51 ****
  // Without this all the libio vtbls are offset wrongly.
  #define _G_USING_THUNKS 0
  
! #if defined(__sparc_v9) || defined(__arch64__)
  #define __glibcpp_long_bits 64
  #endif
  
--- 42,48 ----
  // Without this all the libio vtbls are offset wrongly.
  #define _G_USING_THUNKS 0
  
! #if defined(__sparcv9) || defined(__arch64__)
  #define __glibcpp_long_bits 64
  #endif
  
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/config.h.in gcc-3.1/libstdc++-v3/config.h.in
*** gcc-3.0.4/libstdc++-v3/config.h.in	Mon Jan 14 18:29:05 2002
--- gcc-3.1/libstdc++-v3/config.h.in	Mon Mar 25 21:00:56 2002
***************
*** 15,29 ****
  // Define if C99 features such as lldiv_t, llabs, lldiv should be exposed.
  #undef _GLIBCPP_USE_C99
  
- // Include support for shadow headers, ie --enable-cshadow-headers.
- #undef _GLIBCPP_USE_SHADOW_HEADERS
- 
  // Define if code specialized for wchar_t should be used.
  #undef _GLIBCPP_USE_WCHAR_T
  
  // Define if using setrlimit to limit memory usage during 'make check'.
  #undef _GLIBCPP_MEM_LIMITS
  
  // Define if mbstate_t exists in wchar.h.
  #undef HAVE_MBSTATE_T
  
--- 15,29 ----
  // Define if C99 features such as lldiv_t, llabs, lldiv should be exposed.
  #undef _GLIBCPP_USE_C99
  
  // Define if code specialized for wchar_t should be used.
  #undef _GLIBCPP_USE_WCHAR_T
  
  // Define if using setrlimit to limit memory usage during 'make check'.
  #undef _GLIBCPP_MEM_LIMITS
  
+ // Define to use concept checking code from the boost libraries.
+ #undef _GLIBCPP_CONCEPT_CHECKS
+ 
  // Define if mbstate_t exists in wchar.h.
  #undef HAVE_MBSTATE_T
  
***************
*** 33,38 ****
--- 33,50 ----
  // Define if you have the modfl function.
  #undef HAVE_MODFL
  
+ // Define if you have the expf function.
+ #undef HAVE_EXPF
+ 
+ // Define if you have the expl function.
+ #undef HAVE_EXPL
+ 
+ // Define if you have the hypotf function.
+ #undef HAVE_HYPOTF
+ 
+ // Define if you have the hypotl function.
+ #undef HAVE_HYPOTL
+ 
  // Define if the compiler/host combination has __builtin_abs
  #undef HAVE___BUILTIN_ABS
  
***************
*** 66,73 ****
  // Define if the compiler/host combination has __builtin_sinl
  #undef HAVE___BUILTIN_SINL
  
! // Define if the compiler/host combination has __builtin_fsqrt
! #undef HAVE___BUILTIN_FSQRT
  
  // Define if the compiler/host combination has __builtin_sqrtf
  #undef HAVE___BUILTIN_SQRTF
--- 78,85 ----
  // Define if the compiler/host combination has __builtin_sinl
  #undef HAVE___BUILTIN_SINL
  
! // Define if the compiler/host combination has __builtin_sqrt
! #undef HAVE___BUILTIN_SQRT
  
  // Define if the compiler/host combination has __builtin_sqrtf
  #undef HAVE___BUILTIN_SQRTF
***************
*** 78,83 ****
--- 90,104 ----
  // Define if LC_MESSAGES is available in .
  #undef HAVE_LC_MESSAGES
  
+ /* Define if you have the __signbit function.  */
+ #undef HAVE___SIGNBIT
+ 
+ /* Define if you have the __signbitf function.  */
+ #undef HAVE___SIGNBITF
+ 
+ /* Define if you have the __signbitl function.  */
+ #undef HAVE___SIGNBITL
+ 
  /* Define if you have the _acosf function.  */
  #undef HAVE__ACOSF
  
***************
*** 126,131 ****
--- 147,155 ----
  /* Define if you have the _cosl function.  */
  #undef HAVE__COSL
  
+ /* Define if you have the _expf function.  */
+ #undef HAVE__EXPF
+ 
  /* Define if you have the _expl function.  */
  #undef HAVE__EXPL
  
***************
*** 321,326 ****
--- 345,353 ----
  /* Define if you have the drand48 function.  */
  #undef HAVE_DRAND48
  
+ /* Define if you have the expf function.  */
+ #undef HAVE_EXPF
+ 
  /* Define if you have the expl function.  */
  #undef HAVE_EXPL
  
***************
*** 483,490 ****
  /* Define if you have the qfpclass function.  */
  #undef HAVE_QFPCLASS
  
! /* Define if you have the signbitl function.  */
! #undef HAVE_SIGNBITL
  
  /* Define if you have the sincos function.  */
  #undef HAVE_SINCOS
--- 510,517 ----
  /* Define if you have the qfpclass function.  */
  #undef HAVE_QFPCLASS
  
! /* Define if you have the setenv function.  */
! #undef HAVE_SETENV
  
  /* Define if you have the sincos function.  */
  #undef HAVE_SINCOS
***************
*** 513,518 ****
--- 540,548 ----
  /* Define if you have the sqrtl function.  */
  #undef HAVE_SQRTL
  
+ /* Define if you have the strtof function.  */
+ #undef HAVE_STRTOF
+ 
  /* Define if you have the strtold function.  */
  #undef HAVE_STRTOLD
  
***************
*** 702,707 ****
--- 732,740 ----
  /* Define if you have the  header file.  */
  #undef HAVE_WCHAR_H
  
+ /* Define if you have the  header file.  */
+ #undef HAVE_WCTYPE_H
+ 
  /* Define if you have the m library (-lm).  */
  #undef HAVE_LIBM
  
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/configure gcc-3.1/libstdc++-v3/configure
*** gcc-3.0.4/libstdc++-v3/configure	Fri Jan 18 22:58:25 2002
--- gcc-3.1/libstdc++-v3/configure	Wed May  8 04:27:59 2002
*************** ac_help=
*** 12,24 ****
  ac_default_prefix=/usr/local
  # Any additions from configure.in:
  ac_help="$ac_help
    --with-target-subdir=SUBDIR
!                            configuring in a subdirectory"
  ac_help="$ac_help
    --with-cross-host=HOST  configuring with a cross compiler"
  ac_help="$ac_help
-   --enable-multilib       build hella library versions (default)"
- ac_help="$ac_help
    --enable-maintainer-mode enable make rules and dependencies not useful
                            (and sometimes confusing) to the casual installer"
  ac_help="$ac_help
--- 12,24 ----
  ac_default_prefix=/usr/local
  # Any additions from configure.in:
  ac_help="$ac_help
+   --enable-multilib       build hella library versions (default)"
+ ac_help="$ac_help
    --with-target-subdir=SUBDIR
!                           configuring in a subdirectory"
  ac_help="$ac_help
    --with-cross-host=HOST  configuring with a cross compiler"
  ac_help="$ac_help
    --enable-maintainer-mode enable make rules and dependencies not useful
                            (and sometimes confusing) to the casual installer"
  ac_help="$ac_help
*************** ac_help="$ac_help
*** 44,52 ****
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    "
  ac_help="$ac_help
    --enable-c-mbchar       enable multibyte (wide) characters [default=yes]"
  ac_help="$ac_help
!   --enable-c99      turns on 'ISO/IEC 9899:1999 support' [default=yes]"
  ac_help="$ac_help
    --enable-long-long      turns on 'long long' [default=yes]"
  ac_help="$ac_help
--- 44,54 ----
    --enable-clocale=MODEL  use MODEL target-speific locale package. [default=generic]
    "
  ac_help="$ac_help
+   --enable-nls            use Native Language Support (default)"
+ ac_help="$ac_help
    --enable-c-mbchar       enable multibyte (wide) characters [default=yes]"
  ac_help="$ac_help
!   --enable-c99            turns on 'ISO/IEC 9899:1999 support' [default=yes]"
  ac_help="$ac_help
    --enable-long-long      turns on 'long long' [default=yes]"
  ac_help="$ac_help
*************** ac_help="$ac_help
*** 57,62 ****
--- 59,70 ----
  ac_help="$ac_help
    --enable-sjlj-exceptions  force use of builtin_setjmp for exceptions"
  ac_help="$ac_help
+   --enable-libunwind-exceptions  force use of libunwind for exceptions"
+ ac_help="$ac_help
+   --enable-concept-checks use Boost-derived template checks [default=no]"
+ ac_help="$ac_help
+   --enable-symvers=style  enables symbol versioning of the shared library [default=yes]"
+ ac_help="$ac_help
    --with-gxx-include-dir  the installation directory for include files"
  ac_help="$ac_help
    --enable-version-specific-runtime-libs    Specify that runtime libraries should be installed in a compiler-specific directory "
*************** program_suffix=NONE
*** 77,82 ****
--- 85,91 ----
  program_transform_name=s,x,x,
  silent=
  site=
+ sitefile=
  srcdir=
  target=NONE
  verbose=
*************** Configuration:
*** 191,196 ****
--- 200,206 ----
    --help                  print this message
    --no-create             do not create output files
    --quiet, --silent       do not print \`checking...' messages
+   --site-file=FILE        use FILE as the site file
    --version               print the version of autoconf that created configure
  Directory and file names:
    --prefix=PREFIX         install architecture-independent files in PREFIX
*************** EOF
*** 361,366 ****
--- 371,381 ----
    -site=* | --site=* | --sit=*)
      site="$ac_optarg" ;;
  
+   -site-file | --site-file | --site-fil | --site-fi | --site-f)
+     ac_prev=sitefile ;;
+   -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+     sitefile="$ac_optarg" ;;
+ 
    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
      ac_prev=srcdir ;;
    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
*************** fi
*** 526,537 ****
  srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
  
  # Prefer explicitly selected file to automatically selected ones.
! if test -z "$CONFIG_SITE"; then
!   if test "x$prefix" != xNONE; then
!     CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
!   else
!     CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
    fi
  fi
  for ac_site_file in $CONFIG_SITE; do
    if test -r "$ac_site_file"; then
--- 541,556 ----
  srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
  
  # Prefer explicitly selected file to automatically selected ones.
! if test -z "$sitefile"; then
!   if test -z "$CONFIG_SITE"; then
!     if test "x$prefix" != xNONE; then
!       CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
!     else
!       CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
!     fi
    fi
+ else
+   CONFIG_SITE="$sitefile"
  fi
  for ac_site_file in $CONFIG_SITE; do
    if test -r "$ac_site_file"; then
*************** fi
*** 571,596 ****
  
  
  
! # When building with srcdir == objdir, links to the source files will
! # be created in directories within the target_subdir.  We have to
! # adjust toplevel_srcdir accordingly, so that configure finds
! # install-sh and other auxiliary files that live in the top-level
! # source directory.
! if test "${srcdir}" = "."; then
!   if test -z "${with_target_subdir}"; then
!     toprel=".."
!   else
!     if test "${with_target_subdir}" != "."; then
!       toprel="${with_multisrctop}../.."
!     else
!       toprel="${with_multisrctop}.."
!     fi
!   fi
! else
!   toprel=".."
! fi
  ac_aux_dir=
! for ac_dir in ${srcdir}/$toprel $srcdir/${srcdir}/$toprel; do
    if test -f $ac_dir/install-sh; then
      ac_aux_dir=$ac_dir
      ac_install_sh="$ac_aux_dir/install-sh -c"
--- 590,616 ----
  
  
  
! # This works around the fact that libtool configuration may change LD
! # for this particular configuration, but some shells, instead of
! # keeping the changes in LD private, export them just because LD is
! # exported.
! ORIGINAL_LD_FOR_MULTILIBS=$LD
! 
! PACKAGE=libstdc++
! 
! # For typical GNU versioning info, format is MAJOR.MINOR.MICRO
! release_VERSION=3.1.0
! 
! # For libtool versioning info, format is CURRENT:REVISION:AGE
! libtool_VERSION=4:0:0
! 
! 
! # Gets build, host, target, *_vendor, *_cpu, *_os, etc.
! # AC 2.5x sets target_alias iff the user specified --target, but we use it
! # everywhere, so we set it here just to be sure.  In AC 2.13
! # AC_CANONICAL_TARGET was known as AC_CANONICAL_SYSTEM.
  ac_aux_dir=
! for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
    if test -f $ac_dir/install-sh; then
      ac_aux_dir=$ac_dir
      ac_install_sh="$ac_aux_dir/install-sh -c"
*************** for ac_dir in ${srcdir}/$toprel $srcdir/
*** 602,621 ****
    fi
  done
  if test -z "$ac_aux_dir"; then
!   { echo "configure: error: can not find install-sh or install.sh in ${srcdir}/$toprel $srcdir/${srcdir}/$toprel" 1>&2; exit 1; }
  fi
  ac_config_guess=$ac_aux_dir/config.guess
  ac_config_sub=$ac_aux_dir/config.sub
  ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
  
- toplevel_srcdir=\${top_srcdir}/$toprel
- 
- 
- 
- 
- # Gets and sets build, host, target, *_vendor, *_cpu, *_os, etc.
- # AC 2.50 sets target_alias iff the user specified --target, but we use it
- # everywhere, so we set it here just to be sure.
  
  # Do some error checking and defaulting for the host and target type.
  # The inputs are:
--- 622,633 ----
    fi
  done
  if test -z "$ac_aux_dir"; then
!   { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
  fi
  ac_config_guess=$ac_aux_dir/config.guess
  ac_config_sub=$ac_aux_dir/config.sub
  ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
  
  
  # Do some error checking and defaulting for the host and target type.
  # The inputs are:
*************** else { echo "configure: error: can not r
*** 644,650 ****
  fi
  
  echo $ac_n "checking host system type""... $ac_c" 1>&6
! echo "configure:648: checking host system type" >&5
  
  host_alias=$host
  case "$host_alias" in
--- 656,662 ----
  fi
  
  echo $ac_n "checking host system type""... $ac_c" 1>&6
! echo "configure:660: checking host system type" >&5
  
  host_alias=$host
  case "$host_alias" in
*************** host_os=`echo $host | sed 's/^\([^-]*\)-
*** 665,671 ****
  echo "$ac_t""$host" 1>&6
  
  echo $ac_n "checking target system type""... $ac_c" 1>&6
! echo "configure:669: checking target system type" >&5
  
  target_alias=$target
  case "$target_alias" in
--- 677,683 ----
  echo "$ac_t""$host" 1>&6
  
  echo $ac_n "checking target system type""... $ac_c" 1>&6
! echo "configure:681: checking target system type" >&5
  
  target_alias=$target
  case "$target_alias" in
*************** target_os=`echo $target | sed 's/^\([^-]
*** 683,689 ****
  echo "$ac_t""$target" 1>&6
  
  echo $ac_n "checking build system type""... $ac_c" 1>&6
! echo "configure:687: checking build system type" >&5
  
  build_alias=$build
  case "$build_alias" in
--- 695,701 ----
  echo "$ac_t""$target" 1>&6
  
  echo $ac_n "checking build system type""... $ac_c" 1>&6
! echo "configure:699: checking build system type" >&5
  
  build_alias=$build
  case "$build_alias" in
*************** test "$host_alias" != "$target_alias" &&
*** 708,753 ****
  target_alias=${target_alias-$target}
  
  
- # Will set LN_S to either 'ln -s' or 'ln'.  With autoconf 2.50+, can also
- # be 'cp -p' if linking isn't available.
- echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
- echo "configure:715: checking whether ln -s works" >&5
- if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
-   echo $ac_n "(cached) $ac_c" 1>&6
- else
-   rm -f conftestdata
- if ln -s X conftestdata 2>/dev/null
- then
-   rm -f conftestdata
-   ac_cv_prog_LN_S="ln -s"
- else
-   ac_cv_prog_LN_S=ln
- fi
- fi
- LN_S="$ac_cv_prog_LN_S"
- if test "$ac_cv_prog_LN_S" = "ln -s"; then
-   echo "$ac_t""yes" 1>&6
- else
-   echo "$ac_t""no" 1>&6
- fi
- 
- 
- # We use these options to decide which functions to include.
- # Check whether --with-target-subdir or --without-target-subdir was given.
- if test "${with_target_subdir+set}" = set; then
-   withval="$with_target_subdir"
-   :
- fi
- 
- # Check whether --with-cross-host or --without-cross-host was given.
- if test "${with_cross_host+set}" = set; then
-   withval="$with_cross_host"
-   :
- fi
- 
- 
- # Runs configure.host and configure.target. Have to run this before
- # the GLIBCPP_ENABLE_* macros below.
  # Find a good install program.  We prefer a C program (faster),
  # so one script is as good as another.  But avoid the broken or
  # incompatible versions:
--- 720,725 ----
*************** fi
*** 760,766 ****
  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
  # ./install, which can be erroneously created by make from ./install.sh.
  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
! echo "configure:764: checking for a BSD compatible install" >&5
  if test -z "$INSTALL"; then
  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 732,738 ----
  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
  # ./install, which can be erroneously created by make from ./install.sh.
  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
! echo "configure:736: checking for a BSD compatible install" >&5
  if test -z "$INSTALL"; then
  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR
*** 813,819 ****
  test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
  
  echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
! echo "configure:817: checking whether build environment is sane" >&5
  # Just in case
  sleep 1
  echo timestamp > conftestfile
--- 785,791 ----
  test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
  
  echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
! echo "configure:789: checking whether build environment is sane" >&5
  # Just in case
  sleep 1
  echo timestamp > conftestfile
*************** test "$program_suffix" != NONE &&
*** 870,876 ****
  test "$program_transform_name" = "" && program_transform_name="s,x,x,"
  
  echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
! echo "configure:874: checking whether ${MAKE-make} sets \${MAKE}" >&5
  set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 842,848 ----
  test "$program_transform_name" = "" && program_transform_name="s,x,x,"
  
  echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
! echo "configure:846: checking whether ${MAKE-make} sets \${MAKE}" >&5
  set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 896,901 ****
--- 868,965 ----
    SET_MAKE="MAKE=${MAKE-make}"
  fi
  
+ 
+ PACKAGE=$PACKAGE
+ 
+ VERSION=$release_VERSION
+ 
+ if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+ fi
+ cat >> confdefs.h <> confdefs.h <&6
+ echo "configure:892: checking for working aclocal" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+ if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+    ACLOCAL=aclocal
+    echo "$ac_t""found" 1>&6
+ else
+    ACLOCAL="$missing_dir/missing aclocal"
+    echo "$ac_t""missing" 1>&6
+ fi
+ 
+ echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+ echo "configure:905: checking for working autoconf" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+ if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+    AUTOCONF=autoconf
+    echo "$ac_t""found" 1>&6
+ else
+    AUTOCONF="$missing_dir/missing autoconf"
+    echo "$ac_t""missing" 1>&6
+ fi
+ 
+ echo $ac_n "checking for working automake""... $ac_c" 1>&6
+ echo "configure:918: checking for working automake" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+ if (automake --version) < /dev/null > /dev/null 2>&1; then
+    AUTOMAKE=automake
+    echo "$ac_t""found" 1>&6
+ else
+    AUTOMAKE="$missing_dir/missing automake"
+    echo "$ac_t""missing" 1>&6
+ fi
+ 
+ echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+ echo "configure:931: checking for working autoheader" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+ if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+    AUTOHEADER=autoheader
+    echo "$ac_t""found" 1>&6
+ else
+    AUTOHEADER="$missing_dir/missing autoheader"
+    echo "$ac_t""missing" 1>&6
+ fi
+ 
+ echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+ echo "configure:944: checking for working makeinfo" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+ if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+    MAKEINFO=makeinfo
+    echo "$ac_t""found" 1>&6
+ else
+    MAKEINFO="$missing_dir/missing makeinfo"
+    echo "$ac_t""missing" 1>&6
+ fi
+ 
+ 
+ 
+ 
+ 
+ 
+ # Runs configure.host and configure.target, as well as finds CC, CXX
+ # and assorted other critical bits.  Have to run this before the
+ # GLIBCPP_ENABLE_* macros below.
  if test $host != $build; then
    ac_tool_prefix=${host_alias}-
  else
*************** else
*** 903,914 ****
  fi
  
  echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
! echo "configure:907: checking for Cygwin environment" >&5
  if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:971: checking for Cygwin environment" >&5
  if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_cygwin=yes
  else
--- 983,989 ----
  return __CYGWIN__;
  ; return 0; }
  EOF
! if { (eval echo configure:987: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_cygwin=yes
  else
*************** echo "$ac_t""$ac_cv_cygwin" 1>&6
*** 936,954 ****
  CYGWIN=
  test "$ac_cv_cygwin" = yes && CYGWIN=yes
  echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
! echo "configure:940: checking for mingw32 environment" >&5
  if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_mingw32=yes
  else
--- 1000,1018 ----
  CYGWIN=
  test "$ac_cv_cygwin" = yes && CYGWIN=yes
  echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
! echo "configure:1004: checking for mingw32 environment" >&5
  if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_mingw32=yes
  else
*************** else
*** 977,1070 ****
    multilib=yes
  fi
  
!   glibcpp_basedir=$srcdir/$toprel/./libstdc++-v3
    
  
    
- PACKAGE=libstdc++
  
! VERSION=3.0.0
  
! if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
!   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
  fi
! cat >> confdefs.h <> confdefs.h <&6
! echo "configure:1004: checking for working aclocal" >&5
! # Run test in a subshell; some versions of sh will print an error if
! # an executable is not found, even if stderr is redirected.
! # Redirect stdin to placate older versions of autoconf.  Sigh.
! if (aclocal --version) < /dev/null > /dev/null 2>&1; then
!    ACLOCAL=aclocal
!    echo "$ac_t""found" 1>&6
  else
!    ACLOCAL="$missing_dir/missing aclocal"
!    echo "$ac_t""missing" 1>&6
  fi
  
! echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
! echo "configure:1017: checking for working autoconf" >&5
! # Run test in a subshell; some versions of sh will print an error if
! # an executable is not found, even if stderr is redirected.
! # Redirect stdin to placate older versions of autoconf.  Sigh.
! if (autoconf --version) < /dev/null > /dev/null 2>&1; then
!    AUTOCONF=autoconf
!    echo "$ac_t""found" 1>&6
  else
!    AUTOCONF="$missing_dir/missing autoconf"
!    echo "$ac_t""missing" 1>&6
  fi
! 
! echo $ac_n "checking for working automake""... $ac_c" 1>&6
! echo "configure:1030: checking for working automake" >&5
! # Run test in a subshell; some versions of sh will print an error if
! # an executable is not found, even if stderr is redirected.
! # Redirect stdin to placate older versions of autoconf.  Sigh.
! if (automake --version) < /dev/null > /dev/null 2>&1; then
!    AUTOMAKE=automake
!    echo "$ac_t""found" 1>&6
  else
!    AUTOMAKE="$missing_dir/missing automake"
!    echo "$ac_t""missing" 1>&6
  fi
  
! echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
! echo "configure:1043: checking for working autoheader" >&5
! # Run test in a subshell; some versions of sh will print an error if
! # an executable is not found, even if stderr is redirected.
! # Redirect stdin to placate older versions of autoconf.  Sigh.
! if (autoheader --version) < /dev/null > /dev/null 2>&1; then
!    AUTOHEADER=autoheader
!    echo "$ac_t""found" 1>&6
! else
!    AUTOHEADER="$missing_dir/missing autoheader"
!    echo "$ac_t""missing" 1>&6
  fi
  
! echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
! echo "configure:1056: checking for working makeinfo" >&5
! # Run test in a subshell; some versions of sh will print an error if
! # an executable is not found, even if stderr is redirected.
! # Redirect stdin to placate older versions of autoconf.  Sigh.
! if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
!    MAKEINFO=makeinfo
!    echo "$ac_t""found" 1>&6
! else
!    MAKEINFO="$missing_dir/missing makeinfo"
!    echo "$ac_t""missing" 1>&6
  fi
  
  
  
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
--- 1041,1175 ----
    multilib=yes
  fi
  
!   # When building with srcdir == objdir, links to the source files will
!   # be created in directories within the target_subdir.  We have to
!   # adjust toplevel_srcdir accordingly, so that configure finds
!   # install-sh and other auxiliary files that live in the top-level
!   # source directory.
!   if test "${srcdir}" = "."; then
!     if test -z "${with_target_subdir}"; then
!       toprel=".."
!     else
!       if test "${with_target_subdir}" != "."; then
!         toprel="${with_multisrctop}../.."
!       else
!         toprel="${with_multisrctop}.."
!       fi
!     fi
!   else
!     toprel=".."
!   fi
!   ac_aux_dir=
! for ac_dir in ${srcdir}/$toprel $srcdir/${srcdir}/$toprel; do
!   if test -f $ac_dir/install-sh; then
!     ac_aux_dir=$ac_dir
!     ac_install_sh="$ac_aux_dir/install-sh -c"
!     break
!   elif test -f $ac_dir/install.sh; then
!     ac_aux_dir=$ac_dir
!     ac_install_sh="$ac_aux_dir/install.sh -c"
!     break
!   fi
! done
! if test -z "$ac_aux_dir"; then
!   { echo "configure: error: can not find install-sh or install.sh in ${srcdir}/$toprel $srcdir/${srcdir}/$toprel" 1>&2; exit 1; }
! fi
! ac_config_guess=$ac_aux_dir/config.guess
! ac_config_sub=$ac_aux_dir/config.sub
! ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
! 
!   toplevel_srcdir=\${top_srcdir}/$toprel
    
  
+   # Export build and source directories.
+   # These need to be absolute paths, yet at the same time need to
+   # canonicalize only relative paths, because then amd will not unmount
+   # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
+   glibcpp_builddir=`pwd`
+   case $srcdir in
+   \\/$* | ?:\\/*) glibcpp_srcdir=${srcdir} ;;
+   *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
+   esac
+   
    
  
!     
  
!   for ac_prog in mawk gawk nawk awk
! do
! # Extract the first word of "$ac_prog", so it can be a program name with args.
! set dummy $ac_prog; ac_word=$2
! echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1104: checking for $ac_word" >&5
! if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   if test -n "$AWK"; then
!   ac_cv_prog_AWK="$AWK" # Let the user override the test.
! else
!   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
!   ac_dummy="$PATH"
!   for ac_dir in $ac_dummy; do
!     test -z "$ac_dir" && ac_dir=.
!     if test -f $ac_dir/$ac_word; then
!       ac_cv_prog_AWK="$ac_prog"
!       break
!     fi
!   done
!   IFS="$ac_save_ifs"
  fi
! fi
! AWK="$ac_cv_prog_AWK"
! if test -n "$AWK"; then
!   echo "$ac_t""$AWK" 1>&6
  else
!   echo "$ac_t""no" 1>&6
  fi
  
! test -n "$AWK" && break
! done
! 
!   # Will set LN_S to either 'ln -s' or 'ln'.  With autoconf 2.5x, can also
!   # be 'cp -p' if linking isn't available.
!   #ac_cv_prog_LN_S='cp -p'
!   echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
! echo "configure:1137: checking whether ln -s works" >&5
! if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
  else
!   rm -f conftestdata
! if ln -s X conftestdata 2>/dev/null
! then
!   rm -f conftestdata
!   ac_cv_prog_LN_S="ln -s"
! else
!   ac_cv_prog_LN_S=ln
  fi
! fi
! LN_S="$ac_cv_prog_LN_S"
! if test "$ac_cv_prog_LN_S" = "ln -s"; then
!   echo "$ac_t""yes" 1>&6
  else
!   echo "$ac_t""no" 1>&6
  fi
  
! 
!   # We use these options to decide which functions to include.
!   # Check whether --with-target-subdir or --without-target-subdir was given.
! if test "${with_target_subdir+set}" = set; then
!   withval="$with_target_subdir"
!   :
  fi
  
!   # Check whether --with-cross-host or --without-cross-host was given.
! if test "${with_cross_host+set}" = set; then
!   withval="$with_cross_host"
!   :
  fi
  
  
+   glibcpp_basedir=$srcdir/$toprel/./libstdc++-v3
+   
  
    # Never versions of autoconf add an underscore to these functions.
    # Prevent future problems ...
*************** fi
*** 1073,1093 ****
    
    
  
! #  AC_PROG_CC
! 
! # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
! # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
! # are probably using a cross compiler, which will not be able to fully
! # link an executable.  This should really be fixed in autoconf
! # itself.
! 
! 
  
  
! # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1091: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1178,1196 ----
    
    
  
!   # AC_PROG_CC
!   # FIXME: We temporarily define our own version of AC_PROG_CC.  This is
!   # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
!   # are probably using a cross compiler, which will not be able to fully
!   # link an executable.  This is addressed in later versions of autoconf.
  
+   
  
!       
!   # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1194: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 1113,1123 ****
    echo "$ac_t""no" 1>&6
  fi
  
! if test -z "$CC"; then
!   # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1121: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1216,1226 ----
    echo "$ac_t""no" 1>&6
  fi
  
!   if test -z "$CC"; then
!     # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1224: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 1162,1172 ****
    echo "$ac_t""no" 1>&6
  fi
  
!   test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
! fi
  
! echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
! echo "configure:1170: checking whether we are using GNU C" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1265,1275 ----
    echo "$ac_t""no" 1>&6
  fi
  
!     test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
!   fi
  
!   echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
! echo "configure:1273: checking whether we are using GNU C" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 1175,1181 ****
    yes;
  #endif
  EOF
! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1179: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
    ac_cv_prog_gcc=no
--- 1278,1284 ----
    yes;
  #endif
  EOF
! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
    ac_cv_prog_gcc=no
*************** fi
*** 1184,1196 ****
  
  echo "$ac_t""$ac_cv_prog_gcc" 1>&6
  
! if test $ac_cv_prog_gcc = yes; then
!   GCC=yes
!   ac_test_CFLAGS="${CFLAGS+set}"
!   ac_save_CFLAGS="$CFLAGS"
!   CFLAGS=
!   echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
! echo "configure:1194: checking whether ${CC-cc} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1287,1299 ----
  
  echo "$ac_t""$ac_cv_prog_gcc" 1>&6
  
!   if test $ac_cv_prog_gcc = yes; then
!     GCC=yes
!           ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS=
!     echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
! echo "configure:1297: checking whether ${CC-cc} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** rm -f conftest*
*** 1205,1241 ****
  fi
  
  echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
!   if test "$ac_test_CFLAGS" = set; then
!     CFLAGS="$ac_save_CFLAGS"
!   elif test $ac_cv_prog_cc_g = yes; then
!     CFLAGS="-g -O2"
    else
!     CFLAGS="-O2"
    fi
! else
!   GCC=
!   test "${CFLAGS+set}" = set || CFLAGS="-g"
! fi
! 
! 
! # Can't just call these here as g++ requires libstc++ to be built....
! #  AC_PROG_CXX
! 
! # Likewise for AC_PROG_CXX.
! 
  
  
! # Use glibcpp_CXX so that we do not cause CXX to be cached with the
! # flags that come in CXX while configuring libstdc++.  They're different
! # from those used for all other target libraries.  If CXX is set in
! # the environment, respect that here.
! glibcpp_CXX=$CXX
! for ac_prog in $CCC c++ g++ gcc CC cxx cc++
  do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1239: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_glibcpp_CXX'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1308,1342 ----
  fi
  
  echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     elif test $ac_cv_prog_cc_g = yes; then
!       CFLAGS="-g -O2"
!     else
!       CFLAGS="-O2"
!     fi
    else
!     GCC=
!     test "${CFLAGS+set}" = set || CFLAGS="-g"
    fi
!   
  
+   # Likewise for AC_PROG_CXX.  We can't just call it directly because g++
+   # will try to link in libstdc++.
+   
  
!       
!   # Use glibcpp_CXX so that we do not cause CXX to be cached with the
!   # flags that come in CXX while configuring libstdc++.  They're different
!   # from those used for all other target libraries.  If CXX is set in
!   # the environment, respect that here.
!   glibcpp_CXX=$CXX
!   for ac_prog in $CCC c++ g++ gcc CC cxx cc++
  do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1340: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_glibcpp_CXX'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** test -n "$glibcpp_CXX" && break
*** 1265,1276 ****
  done
  test -n "$glibcpp_CXX" || glibcpp_CXX="gcc"
  
  
! CXX=$glibcpp_CXX
! test -z "$glibcpp_CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
! 
! echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
! echo "configure:1274: checking whether we are using GNU C++" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1366,1377 ----
  done
  test -n "$glibcpp_CXX" || glibcpp_CXX="gcc"
  
+   
+   CXX=$glibcpp_CXX
+   test -z "$glibcpp_CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
  
!   echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
! echo "configure:1375: checking whether we are using GNU C++" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 1279,1285 ****
    yes;
  #endif
  EOF
! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1283: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gxx=yes
  else
    ac_cv_prog_gxx=no
--- 1380,1386 ----
    yes;
  #endif
  EOF
! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1384: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gxx=yes
  else
    ac_cv_prog_gxx=no
*************** fi
*** 1288,1300 ****
  
  echo "$ac_t""$ac_cv_prog_gxx" 1>&6
  
! if test $ac_cv_prog_gxx = yes; then
!   GXX=yes
!   ac_test_CXXFLAGS="${CXXFLAGS+set}"
!   ac_save_CXXFLAGS="$CXXFLAGS"
!   CXXFLAGS=
!   echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
! echo "configure:1298: checking whether ${CXX-g++} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1389,1401 ----
  
  echo "$ac_t""$ac_cv_prog_gxx" 1>&6
  
!   if test $ac_cv_prog_gxx = yes; then
!     GXX=yes
!                 ac_test_CXXFLAGS="${CXXFLAGS+set}"
!     ac_save_CXXFLAGS="$CXXFLAGS"
!     CXXFLAGS=
!     echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
! echo "configure:1399: checking whether ${CXX-g++} accepts -g" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** rm -f conftest*
*** 1309,1331 ****
  fi
  
  echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
!   if test "$ac_test_CXXFLAGS" = set; then
!     CXXFLAGS="$ac_save_CXXFLAGS"
!   elif test $ac_cv_prog_cxx_g = yes; then
!     CXXFLAGS="-g -O2"
    else
!     CXXFLAGS="-O2"
    fi
  else
!   GXX=
!   test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
  fi
  
  
    # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
  set dummy ${ac_tool_prefix}as; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1329: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1410,1477 ----
  fi
  
  echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
!     if test "$ac_test_CXXFLAGS" = set; then
!       CXXFLAGS="$ac_save_CXXFLAGS"
!     elif test $ac_cv_prog_cxx_g = yes; then
!       CXXFLAGS="-g -O2"
!     else
!       CXXFLAGS="-O2"
!     fi
    else
!     GXX=
!     test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
    fi
+   
+ 
+   # For some reason, gettext needs this.
+   
+         echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
+ echo "configure:1430: checking for strerror in -lcposix" >&5
+ ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
  else
!   ac_save_LIBS="$LIBS"
! LIBS="-lcposix  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=no"
! fi
! rm -f conftest*
! LIBS="$ac_save_LIBS"
! 
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   LIBS="$LIBS -lcposix"
! else
!   echo "$ac_t""no" 1>&6
  fi
  
+   
+ 
  
    # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
  set dummy ${ac_tool_prefix}as; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1475: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** fi
*** 1357,1363 ****
    # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ar; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1361: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1503,1509 ----
    # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ar; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1507: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** fi
*** 1389,1395 ****
    # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1393: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1535,1541 ----
    # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1539: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** if test -n "$ac_tool_prefix"; then
*** 1421,1427 ****
    # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1425: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1567,1573 ----
    # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:1571: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** fi
*** 1465,1471 ****
  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
  # ./install, which can be erroneously created by make from ./install.sh.
  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
! echo "configure:1469: checking for a BSD compatible install" >&5
  if test -z "$INSTALL"; then
  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 1611,1617 ----
  # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
  # ./install, which can be erroneously created by make from ./install.sh.
  echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
! echo "configure:1615: checking for a BSD compatible install" >&5
  if test -z "$INSTALL"; then
  if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** test -z "$INSTALL_DATA" && INSTALL_DATA=
*** 1519,1525 ****
  
  
    echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
! echo "configure:1523: checking whether to enable maintainer-specific portions of Makefiles" >&5
      # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
  if test "${enable_maintainer_mode+set}" = set; then
    enableval="$enable_maintainer_mode"
--- 1665,1671 ----
  
  
    echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
! echo "configure:1669: checking whether to enable maintainer-specific portions of Makefiles" >&5
      # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
  if test "${enable_maintainer_mode+set}" = set; then
    enableval="$enable_maintainer_mode"
*************** fi
*** 1546,1553 ****
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which cant create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we dont execute it, since we dont care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
--- 1692,1699 ----
    # at least currently, we never actually build a program, so we never
    # need to use $(EXEEXT).  Moreover, the test for EXEEXT normally
    # fails, because we are probably configuring with a cross compiler
!   # which can't create executables.  So we include AC_EXEEXT to keep
!   # automake happy, but we don't execute it, since we don't care about
    # the result.
    if false; then
      # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands
*************** fi
*** 1557,1563 ****
      
  
  echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
! echo "configure:1561: checking for executable suffix" >&5
  if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1703,1709 ----
      
  
  echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
! echo "configure:1707: checking for executable suffix" >&5
  if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 1567,1576 ****
    rm -f conftest*
    echo 'int main () { return 0; }' > conftest.$ac_ext
    ac_cv_exeext=
!   if { (eval echo configure:1571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
      for file in conftest.*; do
        case $file in
!       *.c | *.o | *.obj) ;;
        *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
        esac
      done
--- 1713,1722 ----
    rm -f conftest*
    echo 'int main () { return 0; }' > conftest.$ac_ext
    ac_cv_exeext=
!   if { (eval echo configure:1717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
      for file in conftest.*; do
        case $file in
!       *.c | *.o | *.obj | *.ilk | *.pdb) ;;
        *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
        esac
      done
*************** ac_exeext=$EXEEXT
*** 1606,1611 ****
--- 1752,1758 ----
  
  
  
+ 
  # Check whether --enable-shared or --disable-shared was given.
  if test "${enable_shared+set}" = set; then
    enableval="$enable_shared"
*************** ac_prog=ld
*** 1687,1693 ****
  if test "$GCC" = yes; then
    # Check if gcc -print-prog-name=ld gives a path.
    echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
! echo "configure:1691: checking for ld used by GCC" >&5
    case $host in
    *-*-mingw*)
      # gcc leaves a trailing carriage return which upsets mingw
--- 1834,1840 ----
  if test "$GCC" = yes; then
    # Check if gcc -print-prog-name=ld gives a path.
    echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
! echo "configure:1838: checking for ld used by GCC" >&5
    case $host in
    *-*-mingw*)
      # gcc leaves a trailing carriage return which upsets mingw
*************** echo "configure:1691: checking for ld us
*** 1717,1726 ****
    esac
  elif test "$with_gnu_ld" = yes; then
    echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
! echo "configure:1721: checking for GNU ld" >&5
  else
    echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
! echo "configure:1724: checking for non-GNU ld" >&5
  fi
  if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 1864,1873 ----
    esac
  elif test "$with_gnu_ld" = yes; then
    echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
! echo "configure:1868: checking for GNU ld" >&5
  else
    echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
! echo "configure:1871: checking for non-GNU ld" >&5
  fi
  if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 1755,1761 ****
  fi
  test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
  echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
! echo "configure:1759: checking if the linker ($LD) is GNU ld" >&5
  if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1902,1908 ----
  fi
  test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
  echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
! echo "configure:1906: checking if the linker ($LD) is GNU ld" >&5
  if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** with_gnu_ld=$lt_cv_prog_gnu_ld
*** 1772,1778 ****
  
  
  echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
! echo "configure:1776: checking for $LD option to reload object files" >&5
  if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1919,1925 ----
  
  
  echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
! echo "configure:1923: checking for $LD option to reload object files" >&5
  if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** reload_flag=$lt_cv_ld_reload_flag
*** 1784,1790 ****
  test -n "$reload_flag" && reload_flag=" $reload_flag"
  
  echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
! echo "configure:1788: checking for BSD-compatible nm" >&5
  if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1931,1937 ----
  test -n "$reload_flag" && reload_flag=" $reload_flag"
  
  echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
! echo "configure:1935: checking for BSD-compatible nm" >&5
  if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** NM="$lt_cv_path_NM"
*** 1822,1828 ****
  echo "$ac_t""$NM" 1>&6
  
  echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
! echo "configure:1826: checking how to recognise dependant libraries" >&5
  if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 1969,1975 ----
  echo "$ac_t""$NM" 1>&6
  
  echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
! echo "configure:1973: checking how to recognise dependant libraries" >&5
  if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** file_magic_cmd=$lt_cv_file_magic_cmd
*** 1986,1998 ****
  deplibs_check_method=$lt_cv_deplibs_check_method
  
  echo $ac_n "checking for object suffix""... $ac_c" 1>&6
! echo "configure:1990: checking for object suffix" >&5
  if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    rm -f conftest*
  echo 'int i = 1;' > conftest.$ac_ext
! if { (eval echo configure:1996: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    for ac_file in conftest.*; do
      case $ac_file in
      *.c) ;;
--- 2133,2145 ----
  deplibs_check_method=$lt_cv_deplibs_check_method
  
  echo $ac_n "checking for object suffix""... $ac_c" 1>&6
! echo "configure:2137: checking for object suffix" >&5
  if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    rm -f conftest*
  echo 'int i = 1;' > conftest.$ac_ext
! if { (eval echo configure:2143: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    for ac_file in conftest.*; do
      case $ac_file in
      *.c) ;;
*************** case $deplibs_check_method in
*** 2016,2022 ****
  file_magic*)
    if test "$file_magic_cmd" = '$MAGIC_CMD'; then
      echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
! echo "configure:2020: checking for ${ac_tool_prefix}file" >&5
  if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2163,2169 ----
  file_magic*)
    if test "$file_magic_cmd" = '$MAGIC_CMD'; then
      echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
! echo "configure:2167: checking for ${ac_tool_prefix}file" >&5
  if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** fi
*** 2078,2084 ****
  if test -z "$lt_cv_path_MAGIC_CMD"; then
    if test -n "$ac_tool_prefix"; then
      echo $ac_n "checking for file""... $ac_c" 1>&6
! echo "configure:2082: checking for file" >&5
  if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2225,2231 ----
  if test -z "$lt_cv_path_MAGIC_CMD"; then
    if test -n "$ac_tool_prefix"; then
      echo $ac_n "checking for file""... $ac_c" 1>&6
! echo "configure:2229: checking for file" >&5
  if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** esac
*** 2149,2155 ****
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2153: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2296,2302 ----
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2300: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** if test -n "$ac_tool_prefix"; then
*** 2181,2187 ****
    # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2185: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2328,2334 ----
    # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2332: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** fi
*** 2216,2222 ****
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
  set dummy ${ac_tool_prefix}strip; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2220: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2363,2369 ----
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
  set dummy ${ac_tool_prefix}strip; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2367: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** if test -n "$ac_tool_prefix"; then
*** 2248,2254 ****
    # Extract the first word of "strip", so it can be a program name with args.
  set dummy strip; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2252: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2395,2401 ----
    # Extract the first word of "strip", so it can be a program name with args.
  set dummy strip; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
! echo "configure:2399: checking for $ac_word" >&5
  if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** test x"$pic_mode" = xno && libtool_flags
*** 2315,2322 ****
  case $host in
  *-*-irix6*)
    # Find out which ABI we are using.
!   echo '#line 2319 "configure"' > conftest.$ac_ext
!   if { (eval echo configure:2320: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
      case `/usr/bin/file conftest.$ac_objext` in
      *32-bit*)
        LD="${LD-ld} -32"
--- 2462,2469 ----
  case $host in
  *-*-irix6*)
    # Find out which ABI we are using.
!   echo '#line 2466 "configure"' > conftest.$ac_ext
!   if { (eval echo configure:2467: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
      case `/usr/bin/file conftest.$ac_objext` in
      *32-bit*)
        LD="${LD-ld} -32"
*************** case $host in
*** 2337,2343 ****
    SAVE_CFLAGS="$CFLAGS"
    CFLAGS="$CFLAGS -belf"
    echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
! echo "configure:2341: checking whether the C compiler needs -belf" >&5
  if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2484,2490 ----
    SAVE_CFLAGS="$CFLAGS"
    CFLAGS="$CFLAGS -belf"
    echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
! echo "configure:2488: checking whether the C compiler needs -belf" >&5
  if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CC-cc} -o conftest${ac_exeext
*** 2350,2363 ****
  cross_compiling=$ac_cv_prog_cc_cross
  
       cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    lt_cv_cc_needs_belf=yes
  else
--- 2497,2510 ----
  cross_compiling=$ac_cv_prog_cc_cross
  
       cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    lt_cv_cc_needs_belf=yes
  else
*************** echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
*** 2387,2393 ****
  esac
  
  echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
! echo "configure:2391: checking how to run the C++ preprocessor" >&5
  if test -z "$CXXCPP"; then
  if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 2534,2540 ----
  esac
  
  echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
! echo "configure:2538: checking how to run the C++ preprocessor" >&5
  if test -z "$CXXCPP"; then
  if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 2400,2411 ****
  cross_compiling=$ac_cv_prog_cxx_cross
    CXXCPP="${CXX-g++} -E"
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2409: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
--- 2547,2558 ----
  cross_compiling=$ac_cv_prog_cxx_cross
    CXXCPP="${CXX-g++} -E"
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
*************** exec 5>>./config.log
*** 2539,2546 ****
  	 
  
  
  echo $ac_n "checking for GNU make""... $ac_c" 1>&6
! echo "configure:2544: checking for GNU make" >&5
  if eval "test \"`echo '$''{'_cv_gnu_make_command'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 2686,2696 ----
  	 
  
  
+ 
+ # Check for c++ or library specific bits that don't require linking.
+ #GLIBCPP_CHECK_COMPILER_VERSION
  echo $ac_n "checking for GNU make""... $ac_c" 1>&6
! echo "configure:2694: checking for GNU make" >&5
  if eval "test \"`echo '$''{'_cv_gnu_make_command'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** echo "$ac_t""$_cv_gnu_make_command" 1>&6
*** 2564,2621 ****
    
  
  
! 
! 
! 
! 
! # Check for c++ or library specific bits that don't require linking.
! 
! if test ! -f stamp-sanity-compiler; then
!   echo $ac_n "checking for g++ that will successfully compile libstdc++-v3""... $ac_c" 1>&6
! echo "configure:2576: checking for g++ that will successfully compile libstdc++-v3" >&5
!   
!   ac_ext=C
! # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='$CXXCPP $CPPFLAGS'
! ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
! ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
! cross_compiling=$ac_cv_prog_cxx_cross
! 
!   cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   gpp_satisfactory=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   { echo "configure: error: please upgrade to GCC 3.0 or above" 1>&2; exit 1; }
! fi
! rm -f conftest*
!   ac_ext=c
! # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='$CPP $CPPFLAGS'
! ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
! ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
! cross_compiling=$ac_cv_prog_cc_cross
! 
!   echo "$ac_t""$gpp_satisfactory" 1>&6
!   touch stamp-sanity-compiler
! fi
! 
! 
! # Enable all the crazy c++ stuff.  C_MBCHAR must come early.
  # Check whether --enable-debug or --disable-debug was given.
  if test "${enable_debug+set}" = set; then
    enableval="$enable_debug"
--- 2714,2720 ----
    
  
  
! # Enable all the variable C++ stuff.  C_MBCHAR must come early.
  # Check whether --enable-debug or --disable-debug was given.
  if test "${enable_debug+set}" = set; then
    enableval="$enable_debug"
*************** esac
*** 2639,2645 ****
  
  
  echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
! echo "configure:2643: checking how to run the C preprocessor" >&5
  # On Suns, sometimes $CPP names a directory.
  if test -n "$CPP" && test -d "$CPP"; then
    CPP=
--- 2738,2744 ----
  
  
  echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
! echo "configure:2742: checking how to run the C preprocessor" >&5
  # On Suns, sometimes $CPP names a directory.
  if test -n "$CPP" && test -d "$CPP"; then
    CPP=
*************** else
*** 2654,2666 ****
    # On the NeXT, cc -E runs the code through the compiler's parser,
    # not just through cpp.
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2664: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
--- 2753,2765 ----
    # On the NeXT, cc -E runs the code through the compiler's parser,
    # not just through cpp.
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2763: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
*************** else
*** 2671,2683 ****
    rm -rf conftest*
    CPP="${CC-cc} -E -traditional-cpp"
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2681: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
--- 2770,2782 ----
    rm -rf conftest*
    CPP="${CC-cc} -E -traditional-cpp"
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2780: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
*************** else
*** 2688,2700 ****
    rm -rf conftest*
    CPP="${CC-cc} -nologo -E"
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
--- 2787,2799 ----
    rm -rf conftest*
    CPP="${CC-cc} -nologo -E"
    cat > conftest.$ac_ext <
  Syntax Error
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2797: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    :
*************** echo "$ac_t""$CPP" 1>&6
*** 2720,2726 ****
  
  
    echo $ac_n "checking for cstdio to use""... $ac_c" 1>&6
! echo "configure:2724: checking for cstdio to use" >&5
    # Check whether --enable-cstdio or --disable-cstdio was given.
  if test "${enable_cstdio+set}" = set; then
    enableval="$enable_cstdio"
--- 2819,2825 ----
  
  
    echo $ac_n "checking for cstdio to use""... $ac_c" 1>&6
! echo "configure:2823: checking for cstdio to use" >&5
    # Check whether --enable-cstdio or --disable-cstdio was given.
  if test "${enable_cstdio+set}" = set; then
    enableval="$enable_cstdio"
*************** fi
*** 2736,2760 ****
  
      case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/c_io_libio.h
!       BASIC_FILE_H=config/basic_file_libio.h
!       BASIC_FILE_CC=config/basic_file_libio.cc
        echo "$ac_t""libio" 1>&6
  
        # see if we are on a system with libio native (ie, linux)
        ac_safe=`echo "libio.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for libio.h""... $ac_c" 1>&6
! echo "configure:2748: checking for libio.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2758: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 2835,2859 ----
  
      case x${enable_cstdio_flag} in
      xlibio)
!       CSTDIO_H=config/io/c_io_libio.h
!       BASIC_FILE_H=config/io/basic_file_libio.h
!       BASIC_FILE_CC=config/io/basic_file_libio.cc
        echo "$ac_t""libio" 1>&6
  
        # see if we are on a system with libio native (ie, linux)
        ac_safe=`echo "libio.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for libio.h""... $ac_c" 1>&6
! echo "configure:2847: checking for libio.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** fi
*** 2784,2792 ****
          case "$target" in
            *-*-linux*)
                echo $ac_n "checking for glibc version >= 2.2""... $ac_c" 1>&6
! echo "configure:2788: checking for glibc version >= 2.2" >&5
                cat > conftest.$ac_ext <
--- 2883,2891 ----
          case "$target" in
            *-*-linux*)
                echo $ac_n "checking for glibc version >= 2.2""... $ac_c" 1>&6
! echo "configure:2887: checking for glibc version >= 2.2" >&5
                cat > conftest.$ac_ext <
*************** rm -f conftest*
*** 2841,2849 ****
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/c_io_stdio.h
!       BASIC_FILE_H=config/basic_file_stdio.h
!       BASIC_FILE_CC=config/basic_file_stdio.cc
        echo "$ac_t""stdio" 1>&6
  
        # We're not using stdio.
--- 2940,2948 ----
        ;;
      xstdio | x | xno | xnone | xyes)
        # default
!       CSTDIO_H=config/io/c_io_stdio.h
!       BASIC_FILE_H=config/io/basic_file_stdio.h
!       BASIC_FILE_CC=config/io/basic_file_stdio.cc
        echo "$ac_t""stdio" 1>&6
  
        # We're not using stdio.
*************** rm -f conftest*
*** 2860,2866 ****
    
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/c_io_libio_codecvt.c
    
    # 2000-08-04 bkoz hack
  
--- 2959,2965 ----
    
  
    # 2000-08-04 bkoz hack
!   CCODECVT_C=config/io/c_io_libio_codecvt.c
    
    # 2000-08-04 bkoz hack
  
*************** fi
*** 2900,2929 ****
  
  
    echo $ac_n "checking for clocale to use""... $ac_c" 1>&6
! echo "configure:2904: checking for clocale to use" >&5
    # Check whether --enable-clocale or --disable-clocale was given.
  if test "${enable_clocale+set}" = set; then
    enableval="$enable_clocale"
    if test x$enable_clocale = xno; then
!      enable_clocale=generic
    fi
  else
!   enable_clocale=generic
  fi
  
  
    enable_clocale_flag=$enable_clocale
  
      case x${enable_clocale_flag} in
      xgnu)
-       CLOCALE_H=config/c_locale_gnu.h
-       CLOCALE_CC=config/c_locale_gnu.cc
        echo "$ac_t""gnu" 1>&6
        ;;
!     xgeneric)
!       CLOCALE_H=config/c_locale_generic.h
!       CLOCALE_CC=config/c_locale_generic.cc
        echo "$ac_t""generic" 1>&6
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
--- 2999,3191 ----
  
  
    echo $ac_n "checking for clocale to use""... $ac_c" 1>&6
! echo "configure:3003: checking for clocale to use" >&5
    # Check whether --enable-clocale or --disable-clocale was given.
  if test "${enable_clocale+set}" = set; then
    enableval="$enable_clocale"
    if test x$enable_clocale = xno; then
!      enable_clocale=no
    fi
  else
!   enable_clocale=no
  fi
  
  
    enable_clocale_flag=$enable_clocale
  
+       if test x$enable_clocale_flag = xno; then
+     case x${target_os} in
+       xlinux* | xgnu*)
+ 	cat > conftest.$ac_ext <
+         #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) 
+           _GLIBCPP_ok
+         #endif
+         
+ EOF
+ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+   egrep "_GLIBCPP_ok" >/dev/null 2>&1; then
+   rm -rf conftest*
+   enable_clocale_flag=gnu
+ else
+   rm -rf conftest*
+   enable_clocale_flag=generic
+ fi
+ rm -f conftest*
+ 
+ 
+ 	# Test for bugs early in glibc-2.2.x series
+   	if test x$enable_clocale_flag = xgnu; then
+     	  if test "$cross_compiling" = yes; then
+   enable_clocale_flag=generic
+ else
+   cat > conftest.$ac_ext <
+ 	  int main()
+ 	  {
+   	    const char __one[] = "Äuglein Augmen";
+   	    const char __two[] = "Äuglein";
+   	    int i;
+   	    int j;
+   	    __locale_t	loc;
+    	    __locale_t	loc_dup;
+   	    loc = __newlocale(1 << LC_ALL, "de_DE", 0);
+   	    loc_dup = __duplocale(loc);
+   	    i = __strcoll_l(__one, __two, loc);
+   	    j = __strcoll_l(__one, __two, loc_dup);
+   	    return 0;
+ 	  }
+ 	  
+ EOF
+ if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   enable_clocale_flag=gnu
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -fr conftest*
+   enable_clocale_flag=generic
+ fi
+ rm -fr conftest*
+ fi
+ 
+   	fi
+ 
+ 	# ... at some point put __strxfrm_l tests in as well.
+         ;;
+       *)
+ 	enable_clocale_flag=generic
+ 	;;
+     esac
+   fi
+ 
+     # Check whether --enable-nls or --disable-nls was given.
+ if test "${enable_nls+set}" = set; then
+   enableval="$enable_nls"
+   :
+ else
+   enable_nls=yes
+ fi
+ 
+   USE_NLS=no
+ 
      case x${enable_clocale_flag} in
+     xgeneric)
+       echo "$ac_t""generic" 1>&6
+ 
+       CLOCALE_H=config/locale/generic/c_locale.h
+       CLOCALE_CC=config/locale/generic/c_locale.cc
+       CCODECVT_H=config/locale/generic/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/generic/messages_members.h
+       CMESSAGES_CC=config/locale/generic/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
+       ;;
      xgnu)
        echo "$ac_t""gnu" 1>&6
+ 
+       # Declare intention to use gettext, and add support for specific
+       # languages.
+       # For some reason, ALL_LINGUAS has to be before AM_GNU_GETTEXT
+       ALL_LINGUAS="de fr"
+ 
+       # Don't call AM_GNU_GETTEXT here. Instead, assume glibc.
+       # Extract the first word of "msgfmt", so it can be a program name with args.
+ set dummy msgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+ echo "configure:3127: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   if test -n "$check_msgfmt"; then
+   ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
+ else
+   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+   ac_dummy="$PATH"
+   for ac_dir in $ac_dummy; do
+     test -z "$ac_dir" && ac_dir=.
+     if test -f $ac_dir/$ac_word; then
+       ac_cv_prog_check_msgfmt="yes"
+       break
+     fi
+   done
+   IFS="$ac_save_ifs"
+   test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
+ fi
+ fi
+ check_msgfmt="$ac_cv_prog_check_msgfmt"
+ if test -n "$check_msgfmt"; then
+   echo "$ac_t""$check_msgfmt" 1>&6
+ else
+   echo "$ac_t""no" 1>&6
+ fi
+ 
+       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
+ 	USE_NLS=yes
+       fi
+ 
+       # Export the build objects.
+       for ling in $ALL_LINGUAS; do \
+         glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \
+         glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \
+       done
+       
+       
+ 
+       CLOCALE_H=config/locale/gnu/c_locale.h
+       CLOCALE_CC=config/locale/gnu/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/gnu/collate_members.cc
+       CCTYPE_CC=config/locale/gnu/ctype_members.cc
+       CMESSAGES_H=config/locale/gnu/messages_members.h
+       CMESSAGES_CC=config/locale/gnu/messages_members.cc
+       CMONEY_CC=config/locale/gnu/monetary_members.cc
+       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
+       CTIME_CC=config/locale/gnu/time_members.cc
        ;;
!     xieee_1003.1-2001)
        echo "$ac_t""generic" 1>&6
+ 
+       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
+       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
+       CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
+       CCOLLATE_CC=config/locale/generic/collate_members.cc
+       CCTYPE_CC=config/locale/generic/ctype_members.cc
+       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
+       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
+       CMONEY_CC=config/locale/generic/monetary_members.cc
+       CNUMERIC_CC=config/locale/generic/numeric_members.cc
+       CTIME_CC=config/locale/generic/time_members.cc
        ;;
      *)
        echo "$enable_clocale is an unknown locale package" 1>&2
*************** fi
*** 2931,2936 ****
--- 3193,3212 ----
        ;;
    esac
  
+   # This is where the testsuite looks for locale catalogs, using the
+   # -DLOCALEDIR define during testsuite compilation.
+   glibcpp_localedir=${glibcpp_builddir}/po/share/locale
+   
+ 
+   
+   
+   
+   
+   
+   
+   
+   
+   
    
    
  
*************** cross_compiling=$ac_cv_prog_cxx_cross
*** 2971,2986 ****
    # Check for the existence of  functions used if C99 is enabled.
    ac_c99_math=yes;
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:2975: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  fpclassify(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:2984: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3247,3262 ----
    # Check for the existence of  functions used if C99 is enabled.
    ac_c99_math=yes;
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3251: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  fpclassify(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3260: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 2990,3003 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isfinite(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3266,3279 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isfinite(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3277: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3007,3020 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isinf(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3018: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3283,3296 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isinf(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3294: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3024,3037 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isnan(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3300,3313 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isnan(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3311: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3041,3054 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isnormal(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3052: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3317,3330 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isnormal(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3328: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3058,3071 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  signbit(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3069: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3334,3347 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  signbit(0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3345: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3075,3088 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isgreater(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3086: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3351,3364 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isgreater(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3362: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3092,3105 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isgreaterequal(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3103: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3368,3381 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isgreaterequal(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3379: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3109,3122 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isless(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3120: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3385,3398 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isless(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3396: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3126,3139 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  islessequal(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3137: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3402,3415 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  islessequal(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3413: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3143,3156 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  islessgreater(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3419,3432 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  islessgreater(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3160,3173 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isunordered(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3171: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3436,3449 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  isunordered(0.0,0.0);
  ; return 0; }
  EOF
! if { (eval echo configure:3447: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** rm -f conftest*
*** 3181,3196 ****
    # Check for the existence in  of vscanf, et. al.
    ac_c99_stdio=yes;
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3185: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  snprintf("12", 0, "%i");
  ; return 0; }
  EOF
! if { (eval echo configure:3194: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3457,3472 ----
    # Check for the existence in  of vscanf, et. al.
    ac_c99_stdio=yes;
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3461: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  snprintf("12", 0, "%i");
  ; return 0; }
  EOF
! if { (eval echo configure:3470: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3200,3206 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
--- 3476,3482 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
*************** int main() {
*** 3211,3217 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:3215: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3487,3493 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:3491: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3219,3227 ****
    rm -rf conftest*
    ac_c99_stdio=no
  fi
! rm -f conftest*	
    cat > conftest.$ac_ext <
  		  #include 
--- 3495,3503 ----
    rm -rf conftest*
    ac_c99_stdio=no
  fi
! rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
*************** int main() {
*** 3232,3238 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3508,3514 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:3512: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3242,3248 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
--- 3518,3524 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
*************** int main() {
*** 3253,3259 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:3257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3529,3535 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:3533: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3263,3269 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
--- 3539,3545 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  		  #include 
*************** int main() {
*** 3274,3280 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:3278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3550,3556 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:3554: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** rm -f conftest*
*** 3288,3307 ****
    # Check for the existence in  of lldiv_t, et. al.
    ac_c99_stdlib=yes;
    echo $ac_n "checking for lldiv_t declaration""... $ac_c" 1>&6
! echo "configure:3292: checking for lldiv_t declaration" >&5
    if eval "test \"`echo '$''{'ac_c99_lldiv_t'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
    cat > conftest.$ac_ext <
  int main() {
   lldiv_t mydivt;
  ; return 0; }
  EOF
! if { (eval echo configure:3305: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_c99_lldiv_t=yes
  else
--- 3564,3583 ----
    # Check for the existence in  of lldiv_t, et. al.
    ac_c99_stdlib=yes;
    echo $ac_n "checking for lldiv_t declaration""... $ac_c" 1>&6
! echo "configure:3568: checking for lldiv_t declaration" >&5
    if eval "test \"`echo '$''{'ac_c99_lldiv_t'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
    cat > conftest.$ac_ext <
  int main() {
   lldiv_t mydivt;
  ; return 0; }
  EOF
! if { (eval echo configure:3581: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_c99_lldiv_t=yes
  else
*************** fi
*** 3317,3332 ****
    echo "$ac_t""$ac_c99_lldiv_t" 1>&6
  
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3321: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtof("gnu", &tmp);
  ; return 0; }
  EOF
! if { (eval echo configure:3330: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3593,3608 ----
    echo "$ac_t""$ac_c99_lldiv_t" 1>&6
  
    echo $ac_n "checking for ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3597: checking for ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtof("gnu", &tmp);
  ; return 0; }
  EOF
! if { (eval echo configure:3606: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3336,3349 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtold("gnu", &tmp);
  ; return 0; }
  EOF
! if { (eval echo configure:3347: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3612,3625 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtold("gnu", &tmp);
  ; return 0; }
  EOF
! if { (eval echo configure:3623: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3353,3366 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  llabs(10);
  ; return 0; }
  EOF
! if { (eval echo configure:3364: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3629,3642 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  llabs(10);
  ; return 0; }
  EOF
! if { (eval echo configure:3640: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3370,3383 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  lldiv(10,1);
  ; return 0; }
  EOF
! if { (eval echo configure:3381: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3646,3659 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  lldiv(10,1);
  ; return 0; }
  EOF
! if { (eval echo configure:3657: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3387,3400 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  atoll("10");
  ; return 0; }
  EOF
! if { (eval echo configure:3398: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3663,3676 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  atoll("10");
  ; return 0; }
  EOF
! if { (eval echo configure:3674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3404,3417 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  _Exit(0);
  ; return 0; }
  EOF
! if { (eval echo configure:3415: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3680,3693 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  _Exit(0);
  ; return 0; }
  EOF
! if { (eval echo configure:3691: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** rm -f conftest*
*** 3429,3444 ****
    # XXX the wchar.h checks should be rolled into the general C99 bits.
    ac_c99_wchar=yes;
    echo $ac_n "checking for additional ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3433: checking for additional ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  wcstold(L"10.0", NULL);
  ; return 0; }
  EOF
! if { (eval echo configure:3442: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3705,3720 ----
    # XXX the wchar.h checks should be rolled into the general C99 bits.
    ac_c99_wchar=yes;
    echo $ac_n "checking for additional ISO C99 support in ""... $ac_c" 1>&6
! echo "configure:3709: checking for additional ISO C99 support in " >&5
    cat > conftest.$ac_ext <
  int main() {
  wcstold(L"10.0", NULL);
  ; return 0; }
  EOF
! if { (eval echo configure:3718: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3448,3461 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  wcstoll(L"10", NULL, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3459: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3724,3737 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  wcstoll(L"10", NULL, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3735: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3465,3478 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  wcstoull(L"10", NULL, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3476: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3741,3754 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  wcstoull(L"10", NULL, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** rm -f conftest*
*** 3484,3493 ****
    echo "$ac_t""$ac_c99_wchar" 1>&6
  
    echo $ac_n "checking for enabled ISO C99 support""... $ac_c" 1>&6
! echo "configure:3488: checking for enabled ISO C99 support" >&5
!   if test x"$ac_c99_math" = x"no" || test x"$ac_c99_stdio" = x"no" \
!       || test x"$ac_c99_stdlib" = x"no" \
!       || test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    echo "$ac_t""$enable_c99" 1>&6
--- 3760,3770 ----
    echo "$ac_t""$ac_c99_wchar" 1>&6
  
    echo $ac_n "checking for enabled ISO C99 support""... $ac_c" 1>&6
! echo "configure:3764: checking for enabled ISO C99 support" >&5
!   if test x"$ac_c99_math" = x"no" ||
!      test x"$ac_c99_stdio" = x"no" ||
!      test x"$ac_c99_stdlib" = x"no" ||
!      test x"$ac_c99_wchar" = x"no"; then
      enable_c99=no; 
    fi; 
    echo "$ac_t""$enable_c99" 1>&6
*************** cross_compiling=$ac_cv_prog_cxx_cross
*** 3531,3547 ****
  
  
    echo $ac_n "checking for enabled long long I/O support""... $ac_c" 1>&6
! echo "configure:3535: checking for enabled long long I/O support" >&5
    # iostreams require strtoll, strtoull to compile
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtoll("gnu", &tmp, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3545: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3808,3824 ----
  
  
    echo $ac_n "checking for enabled long long I/O support""... $ac_c" 1>&6
! echo "configure:3812: checking for enabled long long I/O support" >&5
    # iostreams require strtoll, strtoull to compile
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtoll("gnu", &tmp, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3822: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** else
*** 3551,3564 ****
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtoull("gnu", &tmp, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3562: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
--- 3828,3841 ----
  fi
  rm -f conftest*
    cat > conftest.$ac_ext <
  int main() {
  char* tmp; strtoull("gnu", &tmp, 10);
  ; return 0; }
  EOF
! if { (eval echo configure:3839: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    :
  else
    echo "configure: failed program was:" >&5
*************** cross_compiling=$ac_cv_prog_cc_cross
*** 3586,3592 ****
  
  
  echo $ac_n "checking for c header strategy to use""... $ac_c" 1>&6
! echo "configure:3590: checking for c header strategy to use" >&5
  # Check whether --enable-cheaders or --disable-cheaders was given.
  if test "${enable_cheaders+set}" = set; then
    enableval="$enable_cheaders"
--- 3863,3869 ----
  
  
  echo $ac_n "checking for c header strategy to use""... $ac_c" 1>&6
! echo "configure:3867: checking for c header strategy to use" >&5
  # Check whether --enable-cheaders or --disable-cheaders was given.
  if test "${enable_cheaders+set}" = set; then
    enableval="$enable_cheaders"
*************** fi
*** 3614,3623 ****
      c_shadow) 
          CSHADOW_FLAGS="-fno-builtin"
          C_INCLUDE_DIR='${glibcpp_srcdir}/include/c_shadow'
-         cat >> confdefs.h <<\EOF
- #define _GLIBCPP_USE_SHADOW_HEADERS 1
- EOF
- 
          ;;
      c_std)   
          CSHADOW_FLAGS=""
--- 3891,3896 ----
*************** EOF
*** 3633,3649 ****
    
    
  
! if test "$enable_cheaders" = c_shadow; then
!   GLIBCPP_USE_CSHADOW_TRUE=
!   GLIBCPP_USE_CSHADOW_FALSE='#'
  else
!   GLIBCPP_USE_CSHADOW_TRUE='#'
!   GLIBCPP_USE_CSHADOW_FALSE=
  fi
  
  
    echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6
! echo "configure:3647: checking for thread model used by GCC" >&5
    target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
    echo "$ac_t""$target_thread_file" 1>&6
  
--- 3906,3931 ----
    
    
  
! if test "$enable_cheaders" = c; then
!   GLIBCPP_C_HEADERS_C_TRUE=
!   GLIBCPP_C_HEADERS_C_FALSE='#'
  else
!   GLIBCPP_C_HEADERS_C_TRUE='#'
!   GLIBCPP_C_HEADERS_C_FALSE=
! fi
!   
! 
! if test "$enable_cheaders" = c_std; then
!   GLIBCPP_C_HEADERS_C_STD_TRUE=
!   GLIBCPP_C_HEADERS_C_STD_FALSE='#'
! else
!   GLIBCPP_C_HEADERS_C_STD_TRUE='#'
!   GLIBCPP_C_HEADERS_C_STD_FALSE=
  fi
  
  
    echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6
! echo "configure:3929: checking for thread model used by GCC" >&5
    target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
    echo "$ac_t""$target_thread_file" 1>&6
  
*************** EXTRA_CXX_FLAGS="$enable_cxx_flags"
*** 3696,3702 ****
  
  
    echo $ac_n "checking for exception model to use""... $ac_c" 1>&6
! echo "configure:3700: checking for exception model to use" >&5
    
    ac_ext=C
  # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
--- 3978,3984 ----
  
  
    echo $ac_n "checking for exception model to use""... $ac_c" 1>&6
! echo "configure:3982: checking for exception model to use" >&5
    
    ac_ext=C
  # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
*************** if test "${enable_sjlj_exceptions+set}" 
*** 3711,3717 ****
    :
  else
                         cat > conftest.$ac_ext << EOF
! #line 3715 "configure"
  struct S { ~S(); };
  void bar();
  void foo()
--- 3993,3999 ----
    :
  else
                         cat > conftest.$ac_ext << EOF
! #line 3997 "configure"
  struct S { ~S(); };
  void bar();
  void foo()
*************** void foo()
*** 3721,3728 ****
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS=-S
!    if { (eval echo configure:3726: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
       elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
--- 4003,4010 ----
  }
  EOF
     old_CXXFLAGS="$CXXFLAGS"  
!    CXXFLAGS="-S -fexceptions"
!    if { (eval echo configure:4008: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
       if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
         enable_sjlj_exceptions=yes
       elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
*************** cross_compiling=$ac_cv_prog_cc_cross
*** 3754,3766 ****
     echo "$ac_t""$ac_exception_model_name" 1>&6
  
  
  if test -n "$with_cross_host" || test x"$build" != x"$host"; then
  
    # We are being configured with some form of cross compiler.
-   # mknumeric_limits may not work correctly, either because the
-   # compiler may not run on this machine, may not be able to link
-   # executables, or may produce executables we can't run on this
-   # machine.
    GLIBCPP_IS_CROSS_COMPILING=1
  
    # If Canadian cross, then don't pick up tools from the build
--- 4036,4095 ----
     echo "$ac_t""$ac_exception_model_name" 1>&6
  
  
+   echo $ac_n "checking for use of libunwind""... $ac_c" 1>&6
+ echo "configure:4041: checking for use of libunwind" >&5
+   # Check whether --enable-libunwind-exceptions or --disable-libunwind-exceptions was given.
+ if test "${enable_libunwind_exceptions+set}" = set; then
+   enableval="$enable_libunwind_exceptions"
+   use_libunwind_exceptions=$enableval
+ else
+   use_libunwind_exceptions=no
+ fi
+ 
+   echo "$ac_t""$use_libunwind_exceptions" 1>&6
+     if test x"$use_libunwind_exceptions" = xyes; then
+     LIBUNWIND_FLAG="-lunwind"
+   else
+     LIBUNWIND_FLAG=""
+   fi
+   
+ 
+ # Check whether --enable-concept-checks or --disable-concept-checks was given.
+ if test "${enable_concept_checks+set}" = set; then
+   enableval="$enable_concept_checks"
+   case "$enableval" in
+  yes) enable_concept_checks=yes ;;
+  no)  enable_concept_checks=no ;;
+  *)   { echo "configure: error: Unknown argument to enable/disable concept checks" 1>&2; exit 1; } ;;
+  esac
+ else
+   enable_concept_checks=no
+ fi
+ if test x"$enable_concept_checks" = xyes; then
+   cat >> confdefs.h <<\EOF
+ #define _GLIBCPP_CONCEPT_CHECKS 1
+ EOF
+ 
+ fi
+ 
+ 
+ 
  if test -n "$with_cross_host" || test x"$build" != x"$host"; then
  
+   # This lets us hard-code the functionality we know
+   # we'll have in the cross target environment. "Let" is a
+   # sugar-coated word placed on an especially dull and tedious hack, actually.
+   # Here's why GLIBCPP_CHECK_MATH_SUPPORT, and other autoconf macros
+   # that involve linking can't be used:
+   # "cannot open sim-crt0.o"
+   # "cannot open crt0.o"
+   # etc. All this is because there currently exists no unified,
+   # consistent way for top level CC information to be passed down
+   # to target directories: newlib includes, newlib linking info,
+   # libgloss versus newlib crt0.o, etc. When all of this is done, all
+   # of this hokey, excessive AC_DEFINE junk for crosses can be removed.
+ 
    # We are being configured with some form of cross compiler.
    GLIBCPP_IS_CROSS_COMPILING=1
  
    # If Canadian cross, then don't pick up tools from the build
*************** if test -n "$with_cross_host" || test x"
*** 3771,3797 ****
      CANADIAN=no
    fi
  
    case "$target_alias" in
      *-linux*)
! 	# Construct linux crosses by hand, eliminating bits that need ld...
!         # Check for available headers.
!         for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h fp.h locale.h \
! 	float.h inttypes.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:3785: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:3795: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 4100,4130 ----
      CANADIAN=no
    fi
  
+   # Construct crosses by hand, eliminating bits that need ld...
+   # GLIBCPP_CHECK_COMPILER_FEATURES
+   # GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
+   # GLIBCPP_CHECK_MATH_SUPPORT
+ 
    case "$target_alias" in
      *-linux*)
!       # Check for available headers.
!       for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:4118: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4128: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** else
*** 3817,3827 ****
  fi
  done
  
! 
! 	# GLIBCPP_CHECK_COMPILER_FEATURES
! 	SECTION_FLAGS='-ffunction-sections -fdata-sections'
! 	
! 	
    # If we're not using GNU ld, then there's no point in even trying these
    # tests.  Check for that first.  We should have already tested for gld
    # by now (in libtool), but require it now just to be safe...
--- 4150,4158 ----
  fi
  done
  
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!       
!       
    # If we're not using GNU ld, then there's no point in even trying these
    # tests.  Check for that first.  We should have already tested for gld
    # by now (in libtool), but require it now just to be safe...
*************** done
*** 3829,3836 ****
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    
  
    # Set --gc-sections.
!   if test "$ac_cv_prog_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
--- 4160,4191 ----
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    
  
+   # The name set by libtool depends on the version of libtool.  Shame on us
+   # for depending on an impl detail, but c'est la vie.  Older versions used
+   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
+   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
+   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
+   # set (hence we're using an older libtool), then set it.
+   if test x${with_gnu_ld+set} != xset; then
+     if test x${ac_cv_prog_gnu_ld+set} != xset; then
+       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
+       with_gnu_ld=no
+     else
+       with_gnu_ld=$ac_cv_prog_gnu_ld
+     fi
+   fi
+ 
+   # Start by getting the version number.  I think the libtool test already
+   # does some of this, but throws away the result.
+   
+   ldver=`$LD --version 2>/dev/null | head -1 | \
+          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
+   
+   glibcpp_gnu_ld_version=`echo $ldver | \
+          $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
+ 
    # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
*************** done
*** 3847,3858 ****
      # used sections, first .eh_frame and now some of the glibc sections for
      # iconv). Bzzzzt. Thanks for playing, maybe next time.
      echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
! echo "configure:3851: checking for ld that supports -Wl,--gc-sections" >&5
      if test "$cross_compiling" = yes; then
    ac_sectionLDflags=yes
  else
    cat > conftest.$ac_ext <&6
! echo "configure:4206: checking for ld that supports -Wl,--gc-sections" >&5
      if test "$cross_compiling" = yes; then
    ac_sectionLDflags=yes
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_sectionLDflags=yes
  else
--- 4218,4224 ----
       }
      
  EOF
! if { (eval echo configure:4222: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_sectionLDflags=yes
  else
*************** fi
*** 3888,4147 ****
    fi
  
    # Set linker optimization flags.
!   if test x"$ac_cv_prog_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
    
    
  
! 	# GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
! 	# GLIBCPP_CHECK_MATH_SUPPORT
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ACOSF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ASINF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ATAN2F 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ATANF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_CEILF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_COPYSIGN 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_COPYSIGNF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_COSF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_COSHF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_EXPF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_FABSF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_FINITE 1
  EOF
  
  	cat >> confdefs.h <<\EOF
! #define HAVE_FINITEF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_FLOORF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_FMODF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_FREXPF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISINF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISINFF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISNAN 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISNANF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_LDEXPF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_LOG10F 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_LOGF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_MODFF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_POWF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_SINCOS 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_SINCOSF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_SINF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_SINHF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_SQRTF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_TANF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_TANHF 1
  EOF
  
  
! 	# At some point, we should differentiate between architectures
! 	# like x86, which have long double versions, and alpha/powerpc/etc.,
! 	# which don't. For the time being, punt.
! 	if test x"long_double_math_on_this_cpu" = x"yes"; then
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ACOSL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ASINL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ATAN2L 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ATANL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_CEILL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGNL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_COSL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_COSHL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_EXPL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_FABSL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_FINITEL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_FLOORL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_FMODL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_FREXPL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ISINFL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_ISNANL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_LDEXPL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_LOG10L 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_LOGL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_MODFL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_POWL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_SINCOSL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_SINL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_SINHL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_SQRTL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_TANL 1
  EOF
  
! 	  cat >> confdefs.h <<\EOF
! #define HAVE_TANHL 1
  EOF
  
! 	fi
! 	
      echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:4145: checking for main in -lm" >&5
  ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 4243,7083 ----
    fi
  
    # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
    
    
  
!       
!     echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:4256: checking for main in -lm" >&5
! ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-lm  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=no"
+ fi
+ rm -f conftest*
+ LIBS="$ac_save_LIBS"
  
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
!     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
!   cat >> confdefs.h <&6
! fi
! 
!   for ac_func in nan copysignf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4301: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:4329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
+ fi
+ done
  
! 
!     for ac_func in __signbit
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4358: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:4386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
! fi
! done
! 
!   for ac_func in __signbitf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4414: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:4442: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
! fi
! done
! 
! 
!           if test x$ac_cv_func_copysignl = x"yes"; then
!     for ac_func in __signbitl
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4472: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:4500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
! fi
! done
! 
!   fi
! 
!   
! 
!       
! 
!       echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:4532: checking for mbstate_t" >&5
!   cat > conftest.$ac_ext <
! int main() {
! mbstate_t teststate;
! ; return 0; }
! EOF
! if { (eval echo configure:4541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   have_mbstate_t=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   have_mbstate_t=no
! fi
! rm -f conftest*
!   echo "$ac_t""$have_mbstate_t" 1>&6
!   if test x"$have_mbstate_t" = xyes; then
!     cat >> confdefs.h <<\EOF
! #define HAVE_MBSTATE_T 1
! EOF
! 
!   fi
! 
!     for ac_hdr in wchar.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:4563: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4573: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
! ac_has_wchar_h=no
! fi
! done
! 
!   for ac_hdr in wctype.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:4604: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4614: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
! ac_has_wctype_h=no
! fi
! done
! 
!   
!     if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
!       
!             echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:4647: checking for WCHAR_MIN and WCHAR_MAX" >&5
!     cat > conftest.$ac_ext <
! int main() {
! int i = WCHAR_MIN; int j = WCHAR_MAX;
! ; return 0; }
! EOF
! if { (eval echo configure:4656: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   has_wchar_minmax=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   has_wchar_minmax=no
! fi
! rm -f conftest*
!     echo "$ac_t""$has_wchar_minmax" 1>&6
!     
!             echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:4669: checking for WEOF" >&5
!     cat > conftest.$ac_ext <
!       #include 
! int main() {
! wint_t i = WEOF;
! ; return 0; }
! EOF
! if { (eval echo configure:4680: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   has_weof=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   has_weof=no
! fi
! rm -f conftest*
!     echo "$ac_t""$has_weof" 1>&6
!   
!         ac_wfuncs=yes
!     for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4696: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:4724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! \
!     ac_wfuncs=no
! fi
! done
! 
!   
!         for ac_func in btowc wctob fgetwc fgetwc fgetws fputwc fputws fwide \
!     fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \
!     vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \
!     mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \
!     wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \
!     wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4759: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:4787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! \
!     ac_wfuncs=no
! fi
! done
! 
! 
!     echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:4815: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
!       ac_isoC99_wchar_t=yes
!     else
!       ac_isoC99_wchar_t=no
!     fi
!     echo "$ac_t""$ac_isoC99_wchar_t" 1>&6
!   
!             ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:4827: checking for iconv.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4837: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   ac_has_iconv_h=yes
! else
!   echo "$ac_t""no" 1>&6
! ac_has_iconv_h=no
! fi
! 
!     ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:4861: checking for langinfo.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4871: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   ac_has_langinfo_h=yes
! else
!   echo "$ac_t""no" 1>&6
! ac_has_langinfo_h=no
! fi
! 
! 
!         echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:4895: checking for iconv in -liconv" >&5
! ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-liconv  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=no"
! fi
! rm -f conftest*
! LIBS="$ac_save_LIBS"
! 
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   libiconv="-liconv"
! else
!   echo "$ac_t""no" 1>&6
! fi
! 
!     ac_save_LIBS="$LIBS"
!     LIBS="$LIBS $libiconv"
! 
!     for ac_func in iconv_open iconv_close iconv nl_langinfo
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4940: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:4968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! ac_XPG2funcs=no
! fi
! done
! 
!   
!     LIBS="$ac_save_LIBS"
! 
!     echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:4998: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
!       ac_XPG2_wchar_t=yes
!     else
!       ac_XPG2_wchar_t=no
!     fi
!     echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
!   
!             echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:5009: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
!       cat >> confdefs.h <<\EOF
! #define _GLIBCPP_USE_WCHAR_T 1
! EOF
! 
!       echo "$ac_t"""yes"" 1>&6
!     else
!       echo "$ac_t"""no"" 1>&6
!     fi
!   else
!         echo "configure: warning: wchar_t support disabled." 1>&2
!   fi
! 
!       os_include_dir="config/os/gnu-linux"
!       cat >> confdefs.h <<\EOF
  #define HAVE_COPYSIGN 1
  EOF
  
!       cat >> confdefs.h <<\EOF
  #define HAVE_COPYSIGNF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FINITEF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FREXPF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_HYPOTF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_SINCOS 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_SINCOSF 1
  EOF
  
+       if test x"long_double_math_on_this_cpu" = x"yes"; then
  	cat >> confdefs.h <<\EOF
! #define HAVE_HYPOTL 1
  EOF
  
!       fi
!       ;;
!     *-hpux*)
!       # Check for available headers.
!       for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:5068: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:5078: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+   cat >> confdefs.h <&6
+ fi
+ done
  
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!       
!       
!   # If we're not using GNU ld, then there's no point in even trying these
!   # tests.  Check for that first.  We should have already tested for gld
!   # by now (in libtool), but require it now just to be safe...
!   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
!   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   
! 
!   # The name set by libtool depends on the version of libtool.  Shame on us
!   # for depending on an impl detail, but c'est la vie.  Older versions used
!   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
!   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
!   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
!   # set (hence we're using an older libtool), then set it.
!   if test x${with_gnu_ld+set} != xset; then
!     if test x${ac_cv_prog_gnu_ld+set} != xset; then
!       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
!       with_gnu_ld=no
!     else
!       with_gnu_ld=$ac_cv_prog_gnu_ld
!     fi
!   fi
! 
!   # Start by getting the version number.  I think the libtool test already
!   # does some of this, but throws away the result.
!   
!   ldver=`$LD --version 2>/dev/null | head -1 | \
!          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
!   
!   glibcpp_gnu_ld_version=`echo $ldver | \
!          $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
! 
!   # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
!     # GNU ld it is!  Joy and bunny rabbits!
! 
!     # All these tests are for C++; save the language and the compiler flags.
!     # Need to do this so that g++ won't try to link in libstdc++
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS='-x c++  -Wl,--gc-sections'
! 
!     # Check for -Wl,--gc-sections
!     # XXX This test is broken at the moment, as symbols required for
!     # linking are now in libsupc++ (not built yet.....). In addition, 
!     # this test has cored on solaris in the past. In addition,
!     # --gc-sections doesn't really work at the moment (keeps on discarding
!     # used sections, first .eh_frame and now some of the glibc sections for
!     # iconv). Bzzzzt. Thanks for playing, maybe next time.
!     echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
! echo "configure:5156: checking for ld that supports -Wl,--gc-sections" >&5
!     if test "$cross_compiling" = yes; then
!   ac_sectionLDflags=yes
! else
!   cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   ac_sectionLDflags=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -fr conftest*
+   ac_sectionLDflags=no
+ fi
+ rm -fr conftest*
+ fi
  
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     else
!       # this is the suspicious part
!       CFLAGS=''
!     fi
!     if test "$ac_sectionLDflags" = "yes"; then
!       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
!     fi
!     echo "$ac_t""$ac_sectionLDflags" 1>&6
!   fi
! 
!   # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
!     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
!   fi
! 
!   
!   
! 
!       
!     echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:5206: checking for main in -lm" >&5
! ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-lm  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=no"
+ fi
+ rm -f conftest*
+ LIBS="$ac_save_LIBS"
  
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
!     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
!   cat >> confdefs.h <&6
! fi
! 
!   for ac_func in nan copysignf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5251: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:5279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
+ fi
+ done
  
! 
!     for ac_func in __signbit
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5308: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:5336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
+ fi
+ done
  
!   for ac_func in __signbitf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5364: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:5392: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
+ fi
+ done
  
! 
!           if test x$ac_cv_func_copysignl = x"yes"; then
!     for ac_func in __signbitl
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5422: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:5450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
+ fi
+ done
  
!   fi
! 
!   
! 
!       
! 
!       echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:5482: checking for mbstate_t" >&5
!   cat > conftest.$ac_ext <
! int main() {
! mbstate_t teststate;
! ; return 0; }
! EOF
! if { (eval echo configure:5491: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   have_mbstate_t=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   have_mbstate_t=no
! fi
! rm -f conftest*
!   echo "$ac_t""$have_mbstate_t" 1>&6
!   if test x"$have_mbstate_t" = xyes; then
!     cat >> confdefs.h <<\EOF
! #define HAVE_MBSTATE_T 1
! EOF
! 
!   fi
! 
!     for ac_hdr in wchar.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:5513: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5523: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
! ac_has_wchar_h=no
! fi
! done
! 
!   for ac_hdr in wctype.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:5554: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5564: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
! ac_has_wctype_h=no
! fi
! done
! 
!   
!     if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
!       
!             echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:5597: checking for WCHAR_MIN and WCHAR_MAX" >&5
!     cat > conftest.$ac_ext <
! int main() {
! int i = WCHAR_MIN; int j = WCHAR_MAX;
! ; return 0; }
! EOF
! if { (eval echo configure:5606: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   has_wchar_minmax=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   has_wchar_minmax=no
! fi
! rm -f conftest*
!     echo "$ac_t""$has_wchar_minmax" 1>&6
!     
!             echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:5619: checking for WEOF" >&5
!     cat > conftest.$ac_ext <
!       #include 
! int main() {
! wint_t i = WEOF;
! ; return 0; }
! EOF
! if { (eval echo configure:5630: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   has_weof=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   has_weof=no
! fi
! rm -f conftest*
!     echo "$ac_t""$has_weof" 1>&6
!   
!         ac_wfuncs=yes
!     for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5646: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:5674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! \
!     ac_wfuncs=no
! fi
! done
! 
!   
!         for ac_func in btowc wctob fgetwc fgetwc fgetws fputwc fputws fwide \
!     fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \
!     vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \
!     mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \
!     wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \
!     wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5709: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:5737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! \
!     ac_wfuncs=no
! fi
! done
! 
! 
!     echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:5765: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
!       ac_isoC99_wchar_t=yes
!     else
!       ac_isoC99_wchar_t=no
!     fi
!     echo "$ac_t""$ac_isoC99_wchar_t" 1>&6
!   
!             ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:5777: checking for iconv.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5787: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   ac_has_iconv_h=yes
! else
!   echo "$ac_t""no" 1>&6
! ac_has_iconv_h=no
! fi
! 
!     ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:5811: checking for langinfo.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5821: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   ac_has_langinfo_h=yes
! else
!   echo "$ac_t""no" 1>&6
! ac_has_langinfo_h=no
! fi
! 
! 
!         echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:5845: checking for iconv in -liconv" >&5
! ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-liconv  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=no"
! fi
! rm -f conftest*
! LIBS="$ac_save_LIBS"
! 
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   libiconv="-liconv"
! else
!   echo "$ac_t""no" 1>&6
! fi
! 
!     ac_save_LIBS="$LIBS"
!     LIBS="$LIBS $libiconv"
! 
!     for ac_func in iconv_open iconv_close iconv nl_langinfo
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5890: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:5918: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! ac_XPG2funcs=no
! fi
! done
! 
!   
!     LIBS="$ac_save_LIBS"
! 
!     echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:5948: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
!       ac_XPG2_wchar_t=yes
!     else
!       ac_XPG2_wchar_t=no
!     fi
!     echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
!   
!             echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:5959: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
!       cat >> confdefs.h <<\EOF
! #define _GLIBCPP_USE_WCHAR_T 1
! EOF
! 
!       echo "$ac_t"""yes"" 1>&6
!     else
!       echo "$ac_t"""no"" 1>&6
!     fi
!   else
!         echo "configure: warning: wchar_t support disabled." 1>&2
!   fi
! 
!       os_include_dir="config/os/hpux"
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGN 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGNF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_FINITEF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_FREXPF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_HYPOT 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
  #define HAVE_SINCOS 1
  EOF
  
!       cat >> confdefs.h <<\EOF
  #define HAVE_SINCOSF 1
  EOF
  
!       ;;
!     *-netbsd*)
!       # Check for available headers.
!       for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:6012: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6022: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+   cat >> confdefs.h <&6
+ fi
+ done
  
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!        
!       
!   # If we're not using GNU ld, then there's no point in even trying these
!   # tests.  Check for that first.  We should have already tested for gld
!   # by now (in libtool), but require it now just to be safe...
!   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
!   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   
! 
!   # The name set by libtool depends on the version of libtool.  Shame on us
!   # for depending on an impl detail, but c'est la vie.  Older versions used
!   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
!   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
!   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
!   # set (hence we're using an older libtool), then set it.
!   if test x${with_gnu_ld+set} != xset; then
!     if test x${ac_cv_prog_gnu_ld+set} != xset; then
!       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
!       with_gnu_ld=no
!     else
!       with_gnu_ld=$ac_cv_prog_gnu_ld
!     fi
!   fi
! 
!   # Start by getting the version number.  I think the libtool test already
!   # does some of this, but throws away the result.
!   
!   ldver=`$LD --version 2>/dev/null | head -1 | \
!          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
!   
!   glibcpp_gnu_ld_version=`echo $ldver | \
!          $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
! 
!   # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
!     # GNU ld it is!  Joy and bunny rabbits!
! 
!     # All these tests are for C++; save the language and the compiler flags.
!     # Need to do this so that g++ won't try to link in libstdc++
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS='-x c++  -Wl,--gc-sections'
! 
!     # Check for -Wl,--gc-sections
!     # XXX This test is broken at the moment, as symbols required for
!     # linking are now in libsupc++ (not built yet.....). In addition, 
!     # this test has cored on solaris in the past. In addition,
!     # --gc-sections doesn't really work at the moment (keeps on discarding
!     # used sections, first .eh_frame and now some of the glibc sections for
!     # iconv). Bzzzzt. Thanks for playing, maybe next time.
!     echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
! echo "configure:6100: checking for ld that supports -Wl,--gc-sections" >&5
!     if test "$cross_compiling" = yes; then
!   ac_sectionLDflags=yes
! else
!   cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   ac_sectionLDflags=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -fr conftest*
+   ac_sectionLDflags=no
+ fi
+ rm -fr conftest*
+ fi
  
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     else
!       # this is the suspicious part
!       CFLAGS=''
!     fi
!     if test "$ac_sectionLDflags" = "yes"; then
!       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
!     fi
!     echo "$ac_t""$ac_sectionLDflags" 1>&6
!   fi
! 
!   # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
!     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
!   fi
! 
!   
!   
! 
!       
!     echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:6150: checking for main in -lm" >&5
! ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-lm  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=no"
+ fi
+ rm -f conftest*
+ LIBS="$ac_save_LIBS"
  
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
!     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
!   cat >> confdefs.h <&6
! fi
! 
!   for ac_func in nan copysignf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6195: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
+ fi
+ done
  
! 
!     for ac_func in __signbit
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6252: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
+ fi
+ done
  
!   for ac_func in __signbitf
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6308: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
+ fi
+ done
  
! 
!           if test x$ac_cv_func_copysignl = x"yes"; then
!     for ac_func in __signbitl
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6366: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
+ fi
+ done
  
!   fi
! 
!   
! 
!       
! 
!       echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:6426: checking for mbstate_t" >&5
!   cat > conftest.$ac_ext <
! int main() {
! mbstate_t teststate;
! ; return 0; }
! EOF
! if { (eval echo configure:6435: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   have_mbstate_t=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   have_mbstate_t=no
! fi
! rm -f conftest*
!   echo "$ac_t""$have_mbstate_t" 1>&6
!   if test x"$have_mbstate_t" = xyes; then
!     cat >> confdefs.h <<\EOF
! #define HAVE_MBSTATE_T 1
  EOF
  
!   fi
! 
!     for ac_hdr in wchar.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:6457: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6467: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+   cat >> confdefs.h <&6
+ ac_has_wchar_h=no
+ fi
+ done
  
!   for ac_hdr in wctype.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:6498: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+   cat >> confdefs.h <&6
+ ac_has_wctype_h=no
+ fi
+ done
  
!   
!     if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
!       
!             echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:6541: checking for WCHAR_MIN and WCHAR_MAX" >&5
!     cat > conftest.$ac_ext <
! int main() {
! int i = WCHAR_MIN; int j = WCHAR_MAX;
! ; return 0; }
  EOF
+ if { (eval echo configure:6550: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   has_wchar_minmax=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   has_wchar_minmax=no
+ fi
+ rm -f conftest*
+     echo "$ac_t""$has_wchar_minmax" 1>&6
+     
+             echo $ac_n "checking for WEOF""... $ac_c" 1>&6
+ echo "configure:6563: checking for WEOF" >&5
+     cat > conftest.$ac_ext <
!       #include 
! int main() {
! wint_t i = WEOF;
! ; return 0; }
  EOF
+ if { (eval echo configure:6574: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   has_weof=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   has_weof=no
+ fi
+ rm -f conftest*
+     echo "$ac_t""$has_weof" 1>&6
+   
+         ac_wfuncs=yes
+     for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:6590: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
  
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6618: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ \
+     ac_wfuncs=no
+ fi
+ done
  
!   
!         for ac_func in btowc wctob fgetwc fgetwc fgetws fputwc fputws fwide \
!     fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \
!     vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \
!     mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \
!     wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \
!     wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6653: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ \
+     ac_wfuncs=no
+ fi
+ done
  
! 
!     echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:6709: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
!       ac_isoC99_wchar_t=yes
!     else
!       ac_isoC99_wchar_t=no
!     fi
!     echo "$ac_t""$ac_isoC99_wchar_t" 1>&6
!   
!             ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:6721: checking for iconv.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6731: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+   ac_has_iconv_h=yes
+ else
+   echo "$ac_t""no" 1>&6
+ ac_has_iconv_h=no
+ fi
  
!     ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:6755: checking for langinfo.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6765: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+   ac_has_langinfo_h=yes
+ else
+   echo "$ac_t""no" 1>&6
+ ac_has_langinfo_h=no
+ fi
  
! 
!         echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:6789: checking for iconv in -liconv" >&5
! ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-liconv  $LIBS"
! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=no"
+ fi
+ rm -f conftest*
+ LIBS="$ac_save_LIBS"
  
! fi
! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   libiconv="-liconv"
! else
!   echo "$ac_t""no" 1>&6
! fi
! 
!     ac_save_LIBS="$LIBS"
!     LIBS="$LIBS $libiconv"
! 
!     for ac_func in iconv_open iconv_close iconv nl_langinfo
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6834: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
  EOF
+ if { (eval echo configure:6862: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
  
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
+ ac_XPG2funcs=no
+ fi
+ done
  
!   
!     LIBS="$ac_save_LIBS"
! 
!     echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:6892: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
!       ac_XPG2_wchar_t=yes
!     else
!       ac_XPG2_wchar_t=no
!     fi
!     echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
!   
!             echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:6903: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
!       cat >> confdefs.h <<\EOF
! #define _GLIBCPP_USE_WCHAR_T 1
  EOF
  
!       echo "$ac_t"""yes"" 1>&6
!     else
!       echo "$ac_t"""no"" 1>&6
!     fi
!   else
!         echo "configure: warning: wchar_t support disabled." 1>&2
!   fi
! 
!       os_include_dir="config/os/bsd/netbsd"
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGN 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGNF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FINITEF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FREXPF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_HYPOTF 1
  EOF
  
!       ;;
!     *-mingw32*)
!       for ac_hdr in sys/types.h locale.h float.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:6945: checking for $ac_hdr" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
  EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ { (eval echo configure:6955: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=yes"
+ else
+   echo "$ac_err" >&5
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_header_$ac_safe=no"
+ fi
+ rm -f conftest*
+ fi
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+   cat >> confdefs.h <&6
+ fi
+ done
  
!       
!   # If we're not using GNU ld, then there's no point in even trying these
!   # tests.  Check for that first.  We should have already tested for gld
!   # by now (in libtool), but require it now just to be safe...
!   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
!   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   
! 
!   # The name set by libtool depends on the version of libtool.  Shame on us
!   # for depending on an impl detail, but c'est la vie.  Older versions used
!   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
!   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
!   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
!   # set (hence we're using an older libtool), then set it.
!   if test x${with_gnu_ld+set} != xset; then
!     if test x${ac_cv_prog_gnu_ld+set} != xset; then
!       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
!       with_gnu_ld=no
!     else
!       with_gnu_ld=$ac_cv_prog_gnu_ld
!     fi
!   fi
! 
!   # Start by getting the version number.  I think the libtool test already
!   # does some of this, but throws away the result.
!   
!   ldver=`$LD --version 2>/dev/null | head -1 | \
!          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
!   
!   glibcpp_gnu_ld_version=`echo $ldver | \
!          $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
! 
!   # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
!     # GNU ld it is!  Joy and bunny rabbits!
! 
!     # All these tests are for C++; save the language and the compiler flags.
!     # Need to do this so that g++ won't try to link in libstdc++
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS='-x c++  -Wl,--gc-sections'
! 
!     # Check for -Wl,--gc-sections
!     # XXX This test is broken at the moment, as symbols required for
!     # linking are now in libsupc++ (not built yet.....). In addition, 
!     # this test has cored on solaris in the past. In addition,
!     # --gc-sections doesn't really work at the moment (keeps on discarding
!     # used sections, first .eh_frame and now some of the glibc sections for
!     # iconv). Bzzzzt. Thanks for playing, maybe next time.
!     echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
! echo "configure:7031: checking for ld that supports -Wl,--gc-sections" >&5
!     if test "$cross_compiling" = yes; then
!   ac_sectionLDflags=yes
! else
!   cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
! then
!   ac_sectionLDflags=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -fr conftest*
!   ac_sectionLDflags=no
! fi
! rm -fr conftest*
! fi
! 
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     else
!       # this is the suspicious part
!       CFLAGS=''
!     fi
!     if test "$ac_sectionLDflags" = "yes"; then
!       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
!     fi
!     echo "$ac_t""$ac_sectionLDflags" 1>&6
!   fi
! 
!   # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
!     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
!   fi
! 
!   
!   
! 
!       
      echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:7081: checking for main in -lm" >&5
  ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 4149,4162 ****
    ac_save_LIBS="$LIBS"
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
--- 7085,7098 ----
    ac_save_LIBS="$LIBS"
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
*************** fi
*** 4186,4197 ****
    for ac_func in nan copysignf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4190: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:7126: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 7150,7156 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:7154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** fi
*** 4240,4258 ****
  done
  
  
  
!           USE_COMPLEX_LONG_DOUBLE=no
!   if test x$ac_cv_func_copysignl = x"yes"; then
!     USE_COMPLEX_LONG_DOUBLE=yes
!     for ac_func in signbitl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4251: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
+ echo "configure:7183: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
  
! ; return 0; }
! EOF
! if { (eval echo configure:7211: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
! fi
! done
! 
!   for ac_func in __signbitf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7239: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 7263,7269 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:7267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** EOF
*** 4296,4323 ****
   
  else
    echo "$ac_t""no" 1>&6
! LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
  fi
  done
  
  
    fi
  
    
  
! 	
  
        echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:4312: checking for mbstate_t" >&5
    cat > conftest.$ac_ext <
  int main() {
  mbstate_t teststate;
  ; return 0; }
  EOF
! if { (eval echo configure:4321: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    have_mbstate_t=yes
  else
--- 7284,7368 ----
   
  else
    echo "$ac_t""no" 1>&6
! LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
  fi
  done
  
  
+           if test x$ac_cv_func_copysignl = x"yes"; then
+     for ac_func in __signbitl
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:7297: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:7325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
+ 
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
+ fi
+ done
+ 
    fi
  
    
  
!       
  
        echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:7357: checking for mbstate_t" >&5
    cat > conftest.$ac_ext <
  int main() {
  mbstate_t teststate;
  ; return 0; }
  EOF
! if { (eval echo configure:7366: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    have_mbstate_t=yes
  else
*************** EOF
*** 4339,4355 ****
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:4343: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4353: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 7384,7400 ----
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:7388: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:7398: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** ac_has_wchar_h=no
*** 4376,4394 ****
  fi
  done
  
!   ac_safe=`echo "wctype.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for wctype.h""... $ac_c" 1>&6
! echo "configure:4382: checking for wctype.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4392: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 7421,7441 ----
  fi
  done
  
!   for ac_hdr in wctype.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:7429: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:7439: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** rm -f conftest*
*** 4404,4430 ****
  fi
  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
!   ac_has_wctype_h=yes
  else
    echo "$ac_t""no" 1>&6
  ac_has_wctype_h=no
  fi
  
    
!     if test x"$ac_has_wchar_h" = xyes && test x"$ac_has_wctype_h" = xyes \
!      && test x"$enable_c_mbchar" != xno; then
        
              echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:4419: checking for WCHAR_MIN and WCHAR_MAX" >&5
      cat > conftest.$ac_ext <
  int main() {
  int i = WCHAR_MIN; int j = WCHAR_MAX;
  ; return 0; }
  EOF
! if { (eval echo configure:4428: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_wchar_minmax=yes
  else
--- 7451,7483 ----
  fi
  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
  ac_has_wctype_h=no
  fi
+ done
  
    
!     if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
        
              echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:7472: checking for WCHAR_MIN and WCHAR_MAX" >&5
      cat > conftest.$ac_ext <
  int main() {
  int i = WCHAR_MIN; int j = WCHAR_MAX;
  ; return 0; }
  EOF
! if { (eval echo configure:7481: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_wchar_minmax=yes
  else
*************** rm -f conftest*
*** 4437,4445 ****
      echo "$ac_t""$has_wchar_minmax" 1>&6
      
              echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:4441: checking for WEOF" >&5
      cat > conftest.$ac_ext <
--- 7490,7498 ----
      echo "$ac_t""$has_wchar_minmax" 1>&6
      
              echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:7494: checking for WEOF" >&5
      cat > conftest.$ac_ext <
*************** int main() {
*** 4448,4454 ****
  wint_t i = WEOF;
  ; return 0; }
  EOF
! if { (eval echo configure:4452: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_weof=yes
  else
--- 7501,7507 ----
  wint_t i = WEOF;
  ; return 0; }
  EOF
! if { (eval echo configure:7505: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_weof=yes
  else
*************** rm -f conftest*
*** 4464,4475 ****
      for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4468: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:7521: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 7545,7551 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:7549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 4527,4538 ****
      wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4531: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:7584: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 7608,7614 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:7612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 4583,4591 ****
  
  
      echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:4587: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes && test x"$has_wchar_minmax" = xyes \
!        && test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
--- 7636,7645 ----
  
  
      echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:7640: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
*************** echo "configure:4587: checking for ISO C
*** 4594,4610 ****
    
              ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:4598: checking for iconv.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4608: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 7648,7664 ----
    
              ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:7652: checking for iconv.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:7662: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** fi
*** 4628,4644 ****
  
      ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:4632: checking for langinfo.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4642: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 7682,7698 ----
  
      ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:7686: checking for langinfo.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:7696: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** fi
*** 4662,4668 ****
  
  
          echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:4666: checking for iconv in -liconv" >&5
  ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 7716,7722 ----
  
  
          echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:7720: checking for iconv in -liconv" >&5
  ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 4670,4676 ****
    ac_save_LIBS="$LIBS"
  LIBS="-liconv  $LIBS"
  cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
--- 7735,7741 ----
  iconv()
  ; return 0; }
  EOF
! if { (eval echo configure:7739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
*************** fi
*** 4707,4718 ****
      for ac_func in iconv_open iconv_close iconv nl_langinfo
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:4711: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:7765: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 7789,7795 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:7793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 4765,4773 ****
      LIBS="$ac_save_LIBS"
  
      echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:4769: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes && test x"$ac_has_langinfo_h" = xyes \
!        && test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
--- 7819,7828 ----
      LIBS="$ac_save_LIBS"
  
      echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:7823: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
*************** echo "configure:4769: checking for XPG2 
*** 4775,4783 ****
      echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
    
              echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:4779: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes \
!     && test x"$ac_XPG2_wchar_t" = xyes; then
        cat >> confdefs.h <<\EOF
  #define _GLIBCPP_USE_WCHAR_T 1
  EOF
--- 7830,7838 ----
      echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
    
              echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:7834: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
        cat >> confdefs.h <<\EOF
  #define _GLIBCPP_USE_WCHAR_T 1
  EOF
*************** EOF
*** 4790,4840 ****
          echo "configure: warning: wchar_t support disabled." 1>&2
    fi
  
! 	os_include_dir="config/os/gnu-linux"
! 	# GLIBCPP_CHECK_STDLIB_SUPPORT
! 	cat >> confdefs.h <<\EOF
  #define HAVE_STRTOF 1
  EOF
          
! 	cat >> confdefs.h <<\EOF
  #define HAVE_STRTOLD 1
  EOF
          
! 	# AC_FUNC_MMAP
! 	cat >> confdefs.h <<\EOF
  #define HAVE_MMAP 1
  EOF
  
! 	;;
!     *)
! 	# We assume newlib.  This lets us hard-code the functions we know
! 	# we'll have.
! 	cat >> confdefs.h <<\EOF
  #define HAVE_FINITE 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISNAN 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
! #define HAVE_ISNANF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_ISINF 1
  EOF
  
! 	cat >> confdefs.h <<\EOF
  #define HAVE_ISINFF 1
  EOF
  
  
! 	os_include_dir="config/os/newlib"
  
! 	# need to check for faster f versions of math functions, ie sinf?
! 	;;
    esac
  else
  
    # We are being configured natively. We can do more elaborate tests
--- 7845,8116 ----
          echo "configure: warning: wchar_t support disabled." 1>&2
    fi
  
!       os_include_dir="config/os/mingw32"
!       ;;
!     *)
!       os_include_dir="config/os/newlib"
!       cat >> confdefs.h <<\EOF
! #define HAVE_HYPOT 1
! EOF
! 
!       ;;
!   esac
! 
!   case "$target_alias" in
!     *-mingw32*)
!       ;;
!     *)
!       # GLIBCPP_CHECK_STDLIB_SUPPORT
!       cat >> confdefs.h <<\EOF
  #define HAVE_STRTOF 1
  EOF
          
!       cat >> confdefs.h <<\EOF
  #define HAVE_STRTOLD 1
  EOF
          
!       # AC_FUNC_MMAP
!       cat >> confdefs.h <<\EOF
  #define HAVE_MMAP 1
  EOF
  
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_ACOSF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_ASINF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_ATAN2F 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_ATANF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_CEILF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGN 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_COPYSIGNF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_COSF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_COSHF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_EXPF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_FABSF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
  #define HAVE_FINITE 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FINITEF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FLOORF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_FMODF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_FREXPF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
  #define HAVE_ISINF 1
  EOF
  
!       cat >> confdefs.h <<\EOF
  #define HAVE_ISINFF 1
  EOF
  
+       cat >> confdefs.h <<\EOF
+ #define HAVE_ISNAN 1
+ EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_ISNANF 1
! EOF
  
!       cat >> confdefs.h <<\EOF
! #define HAVE_LDEXPF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_LOG10F 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_LOGF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_MODFF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_POWF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_SINF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_SINHF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_SQRTF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_TANF 1
! EOF
! 
!       cat >> confdefs.h <<\EOF
! #define HAVE_TANHF 1
! EOF
! 
!       ;;
    esac
+ 
+   # At some point, we should differentiate between architectures
+   # like x86, which have long double versions, and alpha/powerpc/etc.,
+   # which don't. For the time being, punt.
+   if test x"long_double_math_on_this_cpu" = x"yes"; then
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ACOSL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ASINL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ATAN2L 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ATANL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_CEILL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_COPYSIGNL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_COSL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_COSHL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_EXPL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_FABSL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_FINITEL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_FLOORL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_FMODL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_FREXPL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ISINFL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_ISNANL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_LDEXPL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_LOG10L 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_LOGL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_MODFL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_POWL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_SINCOSL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_SINL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_SINHL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_SQRTL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_TANL 1
+ EOF
+ 
+     cat >> confdefs.h <<\EOF
+ #define HAVE_TANHL 1
+ EOF
+ 
+   fi
  else
  
    # We are being configured natively. We can do more elaborate tests
*************** else
*** 4849,4865 ****
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:4853: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:4863: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 8125,8141 ----
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:8129: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:8139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** cross_compiling=$ac_cv_prog_cxx_cross
*** 4910,4919 ****
  
    # Check for -ffunction-sections -fdata-sections
    echo $ac_n "checking for g++ that supports -ffunction-sections -fdata-sections""... $ac_c" 1>&6
! echo "configure:4914: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
    CXXFLAGS='-Werror -ffunction-sections -fdata-sections'
    cat > conftest.$ac_ext <&6
! echo "configure:8190: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
    CXXFLAGS='-Werror -ffunction-sections -fdata-sections'
    cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_fdsections=yes
  else
--- 8197,8203 ----
    
  ; return 0; }
  EOF
! if { (eval echo configure:8201: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_fdsections=yes
  else
*************** rm -f conftest*
*** 4937,4943 ****
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" && test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    echo "$ac_t""$ac_fdsections" 1>&6
--- 8213,8220 ----
      # this is the suspicious part
      CXXFLAGS=''
    fi
!   if test x"$ac_fdsections" = x"yes" &&
!      test x"$enable_debug" = x"no"; then
      SECTION_FLAGS='-ffunction-sections -fdata-sections'
    fi
    echo "$ac_t""$ac_fdsections" 1>&6
*************** cross_compiling=$ac_cv_prog_cc_cross
*** 4960,4967 ****
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    
  
    # Set --gc-sections.
!   if test "$ac_cv_prog_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
--- 8237,8268 ----
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
    
  
+   # The name set by libtool depends on the version of libtool.  Shame on us
+   # for depending on an impl detail, but c'est la vie.  Older versions used
+   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
+   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
+   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
+   # set (hence we're using an older libtool), then set it.
+   if test x${with_gnu_ld+set} != xset; then
+     if test x${ac_cv_prog_gnu_ld+set} != xset; then
+       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
+       with_gnu_ld=no
+     else
+       with_gnu_ld=$ac_cv_prog_gnu_ld
+     fi
+   fi
+ 
+   # Start by getting the version number.  I think the libtool test already
+   # does some of this, but throws away the result.
+   
+   ldver=`$LD --version 2>/dev/null | head -1 | \
+          sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
+   
+   glibcpp_gnu_ld_version=`echo $ldver | \
+          $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
+ 
    # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
      # GNU ld it is!  Joy and bunny rabbits!
  
      # All these tests are for C++; save the language and the compiler flags.
*************** cross_compiling=$ac_cv_prog_cc_cross
*** 4978,4989 ****
      # used sections, first .eh_frame and now some of the glibc sections for
      # iconv). Bzzzzt. Thanks for playing, maybe next time.
      echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6
! echo "configure:4982: checking for ld that supports -Wl,--gc-sections" >&5
      if test "$cross_compiling" = yes; then
    ac_sectionLDflags=yes
  else
    cat > conftest.$ac_ext <&6
! echo "configure:8283: checking for ld that supports -Wl,--gc-sections" >&5
      if test "$cross_compiling" = yes; then
    ac_sectionLDflags=yes
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_sectionLDflags=yes
  else
--- 8295,8301 ----
       }
      
  EOF
! if { (eval echo configure:8299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_sectionLDflags=yes
  else
*************** fi
*** 5019,5025 ****
    fi
  
    # Set linker optimization flags.
!   if test x"$ac_cv_prog_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
--- 8320,8326 ----
    fi
  
    # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes" && test x"$enable_debug" = x"no"; then
      OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
    fi
  
*************** fi
*** 5029,5035 ****
    
        
    echo $ac_n "checking for __builtin_abs declaration""... $ac_c" 1>&6
! echo "configure:5033: checking for __builtin_abs declaration" >&5
    if test x${glibcpp_cv_func___builtin_abs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8330,8336 ----
    
        
    echo $ac_n "checking for __builtin_abs declaration""... $ac_c" 1>&6
! echo "configure:8334: checking for __builtin_abs declaration" >&5
    if test x${glibcpp_cv_func___builtin_abs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5044,5057 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_abs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_abs_use=yes
  else
--- 8345,8358 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_abs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8356: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_abs_use=yes
  else
*************** fi
*** 5075,5095 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_abs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_abs_use = x"yes"; then
      echo $ac_n "checking for __builtin_abs linkage""... $ac_c" 1>&6
! echo "configure:5079: checking for __builtin_abs linkage" >&5
      if test x${glibcpp_cv_func___builtin_abs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_abs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_abs_link=yes
  else
--- 8376,8396 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_abs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_abs_use = x"yes"; then
      echo $ac_n "checking for __builtin_abs linkage""... $ac_c" 1>&6
! echo "configure:8380: checking for __builtin_abs linkage" >&5
      if test x${glibcpp_cv_func___builtin_abs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_abs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_abs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_abs_link=yes
  else
*************** EOF
*** 5115,5121 ****
  
    
    echo $ac_n "checking for __builtin_fabsf declaration""... $ac_c" 1>&6
! echo "configure:5119: checking for __builtin_fabsf declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8416,8422 ----
  
    
    echo $ac_n "checking for __builtin_fabsf declaration""... $ac_c" 1>&6
! echo "configure:8420: checking for __builtin_fabsf declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5130,5143 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5141: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsf_use=yes
  else
--- 8431,8444 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8442: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsf_use=yes
  else
*************** fi
*** 5161,5181 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_fabsf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabsf_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabsf linkage""... $ac_c" 1>&6
! echo "configure:5165: checking for __builtin_fabsf linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabsf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsf_link=yes
  else
--- 8462,8482 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_fabsf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabsf_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabsf linkage""... $ac_c" 1>&6
! echo "configure:8466: checking for __builtin_fabsf linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabsf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsf_link=yes
  else
*************** EOF
*** 5201,5207 ****
  
    
    echo $ac_n "checking for __builtin_fabs declaration""... $ac_c" 1>&6
! echo "configure:5205: checking for __builtin_fabs declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8502,8508 ----
  
    
    echo $ac_n "checking for __builtin_fabs declaration""... $ac_c" 1>&6
! echo "configure:8506: checking for __builtin_fabs declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5216,5229 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5227: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabs_use=yes
  else
--- 8517,8530 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8528: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabs_use=yes
  else
*************** fi
*** 5247,5267 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_fabs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabs_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabs linkage""... $ac_c" 1>&6
! echo "configure:5251: checking for __builtin_fabs linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabs_link=yes
  else
--- 8548,8568 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_fabs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabs_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabs linkage""... $ac_c" 1>&6
! echo "configure:8552: checking for __builtin_fabs linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabs_link=yes
  else
*************** EOF
*** 5287,5293 ****
  
    
    echo $ac_n "checking for __builtin_fabsl declaration""... $ac_c" 1>&6
! echo "configure:5291: checking for __builtin_fabsl declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8588,8594 ----
  
    
    echo $ac_n "checking for __builtin_fabsl declaration""... $ac_c" 1>&6
! echo "configure:8592: checking for __builtin_fabsl declaration" >&5
    if test x${glibcpp_cv_func___builtin_fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5302,5315 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsl_use=yes
  else
--- 8603,8616 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8614: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsl_use=yes
  else
*************** fi
*** 5333,5353 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_fabsl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabsl_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabsl linkage""... $ac_c" 1>&6
! echo "configure:5337: checking for __builtin_fabsl linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabsl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5351: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsl_link=yes
  else
--- 8634,8654 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_fabsl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_fabsl_use = x"yes"; then
      echo $ac_n "checking for __builtin_fabsl linkage""... $ac_c" 1>&6
! echo "configure:8638: checking for __builtin_fabsl linkage" >&5
      if test x${glibcpp_cv_func___builtin_fabsl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fabsl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_fabsl_link=yes
  else
*************** EOF
*** 5373,5379 ****
  
    
    echo $ac_n "checking for __builtin_labs declaration""... $ac_c" 1>&6
! echo "configure:5377: checking for __builtin_labs declaration" >&5
    if test x${glibcpp_cv_func___builtin_labs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8674,8680 ----
  
    
    echo $ac_n "checking for __builtin_labs declaration""... $ac_c" 1>&6
! echo "configure:8678: checking for __builtin_labs declaration" >&5
    if test x${glibcpp_cv_func___builtin_labs_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5388,5401 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_labs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5399: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_labs_use=yes
  else
--- 8689,8702 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_labs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8700: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_labs_use=yes
  else
*************** fi
*** 5419,5439 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_labs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_labs_use = x"yes"; then
      echo $ac_n "checking for __builtin_labs linkage""... $ac_c" 1>&6
! echo "configure:5423: checking for __builtin_labs linkage" >&5
      if test x${glibcpp_cv_func___builtin_labs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_labs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_labs_link=yes
  else
--- 8720,8740 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_labs_use" 1>&6
    if test x$glibcpp_cv_func___builtin_labs_use = x"yes"; then
      echo $ac_n "checking for __builtin_labs linkage""... $ac_c" 1>&6
! echo "configure:8724: checking for __builtin_labs linkage" >&5
      if test x${glibcpp_cv_func___builtin_labs_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_labs_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_labs(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_labs_link=yes
  else
*************** EOF
*** 5460,5466 ****
  
    
    echo $ac_n "checking for __builtin_sqrtf declaration""... $ac_c" 1>&6
! echo "configure:5464: checking for __builtin_sqrtf declaration" >&5
    if test x${glibcpp_cv_func___builtin_sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8761,8767 ----
  
    
    echo $ac_n "checking for __builtin_sqrtf declaration""... $ac_c" 1>&6
! echo "configure:8765: checking for __builtin_sqrtf declaration" >&5
    if test x${glibcpp_cv_func___builtin_sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5475,5488 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5486: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtf_use=yes
  else
--- 8776,8789 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8787: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtf_use=yes
  else
*************** fi
*** 5506,5526 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_sqrtf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sqrtf_use = x"yes"; then
      echo $ac_n "checking for __builtin_sqrtf linkage""... $ac_c" 1>&6
! echo "configure:5510: checking for __builtin_sqrtf linkage" >&5
      if test x${glibcpp_cv_func___builtin_sqrtf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtf_link=yes
  else
--- 8807,8827 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_sqrtf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sqrtf_use = x"yes"; then
      echo $ac_n "checking for __builtin_sqrtf linkage""... $ac_c" 1>&6
! echo "configure:8811: checking for __builtin_sqrtf linkage" >&5
      if test x${glibcpp_cv_func___builtin_sqrtf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8825: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtf_link=yes
  else
*************** EOF
*** 5545,5554 ****
    fi
  
    
!   echo $ac_n "checking for __builtin_fsqrt declaration""... $ac_c" 1>&6
! echo "configure:5550: checking for __builtin_fsqrt declaration" >&5
!   if test x${glibcpp_cv_func___builtin_fsqrt_use+set} != xset; then
!     if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fsqrt_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
--- 8846,8855 ----
    fi
  
    
!   echo $ac_n "checking for __builtin_sqrt declaration""... $ac_c" 1>&6
! echo "configure:8851: checking for __builtin_sqrt declaration" >&5
!   if test x${glibcpp_cv_func___builtin_sqrt_use+set} != xset; then
!     if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrt_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5561,5581 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
!  __builtin_fsqrt(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5572: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
!   glibcpp_cv_func___builtin_fsqrt_use=yes
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
    rm -rf conftest*
!   glibcpp_cv_func___builtin_fsqrt_use=no
  fi
  rm -f conftest*
        ac_ext=c
--- 8862,8882 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
!  __builtin_sqrt(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
!   glibcpp_cv_func___builtin_sqrt_use=yes
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
    rm -rf conftest*
!   glibcpp_cv_func___builtin_sqrt_use=no
  fi
  rm -f conftest*
        ac_ext=c
*************** cross_compiling=$ac_cv_prog_cc_cross
*** 5589,5628 ****
  fi
  
    fi
!   echo "$ac_t""$glibcpp_cv_func___builtin_fsqrt_use" 1>&6
!   if test x$glibcpp_cv_func___builtin_fsqrt_use = x"yes"; then
!     echo $ac_n "checking for __builtin_fsqrt linkage""... $ac_c" 1>&6
! echo "configure:5596: checking for __builtin_fsqrt linkage" >&5
!     if test x${glibcpp_cv_func___builtin_fsqrt_link+set} != xset; then
!       if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_fsqrt_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
!  __builtin_fsqrt(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
!   glibcpp_cv_func___builtin_fsqrt_link=yes
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
    rm -rf conftest*
!   glibcpp_cv_func___builtin_fsqrt_link=no
  fi
  rm -f conftest*
        
  fi
  
      fi
!     echo "$ac_t""$glibcpp_cv_func___builtin_fsqrt_link" 1>&6
!     if test x$glibcpp_cv_func___builtin_fsqrt_link = x"yes"; then
!       ac_tr_func=HAVE_`echo __builtin_fsqrt | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
        cat >> confdefs.h <&6
!   if test x$glibcpp_cv_func___builtin_sqrt_use = x"yes"; then
!     echo $ac_n "checking for __builtin_sqrt linkage""... $ac_c" 1>&6
! echo "configure:8897: checking for __builtin_sqrt linkage" >&5
!     if test x${glibcpp_cv_func___builtin_sqrt_link+set} != xset; then
!       if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrt_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
!  __builtin_sqrt(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
!   glibcpp_cv_func___builtin_sqrt_link=yes
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
    rm -rf conftest*
!   glibcpp_cv_func___builtin_sqrt_link=no
  fi
  rm -f conftest*
        
  fi
  
      fi
!     echo "$ac_t""$glibcpp_cv_func___builtin_sqrt_link" 1>&6
!     if test x$glibcpp_cv_func___builtin_sqrt_link = x"yes"; then
!       ac_tr_func=HAVE_`echo __builtin_sqrt | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
        cat >> confdefs.h <&6
! echo "configure:5636: checking for __builtin_sqrtl declaration" >&5
    if test x${glibcpp_cv_func___builtin_sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 8933,8939 ----
  
    
    echo $ac_n "checking for __builtin_sqrtl declaration""... $ac_c" 1>&6
! echo "configure:8937: checking for __builtin_sqrtl declaration" >&5
    if test x${glibcpp_cv_func___builtin_sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5647,5660 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5658: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtl_use=yes
  else
--- 8948,8961 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8959: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtl_use=yes
  else
*************** fi
*** 5678,5698 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_sqrtl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sqrtl_use = x"yes"; then
      echo $ac_n "checking for __builtin_sqrtl linkage""... $ac_c" 1>&6
! echo "configure:5682: checking for __builtin_sqrtl linkage" >&5
      if test x${glibcpp_cv_func___builtin_sqrtl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtl_link=yes
  else
--- 8979,8999 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_sqrtl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sqrtl_use = x"yes"; then
      echo $ac_n "checking for __builtin_sqrtl linkage""... $ac_c" 1>&6
! echo "configure:8983: checking for __builtin_sqrtl linkage" >&5
      if test x${glibcpp_cv_func___builtin_sqrtl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sqrtl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sqrtl_link=yes
  else
*************** EOF
*** 5719,5725 ****
  
    
    echo $ac_n "checking for __builtin_sinf declaration""... $ac_c" 1>&6
! echo "configure:5723: checking for __builtin_sinf declaration" >&5
    if test x${glibcpp_cv_func___builtin_sinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9020,9026 ----
  
    
    echo $ac_n "checking for __builtin_sinf declaration""... $ac_c" 1>&6
! echo "configure:9024: checking for __builtin_sinf declaration" >&5
    if test x${glibcpp_cv_func___builtin_sinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5734,5747 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinf_use=yes
  else
--- 9035,9048 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9046: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinf_use=yes
  else
*************** fi
*** 5765,5785 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_sinf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sinf_use = x"yes"; then
      echo $ac_n "checking for __builtin_sinf linkage""... $ac_c" 1>&6
! echo "configure:5769: checking for __builtin_sinf linkage" >&5
      if test x${glibcpp_cv_func___builtin_sinf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinf_link=yes
  else
--- 9066,9086 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_sinf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sinf_use = x"yes"; then
      echo $ac_n "checking for __builtin_sinf linkage""... $ac_c" 1>&6
! echo "configure:9070: checking for __builtin_sinf linkage" >&5
      if test x${glibcpp_cv_func___builtin_sinf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinf_link=yes
  else
*************** EOF
*** 5805,5811 ****
  
    
    echo $ac_n "checking for __builtin_sin declaration""... $ac_c" 1>&6
! echo "configure:5809: checking for __builtin_sin declaration" >&5
    if test x${glibcpp_cv_func___builtin_sin_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9106,9112 ----
  
    
    echo $ac_n "checking for __builtin_sin declaration""... $ac_c" 1>&6
! echo "configure:9110: checking for __builtin_sin declaration" >&5
    if test x${glibcpp_cv_func___builtin_sin_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5820,5833 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sin(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5831: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sin_use=yes
  else
--- 9121,9134 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sin(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9132: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sin_use=yes
  else
*************** fi
*** 5851,5871 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_sin_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sin_use = x"yes"; then
      echo $ac_n "checking for __builtin_sin linkage""... $ac_c" 1>&6
! echo "configure:5855: checking for __builtin_sin linkage" >&5
      if test x${glibcpp_cv_func___builtin_sin_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sin(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5869: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sin_link=yes
  else
--- 9152,9172 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_sin_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sin_use = x"yes"; then
      echo $ac_n "checking for __builtin_sin linkage""... $ac_c" 1>&6
! echo "configure:9156: checking for __builtin_sin linkage" >&5
      if test x${glibcpp_cv_func___builtin_sin_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sin_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sin(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sin_link=yes
  else
*************** EOF
*** 5891,5897 ****
  
    
    echo $ac_n "checking for __builtin_sinl declaration""... $ac_c" 1>&6
! echo "configure:5895: checking for __builtin_sinl declaration" >&5
    if test x${glibcpp_cv_func___builtin_sinl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9192,9198 ----
  
    
    echo $ac_n "checking for __builtin_sinl declaration""... $ac_c" 1>&6
! echo "configure:9196: checking for __builtin_sinl declaration" >&5
    if test x${glibcpp_cv_func___builtin_sinl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5906,5919 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sinl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5917: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinl_use=yes
  else
--- 9207,9220 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_sinl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9218: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinl_use=yes
  else
*************** fi
*** 5937,5957 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_sinl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sinl_use = x"yes"; then
      echo $ac_n "checking for __builtin_sinl linkage""... $ac_c" 1>&6
! echo "configure:5941: checking for __builtin_sinl linkage" >&5
      if test x${glibcpp_cv_func___builtin_sinl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sinl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:5955: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinl_link=yes
  else
--- 9238,9258 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_sinl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_sinl_use = x"yes"; then
      echo $ac_n "checking for __builtin_sinl linkage""... $ac_c" 1>&6
! echo "configure:9242: checking for __builtin_sinl linkage" >&5
      if test x${glibcpp_cv_func___builtin_sinl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_sinl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_sinl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_sinl_link=yes
  else
*************** EOF
*** 5978,5984 ****
  
    
    echo $ac_n "checking for __builtin_cosf declaration""... $ac_c" 1>&6
! echo "configure:5982: checking for __builtin_cosf declaration" >&5
    if test x${glibcpp_cv_func___builtin_cosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9279,9285 ----
  
    
    echo $ac_n "checking for __builtin_cosf declaration""... $ac_c" 1>&6
! echo "configure:9283: checking for __builtin_cosf declaration" >&5
    if test x${glibcpp_cv_func___builtin_cosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 5993,6006 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cosf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6004: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosf_use=yes
  else
--- 9294,9307 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cosf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9305: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosf_use=yes
  else
*************** fi
*** 6024,6044 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_cosf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cosf_use = x"yes"; then
      echo $ac_n "checking for __builtin_cosf linkage""... $ac_c" 1>&6
! echo "configure:6028: checking for __builtin_cosf linkage" >&5
      if test x${glibcpp_cv_func___builtin_cosf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cosf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosf_link=yes
  else
--- 9325,9345 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_cosf_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cosf_use = x"yes"; then
      echo $ac_n "checking for __builtin_cosf linkage""... $ac_c" 1>&6
! echo "configure:9329: checking for __builtin_cosf linkage" >&5
      if test x${glibcpp_cv_func___builtin_cosf_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosf_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cosf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosf_link=yes
  else
*************** EOF
*** 6064,6070 ****
  
    
    echo $ac_n "checking for __builtin_cos declaration""... $ac_c" 1>&6
! echo "configure:6068: checking for __builtin_cos declaration" >&5
    if test x${glibcpp_cv_func___builtin_cos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9365,9371 ----
  
    
    echo $ac_n "checking for __builtin_cos declaration""... $ac_c" 1>&6
! echo "configure:9369: checking for __builtin_cos declaration" >&5
    if test x${glibcpp_cv_func___builtin_cos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6079,6092 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cos(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6090: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cos_use=yes
  else
--- 9380,9393 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cos(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9391: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cos_use=yes
  else
*************** fi
*** 6110,6130 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_cos_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cos_use = x"yes"; then
      echo $ac_n "checking for __builtin_cos linkage""... $ac_c" 1>&6
! echo "configure:6114: checking for __builtin_cos linkage" >&5
      if test x${glibcpp_cv_func___builtin_cos_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cos(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cos_link=yes
  else
--- 9411,9431 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_cos_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cos_use = x"yes"; then
      echo $ac_n "checking for __builtin_cos linkage""... $ac_c" 1>&6
! echo "configure:9415: checking for __builtin_cos linkage" >&5
      if test x${glibcpp_cv_func___builtin_cos_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cos_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cos(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9429: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cos_link=yes
  else
*************** EOF
*** 6150,6156 ****
  
    
    echo $ac_n "checking for __builtin_cosl declaration""... $ac_c" 1>&6
! echo "configure:6154: checking for __builtin_cosl declaration" >&5
    if test x${glibcpp_cv_func___builtin_cosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9451,9457 ----
  
    
    echo $ac_n "checking for __builtin_cosl declaration""... $ac_c" 1>&6
! echo "configure:9455: checking for __builtin_cosl declaration" >&5
    if test x${glibcpp_cv_func___builtin_cosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6165,6178 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cosl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6176: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosl_use=yes
  else
--- 9466,9479 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   __builtin_cosl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9477: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosl_use=yes
  else
*************** fi
*** 6196,6216 ****
    echo "$ac_t""$glibcpp_cv_func___builtin_cosl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cosl_use = x"yes"; then
      echo $ac_n "checking for __builtin_cosl linkage""... $ac_c" 1>&6
! echo "configure:6200: checking for __builtin_cosl linkage" >&5
      if test x${glibcpp_cv_func___builtin_cosl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cosl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6214: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosl_link=yes
  else
--- 9497,9517 ----
    echo "$ac_t""$glibcpp_cv_func___builtin_cosl_use" 1>&6
    if test x$glibcpp_cv_func___builtin_cosl_use = x"yes"; then
      echo $ac_n "checking for __builtin_cosl linkage""... $ac_c" 1>&6
! echo "configure:9501: checking for __builtin_cosl linkage" >&5
      if test x${glibcpp_cv_func___builtin_cosl_link+set} != xset; then
        if eval "test \"`echo '$''{'glibcpp_cv_func___builtin_cosl_link'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    
          cat > conftest.$ac_ext <
  int main() {
   __builtin_cosl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9515: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    glibcpp_cv_func___builtin_cosl_link=yes
  else
*************** EOF
*** 6282,6288 ****
  EOF
  
      cat >> confdefs.h <<\EOF
! #define HAVE___BUILTIN_FSQRT 1
  EOF
  
      cat >> confdefs.h <<\EOF
--- 9583,9589 ----
  EOF
  
      cat >> confdefs.h <<\EOF
! #define HAVE___BUILTIN_SQRT 1
  EOF
  
      cat >> confdefs.h <<\EOF
*************** EOF
*** 6301,6307 ****
    CXXFLAGS='-fno-builtins -D_GNU_SOURCE'
  
      echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
! echo "configure:6305: checking for sin in -lm" >&5
  ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9602,9608 ----
    CXXFLAGS='-fno-builtins -D_GNU_SOURCE'
  
      echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
! echo "configure:9606: checking for sin in -lm" >&5
  ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 6309,6315 ****
    ac_save_LIBS="$LIBS"
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
--- 9621,9627 ----
  sin()
  ; return 0; }
  EOF
! if { (eval echo configure:9625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
*************** fi
*** 6346,6352 ****
      
    
    echo $ac_n "checking for isinf declaration""... $ac_c" 1>&6
! echo "configure:6350: checking for isinf declaration" >&5
    if test x${glibcpp_cv_func_isinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9647,9653 ----
      
    
    echo $ac_n "checking for isinf declaration""... $ac_c" 1>&6
! echo "configure:9651: checking for isinf declaration" >&5
    if test x${glibcpp_cv_func_isinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6361,6367 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 9662,9668 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6372,6378 ****
   isinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6376: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinf_use=yes
  else
--- 9673,9679 ----
   isinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9677: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinf_use=yes
  else
*************** fi
*** 6399,6410 ****
      for ac_func in isinf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6403: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:9704: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 9728,9734 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:9732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 6454,6460 ****
    else
      
    echo $ac_n "checking for _isinf declaration""... $ac_c" 1>&6
! echo "configure:6458: checking for _isinf declaration" >&5
    if test x${glibcpp_cv_func__isinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9755,9761 ----
    else
      
    echo $ac_n "checking for _isinf declaration""... $ac_c" 1>&6
! echo "configure:9759: checking for _isinf declaration" >&5
    if test x${glibcpp_cv_func__isinf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6469,6475 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 9770,9776 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6480,6486 ****
   _isinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6484: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinf_use=yes
  else
--- 9781,9787 ----
   _isinf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9785: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinf_use=yes
  else
*************** fi
*** 6507,6518 ****
        for ac_func in _isinf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6511: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:9812: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 9836,9842 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:9840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 6559,6571 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for isnan declaration""... $ac_c" 1>&6
! echo "configure:6569: checking for isnan declaration" >&5
    if test x${glibcpp_cv_func_isnan_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnan_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9860,9872 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for isnan declaration""... $ac_c" 1>&6
! echo "configure:9870: checking for isnan declaration" >&5
    if test x${glibcpp_cv_func_isnan_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnan_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6580,6586 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 9881,9887 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6591,6597 ****
   isnan(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6595: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnan_use=yes
  else
--- 9892,9898 ----
   isnan(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnan_use=yes
  else
*************** fi
*** 6618,6629 ****
      for ac_func in isnan
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6622: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:9923: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 9947,9953 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:9951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 6673,6679 ****
    else
      
    echo $ac_n "checking for _isnan declaration""... $ac_c" 1>&6
! echo "configure:6677: checking for _isnan declaration" >&5
    if test x${glibcpp_cv_func__isnan_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnan_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 9974,9980 ----
    else
      
    echo $ac_n "checking for _isnan declaration""... $ac_c" 1>&6
! echo "configure:9978: checking for _isnan declaration" >&5
    if test x${glibcpp_cv_func__isnan_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnan_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6688,6694 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 9989,9995 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6699,6705 ****
   _isnan(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnan_use=yes
  else
--- 10000,10006 ----
   _isnan(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10004: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnan_use=yes
  else
*************** fi
*** 6726,6737 ****
        for ac_func in _isnan
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6730: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10031: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10055,10061 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 6778,6790 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for finite declaration""... $ac_c" 1>&6
! echo "configure:6788: checking for finite declaration" >&5
    if test x${glibcpp_cv_func_finite_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finite_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10079,10091 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for finite declaration""... $ac_c" 1>&6
! echo "configure:10089: checking for finite declaration" >&5
    if test x${glibcpp_cv_func_finite_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finite_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6799,6805 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 10100,10106 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6810,6816 ****
   finite(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6814: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finite_use=yes
  else
--- 10111,10117 ----
   finite(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finite_use=yes
  else
*************** fi
*** 6837,6848 ****
      for ac_func in finite
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6841: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10142: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10166,10172 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 6892,6898 ****
    else
      
    echo $ac_n "checking for _finite declaration""... $ac_c" 1>&6
! echo "configure:6896: checking for _finite declaration" >&5
    if test x${glibcpp_cv_func__finite_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finite_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10193,10199 ----
    else
      
    echo $ac_n "checking for _finite declaration""... $ac_c" 1>&6
! echo "configure:10197: checking for _finite declaration" >&5
    if test x${glibcpp_cv_func__finite_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finite_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 6907,6913 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 10208,10214 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 6918,6924 ****
   _finite(0);
  ; return 0; }
  EOF
! if { (eval echo configure:6922: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finite_use=yes
  else
--- 10219,10225 ----
   _finite(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10223: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finite_use=yes
  else
*************** fi
*** 6945,6956 ****
        for ac_func in _finite
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:6949: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10250: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10274,10280 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 6997,7009 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for copysign declaration""... $ac_c" 1>&6
! echo "configure:7007: checking for copysign declaration" >&5
    if test x${glibcpp_cv_func_copysign_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_copysign_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10298,10310 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for copysign declaration""... $ac_c" 1>&6
! echo "configure:10308: checking for copysign declaration" >&5
    if test x${glibcpp_cv_func_copysign_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_copysign_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7018,7031 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   copysign(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7029: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_copysign_use=yes
  else
--- 10319,10332 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   copysign(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10330: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_copysign_use=yes
  else
*************** fi
*** 7052,7063 ****
      for ac_func in copysign
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7056: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10357: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10381,10387 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10385: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 7107,7113 ****
    else
      
    echo $ac_n "checking for _copysign declaration""... $ac_c" 1>&6
! echo "configure:7111: checking for _copysign declaration" >&5
    if test x${glibcpp_cv_func__copysign_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__copysign_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10408,10414 ----
    else
      
    echo $ac_n "checking for _copysign declaration""... $ac_c" 1>&6
! echo "configure:10412: checking for _copysign declaration" >&5
    if test x${glibcpp_cv_func__copysign_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__copysign_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7122,7135 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _copysign(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7133: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__copysign_use=yes
  else
--- 10423,10436 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _copysign(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10434: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__copysign_use=yes
  else
*************** fi
*** 7156,7167 ****
        for ac_func in _copysign
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7160: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10461: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10485,10491 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 7208,7220 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for sincos declaration""... $ac_c" 1>&6
! echo "configure:7218: checking for sincos declaration" >&5
    if test x${glibcpp_cv_func_sincos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10509,10521 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for sincos declaration""... $ac_c" 1>&6
! echo "configure:10519: checking for sincos declaration" >&5
    if test x${glibcpp_cv_func_sincos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7229,7242 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincos(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7240: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincos_use=yes
  else
--- 10530,10543 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincos(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincos_use=yes
  else
*************** fi
*** 7263,7274 ****
      for ac_func in sincos
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7267: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10568: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10592,10598 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 7318,7324 ****
    else
      
    echo $ac_n "checking for _sincos declaration""... $ac_c" 1>&6
! echo "configure:7322: checking for _sincos declaration" >&5
    if test x${glibcpp_cv_func__sincos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10619,10625 ----
    else
      
    echo $ac_n "checking for _sincos declaration""... $ac_c" 1>&6
! echo "configure:10623: checking for _sincos declaration" >&5
    if test x${glibcpp_cv_func__sincos_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincos_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7333,7346 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincos(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7344: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincos_use=yes
  else
--- 10634,10647 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincos(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10645: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincos_use=yes
  else
*************** fi
*** 7367,7378 ****
        for ac_func in _sincos
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7371: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10672: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10696,10702 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 7419,7431 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for fpclass declaration""... $ac_c" 1>&6
! echo "configure:7429: checking for fpclass declaration" >&5
    if test x${glibcpp_cv_func_fpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10720,10732 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for fpclass declaration""... $ac_c" 1>&6
! echo "configure:10730: checking for fpclass declaration" >&5
    if test x${glibcpp_cv_func_fpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7440,7446 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 10741,10747 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 7451,7457 ****
   fpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:7455: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fpclass_use=yes
  else
--- 10752,10758 ----
   fpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10756: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fpclass_use=yes
  else
*************** fi
*** 7478,7489 ****
      for ac_func in fpclass
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7482: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10783: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10807,10813 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 7533,7539 ****
    else
      
    echo $ac_n "checking for _fpclass declaration""... $ac_c" 1>&6
! echo "configure:7537: checking for _fpclass declaration" >&5
    if test x${glibcpp_cv_func__fpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10834,10840 ----
    else
      
    echo $ac_n "checking for _fpclass declaration""... $ac_c" 1>&6
! echo "configure:10838: checking for _fpclass declaration" >&5
    if test x${glibcpp_cv_func__fpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7548,7554 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 10849,10855 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 7559,7565 ****
   _fpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:7563: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fpclass_use=yes
  else
--- 10860,10866 ----
   _fpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10864: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fpclass_use=yes
  else
*************** fi
*** 7586,7597 ****
        for ac_func in _fpclass
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7590: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:10891: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 10915,10921 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:10919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 7638,7650 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for qfpclass declaration""... $ac_c" 1>&6
! echo "configure:7648: checking for qfpclass declaration" >&5
    if test x${glibcpp_cv_func_qfpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_qfpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 10939,10951 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for qfpclass declaration""... $ac_c" 1>&6
! echo "configure:10949: checking for qfpclass declaration" >&5
    if test x${glibcpp_cv_func_qfpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_qfpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7659,7665 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 10960,10966 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 7670,7676 ****
   qfpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:7674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_qfpclass_use=yes
  else
--- 10971,10977 ----
   qfpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10975: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_qfpclass_use=yes
  else
*************** fi
*** 7697,7708 ****
      for ac_func in qfpclass
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7701: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11002: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11026,11032 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 7752,7758 ****
    else
      
    echo $ac_n "checking for _qfpclass declaration""... $ac_c" 1>&6
! echo "configure:7756: checking for _qfpclass declaration" >&5
    if test x${glibcpp_cv_func__qfpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__qfpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 11053,11059 ----
    else
      
    echo $ac_n "checking for _qfpclass declaration""... $ac_c" 1>&6
! echo "configure:11057: checking for _qfpclass declaration" >&5
    if test x${glibcpp_cv_func__qfpclass_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__qfpclass_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7767,7773 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 11068,11074 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 7778,7784 ****
   _qfpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:7782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__qfpclass_use=yes
  else
--- 11079,11085 ----
   _qfpclass(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11083: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__qfpclass_use=yes
  else
*************** fi
*** 7805,7816 ****
        for ac_func in _qfpclass
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7809: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11110: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11134,11140 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11138: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 7857,7869 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for hypot declaration""... $ac_c" 1>&6
! echo "configure:7867: checking for hypot declaration" >&5
    if test x${glibcpp_cv_func_hypot_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypot_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 11158,11170 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for hypot declaration""... $ac_c" 1>&6
! echo "configure:11168: checking for hypot declaration" >&5
    if test x${glibcpp_cv_func_hypot_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypot_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7878,7891 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypot(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7889: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypot_use=yes
  else
--- 11179,11192 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypot(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:11190: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypot_use=yes
  else
*************** fi
*** 7912,7923 ****
      for ac_func in hypot
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:7916: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11217: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11241,11247 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 7967,7973 ****
    else
      
    echo $ac_n "checking for _hypot declaration""... $ac_c" 1>&6
! echo "configure:7971: checking for _hypot declaration" >&5
    if test x${glibcpp_cv_func__hypot_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypot_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 11268,11274 ----
    else
      
    echo $ac_n "checking for _hypot declaration""... $ac_c" 1>&6
! echo "configure:11272: checking for _hypot declaration" >&5
    if test x${glibcpp_cv_func__hypot_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypot_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 7982,7995 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypot(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:7993: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypot_use=yes
  else
--- 11283,11296 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypot(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:11294: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypot_use=yes
  else
*************** fi
*** 8016,8027 ****
        for ac_func in _hypot
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8020: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11321: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11345,11351 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11349: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 8068,8080 ****
  fi
  done
      
!     fi	
    fi
  
  
      
    echo $ac_n "checking for float trig functions""... $ac_c" 1>&6
! echo "configure:8078: checking for float trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_float_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 11369,11381 ----
  fi
  done
      
!     fi
    fi
  
  
      
    echo $ac_n "checking for float trig functions""... $ac_c" 1>&6
! echo "configure:11379: checking for float trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_float_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8088,8094 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
--- 11389,11395 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
*************** int main() {
*** 8097,8103 ****
                                            coshf sinhf tanhf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:8101: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_float_trig_use=yes
  else
--- 11398,11404 ----
                                            coshf sinhf tanhf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:11402: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_float_trig_use=yes
  else
*************** fi
*** 8123,8134 ****
                                            coshf sinhf tanhf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8127: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11428: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11452,11458 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 8179,8185 ****
  
    
    echo $ac_n "checking for float round functions""... $ac_c" 1>&6
! echo "configure:8183: checking for float round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_float_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 11480,11486 ----
  
    
    echo $ac_n "checking for float round functions""... $ac_c" 1>&6
! echo "configure:11484: checking for float round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_float_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8193,8206 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in ceilf floorf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:8204: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_float_round_use=yes
  else
--- 11494,11507 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in ceilf floorf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:11505: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_float_round_use=yes
  else
*************** fi
*** 8224,8235 ****
      for ac_func in ceilf floorf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8228: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11529: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11553,11559 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11557: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 8280,8287 ****
  
    
    
    echo $ac_n "checking for isnanf declaration""... $ac_c" 1>&6
! echo "configure:8285: checking for isnanf declaration" >&5
    if test x${glibcpp_cv_func_isnanf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnanf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 11581,11807 ----
  
    
    
+   echo $ac_n "checking for expf declaration""... $ac_c" 1>&6
+ echo "configure:11586: checking for expf declaration" >&5
+   if test x${glibcpp_cv_func_expf_use+set} != xset; then
+     if eval "test \"`echo '$''{'glibcpp_cv_func_expf_use'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   
+       
+       ac_ext=C
+ # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CXXCPP $CPPFLAGS'
+ ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cxx_cross
+ 
+       cat > conftest.$ac_ext <
+ 		      #ifdef HAVE_IEEEFP_H
+ 		      #include 
+ 		      #endif
+ 		     
+ int main() {
+  expf(0);
+ ; return 0; }
+ EOF
+ if { (eval echo configure:11612: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   glibcpp_cv_func_expf_use=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   glibcpp_cv_func_expf_use=no
+ fi
+ rm -f conftest*
+       ac_ext=c
+ # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cc_cross
+ 
+     
+ fi
+ 
+   fi
+   echo "$ac_t""$glibcpp_cv_func_expf_use" 1>&6
+ 
+   if test x$glibcpp_cv_func_expf_use = x"yes"; then
+     for ac_func in expf
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:11639: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:11667: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
+ 
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ fi
+ done
+     
+   else
+     
+   echo $ac_n "checking for _expf declaration""... $ac_c" 1>&6
+ echo "configure:11694: checking for _expf declaration" >&5
+   if test x${glibcpp_cv_func__expf_use+set} != xset; then
+     if eval "test \"`echo '$''{'glibcpp_cv_func__expf_use'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   
+       
+       ac_ext=C
+ # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CXXCPP $CPPFLAGS'
+ ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cxx_cross
+ 
+       cat > conftest.$ac_ext <
+ 		      #ifdef HAVE_IEEEFP_H
+ 		      #include 
+ 		      #endif
+ 		     
+ int main() {
+  _expf(0);
+ ; return 0; }
+ EOF
+ if { (eval echo configure:11720: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   glibcpp_cv_func__expf_use=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   glibcpp_cv_func__expf_use=no
+ fi
+ rm -f conftest*
+       ac_ext=c
+ # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cc_cross
+ 
+     
+ fi
+ 
+   fi
+   echo "$ac_t""$glibcpp_cv_func__expf_use" 1>&6
+ 
+     if test x$glibcpp_cv_func__expf_use = x"yes"; then
+       for ac_func in _expf
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:11747: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:11775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
+ 
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ fi
+ done
+     
+     fi
+   fi
+ 
+   
+   
    echo $ac_n "checking for isnanf declaration""... $ac_c" 1>&6
! echo "configure:11805: checking for isnanf declaration" >&5
    if test x${glibcpp_cv_func_isnanf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnanf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8296,8302 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 11816,11822 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 8307,8313 ****
   isnanf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8311: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnanf_use=yes
  else
--- 11827,11833 ----
   isnanf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11831: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnanf_use=yes
  else
*************** fi
*** 8334,8345 ****
      for ac_func in isnanf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8338: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11858: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11882,11888 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11886: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 8389,8395 ****
    else
      
    echo $ac_n "checking for _isnanf declaration""... $ac_c" 1>&6
! echo "configure:8393: checking for _isnanf declaration" >&5
    if test x${glibcpp_cv_func__isnanf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnanf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 11909,11915 ----
    else
      
    echo $ac_n "checking for _isnanf declaration""... $ac_c" 1>&6
! echo "configure:11913: checking for _isnanf declaration" >&5
    if test x${glibcpp_cv_func__isnanf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnanf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8404,8410 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 11924,11930 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 8415,8421 ****
   _isnanf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8419: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnanf_use=yes
  else
--- 11935,11941 ----
   _isnanf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11939: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnanf_use=yes
  else
*************** fi
*** 8442,8453 ****
        for ac_func in _isnanf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8446: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:11966: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 11990,11996 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:11994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 8494,8506 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for isinff declaration""... $ac_c" 1>&6
! echo "configure:8504: checking for isinff declaration" >&5
    if test x${glibcpp_cv_func_isinff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12014,12026 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for isinff declaration""... $ac_c" 1>&6
! echo "configure:12024: checking for isinff declaration" >&5
    if test x${glibcpp_cv_func_isinff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8515,8521 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 12035,12041 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 8526,8532 ****
   isinff(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8530: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinff_use=yes
  else
--- 12046,12052 ----
   isinff(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12050: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinff_use=yes
  else
*************** fi
*** 8553,8564 ****
      for ac_func in isinff
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8557: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12077: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12101,12107 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 8608,8614 ****
    else
      
    echo $ac_n "checking for _isinff declaration""... $ac_c" 1>&6
! echo "configure:8612: checking for _isinff declaration" >&5
    if test x${glibcpp_cv_func__isinff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12128,12134 ----
    else
      
    echo $ac_n "checking for _isinff declaration""... $ac_c" 1>&6
! echo "configure:12132: checking for _isinff declaration" >&5
    if test x${glibcpp_cv_func__isinff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8623,8629 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 12143,12149 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 8634,8640 ****
   _isinff(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8638: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinff_use=yes
  else
--- 12154,12160 ----
   _isinff(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinff_use=yes
  else
*************** fi
*** 8661,8672 ****
        for ac_func in _isinff
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8665: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12185: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12209,12215 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 8713,8725 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for atan2f declaration""... $ac_c" 1>&6
! echo "configure:8723: checking for atan2f declaration" >&5
    if test x${glibcpp_cv_func_atan2f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_atan2f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12233,12245 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for atan2f declaration""... $ac_c" 1>&6
! echo "configure:12243: checking for atan2f declaration" >&5
    if test x${glibcpp_cv_func_atan2f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_atan2f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8734,8747 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   atan2f(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:8745: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_atan2f_use=yes
  else
--- 12254,12267 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   atan2f(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_atan2f_use=yes
  else
*************** fi
*** 8768,8779 ****
      for ac_func in atan2f
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8772: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12292: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12316,12322 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 8823,8829 ****
    else
      
    echo $ac_n "checking for _atan2f declaration""... $ac_c" 1>&6
! echo "configure:8827: checking for _atan2f declaration" >&5
    if test x${glibcpp_cv_func__atan2f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__atan2f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12343,12349 ----
    else
      
    echo $ac_n "checking for _atan2f declaration""... $ac_c" 1>&6
! echo "configure:12347: checking for _atan2f declaration" >&5
    if test x${glibcpp_cv_func__atan2f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__atan2f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8838,8851 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _atan2f(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:8849: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__atan2f_use=yes
  else
--- 12358,12371 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _atan2f(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__atan2f_use=yes
  else
*************** fi
*** 8872,8883 ****
        for ac_func in _atan2f
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8876: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12396: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12420,12426 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 8924,8936 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for fabsf declaration""... $ac_c" 1>&6
! echo "configure:8934: checking for fabsf declaration" >&5
    if test x${glibcpp_cv_func_fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12444,12456 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for fabsf declaration""... $ac_c" 1>&6
! echo "configure:12454: checking for fabsf declaration" >&5
    if test x${glibcpp_cv_func_fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 8945,8951 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 12465,12471 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 8956,8962 ****
   fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:8960: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fabsf_use=yes
  else
--- 12476,12482 ----
   fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12480: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fabsf_use=yes
  else
*************** fi
*** 8983,8994 ****
      for ac_func in fabsf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:8987: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12507: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12531,12537 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 9038,9044 ****
    else
      
    echo $ac_n "checking for _fabsf declaration""... $ac_c" 1>&6
! echo "configure:9042: checking for _fabsf declaration" >&5
    if test x${glibcpp_cv_func__fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12558,12564 ----
    else
      
    echo $ac_n "checking for _fabsf declaration""... $ac_c" 1>&6
! echo "configure:12562: checking for _fabsf declaration" >&5
    if test x${glibcpp_cv_func__fabsf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fabsf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9053,9059 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 12573,12579 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 9064,9070 ****
   _fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:9068: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fabsf_use=yes
  else
--- 12584,12590 ----
   _fabsf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12588: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fabsf_use=yes
  else
*************** fi
*** 9091,9102 ****
        for ac_func in _fabsf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9095: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12615: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12639,12645 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 9143,9155 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for fmodf declaration""... $ac_c" 1>&6
! echo "configure:9153: checking for fmodf declaration" >&5
    if test x${glibcpp_cv_func_fmodf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fmodf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12663,12675 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for fmodf declaration""... $ac_c" 1>&6
! echo "configure:12673: checking for fmodf declaration" >&5
    if test x${glibcpp_cv_func_fmodf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fmodf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9164,9177 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   fmodf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9175: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fmodf_use=yes
  else
--- 12684,12697 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   fmodf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12695: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fmodf_use=yes
  else
*************** fi
*** 9198,9209 ****
      for ac_func in fmodf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9202: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12722: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12746,12752 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12750: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 9253,9259 ****
    else
      
    echo $ac_n "checking for _fmodf declaration""... $ac_c" 1>&6
! echo "configure:9257: checking for _fmodf declaration" >&5
    if test x${glibcpp_cv_func__fmodf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fmodf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12773,12779 ----
    else
      
    echo $ac_n "checking for _fmodf declaration""... $ac_c" 1>&6
! echo "configure:12777: checking for _fmodf declaration" >&5
    if test x${glibcpp_cv_func__fmodf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fmodf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9268,9281 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _fmodf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9279: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fmodf_use=yes
  else
--- 12788,12801 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _fmodf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fmodf_use=yes
  else
*************** fi
*** 9302,9313 ****
        for ac_func in _fmodf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9306: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12826: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12850,12856 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12854: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 9354,9366 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for frexpf declaration""... $ac_c" 1>&6
! echo "configure:9364: checking for frexpf declaration" >&5
    if test x${glibcpp_cv_func_frexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_frexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12874,12886 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for frexpf declaration""... $ac_c" 1>&6
! echo "configure:12884: checking for frexpf declaration" >&5
    if test x${glibcpp_cv_func_frexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_frexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9375,9388 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   frexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9386: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_frexpf_use=yes
  else
--- 12895,12908 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   frexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12906: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_frexpf_use=yes
  else
*************** fi
*** 9409,9420 ****
      for ac_func in frexpf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9413: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:12933: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 12957,12963 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:12961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 9464,9470 ****
    else
      
    echo $ac_n "checking for _frexpf declaration""... $ac_c" 1>&6
! echo "configure:9468: checking for _frexpf declaration" >&5
    if test x${glibcpp_cv_func__frexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__frexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 12984,12990 ----
    else
      
    echo $ac_n "checking for _frexpf declaration""... $ac_c" 1>&6
! echo "configure:12988: checking for _frexpf declaration" >&5
    if test x${glibcpp_cv_func__frexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__frexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9479,9492 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _frexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9490: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__frexpf_use=yes
  else
--- 12999,13012 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _frexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13010: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__frexpf_use=yes
  else
*************** fi
*** 9513,9524 ****
        for ac_func in _frexpf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9517: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13037: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13061,13067 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 9565,9577 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for hypotf declaration""... $ac_c" 1>&6
! echo "configure:9575: checking for hypotf declaration" >&5
    if test x${glibcpp_cv_func_hypotf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypotf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13085,13097 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for hypotf declaration""... $ac_c" 1>&6
! echo "configure:13095: checking for hypotf declaration" >&5
    if test x${glibcpp_cv_func_hypotf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypotf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9586,9599 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypotf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9597: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypotf_use=yes
  else
--- 13106,13119 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypotf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13117: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypotf_use=yes
  else
*************** fi
*** 9620,9631 ****
      for ac_func in hypotf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9624: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13144: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13168,13174 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 9675,9681 ****
    else
      
    echo $ac_n "checking for _hypotf declaration""... $ac_c" 1>&6
! echo "configure:9679: checking for _hypotf declaration" >&5
    if test x${glibcpp_cv_func__hypotf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypotf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13195,13201 ----
    else
      
    echo $ac_n "checking for _hypotf declaration""... $ac_c" 1>&6
! echo "configure:13199: checking for _hypotf declaration" >&5
    if test x${glibcpp_cv_func__hypotf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypotf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9690,9703 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypotf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9701: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypotf_use=yes
  else
--- 13210,13223 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypotf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypotf_use=yes
  else
*************** fi
*** 9724,9735 ****
        for ac_func in _hypotf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9728: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13248: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13272,13278 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 9776,9788 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for ldexpf declaration""... $ac_c" 1>&6
! echo "configure:9786: checking for ldexpf declaration" >&5
    if test x${glibcpp_cv_func_ldexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13296,13308 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for ldexpf declaration""... $ac_c" 1>&6
! echo "configure:13306: checking for ldexpf declaration" >&5
    if test x${glibcpp_cv_func_ldexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9797,9810 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   ldexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9808: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_ldexpf_use=yes
  else
--- 13317,13330 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   ldexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13328: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_ldexpf_use=yes
  else
*************** fi
*** 9831,9842 ****
      for ac_func in ldexpf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9835: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13355: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13379,13385 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13383: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 9886,9892 ****
    else
      
    echo $ac_n "checking for _ldexpf declaration""... $ac_c" 1>&6
! echo "configure:9890: checking for _ldexpf declaration" >&5
    if test x${glibcpp_cv_func__ldexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13406,13412 ----
    else
      
    echo $ac_n "checking for _ldexpf declaration""... $ac_c" 1>&6
! echo "configure:13410: checking for _ldexpf declaration" >&5
    if test x${glibcpp_cv_func__ldexpf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 9901,9914 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _ldexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:9912: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__ldexpf_use=yes
  else
--- 13421,13434 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _ldexpf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13432: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__ldexpf_use=yes
  else
*************** fi
*** 9935,9946 ****
        for ac_func in _ldexpf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:9939: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13459: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13483,13489 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 9987,9999 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for logf declaration""... $ac_c" 1>&6
! echo "configure:9997: checking for logf declaration" >&5
    if test x${glibcpp_cv_func_logf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_logf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13507,13519 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for logf declaration""... $ac_c" 1>&6
! echo "configure:13517: checking for logf declaration" >&5
    if test x${glibcpp_cv_func_logf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_logf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10008,10014 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 13528,13534 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10019,10025 ****
   logf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10023: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_logf_use=yes
  else
--- 13539,13545 ----
   logf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13543: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_logf_use=yes
  else
*************** fi
*** 10046,10057 ****
      for ac_func in logf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10050: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13570: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13594,13600 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13598: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 10101,10107 ****
    else
      
    echo $ac_n "checking for _logf declaration""... $ac_c" 1>&6
! echo "configure:10105: checking for _logf declaration" >&5
    if test x${glibcpp_cv_func__logf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__logf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13621,13627 ----
    else
      
    echo $ac_n "checking for _logf declaration""... $ac_c" 1>&6
! echo "configure:13625: checking for _logf declaration" >&5
    if test x${glibcpp_cv_func__logf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__logf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10116,10122 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 13636,13642 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10127,10133 ****
   _logf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10131: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__logf_use=yes
  else
--- 13647,13653 ----
   _logf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13651: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__logf_use=yes
  else
*************** fi
*** 10154,10165 ****
        for ac_func in _logf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10158: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13678: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13702,13708 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 10206,10218 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for log10f declaration""... $ac_c" 1>&6
! echo "configure:10216: checking for log10f declaration" >&5
    if test x${glibcpp_cv_func_log10f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_log10f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13726,13738 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for log10f declaration""... $ac_c" 1>&6
! echo "configure:13736: checking for log10f declaration" >&5
    if test x${glibcpp_cv_func_log10f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_log10f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10227,10233 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 13747,13753 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10238,10244 ****
   log10f(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10242: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_log10f_use=yes
  else
--- 13758,13764 ----
   log10f(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13762: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_log10f_use=yes
  else
*************** fi
*** 10265,10276 ****
      for ac_func in log10f
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10269: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13789: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13813,13819 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 10320,10326 ****
    else
      
    echo $ac_n "checking for _log10f declaration""... $ac_c" 1>&6
! echo "configure:10324: checking for _log10f declaration" >&5
    if test x${glibcpp_cv_func__log10f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__log10f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13840,13846 ----
    else
      
    echo $ac_n "checking for _log10f declaration""... $ac_c" 1>&6
! echo "configure:13844: checking for _log10f declaration" >&5
    if test x${glibcpp_cv_func__log10f_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__log10f_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10335,10341 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 13855,13861 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10346,10352 ****
   _log10f(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10350: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__log10f_use=yes
  else
--- 13866,13872 ----
   _log10f(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13870: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__log10f_use=yes
  else
*************** fi
*** 10373,10384 ****
        for ac_func in _log10f
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10377: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:13897: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 13921,13927 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:13925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 10425,10437 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for modff declaration""... $ac_c" 1>&6
! echo "configure:10435: checking for modff declaration" >&5
    if test x${glibcpp_cv_func_modff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_modff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 13945,13957 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for modff declaration""... $ac_c" 1>&6
! echo "configure:13955: checking for modff declaration" >&5
    if test x${glibcpp_cv_func_modff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_modff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10446,10459 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   modff(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10457: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_modff_use=yes
  else
--- 13966,13979 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   modff(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13977: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_modff_use=yes
  else
*************** fi
*** 10480,10491 ****
      for ac_func in modff
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10484: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14004: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14028,14034 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 10535,10541 ****
    else
      
    echo $ac_n "checking for _modff declaration""... $ac_c" 1>&6
! echo "configure:10539: checking for _modff declaration" >&5
    if test x${glibcpp_cv_func__modff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__modff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14055,14061 ----
    else
      
    echo $ac_n "checking for _modff declaration""... $ac_c" 1>&6
! echo "configure:14059: checking for _modff declaration" >&5
    if test x${glibcpp_cv_func__modff_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__modff_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10550,10563 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _modff(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10561: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__modff_use=yes
  else
--- 14070,14083 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _modff(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__modff_use=yes
  else
*************** fi
*** 10584,10595 ****
        for ac_func in _modff
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10588: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14108: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14132,14138 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 10636,10648 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for powf declaration""... $ac_c" 1>&6
! echo "configure:10646: checking for powf declaration" >&5
    if test x${glibcpp_cv_func_powf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_powf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14156,14168 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for powf declaration""... $ac_c" 1>&6
! echo "configure:14166: checking for powf declaration" >&5
    if test x${glibcpp_cv_func_powf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_powf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10657,10670 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   powf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10668: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_powf_use=yes
  else
--- 14177,14190 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   powf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14188: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_powf_use=yes
  else
*************** fi
*** 10691,10702 ****
      for ac_func in powf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10695: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14215: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14239,14245 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14243: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 10746,10752 ****
    else
      
    echo $ac_n "checking for _powf declaration""... $ac_c" 1>&6
! echo "configure:10750: checking for _powf declaration" >&5
    if test x${glibcpp_cv_func__powf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__powf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14266,14272 ----
    else
      
    echo $ac_n "checking for _powf declaration""... $ac_c" 1>&6
! echo "configure:14270: checking for _powf declaration" >&5
    if test x${glibcpp_cv_func__powf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__powf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10761,10774 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _powf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:10772: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__powf_use=yes
  else
--- 14281,14294 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _powf(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14292: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__powf_use=yes
  else
*************** fi
*** 10795,10806 ****
        for ac_func in _powf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10799: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14319: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14343,14349 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 10847,10859 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for sqrtf declaration""... $ac_c" 1>&6
! echo "configure:10857: checking for sqrtf declaration" >&5
    if test x${glibcpp_cv_func_sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14367,14379 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for sqrtf declaration""... $ac_c" 1>&6
! echo "configure:14377: checking for sqrtf declaration" >&5
    if test x${glibcpp_cv_func_sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10868,10874 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 14388,14394 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10879,10885 ****
   sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10883: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sqrtf_use=yes
  else
--- 14399,14405 ----
   sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14403: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sqrtf_use=yes
  else
*************** fi
*** 10906,10917 ****
      for ac_func in sqrtf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:10910: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14430: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14454,14460 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 10961,10967 ****
    else
      
    echo $ac_n "checking for _sqrtf declaration""... $ac_c" 1>&6
! echo "configure:10965: checking for _sqrtf declaration" >&5
    if test x${glibcpp_cv_func__sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14481,14487 ----
    else
      
    echo $ac_n "checking for _sqrtf declaration""... $ac_c" 1>&6
! echo "configure:14485: checking for _sqrtf declaration" >&5
    if test x${glibcpp_cv_func__sqrtf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 10976,10982 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 14496,14502 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 10987,10993 ****
   _sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:10991: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sqrtf_use=yes
  else
--- 14507,14513 ----
   _sqrtf(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14511: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sqrtf_use=yes
  else
*************** fi
*** 11014,11025 ****
        for ac_func in _sqrtf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11018: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14538: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14562,14568 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 11066,11078 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for sincosf declaration""... $ac_c" 1>&6
! echo "configure:11076: checking for sincosf declaration" >&5
    if test x${glibcpp_cv_func_sincosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14586,14598 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for sincosf declaration""... $ac_c" 1>&6
! echo "configure:14596: checking for sincosf declaration" >&5
    if test x${glibcpp_cv_func_sincosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11087,11100 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincosf(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:11098: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincosf_use=yes
  else
--- 14607,14620 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincosf(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincosf_use=yes
  else
*************** fi
*** 11121,11132 ****
      for ac_func in sincosf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11125: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14645: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14669,14675 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 11176,11182 ****
    else
      
    echo $ac_n "checking for _sincosf declaration""... $ac_c" 1>&6
! echo "configure:11180: checking for _sincosf declaration" >&5
    if test x${glibcpp_cv_func__sincosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14696,14702 ----
    else
      
    echo $ac_n "checking for _sincosf declaration""... $ac_c" 1>&6
! echo "configure:14700: checking for _sincosf declaration" >&5
    if test x${glibcpp_cv_func__sincosf_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincosf_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11191,11204 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincosf(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:11202: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincosf_use=yes
  else
--- 14711,14724 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincosf(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincosf_use=yes
  else
*************** fi
*** 11225,11236 ****
        for ac_func in _sincosf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11229: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14749: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14773,14779 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 11277,11289 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for finitef declaration""... $ac_c" 1>&6
! echo "configure:11287: checking for finitef declaration" >&5
    if test x${glibcpp_cv_func_finitef_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finitef_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14797,14809 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for finitef declaration""... $ac_c" 1>&6
! echo "configure:14807: checking for finitef declaration" >&5
    if test x${glibcpp_cv_func_finitef_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finitef_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11298,11304 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 14818,14824 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 11309,11315 ****
   finitef(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finitef_use=yes
  else
--- 14829,14835 ----
   finitef(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14833: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finitef_use=yes
  else
*************** fi
*** 11336,11347 ****
      for ac_func in finitef
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11340: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14860: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14884,14890 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 11391,11397 ****
    else
      
    echo $ac_n "checking for _finitef declaration""... $ac_c" 1>&6
! echo "configure:11395: checking for _finitef declaration" >&5
    if test x${glibcpp_cv_func__finitef_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finitef_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 14911,14917 ----
    else
      
    echo $ac_n "checking for _finitef declaration""... $ac_c" 1>&6
! echo "configure:14915: checking for _finitef declaration" >&5
    if test x${glibcpp_cv_func__finitef_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finitef_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11406,11412 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 14926,14932 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 11417,11423 ****
   _finitef(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11421: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finitef_use=yes
  else
--- 14937,14943 ----
   _finitef(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14941: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finitef_use=yes
  else
*************** fi
*** 11444,11455 ****
        for ac_func in _finitef
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11448: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:14968: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 14992,14998 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:14996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 11496,11508 ****
  fi
  done
      
!     fi	
    fi
  
  
      
    echo $ac_n "checking for long double trig functions""... $ac_c" 1>&6
! echo "configure:11506: checking for long double trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 15016,15028 ----
  fi
  done
      
!     fi
    fi
  
  
      
    echo $ac_n "checking for long double trig functions""... $ac_c" 1>&6
! echo "configure:15026: checking for long double trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11516,11522 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
--- 15036,15042 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
*************** int main() {
*** 11525,11531 ****
                                            coshl sinhl tanhl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:11529: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_long_double_trig_use=yes
  else
--- 15045,15051 ----
                                            coshl sinhl tanhl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15049: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_long_double_trig_use=yes
  else
*************** fi
*** 11551,11562 ****
                                            coshl sinhl tanhl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11555: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15075: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15099,15105 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 11607,11613 ****
  
    
    echo $ac_n "checking for long double round functions""... $ac_c" 1>&6
! echo "configure:11611: checking for long double round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 15127,15133 ----
  
    
    echo $ac_n "checking for long double round functions""... $ac_c" 1>&6
! echo "configure:15131: checking for long double round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func_long_double_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11621,11634 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in ceill floorl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:11632: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_long_double_round_use=yes
  else
--- 15141,15154 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in ceill floorl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15152: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_long_double_round_use=yes
  else
*************** fi
*** 11652,11663 ****
      for ac_func in ceill floorl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11656: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15176: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15200,15206 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 11709,11715 ****
    
    
    echo $ac_n "checking for isnanl declaration""... $ac_c" 1>&6
! echo "configure:11713: checking for isnanl declaration" >&5
    if test x${glibcpp_cv_func_isnanl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnanl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15229,15235 ----
    
    
    echo $ac_n "checking for isnanl declaration""... $ac_c" 1>&6
! echo "configure:15233: checking for isnanl declaration" >&5
    if test x${glibcpp_cv_func_isnanl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isnanl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11724,11730 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 15244,15250 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 11735,11741 ****
   isnanl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11739: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnanl_use=yes
  else
--- 15255,15261 ----
   isnanl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15259: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isnanl_use=yes
  else
*************** fi
*** 11762,11773 ****
      for ac_func in isnanl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11766: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15286: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15310,15316 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 11817,11823 ****
    else
      
    echo $ac_n "checking for _isnanl declaration""... $ac_c" 1>&6
! echo "configure:11821: checking for _isnanl declaration" >&5
    if test x${glibcpp_cv_func__isnanl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnanl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15337,15343 ----
    else
      
    echo $ac_n "checking for _isnanl declaration""... $ac_c" 1>&6
! echo "configure:15341: checking for _isnanl declaration" >&5
    if test x${glibcpp_cv_func__isnanl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isnanl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11832,11838 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 15352,15358 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 11843,11849 ****
   _isnanl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11847: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnanl_use=yes
  else
--- 15363,15369 ----
   _isnanl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15367: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isnanl_use=yes
  else
*************** fi
*** 11870,11881 ****
        for ac_func in _isnanl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11874: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15394: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15418,15424 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 11922,11934 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for isinfl declaration""... $ac_c" 1>&6
! echo "configure:11932: checking for isinfl declaration" >&5
    if test x${glibcpp_cv_func_isinfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15442,15454 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for isinfl declaration""... $ac_c" 1>&6
! echo "configure:15452: checking for isinfl declaration" >&5
    if test x${glibcpp_cv_func_isinfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_isinfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 11943,11949 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 15463,15469 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 11954,11960 ****
   isinfl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:11958: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinfl_use=yes
  else
--- 15474,15480 ----
   isinfl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15478: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_isinfl_use=yes
  else
*************** fi
*** 11981,11992 ****
      for ac_func in isinfl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:11985: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15505: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15529,15535 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15533: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 12036,12042 ****
    else
      
    echo $ac_n "checking for _isinfl declaration""... $ac_c" 1>&6
! echo "configure:12040: checking for _isinfl declaration" >&5
    if test x${glibcpp_cv_func__isinfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15556,15562 ----
    else
      
    echo $ac_n "checking for _isinfl declaration""... $ac_c" 1>&6
! echo "configure:15560: checking for _isinfl declaration" >&5
    if test x${glibcpp_cv_func__isinfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__isinfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12051,12057 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 15571,15577 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 12062,12068 ****
   _isinfl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12066: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinfl_use=yes
  else
--- 15582,15588 ----
   _isinfl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15586: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__isinfl_use=yes
  else
*************** fi
*** 12089,12100 ****
        for ac_func in _isinfl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12093: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15613: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15637,15643 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 12141,12153 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for copysignl declaration""... $ac_c" 1>&6
! echo "configure:12151: checking for copysignl declaration" >&5
    if test x${glibcpp_cv_func_copysignl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_copysignl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15661,15673 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for copysignl declaration""... $ac_c" 1>&6
! echo "configure:15671: checking for copysignl declaration" >&5
    if test x${glibcpp_cv_func_copysignl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_copysignl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12162,12175 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   copysignl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12173: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_copysignl_use=yes
  else
--- 15682,15695 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   copysignl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:15693: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_copysignl_use=yes
  else
*************** fi
*** 12196,12207 ****
      for ac_func in copysignl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12200: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15720: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15744,15750 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 12251,12257 ****
    else
      
    echo $ac_n "checking for _copysignl declaration""... $ac_c" 1>&6
! echo "configure:12255: checking for _copysignl declaration" >&5
    if test x${glibcpp_cv_func__copysignl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__copysignl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15771,15777 ----
    else
      
    echo $ac_n "checking for _copysignl declaration""... $ac_c" 1>&6
! echo "configure:15775: checking for _copysignl declaration" >&5
    if test x${glibcpp_cv_func__copysignl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__copysignl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12266,12279 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _copysignl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12277: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__copysignl_use=yes
  else
--- 15786,15799 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _copysignl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:15797: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__copysignl_use=yes
  else
*************** fi
*** 12300,12311 ****
        for ac_func in _copysignl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12304: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15824: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15848,15854 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 12352,12364 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for atan2l declaration""... $ac_c" 1>&6
! echo "configure:12362: checking for atan2l declaration" >&5
    if test x${glibcpp_cv_func_atan2l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_atan2l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15872,15884 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for atan2l declaration""... $ac_c" 1>&6
! echo "configure:15882: checking for atan2l declaration" >&5
    if test x${glibcpp_cv_func_atan2l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_atan2l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12373,12386 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   atan2l(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12384: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_atan2l_use=yes
  else
--- 15893,15906 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   atan2l(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:15904: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_atan2l_use=yes
  else
*************** fi
*** 12407,12418 ****
      for ac_func in atan2l
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12411: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:15931: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 15955,15961 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:15959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 12462,12468 ****
    else
      
    echo $ac_n "checking for _atan2l declaration""... $ac_c" 1>&6
! echo "configure:12466: checking for _atan2l declaration" >&5
    if test x${glibcpp_cv_func__atan2l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__atan2l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 15982,15988 ----
    else
      
    echo $ac_n "checking for _atan2l declaration""... $ac_c" 1>&6
! echo "configure:15986: checking for _atan2l declaration" >&5
    if test x${glibcpp_cv_func__atan2l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__atan2l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12477,12490 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _atan2l(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:12488: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__atan2l_use=yes
  else
--- 15997,16010 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _atan2l(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16008: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__atan2l_use=yes
  else
*************** fi
*** 12511,12522 ****
        for ac_func in _atan2l
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12515: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16035: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16059,16065 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 12563,12575 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for expl declaration""... $ac_c" 1>&6
! echo "configure:12573: checking for expl declaration" >&5
    if test x${glibcpp_cv_func_expl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_expl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16083,16095 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for expl declaration""... $ac_c" 1>&6
! echo "configure:16093: checking for expl declaration" >&5
    if test x${glibcpp_cv_func_expl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_expl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12584,12590 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 16104,16110 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 12595,12601 ****
   expl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12599: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_expl_use=yes
  else
--- 16115,16121 ----
   expl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:16119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_expl_use=yes
  else
*************** fi
*** 12622,12633 ****
      for ac_func in expl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12626: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16146: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16170,16176 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 12677,12683 ****
    else
      
    echo $ac_n "checking for _expl declaration""... $ac_c" 1>&6
! echo "configure:12681: checking for _expl declaration" >&5
    if test x${glibcpp_cv_func__expl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__expl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16197,16203 ----
    else
      
    echo $ac_n "checking for _expl declaration""... $ac_c" 1>&6
! echo "configure:16201: checking for _expl declaration" >&5
    if test x${glibcpp_cv_func__expl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__expl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12692,12698 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 16212,16218 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 12703,12709 ****
   _expl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12707: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__expl_use=yes
  else
--- 16223,16229 ----
   _expl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:16227: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__expl_use=yes
  else
*************** fi
*** 12730,12741 ****
        for ac_func in _expl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12734: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16254: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16278,16284 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 12782,12794 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for fabsl declaration""... $ac_c" 1>&6
! echo "configure:12792: checking for fabsl declaration" >&5
    if test x${glibcpp_cv_func_fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16302,16314 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for fabsl declaration""... $ac_c" 1>&6
! echo "configure:16312: checking for fabsl declaration" >&5
    if test x${glibcpp_cv_func_fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12803,12809 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 16323,16329 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 12814,12820 ****
   fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12818: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fabsl_use=yes
  else
--- 16334,16340 ----
   fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:16338: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fabsl_use=yes
  else
*************** fi
*** 12841,12852 ****
      for ac_func in fabsl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12845: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16365: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16389,16395 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 12896,12902 ****
    else
      
    echo $ac_n "checking for _fabsl declaration""... $ac_c" 1>&6
! echo "configure:12900: checking for _fabsl declaration" >&5
    if test x${glibcpp_cv_func__fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16416,16422 ----
    else
      
    echo $ac_n "checking for _fabsl declaration""... $ac_c" 1>&6
! echo "configure:16420: checking for _fabsl declaration" >&5
    if test x${glibcpp_cv_func__fabsl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fabsl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 12911,12917 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 16431,16437 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 12922,12928 ****
   _fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:12926: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fabsl_use=yes
  else
--- 16442,16448 ----
   _fabsl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:16446: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fabsl_use=yes
  else
*************** fi
*** 12949,12960 ****
        for ac_func in _fabsl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:12953: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16473: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16497,16503 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 13001,13013 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for fmodl declaration""... $ac_c" 1>&6
! echo "configure:13011: checking for fmodl declaration" >&5
    if test x${glibcpp_cv_func_fmodl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fmodl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16521,16533 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for fmodl declaration""... $ac_c" 1>&6
! echo "configure:16531: checking for fmodl declaration" >&5
    if test x${glibcpp_cv_func_fmodl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_fmodl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13022,13035 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   fmodl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13033: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fmodl_use=yes
  else
--- 16542,16555 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   fmodl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16553: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_fmodl_use=yes
  else
*************** fi
*** 13056,13067 ****
      for ac_func in fmodl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13060: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16580: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16604,16610 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 13111,13117 ****
    else
      
    echo $ac_n "checking for _fmodl declaration""... $ac_c" 1>&6
! echo "configure:13115: checking for _fmodl declaration" >&5
    if test x${glibcpp_cv_func__fmodl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fmodl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16631,16637 ----
    else
      
    echo $ac_n "checking for _fmodl declaration""... $ac_c" 1>&6
! echo "configure:16635: checking for _fmodl declaration" >&5
    if test x${glibcpp_cv_func__fmodl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__fmodl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13126,13139 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _fmodl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13137: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fmodl_use=yes
  else
--- 16646,16659 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _fmodl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16657: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__fmodl_use=yes
  else
*************** fi
*** 13160,13171 ****
        for ac_func in _fmodl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13164: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16684: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16708,16714 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16712: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 13212,13224 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for frexpl declaration""... $ac_c" 1>&6
! echo "configure:13222: checking for frexpl declaration" >&5
    if test x${glibcpp_cv_func_frexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_frexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16732,16744 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for frexpl declaration""... $ac_c" 1>&6
! echo "configure:16742: checking for frexpl declaration" >&5
    if test x${glibcpp_cv_func_frexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_frexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13233,13246 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   frexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_frexpl_use=yes
  else
--- 16753,16766 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   frexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16764: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_frexpl_use=yes
  else
*************** fi
*** 13267,13278 ****
      for ac_func in frexpl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13271: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16791: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16815,16821 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 13322,13328 ****
    else
      
    echo $ac_n "checking for _frexpl declaration""... $ac_c" 1>&6
! echo "configure:13326: checking for _frexpl declaration" >&5
    if test x${glibcpp_cv_func__frexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__frexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16842,16848 ----
    else
      
    echo $ac_n "checking for _frexpl declaration""... $ac_c" 1>&6
! echo "configure:16846: checking for _frexpl declaration" >&5
    if test x${glibcpp_cv_func__frexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__frexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13337,13350 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _frexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13348: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__frexpl_use=yes
  else
--- 16857,16870 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _frexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16868: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__frexpl_use=yes
  else
*************** fi
*** 13371,13382 ****
        for ac_func in _frexpl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13375: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:16895: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 16919,16925 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:16923: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 13423,13435 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for hypotl declaration""... $ac_c" 1>&6
! echo "configure:13433: checking for hypotl declaration" >&5
    if test x${glibcpp_cv_func_hypotl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypotl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 16943,16955 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for hypotl declaration""... $ac_c" 1>&6
! echo "configure:16953: checking for hypotl declaration" >&5
    if test x${glibcpp_cv_func_hypotl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_hypotl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13444,13457 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypotl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13455: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypotl_use=yes
  else
--- 16964,16977 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   hypotl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16975: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_hypotl_use=yes
  else
*************** fi
*** 13478,13489 ****
      for ac_func in hypotl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13482: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17002: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17026,17032 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 13533,13539 ****
    else
      
    echo $ac_n "checking for _hypotl declaration""... $ac_c" 1>&6
! echo "configure:13537: checking for _hypotl declaration" >&5
    if test x${glibcpp_cv_func__hypotl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypotl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17053,17059 ----
    else
      
    echo $ac_n "checking for _hypotl declaration""... $ac_c" 1>&6
! echo "configure:17057: checking for _hypotl declaration" >&5
    if test x${glibcpp_cv_func__hypotl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__hypotl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13548,13561 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypotl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13559: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypotl_use=yes
  else
--- 17068,17081 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _hypotl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:17079: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__hypotl_use=yes
  else
*************** fi
*** 13582,13593 ****
        for ac_func in _hypotl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13586: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17106: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17130,17136 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 13634,13646 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for ldexpl declaration""... $ac_c" 1>&6
! echo "configure:13644: checking for ldexpl declaration" >&5
    if test x${glibcpp_cv_func_ldexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17154,17166 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for ldexpl declaration""... $ac_c" 1>&6
! echo "configure:17164: checking for ldexpl declaration" >&5
    if test x${glibcpp_cv_func_ldexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_ldexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13655,13668 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   ldexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13666: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_ldexpl_use=yes
  else
--- 17175,17188 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   ldexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:17186: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_ldexpl_use=yes
  else
*************** fi
*** 13689,13700 ****
      for ac_func in ldexpl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13693: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17213: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17237,17243 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17241: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 13744,13750 ****
    else
      
    echo $ac_n "checking for _ldexpl declaration""... $ac_c" 1>&6
! echo "configure:13748: checking for _ldexpl declaration" >&5
    if test x${glibcpp_cv_func__ldexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17264,17270 ----
    else
      
    echo $ac_n "checking for _ldexpl declaration""... $ac_c" 1>&6
! echo "configure:17268: checking for _ldexpl declaration" >&5
    if test x${glibcpp_cv_func__ldexpl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__ldexpl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13759,13772 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _ldexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:13770: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__ldexpl_use=yes
  else
--- 17279,17292 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _ldexpl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:17290: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__ldexpl_use=yes
  else
*************** fi
*** 13793,13804 ****
        for ac_func in _ldexpl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13797: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17317: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17341,17347 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17345: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 13845,13857 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for logl declaration""... $ac_c" 1>&6
! echo "configure:13855: checking for logl declaration" >&5
    if test x${glibcpp_cv_func_logl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_logl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17365,17377 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for logl declaration""... $ac_c" 1>&6
! echo "configure:17375: checking for logl declaration" >&5
    if test x${glibcpp_cv_func_logl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_logl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13866,13872 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 17386,17392 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 13877,13883 ****
   logl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13881: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_logl_use=yes
  else
--- 17397,17403 ----
   logl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:17401: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_logl_use=yes
  else
*************** fi
*** 13904,13915 ****
      for ac_func in logl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:13908: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17428: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17452,17458 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 13959,13965 ****
    else
      
    echo $ac_n "checking for _logl declaration""... $ac_c" 1>&6
! echo "configure:13963: checking for _logl declaration" >&5
    if test x${glibcpp_cv_func__logl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__logl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17479,17485 ----
    else
      
    echo $ac_n "checking for _logl declaration""... $ac_c" 1>&6
! echo "configure:17483: checking for _logl declaration" >&5
    if test x${glibcpp_cv_func__logl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__logl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 13974,13980 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 17494,17500 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 13985,13991 ****
   _logl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:13989: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__logl_use=yes
  else
--- 17505,17511 ----
   _logl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:17509: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__logl_use=yes
  else
*************** fi
*** 14012,14023 ****
        for ac_func in _logl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14016: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17536: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17560,17566 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17564: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 14064,14076 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for log10l declaration""... $ac_c" 1>&6
! echo "configure:14074: checking for log10l declaration" >&5
    if test x${glibcpp_cv_func_log10l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_log10l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17584,17596 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for log10l declaration""... $ac_c" 1>&6
! echo "configure:17594: checking for log10l declaration" >&5
    if test x${glibcpp_cv_func_log10l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_log10l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14085,14091 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 17605,17611 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 14096,14102 ****
   log10l(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14100: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_log10l_use=yes
  else
--- 17616,17622 ----
   log10l(0);
  ; return 0; }
  EOF
! if { (eval echo configure:17620: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_log10l_use=yes
  else
*************** fi
*** 14123,14134 ****
      for ac_func in log10l
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14127: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17647: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17671,17677 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17675: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 14178,14184 ****
    else
      
    echo $ac_n "checking for _log10l declaration""... $ac_c" 1>&6
! echo "configure:14182: checking for _log10l declaration" >&5
    if test x${glibcpp_cv_func__log10l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__log10l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17698,17704 ----
    else
      
    echo $ac_n "checking for _log10l declaration""... $ac_c" 1>&6
! echo "configure:17702: checking for _log10l declaration" >&5
    if test x${glibcpp_cv_func__log10l_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__log10l_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14193,14199 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 17713,17719 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 14204,14210 ****
   _log10l(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14208: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__log10l_use=yes
  else
--- 17724,17730 ----
   _log10l(0);
  ; return 0; }
  EOF
! if { (eval echo configure:17728: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__log10l_use=yes
  else
*************** fi
*** 14231,14242 ****
        for ac_func in _log10l
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14235: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17755: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17779,17785 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 14283,14295 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for modfl declaration""... $ac_c" 1>&6
! echo "configure:14293: checking for modfl declaration" >&5
    if test x${glibcpp_cv_func_modfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_modfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17803,17815 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for modfl declaration""... $ac_c" 1>&6
! echo "configure:17813: checking for modfl declaration" >&5
    if test x${glibcpp_cv_func_modfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_modfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14304,14317 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   modfl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14315: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_modfl_use=yes
  else
--- 17824,17837 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   modfl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:17835: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_modfl_use=yes
  else
*************** fi
*** 14338,14349 ****
      for ac_func in modfl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14342: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17862: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17886,17892 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 14393,14399 ****
    else
      
    echo $ac_n "checking for _modfl declaration""... $ac_c" 1>&6
! echo "configure:14397: checking for _modfl declaration" >&5
    if test x${glibcpp_cv_func__modfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__modfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 17913,17919 ----
    else
      
    echo $ac_n "checking for _modfl declaration""... $ac_c" 1>&6
! echo "configure:17917: checking for _modfl declaration" >&5
    if test x${glibcpp_cv_func__modfl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__modfl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14408,14421 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _modfl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14419: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__modfl_use=yes
  else
--- 17928,17941 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _modfl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:17939: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__modfl_use=yes
  else
*************** fi
*** 14442,14453 ****
        for ac_func in _modfl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14446: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:17966: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 17990,17996 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:17994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 14494,14506 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for powl declaration""... $ac_c" 1>&6
! echo "configure:14504: checking for powl declaration" >&5
    if test x${glibcpp_cv_func_powl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_powl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18014,18026 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for powl declaration""... $ac_c" 1>&6
! echo "configure:18024: checking for powl declaration" >&5
    if test x${glibcpp_cv_func_powl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_powl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14515,14528 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   powl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14526: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_powl_use=yes
  else
--- 18035,18048 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   powl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:18046: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_powl_use=yes
  else
*************** fi
*** 14549,14560 ****
      for ac_func in powl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14553: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18073: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18097,18103 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 14604,14610 ****
    else
      
    echo $ac_n "checking for _powl declaration""... $ac_c" 1>&6
! echo "configure:14608: checking for _powl declaration" >&5
    if test x${glibcpp_cv_func__powl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__powl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18124,18130 ----
    else
      
    echo $ac_n "checking for _powl declaration""... $ac_c" 1>&6
! echo "configure:18128: checking for _powl declaration" >&5
    if test x${glibcpp_cv_func__powl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__powl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14619,14632 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _powl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14630: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__powl_use=yes
  else
--- 18139,18152 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _powl(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:18150: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__powl_use=yes
  else
*************** fi
*** 14653,14664 ****
        for ac_func in _powl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14657: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18177: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18201,18207 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 14705,14717 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for sqrtl declaration""... $ac_c" 1>&6
! echo "configure:14715: checking for sqrtl declaration" >&5
    if test x${glibcpp_cv_func_sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18225,18237 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for sqrtl declaration""... $ac_c" 1>&6
! echo "configure:18235: checking for sqrtl declaration" >&5
    if test x${glibcpp_cv_func_sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14726,14732 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 18246,18252 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 14737,14743 ****
   sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sqrtl_use=yes
  else
--- 18257,18263 ----
   sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:18261: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sqrtl_use=yes
  else
*************** fi
*** 14764,14775 ****
      for ac_func in sqrtl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14768: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18288: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18312,18318 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 14819,14825 ****
    else
      
    echo $ac_n "checking for _sqrtl declaration""... $ac_c" 1>&6
! echo "configure:14823: checking for _sqrtl declaration" >&5
    if test x${glibcpp_cv_func__sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18339,18345 ----
    else
      
    echo $ac_n "checking for _sqrtl declaration""... $ac_c" 1>&6
! echo "configure:18343: checking for _sqrtl declaration" >&5
    if test x${glibcpp_cv_func__sqrtl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sqrtl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14834,14840 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 18354,18360 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 14845,14851 ****
   _sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:14849: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sqrtl_use=yes
  else
--- 18365,18371 ----
   _sqrtl(0);
  ; return 0; }
  EOF
! if { (eval echo configure:18369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sqrtl_use=yes
  else
*************** fi
*** 14872,14883 ****
        for ac_func in _sqrtl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14876: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18396: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18420,18426 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 14924,14936 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for sincosl declaration""... $ac_c" 1>&6
! echo "configure:14934: checking for sincosl declaration" >&5
    if test x${glibcpp_cv_func_sincosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18444,18456 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for sincosl declaration""... $ac_c" 1>&6
! echo "configure:18454: checking for sincosl declaration" >&5
    if test x${glibcpp_cv_func_sincosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_sincosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 14945,14958 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincosl(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:14956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincosl_use=yes
  else
--- 18465,18478 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   sincosl(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:18476: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_sincosl_use=yes
  else
*************** fi
*** 14979,14990 ****
      for ac_func in sincosl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:14983: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18503: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18527,18533 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15034,15040 ****
    else
      
    echo $ac_n "checking for _sincosl declaration""... $ac_c" 1>&6
! echo "configure:15038: checking for _sincosl declaration" >&5
    if test x${glibcpp_cv_func__sincosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18554,18560 ----
    else
      
    echo $ac_n "checking for _sincosl declaration""... $ac_c" 1>&6
! echo "configure:18558: checking for _sincosl declaration" >&5
    if test x${glibcpp_cv_func__sincosl_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__sincosl_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15049,15062 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincosl(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:15060: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincosl_use=yes
  else
--- 18569,18582 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   _sincosl(0, 0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:18580: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__sincosl_use=yes
  else
*************** fi
*** 15083,15094 ****
        for ac_func in _sincosl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15087: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18607: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18631,18637 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 15135,15147 ****
  fi
  done
      
!     fi	
    fi
  
    
    
    echo $ac_n "checking for finitel declaration""... $ac_c" 1>&6
! echo "configure:15145: checking for finitel declaration" >&5
    if test x${glibcpp_cv_func_finitel_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finitel_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18655,18667 ----
  fi
  done
      
!     fi
    fi
  
    
    
    echo $ac_n "checking for finitel declaration""... $ac_c" 1>&6
! echo "configure:18665: checking for finitel declaration" >&5
    if test x${glibcpp_cv_func_finitel_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_finitel_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15156,15162 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 18676,18682 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 15167,15173 ****
   finitel(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15171: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finitel_use=yes
  else
--- 18687,18693 ----
   finitel(0);
  ; return 0; }
  EOF
! if { (eval echo configure:18691: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_finitel_use=yes
  else
*************** fi
*** 15194,15205 ****
      for ac_func in finitel
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15198: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18718: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18742,18748 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18746: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15249,15255 ****
    else
      
    echo $ac_n "checking for _finitel declaration""... $ac_c" 1>&6
! echo "configure:15253: checking for _finitel declaration" >&5
    if test x${glibcpp_cv_func__finitel_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finitel_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 18769,18775 ----
    else
      
    echo $ac_n "checking for _finitel declaration""... $ac_c" 1>&6
! echo "configure:18773: checking for _finitel declaration" >&5
    if test x${glibcpp_cv_func__finitel_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func__finitel_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15264,15270 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
--- 18784,18790 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  		      #ifdef HAVE_IEEEFP_H
*************** int main() {
*** 15275,15281 ****
   _finitel(0);
  ; return 0; }
  EOF
! if { (eval echo configure:15279: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finitel_use=yes
  else
--- 18795,18801 ----
   _finitel(0);
  ; return 0; }
  EOF
! if { (eval echo configure:18799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__finitel_use=yes
  else
*************** fi
*** 15302,15313 ****
        for ac_func in _finitel
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15306: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18826: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18850,18856 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18854: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** else
*** 15354,15367 ****
  fi
  done
      
!     fi	
    fi
  
  
          
      
    echo $ac_n "checking for _float trig functions""... $ac_c" 1>&6
! echo "configure:15365: checking for _float trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__float_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 18874,18887 ----
  fi
  done
      
!     fi
    fi
  
  
          
      
    echo $ac_n "checking for _float trig functions""... $ac_c" 1>&6
! echo "configure:18885: checking for _float trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__float_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15375,15381 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
--- 18895,18901 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
*************** int main() {
*** 15384,15390 ****
                                            _coshf _sinhf _tanhf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15388: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__float_trig_use=yes
  else
--- 18904,18910 ----
                                            _coshf _sinhf _tanhf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:18908: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__float_trig_use=yes
  else
*************** fi
*** 15410,15421 ****
                                            _coshf _sinhf _tanhf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15414: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:18934: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 18958,18964 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:18962: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15466,15472 ****
  
    
    echo $ac_n "checking for _float round functions""... $ac_c" 1>&6
! echo "configure:15470: checking for _float round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__float_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 18986,18992 ----
  
    
    echo $ac_n "checking for _float round functions""... $ac_c" 1>&6
! echo "configure:18990: checking for _float round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__float_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15480,15493 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in _ceilf _floorf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15491: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__float_round_use=yes
  else
--- 19000,19013 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in _ceilf _floorf; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:19011: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__float_round_use=yes
  else
*************** fi
*** 15511,15522 ****
      for ac_func in _ceilf _floorf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15515: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19035: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19059,19065 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15568,15574 ****
  
      
    echo $ac_n "checking for _long double trig functions""... $ac_c" 1>&6
! echo "configure:15572: checking for _long double trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 19088,19094 ----
  
      
    echo $ac_n "checking for _long double trig functions""... $ac_c" 1>&6
! echo "configure:19092: checking for _long double trig functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_trig_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15582,15588 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
--- 19102,19108 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
*************** int main() {
*** 15591,15597 ****
                                            _coshl _sinhl _tanhl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15595: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__long_double_trig_use=yes
  else
--- 19111,19117 ----
                                            _coshl _sinhl _tanhl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:19115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__long_double_trig_use=yes
  else
*************** fi
*** 15617,15628 ****
                                            _coshl _sinhl _tanhl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15621: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19141: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19165,19171 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15673,15679 ****
  
    
    echo $ac_n "checking for _long double round functions""... $ac_c" 1>&6
! echo "configure:15677: checking for _long double round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 19193,19199 ----
  
    
    echo $ac_n "checking for _long double round functions""... $ac_c" 1>&6
! echo "configure:19197: checking for _long double round functions" >&5
    if eval "test \"`echo '$''{'glibcpp_cv_func__long_double_round_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 15687,15700 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in _ceill _floorl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:15698: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__long_double_round_use=yes
  else
--- 19207,19220 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
      cat > conftest.$ac_ext <
  int main() {
   `for x in _ceill _floorl; do echo "$x (0);"; done` 
  ; return 0; }
  EOF
! if { (eval echo configure:19218: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func__long_double_round_use=yes
  else
*************** fi
*** 15718,15729 ****
      for ac_func in _ceill _floorl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15722: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19242: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19266,19272 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 15778,15784 ****
  
    
      echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:15782: checking for main in -lm" >&5
  ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 19298,19304 ----
  
    
      echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
! echo "configure:19302: checking for main in -lm" >&5
  ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 15786,15799 ****
    ac_save_LIBS="$LIBS"
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
--- 19306,19319 ----
    ac_save_LIBS="$LIBS"
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
*************** fi
*** 15823,15834 ****
    for ac_func in nan copysignf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15827: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19347: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19371,19377 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** fi
*** 15877,15895 ****
  done
  
  
  
!           USE_COMPLEX_LONG_DOUBLE=no
!   if test x$ac_cv_func_copysignl = x"yes"; then
!     USE_COMPLEX_LONG_DOUBLE=yes
!     for ac_func in signbitl
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:15888: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
+ echo "configure:19404: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
  
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:19432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! LIBMATHOBJS="$LIBMATHOBJS signbit.lo"
! fi
! done
! 
!   for ac_func in __signbitf
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:19460: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19484,19490 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** EOF
*** 15933,15943 ****
   
  else
    echo "$ac_t""no" 1>&6
! LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"
  fi
  done
  
  
    fi
  
    
--- 19505,19572 ----
   
  else
    echo "$ac_t""no" 1>&6
! LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"
  fi
  done
  
  
+           if test x$ac_cv_func_copysignl = x"yes"; then
+     for ac_func in __signbitl
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:19518: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:19546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
+ 
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"
+ fi
+ done
+ 
    fi
  
    
*************** done
*** 15945,15960 ****
    
  
        echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:15949: checking for mbstate_t" >&5
    cat > conftest.$ac_ext <
  int main() {
  mbstate_t teststate;
  ; return 0; }
  EOF
! if { (eval echo configure:15958: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    have_mbstate_t=yes
  else
--- 19574,19589 ----
    
  
        echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6
! echo "configure:19578: checking for mbstate_t" >&5
    cat > conftest.$ac_ext <
  int main() {
  mbstate_t teststate;
  ; return 0; }
  EOF
! if { (eval echo configure:19587: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    have_mbstate_t=yes
  else
*************** EOF
*** 15976,15992 ****
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:15980: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:15990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 19605,19621 ----
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:19609: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:19619: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** ac_has_wchar_h=no
*** 16013,16031 ****
  fi
  done
  
!   ac_safe=`echo "wctype.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for wctype.h""... $ac_c" 1>&6
! echo "configure:16019: checking for wctype.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:16029: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 19642,19662 ----
  fi
  done
  
!   for ac_hdr in wctype.h
! do
! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:19650: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:19660: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** rm -f conftest*
*** 16041,16067 ****
  fi
  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
!   ac_has_wctype_h=yes
  else
    echo "$ac_t""no" 1>&6
  ac_has_wctype_h=no
  fi
  
    
!     if test x"$ac_has_wchar_h" = xyes && test x"$ac_has_wctype_h" = xyes \
!      && test x"$enable_c_mbchar" != xno; then
        
              echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:16056: checking for WCHAR_MIN and WCHAR_MAX" >&5
      cat > conftest.$ac_ext <
  int main() {
  int i = WCHAR_MIN; int j = WCHAR_MAX;
  ; return 0; }
  EOF
! if { (eval echo configure:16065: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_wchar_minmax=yes
  else
--- 19672,19704 ----
  fi
  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
!     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
!   cat >> confdefs.h <&6
  ac_has_wctype_h=no
  fi
+ done
  
    
!     if test x"$ac_has_wchar_h" = xyes &&
!      test x"$ac_has_wctype_h" = xyes &&
!      test x"$enable_c_mbchar" != xno; then
        
              echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6
! echo "configure:19693: checking for WCHAR_MIN and WCHAR_MAX" >&5
      cat > conftest.$ac_ext <
  int main() {
  int i = WCHAR_MIN; int j = WCHAR_MAX;
  ; return 0; }
  EOF
! if { (eval echo configure:19702: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_wchar_minmax=yes
  else
*************** rm -f conftest*
*** 16074,16082 ****
      echo "$ac_t""$has_wchar_minmax" 1>&6
      
              echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:16078: checking for WEOF" >&5
      cat > conftest.$ac_ext <
--- 19711,19719 ----
      echo "$ac_t""$has_wchar_minmax" 1>&6
      
              echo $ac_n "checking for WEOF""... $ac_c" 1>&6
! echo "configure:19715: checking for WEOF" >&5
      cat > conftest.$ac_ext <
*************** int main() {
*** 16085,16091 ****
  wint_t i = WEOF;
  ; return 0; }
  EOF
! if { (eval echo configure:16089: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_weof=yes
  else
--- 19722,19728 ----
  wint_t i = WEOF;
  ; return 0; }
  EOF
! if { (eval echo configure:19726: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    has_weof=yes
  else
*************** rm -f conftest*
*** 16101,16112 ****
      for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16105: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19742: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19766,19772 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 16164,16175 ****
      wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16168: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19805: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 19829,19835 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:19833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 16220,16228 ****
  
  
      echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:16224: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes && test x"$has_wchar_minmax" = xyes \
!        && test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
--- 19857,19866 ----
  
  
      echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6
! echo "configure:19861: checking for ISO C99 wchar_t support" >&5
!     if test x"$has_weof" = xyes &&
!        test x"$has_wchar_minmax" = xyes &&
!        test x"$ac_wfuncs" = xyes; then
        ac_isoC99_wchar_t=yes
      else
        ac_isoC99_wchar_t=no
*************** echo "configure:16224: checking for ISO 
*** 16231,16247 ****
    
              ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:16235: checking for iconv.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:16245: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 19869,19885 ----
    
              ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for iconv.h""... $ac_c" 1>&6
! echo "configure:19873: checking for iconv.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:19883: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** fi
*** 16265,16281 ****
  
      ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:16269: checking for langinfo.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:16279: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 19903,19919 ----
  
      ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
! echo "configure:19907: checking for langinfo.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:19917: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** fi
*** 16299,16305 ****
  
  
          echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:16303: checking for iconv in -liconv" >&5
  ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 19937,19943 ----
  
  
          echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6
! echo "configure:19941: checking for iconv in -liconv" >&5
  ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 16307,16313 ****
    ac_save_LIBS="$LIBS"
  LIBS="-liconv  $LIBS"
  cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
--- 19956,19962 ----
  iconv()
  ; return 0; }
  EOF
! if { (eval echo configure:19960: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
  else
*************** fi
*** 16344,16355 ****
      for ac_func in iconv_open iconv_close iconv nl_langinfo
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16348: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:19986: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 20010,20016 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:20014: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 16402,16410 ****
      LIBS="$ac_save_LIBS"
  
      echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:16406: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes && test x"$ac_has_langinfo_h" = xyes \
!        && test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
--- 20040,20049 ----
      LIBS="$ac_save_LIBS"
  
      echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6
! echo "configure:20044: checking for XPG2 wchar_t support" >&5
!     if test x"$ac_has_iconv_h" = xyes &&
!        test x"$ac_has_langinfo_h" = xyes &&
!        test x"$ac_XPG2funcs" = xyes; then
        ac_XPG2_wchar_t=yes
      else
        ac_XPG2_wchar_t=no
*************** echo "configure:16406: checking for XPG2
*** 16412,16420 ****
      echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
    
              echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:16416: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes \
!     && test x"$ac_XPG2_wchar_t" = xyes; then
        cat >> confdefs.h <<\EOF
  #define _GLIBCPP_USE_WCHAR_T 1
  EOF
--- 20051,20059 ----
      echo "$ac_t""$ac_XPG2_wchar_t" 1>&6
    
              echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6
! echo "configure:20055: checking for enabled wchar_t specializations" >&5
!     if test x"$ac_isoC99_wchar_t" = xyes &&
!        test x"$ac_XPG2_wchar_t" = xyes; then
        cat >> confdefs.h <<\EOF
  #define _GLIBCPP_USE_WCHAR_T 1
  EOF
*************** EOF
*** 16434,16440 ****
  
    
    echo $ac_n "checking for strtold declaration""... $ac_c" 1>&6
! echo "configure:16438: checking for strtold declaration" >&5
    if test x${glibcpp_cv_func_strtold_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_strtold_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 20073,20079 ----
  
    
    echo $ac_n "checking for strtold declaration""... $ac_c" 1>&6
! echo "configure:20077: checking for strtold declaration" >&5
    if test x${glibcpp_cv_func_strtold_use+set} != xset; then
      if eval "test \"`echo '$''{'glibcpp_cv_func_strtold_use'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** ac_link='${CXX-g++} -o conftest${ac_exee
*** 16449,16462 ****
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   strtold(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:16460: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_strtold_use=yes
  else
--- 20088,20101 ----
  cross_compiling=$ac_cv_prog_cxx_cross
  
        cat > conftest.$ac_ext <
  int main() {
   strtold(0, 0);
  ; return 0; }
  EOF
! if { (eval echo configure:20099: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_cv_func_strtold_use=yes
  else
*************** fi
*** 16482,16493 ****
      for ac_func in strtold
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16486: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:20125: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 20149,20259 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:20153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=yes"
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_func_$ac_func=no"
! fi
! rm -f conftest*
! fi
! 
! if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
!   cat >> confdefs.h <&6
! fi
! done
!     
!   fi
! 
!   
!   echo $ac_n "checking for strtof declaration""... $ac_c" 1>&6
! echo "configure:20181: checking for strtof declaration" >&5
!   if test x${glibcpp_cv_func_strtof_use+set} != xset; then
!     if eval "test \"`echo '$''{'glibcpp_cv_func_strtof_use'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   
!       
!       ac_ext=C
! # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='$CXXCPP $CPPFLAGS'
! ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
! ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
! cross_compiling=$ac_cv_prog_cxx_cross
! 
!       cat > conftest.$ac_ext <
! int main() {
!  strtof(0, 0);
! ; return 0; }
! EOF
! if { (eval echo configure:20203: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
!   rm -rf conftest*
!   glibcpp_cv_func_strtof_use=yes
! else
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   glibcpp_cv_func_strtof_use=no
! fi
! rm -f conftest*
!       ac_ext=c
! # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='$CPP $CPPFLAGS'
! ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
! ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
! cross_compiling=$ac_cv_prog_cc_cross
! 
!     
! fi
! 
!   fi
!   echo "$ac_t""$glibcpp_cv_func_strtof_use" 1>&6
!   if test x$glibcpp_cv_func_strtof_use = x"yes"; then
!     for ac_func in strtof
! do
! echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:20229: checking for $ac_func" >&5
! if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char $ac_func();
! 
! int main() {
! 
! /* The GNU C library defines this for functions which it implements
!     to always fail with ENOSYS.  Some functions are actually named
!     something starting with __ and the normal name is an alias.  */
! #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
! choke me
! #else
! $ac_func();
! #endif
! 
! ; return 0; }
! EOF
! if { (eval echo configure:20257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 16539,16550 ****
    for ac_func in drand48
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16543: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:20286: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 20310,20316 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:20314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** done
*** 16594,16637 ****
  
    CXXFLAGS="$ac_save_CXXFLAGS"
  
! 
    cat > conftest.$ac_ext <
  
  int main() {
  sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);
  ; return 0; }
  EOF
! if { (eval echo configure:16609: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    cat >> confdefs.h <<\EOF
  #define HAVE_SIGSETJMP 1
  EOF
  
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
  fi
  rm -f conftest*
  
!   for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:16625: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:16635: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 20337,20449 ----
  
    CXXFLAGS="$ac_save_CXXFLAGS"
  
!   
!   ac_safe=`echo "locale.h" | sed 'y%./+-%__p_%'`
! echo $ac_n "checking for locale.h""... $ac_c" 1>&6
! echo "configure:20344: checking for locale.h" >&5
! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
    cat > conftest.$ac_ext <
! EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:20354: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
! if test -z "$ac_err"; then
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=yes"
! else
!   echo "$ac_err" >&5
!   echo "configure: failed program was:" >&5
!   cat conftest.$ac_ext >&5
!   rm -rf conftest*
!   eval "ac_cv_header_$ac_safe=no"
! fi
! rm -f conftest*
! fi
! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
!   echo "$ac_t""yes" 1>&6
!   
!     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
! echo "configure:20372: checking for LC_MESSAGES" >&5
! if eval "test \"`echo '$''{'ac_cv_val_LC_MESSAGES'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   cat > conftest.$ac_ext <
+ int main() {
+ return LC_MESSAGES
+ ; return 0; }
+ EOF
+ if { (eval echo configure:20384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   ac_cv_val_LC_MESSAGES=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   ac_cv_val_LC_MESSAGES=no
+ fi
+ rm -f conftest*
+ fi
  
! echo "$ac_t""$ac_cv_val_LC_MESSAGES" 1>&6
!     if test $ac_cv_val_LC_MESSAGES = yes; then
!       cat >> confdefs.h <<\EOF
! #define HAVE_LC_MESSAGES 1
! EOF
! 
!     fi
!   
! else
!   echo "$ac_t""no" 1>&6
! fi
  
+ 
+ 
+   cat > conftest.$ac_ext <
+   
  int main() {
  sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);
  ; return 0; }
  EOF
! if { (eval echo configure:20420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    cat >> confdefs.h <<\EOF
  #define HAVE_SIGSETJMP 1
  EOF
  
+   
  else
    echo "configure: failed program was:" >&5
    cat conftest.$ac_ext >&5
  fi
  rm -f conftest*
  
!   for ac_hdr in unistd.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:20437: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:20447: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** done
*** 16660,16671 ****
  for ac_func in getpagesize
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:16664: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&6
! echo "configure:20476: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 20500,20506 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:20504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** fi
*** 16713,16719 ****
  done
  
  echo $ac_n "checking for working mmap""... $ac_c" 1>&6
! echo "configure:16717: checking for working mmap" >&5
  if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 20525,20531 ----
  done
  
  echo $ac_n "checking for working mmap""... $ac_c" 1>&6
! echo "configure:20529: checking for working mmap" >&5
  if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 16721,16727 ****
    ac_cv_func_mmap_fixed_mapped=no
  else
    cat > conftest.$ac_ext < conftest.$ac_ext <
  #include 
  
- #if HAVE_SYS_TYPES_H
- # include 
- #endif
- 
- #if HAVE_STDLIB_H
- # include 
- #endif
- 
- #if HAVE_SYS_STAT_H
- # include 
- #endif
- 
- #if HAVE_UNISTD_H
- # include 
- #endif
- 
  /* This mess was copied from the GNU getpagesize.h.  */
  #ifndef HAVE_GETPAGESIZE
  
  /* Assume that all systems that can run configure have sys/param.h.  */
  # ifndef HAVE_SYS_PARAM_H
--- 20561,20571 ----
  #include 
  #include 
  
  /* This mess was copied from the GNU getpagesize.h.  */
  #ifndef HAVE_GETPAGESIZE
+ # ifdef HAVE_UNISTD_H
+ #  include 
+ # endif
  
  /* Assume that all systems that can run configure have sys/param.h.  */
  # ifndef HAVE_SYS_PARAM_H
*************** main()
*** 16874,16880 ****
  }
  
  EOF
! if { (eval echo configure:16878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_cv_func_mmap_fixed_mapped=yes
  else
--- 20673,20679 ----
  }
  
  EOF
! if { (eval echo configure:20677: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_cv_func_mmap_fixed_mapped=yes
  else
*************** EOF
*** 16896,16923 ****
  
  fi
  
- fi
- 
- # Enable/configure some pieces which may require knowledge about the
- # compiler situation (native/cross), which we just finished discovering.
  
    
    setrlimit_have_headers=yes
    for ac_hdr in sys/resource.h unistd.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:16911: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:16921: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 20695,20720 ----
  
  fi
  
  
+   # Establish limits on memory usage during 'make check'
+   
    
    setrlimit_have_headers=yes
    for ac_hdr in sys/resource.h unistd.h
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:20708: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:20718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** done
*** 16950,16956 ****
      # Can't do these in a loop, else the resulting syntax is wrong.
      
    cat > conftest.$ac_ext <
                    #include 
--- 20747,20753 ----
      # Can't do these in a loop, else the resulting syntax is wrong.
      
    cat > conftest.$ac_ext <
                    #include 
*************** int main() {
*** 16959,16965 ****
   int f = RLIMIT_DATA ; 
  ; return 0; }
  EOF
! if { (eval echo configure:16963: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
--- 20756,20762 ----
   int f = RLIMIT_DATA ; 
  ; return 0; }
  EOF
! if { (eval echo configure:20760: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
*************** EOF
*** 16976,16982 ****
  
      
    cat > conftest.$ac_ext <
                    #include 
--- 20773,20779 ----
  
      
    cat > conftest.$ac_ext <
                    #include 
*************** int main() {
*** 16985,16991 ****
   int f = RLIMIT_RSS ; 
  ; return 0; }
  EOF
! if { (eval echo configure:16989: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
--- 20782,20788 ----
   int f = RLIMIT_RSS ; 
  ; return 0; }
  EOF
! if { (eval echo configure:20786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
*************** EOF
*** 17002,17008 ****
  
      
    cat > conftest.$ac_ext <
                    #include 
--- 20799,20805 ----
  
      
    cat > conftest.$ac_ext <
                    #include 
*************** int main() {
*** 17011,17017 ****
   int f = RLIMIT_VMEM ; 
  ; return 0; }
  EOF
! if { (eval echo configure:17015: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
--- 20808,20814 ----
   int f = RLIMIT_VMEM ; 
  ; return 0; }
  EOF
! if { (eval echo configure:20812: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
*************** EOF
*** 17028,17034 ****
  
      
    cat > conftest.$ac_ext <
                    #include 
--- 20825,20831 ----
  
      
    cat > conftest.$ac_ext <
                    #include 
*************** int main() {
*** 17037,17043 ****
   int f = RLIMIT_AS ; 
  ; return 0; }
  EOF
! if { (eval echo configure:17041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
--- 20834,20840 ----
   int f = RLIMIT_AS ; 
  ; return 0; }
  EOF
! if { (eval echo configure:20838: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    glibcpp_mresult=1
  else
*************** EOF
*** 17059,17074 ****
  else
    
        cat > conftest.$ac_ext <
!                       #include 
!                      
  int main() {
   struct rlimit r; setrlimit(0, &r);
  ; return 0; }
  EOF
! if { (eval echo configure:17072: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_setrlimit=yes
  else
--- 20856,20871 ----
  else
    
        cat > conftest.$ac_ext <
! 		      #include 
! 		     
  int main() {
   struct rlimit r; setrlimit(0, &r);
  ; return 0; }
  EOF
! if { (eval echo configure:20869: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_setrlimit=yes
  else
*************** fi
*** 17084,17090 ****
    fi
  
    echo $ac_n "checking for testsuite memory limit support""... $ac_c" 1>&6
! echo "configure:17088: checking for testsuite memory limit support" >&5
    if test $setrlimit_have_headers = yes && test $ac_setrlimit = yes; then
      ac_mem_limits=yes
      cat >> confdefs.h <<\EOF
--- 20881,20887 ----
    fi
  
    echo $ac_n "checking for testsuite memory limit support""... $ac_c" 1>&6
! echo "configure:20885: checking for testsuite memory limit support" >&5
    if test $setrlimit_have_headers = yes && test $ac_setrlimit = yes; then
      ac_mem_limits=yes
      cat >> confdefs.h <<\EOF
*************** EOF
*** 17097,17107 ****
    echo "$ac_t""$ac_mem_limits" 1>&6
  
  
  
  # Propagate the target-specific source directories through the build chain.
  OS_INC_SRCDIR=$os_include_dir/bits
  ATOMICITY_INC_SRCDIR=$ATOMICITYH/bits
! LIMITS_INC_SRCDIR=$LIMITSH/bits
  
  
  
--- 20894,21135 ----
    echo "$ac_t""$ac_mem_limits" 1>&6
  
  
+   # Look for setenv, so that extended locale tests can be performed.
+   
+   echo $ac_n "checking for setenv declaration""... $ac_c" 1>&6
+ echo "configure:20901: checking for setenv declaration" >&5
+   if test x${glibcpp_cv_func_setenv_use+set} != xset; then
+     if eval "test \"`echo '$''{'glibcpp_cv_func_setenv_use'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   
+       
+       ac_ext=C
+ # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CXXCPP $CPPFLAGS'
+ ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cxx_cross
+ 
+       cat > conftest.$ac_ext <
+ int main() {
+  setenv(0, 0, 0);
+ ; return 0; }
+ EOF
+ if { (eval echo configure:20923: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   glibcpp_cv_func_setenv_use=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   glibcpp_cv_func_setenv_use=no
+ fi
+ rm -f conftest*
+       ac_ext=c
+ # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ cross_compiling=$ac_cv_prog_cc_cross
+ 
+     
+ fi
+ 
+   fi
+   echo "$ac_t""$glibcpp_cv_func_setenv_use" 1>&6
+   if test x$glibcpp_cv_func_setenv_use = x"yes"; then
+     for ac_func in setenv
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+ echo "configure:20949: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char $ac_func();
+ 
+ int main() {
+ 
+ /* The GNU C library defines this for functions which it implements
+     to always fail with ENOSYS.  Some functions are actually named
+     something starting with __ and the normal name is an alias.  */
+ #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+ choke me
+ #else
+ $ac_func();
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:20977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=no"
+ fi
+ rm -f conftest*
+ fi
+ 
+ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <&6
+ fi
+ done
+     
+   fi
+ 
+ 
+ fi
+ 
+ # This depends on the possibly-skipped linker test above.
+ # Check whether --enable-symvers or --disable-symvers was given.
+ if test "${enable_symvers+set}" = set; then
+   enableval="$enable_symvers"
+   case "$enableval" in
+  yes) enable_symvers=yes ;;
+  no)  enable_symvers=no ;;
+  # other names here, just as sanity checks
+  #gnu|sun|etcetera) enable_symvers=$enableval ;;
+  gnu) enable_symvers=$enableval ;;
+  *)   { echo "configure: error: Unknown argument to enable/disable symvers" 1>&2; exit 1; } ;;
+  esac
+ else
+   enable_symvers=yes
+ fi
+ 
+ # If we never went through the GLIBCPP_CHECK_LINKER_FEATURES macro, then we
+ # don't know enough about $LD to do tricks... 
+ if test x$enable_shared = xno || 
+ 	test x$LD = x || 
+ 	test x$glibcpp_gnu_ld_version = x; then
+   enable_symvers=no
+ fi
+ 
+ # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
+ echo $ac_n "checking for shared libgcc""... $ac_c" 1>&6
+ echo "configure:21032: checking for shared libgcc" >&5
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=' -lgcc_s'
+ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   glibcpp_shared_libgcc=yes
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+   rm -rf conftest*
+   glibcpp_shared_libgcc=no
+ fi
+ rm -f conftest*
+ CFLAGS="$ac_save_CFLAGS"
+ echo "$ac_t""$glibcpp_shared_libgcc" 1>&6
+ 
+ # For GNU ld, we need at least this version.  It's 2.12 in the same format
+ # as the tested-for version.  See GLIBCPP_CHECK_LINKER_FEATURES for more.
+ glibcpp_min_gnu_ld_version=21200
+ 
+ # Check to see if unspecified "yes" value can win, given results
+ # above.  
+ if test $enable_symvers = yes ; then
+   if test $with_gnu_ld = yes &&
+     test $glibcpp_shared_libgcc = yes ;
+   then
+     if test $glibcpp_gnu_ld_version -ge $glibcpp_min_gnu_ld_version ; then
+         enable_symvers=gnu
+     else
+       ac_test_CFLAGS="${CFLAGS+set}"
+       ac_save_CFLAGS="$CFLAGS"
+       CFLAGS='-shared -Wl,--version-script,conftest.map'
+       enable_symvers=no
+       
+       echo 'FOO { global: f[a-z]o; local: *; };' > conftest.map
+       
+       cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   enable_symvers=gnu
+ else
+   echo "configure: failed program was:" >&5
+   cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest*
+       if test "$ac_test_CFLAGS" = set; then
+ 	CFLAGS="$ac_save_CFLAGS"
+       else
+ 	# this is the suspicious part
+ 	CFLAGS=''
+       fi
+       rm -f conftest.map
+     fi
+   else
+     # just fail for now
+     enable_symvers=no
+   fi
+ fi
+ 
+ case $enable_symvers in
+   no)
+       LINKER_MAP=config/linker-map.dummy
+       ;;
+   gnu)
+       LINKER_MAP=config/linker-map.gnu
+       ;;
+ esac
+ 
+ 
+ 
+ 
+ if test $enable_symvers != no; then
+   GLIBCPP_BUILD_VERSIONED_SHLIB_TRUE=
+   GLIBCPP_BUILD_VERSIONED_SHLIB_FALSE='#'
+ else
+   GLIBCPP_BUILD_VERSIONED_SHLIB_TRUE='#'
+   GLIBCPP_BUILD_VERSIONED_SHLIB_FALSE=
+ fi
+ echo $ac_n "checking versioning on shared library symbols""... $ac_c" 1>&6
+ echo "configure:21126: checking versioning on shared library symbols" >&5
+ echo "$ac_t""$enable_symvers" 1>&6
+ 
  
  # Propagate the target-specific source directories through the build chain.
  OS_INC_SRCDIR=$os_include_dir/bits
  ATOMICITY_INC_SRCDIR=$ATOMICITYH/bits
! CPU_LIMITS_INC_SRCDIR=$CPULIMITSH/bits
  
  
  
*************** fi
*** 17166,17239 ****
  rm -f confcache
  
  
-   ac_safe=`echo "locale.h" | sed 'y%./+-%__p_%'`
- echo $ac_n "checking for locale.h""... $ac_c" 1>&6
- echo "configure:17172: checking for locale.h" >&5
- if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-   echo $ac_n "(cached) $ac_c" 1>&6
- else
-   cat > conftest.$ac_ext <
- EOF
- ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
- { (eval echo configure:17182: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
- ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
- if test -z "$ac_err"; then
-   rm -rf conftest*
-   eval "ac_cv_header_$ac_safe=yes"
- else
-   echo "$ac_err" >&5
-   echo "configure: failed program was:" >&5
-   cat conftest.$ac_ext >&5
-   rm -rf conftest*
-   eval "ac_cv_header_$ac_safe=no"
- fi
- rm -f conftest*
- fi
- if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-   echo "$ac_t""yes" 1>&6
-   
-     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
- echo "configure:17200: checking for LC_MESSAGES" >&5
- if eval "test \"`echo '$''{'ac_cv_val_LC_MESSAGES'+set}'`\" = set"; then
-   echo $ac_n "(cached) $ac_c" 1>&6
- else
-   cat > conftest.$ac_ext <
- int main() {
- return LC_MESSAGES
- ; return 0; }
- EOF
- if { (eval echo configure:17212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-   rm -rf conftest*
-   ac_cv_val_LC_MESSAGES=yes
- else
-   echo "configure: failed program was:" >&5
-   cat conftest.$ac_ext >&5
-   rm -rf conftest*
-   ac_cv_val_LC_MESSAGES=no
- fi
- rm -f conftest*
- fi
- 
- echo "$ac_t""$ac_cv_val_LC_MESSAGES" 1>&6
-     if test $ac_cv_val_LC_MESSAGES = yes; then
-       cat >> confdefs.h <<\EOF
- #define HAVE_LC_MESSAGES 1
- EOF
- 
-     fi
-   
- else
-   echo "$ac_t""no" 1>&6
- fi
- 
- 
- 
  if test "${multilib}" = "yes"; then
    multilib_arg="--enable-multilib"
  else
--- 21194,21199 ----
*************** INTERFACE=v3
*** 17245,17273 ****
  
  # Export all the install information
  
! 
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
- 
- # Export build and source directories.
- # These need to be absolute paths, yet at the same time need to
- # canonicalize only relative paths, because then amd will not unmount
- # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
- glibcpp_builddir=`pwd`
- case $srcdir in
- \\/$* | ?:\\/*) glibcpp_srcdir=${srcdir} ;;
- *) glibcpp_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
- esac
  glibcpp_prefixdir=${prefix}
  
  echo $ac_n "checking for interface version number""... $ac_c" 1>&6
! echo "configure:17265: checking for interface version number" >&5
  libstdcxx_interface=$INTERFACE
  echo "$ac_t""$libstdcxx_interface" 1>&6
  
  # Process the option --with-gxx-include-dir=
  echo $ac_n "checking for --with-gxx-include-dir""... $ac_c" 1>&6
! echo "configure:17271: checking for --with-gxx-include-dir" >&5
  # Check whether --with-gxx-include-dir or --without-gxx-include-dir was given.
  if test "${with_gxx_include_dir+set}" = set; then
    withval="$with_gxx_include_dir"
--- 21205,21224 ----
  
  # Export all the install information
  
! # Assumes glibcpp_builddir, glibcpp_srcdir are alreay set up and
! # exported correctly in GLIBCPP_CONFIGURE.
  glibcpp_toolexecdir=no
  glibcpp_toolexeclibdir=no
  glibcpp_prefixdir=${prefix}
  
  echo $ac_n "checking for interface version number""... $ac_c" 1>&6
! echo "configure:21216: checking for interface version number" >&5
  libstdcxx_interface=$INTERFACE
  echo "$ac_t""$libstdcxx_interface" 1>&6
  
  # Process the option --with-gxx-include-dir=
  echo $ac_n "checking for --with-gxx-include-dir""... $ac_c" 1>&6
! echo "configure:21222: checking for --with-gxx-include-dir" >&5
  # Check whether --with-gxx-include-dir or --without-gxx-include-dir was given.
  if test "${with_gxx_include_dir+set}" = set; then
    withval="$with_gxx_include_dir"
*************** echo "$ac_t""$gxx_include_dir" 1>&6
*** 17291,17297 ****
  
  # Process the option "--enable-version-specific-runtime-libs"
  echo $ac_n "checking for --enable-version-specific-runtime-libs""... $ac_c" 1>&6
! echo "configure:17295: checking for --enable-version-specific-runtime-libs" >&5
  # Check whether --enable-version-specific-runtime-libs or --disable-version-specific-runtime-libs was given.
  if test "${enable_version_specific_runtime_libs+set}" = set; then
    enableval="$enable_version_specific_runtime_libs"
--- 21242,21248 ----
  
  # Process the option "--enable-version-specific-runtime-libs"
  echo $ac_n "checking for --enable-version-specific-runtime-libs""... $ac_c" 1>&6
! echo "configure:21246: checking for --enable-version-specific-runtime-libs" >&5
  # Check whether --enable-version-specific-runtime-libs or --disable-version-specific-runtime-libs was given.
  if test "${enable_version_specific_runtime_libs+set}" = set; then
    enableval="$enable_version_specific_runtime_libs"
*************** if test $version_specific_libs = yes; th
*** 17313,17319 ****
      gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    fi
--- 21264,21272 ----
      gcc_version_trigger=${srcdir}/../gcc/version.c
    gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
    gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
!   if test x"$gxx_include_dir" = x"no"; then
!     gxx_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include/g++
!   fi
    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
    glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
    fi
*************** fi
*** 17327,17333 ****
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
--- 21280,21287 ----
  # Calculate glibcpp_toolexecdir, glibcpp_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcpp_toolexecdir" = x"no"; then 
!   if test -n "$with_cross_host" &&
!      test x"$with_cross_host" != x"no"; then
      glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
      glibcpp_toolexeclibdir='$(toolexecdir)/lib$(MULTISUBDIR)'
    else
*************** if test x"$glibcpp_toolexecdir" = x"no";
*** 17337,17343 ****
  fi
  
  echo $ac_n "checking for install location""... $ac_c" 1>&6
! echo "configure:17341: checking for install location" >&5
  echo "$ac_t""$gxx_include_dir" 1>&6
  
  
--- 21291,21297 ----
  fi
  
  echo $ac_n "checking for install location""... $ac_c" 1>&6
! echo "configure:21295: checking for install location" >&5
  echo "$ac_t""$gxx_include_dir" 1>&6
  
  
*************** echo "$ac_t""$gxx_include_dir" 1>&6
*** 17346,17353 ****
  
  
  
- 
- 
  # Export all the include and flag information to makefiles.
  
    # Root level of the build directory include sources.
--- 21300,21305 ----
*************** ac_given_INSTALL="$INSTALL"
*** 17502,17508 ****
  trap 'rm -fr `echo "Makefile \
      include/Makefile src/Makefile \
      libmath/Makefile libio/Makefile libsupc++/Makefile \
!     testsuite/Makefile mkcheck testsuite_flags config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
  EOF
  cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
  for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
--- 21634,21640 ----
  CONFIG_FILES=\${CONFIG_FILES-"Makefile \
      include/Makefile src/Makefile \
      libmath/Makefile libio/Makefile libsupc++/Makefile \
!     po/Makefile testsuite/Makefile mkcheck testsuite_flags"}
  EOF
  cat >> $CONFIG_STATUS <<\EOF
  for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
*************** fi; done
*** 17837,17844 ****
  EOF
  
  cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
--- 21803,21810 ----
  EOF
  
  cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF
*************** EOF
*** 17896,17901 ****
--- 21862,21868 ----
  cat >> $CONFIG_STATUS <<\EOF
  test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
  if test -n "$CONFIG_FILES"; then
+   LD="${ORIGINAL_LD_FOR_MULTILIBS}"
    ac_file=Makefile . ${glibcpp_basedir}/../config-ml.in
    grep '^MULTISUBDIR =' Makefile >> src/Makefile
    grep '^MULTISUBDIR =' Makefile >> libsupc++/Makefile
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/configure.in gcc-3.1/libstdc++-v3/configure.in
*** gcc-3.0.4/libstdc++-v3/configure.in	Tue Aug 28 21:19:07 2001
--- gcc-3.1/libstdc++-v3/configure.in	Wed May  8 04:27:59 2002
***************
*** 1,68 ****
  # Process this file with autoconf to produce a configure script, like so:
! # aclocal, autoconf, autoheader, automake
  
  AC_PREREQ(2.13)
  AC_INIT(src/ios.cc)
  
! # When building with srcdir == objdir, links to the source files will
! # be created in directories within the target_subdir.  We have to
! # adjust toplevel_srcdir accordingly, so that configure finds
! # install-sh and other auxiliary files that live in the top-level
! # source directory.
! if test "${srcdir}" = "."; then
!   if test -z "${with_target_subdir}"; then
!     toprel=".."
!   else
!     if test "${with_target_subdir}" != "."; then
!       toprel="${with_multisrctop}../.."
!     else
!       toprel="${with_multisrctop}.."
!     fi
!   fi
! else
!   toprel=".."
! fi
! AC_CONFIG_AUX_DIR(${srcdir}/$toprel)
! toplevel_srcdir=\${top_srcdir}/$toprel
! AC_SUBST(toplevel_srcdir)
  
! dnl This is here just to satisfy automake.
! ifelse(not,equal,[AC_CONFIG_AUX_DIR(..)])
  
! # Gets and sets build, host, target, *_vendor, *_cpu, *_os, etc.
! # AC 2.50 sets target_alias iff the user specified --target, but we use it
! # everywhere, so we set it here just to be sure.
  AC_CANONICAL_SYSTEM
  target_alias=${target_alias-$target}
  AC_SUBST(target_alias)
  
! # Will set LN_S to either 'ln -s' or 'ln'.  With autoconf 2.50+, can also
! # be 'cp -p' if linking isn't available.
! AC_PROG_LN_S
! 
! # We use these options to decide which functions to include.
! AC_ARG_WITH(target-subdir,
! [  --with-target-subdir=SUBDIR
!                            configuring in a subdirectory])
! AC_ARG_WITH(cross-host,
! [  --with-cross-host=HOST  configuring with a cross compiler])
  
! # Runs configure.host and configure.target. Have to run this before
! # the GLIBCPP_ENABLE_* macros below.
  GLIBCPP_CONFIGURE(.)
  
  AC_LIBTOOL_DLOPEN
  AM_PROG_LIBTOOL
  AC_SUBST(enable_shared)
  AC_SUBST(enable_static)
- GLIBCPP_CHECK_GNU_MAKE
- 
- AM_CONFIG_HEADER(config.h)
  
  # Check for c++ or library specific bits that don't require linking.
! GLIBCPP_CHECK_COMPILER_VERSION
  
! # Enable all the crazy c++ stuff.  C_MBCHAR must come early.
  GLIBCPP_ENABLE_DEBUG($USE_MAINTAINER_MODE)
  GLIBCPP_ENABLE_CSTDIO
  GLIBCPP_ENABLE_CLOCALE
--- 1,50 ----
  # Process this file with autoconf to produce a configure script, like so:
! # aclocal && autoconf && autoheader && automake
  
  AC_PREREQ(2.13)
  AC_INIT(src/ios.cc)
  
! # This works around the fact that libtool configuration may change LD
! # for this particular configuration, but some shells, instead of
! # keeping the changes in LD private, export them just because LD is
! # exported.
! ORIGINAL_LD_FOR_MULTILIBS=$LD
  
! PACKAGE=libstdc++
! AC_SUBST(PACKAGE)
! # For typical GNU versioning info, format is MAJOR.MINOR.MICRO
! release_VERSION=3.1.0
! AC_SUBST(release_VERSION)
! # For libtool versioning info, format is CURRENT:REVISION:AGE
! libtool_VERSION=4:0:0
! AC_SUBST(libtool_VERSION)
  
! # Gets build, host, target, *_vendor, *_cpu, *_os, etc.
! # AC 2.5x sets target_alias iff the user specified --target, but we use it
! # everywhere, so we set it here just to be sure.  In AC 2.13
! # AC_CANONICAL_TARGET was known as AC_CANONICAL_SYSTEM.
  AC_CANONICAL_SYSTEM
  target_alias=${target_alias-$target}
  AC_SUBST(target_alias)
  
! AM_INIT_AUTOMAKE($PACKAGE, $release_VERSION)
! AM_CONFIG_HEADER(config.h)
  
! # Runs configure.host and configure.target, as well as finds CC, CXX
! # and assorted other critical bits.  Have to run this before the
! # GLIBCPP_ENABLE_* macros below.
  GLIBCPP_CONFIGURE(.)
  
  AC_LIBTOOL_DLOPEN
  AM_PROG_LIBTOOL
  AC_SUBST(enable_shared)
  AC_SUBST(enable_static)
  
  # Check for c++ or library specific bits that don't require linking.
! #GLIBCPP_CHECK_COMPILER_VERSION
! GLIBCPP_CHECK_GNU_MAKE
  
! # Enable all the variable C++ stuff.  C_MBCHAR must come early.
  GLIBCPP_ENABLE_DEBUG($USE_MAINTAINER_MODE)
  GLIBCPP_ENABLE_CSTDIO
  GLIBCPP_ENABLE_CLOCALE
*************** GLIBCPP_ENABLE_CHEADERS([c_std])
*** 73,86 ****
  GLIBCPP_ENABLE_THREADS
  GLIBCPP_ENABLE_CXX_FLAGS([none])
  GLIBCPP_ENABLE_SJLJ_EXCEPTIONS
  
  if test -n "$with_cross_host" || test x"$build" != x"$host"; then
  
    # We are being configured with some form of cross compiler.
-   # mknumeric_limits may not work correctly, either because the
-   # compiler may not run on this machine, may not be able to link
-   # executables, or may produce executables we can't run on this
-   # machine.
    GLIBCPP_IS_CROSS_COMPILING=1
  
    # If Canadian cross, then don't pick up tools from the build
--- 55,80 ----
  GLIBCPP_ENABLE_THREADS
  GLIBCPP_ENABLE_CXX_FLAGS([none])
  GLIBCPP_ENABLE_SJLJ_EXCEPTIONS
+ GLIBCPP_ENABLE_LIBUNWIND_EXCEPTIONS
+ GLIBCPP_ENABLE_CONCEPT_CHECKS
+ 
  
  if test -n "$with_cross_host" || test x"$build" != x"$host"; then
  
+   # This lets us hard-code the functionality we know
+   # we'll have in the cross target environment. "Let" is a
+   # sugar-coated word placed on an especially dull and tedious hack, actually.
+   # Here's why GLIBCPP_CHECK_MATH_SUPPORT, and other autoconf macros
+   # that involve linking can't be used:
+   # "cannot open sim-crt0.o"
+   # "cannot open crt0.o"
+   # etc. All this is because there currently exists no unified,
+   # consistent way for top level CC information to be passed down
+   # to target directories: newlib includes, newlib linking info,
+   # libgloss versus newlib crt0.o, etc. When all of this is done, all
+   # of this hokey, excessive AC_DEFINE junk for crosses can be removed.
+ 
    # We are being configured with some form of cross compiler.
    GLIBCPP_IS_CROSS_COMPILING=1
  
    # If Canadian cross, then don't pick up tools from the build
*************** if test -n "$with_cross_host" || test x"
*** 91,198 ****
      CANADIAN=no
    fi
  
    case "$target_alias" in
      *-linux*)
! 	# Construct linux crosses by hand, eliminating bits that need ld...
!         # Check for available headers.
!         AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h fp.h locale.h \
! 	float.h inttypes.h])
! 
! 	# GLIBCPP_CHECK_COMPILER_FEATURES
! 	SECTION_FLAGS='-ffunction-sections -fdata-sections'
! 	AC_SUBST(SECTION_FLAGS)
! 	GLIBCPP_CHECK_LINKER_FEATURES
! 	# GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
! 	# GLIBCPP_CHECK_MATH_SUPPORT
! 	AC_DEFINE(HAVE_ACOSF)
! 	AC_DEFINE(HAVE_ASINF)
! 	AC_DEFINE(HAVE_ATAN2F)
! 	AC_DEFINE(HAVE_ATANF)
! 	AC_DEFINE(HAVE_CEILF)
! 	AC_DEFINE(HAVE_COPYSIGN)
! 	AC_DEFINE(HAVE_COPYSIGNF)
! 	AC_DEFINE(HAVE_COSF)
! 	AC_DEFINE(HAVE_COSHF)
! 	AC_DEFINE(HAVE_EXPF)
! 	AC_DEFINE(HAVE_FABSF)
! 	AC_DEFINE(HAVE_FINITE)
! 	AC_DEFINE(HAVE_FINITEF)
! 	AC_DEFINE(HAVE_FLOORF)
! 	AC_DEFINE(HAVE_FMODF)
! 	AC_DEFINE(HAVE_FREXPF)
! 	AC_DEFINE(HAVE_ISINF)
! 	AC_DEFINE(HAVE_ISINFF)
! 	AC_DEFINE(HAVE_ISNAN)
! 	AC_DEFINE(HAVE_ISNANF)
! 	AC_DEFINE(HAVE_LDEXPF)
! 	AC_DEFINE(HAVE_LOG10F)
! 	AC_DEFINE(HAVE_LOGF)
! 	AC_DEFINE(HAVE_MODFF)
! 	AC_DEFINE(HAVE_POWF)
! 	AC_DEFINE(HAVE_SINCOS)
! 	AC_DEFINE(HAVE_SINCOSF)
! 	AC_DEFINE(HAVE_SINF)
! 	AC_DEFINE(HAVE_SINHF)
! 	AC_DEFINE(HAVE_SQRTF)
! 	AC_DEFINE(HAVE_TANF)
! 	AC_DEFINE(HAVE_TANHF)
! 
! 	# At some point, we should differentiate between architectures
! 	# like x86, which have long double versions, and alpha/powerpc/etc.,
! 	# which don't. For the time being, punt.
! 	if test x"long_double_math_on_this_cpu" = x"yes"; then
! 	  AC_DEFINE(HAVE_ACOSL)
! 	  AC_DEFINE(HAVE_ASINL)
! 	  AC_DEFINE(HAVE_ATAN2L)
! 	  AC_DEFINE(HAVE_ATANL)
! 	  AC_DEFINE(HAVE_CEILL)
! 	  AC_DEFINE(HAVE_COPYSIGNL)
! 	  AC_DEFINE(HAVE_COSL)
! 	  AC_DEFINE(HAVE_COSHL)
! 	  AC_DEFINE(HAVE_EXPL)
! 	  AC_DEFINE(HAVE_FABSL)
! 	  AC_DEFINE(HAVE_FINITEL)
! 	  AC_DEFINE(HAVE_FLOORL)
! 	  AC_DEFINE(HAVE_FMODL)
! 	  AC_DEFINE(HAVE_FREXPL)
! 	  AC_DEFINE(HAVE_ISINFL)
! 	  AC_DEFINE(HAVE_ISNANL)
! 	  AC_DEFINE(HAVE_LDEXPL)
! 	  AC_DEFINE(HAVE_LOG10L)
! 	  AC_DEFINE(HAVE_LOGL)
! 	  AC_DEFINE(HAVE_MODFL)
! 	  AC_DEFINE(HAVE_POWL)
! 	  AC_DEFINE(HAVE_SINCOSL)
! 	  AC_DEFINE(HAVE_SINL)
! 	  AC_DEFINE(HAVE_SINHL)
! 	  AC_DEFINE(HAVE_SQRTL)
! 	  AC_DEFINE(HAVE_TANL)
! 	  AC_DEFINE(HAVE_TANHL)
! 	fi
! 	GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
! 	GLIBCPP_CHECK_WCHAR_T_SUPPORT
! 	os_include_dir="config/os/gnu-linux"
! 	# GLIBCPP_CHECK_STDLIB_SUPPORT
! 	AC_DEFINE(HAVE_STRTOF)        
! 	AC_DEFINE(HAVE_STRTOLD)        
! 	# AC_FUNC_MMAP
! 	AC_DEFINE(HAVE_MMAP)
! 	;;
      *)
! 	# We assume newlib.  This lets us hard-code the functions we know
! 	# we'll have.
! 	AC_DEFINE(HAVE_FINITE)
! 	AC_DEFINE(HAVE_ISNAN)
! 	AC_DEFINE(HAVE_ISNANF)
! 	AC_DEFINE(HAVE_ISINF)
! 	AC_DEFINE(HAVE_ISINFF)
  
! 	os_include_dir="config/os/newlib"
  
! 	# need to check for faster f versions of math functions, ie sinf?
! 	;;
    esac
  else
  
    # We are being configured natively. We can do more elaborate tests
--- 85,242 ----
      CANADIAN=no
    fi
  
+   # Construct crosses by hand, eliminating bits that need ld...
+   # GLIBCPP_CHECK_COMPILER_FEATURES
+   # GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT
+   # GLIBCPP_CHECK_MATH_SUPPORT
+ 
    case "$target_alias" in
      *-linux*)
!       # Check for available headers.
!       AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h])
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!       AC_SUBST(SECTION_FLAGS)
!       GLIBCPP_CHECK_LINKER_FEATURES
!       GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
!       GLIBCPP_CHECK_WCHAR_T_SUPPORT
!       os_include_dir="config/os/gnu-linux"
!       AC_DEFINE(HAVE_COPYSIGN)
!       AC_DEFINE(HAVE_COPYSIGNF)
!       AC_DEFINE(HAVE_FINITEF)
!       AC_DEFINE(HAVE_FREXPF)
!       AC_DEFINE(HAVE_HYPOTF)
!       AC_DEFINE(HAVE_SINCOS)
!       AC_DEFINE(HAVE_SINCOSF)
!       if test x"long_double_math_on_this_cpu" = x"yes"; then
! 	AC_DEFINE(HAVE_HYPOTL)
!       fi
!       ;;
!     *-hpux*)
!       # Check for available headers.
!       AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h])
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!       AC_SUBST(SECTION_FLAGS)
!       GLIBCPP_CHECK_LINKER_FEATURES
!       GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
!       GLIBCPP_CHECK_WCHAR_T_SUPPORT
!       os_include_dir="config/os/hpux"
!       AC_DEFINE(HAVE_COPYSIGN)
!       AC_DEFINE(HAVE_COPYSIGNF)
!       AC_DEFINE(HAVE_FINITEF)
!       AC_DEFINE(HAVE_FREXPF)
!       AC_DEFINE(HAVE_HYPOT)
!       AC_DEFINE(HAVE_SINCOS)
!       AC_DEFINE(HAVE_SINCOSF)
!       ;;
!     *-netbsd*)
!       # Check for available headers.
!       AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
! 	machine/endian.h machine/param.h sys/machine.h sys/types.h \
! 	fp.h locale.h float.h inttypes.h])
!       SECTION_FLAGS='-ffunction-sections -fdata-sections'
!       AC_SUBST(SECTION_FLAGS) 
!       GLIBCPP_CHECK_LINKER_FEATURES
!       GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
!       GLIBCPP_CHECK_WCHAR_T_SUPPORT
!       os_include_dir="config/os/bsd/netbsd"
!       AC_DEFINE(HAVE_COPYSIGN)
!       AC_DEFINE(HAVE_COPYSIGNF)
!       AC_DEFINE(HAVE_FINITEF)
!       AC_DEFINE(HAVE_FREXPF)
!       AC_DEFINE(HAVE_HYPOTF)
!       ;;
!     *-mingw32*)
!       AC_CHECK_HEADERS([sys/types.h locale.h float.h])
!       GLIBCPP_CHECK_LINKER_FEATURES
!       GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
!       GLIBCPP_CHECK_WCHAR_T_SUPPORT
!       os_include_dir="config/os/mingw32"
!       ;;
      *)
!       os_include_dir="config/os/newlib"
!       AC_DEFINE(HAVE_HYPOT)
!       ;;
!   esac
  
!   case "$target_alias" in
!     *-mingw32*)
!       ;;
!     *)
!       # GLIBCPP_CHECK_STDLIB_SUPPORT
!       AC_DEFINE(HAVE_STRTOF)        
!       AC_DEFINE(HAVE_STRTOLD)        
!       # AC_FUNC_MMAP
!       AC_DEFINE(HAVE_MMAP)
  
!       AC_DEFINE(HAVE_ACOSF)
!       AC_DEFINE(HAVE_ASINF)
!       AC_DEFINE(HAVE_ATAN2F)
!       AC_DEFINE(HAVE_ATANF)
!       AC_DEFINE(HAVE_CEILF)
!       AC_DEFINE(HAVE_COPYSIGN)
!       AC_DEFINE(HAVE_COPYSIGNF)
!       AC_DEFINE(HAVE_COSF)
!       AC_DEFINE(HAVE_COSHF)
!       AC_DEFINE(HAVE_EXPF)
!       AC_DEFINE(HAVE_FABSF)
!       AC_DEFINE(HAVE_FINITE)
!       AC_DEFINE(HAVE_FINITEF)
!       AC_DEFINE(HAVE_FLOORF)
!       AC_DEFINE(HAVE_FMODF)
!       AC_DEFINE(HAVE_FREXPF)
!       AC_DEFINE(HAVE_ISINF)
!       AC_DEFINE(HAVE_ISINFF)
!       AC_DEFINE(HAVE_ISNAN)
!       AC_DEFINE(HAVE_ISNANF)
!       AC_DEFINE(HAVE_LDEXPF)
!       AC_DEFINE(HAVE_LOG10F)
!       AC_DEFINE(HAVE_LOGF)
!       AC_DEFINE(HAVE_MODFF)
!       AC_DEFINE(HAVE_POWF)
!       AC_DEFINE(HAVE_SINF)
!       AC_DEFINE(HAVE_SINHF)
!       AC_DEFINE(HAVE_SQRTF)
!       AC_DEFINE(HAVE_TANF)
!       AC_DEFINE(HAVE_TANHF)
!       ;;
    esac
+ 
+   # At some point, we should differentiate between architectures
+   # like x86, which have long double versions, and alpha/powerpc/etc.,
+   # which don't. For the time being, punt.
+   if test x"long_double_math_on_this_cpu" = x"yes"; then
+     AC_DEFINE(HAVE_ACOSL)
+     AC_DEFINE(HAVE_ASINL)
+     AC_DEFINE(HAVE_ATAN2L)
+     AC_DEFINE(HAVE_ATANL)
+     AC_DEFINE(HAVE_CEILL)
+     AC_DEFINE(HAVE_COPYSIGNL)
+     AC_DEFINE(HAVE_COSL)
+     AC_DEFINE(HAVE_COSHL)
+     AC_DEFINE(HAVE_EXPL)
+     AC_DEFINE(HAVE_FABSL)
+     AC_DEFINE(HAVE_FINITEL)
+     AC_DEFINE(HAVE_FLOORL)
+     AC_DEFINE(HAVE_FMODL)
+     AC_DEFINE(HAVE_FREXPL)
+     AC_DEFINE(HAVE_ISINFL)
+     AC_DEFINE(HAVE_ISNANL)
+     AC_DEFINE(HAVE_LDEXPL)
+     AC_DEFINE(HAVE_LOG10L)
+     AC_DEFINE(HAVE_LOGL)
+     AC_DEFINE(HAVE_MODFL)
+     AC_DEFINE(HAVE_POWL)
+     AC_DEFINE(HAVE_SINCOSL)
+     AC_DEFINE(HAVE_SINL)
+     AC_DEFINE(HAVE_SINHL)
+     AC_DEFINE(HAVE_SQRTL)
+     AC_DEFINE(HAVE_TANL)
+     AC_DEFINE(HAVE_TANHL)
+   fi
  else
  
    # We are being configured natively. We can do more elaborate tests
*************** else
*** 212,244 ****
    GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
    GLIBCPP_CHECK_WCHAR_T_SUPPORT
    GLIBCPP_CHECK_STDLIB_SUPPORT
  
    AC_TRY_COMPILE([
! #include 
! ], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);],
! [AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available.  ])])
  
    AC_FUNC_MMAP
  fi
  
! # Enable/configure some pieces which may require knowledge about the
! # compiler situation (native/cross), which we just finished discovering.
! GLIBCPP_CONFIGURE_TESTSUITE
  
  # Propagate the target-specific source directories through the build chain.
  OS_INC_SRCDIR=$os_include_dir/bits
  ATOMICITY_INC_SRCDIR=$ATOMICITYH/bits
! LIMITS_INC_SRCDIR=$LIMITSH/bits
  AC_SUBST(OS_INC_SRCDIR)
  AC_SUBST(ATOMICITY_INC_SRCDIR)
! AC_SUBST(LIMITS_INC_SRCDIR)
  
  # Set up cross-compile flags
  AC_SUBST(GLIBCPP_IS_CROSS_COMPILING)
  AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
   
  AC_CACHE_SAVE
- AC_LC_MESSAGES
  
  if test "${multilib}" = "yes"; then
    multilib_arg="--enable-multilib"
--- 256,291 ----
    GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT
    GLIBCPP_CHECK_WCHAR_T_SUPPORT
    GLIBCPP_CHECK_STDLIB_SUPPORT
+   AC_LC_MESSAGES
  
    AC_TRY_COMPILE([
!   #include 
!   ], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);],
!   [AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available.  ])
!   ])
  
    AC_FUNC_MMAP
+ 
+   # Establish limits on memory usage during 'make check'
+   GLIBCPP_CONFIGURE_TESTSUITE
  fi
  
! # This depends on the possibly-skipped linker test above.
! GLIBCPP_ENABLE_SYMVERS([yes])
  
  # Propagate the target-specific source directories through the build chain.
  OS_INC_SRCDIR=$os_include_dir/bits
  ATOMICITY_INC_SRCDIR=$ATOMICITYH/bits
! CPU_LIMITS_INC_SRCDIR=$CPULIMITSH/bits
  AC_SUBST(OS_INC_SRCDIR)
  AC_SUBST(ATOMICITY_INC_SRCDIR)
! AC_SUBST(CPU_LIMITS_INC_SRCDIR)
  
  # Set up cross-compile flags
  AC_SUBST(GLIBCPP_IS_CROSS_COMPILING)
  AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
   
  AC_CACHE_SAVE
  
  if test "${multilib}" = "yes"; then
    multilib_arg="--enable-multilib"
*************** AC_SUBST(LIBSUPCXX_PICFLAGS)
*** 273,280 ****
  AC_OUTPUT(Makefile \
      include/Makefile src/Makefile \
      libmath/Makefile libio/Makefile libsupc++/Makefile \
!     testsuite/Makefile mkcheck testsuite_flags,
  [if test -n "$CONFIG_FILES"; then
    ac_file=Makefile . ${glibcpp_basedir}/../config-ml.in
    grep '^MULTISUBDIR =' Makefile >> src/Makefile
    grep '^MULTISUBDIR =' Makefile >> libsupc++/Makefile
--- 320,328 ----
  AC_OUTPUT(Makefile \
      include/Makefile src/Makefile \
      libmath/Makefile libio/Makefile libsupc++/Makefile \
!     po/Makefile testsuite/Makefile mkcheck testsuite_flags,
  [if test -n "$CONFIG_FILES"; then
+   LD="${ORIGINAL_LD_FOR_MULTILIBS}"
    ac_file=Makefile . ${glibcpp_basedir}/../config-ml.in
    grep '^MULTISUBDIR =' Makefile >> src/Makefile
    grep '^MULTISUBDIR =' Makefile >> libsupc++/Makefile
*************** glibcpp_basedir=${glibcpp_basedir}
*** 292,297 ****
--- 340,370 ----
  CC="${CC}"
  CXX="${CXX}"
  )
+ dnl  In autoconf 2.5x, AC_OUTPUT is replaced by three AC_ macros:
+ dnl  AC_CONFIG_FILES(Makefile \
+ dnl      include/Makefile src/Makefile \
+ dnl      libmath/Makefile libio/Makefile libsupc++/Makefile \
+ dnl      po/Makefile testsuite/Makefile mkcheck testsuite_flags)
+ dnl  AC_CONFIG_COMMANDS([default],
+ dnl  [if test -n "$CONFIG_FILES"; then
+ dnl    ac_file=Makefile . ${glibcpp_basedir}/../config-ml.in
+ dnl    grep '^MULTISUBDIR =' Makefile >> src/Makefile
+ dnl    grep '^MULTISUBDIR =' Makefile >> libsupc++/Makefile
+ dnl  fi
+ dnl  chmod +x mkcheck
+ dnl  chmod +x testsuite_flags
+ dnl  ],
+ dnl  srcdir=${srcdir}
+ dnl  host=${host}
+ dnl  target=${target}
+ dnl  with_multisubdir=${with_multisubdir}
+ dnl  ac_configure_args="${multilib_arg} ${ac_configure_args}"
+ dnl  CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ dnl  glibcpp_basedir=${glibcpp_basedir}
+ dnl  CC="${CC}"
+ dnl  CXX="${CXX}"
+ dnl  )
+ dnl  AC_OUTPUT
  
  
  # Sanity checking & User-visible messages.
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/configure.target gcc-3.1/libstdc++-v3/configure.target
*** gcc-3.0.4/libstdc++-v3/configure.target	Fri Jan 18 22:59:10 2002
--- gcc-3.1/libstdc++-v3/configure.target	Tue Apr 23 20:32:10 2002
***************
*** 13,19 ****
  #   target                The configuration target
  #   target_cpu            The configuration target CPU
  #   target_os             The configuration target OS
- #   target_optspace       --enable-target-optspace ("yes", "no", "")
  
  # It possibly modifies the following shell variables:
  #   cpu_include_dir        CPU-specific include directory, relative to srcdir
--- 13,18 ----
***************
*** 22,28 ****
  
  # Set any CPU dependent compiler flags.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
- 
  case "${target_cpu}" in
    alpha*)
      cpu_include_dir="config/cpu/alpha"
--- 21,26 ----
*************** case "${target_cpu}" in
*** 30,35 ****
--- 28,36 ----
    arm*)
      cpu_include_dir="config/cpu/arm"
      ;;
+   cris)
+     cpu_include_dir="config/cpu/cris"
+     ;;
    ia64)
      cpu_include_dir="config/cpu/ia64"
      ;;
*************** case "${target_cpu}" in
*** 54,59 ****
--- 55,63 ----
    sparc*)
      cpu_include_dir="config/cpu/sparc/sparc32"
      ;;
+   x86_64*)
+     cpu_include_dir="config/cpu/x86-64"
+     ;;
    *)
      cpu_include_dir="config/cpu/generic"
      ;;
*************** esac
*** 62,68 ****
  
  # Set any OS dependent compiler flags.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
- 
  case "${target_os}" in
    aix4.[3456789]* | aix[56789]*)
      os_include_dir="config/os/aix"
--- 66,71 ----
*************** case "${target_os}" in
*** 87,92 ****
--- 90,98 ----
    irix6.5)
      os_include_dir="config/os/irix/irix6.5"
      ;;
+   mingw32*)
+     os_include_dir="config/os/mingw32"
+     ;;
    netbsd*)
      os_include_dir="config/os/bsd/netbsd"
      ;;
*************** case "${target_os}" in
*** 99,105 ****
    solaris2.7* | solaris2.8*)
      os_include_dir="config/os/solaris/solaris2.7"
      ;;
!   hpux)
      os_include_dir="config/os/hpux"
      ;;
    *)
--- 105,111 ----
    solaris2.7* | solaris2.8*)
      os_include_dir="config/os/solaris/solaris2.7"
      ;;
!   hpux*)
      os_include_dir="config/os/hpux"
      ;;
    *)
*************** case "${target_os}" in
*** 108,116 ****
  esac
  
  
! # Set any flags dependant on the full target triplet.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
- 
  case "${target}" in
     *-*-aix[456789]*)
       # We set os_include_dir to config/os/aix only on AIX 4.3 and
--- 114,121 ----
  esac
  
  
! # Set any flags dependent on the full target triplet.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
  case "${target}" in
     *-*-aix[456789]*)
       # We set os_include_dir to config/os/aix only on AIX 4.3 and
*************** case "${target}" in
*** 125,147 ****
     *-*-irix*)
       ATOMICITYH=$os_include_dir
       ;;
     *)
       ATOMICITYH=$cpu_include_dir
       ;;
  esac
  
! # Set LIMITSH to the directory where the configuration-dependent
! # limits.h can be found.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
- 
  case "${target}" in
     i?86-*-*)
!      LIMITSH=config/cpu/i386
       ;;
     powerpc-*-*)
!      LIMITSH=config/cpu/powerpc
       ;;
     *)
!      LIMITSH=config/cpu/generic
       ;;
  esac
--- 130,185 ----
     *-*-irix*)
       ATOMICITYH=$os_include_dir
       ;;
+    mcore-*-pe*)
+      # The EPOC C++ environment does not support exceptions.
+      if test -z "$enable_cxx_flags"; then
+        enable_cxx_flags="-frtti -fno-exceptions"
+      fi
+      ATOMICITYH=$cpu_include_dir
+      ;;
     *)
       ATOMICITYH=$cpu_include_dir
       ;;
  esac
  
! # Set CPULIMITSH to the directory where the configuration-dependent
! # cpu_limits.h can be found.
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
  case "${target}" in
+    *-*-hpux*)
+      CPULIMITSH=config/os/hpux
+      ;;
+    alpha*-*-*osf5*)
+      CPULIMITSH=config/os/osf/osf5.0
+      ;;
+    alpha*-*-*)
+      CPULIMITSH=config/cpu/alpha
+      ;;
+    cris-*-*)
+      CPULIMITSH=config/cpu/cris
+      ;;
+    ia64-*-*)
+      CPULIMITSH=config/cpu/ia64
+      ;;
     i?86-*-*)
!      CPULIMITSH=config/cpu/i386
!      ;;
!    m68k-*-* | m680[246]0-*-*)
!      CPULIMITSH=config/cpu/m68k
!      ;;
!    mmix-*-*)
!      CPULIMITSH=config/cpu/mmix
       ;;
     powerpc-*-*)
!      CPULIMITSH=config/cpu/powerpc
!      ;;
!    s390-*-* | s390x-*-*)
!      CPULIMITSH=config/cpu/s390
!      ;;
!    x86_64-*-*)
!      CPULIMITSH=config/cpu/x86-64
       ;;
     *)
!      CPULIMITSH=config/cpu/generic
       ;;
  esac
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/Intro.3 gcc-3.1/libstdc++-v3/docs/doxygen/Intro.3
*** gcc-3.0.4/libstdc++-v3/docs/doxygen/Intro.3	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/docs/doxygen/Intro.3	Wed Mar 27 22:38:36 2002
***************
*** 0 ****
--- 1,136 ----
+ .\" t
+ .\" This man page is released under the FDL as part of libstdc++-v3.
+ .TH Intro 3 "27 March 2002" "GNU libstdc++-v3" "Standard C++ Library"
+ .SH NAME
+ Intro \- Introduction to the GNU libstdc++-v3 man pages
+ .SH DESCRIPTION
+ This man page serves as a brief introduction to the GNU implementation of
+ the Standard C++ Library.  For a better introduction and more complete
+ documentation, see the
+ .B libstdc++-v3
+ homepage listed at the end.
+ .P
+ All standard library entities are declared within
+ .I namespace std
+ and have manual entries beginning with "std_".  For example, to see
+ documentation of the template class
+ .I std::vector
+ one would use "man std_vector".  Some entities do not have a separate man
+ page; for those see the main listing in "man Namespace_Std".
+ .P
+ All the man pages are automatically generated by Doxygen.  For more
+ information on this tool, see the HTML counterpart to these man pages.
+ .P
+ Some man pages do not correspond to individual classes or functions.  Rather
+ they describe categories of the Standard Library.  (For a more thorough
+ introduction to the various categories, consult a text such as Josuttis'
+ or Austern's.)  These category pages are:
+ .P
+ .\" These are separated by ONE TAB.  Nothing else.  I don't like it either.
+ .\" Keep them alphabatized.
+ .TS
+ lB l.
+ Allocators	Classes encapsulating memory allocation schemes.
+ Arithmetic_functors	Functors for basic math.
+ Assoc_containers	Key-based containers.
+ Binder_functors	Functors which "remember" an argument.
+ Comparison_functors	Functors wrapping built-in comparisons.
+ Containers	An introduction to container classes.
+ Func_ptr_functors	Functors for use with pointers to functions.
+ Intro	This page.
+ Intro_functors	An introduction to function objects, or functors.
+ Iterator_types	Programatically distinguishing iterators/pointers.
+ Logical_functors	Functors wrapping the Boolean operations.
+ Member_ptr_functor	Functors for use with pointers to members.
+ Namespace_Std	A listing of the contents of std::.
+ Negation_functors	Functors which negate their contents.
+ SGIextensions	A list of the extensions from the SGI STL subset.
+ Sequences	Linear containers.
+ .TE
+ .P
+ The HTML documentation typically goes into much more depth.
+ .SH FILES
+ Lots!
+ .SS Standard Headers
+ These headers will be found automatically, unless you instruct the compiler
+ otherwise.
+ .TS
+ lB lB lB lB.
+           
+                  
+              
+              
+              
+             
+ 646               
+                 
+              
+                     
+              
+       
+ .TE
+ .SS Backwards-Compatibility Headers
+ For GCC 3.0 these headers will be found automatically, unless you instruct
+ the compiler otherwise.  You should not depend on this, instead you should
+ read FAQ 5.4 and use a
+ .B backward/
+ prefix.
+ .TS
+ lB lB lB lB.
+                 
+        
+          
+                  
+           
+            
+               
+             
+                 
+ .TE
+ .SS Extension Headers
+ These headers will only be found automatically if you include the leading
+ .B ext/
+ in the name.  Otherwise you need to read FAQ 5.4.
+ .\" Easy way to generate these columns of headers is to use GNU ls(1):
+ .\" ls -w 40 file1 file2... | sed 's=[a-z_][a-z_]*==g'
+ .TS
+ lB.
+        
+     
+         
+ .TE
+ .SS Libraries
+ .TP
+ .I libstdc++.a
+ The library implementation in static archive form.  If you did not configure
+ libstdc++-v3 to use shared libraries, this will always be used.  Otherwise
+ it will only be used if the user requests it.
+ .TP
+ .I libsupc++.a
+ This library contains C++ language support routines.  Usually you will never
+ need to know about it, but it can be useful.  See FAQ 2.5.
+ .TP
+ .I libstdc++.so[.N]
+ The library implementation in shared object form.  This will be used in
+ preference to the static archive form by default.  Currently N will either
+ start with 3 or with 4, but your system vendor may change the name as they
+ see fit.  If N is in the 2.x series, then you are looking at the old
+ libstdc++-v2 library, which we do not maintain.
+ .TP
+ .I libstdc++.la
+ .TP
+ .I libsupc++.la
+ These are Libtool library files, and should only be used when working with
+ that tool.
+ .SH CONFORMING TO
+ Almost conforming to
+ .BI "International Standard ISO/IEC 14882:1998(E), " "Programming Languages --- C++"
+ (aka the C++ standard), in addition to corrections proposed by the Library
+ Working Group,
+ .SM JTC1/SC22/WG21.
+ .SH SEE ALSO
+ .UR
+ http://gcc.gnu.org/libstdc++/
+ .UE
+ for the Frequently Asked Questions, online documentation, and much, much more!
+ .\" vim:ts=8:noet:
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/TODO gcc-3.1/libstdc++-v3/docs/doxygen/TODO
*** gcc-3.0.4/libstdc++-v3/docs/doxygen/TODO	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/docs/doxygen/TODO	Wed Mar 27 22:38:36 2002
***************
*** 0 ****
--- 1,65 ----
+ 
+ The approach I've been using for a given header is to recursively do each
+ of the "bits" headers which make up the standard header.  So, e.g., while
+ there are four headers making up , three of them were already
+ documented in the course of doing other headers.
+ 
+ "Untouched" means I've deliberately skipped it for various reasons, or
+ haven't gotten to it yet.  It /will/ be done (by somebody, eventually.)
+ 
+ If you document an area and need to skip (for whatever reason) a non-trivial
+ entity (i.e., one that should be documented), go ahead and add the comment
+ markup, and use the homegrown @doctodo tag.  See include/bits/stl_iterator.h
+ for examples of this.  Doing so will at least cause doxygen to consider the
+ entitiy as documented and include it in the output.  It will also add the
+ entity to the generated TODO page.
+ 
+ 
+  Area           Still needs to be doxygen-documented
+ -----------------------------------------------------------
+ 
+ c17             FINISHED (Nothing in Clause 17 "exists" in terms of code.)
+ c18             , Note A
+ c19             Note A
+ c20             Note A
+ c21             Untouched, Note B
+ c22             Untouched
+ c23             See doxygroups.cc and Note B.
+ c24             stl_iterator.h (__normal_iterator, other small TODO bits)
+                 stream iterators
+ c25             stl_algo.h (lots of stuff)
+ c26             , , stl_numeric.h[26.4], Note A
+ c27             Untouched
+ 
+ backward/*      Not scanned by doxygen.  Should it be?  Doubtful.
+ 
+ ext/*           Some of the SGI algorithm/functional extensions.
+                 All of rope/hashing/slist need docs.
+ 
+ __gnu_cxx       Tricky.  Right now ext/* are in this namespace.
+ 
+ -----------------------------------------------------------
+ 
+ NOTES:
+ 
+ A)  So far I have not tried to document any of the  headers.  So entities
+ such as atexit() are undocumented throughout the library.  Since we usually
+ do not have the C code (to which the doxygen comments would be attached),
+ this would need to be done in entirely separate files, a la doxygroups.cc.
+ 
+ B)  Huge chunks of containers and strings are described in common "Tables"
+ in the standard.  These are pseudo-duplicated in tables.html.  We can
+ use doxygen hooks like @pre and @see to reference the tables.  Then the
+ individual classes do like the standard does, and only document members for
+ which additional info is available.
+ 
+ 
+ STYLE:
+ stl_deque.h, stl_pair.h, and stl_algobase.h have good examples of what I've
+ been using for class, namespace-scope, and function documentation, respectively.
+ These should serve as starting points.  /Please/ maintain the inter-word and
+ inter-sentence spacing, as this might be generated and/or scanned in the
+ future.
+ 
+ 
+ vim:ts=4:et:
diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/doxygroups.cc gcc-3.1/libstdc++-v3/docs/doxygen/doxygroups.cc
*** gcc-3.0.4/libstdc++-v3/docs/doxygen/doxygroups.cc	Thu Jan  1 00:00:00 1970
--- gcc-3.1/libstdc++-v3/docs/doxygen/doxygroups.cc	Thu Apr 18 02:58:13 2002
***************
*** 0 ****
--- 1,214 ----
+ /*
+    Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+    See license.html for license.
+ 
+    This just provides documentation for stuff that doesn't need to be in the
+    source headers themselves.  It is a ".cc" file for the sole cheesy reason
+    that it triggers many different text editors into doing Nice Things when
+    typing comments.  However, it is mentioned nowhere except the *cfg.in files.
+ 
+    Some actual code (declarations) is exposed here, but no compiler ever
+    sees it.  The decls must be visible to doxygen, and sometimes their real
+    declarations are not visible, or not visible in a way we want.
+ 
+    Pieces separated by '// //' lines will usually not be presented to the
+    user on the same page.
+ */
+ 
+ // // // // // // // // // // // // // // // // // // // // // // // //
+ /** @namespace std
+  *  @brief Everything defined by the ISO C++ Standard is within namespace std.
+ */
+ /** @namespace __gnu_cxx
+  *  @brief This namespace serves two purposes.
+  *
+  *  This namespace is used for two things:
+  *  -  sequestering internal (implementation-only) names away from the
+  *     global namespace; these are details of the implementation and should
+  *     not be touched by users
+  *  -  GNU extensions for public use
+  *
+  *  This is still fluid and changing rapidly.  Currently the rule is:  if an
+  *  entitity is found in the user-level documentation, it falls into the
+  *  second category.
+ */
+ 
+ // // // // // // // // // // // // // // // // // // // // // // // //
+ /** @addtogroup SGIextensions STL extensions from SGI
+ Because libstdc++-v3 based its implementation of the STL subsections of
+ the library on the SGI 3.3 implementation, we inherited their extensions
+ as well.
+ 
+ They are additionally documented in the
+ 
+ online documentation, a copy of which is also shipped with the
+ library source code (in .../docs/html/documentation.html).  You can also
+ read the documentation on SGI's
+ site, which is still running even though the code is not maintained.
+ 
+ NB that the following notes are pulled from various
+ comments all over the place, so they may seem stilted.
+ 
+ */ + + // // // // // // // // // // // // // // // // // // // // // // // // + // This is standalone because, unlike the functor introduction, there is no + // single header file which serves as a base "all containers must include + // this header". We do some quoting of 14882 here. + /** @addtogroup Containers Containers + Containers are collections of objects. + + A container may hold any type which meets certain requirements, but the type + of contained object is chosen at compile time, and all objects in a given + container must be of the same type. (Polymorphism is possible by declaring a + container of pointers to a base class and then populating it with pointers to + instances of derived classes. Variant value types such as the @c any class + from Boost can also be used. + + All contained types must be @c Assignable and @c CopyConstructible. + Specific containers may place additional requirements on the types of + their contained objects. + + Containers manage memory allocation and deallocation themselves when + storing your objects. The objects are destroyed when the container is + itself destroyed. Note that if you are storing pointers in a container, + @c delete is @e not automatically called on the pointers before destroying them. + + All containers must meet certain requirements, summarized in + tables. + + The standard containers are further refined into + @link Sequences Sequences@endlink and + @link Assoc_containers Associative Containers@endlink. + */ + + /** @addtogroup Sequences Sequences + Sequences arrange a collection of objects into a strictly linear order. + + The differences between sequences are usually due to one or both of the + following: + - memory management + - algorithmic complexity + + As an example of the first case, @c vector is required to use a contiguous + memory layout, while other sequences such as @c deque are not. + + The prime reason for choosing one sequence over another should be based on + the second category of differences, algorithmic complexity. For example, if + you need to perform many inserts and removals from the middle of a sequence, + @c list would be ideal. But if you need to perform constant-time access to + random elements of the sequence, then @c list should not be used. + + All sequences must meet certain requirements, summarized in + tables. + */ + + /** @addtogroup Assoc_containers Associative Containers + Associative containers allow fast retrieval of data based on keys. + + Each container type is parameterized on a @c Key type, and an ordering + relation used to sort the elements of the container. + + There should be more text here. + + All associative containers must meet certain requirements, summarized in + tables. + */ + + // // // // // // // // // // // // // // // // // // // // // // // // + /** @namespace abi + * @brief The cross-vendor C++ Application Binary Interface. + * + * A brief overview of an ABI is given in the libstdc++-v3 FAQ, question + * 5.8 (you may have a copy of the FAQ locally, or you can view the online + * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_8). + * + * GCC subscribes to a relatively-new cross-vendor ABI for C++, sometimes + * called the IA64 ABI because it happens to be the native ABI for that + * platform. It is summarized at http://www.codesourcery.com/cxx-abi/ + * along with the current specification. + * + * For users of GCC 3.x, entry points are available in , which notes, + * "It is not normally necessary for user programs to include this header, + * or use the entry points directly. However, this header is available + * should that be needed." + */ + + namespace abi { + /** + @brief New ABI-mandated entry point in the C++ runtime library for demangling. + + @param mangled_name A NUL-terminated character string containing the name + to be demangled. + + @param output_buffer A region of memory, allocated with malloc, of + @a *length bytes, into which the demangled name + is stored. If @a output_buffer is not long enough, + it is expanded using realloc. @a output_buffer may + instead be NULL; in that case, the demangled name is + placed in a region of memory allocated with malloc. + + @param length If @a length is non-NULL, the length of the buffer containing + the demangled name is placed in @a *length. + + @param status @a *status is set to one of the following values: + - 0: The demangling operation succeeded. + - -1: A memory allocation failiure occurred. + - -2: @a mangled_name is not a valid name under the C++ ABI + mangling rules. + - -3: One of the arguments is invalid. + + @return A pointer to the start of the NUL-terminated demangled name, or NULL + if the demangling fails. The caller is responsible for deallocating + this memory using @c free. + + + The demagling is performed using the C++ ABI mangling rules, with + GNU extensions. For example, this function is used + in __gnu_cxx::__verbose_terminate_handler. See + http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#5 for other + examples of use. + + @note The same demangling functionality is available via libiberty + (@c and @c libiberty.a) in GCC 3.1 and later, but that + requires explicit installation (@c --enable-install-libiberty) and uses a + different API, although the ABI is unchanged. + */ + char* __cxa_demangle (const char* mangled_name, char* output_buffer, + size_t* length, int* status); + } // namespace abi + + // // // // // // // // // // // // // // // // // // // // // // // // + /** @addtogroup binarysearch Binary search algorithms + These algorithms are variations of a classic binary search. They all assume + that the sequence being searched is already sorted. + + The number of comparisons will be logarithmic (and as few as possible). + The number of steps through the sequence will be logarithmic for + random-access iterators (e.g., pointers), and linear otherwise. + + The LWG has passed Defect Report 270, which notes: The proposed + resolution reinterprets binary search. Instead of thinking about searching + for a value in a sorted range, we view that as an important special + case of a more general algorithm: searching for the partition point in a + partitioned range. We also add a guarantee that the old wording did not: + we ensure that the upper bound is no earlier than the lower bound, that + the pair returned by equal_range is a valid range, and that the first part + of that pair is the lower bound. + + The actual effect of the first sentence is that a comparison functor + passed by the user doesn't necessarily need to induce a strict weak ordering + relation. Rather, it partitions the range. + */ + + // // // // // // // // // // // // // // // // // // // // // // // // + + // // // // // // // // // // // // // // // // // // // // // // // // + /* * @addtogroup groupname description of group + placeholder text + */ + + // // // // // // // // // // // // // // // // // // // // // // // // + + // vim:et:noai: + diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/mainpage.doxy gcc-3.1/libstdc++-v3/docs/doxygen/mainpage.doxy *** gcc-3.0.4/libstdc++-v3/docs/doxygen/mainpage.doxy Mon May 14 19:48:54 2001 --- gcc-3.1/libstdc++-v3/docs/doxygen/mainpage.doxy Thu Jan 1 00:00:00 1970 *************** *** 1,62 **** - /*! \mainpage - -

documentation overview

- -

- There are two types of documentation for libstdc++-v3. One is the distribution documentation, which can be read - here. -

- -

- The other is the source documentation, of which this is the first page. -

- -

generating this file

-

- This page is automatically generated. The Makefile rule make - doxygen in the libstdc++-v3 build directory generates these pages - using a tool called, appropriately enough, doxygen. To learn more - about doxygen, take a look at the - doxygen webpage . -

- -

- The libstdc++-v3 configuration files needed to generate doxygen output - are located: -

docs/doxygen/user.cfg.in

-

docs/doxygen/maint.cfg.in

-

- -

libstdc++-v3 doxygen style guide

-

- In general, libstdc++-v3 files should be formatted according to the - GNU C++ Coding Standard rules found in the file C++STYLE. - Before any doxygen-specific formatting tweaks are made, please try to - make sure that the initial formatting is sound. -

- -

- The formatting guidelines for using libstdc++-v3 with doxygen are - still incomplete. There seems to be a marginal preference for the use - of Java-Doc style formatting, with the idea that the single-line style - (triple-slash) is the least intrusive mechanism for getting - libstdc++-v3 documented and cross-referenced while at the same time - minimizing disruption to the current formatting. -

- -

- For the time being, please see include/bits/char_traits.h - which is the test bed for a finished doxygen style guide. -

- - */ - - - - - - - - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/mainpage.html gcc-3.1/libstdc++-v3/docs/doxygen/mainpage.html *** gcc-3.0.4/libstdc++-v3/docs/doxygen/mainpage.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/libstdc++-v3/docs/doxygen/mainpage.html Thu Apr 18 01:45:44 2002 *************** *** 0 **** --- 1,138 ---- + + + + Main Page + + + + + + +

libstdc++-v3 Source Documentation

+ +

Documentation Overview

+ +

@LEVEL@-level docs, generated @DATE@.

+ +

There are two types of documentation for libstdc++-v3. One is the + distribution documentation, which can be read online at + http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html + or offline from docs/html/documentation.html in the library source + directory. +

+ +

The other type is the source documentation, of which this is the first page. + Both "user-level" and "maintainer-level" source + documentation is produced: user-level docs are for the users of this + library. The maint-level docs are for those interested in the underlying + workings of the library; they include all the user-level docs plus + additional notes and additional classes/functions/etc. +

+ +

Here are quick links to the pages which we seem to use the most; a full + index is at the bottom: + +

+

+ +

Generating this file

+

These HTML pages are automatically generated, along with the man pages. + The Makefile rules 'make doxygen' and + 'make doxygen-maint' in the libstdc++-v3 build directory + generates these pages using a tool called, appropriately enough, Doxygen. + To learn more about Doxygen, take a look at + + + the Doxygen homepage + +

+ +

The libstdc++-v3 configuration files needed to generate doxygen output + are located: +

  • docs/doxygen/user.cfg.in +
  • docs/doxygen/run_doxygen +
+

+ +

libstdc++-v3 doxygen style guide

+

In general, libstdc++-v3 files should be formatted according to the + GNU C++ Coding Standard rules found in the file C++STYLE. + Before any doxygen-specific formatting tweaks are made, please try to + make sure that the initial formatting is sound. +

+ +

The formatting guidelines for using libstdc++-v3 with doxygen are still + incomplete. There seems to be a marginal preference for the use of + Java-Doc style formatting, with the idea that the single-line style + (triple-slash) is the least intrusive mechanism for getting libstdc++-v3 + documented and cross-referenced while at the same time minimizing + disruption to the current formatting. Full documentation of functions + (parameter types, return values, etc) will require the slash-splat-splat + "extended C" commenting style. +

+ +

Full page index

+

Here are entry points to all the pages generated by Doxygen: +

+

+ + +

License, Copyright, and Other Lawyerly Verbosity

+

The libstdc++-v3 documentation is released under + + these terms. +

+

Part of the generated documentation involved comments + and notes from SGI, who says we gotta say this: +

+ Permission to use, copy, modify, distribute and sell this software and its + documentation for any purpose is hereby granted without fee, provided + that the below copyright notice appears in all copies and that both + the copyright notice and this permission notice appear in supporting + documentation. Silicon Graphics makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. +

+ Copyright © 1994 + Hewlett-Packard Company +
+

+

Part of the generated documentation is quoted from the ISO C++ Standard, + which is Copyright © 1998 by Information Technology Industry Council. +

+ + + + diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/maint.cfg.in gcc-3.1/libstdc++-v3/docs/doxygen/maint.cfg.in *** gcc-3.0.4/libstdc++-v3/docs/doxygen/maint.cfg.in Mon May 14 19:48:55 2001 --- gcc-3.1/libstdc++-v3/docs/doxygen/maint.cfg.in Thu Jan 1 00:00:00 1970 *************** *** 1,740 **** - # Doxyfile 1.2.4 - - # This file describes the settings to be used by doxygen for a project - # - # All text after a hash (#) is considered a comment and will be ignored - # The format is: - # TAG = value [value, ...] - # For lists items can also be appended using: - # TAG += value [value, ...] - # Values that contain spaces should be placed between quotes (" ") - - #--------------------------------------------------------------------------- - # General configuration options - #--------------------------------------------------------------------------- - - # The PROJECT_NAME tag is a single word (or a sequence of words surrounded - # by quotes) that should identify the project. - - PROJECT_NAME = "libstdc++" - - # The PROJECT_NUMBER tag can be used to enter a project or revision number. - # This could be handy for archiving the generated documentation or - # if some version control system is used. - - PROJECT_NUMBER = 3 - - # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) - # base path where the generated documentation will be put. - # If a relative path is entered, it will be relative to the location - # where doxygen was started. If left blank the current directory will be used. - ### Currently this is not really run through autoconf; it just looks that way. - OUTPUT_DIRECTORY = @outdir@ - - # The OUTPUT_LANGUAGE tag is used to specify the language in which all - # documentation generated by doxygen is written. Doxygen will use this - # information to generate all constant output in the proper language. - # The default language is English, other supported languages are: - # Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, - # Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, - # Polish, Portuguese and Slovene. - - OUTPUT_LANGUAGE = English - - # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in - # documentation are documented, even if no documentation was available. - # Private class members and static file members will be hidden unless - # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - - #EXTRACT_ALL = NO - EXTRACT_ALL = YES - - # If the EXTRACT_PRIVATE tag is set to YES all private members of a class - # will be included in the documentation. - - EXTRACT_PRIVATE = YES - - # If the EXTRACT_STATIC tag is set to YES all static members of a file - # will be included in the documentation. - - EXTRACT_STATIC = YES - - # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all - # undocumented members of documented classes, files or namespaces. - # If set to NO (the default) these members will be included in the - # various overviews, but no documentation section is generated. - # This option has no effect if EXTRACT_ALL is enabled. - - HIDE_UNDOC_MEMBERS = NO - - # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all - # undocumented classes that are normally visible in the class hierarchy. - # If set to NO (the default) these class will be included in the various - # overviews. This option has no effect if EXTRACT_ALL is enabled. - - HIDE_UNDOC_CLASSES = NO - - # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will - # include brief member descriptions after the members that are listed in - # the file and class documentation (similar to JavaDoc). - # Set to NO to disable this. - - BRIEF_MEMBER_DESC = NO - - # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend - # the brief description of a member or function before the detailed description. - # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the - # brief descriptions will be completely suppressed. - - REPEAT_BRIEF = YES - - # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then - # Doxygen will generate a detailed section even if there is only a brief - # description. - - ALWAYS_DETAILED_SEC = NO - - # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full - # path before files name in the file list and in the header files. If set - # to NO the shortest path that makes the file name unique will be used. - - FULL_PATH_NAMES = NO - - # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag - # can be used to strip a user defined part of the path. Stripping is - # only done if one of the specified strings matches the left-hand part of - # the path. It is allowed to use relative paths in the argument list. - - STRIP_FROM_PATH = - - # The INTERNAL_DOCS tag determines if documentation - # that is typed after a \internal command is included. If the tag is set - # to NO (the default) then the documentation will be excluded. - # Set it to YES to include the internal documentation. - - INTERNAL_DOCS = NO - - # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will - # generate a class diagram (in Html and LaTeX) for classes with base or - # super classes. Setting the tag to NO turns the diagrams off. - - CLASS_DIAGRAMS = NO - - # If the SOURCE_BROWSER tag is set to YES then a list of source files will - # be generated. Documented entities will be cross-referenced with these sources. - - SOURCE_BROWSER = NO - - # Setting the INLINE_SOURCES tag to YES will include the body - # of functions and classes directly in the documentation. - - INLINE_SOURCES = NO - - # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct - # doxygen to hide any special comment blocks from generated source code - # fragments. Normal C and C++ comments will always remain visible. - - STRIP_CODE_COMMENTS = YES - - # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate - # file names in lower case letters. If set to YES upper case letters are also - # allowed. This is useful if you have classes or files whose names only differ - # in case and if your file system supports case sensitive file names. Windows - # users are adviced to set this option to NO. - - CASE_SENSE_NAMES = YES - - # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen - # will show members with their full class and namespace scopes in the - # documentation. If set to YES the scope will be hidden. - - HIDE_SCOPE_NAMES = NO - - # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen - # will generate a verbatim copy of the header file for each class for - # which an include is specified. Set to NO to disable this. - - VERBATIM_HEADERS = NO - - # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen - # will put list of the files that are included by a file in the documentation - # of that file. - - SHOW_INCLUDE_FILES = YES - - # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen - # will interpret the first line (until the first dot) of a JavaDoc-style - # comment as the brief description. If set to NO, the JavaDoc - # comments will behave just like the Qt-style comments (thus requiring an - # explict @brief command for a brief description. - - JAVADOC_AUTOBRIEF = NO - - # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented - # member inherits the documentation from any documented member that it - # reimplements. - - INHERIT_DOCS = YES - - # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] - # is inserted in the documentation for inline members. - - INLINE_INFO = YES - - # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen - # will sort the (detailed) documentation of file and class members - # alphabetically by member name. If set to NO the members will appear in - # declaration order. - - SORT_MEMBER_DOCS = NO - - # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC - # tag is set to YES, then doxygen will reuse the documentation of the first - # member in the group (if any) for the other members of the group. By default - # all members of a group must be documented explicitly. - - #DISTRIBUTE_GROUP_DOC = NO - - # The TAB_SIZE tag can be used to set the number of spaces in a tab. - # Doxygen uses this value to replace tabs by spaces in code fragments. - - TAB_SIZE = 4 - - # The ENABLE_SECTIONS tag can be used to enable conditional - # documentation sections, marked by \if sectionname ... \endif. - - ENABLED_SECTIONS = - - # The GENERATE_TODOLIST tag can be used to enable (YES) or - # disable (NO) the todo list. This list is created by putting \todo - # commands in the documentation. - - GENERATE_TODOLIST = YES - - # The GENERATE_TESTLIST tag can be used to enable (YES) or - # disable (NO) the test list. This list is created by putting \test - # commands in the documentation. - - GENERATE_TESTLIST = YES - - # This tag can be used to specify a number of aliases that acts - # as commands in the documentation. An alias has the form "name=value". - # For example adding "sideeffect=\par Side Effects:\n" will allow you to - # put the command \sideeffect (or @sideeffect) in the documentation, which - # will result in a user defined paragraph with heading "Side Effects:". - # You can put \n's in the value part of an alias to insert newlines. - - #ALIASES = - - #--------------------------------------------------------------------------- - # configuration options related to warning and progress messages - #--------------------------------------------------------------------------- - - # The QUIET tag can be used to turn on/off the messages that are generated - # by doxygen. Possible values are YES and NO. If left blank NO is used. - - QUIET = YES - - # The WARNINGS tag can be used to turn on/off the warning messages that are - # generated by doxygen. Possible values are YES and NO. If left blank - # NO is used. - - ### pme Turned off; apparently doxygen can't grok templates - WARNINGS = NO - - # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings - # for undocumented members. If EXTRACT_ALL is set to YES then this flag will - # automatically be disabled. - - WARN_IF_UNDOCUMENTED = YES - - # The WARN_FORMAT tag determines the format of the warning messages that - # doxygen can produce. The string should contain the $file, $line, and $text - # tags, which will be replaced by the file and line number from which the - # warning originated and the warning text. - - WARN_FORMAT = "$file:$line: $text" - - # The WARN_LOGFILE tag can be used to specify a file to which warning - # and error messages should be written. If left blank the output is written - # to stderr. - - #WARN_LOGFILE = - - #--------------------------------------------------------------------------- - # configuration options related to the input files - #--------------------------------------------------------------------------- - - # The INPUT tag can be used to specify the files and/or directories that contain - # documented source files. You may enter file names like "myfile.cpp" or - # directories like "/usr/src/myproject". Separate the files or directories - # with spaces. - - INPUT = include src libmath libsupc++ libio config - - # If the value of the INPUT tag contains directories, you can use the - # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp - # and *.h) to filter out the source-files in the directories. If left - # blank all files are included. - - FILE_PATTERNS = *.cc *.h c++config - - # The RECURSIVE tag can be used to turn specify whether or not subdirectories - # should be searched for input files as well. Possible values are YES and NO. - # If left blank NO is used. - - RECURSIVE = YES - - # The EXCLUDE tag can be used to specify files and/or directories that should - # excluded from the INPUT source files. This way you can easily exclude a - # subdirectory from a directory tree whose root is specified with the INPUT tag. - EXCLUDE = - - # If the value of the INPUT tag contains directories, you can use the - # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude - # certain files from those directories. - - EXCLUDE_PATTERNS = - - # The EXAMPLE_PATH tag can be used to specify one or more files or - # directories that contain example code fragments that are included (see - # the \include command). - - EXAMPLE_PATH = - - # If the value of the EXAMPLE_PATH tag contains directories, you can use the - # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp - # and *.h) to filter out the source-files in the directories. If left - # blank all files are included. - - EXAMPLE_PATTERNS = - - # The IMAGE_PATH tag can be used to specify one or more files or - # directories that contain image that are included in the documentation (see - # the \image command). - - IMAGE_PATH = - - # The INPUT_FILTER tag can be used to specify a program that doxygen should - # invoke to filter for each input file. Doxygen will invoke the filter program - # by executing (via popen()) the command , where - # is the value of the INPUT_FILTER tag, and is the name of an - # input file. Doxygen will then use the output that the filter program writes - # to standard output. - - INPUT_FILTER = - - # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using - # INPUT_FILTER) will be used to filter the input files when producing source - # files to browse. - - #FILTER_SOURCE_FILES = NO - - #--------------------------------------------------------------------------- - # configuration options related to the alphabetical class index - #--------------------------------------------------------------------------- - - # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index - # of all compounds will be generated. Enable this if the project - # contains a lot of classes, structs, unions or interfaces. - - ALPHABETICAL_INDEX = YES - - # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then - # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns - # in which this list will be split (can be a number in the range [1..20]) - - COLS_IN_ALPHA_INDEX = 5 - - # In case all classes in a project start with a common prefix, all - # classes will be put under the same header in the alphabetical index. - # The IGNORE_PREFIX tag can be used to specify one or more prefixes that - # should be ignored while generating the index headers. - - IGNORE_PREFIX = - - #--------------------------------------------------------------------------- - # configuration options related to the HTML output - #--------------------------------------------------------------------------- - - # If the GENERATE_HTML tag is set to YES (the default) Doxygen will - # generate HTML output. - - GENERATE_HTML = YES - - # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. - # If a relative path is entered the value of OUTPUT_DIRECTORY will be - # put in front of it. If left blank `html' will be used as the default path. - - HTML_OUTPUT = html_maint - - # The HTML_HEADER tag can be used to specify a personal HTML header for - # each generated HTML page. If it is left blank doxygen will generate a - # standard header. - - HTML_HEADER = - - # The HTML_FOOTER tag can be used to specify a personal HTML footer for - # each generated HTML page. If it is left blank doxygen will generate a - # standard footer. - - HTML_FOOTER = - - # The HTML_STYLESHEET tag can be used to specify a user defined cascading - # style sheet that is used by each HTML page. It can be used to - # fine-tune the look of the HTML output. If the tag is left blank doxygen - # will generate a default style sheet - - HTML_STYLESHEET = - - # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, - # files or namespaces will be aligned in HTML using tables. If set to - # NO a bullet list will be used. - - HTML_ALIGN_MEMBERS = YES - - # If the GENERATE_HTMLHELP tag is set to YES, additional index files - # will be generated that can be used as input for tools like the - # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) - # of the generated HTML documentation. - - GENERATE_HTMLHELP = NO - - # The DISABLE_INDEX tag can be used to turn on/off the condensed index at - # top of each HTML page. The value NO (the default) enables the index and - # the value YES disables it. - - DISABLE_INDEX = NO - - # This tag can be used to set the number of enum values (range [1..20]) - # that doxygen will group on one line in the generated HTML documentation. - - #ENUM_VALUES_PER_LINE = 4 - - # If the GENERATE_TREEVIEW tag is set to YES, a side pannel will be - # generated containing a tree-like index structure (just like the one that - # is generated for HTML Help). For this to work a browser that supports - # JavaScript and frames is required (for instance Netscape 4.0+ - # or Internet explorer 4.0+). - - GENERATE_TREEVIEW = YES - - # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be - # used to set the initial width (in pixels) of the frame in which the tree - # is shown. - - #TREEVIEW_WIDTH = 250 - - #--------------------------------------------------------------------------- - # configuration options related to the LaTeX output - #--------------------------------------------------------------------------- - - # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will - # generate Latex output. - - GENERATE_LATEX = NO - - # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. - # If a relative path is entered the value of OUTPUT_DIRECTORY will be - # put in front of it. If left blank `latex' will be used as the default path. - - LATEX_OUTPUT = latex - - # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact - # LaTeX documents. This may be useful for small projects and may help to - # save some trees in general. - - COMPACT_LATEX = NO - - # The PAPER_TYPE tag can be used to set the paper type that is used - # by the printer. Possible values are: a4, a4wide, letter, legal and - # executive. If left blank a4wide will be used. - - PAPER_TYPE = letter - - # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX - # packages that should be included in the LaTeX output. - - EXTRA_PACKAGES = - - # The LATEX_HEADER tag can be used to specify a personal LaTeX header for - # the generated latex document. The header should contain everything until - # the first chapter. If it is left blank doxygen will generate a - # standard header. Notice: only use this tag if you know what you are doing! - - LATEX_HEADER = - - # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated - # is prepared for conversion to pdf (using ps2pdf). The pdf file will - # contain links (just like the HTML output) instead of page references - # This makes the output suitable for online browsing using a pdf viewer. - - PDF_HYPERLINKS = NO - - # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of - # plain latex in the generated Makefile. Set this option to YES to get a - # higher quality PDF documentation. - - USE_PDFLATEX = NO - - # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. - # command to the generated LaTeX files. This will instruct LaTeX to keep - # running if errors occur, instead of asking the user for help. - # This option is also used when generating formulas in HTML. - - LATEX_BATCHMODE = NO - - #--------------------------------------------------------------------------- - # configuration options related to the RTF output - #--------------------------------------------------------------------------- - - # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output - # The RTF output is optimised for Word 97 and may not look very pretty with - # other RTF readers or editors. - - GENERATE_RTF = NO - - # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. - # If a relative path is entered the value of OUTPUT_DIRECTORY will be - # put in front of it. If left blank `rtf' will be used as the default path. - - RTF_OUTPUT = rtf - - # If the COMPACT_RTF tag is set to YES Doxygen generates more compact - # RTF documents. This may be useful for small projects and may help to - # save some trees in general. - - COMPACT_RTF = NO - - # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated - # will contain hyperlink fields. The RTF file will - # contain links (just like the HTML output) instead of page references. - # This makes the output suitable for online browsing using a WORD or other. - # programs which support those fields. - # Note: wordpad (write) and others do not support links. - - RTF_HYPERLINKS = NO - - # Load stylesheet definitions from file. Syntax is similar to doxygen's - # config file, i.e. a series of assigments. You only have to provide - # replacements, missing definitions are set to their default value. - - RTF_STYLESHEET_FILE = - - #--------------------------------------------------------------------------- - # configuration options related to the man page output - #--------------------------------------------------------------------------- - - # If the GENERATE_MAN tag is set to YES (the default) Doxygen will - # generate man pages - - GENERATE_MAN = NO - - # The MAN_OUTPUT tag is used to specify where the man pages will be put. - # If a relative path is entered the value of OUTPUT_DIRECTORY will be - # put in front of it. If left blank `man' will be used as the default path. - - MAN_OUTPUT = man - - # The MAN_EXTENSION tag determines the extension that is added to - # the generated man pages (default is the subroutine's section .3) - - MAN_EXTENSION = .3 - - #--------------------------------------------------------------------------- - # Configuration options related to the preprocessor - #--------------------------------------------------------------------------- - - # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will - # evaluate all C-preprocessor directives found in the sources and include - # files. - - ENABLE_PREPROCESSING = YES - - # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro - # names in the source code. If set to NO (the default) only conditional - # compilation will be performed. Macro expansion can be done in a controlled - # way by setting EXPAND_ONLY_PREDEF to YES. - - MACRO_EXPANSION = NO - - # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES - # then the macro expansion is limited to the macros specified with the - # PREDEFINED and EXPAND_AS_PREDEFINED tags. - - EXPAND_ONLY_PREDEF = NO - - # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files - # in the INCLUDE_PATH (see below) will be search if a #include is found. - - SEARCH_INCLUDES = YES - - # The INCLUDE_PATH tag can be used to specify one or more directories that - # contain include files that are not input files but should be processed by - # the preprocessor. - - INCLUDE_PATH = - - # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard - # patterns (like *.h and *.hpp) to filter out the header-files in the - # directories. If left blank, the patterns specified with FILE_PATTERNS will - # be used. - - INCLUDE_FILE_PATTERNS = - - # The PREDEFINED tag can be used to specify one or more macro names that - # are defined before the preprocessor is started (similar to the -D option of - # gcc). The argument of the tag is a list of macros of the form: name - # or name=definition (no spaces). If the definition and the = are - # omitted =1 is assumed. - - PREDEFINED = - - # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then - # this tag can be used to specify a list of macro names that should be expanded. - # The macro definition that is found in the sources will be used. - # Use the PREDEFINED tag if you want to use a different macro definition. - - EXPAND_AS_DEFINED = - - #--------------------------------------------------------------------------- - # Configuration::addtions related to external references - #--------------------------------------------------------------------------- - - # The TAGFILES tag can be used to specify one or more tagfiles. - - TAGFILES = - - # When a file name is specified after GENERATE_TAGFILE, doxygen will create - # a tag file that is based on the input files it reads. - - GENERATE_TAGFILE = - - # If the ALLEXTERNALS tag is set to YES all external classes will be listed - # in the class index. If set to NO only the inherited external classes - # will be listed. - - ALLEXTERNALS = YES - - # The PERL_PATH should be the absolute path and name of the perl script - # interpreter (i.e. the result of `which perl'). - - PERL_PATH = /usr/bin/perl - - #--------------------------------------------------------------------------- - # Configuration options related to the dot tool - #--------------------------------------------------------------------------- - - # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is - # available from the path. This tool is part of Graphviz, a graph visualization - # toolkit from AT&T and Lucent Bell Labs. The other options in this section - # have no effect if this option is set to NO (the default) - - HAVE_DOT = NO - - # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen - # will generate a graph for each documented class showing the direct and - # indirect inheritance relations. Setting this tag to YES will force the - # the CLASS_DIAGRAMS tag to NO. - - CLASS_GRAPH = YES - - # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen - # will generate a graph for each documented class showing the direct and - # indirect implementation dependencies (inheritance, containment, and - # class references variables) of the class with other documented classes. - - COLLABORATION_GRAPH = YES - - # If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to - # YES then doxygen will generate a graph for each documented file showing - # the direct and indirect include dependencies of the file with other - # documented files. - - INCLUDE_GRAPH = YES - - # If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to - # YES then doxygen will generate a graph for each documented header file showing - # the documented files that directly or indirectly include this file - - INCLUDED_BY_GRAPH = YES - - # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen - # will graphical hierarchy of all classes instead of a textual one. - - GRAPHICAL_HIERARCHY = YES - - # The tag DOT_PATH can be used to specify the path where the dot tool can be - # found. If left blank, it is assumed the dot tool can be found on the path. - - DOT_PATH = - - # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width - # (in pixels) of the graphs generated by dot. If a graph becomes larger than - # this value, doxygen will try to truncate the graph, so that it fits within - # the specified constraint. Beware that most browsers cannot cope with very - # large images. - - MAX_DOT_GRAPH_WIDTH = 1024 - - # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height - # (in pixels) of the graphs generated by dot. If a graph becomes larger than - # this value, doxygen will try to truncate the graph, so that it fits within - # the specified constraint. Beware that most browsers cannot cope with very - # large images. - - MAX_DOT_GRAPH_HEIGHT = 1024 - - # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will - # generate a legend page explaining the meaning of the various boxes and - # arrows in the dot generated graphs. - - #GENERATE_LEGEND = YES - - #--------------------------------------------------------------------------- - # Configuration::addtions related to the search engine - #--------------------------------------------------------------------------- - - # The SEARCHENGINE tag specifies whether or not a search engine should be - # used. If set to NO the values of all tags below this one will be ignored. - - SEARCHENGINE = NO - - # The CGI_NAME tag should be the name of the CGI script that - # starts the search engine (doxysearch) with the correct parameters. - # A script with this name will be generated by doxygen. - - CGI_NAME = search.cgi - - # The CGI_URL tag should be the absolute URL to the directory where the - # cgi binaries are located. See the documentation of your http daemon for - # details. - - CGI_URL = - - # The DOC_URL tag should be the absolute URL to the directory where the - # documentation is located. If left blank the absolute path to the - # documentation, with file:// prepended to it, will be used. - - DOC_URL = - - # The DOC_ABSPATH tag should be the absolute path to the directory where the - # documentation is located. If left blank the directory on the local machine - # will be used. - - DOC_ABSPATH = - - # The BIN_ABSPATH tag must point to the directory where the doxysearch binary - # is installed. - - BIN_ABSPATH = /usr/local/bin/ - - # The EXT_DOC_PATHS tag can be used to specify one or more paths to - # documentation generated for other projects. This allows doxysearch to search - # the documentation for these projects as well. - - EXT_DOC_PATHS = - - - # End of file - --- 0 ---- diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/run_doxygen gcc-3.1/libstdc++-v3/docs/doxygen/run_doxygen *** gcc-3.0.4/libstdc++-v3/docs/doxygen/run_doxygen Wed Jul 11 19:37:57 2001 --- gcc-3.1/libstdc++-v3/docs/doxygen/run_doxygen Thu Apr 18 01:45:44 2002 *************** *** 1,15 **** #!/bin/sh ! # Runs doxygen. Possibly will massage the output files. # ! # Synopsis: run_doxygen --mode=[user|maint] v3srcdir v3builddir # ! # Originally hacked together by Phil Edwards ! # $Id: run_doxygen,v 1.1.4.3 2001/07/11 19:37:57 pme Exp $ # We can check now that the version of doxygen is >= this variable. ! DOXYVER=1.2.6 doxygen= find_doxygen() { --- 1,15 ---- #!/bin/sh ! # Runs doxygen and massages the output files. ! # Copyright (C) 2001, 2002 Free Software Foundation, Inc. # ! # Synopsis: run_doxygen --mode=[user|maint|man] v3srcdir v3builddir # ! # Originally hacked together by Phil Edwards # We can check now that the version of doxygen is >= this variable. ! DOXYVER=1.2.15 doxygen= find_doxygen() { *************** find_doxygen() { *** 40,50 **** print_usage() { cat 1>&2 <] MODE is one of: ! maint Generate maintainers' documentation (lots more; exposes non-public members, etc). ! user Generate user-level library documentation. more options when i think of them --- 40,51 ---- print_usage() { cat 1>&2 <] MODE is one of: ! user Generate user-level HTML library documentation. ! maint Generate maintainers' HTML documentation (lots more; exposes non-public members, etc). ! man Generate user-level man pages. more options when i think of them *************** parse_options() { *** 70,88 **** mode=$arg ;; --mode | --help | -h) print_usage ;; - --version | -v) - # Aw, that's so cuuuute... don't ask, I needed it. - blank= - Id=is - echo You expect this dinky script to track a version? Okay, here - echo it $Id: run_doxygen,v 1.1.4.3 2001/07/11 19:37:57 pme Exp $blank - exit 0 - ;; *) # this turned out to be a mess, maybe change to --srcdir=, etc if test $srcdir = unset; then srcdir=$o elif test $outdir = unset; then outdir=${o}/docs/doxygen else echo run_doxygen error: Too many arguments 1>&2 --- 71,82 ---- mode=$arg ;; --mode | --help | -h) print_usage ;; *) # this turned out to be a mess, maybe change to --srcdir=, etc if test $srcdir = unset; then srcdir=$o elif test $outdir = unset; then + builddir=${o} outdir=${o}/docs/doxygen else echo run_doxygen error: Too many arguments 1>&2 *************** parse_options() { *** 98,103 **** --- 92,101 ---- mode=unset srcdir=unset outdir=unset + do_html=no + do_man=no + enabled_sections= + DATEtext=`date '+%Y-%m-%d'` parse_options $* find_doxygen *************** if test $srcdir = unset || test $outdir *** 109,140 **** fi case x"$mode" in ! xuser | xmaint) ;; # ochen khorosho *) echo run_doxygen error: $mode is an invalid mode 1>&2 exit 1 ;; esac ! rm -rf $outdir mkdir -p $outdir chmod u+w $outdir ( set -e ! cd $srcdir sed -e "s=@outdir@=${outdir}=" \ -e "s=@srcdir@=${srcdir}=" \ ! docs/doxygen/${mode}.cfg.in > ${outdir}/${mode}.cfg echo :: NOTE that this may take some time... echo $doxygen ${outdir}/${mode}.cfg $doxygen ${outdir}/${mode}.cfg echo :: Finished, exit code was $? ) ! # mess with output files here? echo :: ! echo :: Doxygen output begins with ! echo :: ${outdir}/html_${mode}/index.html echo :: exit 0 --- 107,239 ---- fi case x"$mode" in ! xuser) do_html=yes ! LEVELtext='User' ! ;; ! xmaint) do_html=yes ! enabled_sections=maint ! LEVELtext='Maintainer' ! ;; ! xman) do_man=yes ! ;; *) echo run_doxygen error: $mode is an invalid mode 1>&2 exit 1 ;; esac ! #rm -rf $outdir mkdir -p $outdir chmod u+w $outdir + + # work around a stupid doxygen bug + test $do_man = yes && { + mkdir -p $outdir/man/man3/ext + chmod -R u+w $outdir/man/man3/ext + } + + set -e ( set -e ! cd $builddir sed -e "s=@outdir@=${outdir}=" \ -e "s=@srcdir@=${srcdir}=" \ ! -e "s=@html_output_dir@=html_${mode}=" \ ! -e "s=@enabled_sections@=${enabled_sections}=" \ ! -e "s=@do_html@=${do_html}=" \ ! -e "s=@do_man@=${do_man}=" \ ! ${srcdir}/docs/doxygen/user.cfg.in > ${outdir}/${mode}.cfg echo :: NOTE that this may take some time... echo $doxygen ${outdir}/${mode}.cfg $doxygen ${outdir}/${mode}.cfg echo :: Finished, exit code was $? ) + set +e ! test $do_html = yes && { ! sed -e "s=@LEVEL@=${LEVELtext}=" \ ! -e "s=@DATE@=${DATEtext}=" \ ! ${srcdir}/docs/doxygen/mainpage.html > ${outdir}/html_${mode}/index.html ! cp ${srcdir}/docs/doxygen/tables.html ${outdir}/html_${mode}/tables.html ! echo :: ! echo :: HTML pages begin with ! echo :: ${outdir}/html_${mode}/index.html ! } + # Mess with the man pages. We don't need documentation of the internal + # headers, since the man pages for those contain nothing useful anyhow. The + # man pages for doxygen modules need to be renamed (or deleted). And the + # generated #include lines need to be changed from the internal names to the + # standard ones (e.g., "#include " -> "#include "). + test $do_man = yes && { echo :: ! echo :: Fixing up the man pages... ! cd $outdir/man/man3 ! ! # here's the other end of the "stupid doxygen bug" mentioned above ! rm -rf ext ! ! # File names with embedded spaces (EVIL!) need to be....? renamed or removed? ! find . -name "* *" -print0 | xargs -0 rm # requires GNU tools ! ! # can leave SGIextensions.3 alone, it's an okay name ! mv s20_3_1_base.3 Intro_functors.3 ! mv s20_3_2_arithmetic.3 Arithmetic_functors.3 ! mv s20_3_3_comparisons.3 Comparison_functors.3 ! mv s20_3_4_logical.3 Logical_functors.3 ! mv s20_3_5_negators.3 Negation_functors.3 ! mv s20_3_6_binder.3 Binder_functors.3 ! mv s20_3_7_adaptors.3 Func_ptr_functors.3 ! mv s20_3_8_memadaptors.3 Member_ptr_functors.3 ! mv std.3 Namespace_Std.3 ! mv iterator_tags.3 Iterator_types.3 ! ! # man pages are for functions/types/other entities, not source files ! # directly. who the heck would type "man foo.h" anyhow? ! find . -name "[a-z]*" -a ! -name "std_*" -print | xargs rm ! rm -f *.h.3 *config* *.cc.3 *.tcc.3 ! rm -f *_t.3 # workaround doxygen template parsing bug for now ! # this is used to examine what we would have deleted, for debugging ! #mkdir trash ! #find . -name "[a-z]*" -a ! -name "std_*" -print | xargs -i mv {} trash ! #mv *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 trash ! ! # Standardize the displayed header names. If anyone who knows perl cares ! # enough to rewrite all this, feel free. This only gets run once a century, ! # and I'm off getting coffee then anyhow, so I didn't care enough to make ! # this super-fast. ! g++ ${srcdir}/docs/doxygen/stdheader.cc -o ./stdheader ! problematic=`egrep -l '#include <.*_.*>' [a-z]*.3` ! for f in $problematic; do ! # this is also slow, but safe and easy to debug ! oldh=`sed -n '/#include .*/\1/p' $f` ! newh=`echo $oldh | ./stdheader` ! sed "s=${oldh}=${newh}=" $f > TEMP ! mv TEMP $f ! done ! rm stdheader ! ! # Some of the pages for generated modules have text that confuses certain ! # implementations of man(1), e.g., Linux's. We need to have another top-level ! # *roff tag to /stop/ the .SH NAME entry. ! #problematic=`egrep --files-without-match '^\.SH SYNOPSIS' [A-Z]*.3` ! problematic='Containers.3 Sequences.3 Assoc_containers.3 Allocators.3' ! for f in $problematic; do ! sed '/^\.SH NAME/{ ! n ! a\ ! \ ! .SH SYNOPSIS ! }' $f > TEMP ! mv TEMP $f ! done ! ! cp ${srcdir}/docs/doxygen/Intro.3 . ! ! echo :: ! echo :: Man pages in ${outdir}/man ! } ! ! # all done echo :: exit 0 diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/stdheader.cc gcc-3.1/libstdc++-v3/docs/doxygen/stdheader.cc *** gcc-3.0.4/libstdc++-v3/docs/doxygen/stdheader.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libstdc++-v3/docs/doxygen/stdheader.cc Thu Sep 27 22:44:24 2001 *************** *** 0 **** --- 1,146 ---- + // This is a slow larval-stage kludge to help massage the generated man + // pages. It's used like this: + const char* const usage = + "\nTakes on stdin, whitespace-separated words of the form\n" + "\n" + " [bits/]stl_foo.h\n" + " [bits/]std_foo.h\n" + "\n" + "and writes on stdout the nearest matching standard header name.\n" + "\n" + "Takes no command-line arguments.\n" + "\n"; + + #include + #include + #include + + typedef std::map Map; + + Map headers; + + void init_map() + { + // Enter the glamourous world of data entry!! Maintain these! + headers["algo.h"] = "algorithm"; + headers["algobase.h"] = "algorithm"; + headers["algorithm.h"] = "algorithm"; + headers["alloc.h"] = "memory"; + headers["basic_ios.h"] = "ios"; + headers["basic_ios.tcc"] = "ios"; + headers["basic_string.h"] = "string"; + headers["basic_string.tcc"] = "string"; + headers["bitset.h"] = "bitset"; + headers["bvector.h"] = "vector"; + //headers["char_traits.h"] uhhhhhh + headers["complex.h"] = "complex"; + //headers["construct.h"] stl_construct.h entirely internal + headers["deque.h"] = "deque"; + headers["fstream.h"] = "fstream"; + headers["fstream.tcc"] = "fstream"; + headers["function.h"] = "functional"; + headers["functional.h"] = "functional"; + headers["heap.h"] = "algorithm"; + headers["iomanip.h"] = "iomanip"; + headers["ios.h"] = "ios"; + headers["iosfwd.h"] = "iosfwd"; + headers["iostream.h"] = "iostream"; + headers["istream.h"] = "istream"; + headers["istream.tcc"] = "istream"; + headers["iterator.h"] = "iterator"; + headers["iterator_base_funcs.h"] = "iterator"; + headers["iterator_base_types.h"] = "iterator"; + headers["limits.h"] = "limits"; + headers["list.h"] = "list"; + headers["locale.h"] = "locale"; + headers["locale_facets.h"] = "locale"; + headers["locale_facets.tcc"] = "locale"; + headers["map.h"] = "map"; + headers["memory.h"] = "memory"; + headers["multimap.h"] = "map"; + headers["multiset.h"] = "set"; + headers["numeric.h"] = "numeric"; + headers["ostream.h"] = "ostream"; + headers["ostream.tcc"] = "ostream"; + headers["pair.h"] = "utility"; + //headers["pthread_alloc.h"] who knows + headers["queue.h"] = "queue"; + headers["raw_storage_iter.h"] = "memory"; + headers["relops.h"] = "utility"; + headers["set.h"] = "set"; + headers["sstream.h"] = "sstream"; + headers["sstream.tcc"] = "sstream"; + headers["stack.h"] = "stack"; + headers["stdexcept.h"] = "stdexcept"; + headers["streambuf.h"] = "streambuf"; + headers["streambuf.tcc"] = "streambuf"; + headers["string.h"] = "string"; + headers["tempbuf.h"] = "memory"; + //headers["threads.h"] who knows + headers["tree.h"] = "backward/tree.h"; + headers["uninitialized.h"] = "memory"; + headers["utility.h"] = "utility"; + headers["valarray.h"] = "valarray"; + headers["valarray_array.h"] = "valarray"; + headers["valarray_array.tcc"] = "valarray"; + headers["valarray_meta.h"] = "valarray"; + headers["vector.h"] = "vector"; + + // C wrappers -- probably was an easier way to do these, but oh well + headers["cassert.h"] = "cassert"; + headers["cctype.h"] = "cctype"; + headers["cerrno.h"] = "cerrno"; + headers["cfloat.h"] = "cfloat"; + headers["climits.h"] = "climits"; + headers["clocale.h"] = "clocale"; + headers["cmath.h"] = "cmath"; + headers["csetjmp.h"] = "csetjmp"; + headers["csignal.h"] = "csignal"; + headers["cstdarg.h"] = "cstdarg"; + headers["cstddef.h"] = "cstddef"; + headers["cstdio.h"] = "cstdio"; + headers["cstdlib.h"] = "cstdlib"; + headers["cstring.h"] = "cstring"; + headers["ctime.h"] = "ctime"; + headers["cwchar.h"] = "cwchar"; + headers["cwctype.h"] = "cwctype"; + } + + + void do_word (std::string const& longheader) + { + std::string::size_type start = 0; + + if (longheader.substr(start,5) == "bits/") start += 5; + if ((longheader.substr(start,4) == "stl_") || + (longheader.substr(start,4) == "std_")) + { + start += 4; + } + + // come on, gdb, find `p' already... + const char* p = longheader.substr(start).c_str(); + Map::iterator word = headers.find(p); + if (word != headers.end()) + std::cout << word->second << '\n'; + else std::cout << "MAYBE_AN_ERROR_MESSAGE_HERE\n"; + } + + + int main (int argc, char**) + { + if (argc > 1) + { + std::cerr << usage; + exit(0); + } + + init_map(); + + std::string w; + while (std::cin >> w) + do_word (w); + } + + // vim:ts=4:et: + diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/style.css gcc-3.1/libstdc++-v3/docs/doxygen/style.css *** gcc-3.0.4/libstdc++-v3/docs/doxygen/style.css Mon May 14 19:48:55 2001 --- gcc-3.1/libstdc++-v3/docs/doxygen/style.css Tue Feb 5 00:14:35 2002 *************** A.el { text-decoration: none; font-weigh *** 5,16 **** A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } DL.el { margin-left: -1cm } DIV.fragment { width: 100%; border: none; background-color: #eeeeee } ! DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } ! TD.md { background-color: #f2f2ff } ! DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold } ! DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller } FONT.keyword { color: #008000 } FONT.keywordtype { color: #604020 } FONT.keywordflow { color: #e08000 } --- 5,19 ---- A.elRef { font-weight: bold } A.code { text-decoration: none; font-weight: normal; color: #4444ee } A.codeRef { font-weight: normal; color: #4444ee } + A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } DIV.fragment { width: 100%; border: none; background-color: #eeeeee } ! DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } ! TD.md { background-color: #f2f2ff; font-weight: bold; } ! TD.mdname1 { background-color: #f2f2ff; font-weight: bold; font-style: italic; } ! TD.mdname { background-color: #f2f2ff; font-weight: bold; font-style: italic; width: 600px; } ! DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } ! DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } FONT.keyword { color: #008000 } FONT.keywordtype { color: #604020 } FONT.keywordflow { color: #e08000 } *************** FONT.comment { color: #800000 } *** 18,20 **** --- 21,24 ---- FONT.preprocessor { color: #806020 } FONT.stringliteral { color: #002080 } FONT.charliteral { color: #008080 } + .smallertext { font-size: smaller } diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/tables.html gcc-3.1/libstdc++-v3/docs/doxygen/tables.html *** gcc-3.0.4/libstdc++-v3/docs/doxygen/tables.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/libstdc++-v3/docs/doxygen/tables.html Wed Mar 27 22:38:36 2002 *************** *** 0 **** --- 1,630 ---- + + + + Tables + + + + + +

Tables

+ +

Most of the requirements on containers are presented in the ISO standard + in the form of tables. In order to avoid massive duplication of effort + while documenting all the classes, we follow the standard's lead and + present the base information here. Individual classes will only document + their departures from these tables (removed functions, additional functions, + changes, etc). +

+ +

We will not try to duplicate all of the surrounding text (footnotes, + explanations, etc) from the standard, because that would also entail a + duplication of effort. Some of the surrounding text has been paraphrased + here for clarity. If you are uncertain about the meaning or interpretation + of these notes, consult a good textbook, and/or purchase your own copy of + the standard (it's cheap, see our FAQ). +

+ +

The table numbers are the same as those used in the standard. Tables can + be jumped to using their number, e.g., "tables.html#67". Only + Tables 65 through 69 are presented. Some of the active Defect Reports + are also noted or incorporated. +

+ +

This will probably be incomplete for a while because + filling out the tables is mind-frothingly boring. Also, the HTML table + rendering is ugly. (Update: mozilla 0.9.9 looks MUCH better.)

+ +
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 65 --- Container Requirements

+ Anything calling itself a container must meet these minimum requirements. +
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::value_typeTT is Assignablecompile time
X::referencelvalue of T compile time
X::const_referenceconst lvalue of T compile time
X::iteratoriterator type pointing to TAny iterator category except output iterator. + Convertible to X::const_iterator.compile time
X::const_iteratoriterator type pointing to const TAny iterator category except output iterator.compile time
X::difference_typesigned integral typeidentical to the difference type of X::iterator and X::const_iteratorcompile time
X::size_typeunsigned integral typesize_type can represent any non-negative value of difference_typecompile time
X u; post: u.size() == 0constant
X(); X().size == 0constant
X(a); a == X(a)linear
X u(a);
X u = a;
 post: u == a. Equivalent to: X u; u = a;linear
(&a)->~X();voiddtor is applied to every element of a; all the memory is deallocatedlinear
a.begin()iterator; const_iterator for constant a constant
a.end()iterator; const_iterator for constant a constant
a == bconvertible to bool== is an equivalence relation. a.size()==b.size() && + equal(a.begin(),a.end(),b.begin())linear
a != bconvertible to boolequivalent to !(a==b)linear
a.swap(b)voidswap(a,b)may or may not have constant complexity
r = aX&r == alinear
a.size()size_type may or may not have constant complexity
a.max_size()size_type may or may not have constant complexity
a.empty()convertible to bool constant
a < bconvertible to boolpre: < is defined for T and is a total ordering relationlinear
a > bconvertible to bool linear
a <= bconvertible to bool linear
a >= bconvertible to bool linear

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 66 --- Reversible Container Requirements

+ If a container's iterator is bidirectional or random-access, then the + container also meets these requirements. + Deque, list, vector, map, multimap, set, and multiset are such containers. +
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::reverse_iteratoriterator type pointing to Treverse_iterator<iterator>compile time
X::const_reverse_iteratoriterator type pointing to const Treverse_iterator<const_iterator>compile time
a.rbegin()reverse_iterator; const_reverse_iterator for constant areverse_iterator(end())constant
a.rend()reverse_iterator; const_reverse_iterator for constant areverse_iterator(begin())constant

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 67 --- Sequence Requirements

+ These are in addition to the requirements of containers. + Deque, list, and vector are such containers. +
expressionresult typenotes, pre-/post-conditions, assertions
X(n,t)
X a(n,t)
 constructs a sequence with n copies of t
post: size() == n
X(i,j)
X a(i,j)
 constructs a sequence equal to the range [i,j)
+ post: size() == distance(i,j)
a.insert(p,t)iterator (points to the inserted copy of t)inserts a copy of t before p
a.insert(p,n,t)voidinserts n copies of t before p
a.insert(p,i,j)voidinserts copies of elements in [i,j) before p
+ pre: i, j are not iterators into a
a.erase(q)iterator (points to the element following q (prior to erasure))erases the element pointed to by q
a.erase(q1,q1)iterator (points to the element pointed to by q2 (prior to erasure))erases the elements in the range [q1,q2)
a.clear()voiderase(begin(),end())
post: size() == 0

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 68 --- Optional Sequence Operations

+ These operations are only included in containers when the operation can be + done in constant time. +
expressionresult typeoperational semanticscontainer
a.front()reference; const_reference for constant a*a.begin()vector, list, deque
a.back()reference; const_reference for constant a*--a.end()vector, list, deque
a.push_front(x)voida.insert(a.begin(),x)list, deque
a.push_back(x)voida.insert(a.end(),x)vector, list, deque
a.pop_front()voida.erase(a.begin())list, deque
a.pop_back()voida.erase(--a.end())vector, list, deque
a[n]reference; const_reference for constant a*(a.begin() + n)vector, deque
a.at(n)reference; const_reference for constant a*(a.begin() + n)
throws out_of_range if n>=a.size()
vector, deque

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 69 --- Associative Container Requirements

+ These are in addition to the requirements of containers. + Map, multimap, set, and multiset are such containers. An associative + container supports unique keys (and is written as + a_uniq instead of a) if it may contain at most + one element for each key. Otherwise it supports equivalent keys + (and is written a_eq). Examples of the former are set and map, + examples of the latter are multiset and multimap. +
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::key_typeKeyKey is Assignablecompile time
X::key_compareComparedefaults to less<key_type>compile time
X::value_comparea binary predicate typesame as key_compare for set and multiset; an ordering relation on + pairs induced by the first component (Key) for map and multimapcompile time
X(c)
X a(c)
 constructs an empty container which uses c as a comparison objectconstant
X()
X a
 constructs an empty container using Compare() as a comparison objectconstant
X(i,j,c)
X a(i,j,c)
 constructs an empty container and inserts elements from the range [i,j) + into it; uses c as a comparison objectNlogN in general where N is distance(i,j); linear if [i,j) is + sorted with value_comp()
X(i,j)
X a(i,j)
 same as previous, but uses Compare() as a comparison objectsame as previous
a.key_comp()X::key_comparereturns the comparison object out of which a was constructedconstant
a.value_comp()X::value_comparereturns an object constructed out of the comparison objectconstant
a_uniq.insert(t)pair<iterator,bool>"Inserts t if and only if there is no element in the container with + key equivalent to the key of t. The bool component of the returned pair + is true -iff- the insertion took place, and the iterator component of + the pair points to the element with key equivalent to the key of + t." logarithmic
a_eq.insert(t)iteratorinserts t, returns the iterator pointing to the inserted elementlogarithmic
a.insert(p,t)iteratorpossibly inserts t (depending on whether a_uniq or a_eq); returns iterator + pointing to the element with key equivalent to the key of t; iterator p + is a hint pointing to where the insert should start to searchlogarithmic in general, amortized constant if t is inserted right + after p
+ [but see DR 233 and our + specific notes]
a.insert(i,j)voidpre: i, j are not iterators into a. possibly inserts each element from + the range [i,j) (depending on whether a_uniq or a_eq)Nlog(size()+N) where N is distance(i,j) in general
a.erase(k)size_typeerases all elements with key equivalent to k; returns number of erased + elementslog(size()) + count(k)
a.erase(q)voiderases the element pointed to by qamortized constant
a.erase(q1,q2)voiderases all the elements in the range [q1,q2)log(size()) + distance(q1,q2)
a.clear()voiderases everthing; post: size() == 0linear
a.find(k)iterator; const_iterator for constant areturns iterator pointing to element with key equivalent to k, or + a.end() if no such element foundlogarithmic
a.count(k)size_typereturns number of elements with key equivalent to klog(size()) + count(k)
a.lower_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key not less than klogarithmic
a.upper_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key greater than klogarithmic
a.equal_range(k)pair<iterator,iterator>; + pair<const_iterator, const_iterator> for constant aequivalent to make_pair(a.lower_bound(k), a.upper_bound(k))logarithmic

+ + +
+

+ See mainpage.html for copying conditions. + See the libstdc++-v3 homepage + for more information. +

+ + + + + diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/doxygen/user.cfg.in gcc-3.1/libstdc++-v3/docs/doxygen/user.cfg.in *** gcc-3.0.4/libstdc++-v3/docs/doxygen/user.cfg.in Wed Jul 11 19:37:57 2001 --- gcc-3.1/libstdc++-v3/docs/doxygen/user.cfg.in Thu Apr 18 01:45:44 2002 *************** *** 1,6 **** ! # Doxyfile 1.2.6 ! # This file describes the settings to be used by doxygen for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: --- 1,7 ---- ! # Doxyfile 1.2.12 ! # This file describes the settings to be used by the documentation system ! # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: *************** *** 9,24 **** # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") ! ### When doxygen is run, the current directory is the top of ! ### the libstdc++-v3 source directory. Keep this in mind while ! ### writing relative-path directories. #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded ! # by quotes) that should identify the project. PROJECT_NAME = "libstdc++-v3 Source" --- 10,28 ---- # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") ! ### When doxygen is run, the current directory is the top of the ! ### libstdc++-v3 build directory. Keep this in mind while writing ! ### relative-path directories. ! ### ! ### Currently this is not really run through autoconf; it just looks that way. ! #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded ! # by quotes) that should identify the project. PROJECT_NAME = "libstdc++-v3 Source" *************** PROJECT_NUMBER = *** 32,65 **** # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. ! ### Currently this is not really run through autoconf; it just looks that way. OUTPUT_DIRECTORY = @outdir@ # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: ! # Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, ! # Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, ! # Polish, Portuguese and Slovene. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless ! # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES ! #EXTRACT_ALL = NO ! EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class ! # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file ! # will be included in the documentation. EXTRACT_STATIC = YES --- 36,68 ---- # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. ! OUTPUT_DIRECTORY = @outdir@ # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: ! # Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, ! # German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, ! # Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless ! # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES ! EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class ! # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file ! # will be included in the documentation. EXTRACT_STATIC = YES *************** EXTRACT_STATIC = YES *** 67,106 **** # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. ! # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various ! # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). ! # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the ! # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief ! # description. ! ALWAYS_DETAILED_SEC = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set ! # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO --- 70,109 ---- # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. ! # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various ! # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). ! # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the ! # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief ! # description. ! ALWAYS_DETAILED_SEC = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set ! # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO *************** STRIP_FROM_PATH = *** 114,142 **** # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. ! # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO - # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will - # generate a class diagram (in Html and LaTeX) for classes with base or - # super classes. Setting the tag to NO turns the diagrams off. - - CLASS_DIAGRAMS = YES - - # If the SOURCE_BROWSER tag is set to YES then a list of source files will - # be generated. Documented entities will be cross-referenced with these sources. - - SOURCE_BROWSER = YES - - # Setting the INLINE_SOURCES tag to YES will include the body - # of functions and classes directly in the documentation. - - INLINE_SOURCES = NO - # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code ! # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES --- 117,129 ---- # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. ! # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code ! # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES *************** STRIP_CODE_COMMENTS = YES *** 148,168 **** CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the ! # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for ! # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation ! # of that file. SHOW_INCLUDE_FILES = YES --- 135,161 ---- CASE_SENSE_NAMES = NO + # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter + # (but less readable) file names. This can be useful is your file systems + # doesn't support long names like on DOS, Mac, or CD-ROM. + + SHORT_NAMES = NO + # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the ! # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for ! # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation ! # of that file. SHOW_INCLUDE_FILES = YES *************** SHOW_INCLUDE_FILES = YES *** 170,194 **** # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an ! # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it ! # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] ! # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in ! # declaration order. SORT_MEMBER_DOCS = YES --- 163,187 ---- # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an ! # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it ! # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] ! # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in ! # declaration order. SORT_MEMBER_DOCS = YES *************** SORT_MEMBER_DOCS = YES *** 200,219 **** DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. ! # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 - # The ENABLE_SECTIONS tag can be used to enable conditional - # documentation sections, marked by \if sectionname ... \endif. - - ENABLED_SECTIONS = - # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. ! GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test --- 193,207 ---- DISTRIBUTE_GROUP_DOC = YES # The TAB_SIZE tag can be used to set the number of spaces in a tab. ! # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. ! GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test *************** GENERATE_BUGLIST = YES *** 232,240 **** # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". ! # You can put \n's in the value part of an alias to insert newlines. ! ALIASES = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consist of for it to appear in --- 220,233 ---- # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". ! # You can put \n's in the value part of an alias to insert newlines. ! ALIASES = "doctodo=@todo\nDoc me! See docs/doxygen/TODO and http://gcc.gnu.org/ml/libstdc++/2002-02/msg00003.html for more." ! ! # The ENABLED_SECTIONS tag can be used to enable conditional ! # documentation sections, marked by \if sectionname ... \endif. ! ! ENABLED_SECTIONS = @enabled_sections@ # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consist of for it to appear in *************** ALIASES = *** 242,261 **** # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer ! # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 ! # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance some of the names that are used will be different. The list ! # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the ! # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES --- 235,254 ---- # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer ! # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 ! # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance some of the names that are used will be different. The list ! # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the ! # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES *************** SHOW_USED_FILES = YES *** 264,295 **** #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated ! # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank ! # NO is used. WARNINGS = NO # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will ! # automatically be disabled. ! WARN_IF_UNDOCUMENTED = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the ! # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written ! # to stderr. WARN_LOGFILE = --- 257,288 ---- #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated ! # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank ! # NO is used. WARNINGS = NO # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will ! # automatically be disabled. ! WARN_IF_UNDOCUMENTED = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the ! # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written ! # to stderr. WARN_LOGFILE = *************** WARN_LOGFILE = *** 297,373 **** # configuration options related to the input files #--------------------------------------------------------------------------- ! # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories ! # with spaces. - INPUT = docs/doxygen \ - libsupc++ \ - include \ - src \ - libsupc++/exception libsupc++/new libsupc++/typeinfo include/ext/hash_map \ - include/ext/hash_set include/ext/rope include/ext/slist include/std/algorithm \ - include/std/bitset include/std/cassert include/std/cctype \ - include/std/cerrno include/std/cfloat include/std/ciso646 include/std/climits \ - include/std/clocale include/std/cmath include/std/complex include/std/csetjmp \ - include/std/csignal include/std/cstdarg include/std/cstddef \ - include/std/cstdio include/std/cstdlib include/std/cstring \ - include/std/ctime include/std/cwchar include/std/cwctype include/std/deque \ - include/std/fstream include/std/functional include/std/iomanip \ - include/std/ios include/std/iosfwd include/std/iostream include/std/istream \ - include/std/iterator include/std/limits include/std/list include/std/locale \ - include/std/map include/std/memory include/std/numeric include/std/ostream \ - include/std/queue include/std/set include/std/sstream include/std/stack \ - include/std/stdexcept include/std/streambuf include/std/string \ - include/std/utility include/std/valarray include/std/vector # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left ! # blank all files are included. ! FILE_PATTERNS = *.doxy \ ! *.cc \ ! *.tcc \ ! *.h \ ! c++config # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. ! # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a ! # subdirectory from a directory tree whose root is specified with the INPUT tag. ! EXCLUDE = include/c \ ! include/c_shadow # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude ! # certain files from those directories. ! EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see ! # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left ! # blank all files are included. EXAMPLE_PATTERNS = # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see ! # the \image command). IMAGE_PATH = --- 290,360 ---- # configuration options related to the input files #--------------------------------------------------------------------------- ! # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories ! # with spaces. ! ! INPUT = @srcdir@/docs/doxygen/doxygroups.cc \ ! @srcdir@/src \ ! @srcdir@/libsupc++/exception \ ! @srcdir@/libsupc++/new \ ! @srcdir@/libsupc++/typeinfo \ ! include ! # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left ! # blank file matching one of the following patterns are included: ! # *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp ! # *.h++ *.idl ! FILE_PATTERNS = * # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. ! # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a ! # subdirectory from a directory tree whose root is specified with the INPUT tag. ! EXCLUDE = Makefile # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude ! # certain files from those directories. ! EXCLUDE_PATTERNS = CVS \ ! stamp-* # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see ! # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left ! # blank all files are included. EXAMPLE_PATTERNS = + # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be + # searched for input files to be used with the \include or \dontinclude + # commands irrespective of the value of the RECURSIVE tag. + # Possible values are YES and NO. If left blank NO is used. + + EXAMPLE_RECURSIVE = NO + # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see ! # the \image command). IMAGE_PATH = *************** IMAGE_PATH = *** 376,411 **** # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes ! # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source ! # files to browse. FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project ! # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns ! # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that ! # should be ignored while generating the index headers. IGNORE_PREFIX = --- 363,424 ---- # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes ! # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source ! # files to browse. FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- + # configuration options related to source browsing + #--------------------------------------------------------------------------- + + # If the SOURCE_BROWSER tag is set to YES then a list of source files will + # be generated. Documented entities will be cross-referenced with these sources. + + SOURCE_BROWSER = YES + + # Setting the INLINE_SOURCES tag to YES will include the body + # of functions and classes directly in the documentation. + + INLINE_SOURCES = NO + + # If the REFERENCED_BY_RELATION tag is set to YES (the default) + # then for each documented function all documented + # functions referencing it will be listed. + + REFERENCED_BY_RELATION = YES + + # If the REFERENCES_RELATION tag is set to YES (the default) + # then for each documented function all documented entities + # called/used by that function will be listed. + + REFERENCES_RELATION = YES + + #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project ! # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns ! # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that ! # should be ignored while generating the index headers. IGNORE_PREFIX = *************** IGNORE_PREFIX = *** 414,428 **** #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will ! # generate HTML output. ! GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `html' will be used as the default path. ! HTML_OUTPUT = html_user # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a --- 427,441 ---- #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will ! # generate HTML output. ! GENERATE_HTML = @do_html@ # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `html' will be used as the default path. ! HTML_OUTPUT = @html_output_dir@ # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a *************** HTML_FOOTER = *** 439,458 **** # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen ! # will generate a default style sheet ! HTML_STYLESHEET = docs/doxygen/style.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to ! # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) ! # of the generated HTML documentation. GENERATE_HTMLHELP = NO --- 452,471 ---- # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen ! # will generate a default style sheet ! HTML_STYLESHEET = @srcdir@/docs/doxygen/style.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to ! # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) ! # of the generated HTML documentation. GENERATE_HTMLHELP = NO *************** GENERATE_CHI = NO *** 468,500 **** BINARY_TOC = NO ! # The TOC_EXPAND flag can be set YES to add extra items for group members ! # to the contents of the Html help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and ! # the value YES disables it. ! DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) ! # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports ! # JavaScript and frames is required (for instance Netscape 4.0+ ! # or Internet explorer 4.0+). GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree ! # is shown. TREEVIEW_WIDTH = 250 --- 481,515 ---- BINARY_TOC = NO ! # The TOC_EXPAND flag can be set to YES to add extra items for group members ! # to the contents of the Html help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and ! # the value YES disables it. ! DISABLE_INDEX = YES # This tag can be used to set the number of enum values (range [1..20]) ! # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports ! # JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, ! # or Internet explorer 4.0+). Note that for large projects the tree generation ! # can take a very long time. In such cases it is better to disable this feature. ! # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree ! # is shown. TREEVIEW_WIDTH = 250 *************** TREEVIEW_WIDTH = 250 *** 503,559 **** #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will ! # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to ! # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and ! # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX ! # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a ! # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references ! # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a ! # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. ! # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO --- 518,574 ---- #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will ! # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to ! # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and ! # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX ! # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a ! # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references ! # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a ! # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. ! # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO *************** GENERATE_RTF = NO *** 569,657 **** # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to ! # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. ! # This makes the output suitable for online browsing using a WORD or other. # programs which support those fields. ! # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide ! # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will ! # generate man pages ! GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to ! # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include ! # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled ! # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the ! # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files ! # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by ! # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will ! # be used. INCLUDE_FILE_PATTERNS = --- 584,697 ---- # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to ! # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. ! # This makes the output suitable for online browsing using WORD or other # programs which support those fields. ! # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide ! # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = + # Set optional variables used in the generation of an rtf document. + # Syntax is similar to doxygen's config file. + + RTF_EXTENSIONS_FILE = + #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will ! # generate man pages ! GENERATE_MAN = @do_man@ # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be ! # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to ! # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 + # If the MAN_LINKS tag is set to YES and Doxygen generates man output, + # then it will generate one additional man file for each entity + # documented in the real man page(s). These additional files + # only source the real man page, but without them the man command + # would be unable to find the correct page. The default is NO. + + MAN_LINKS = NO + + #--------------------------------------------------------------------------- + # configuration options related to the XML output + #--------------------------------------------------------------------------- + + # If the GENERATE_XML tag is set to YES Doxygen will + # generate an XML file that captures the structure of + # the code including all documentation. Note that this + # feature is still experimental and incomplete at the + # moment. + + GENERATE_XML = NO + #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include ! # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled ! # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the ! # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files ! # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by ! # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will ! # be used. INCLUDE_FILE_PATTERNS = *************** INCLUDE_FILE_PATTERNS = *** 659,696 **** # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are ! # omitted =1 is assumed. ! PREDEFINED = # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. ! # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- ! # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create ! # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes ! # will be listed. ALLEXTERNALS = YES # The PERL_PATH should be the absolute path and name of the perl script ! # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl --- 699,743 ---- # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are ! # omitted =1 is assumed. ! PREDEFINED = _GLIBCPP_DEPRECATED # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. ! # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = + # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then + # doxygen's preprocessor will remove all function-like macros that are alone + # on a line and do not end with a semicolon. Such function macros are typically + # used for boiler-plate code, and will confuse the parser if not removed. + + SKIP_FUNCTION_MACROS = YES + #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- ! # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create ! # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes ! # will be listed. ALLEXTERNALS = YES # The PERL_PATH should be the absolute path and name of the perl script ! # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl *************** PERL_PATH = /usr/bin/perl *** 698,707 **** # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section ! # have no effect if this option is set to NO (the default) HAVE_DOT = YES --- 745,762 ---- # Configuration options related to the dot tool #--------------------------------------------------------------------------- + # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will + # generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or + # super classes. Setting the tag to NO turns the diagrams off. Note that this + # option is superceded by the HAVE_DOT option below. This is only a fallback. It is + # recommended to install and use dot, since it yield more powerful graphs. + + CLASS_DIAGRAMS = YES + # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section ! # have no effect if this option is set to NO (the default) HAVE_DOT = YES *************** CLASS_GRAPH = YES *** 715,752 **** # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and ! # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES ! # If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to ! # YES then doxygen will generate a graph for each documented file showing ! # the direct and indirect include dependencies of the file with other ! # documented files. INCLUDE_GRAPH = YES ! # If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to ! # YES then doxygen will generate a graph for each documented header file showing ! # the documented files that directly or indirectly include this file INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen ! # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The tag DOT_PATH can be used to specify the path where the dot tool can be ! # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very ! # large images. MAX_DOT_GRAPH_WIDTH = 1024 --- 770,825 ---- # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and ! # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES ! # If set to YES, the inheritance and collaboration graphs will show the ! # relations between templates and their instances. ! ! TEMPLATE_RELATIONS = YES ! ! # If set to YES, the inheritance and collaboration graphs will hide ! # inheritance and usage relations if the target is undocumented ! # or is not a class. ! ! HIDE_UNDOC_RELATIONS = YES ! ! # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT ! # tags are set to YES then doxygen will generate a graph for each documented ! # file showing the direct and indirect include dependencies of the file with ! # other documented files. INCLUDE_GRAPH = YES ! # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and ! # HAVE_DOT tags are set to YES then doxygen will generate a graph for each ! # documented header file showing the documented files that directly or ! # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen ! # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The tag DOT_PATH can be used to specify the path where the dot tool can be ! # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = + # The DOTFILE_DIRS tag can be used to specify one or more directories that + # contain dot files that are included in the documentation (see the + # \dotfile command). + + DOTFILE_DIRS = + # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very ! # large images. MAX_DOT_GRAPH_WIDTH = 1024 *************** MAX_DOT_GRAPH_WIDTH = 1024 *** 754,772 **** # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very ! # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and ! # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermedate dot files that are used to generate ! # the various graphs. DOT_CLEANUP = YES --- 827,845 ---- # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very ! # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and ! # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermedate dot files that are used to generate ! # the various graphs. DOT_CLEANUP = YES *************** DOT_CLEANUP = YES *** 775,821 **** #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be ! # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. ! # A script with this name will be generated by doxygen. CGI_NAME = search.cgi # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for ! # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the ! # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine ! # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary ! # is installed. BIN_ABSPATH = /usr/local/bin/ # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search ! # the documentation for these projects as well. EXT_DOC_PATHS = ! ! # End of file ! ! --- 848,891 ---- #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be ! # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. ! # A script with this name will be generated by doxygen. CGI_NAME = search.cgi # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for ! # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the ! # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine ! # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary ! # is installed. BIN_ABSPATH = /usr/local/bin/ # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search ! # the documentation for these projects as well. EXT_DOC_PATHS = ! ### End of file. diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/17_intro/RELEASE-NOTES gcc-3.1/libstdc++-v3/docs/html/17_intro/RELEASE-NOTES *** gcc-3.0.4/libstdc++-v3/docs/html/17_intro/RELEASE-NOTES Mon May 14 19:48:55 2001 --- gcc-3.1/libstdc++-v3/docs/html/17_intro/RELEASE-NOTES Tue Mar 5 21:22:15 2002 *************** *** 1,49 **** ! 2001-04-06 Release Notes ------------- ! The Standard C++ Library v3, or libstdc++-2.9x, is an ongoing ! project to implement the ISO 14882 Standard C++ library as described ! in chapters 17 through 27 and annex D, as a drop-in replacement ! for the current (ARM-conformant) library. ! This is the eleventh snapshot of the libstdc++ rewrite. It is still ! incomplet and incorrekt. It's a lot less incomplete and incorrect than ! some of the earlier snapshots though, and quite usable. ! The Standard C++ Library v3, or libstdc++-2.9x, follows an open ! development model, attempting to be fully buzzword, bazaar, and GNU ! compliant. Full details on participating, including contributor ! guidelines, mailing list subscription, mailing list archives, ! up-to-date documentation, and various and sundry other details can be ! found at the following URL: http://gcc.gnu.org/libstdc++/ New: --- ! - preliminary doxygen documentation has been added. Running "make ! doxygen" in the libstdc++-v3 build directory will generate HTML ! documentation that can be used to cross-reference names and files in ! the library. ! - a dejagnu based testing framework has been added ! - a new implementation of the concept checking code has been ported ! from the boost libraries. ! - support for -fno-exceptions has been added ! - stdexcept was re-written ! - using deprecated or antiquated headers now gives a warning ! - the stdio interface to iostreams has been tweaked, and now works ! with synchronized c/c++ io ! - new libsupc++ routines implementing the IA-64 C++ ABI. ! - HPUX configuration files ! - support for AIX added ! - a lot of bugs were fixed. ! - preliminary named locales implemented ! - portability improvements made to generation of ! - speedups to improve configuration time. ! - DJGPP support added. ! - support for dlopening shared libstdc++ What doesn't: ------------- --- 1,40 ---- ! 2002-03-05 Release Notes ------------- ! The Standard C++ Library, or libstdc++-v3, is an ongoing project ! to fully implement the ISO 14882 Standard C++ library as described in ! chapters 17 through 27 and annex D. ! This is the fourteenth snapshot of the libstdc++ rewrite. It still ! has some incomplet and incorrekt parts, but it's a lot less incomplete ! and incorrect than some of the earlier snapshots, and quite usable. ! The Standard C++ Library, follows an open development model, ! attempting to be fully buzzword, bazaar, and GNU compliant. Full ! details on participating, including contributor guidelines, mailing ! list subscription, mailing list archives, up-to-date documentation, ! and various and sundry other details can be found at the following ! URL: http://gcc.gnu.org/libstdc++/ New: --- ! - more doxygen documentation. ! - more named locale bug fixes ! - support for symbol versioning when using GNU ld >= 2.12 ! - wide-io ! - tuning for executable size ! ! ! Bugs fixed: ! ----------- ! 5816, 3955, 3983, 5708, 5697, 5286, 3860, 5579 ! AIX linkage and threading fixes. ! + others. ! What doesn't: ------------- *************** CVS access, and contribution information *** 64,72 **** http://gcc.gnu.org/libstdc++/ ! Please note that the mailing list has recently moved, and is now ! hosted on gcc.gnu.org. (The web site above has the most ! up-to-date info.) Obtain the library snapshot via ftp (including these release notes) from --- 55,62 ---- http://gcc.gnu.org/libstdc++/ ! Please note that the mailing list has moved, and is now hosted on ! gcc.gnu.org. (The web site above has the most up-to-date info.) Obtain the library snapshot via ftp (including these release notes) from *************** Dos Reis, Phil Edwards, and Ulrich Drepp *** 79,91 **** Development tools: ------------------ ! You will need a recent version of gcc to compile the snapshot of ! libstdc++. The use of CVS gcc, or gcc-3_0-branch is strongly ! recommended, which may introduce additional dependencies for ! up-to-date binutils. In addition, you may need up-to-date tools for ! modifying Makefiles and regenerating configure scripts: automake ! (version 1.4), autoconf (version 2.13 and higher), and libtool. ! ! ! --- 69,81 ---- Development tools: ------------------ ! You will need a current version of gcc to compile this snapshot of ! libstdc++. The use of the latest stable gcc-3.0.x release (3.0.4), CVS ! gcc, or gcc-3_1-branch is strongly recommended, which may also ! introduce additional dependencies for up-to-date binutils. In ! particular, current binutils (2.12) is recommended so that symbol ! versioning for the library is on by default. In addition, you may need ! up-to-date tools for modifying Makefiles and regenerating configure ! scripts: automake (version 1.4), autoconf (version 2.13 and higher), ! and libtool. diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/17_intro/TODO gcc-3.1/libstdc++-v3/docs/html/17_intro/TODO *** gcc-3.0.4/libstdc++-v3/docs/html/17_intro/TODO Thu Dec 13 23:28:19 2001 --- gcc-3.1/libstdc++-v3/docs/html/17_intro/TODO Mon Mar 25 21:07:14 2002 *************** *** 1,13 **** - exception specifications need to be reviewed for all parts of the library support and utility areas, particularly . - - exception/stdexcept headers will do, but are not cleanly - implemented. Also, some kind of consensus needs to be established on - if the presence of stdexcept should be assumed in iostreams - headers. V3 currently takes the position that references to stdexcept - classes necessitates the inclusion of stdexcept, other library vendors - seem less inclined. - - scoping/linking issues WRT to C structs need to be worked out. See Nathan's commentary on cantrip, http://www.cantrip.org/cheaders.html --- 1,27 ---- + - audit for places where __builtin_expect can be used. + + - coordinate with "C" library people the "C" compatibility headers. + Explain why an ISO-14882-conformant solution is hopeless, with the current + twisted morass of "C" headers. + + - do more doxygen manpages + + - implement __convert_to_v and __convert_from_v without "C" library + functions and and LANG environment variable dependencies. + + - use localedata to implement generic named (non-MT-safe) locales? + Figure out a way to use ICU data, like libjava? + + - tuning for executable size, compilation speed, startup allocation, + executable speed. + + - benchmarking addition to the testsuite that does the above. + + - implement symbol versioning for ELF targets. + - exception specifications need to be reviewed for all parts of the library support and utility areas, particularly . - scoping/linking issues WRT to C structs need to be worked out. See Nathan's commentary on cantrip, http://www.cantrip.org/cheaders.html *************** string and vector iterator classes. basi *** 20,85 **** be implemented incorrectly, or need things like operator==(__normal_iterator, const char*&), and swap(vector) - - SGI iterator/allocator classes are not strictly conforming. In - particular, raw_storage_iterator, mem_fun1_ref_t are all problem - areas. - - auto_ptr: seems to be some disagreement on what is standards-conformant behavior, specially on conversion operators. - - vswprintf, vwprintf, wprintf, wscanf, wcsftime, swscanf, fgetws, - fputwc, fputws, fwide, fwprintf, fwscanf, getwc, getwchar, putwc, etc: - C library wchar_t functionality. - - - facets heirarchies seem on occasion give odd errors to conformace - tests. Need to test that they are constructed in a strictly-conforming - manner. - - - stuff like `LC_CTYPE' is not found. Locale oddness? - - header optimizations to keep compile times reasonable are most certainly detracting from full conformance, as many templatized definitions are squired away and pre-instantiated, so that the compiler doesn't have to parse them. Areas effected: valarray, string, all of iostreams and locales. - - basic_string not implemented - - - ostreambuf_iterator has not been made standards-conformant (both - char and wchar_t) In particular, look at - time_put::put(OutIt, ios_base&, char, const tm*, const char*, const - char*) const - - C-related issues WRT to libio and filepos, mbstate_t. Need to straighten this stuff out with the glibc-2.2 libio. Also may need to define operators for mbstate_t so that 'mbstate_t& == mbstate_t' is something that can be done. - - codecvt has not been adequently handled in terms of the - locale bits. (The io bits are done, with the exception of one - ostream inserter for char. - - - bool locale::operator() looks to be non-conformant - - - num_get::do_get - num_put::do_put - num_put::do_put(char *, ios_base &, char, long double) const - num_put::do_put(char *, ios_base &, char, double) const - num_put::do_put(char *, ios_base &, char, void const *) const - etc. - appear to be broken, or headers mashed, or undefined. - - - locale and std::combine not working correctly - template class locale locale::combine(const locale &) - - - ctype_byname: check to make sure derivation standards-conformant. - - - codecvt::unshift not working for char, wchar_t - - - no match for money_base::pattern &[int] - - - money_get::do_get weirded out for wchar_t - - looks like deque::get_allocator not standards conformant or deque allocator non-standard. --- 34,53 ---- *************** needs to be drawn throughout the entire *** 90,134 **** - priority_queue conversions may be non-conformant - - istream_iterator uses 2 arguments, should it be 4? - - 'do the right thing' ctor fixing needs to be done for string. This is still subject to some debate on the library issues list, so I suggest punting till the dust clears. - - the ctype and "tolower" "isspace" stuff really needs to be sorted - out. A portable, cross platform interface needs to be defined. A - "fixincludes"-like solution needs to be put into place to prune - headers. The "C" functions need to be able to work in std:: and "C" - namespaces. - - - complex seems to be the single largest source of internal - compiler errors when compiling the c++ library across non-x86 - platforms. Somebody needs to make sure the complex support builtin to - gcc is actually working. Just as a "for-instance" these things give ICEs: - class complex& complex::operator-=(const complex &) - class complex& complex::operator/=(const complex &) - class complex& complex::operator+=(const complex &) - class complex& complex::operator-=(const complex &) - class complex& complex::operator*=(const complex &) - - - appears as if the following extraction operators are undefined: - operator>>(istream, complex&) - operator>>(istream, complex&) - operator>>(istream, complex&) - operator>>(istream, complex&) - sqrt (const complex& x) - - Protect valarray::result_type (not Standard) and make it work with the various helper classes. - Make sure `valarray & == _Expr<_BinClos,bool>' is defined - - long double std_cmath stuff looks weak - - - fwide not declared. C++ wchar_t issues completely unaddressed. - - known issues WRT to io and corner cases with the buffers. This is still subject to interpretation, and I think the current implementation is credible. --- 58,73 ---- *************** sources, with macro-guards. *** 154,171 **** - add feature-test macros for non-standard extensions - - move major extensions into separate namespace (e.g. stl::) - - create MT abstraction layer - add MT support for locale, string, istream, ostream - - specialize functions that use_facet<> calls on failure for the required - facets, and construct them lazily so unused facets need not be constructed - when the locale is. - - - : provide missing names. - - provide testsuites for numerics. - add FAQ entries -- improve the install instructions --- 93,102 ---- diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/17_intro/howto.html gcc-3.1/libstdc++-v3/docs/html/17_intro/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/17_intro/howto.html Thu Dec 13 23:28:19 2001 --- gcc-3.1/libstdc++-v3/docs/html/17_intro/howto.html Tue Apr 2 02:07:50 2002 *************** *** 28,33 **** --- 28,35 ----
  • The Standard C++ library and multithreading
  • <foo> vs <foo.h>
  • Porting HOWTO +
  • Behavior specific to libstdc++-v3 +
  • Preprocessor macros controlling the library
    *************** *** 53,72 ****

    The Standard C++ library and multithreading

    This section discusses issues surrounding the proper compilation of multithreaded applications which use the Standard C++ ! library. This information is gcc-specific since the C++ standard does not address matters of multithreaded applications. Unless explicitly prefaced, all information in this section is ! current as of the gcc 3.0 release and all later point releases.

    !

    Earlier gcc releases had a somewhat different approach to ! threading configuration and proper compilation. Before gcc 3.0, configuration of the threading model was dictated by compiler command-line options and macros (both of which were somewhat thread-implementation and port-specific). There were no guarantees related to being able to link code compiled with one ! set of options and macro setting with another set. For gcc 3.0, configuration of the threading model used with libraries and ! user-code is performed when gcc is configured and built using the --enable-threads and --disable-threads options. The ABI is stable for symbol name-mangling and limited functional compatibility exists between code compiled under different --- 55,74 ----

    The Standard C++ library and multithreading

    This section discusses issues surrounding the proper compilation of multithreaded applications which use the Standard C++ ! library. This information is GCC-specific since the C++ standard does not address matters of multithreaded applications. Unless explicitly prefaced, all information in this section is ! current as of the GCC 3.0 release and all later point releases.

    !

    Earlier GCC releases had a somewhat different approach to ! threading configuration and proper compilation. Before GCC 3.0, configuration of the threading model was dictated by compiler command-line options and macros (both of which were somewhat thread-implementation and port-specific). There were no guarantees related to being able to link code compiled with one ! set of options and macro setting with another set. For GCC 3.0, configuration of the threading model used with libraries and ! user-code is performed when GCC is configured and built using the --enable-threads and --disable-threads options. The ABI is stable for symbol name-mangling and limited functional compatibility exists between code compiled under different *************** *** 82,90 **** with another thread model useful on the platform. Other mixes may or may not work but are not considered supported. (Thus, if you distribute a shared C++ library in binary form only, it may ! be best to compile it with a gcc configured with --enable-threads for maximal interchangeability and usefulness ! with a user population that may have built gcc with either --enable-threads or --disable-threads.)

    When you link a multithreaded application, you will probably --- 84,92 ---- with another thread model useful on the platform. Other mixes may or may not work but are not considered supported. (Thus, if you distribute a shared C++ library in binary form only, it may ! be best to compile it with a GCC configured with --enable-threads for maximal interchangeability and usefulness ! with a user population that may have built GCC with either --enable-threads or --disable-threads.)

    When you link a multithreaded application, you will probably *************** *** 160,165 **** --- 162,337 ----

    Return to top of page or to the FAQ. +

    + +
    +

    Behavior specific to libstdc++-v3

    +

    The ISO standard defines the following phrase: +

    +
    [1.3.5] implementation-defined behavior +
    behavior, for a well-formed program construct and correct data, that + depends on the implementation and that each implementation + shall document. +
    + We do so here, for the C++ library only. Behavior of the compiler, + linker, runtime loader, and other elements of "the + implementation" are documented elsewhere. Everything listed in + Annex B, Implemenation Qualities, are also part of the compiler, not + the library. +

    +

    For each entry, we give the section number of the standard, when + applicable. This list is probably incomplet and inkorrekt. +

    +

    [17.4.4.5] Non-reentrant functions are probably best + discussed in the various sections on multithreading (see above). +

    + +

    [18.1]/4 The type of NULL is described + here. +

    +

    [18.3]/8 Even though it's listed in the library + sections, libstdc++-v3 has zero control over what the cleanup code hands + back to the runtime loader. Talk to the compiler people. :-) +

    +

    [18.4.2.1]/5 (bad_alloc),
    + [18.5.2]/5 (bad_cast),
    + [18.5.3]/5 (bad_typeid),
    + [18.6.1]/8 (exception),
    + [18.6.2.1]/5 (bad_exception): The what() + member function of class std::exception, and these other + classes publicly derived from it, simply returns the name of the + class. But they are the mangled names; you will need to call + c++filt and pass the names as command-line parameters to + demangle them, or call a + runtime demangler function. + (The classes in <stdexcept> have constructors which + require an argument to use later for what() calls, so the + question does not arise in most user-defined exceptions.) +

    +

    [18.5.1]/7 The return value of + std::type_info::name() is the mangled type name (see the + previous entry for more). +

    +

    [20.1.5]/5 "Implementors are encouraged to + supply libraries that can accept allocators that encapsulate more + general memory models and that support non-equal instances. In such + implementations, any requirements imposed on allocators by containers + beyond those requirements that appear in Table 32, and the semantics + of containers and algorithms when allocator instances compare + non-equal, are implementation-defined." As yet we don't + have any allocators which compare non-equal, so we can't describe how + they behave. +

    +

    [21.1.3.1]/3,4,
    + [21.1.3.2]/2,
    + [23.*]'s foo::iterator,
    + [27.*]'s foo::*_type,
    + others... + Nope, these types are called implementation-defined because you + shouldn't be taking advantage of their underlying types. Listing them + here would defeat the purpose. :-) +

    +

    [21.1.3.1]/5 I don't really know about the mbstate_t + stuff... see the chapter 22 notes for what does exist. +

    +

    [22.*] Anything and everything we have on locale + implemenation will be described + over here. +

    +

    [26.2.8]/9 I have no idea what + complex<T>'s pow(0,0) returns. +

    +

    [27.4.2.4]/2 Calling + std::ios_base::sync_with_stdio after I/O has already been + performed on the standard stream objects will + flush the buffers, and + destroy and recreate the underlying buffer instances. Whether or not + the previously-written I/O is destroyed in this process depends mostly + on the --enable-libio choice: for stdio, if the written data is + already in the stdio buffer, the data may be completely safe! +

    +

    I/O sentry ctor/dtor They can perform additional work + than the minimum required. I don't think we're currently taking + advantage of this yet. +

    +

    [27.7.1.3]/16,
    + [27.8.1.4]/10 + The effects of pubsetbuf/setbuf are described + in this chapter. +

    +

    [27.8.1.4]/16 Calling fstream::sync when + a get area exists will... whatever fflush() does, I think. +

    +

    Return to top of page or + to the FAQ. +

    + +
    +

    Preprocessor macros controlling the library

    +

    Some of the semantics of the libstdc++-v3 implementation are + controlled by preprocessor macros, both during build/installation and + during compilation of user code. Many of these choices are made when + the library is built and installed (actually, during + the configuration step, with the + various --enable/--disable choices being translated to #define/#undef). +

    +

    All library macros begin with _GLIBCPP_. The fact that + these symbols start with a leading underscore should give you a clue + that (by default) they aren't meant to be changed by the user. :-) +

    +

    These macros are all gathered in the file c++config.h, + which is generated during installation. You must assume that + these macros cannot be redefined by your own code, unless we + document otherwise here. Some of the choices control code which has + already been compiled (i.e., libstdc++.a/.so). If you explicitly + #define or #undef these macros, the headers may see different + code paths, but the libraries which you link against will not. + If you want to experiment with different values, you must change the + config headers before building/installing the library. +

    +

    Below are macros which, for 3.1 and later, you may change yourself, + in your own code with #define/#undef or with -D/-U compiler flags. + The default state of the symbol is listed. "Configurable" + (or "Not configurable") means that the symbol is initially + chosen (or not) based on --enable/--disable options at configure time. +

    +
    _GLIBCPP_DEPRECATED
    +
    Undefined by default. Not configurable. Turning this on enables + older ARM-style iostreams code, and other anachronisms. This may be + useful in updating old C++ programs which no longer meet the + requirements of the language. +
    + +
    _GLIBCPP_CONCEPT_CHECKS
    +
    Undefined by default. Configurable. When defined, performs + compile-time checking on certain template instantiations to detect + violations of the requirements of the standard. This is described + in more detail here. +
    + +
    +

    +

    Return to top of page or + to the FAQ.

    diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/17_intro/porting-howto.html gcc-3.1/libstdc++-v3/docs/html/17_intro/porting-howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/17_intro/porting-howto.html Thu Dec 13 23:28:19 2001 --- gcc-3.1/libstdc++-v3/docs/html/17_intro/porting-howto.html Mon Mar 4 23:03:20 2002 *************** *** 3,11 **** Libstdc++-porting-howto ! !

    Libstdc++-porting-howto

    --- 3,11 ---- Libstdc++-porting-howto ! !

    Libstdc++-porting-howto

    *************** *** 84,92 ****
    !

    ! Abstract !

    Some notes on porting applications from libstdc++-2.90 (or earlier versions) to libstdc++-v3. Not speaking in terms of the GNU libstdc++ --- 84,90 ----

    !

    Abstract

    Some notes on porting applications from libstdc++-2.90 (or earlier versions) to libstdc++-v3. Not speaking in terms of the GNU libstdc++ *************** *** 102,109 ****

    1. Namespace std::
    !
    1.1.1. Using namespace ! composition if the project uses a separate namespace
    1.1.2. Defining an empty namespace std --- 100,107 ----
    1. Namespace std::
    !
    1.1.1. Using namespace ! composition if the project uses a separate namespace
    1.1.2. Defining an empty namespace std *************** *** 118,125 ****
    2. there is no ios::nocreate/ios::noreplace in ISO 14882
    !
    3. stream::attach(int ! fd) is not in the standard any more
    4. The new headers
    --- 116,123 ----
    2. there is no ios::nocreate/ios::noreplace in ISO 14882
    !
    3. stream::attach(int ! fd) is not in the standard any more
    4. The new headers
    *************** *** 127,142 ****
    4.4.1. New headers replacing C-headers
    4.4.2. ! <fstream> does ! not define std::cout, ! std::cin etc.
    5. Iterators
    6. ! Libc-macros (i.e. isspace from ! <cctype>)
    7. State of streams
    --- 125,140 ----
    4.4.1. New headers replacing C-headers
    4.4.2. ! <fstream> does ! not define std::cout, ! std::cin etc.
    5. Iterators
    6. ! Libc-macros (i.e. isspace from ! <cctype>)
    7. State of streams
    *************** *** 161,189 **** libstdc++-implementations".

    !

    ! 1. Namespace std:: !

    The latest C++-standard (ISO-14882) requires that the standard C++-library is defined in namespace std::. Thus, in order to use classes from the standard C++-library, you can do one of three things: !

      !
    • ! wrap your code in namespace std { ... } => This is not an option because only symbols from the standard c++-library are defined in namespace std::.

    • !
    • ! put a kind of ! using-declaration in your source (either using namespace std; or i.e. using std::string;) => works well for source-files, but cannot be used in header-files.

    • !
    • ! use a fully qualified name for each libstdc++-symbol (i.e. std::string, std::cout) => can always be used

    • --- 159,183 ---- libstdc++-implementations".

      !

      ! Namespace std::

      The latest C++-standard (ISO-14882) requires that the standard C++-library is defined in namespace std::. Thus, in order to use classes from the standard C++-library, you can do one of three things: !

        !
      • wrap your code in namespace std { ... } => This is not an option because only symbols from the standard c++-library are defined in namespace std::.

      • !
      • put a kind of ! using-declaration in your source (either using namespace std; or i.e. using std::string;) => works well for source-files, but cannot be used in header-files.

      • !
      • use a fully qualified name for each libstdc++-symbol (i.e. std::string, std::cout) => can always be used

      • *************** *** 210,226 **** that cannot ignore std::.

        !

        ! 1.1.1. Using namespace ! composition if the project uses a separate ! namespace !

        Gtk-- defines most of its classes in namespace Gtk::. Thus, it was possible to adapt Gtk-- to namespace std:: by using a C++-feature called ! namespace composition. This is what happens if ! you put a using-declaration into a namespace-definition: the imported symbol(s) gets imported into the currently active namespace(s). For example:

        --- 204,219 ----
                that cannot ignore std::.
              

        !

        ! Using namespace ! composition if the project uses a separate ! namespace

        Gtk-- defines most of its classes in namespace Gtk::. Thus, it was possible to adapt Gtk-- to namespace std:: by using a C++-feature called ! namespace composition. This is what happens if ! you put a using-declaration into a namespace-definition: the imported symbol(s) gets imported into the currently active namespace(s). For example:

        ***************
        *** 245,253 ****
                

        !

        ! 1.1.2. Defining an empty namespace std !

        By defining an (empty) namespace std:: before using it, you avoid getting errors on systems where no part of the --- 238,245 ----

        !

        ! Defining an empty namespace std

        By defining an (empty) namespace std:: before using it, you avoid getting errors on systems where no part of the *************** *** 259,276 ****

        !

        ! 1.1.3. Avoid to use fully qualified names ! (i.e. std::string) !

        If some compilers complain about using std::string;, and if the "hack" for gtk-- mentioned above does not work, then I see two solutions: !

        • - Define std:: as a macro if the compiler doesn't know about std::.

          --- 251,266 ----
                  

        !

        ! Avoid to use fully qualified names ! (i.e. std::string)

        If some compilers complain about using std::string;, and if the "hack" for gtk-- mentioned above does not work, then I see two solutions: !

        • Define std:: as a macro if the compiler doesn't know about std::.

          ***************
          *** 282,288 ****
            	      gnu.gcc.help)
            	    

        • - Define a macro NS_STD, which is defined to either "" or "std" based on an autoconf-test. Then you should be able to use --- 272,277 ---- *************** *** 295,312 ****

        !

        ! 1.1.4. How some open-source-projects deal ! with this !

        This information was gathered around May 2000. It may not be correct by the time you read this.

        !

        ! Table 1. Namespace std:: in Open-Source programs !

        --- 284,298 ----

        !

        ! How some open-source-projects deal ! with this

        This information was gathered around May 2000. It may not be correct by the time you read this.

        !

        Table 1. Namespace std:: in Open-Source programs

        *************** *** 338,346 ****
        !

        ! Table 2. Notations for categories !

        --- 324,330 ----
        !

        Table 2. Notations for categories

        *************** *** 368,382 ****

        As you can see, this currently lacks an example of a project which uses libstdc++-symbols in headers in a back-portable way ! (except for Gtk--: see the section on the gtkmm-hack).

        !

        ! 2. there is no ios::nocreate/ios::noreplace ! in ISO 14882 !

        I have seen ios::nocreate being used for input-streams, most probably because the author thought it would be --- 352,367 ----

        As you can see, this currently lacks an example of a project which uses libstdc++-symbols in headers in a back-portable way ! (except for Gtk--: see the section on the gtkmm-hack).

        !

        ! there is no ios::nocreate/ios::noreplace ! in ISO 14882

        I have seen ios::nocreate being used for input-streams, most probably because the author thought it would be *************** *** 394,403 ****

        !

        ! 3. stream::attach(int ! fd) is not in the standard any more !

        Phil Edwards <pedwards@disaster.jaj.com> writes: It was considered and rejected. Not all environments use file --- 379,387 ----

        !

        ! stream::attach(int ! fd) is not in the standard any more

        Phil Edwards <pedwards@disaster.jaj.com> writes: It was considered and rejected. Not all environments use file *************** *** 406,421 ****

        When using libstdc++-v3, you can use !

        !

        !

          	  #include <fstream>
          	

        basic_filebuf<...>::basic_filebuf<...> (file, mode, size);
        __c_file_type* file;
        ios_base::open_mode mode;
        int size;

        -

        but the the signature of this constructor has changed often, and it might change again. For the current state of this, check --- 390,403 ----

        When using libstdc++-v3, you can use !

        !
          	  #include <fstream>
          	

        basic_filebuf<...>::basic_filebuf<...> (file, mode, size);
        __c_file_type* file;
        ios_base::open_mode mode;
        int size;

        but the the signature of this constructor has changed often, and it might change again. For the current state of this, check *************** *** 427,439 **** std::streambuf (or std::basic_streambuf<..>) which opens a file given a descriptor, and then pass an instance of this to the ! stream-constructor (from the Josuttis-book).

        !

        ! 4. The new headers !

        All new headers can be seen in this source-code. --- 409,422 ---- std::streambuf (or std::basic_streambuf<..>) which opens a file given a descriptor, and then pass an instance of this to the ! stream-constructor. For an example of this, refer to ! fdstream example ! by Nicolai Josuttis.

        !

        ! The new headers

        All new headers can be seen in this source-code. *************** *** 443,451 **** a warning that you are using deprecated headers.

        !

        ! 4.4.1. New headers replacing C-headers !

        You should not use the C-headers (except for system-level headers) from C++ programs. Instead, you should use a set of --- 426,433 ---- a warning that you are using deprecated headers.

        !

        ! New headers replacing C-headers

        You should not use the C-headers (except for system-level headers) from C++ programs. Instead, you should use a set of *************** *** 474,485 ****

        !

        ! 4.4.2. <fstream> does not define std::cout, ! std::cin etc. !

        In earlier versions of the standard, <fstream.h>, --- 456,466 ----

        !

        ! <fstream> does not define std::cout, ! std::cin etc.

        In earlier versions of the standard, <fstream.h>, *************** *** 494,535 ****

        !

        ! 5. Iterators !

        The following are not proper uses of iterators, but may be working fixes for existing uses of iterators. !

          !
        • ! you cannot do ostream::operator<<(iterator) to print the address of the iterator => use operator<< &*iterator instead ?

        • !
        • ! you cannot clear an iterator's reference (iterator = 0) => use iterator = iterator_type(); ?

        • ! if (iterator) won't work any more => use if (iterator != iterator_type()) ?

        !

        ! 6. Libc-macros (i.e. isspace from ! <cctype>) !

        Glibc 2.0.x and 2.1.x define the <ctype.h> -functionality as macros (isspace, isalpha etc.). Libstdc++-v3 ! "shadows" these macros as described in the section about c-headers.

        --- 475,512 ----

        !

        ! Iterators

        The following are not proper uses of iterators, but may be working fixes for existing uses of iterators. !

          !
        • you cannot do ostream::operator<<(iterator) to print the address of the iterator => use operator<< &*iterator instead ?

        • !
        • you cannot clear an iterator's reference (iterator = 0) => use iterator = iterator_type(); ?

        • ! if (iterator) won't work any more => use if (iterator != iterator_type()) ?

        !

        ! Libc-macros (i.e. isspace from ! <cctype>)

        Glibc 2.0.x and 2.1.x define the <ctype.h> -functionality as macros (isspace, isalpha etc.). Libstdc++-v3 ! "shadows" these macros as described in the section about c-headers.

        *************** *** 577,594 **** The solution to this problem was posted to the libstdc++-v3 mailing-list: Benjamin Kosnik <bkoz@redhat.com> writes: ! ` --enable-cshadow-headers is currently broken. As a result, shadow headers are not being searched.... ! ' This is now outdated, but gcc 3.0 still does not have fully compliant "shadow headers".

        !

        ! 7. State of streams !

        At least some older implementations don't have std::ios_base, so you should use --- 554,570 ---- The solution to this problem was posted to the libstdc++-v3 mailing-list: Benjamin Kosnik <bkoz@redhat.com> writes: ! ‘ --enable-cshadow-headers is currently broken. As a result, shadow headers are not being searched.... ! ’ This is now outdated, but gcc 3.0 still does not have fully compliant "shadow headers".

        !

        ! State of streams

        At least some older implementations don't have std::ios_base, so you should use *************** *** 598,606 ****

        !

        ! 8. vector::at is missing (i.e. gcc 2.95.x) !

        One solution is to add an autoconf-test for this:

        --- 574,581 ----
              

        !

        ! vector::at is missing (i.e. gcc 2.95.x)

        One solution is to add an autoconf-test for this:

        ***************
        *** 630,638 ****
              

        !

        ! 9. Using std::char_traits<char>::eof() !

          	#ifdef HAVE_CHAR_TRAITS
        --- 605,612 ----
              

        !

        ! Using std::char_traits<char>::eof()

          	#ifdef HAVE_CHAR_TRAITS
        ***************
        *** 644,652 ****
              

        !

        ! 10. Using string::clear()/string::erase() !

        There are two functions for deleting the contents of a string: clear and erase (the latter --- 618,625 ----

        !

        ! Using string::clear()/string::erase()

        There are two functions for deleting the contents of a string: clear and erase (the latter *************** *** 671,689 ****

        !

        ! 11. GNU Extensions ostream::form and istream::scan !

        These are not supported any more - use ! stringstreams instead.

        !

        ! 12. Using stringstreams !

        Libstdc++-v3 provides the new i/ostringstream-classes, (<sstream>), but for compatibility --- 644,660 ----

        !

        ! GNU Extensions ostream::form and istream::scan

        These are not supported any more - use ! stringstreams instead.

        !

        ! Using stringstreams

        Libstdc++-v3 provides the new i/ostringstream-classes, (<sstream>), but for compatibility *************** *** 696,717 **** #include <strstream> #endif !

          !
        • ! strstream is considered to be deprecated

        • !
        • ! strstream is limited to char

        • !
        • ! with ostringstream you don't have to take care of terminating the string or freeing its memory

        • !
        • ! istringstream can be re-filled (clear(); str(input);)

        --- 667,684 ---- #include <strstream> #endif !
          !
        • strstream is considered to be deprecated

        • !
        • strstream is limited to char

        • !
        • with ostringstream you don't have to take care of terminating the string or freeing its memory

        • !
        • istringstream can be re-filled (clear(); str(input);)

        *************** *** 789,797 ****

        !

        ! 13. About... !

        Please send any experience, additions, corrections or questions to fnatter@gmx.net or for --- 756,763 ----

        !

        ! About...

        Please send any experience, additions, corrections or questions to fnatter@gmx.net or for diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/17_intro/porting-howto.xml gcc-3.1/libstdc++-v3/docs/html/17_intro/porting-howto.xml *** gcc-3.0.4/libstdc++-v3/docs/html/17_intro/porting-howto.xml Thu Dec 13 23:28:20 2001 --- gcc-3.1/libstdc++-v3/docs/html/17_intro/porting-howto.xml Mon Mar 4 23:03:20 2002 *************** *** 1,7 **** --- 1,7 ---- *************** o clean up the section-numbering *** 377,383 **** std::streambuf (or std::basic_streambuf<..>) which opens a file given a descriptor, and then pass an instance of this to the ! stream-constructor (from the Josuttis-book). --- 377,385 ---- std::streambuf (or std::basic_streambuf<..>) which opens a file given a descriptor, and then pass an instance of this to the ! stream-constructor. For an example of this, refer to ! fdstream example ! by Nicolai Josuttis. diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/18_support/howto.html gcc-3.1/libstdc++-v3/docs/html/18_support/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/18_support/howto.html Thu Dec 13 23:28:22 2001 --- gcc-3.1/libstdc++-v3/docs/html/18_support/howto.html Tue Apr 2 02:07:51 2002 *************** *** 31,36 **** --- 31,37 ----

      • Implementation properties
      • Start and Termination
      • Dynamic memory management +
      • RTTI, the ABI, and demangling
        *************** *** 255,260 **** --- 256,323 ---- to the FAQ.

        +
        +

        RTTI, the ABI, and demangling

        +

        If you have read the source + documentation for namespace abi then you are aware + of the cross-vendor C++ ABI which we use. One of the exposed + functions is the one which we use for demangling in programs like + c++filt, and you can use it yourself as well. +

        +

        (The function itself might use different demanglers, but that's the + whole point of abstract interfaces. If we change the implementation, + you won't notice.) +

        +

        Probably the only times you'll be interested in demangling at runtime + are when you're seeing typeid strings in RTTI, or when + you're handling the runtime-support exception classes. For example: +

        + #include <exception>
        + #include <iostream>
        + #include <cxxabi.h>
        + 
        + struct empty { };
        + 
        + template <typename T, int N>
        +   struct bar { };
        + 
        + 
        + int main()
        + {
        +   int     status;
        +   char   *realname;
        + 
        +   // exception classes not in <stdexcept>, thrown by the implementation
        +   // instead of the user
        +   std::bad_exception  e;
        +   realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
        +   std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
        +   free(realname);
        + 
        + 
        +   // typeid
        +   bar<empty,17>          u;
        +   const std::type_info  &ti = typeid(u);
        + 
        +   realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
        +   std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
        +   free(realname);
        + 
        +   return 0;
        + }

        +

        With GCC 3.1 and later, this prints

        +       St13bad_exception       => std::bad_exception   : 0
        +       3barI5emptyLi17EE       => bar<empty, 17>       : 0
        +

        +

        The demangler interface is described in the source documentation + linked to above. It is actually written in C, so you don't need to + be writing C++ in order to demangle C++. (That also means we have to + use crummy memory management facilities, so don't forget to free() + the returned char array.) +

        +

        Return to top of page or + to the FAQ. +

        diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/19_diagnostics/howto.html gcc-3.1/libstdc++-v3/docs/html/19_diagnostics/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/19_diagnostics/howto.html Thu Dec 13 23:28:24 2001 --- gcc-3.1/libstdc++-v3/docs/html/19_diagnostics/howto.html Mon Apr 1 22:09:29 2002 *************** *** 99,106 **** object file. The checks are also cleaner and easier to read and understand.

        !

        Right now they are off by default. More will be added once ! GCC 3.0 is released and we have time to revisit this topic.

        Return to top of page or to the FAQ. --- 99,109 ---- object file. The checks are also cleaner and easier to read and understand.

        !

        For GCC 3.0 and 3.1 they are off by default. They can be enabled at ! configure time with ! --enable-concept-checks. ! For 3.1 you can instead #define _GLIBCPP_CONCEPT_CHECKS to enable them ! on a per-translation-unit basis.

        Return to top of page or to the FAQ. *************** *** 116,127 **** int main() { ! std::set_terminate (__gnu_cxx::verbose_terminate_handler); ... throw anything; }

        !

        The verbose_terminate_handler function obtains the name of the current exception, attempts to demangle it, and prints it to stderr. If the exception is derived from std::exception then the output from what() will be included. --- 119,130 ---- int main() { ! std::set_terminate (__gnu_cxx::__verbose_terminate_handler); ... throw anything; }

        !

        The __verbose_terminate_handler function obtains the name of the current exception, attempts to demangle it, and prints it to stderr. If the exception is derived from std::exception then the output from what() will be included. *************** *** 142,148 **** int main (int argc) { ! std::set_terminate (__gnu_cxx::verbose_terminate_handler); if (argc > 5) throw BLARGH("argc is greater than 5!"); else --- 145,151 ---- int main (int argc) { ! std::set_terminate (__gnu_cxx::__verbose_terminate_handler); if (argc > 5) throw BLARGH("argc is greater than 5!"); else diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/20_util/howto.html gcc-3.1/libstdc++-v3/docs/html/20_util/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/20_util/howto.html Thu Dec 13 23:28:25 2001 --- gcc-3.1/libstdc++-v3/docs/html/20_util/howto.html Wed Mar 27 22:38:39 2002 *************** *** 134,141 **** get slightly the wrong idea. In the interest of not reinventing the wheel, we will refer you to the introduction to the functor concept written by SGI as part of their STL, in ! their ! http://www.sgi.com/Technology/STL/functors.html.

        Return to top of page or to the FAQ. --- 134,141 ---- get slightly the wrong idea. In the interest of not reinventing the wheel, we will refer you to the introduction to the functor concept written by SGI as part of their STL, in ! their ! http://www.sgi.com/tech/stl/functors.html.

        Return to top of page or to the FAQ. diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/22_locale/messages.html gcc-3.1/libstdc++-v3/docs/html/22_locale/messages.html *** gcc-3.0.4/libstdc++-v3/docs/html/22_locale/messages.html Fri Oct 19 20:07:37 2001 --- gcc-3.1/libstdc++-v3/docs/html/22_locale/messages.html Thu Jan 31 00:24:56 2002 *************** correspond to three protected virtual me *** 39,45 **** The public member functions are:

        ! catalog open(const basic_string&, const locale&) const

        string_type get(catalog, int, int, const string_type&) const --- 39,45 ---- The public member functions are:

        ! catalog open(const string&, const locale&) const

        string_type get(catalog, int, int, const string_type&) const *************** The public member functions are: *** 51,57 **** While the virtual functions are:

        ! catalog do_open(const basic_string&, const locale&) const

        -1- Returns: A value that may be passed to get() to retrieve a --- 51,57 ---- While the virtual functions are:

        ! catalog do_open(const string&, const locale&) const

        -1- Returns: A value that may be passed to get() to retrieve a *************** documentation. Here's an idea of what is *** 251,276 ****
      • message converting, simple example using the GNU model.
          #include 
          
          void test01()
          {
        !   using namespace std;
        !   typedef std::messages::catalog catalog;
        ! 
        !   // Set to the root directory of the libstdc++.mo catalogs.
        !   const char* dir = LOCALEDIR;
        !   locale loc_de("de_DE");
        ! 
        !   // Cache the messages facet.
            const messages& mssg_de = use_facet >(loc_de); 
          
        !   // Check German (de_DE) locale.
        !   catalog cat_de = mssg_de.open("libstdc++", loc_c, dir);
            string s01 = mssg_de.get(cat_de, 0, 0, "please");
            string s02 = mssg_de.get(cat_de, 0, 0, "thank you");
        !   // s01 == "bitte" 
        !   // s02 == "danke" 
            mssg_de.close(cat_de);
          }
          
        --- 251,273 ----
      • message converting, simple example using the GNU model.
        + #include 
          #include 
        + using namespace std;
          
          void test01()
          {
        !   typedef messages::catalog catalog;
        !   const char* dir =
        !   "/mnt/egcs/build/i686-pc-linux-gnu/libstdc++-v3/po/share/locale";  
        !   const locale loc_de("de_DE");
            const messages& mssg_de = use_facet >(loc_de); 
          
        !   catalog cat_de = mssg_de.open("libstdc++", loc_de, dir);
            string s01 = mssg_de.get(cat_de, 0, 0, "please");
            string s02 = mssg_de.get(cat_de, 0, 0, "thank you");
        !   cout << "please in german:" << s01 << '\n';
        !   cout << "thank you in german:" << s02 << '\n';
            mssg_de.close(cat_de);
          }
          
        diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/23_containers/howto.html gcc-3.1/libstdc++-v3/docs/html/23_containers/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/23_containers/howto.html Thu Dec 13 23:28:29 2001 --- gcc-3.1/libstdc++-v3/docs/html/23_containers/howto.html Mon Jan 28 22:13:05 2002 *************** *** 26,31 **** --- 26,32 ----
      • Containers and multithreading
      • "Hinting" during insertion
      • Bitmasks and string arguments +
      • std::list::size() is O(n)!
        *************** *** 392,398 ****

        Return to top of page or to the FAQ.

        ! --- 393,437 ----

        Return to top of page or to the FAQ.

        ! !
        !

        std::list::size() is O(n)!

        !

        Yes it is, and that's okay. This is a decision that we preserved when ! we imported SGI's STL implementation. The following is quoted from ! their FAQ: !

        !

        The size() member function, for list and slist, takes time ! proportional to the number of elements in the list. This was a ! deliberate tradeoff. The only way to get a constant-time size() for ! linked lists would be to maintain an extra member variable containing ! the list's size. This would require taking extra time to update that ! variable (it would make splice() a linear time operation, for example), ! and it would also make the list larger. Many list algorithms don't ! require that extra word (algorithms that do require it might do better ! with vectors than with lists), and, when it is necessary to maintain ! an explicit size count, it's something that users can do themselves. !

        !

        This choice is permitted by the C++ standard. The standard says that ! size() "should" be constant time, and "should" ! does not mean the same thing as "shall". This is the ! officially recommended ISO wording for saying that an implementation ! is supposed to do something unless there is a good reason not to. !

        !

        One implication of linear time size(): you should never write !

        !          if (L.size() == 0)
        !              ...
        ! Instead, you should write !
        !          if (L.empty())
        !              ...
        !

        !
        !

        !

        Return to top of page or ! to the FAQ. !

        ! diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/27_io/howto.html gcc-3.1/libstdc++-v3/docs/html/27_io/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/27_io/howto.html Thu Dec 13 23:28:32 2001 --- gcc-3.1/libstdc++-v3/docs/html/27_io/howto.html Wed May 1 22:58:58 2002 *************** *** 328,335 ****

        Deriving a stream buffer

        Creating your own stream buffers for I/O can be remarkably easy. If you are interested in doing so, we highly recommend two very ! excellent books: Standard C++ IOStreams and Locales by ! Langer and Kreft, ISBN 0-201-18395-1, and The C++ Standard Library by Nicolai Josuttis, ISBN 0-201-37926-0. Both are published by Addison-Wesley, who isn't paying us a cent for saying that, honest. --- 328,336 ----

        Deriving a stream buffer

        Creating your own stream buffers for I/O can be remarkably easy. If you are interested in doing so, we highly recommend two very ! excellent books: ! Standard C++ ! IOStreams and Locales by Langer and Kreft, ISBN 0-201-18395-1, and The C++ Standard Library by Nicolai Josuttis, ISBN 0-201-37926-0. Both are published by Addison-Wesley, who isn't paying us a cent for saying that, honest. *************** *** 376,382 **** return 0; } ! Try it yourself!


        --- 377,384 ---- return 0; } ! Try it yourself! More examples can be found in 3.1.x code, in ! include/ext/*_filebuf.h.


        *************** *** 431,438 **** The upside is that correctness is ensured. The downside is that writing through cout can quite easily lead to awful performance when the C++ I/O library is layered on top of the C I/O ! library (as it is for 3.0 by default). Some patches are in the ! works which should improve the situation for 3.1.

        However, the C and C++ standard streams only need to be kept in sync when both libraries' facilities are in use. If your program only uses --- 433,440 ---- The upside is that correctness is ensured. The downside is that writing through cout can quite easily lead to awful performance when the C++ I/O library is layered on top of the C I/O ! library (as it is for 3.0 by default). Some patches have been applied ! which improve the situation for 3.1.

        However, the C and C++ standard streams only need to be kept in sync when both libraries' facilities are in use. If your program only uses *************** *** 446,452 ****

        You must do this before performing any I/O via the C++ stream objects. Once you call this, the C++ streams will operate independently of the ! (unused) C streams. For GCC 3.0, this means that cout and company will become fully buffered on their own.

        Note, by the way, that the synchronization requirement only applies to --- 448,454 ----

        You must do this before performing any I/O via the C++ stream objects. Once you call this, the C++ streams will operate independently of the ! (unused) C streams. For GCC 3.x, this means that cout and company will become fully buffered on their own.

        Note, by the way, that the synchronization requirement only applies to diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/Makefile gcc-3.1/libstdc++-v3/docs/html/Makefile *** gcc-3.0.4/libstdc++-v3/docs/html/Makefile Thu Dec 13 23:28:17 2001 --- gcc-3.1/libstdc++-v3/docs/html/Makefile Wed Mar 27 22:38:37 2002 *************** *** 2,8 **** MAKEINFO=makeinfo INC=../../../gcc/doc/include ! all: faq/index.txt 17_intro/porting.html faq/index.txt: faq/index.html --- 2,8 ---- MAKEINFO=makeinfo INC=../../../gcc/doc/include ! all: faq/index.txt 17_intro/porting.html 17_intro/porting-howto.html faq/index.txt: faq/index.html *************** faq/index.txt: faq/index.html *** 11,13 **** --- 11,17 ---- 17_intro/porting.html: 17_intro/porting.texi ${MAKEINFO} -I ${INC} --html --no-split $< -o $@ + # known to work under RH; this can be cleaned up later if needed + 17_intro/porting-howto.html: 17_intro/porting-howto.xml + xltproc -o $@ /usr/share/xml/docbook/xsl-stylesheets-1.48-2/html/docbook.xsl $< + diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/configopts.html gcc-3.1/libstdc++-v3/docs/html/configopts.html *** gcc-3.0.4/libstdc++-v3/docs/html/configopts.html Fri Oct 19 20:07:34 2001 --- gcc-3.1/libstdc++-v3/docs/html/configopts.html Mon Mar 11 21:12:59 2002 *************** options *** 63,69 ****

        --enable-cstdio=LIB

        Select a target-specific I/O package. As of libstdc++-v3 ! snapshot 2.91, the choices are 'libio' to specify the GNU I/O package (from glibc, the GNU C library), or 'stdio' to use a generic "C" --- 63,69 ----

        --enable-cstdio=LIB

        Select a target-specific I/O package. As of libstdc++-v3 ! snapshot 3.0.96, the choices are 'libio' to specify the GNU I/O package (from glibc, the GNU C library), or 'stdio' to use a generic "C" *************** options *** 85,92 ****

        --enable-clocale=MODEL

        Select a target-specific underlying locale package. The ! choices are 'ieee_1003.1' to specify an X/Open, Standard Unix ! (IEEE Std. 1003.1-200x) model based on langinfo/iconv/catgets, 'gnu' to specify a model based on functionality from the GNU C library (langinfo/iconv/gettext) (from glibc, the GNU C --- 85,92 ----

        --enable-clocale=MODEL

        Select a target-specific underlying locale package. The ! choices are 'ieee_1003.1-2001' to specify an X/Open, Standard Unix ! (IEEE Std. 1003.1-2001) model based on langinfo/iconv/catgets, 'gnu' to specify a model based on functionality from the GNU C library (langinfo/iconv/gettext) (from glibc, the GNU C *************** options *** 135,153 ****

        --enable-threads=LIB !

        Select a threading library. As of libstdc++-v3 snapshot 2.91, ! the choices are: ! 'yes' for some kind of default (hmmmmm); ! 'decosf1', 'irix', 'mach', 'os2', 'posix'/'pthreads' ! (same thing), ! 'solaris', 'win32', 'dce', or 'vxworks' to select the ! corresponding interface; ! and 'single', 'no', or 'none' for the null-case, ! single-threaded library. !

        !

        All of this is currently undergoing a lot of changes. As of ! 2.91, 'single' and 'posix' are the only implemented ! models. Default is single.

        --enable-version-specific-runtime-libs --- 135,143 ----

        --enable-threads=LIB !

        Select a threading library. A full description is given in the ! general compiler ! configuration instructions.

        --enable-version-specific-runtime-libs *************** options *** 204,209 **** --- 194,216 ---- porting steps, but builds only a subset of what is required by ISO. By default, this option is on.

        + +
        --enable-concept-checks +

        This turns on additional compile-time checks for instantiated + library templates, in the form of specialized templates, + described here. They + can help users discover when they break the rules of the STL, before + their programs run. +

        + +
        --enable-symvers[=style] +

        In 3.1, tries to turn on symbol versioning in the shared library (if a + shared library has been requested). The only 'style' currently + supported is 'gnu' which requires that a recent version of the GNU + linker be in use. With no style given, the configure script will + try to guess if the 'gnu' style can be used, and if so, will turn it + on. Hopefully people will volunteer to do other 'style' options. +

        Return to the top of the page or diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/documentation.html gcc-3.1/libstdc++-v3/docs/html/documentation.html *** gcc-3.0.4/libstdc++-v3/docs/html/documentation.html Thu Dec 13 23:28:17 2001 --- gcc-3.1/libstdc++-v3/docs/html/documentation.html Mon May 6 11:44:55 2002 *************** *** 20,38 **** using the Doxygen tool. These are useful for examining the signatures of public member functions for the library classes, etc.

        !

        ! The latest collection is for the GCC 3.0 release, ! libstdc++-doxygen-3.0.tar.gz (3.8MB), ! viewable online. ! The collection is also available in the libstdc++ snapshots directory at ! <URL:ftp://gcc.gnu.org/pub/gcc/libstdc++/>. You will ! almost certainly need to use one of the mirror sites to download ! the tarball. After unpacking, simply load ! libstdc++-doxygen-3.0/index.html ! in a browser. Feedback (and additional documentation!) is welcome.

        -

        Configuring, Building, Installing

        --- 20,47 ---- using the Doxygen tool. These are useful for examining the signatures of public member functions for the library classes, etc.

        !

        The collections are available in the libstdc++ snapshots directory at ! <URL:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/>. ! You will almost certainly need to use one of the mirror sites to download ! the tarball. After unpacking, simply load libstdc++-html-*/index.html ! into a browser. Feedback (and additional documentation!) is welcome. !

        !

        The available user-level collections are also viewable online: !

        ! Other collections (man pages, maintainer docs) are only available on the ! FTP sites. !

        ! !

        Beginning with 3.0.95, an initial set of man pages are also available in ! the same place as the HTML collections. Start with Intro(3).


        Configuring, Building, Installing

        *************** *** 43,51 ****

        Introductory notes for libstdc++

        !

        This is a short list of text files pertaining to this ! implementation of ISO 14882. A brief description follows the name ! of the file.

          --- 52,59 ----

          Introductory notes for libstdc++

          !

          This is a short list of text files pertaining to this implementation of ! ISO 14882. A brief description follows the name of the file.

            diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/ext/howto.html gcc-3.1/libstdc++-v3/docs/html/ext/howto.html *** gcc-3.0.4/libstdc++-v3/docs/html/ext/howto.html Thu Dec 13 23:28:34 2001 --- gcc-3.1/libstdc++-v3/docs/html/ext/howto.html Wed May 1 22:58:58 2002 *************** *** 118,125 ****
          • The extensions added by SGI are so numerous that they have their own page. Since the SGI STL is no longer actively maintained, we will try and keep this code working ! ourselves. !
          • filebufs have another ctor with this signature:
            basic_filebuf(__c_file_type*, ios_base::openmode, int_type);
            This comes in very handy in a number of places, such as attaching Unix sockets, pipes, and anything else which uses file --- 118,125 ----
          • The extensions added by SGI are so numerous that they have their own page. Since the SGI STL is no longer actively maintained, we will try and keep this code working ! ourselves.
          • !
          • 3.0.x filebufs have another ctor with this signature:
            basic_filebuf(__c_file_type*, ios_base::openmode, int_type);
            This comes in very handy in a number of places, such as attaching Unix sockets, pipes, and anything else which uses file *************** *** 131,140 ****
          • ios_base::openmode M // same as all the other uses of openmode
          • int_type B ! // buffer size, defaults to BUFSIZ
          For those wanting to use file descriptors instead of FILE*'s, I invite you to contemplate the mysteries of C's fdopen().

        Return to top of page or --- 131,152 ----

      • ios_base::openmode M // same as all the other uses of openmode
      • int_type B ! // buffer size, defaults to BUFSIZ if not specified For those wanting to use file descriptors instead of FILE*'s, I invite you to contemplate the mysteries of C's fdopen(). +
      • +
      • In library snapshot 3.0.95 and later, filebufs bring + back an old extension: the fd() member function. The + integer returned from this function can be used for whatever file + descriptors can be used for on your platform. Naturally, the + library cannot track what you do on your own with a file descriptor, + so if you perform any I/O directly, don't expect the library to be + aware of it. +
      • Beginning with 3.1, the extra filebuf constructor and + the fd() function were removed from the standard + filebuf. Instead, <ext/stdio_filebuf.h> contains + a derived class called __gnu_cxx::stdio_filebuf.

        Return to top of page or *************** *** 188,195 **** program: when your program's std::vector<int> gets cut in half and frees a bunch of its storage, that memory can be reused by the private std::list<WonkyWidget> brought in from a KDE library ! that you linked against. And we don't have to call operator's new and ! delete to pass the memory on, ether, which is a speed bonus. BUT...

        What about threads? No problem: in a threadsafe environment, the --- 200,207 ---- program: when your program's std::vector<int> gets cut in half and frees a bunch of its storage, that memory can be reused by the private std::list<WonkyWidget> brought in from a KDE library ! that you linked against. And we don't have to call operators new and ! delete to pass the memory on, either, which is a speed bonus. BUT...

        What about threads? No problem: in a threadsafe environment, the *************** *** 218,224 **** (If you decide to be unportable, then you're free do do what you want, but it's not our fault if stuff breaks.) They are presented here for information for maintainers and contributors in addition to users, but ! we will probably make them available for users in 3.1 somehow.

        These classes are always available:

          --- 230,236 ---- (If you decide to be unportable, then you're free do do what you want, but it's not our fault if stuff breaks.) They are presented here for information for maintainers and contributors in addition to users, but ! we will probably make them available for users in 3.2 somehow.

          These classes are always available:

            diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/ext/sgiexts.html gcc-3.1/libstdc++-v3/docs/html/ext/sgiexts.html *** gcc-3.0.4/libstdc++-v3/docs/html/ext/sgiexts.html Thu Dec 13 23:28:39 2001 --- gcc-3.1/libstdc++-v3/docs/html/ext/sgiexts.html Wed Nov 28 00:02:04 2001 *************** libstdc++-v3 *** 25,31 **** for a description). Not every chapter may have extensions, and the extensions may come and go. Also, this page is incomplete because the author is pressed for time. Check back often; the latest change was on ! $Date: 2001/12/13 23:28:39 $ (UTC).

            Descriptions range from the scanty to the verbose. You should also check --- 25,31 ---- for a description). Not every chapter may have extensions, and the extensions may come and go. Also, this page is incomplete because the author is pressed for time. Check back often; the latest change was on ! $Date: 2001/11/28 00:02:04 $ (UTC).

            Descriptions range from the scanty to the verbose. You should also check diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/faq/index.html gcc-3.1/libstdc++-v3/docs/html/faq/index.html *** gcc-3.0.4/libstdc++-v3/docs/html/faq/index.html Thu Dec 13 23:28:40 2001 --- gcc-3.1/libstdc++-v3/docs/html/faq/index.html Thu May 2 21:22:14 2002 *************** *** 7,13 **** --- 7,13 ---- *************** *** 15,22 ****

            libstdc++ Frequently Asked Questions

            The latest version of this document is always available at ! ! http://gcc.gnu.org/onlinedocs/libstdc++/faq/.

            To the libstdc++-v3 homepage. --- 15,26 ----

            libstdc++ Frequently Asked Questions

            The latest version of this document is always available at ! ! http://gcc.gnu.org/onlinedocs/libstdc++/faq/. The main documentation ! page is at ! ! http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html. !

            To the libstdc++-v3 homepage. *************** http://gcc.gnu.org/onlinedocs/libstdc++/ *** 53,60 ****

          • Can libstdc++-v3 be used with <my favorite compiler>?
          • [removed] !
          • Building under DEC OSF kills the assembler
          • I can't use 'long long' on Solaris
          • Known Bugs and Non-Bugs --- 57,67 ----
          • Can libstdc++-v3 be used with <my favorite compiler>?
          • [removed] !
          • [removed]
          • I can't use 'long long' on Solaris +
          • _XOPEN_SOURCE / + _GNU_SOURCE / etc is always defined +
          • OS X ctype.h is broken! How can I hack it?
          • Known Bugs and Non-Bugs *************** http://gcc.gnu.org/onlinedocs/libstdc++/ *** 62,79 ****
          • What works already?
          • Bugs in gcc/g++ (not libstdc++-v3)
          • Bugs in the C++ language/lib specification !
          • Things in libstdc++ that look like bugs !
          • Aw, that's easy to fix! --- 69,87 ----
          • What works already?
          • Bugs in gcc/g++ (not libstdc++-v3)
          • Bugs in the C++ language/lib specification !
          • Things in libstdc++ that only look like bugs
          • Aw, that's easy to fix! *************** http://gcc.gnu.org/onlinedocs/libstdc++/ *** 105,111 **** library reaches stable plateaus, it is captured in a snapshot and released. The current release is the ! eleventh snapshot. For those who want to see exactly how far the project has come, or just want the latest bleeding-edge code, the up-to-date source is available over anonymous CVS, and can even be browsed over the Web (see below). --- 113,119 ---- library reaches stable plateaus, it is captured in a snapshot and released. The current release is the ! fourteenth snapshot. For those who want to see exactly how far the project has come, or just want the latest bleeding-edge code, the up-to-date source is available over anonymous CVS, and can even be browsed over the Web (see below). *************** http://gcc.gnu.org/onlinedocs/libstdc++/ *** 134,140 **** has recently been taken over by the GCC team. All of the rapid development and near-legendary ! portability that are the hallmarks of an open-source project are being applied to libstdc++.

            --- 142,148 ---- has recently been taken over by the GCC team. All of the rapid development and near-legendary ! portability that are the hallmarks of an open-source project are being applied to libstdc++.

            *************** http://gcc.gnu.org/onlinedocs/libstdc++/ *** 161,169 ****

            1.4 How do I get libstdc++?

            !

            The eleventh (and latest) snapshot of libstdc++-v3 is available via ! ftp. The filename is libstdc++-2.92.tar.gz.

            The homepage has instructions for retrieving the latest CVS sources, and for --- 169,177 ----


            1.4 How do I get libstdc++?

            !

            The fourteenth (and latest) snapshot of libstdc++-v3 is available via ! ftp.

            The homepage has instructions for retrieving the latest CVS sources, and for *************** which is no longer available, thanks dej *** 407,424 ****


            !

            3.3 Building DEC OSF kills the assembler

            !

            The atomicity.h header for the Alpha processor ! currently uses pseudo-operators which the DEC assembler ! doesn't understand (in particular, .subsection and .previous). ! The simple solution is to install GNU as and arrange ! for the GCC build to use it (or merge the sources and build ! it during the bootstrap). !

            !

            Anyone who ! knows ! the DEC assembler well enough to provide the equivalent of ! these two pseudos would win praise and accolades from many.


            --- 415,423 ----


            !

            3.3 [removed]

            !

            This question has become moot and has been removed. The stub ! is here to preserve numbering (and hence links/bookmarks).


            *************** which is no longer available, thanks dej *** 434,439 **** --- 433,484 ----


            +

            3.5 _XOPEN_SOURCE / _GNU_SOURCE + / etc is always defined

            +

            On Solaris, g++ (but not gcc) always defines the preprocessor + macro _XOPEN_SOURCE. On GNU/Linux, the same happens + with _GNU_SOURCE. (This is not an exhaustive list; + other macros and other platforms are also affected.) +

            +

            These macros are typically used in C library headers, guarding new + versions of functions from their older versions. The C++ standard + library includes the C standard library, but it requires the C90 + version, which for backwards-compatability reasons is often not the + default for many vendors. +

            +

            More to the point, the C++ standard requires behavior which is only + available on certain platforms after certain symbols are defined. + Usually the issue involves I/O-related typedefs. In order to + ensure correctness, the compiler simply predefines those symbols. +

            +

            Note that it's not enough to #define them only when the library is + being built (during installation). Since we don't have an 'export' + keyword, much of the library exists as headers, which means that + the symbols must also be defined as your programs are parsed and + compiled. +

            +

            To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in + the gcc config headers for your target (and try changing them to + see what happens when building complicated code). You can also run + "g++ -E -dM - < /dev/null" to display + a list of predefined macros for any particular installation. +

            +

            This has been discussed on the mailing lists + quite a bit. +

            +

            This method is something of a wart. We'd like to find a cleaner + solution, but nobody yet has contributed the time. +

            + +
            +

            3.6 OS X ctype.h is broken! How can I hack it?

            +

            This is a long-standing bug in the OS X support. Fortunately, + the patch is quite simple, and well-known. + Here's a + link to the solution. +

            + +

            4.0 Known Bugs and Non-Bugs

            Note that this section can get rapdily outdated -- such is the nature of an open-source project. For the latest information, join *************** which is no longer available, thanks dej *** 460,466 ****

            4.1 What works already?

            This is a verbatim clip from the "Status" section ! of the RELEASE-NOTES for the latest snapshot.

            --- 505,512 ----

            4.1 What works already?

            This is a verbatim clip from the "Status" section ! of the RELEASE-NOTES for the latest snapshot. For a list of ! fixed bugs, see that file.

            *************** which is no longer available, thanks dej *** 468,494 ****
              New:
              ---
            ! - preliminary doxygen documentation has been added. Running "make
            !   doxygen" in the libstdc++-v3 build directory will generate HTML
            !   documentation that can be used to cross-reference names and files in
            !   the library.
            ! - a dejagnu based testing framework has been added
            ! - a new implementation of the concept checking code has been ported
            !   from the boost libraries.
            ! - support for -fno-exceptions has been added
            ! - stdexcept was re-written
            ! - using deprecated or antiquated headers now gives a warning
            ! - the stdio interface to iostreams has been tweaked, and now works
            !   with synchronized c/c++ io
            ! - new libsupc++ routines implementing the IA-64 C++ ABI.
            ! - HPUX configuration files
            ! - support for AIX added
            ! - a lot of bugs were fixed.
            ! - preliminary named locales implemented
            ! - portability improvements made to generation of <limits>
            ! - speedups to improve configuration time.
            ! - DJGPP support added.
            ! - support for dlopening shared libstdc++
              
            --- 514,562 ----
              New:
              ---
            ! (post 3.0.97)
            ! - more doxygen documentation
            ! - more named locale fixups
            ! - stdio_filebuf that takes fd, FILE
            ! - io performance tuning
            ! - allocation tuning, valgrind fixups
            ! - __cxa_demangle now supported
            ! (3.0.97)
            ! - more doxygen documentation.
            ! - more named locale bug fixes
            ! - support for symbol versioning when using GNU ld >= 2.12
            ! - wide-io
            ! - tuning for executable size
            ! (3.0.96)
            ! - more doxygen documentation.
            ! - extensions moved out of namespace std
            ! - HPUX long long support
            ! - more string optimizations
            ! - support for NetBSD cross compiles
            ! - concept_check merge from boost
            ! - header simplification
            ! - named locale bug shakeout
            ! - thread testsuite
            ! (3.0.95)
            ! - add S390, m68k, x86-64 support.
            ! - doxygen documentation has been extended, including man pages.
            ! - verbose terminate handling has been added.
            ! - some libsupc++ tweaks
            ! - warnings for deprecated headers now active.
            ! - dejagnu testsuite preliminary documentation.
            ! - dejagnu testsuite default.
            ! - dejagnu testsuite cross compiler, multilib safe.
            ! - long long iostreams on by default, rework of ISO C99 support.
            ! - iterator re-write and testsuites.
            ! - container testsuites.
            ! - allocator revamp and testsuites.
            ! - more concept-checking work.
            ! - basic_string optimization and MT fixes.
            ! - new limits implementation.
            ! - update -fno-exceptions code, verify it works.
            ! - full named locale support fpr all facets, choice of gnu,
            !   ieee_1003.1-200x (POSIX 2), or generic models. Full support depends
            !   on target OS and underlying "C" library support.
              
            *************** New: *** 500,508 **** problems, you can find more information on the libstdc++ and the GCC mailing lists.

              !
            • As of 2.91, these bugs have all been fixed. We look forward ! to new ones, well, not exactly...

            --- 568,588 ---- problems, you can find more information on the libstdc++ and the GCC mailing lists.

            +

            Before reporting a bug, examine the + bugs database with the + category set to "libstdc++". The BUGS file in the source + tree also tracks known serious problems. +

              !
            • Debugging is problematic, due to bugs in line-number generation ! (mostly fixed in the compiler) and gdb lagging behind the ! compiler (lack of personnel). We recommend configuring the ! compiler using --with-dwarf2 if the DWARF2 ! debugging format is not already the default on your platform. ! Also, ! changing your ! GDB settings can have a profound effect on your C++ debugging ! experiences. :-)

            *************** New: *** 525,531 ****


            !

            4.4 Things in libstdc++ that look like bugs

            There are things which are not bugs in the compiler (4.2) nor the language specification (4.3), but aren't really bugs in libstdc++, either. Really! Please do not report these as bugs. --- 605,611 ----


            !

            4.4 Things in libstdc++ that only look like bugs

            There are things which are not bugs in the compiler (4.2) nor the language specification (4.3), but aren't really bugs in libstdc++, either. Really! Please do not report these as bugs. *************** New: *** 537,544 **** libstdc++ "-Weffc++-clean" is not a goal of the project, for a few reasons. Mainly, that option tries to enforce object-oriented programming, while the Standard Library isn't ! necessarily trying to be OO. There are multiple solutions ! under discussion.

            --- 617,623 ---- libstdc++ "-Weffc++-clean" is not a goal of the project, for a few reasons. Mainly, that option tries to enforce object-oriented programming, while the Standard Library isn't ! necessarily trying to be OO.

            *************** New: *** 576,582 **** then you will suddenly be faced with huge numbers of ambiguity errors. This was discussed on the -v3 list; Nathan Myers sums ! things up here.

            The g++-3 headers are --- 655,662 ---- then you will suddenly be faced with huge numbers of ambiguity errors. This was discussed on the -v3 list; Nathan Myers sums ! things up here. The collisions with vector/string iterator ! types have been fixed for 3.1.

            The g++-3 headers are *************** http://clisp.cons.org/~haible/gccinclude *** 636,641 **** --- 716,739 ---- here.

            + +

            dlopen/dlsym + If you are using the C++ library across dynamically-loaded + objects, make certain that you are passing the correct options + when compiling and linking: +

            +     // compile the library components
            +     g++ -fPIC -c a.cc
            +     g++ -fPIC -c b.cc
            +     ...
            +     g++ -fPIC -c z.cc
            + 
            +     // create the library
            +     g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o
            + 
            +     // link the executable
            +     g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl

            +

            4.5 Aw, that's easy to fix!

            *************** http://clisp.cons.org/~haible/gccinclude *** 699,705 **** expansion in container classes and buffer usage in synchronized stream objects.

            !
          • An ABI for libstdc++ will eventually be developed, so that multiple binary-incompatible copies of the library can be replaced with a single backwards-compatible library, like libgcc_s.so is.

            --- 797,803 ---- expansion in container classes and buffer usage in synchronized stream objects.

            !
          • An ABI for libstdc++ is being developed, so that multiple binary-incompatible copies of the library can be replaced with a single backwards-compatible library, like libgcc_s.so is.

            diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/faq/index.txt gcc-3.1/libstdc++-v3/docs/html/faq/index.txt *** gcc-3.0.4/libstdc++-v3/docs/html/faq/index.txt Thu Dec 13 23:28:40 2001 --- gcc-3.1/libstdc++-v3/docs/html/faq/index.txt Thu May 2 21:22:14 2002 *************** *** 2,58 **** libstdc++ Frequently Asked Questions The latest version of this document is always available at ! [1]http://gcc.gnu.org/onlinedocs/libstdc++/faq/. ! To the [2]libstdc++-v3 homepage. _________________________________________________________________ Questions ! 1. [3]General Information ! 1. [4]What is libstdc++-v3? ! 2. [5]Why should I use libstdc++? ! 3. [6]Who's in charge of it? ! 4. [7]How do I get libstdc++? ! 5. [8]When is libstdc++ going to be finished? ! 6. [9]How do I contribute to the effort? ! 7. [10]What happened to libg++? I need that! ! 8. [11]What if I have more questions? ! 9. [12]What are the license terms for libstdc++-v3? ! 2. [13]Installation ! 1. [14]How do I install libstdc++-v3? ! 2. [15][removed] ! 3. [16]What is this CVS thing that you keep mentioning? ! 4. [17]How do I know if it works? ! 5. [18]This library is HUGE! And what's libsupc++? ! 3. [19]Platform-Specific Issues ! 1. [20]Can libstdc++-v3 be used with ? ! 2. [21][removed] ! 3. [22]Building under DEC OSF kills the assembler ! 4. [23]I can't use 'long long' on Solaris ! 4. [24]Known Bugs and Non-Bugs ! 1. [25]What works already? ! 2. [26]Bugs in gcc/g++ (not libstdc++-v3) ! 3. [27]Bugs in the C++ language/lib specification ! 4. [28]Things in libstdc++ that look like bugs ! o [29]reopening a stream fails ! o [30]-Weffc++ complains too much ! o [31]"ambiguous overloads" after including an old-style header ! o [32]The g++-3 headers are not ours ! o [33]compilation errors from streambuf.h ! o [34]errors about *Cconcept and constraints in the STL... ! 5. [35]Aw, that's easy to fix! ! 5. [36]Miscellaneous ! 1. [37]string::iterator is not char*; vector::iterator is not T* ! 2. [38]What's next after libstdc++-v3? ! 3. [39]What about the STL from SGI? ! 4. [40]Extensions and Backward Compatibility ! 5. [41][removed] ! 6. [42]Is libstdc++-v3 thread-safe? ! 7. [43]How do I get a copy of the ISO C++ Standard? ! 8. [44]What's an ABI and why is it so messy? _________________________________________________________________ 1.0 General Information --- 2,64 ---- libstdc++ Frequently Asked Questions The latest version of this document is always available at ! [1]http://gcc.gnu.org/onlinedocs/libstdc++/faq/. The main ! documentation page is at ! [2]http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html. ! To the [3]libstdc++-v3 homepage. _________________________________________________________________ Questions ! 1. [4]General Information ! 1. [5]What is libstdc++-v3? ! 2. [6]Why should I use libstdc++? ! 3. [7]Who's in charge of it? ! 4. [8]How do I get libstdc++? ! 5. [9]When is libstdc++ going to be finished? ! 6. [10]How do I contribute to the effort? ! 7. [11]What happened to libg++? I need that! ! 8. [12]What if I have more questions? ! 9. [13]What are the license terms for libstdc++-v3? ! 2. [14]Installation ! 1. [15]How do I install libstdc++-v3? ! 2. [16][removed] ! 3. [17]What is this CVS thing that you keep mentioning? ! 4. [18]How do I know if it works? ! 5. [19]This library is HUGE! And what's libsupc++? ! 3. [20]Platform-Specific Issues ! 1. [21]Can libstdc++-v3 be used with ? ! 2. [22][removed] ! 3. [23][removed] ! 4. [24]I can't use 'long long' on Solaris ! 5. [25]_XOPEN_SOURCE / _GNU_SOURCE / etc is always defined ! 6. [26]OS X ctype.h is broken! How can I hack it? ! 4. [27]Known Bugs and Non-Bugs ! 1. [28]What works already? ! 2. [29]Bugs in gcc/g++ (not libstdc++-v3) ! 3. [30]Bugs in the C++ language/lib specification ! 4. [31]Things in libstdc++ that only look like bugs ! o [32]reopening a stream fails ! o [33]-Weffc++ complains too much ! o [34]"ambiguous overloads" after including an old-style header ! o [35]The g++-3 headers are not ours ! o [36]compilation errors from streambuf.h ! o [37]errors about *Cconcept and constraints in the STL... ! o [38]program crashes when using library code in a ! dynamically-loaded library ! 5. [39]Aw, that's easy to fix! ! 5. [40]Miscellaneous ! 1. [41]string::iterator is not char*; vector::iterator is not T* ! 2. [42]What's next after libstdc++-v3? ! 3. [43]What about the STL from SGI? ! 4. [44]Extensions and Backward Compatibility ! 5. [45][removed] ! 6. [46]Is libstdc++-v3 thread-safe? ! 7. [47]How do I get a copy of the ISO C++ Standard? ! 8. [48]What's an ABI and why is it so messy? _________________________________________________________________ 1.0 General Information *************** *** 62,79 **** The GNU Standard C++ Library v3 is an ongoing project to implement the ISO 14882 Standard C++ library as described in chapters 17 through 27 and annex D. As the library reaches stable plateaus, it is captured in ! a snapshot and released. The current release is [45]the eleventh snapshot. For those who want to see exactly how far the project has come, or just want the latest bleeding-edge code, the up-to-date source is available over anonymous CVS, and can even be browsed over the Web (see below). The older libstdc++-v2 project is no longer maintained; the code has ! been completely replaced and rewritten. [46]If you are using V2, then you need to report bugs to your system vendor, not to the V3 list. A more formal description of the V3 goals can be found in the official ! [47]design document. _________________________________________________________________ 1.2 Why should I use libstdc++? --- 68,85 ---- The GNU Standard C++ Library v3 is an ongoing project to implement the ISO 14882 Standard C++ library as described in chapters 17 through 27 and annex D. As the library reaches stable plateaus, it is captured in ! a snapshot and released. The current release is [49]the fourteenth snapshot. For those who want to see exactly how far the project has come, or just want the latest bleeding-edge code, the up-to-date source is available over anonymous CVS, and can even be browsed over the Web (see below). The older libstdc++-v2 project is no longer maintained; the code has ! been completely replaced and rewritten. [50]If you are using V2, then you need to report bugs to your system vendor, not to the V3 list. A more formal description of the V3 goals can be found in the official ! [51]design document. _________________________________________________________________ 1.2 Why should I use libstdc++? *************** *** 86,93 **** The GNU C/C++/FORTRAN/ compiler (gcc, g++, etc) is widely considered to be one of the leading compilers in the world. Its ! development has recently been taken over by the [48]GCC team. All of ! the rapid development and near-legendary [49]portability that are the hallmarks of an open-source project are being applied to libstdc++. That means that all of the Standard classes and functions (such as --- 92,99 ---- The GNU C/C++/FORTRAN/ compiler (gcc, g++, etc) is widely considered to be one of the leading compilers in the world. Its ! development has recently been taken over by the [52]GCC team. All of ! the rapid development and near-legendary [53]portability that are the hallmarks of an open-source project are being applied to libstdc++. That means that all of the Standard classes and functions (such as *************** *** 105,120 **** Development and discussion is held on the libstdc++ mailing list. Subscribing to the list, or searching the list archives, is open to ! everyone. You can read instructions for doing so on the [50]homepage. If you have questions, ideas, code, or are just curious, sign up! _________________________________________________________________ 1.4 How do I get libstdc++? ! The eleventh (and latest) snapshot of libstdc++-v3 is [51]available ! via ftp. The filename is libstdc++-2.92.tar.gz. ! The [52]homepage has instructions for retrieving the latest CVS sources, and for browsing the CVS sources over the web. The subset commonly known as the Standard Template Library (chapters --- 111,126 ---- Development and discussion is held on the libstdc++ mailing list. Subscribing to the list, or searching the list archives, is open to ! everyone. You can read instructions for doing so on the [54]homepage. If you have questions, ideas, code, or are just curious, sign up! _________________________________________________________________ 1.4 How do I get libstdc++? ! The fourteenth (and latest) snapshot of libstdc++-v3 is [55]available ! via ftp. ! The [56]homepage has instructions for retrieving the latest CVS sources, and for browsing the CVS sources over the web. The subset commonly known as the Standard Template Library (chapters *************** *** 130,136 **** 1.6 How do I contribute to the effort? ! Here is [53]a page devoted to this topic. Subscribing to the mailing list (see above, or the homepage) is a very good idea if you have something to contribute, or if you have spare time and want to help. Contributions don't have to be in the form of source code; anybody who --- 136,142 ---- 1.6 How do I contribute to the effort? ! Here is [57]a page devoted to this topic. Subscribing to the mailing list (see above, or the homepage) is a very good idea if you have something to contribute, or if you have spare time and want to help. Contributions don't have to be in the form of source code; anybody who *************** *** 165,175 **** extracted into an updated utilities library, but nobody has stated such a project yet. ! (The [54]Boost site houses free C++ libraries that do varying things, and happened to be started by members of the Standards Committee. Certain "useful stuff" classes will probably migrate there.) ! For the bold and/or desperate, the [55]GCC FAQ describes where to find the last libg++ source. _________________________________________________________________ --- 171,181 ---- extracted into an updated utilities library, but nobody has stated such a project yet. ! (The [58]Boost site houses free C++ libraries that do varying things, and happened to be started by members of the Standards Committee. Certain "useful stuff" classes will probably migrate there.) ! For the bold and/or desperate, the [59]GCC FAQ describes where to find the last libg++ source. _________________________________________________________________ *************** *** 179,194 **** remains unanswered, then just ask the mailing list. At present, you do not need to be subscribed to the list to send a message to it. More information is available on the homepage (including how to browse the ! list archives); to send to the list, use [56]libstdc++@gcc.gnu.org. If you have a question that you think should be included here, or if ! you have a question about a question/answer here, contact [57]Phil ! Edwards or [58]Gabriel Dos Reis. _________________________________________________________________ 1.9 What are the license terms for libstdc++-v3? ! See [59]our license description for these and related questions. _________________________________________________________________ 2.0 Installation --- 185,200 ---- remains unanswered, then just ask the mailing list. At present, you do not need to be subscribed to the list to send a message to it. More information is available on the homepage (including how to browse the ! list archives); to send to the list, use [60]libstdc++@gcc.gnu.org. If you have a question that you think should be included here, or if ! you have a question about a question/answer here, contact [61]Phil ! Edwards or [62]Gabriel Dos Reis. _________________________________________________________________ 1.9 What are the license terms for libstdc++-v3? ! See [63]our license description for these and related questions. _________________________________________________________________ 2.0 Installation *************** *** 205,217 **** * The GNU Autotools are needed if you are messing with the configury or makefiles. ! The file [60]documentation.html provides a good overview of the steps necessary to build, install, and use the library. Instructions for configuring the library with new flags such as --enable-threads are there also, as well as patches and instructions for working with GCC 2.95. ! The top-level install.html and [61]RELEASE-NOTES files contain the exact build and installation instructions. You may wish to browse those files over CVSweb ahead of time to get a feel for what's required. RELEASE-NOTES is located in the ".../docs/17_intro/" --- 211,223 ---- * The GNU Autotools are needed if you are messing with the configury or makefiles. ! The file [64]documentation.html provides a good overview of the steps necessary to build, install, and use the library. Instructions for configuring the library with new flags such as --enable-threads are there also, as well as patches and instructions for working with GCC 2.95. ! The top-level install.html and [65]RELEASE-NOTES files contain the exact build and installation instructions. You may wish to browse those files over CVSweb ahead of time to get a feel for what's required. RELEASE-NOTES is located in the ".../docs/17_intro/" *************** *** 228,235 **** The Concurrent Versions System is one of several revision control packages. It was selected for GNU projects because it's free (speech), ! free (beer), and very high quality. The [62]CVS entry in the GNU ! software catalogue has a better description as well as a [63]link to the makers of CVS. The "anonymous client checkout" feature of CVS is similar to anonymous --- 234,241 ---- The Concurrent Versions System is one of several revision control packages. It was selected for GNU projects because it's free (speech), ! free (beer), and very high quality. The [66]CVS entry in the GNU ! software catalogue has a better description as well as a [67]link to the makers of CVS. The "anonymous client checkout" feature of CVS is similar to anonymous *************** *** 280,286 **** people don't like it, so here are two pseudo-solutions: If the only functions from libstdc++.a which you need are language ! support functions (those listed in [64]clause 18 of the standard, e.g., new and delete), then try linking against libsupc++.a (usually specifying -lsupc++ when calling g++ for the final link step will do it). This library contains only those support routines, one per object --- 286,292 ---- people don't like it, so here are two pseudo-solutions: If the only functions from libstdc++.a which you need are language ! support functions (those listed in [68]clause 18 of the standard, e.g., new and delete), then try linking against libsupc++.a (usually specifying -lsupc++ when calling g++ for the final link step will do it). This library contains only those support routines, one per object *************** *** 328,344 **** to preserve numbering (and hence links/bookmarks). _________________________________________________________________ ! 3.3 Building DEC OSF kills the assembler ! ! The atomicity.h header for the Alpha processor currently uses ! pseudo-operators which the DEC assembler doesn't understand (in ! particular, .subsection and .previous). The simple solution is to ! install GNU as and arrange for the GCC build to use it (or merge the ! sources and build it during the bootstrap). ! Anyone who [65]knows the DEC assembler well enough to provide the ! equivalent of these two pseudos would win praise and accolades from ! many. _________________________________________________________________ 3.4 I can't use 'long long' on Solaris --- 334,343 ---- to preserve numbering (and hence links/bookmarks). _________________________________________________________________ ! 3.3 [removed] ! This question has become moot and has been removed. The stub is here ! to preserve numbering (and hence links/bookmarks). _________________________________________________________________ 3.4 I can't use 'long long' on Solaris *************** *** 353,358 **** --- 352,399 ---- This has been fixed for 3.0.3 and onwards. _________________________________________________________________ + 3.5 _XOPEN_SOURCE / _GNU_SOURCE / etc is always defined + + On Solaris, g++ (but not gcc) always defines the preprocessor macro + _XOPEN_SOURCE. On GNU/Linux, the same happens with _GNU_SOURCE. (This + is not an exhaustive list; other macros and other platforms are also + affected.) + + These macros are typically used in C library headers, guarding new + versions of functions from their older versions. The C++ standard + library includes the C standard library, but it requires the C90 + version, which for backwards-compatability reasons is often not the + default for many vendors. + + More to the point, the C++ standard requires behavior which is only + available on certain platforms after certain symbols are defined. + Usually the issue involves I/O-related typedefs. In order to ensure + correctness, the compiler simply predefines those symbols. + + Note that it's not enough to #define them only when the library is + being built (during installation). Since we don't have an 'export' + keyword, much of the library exists as headers, which means that the + symbols must also be defined as your programs are parsed and compiled. + + To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in the + gcc config headers for your target (and try changing them to see what + happens when building complicated code). You can also run "g++ -E -dM + - < /dev/null" to display a list of predefined macros for any + particular installation. + + This has been discussed on the mailing lists [69]quite a bit. + + This method is something of a wart. We'd like to find a cleaner + solution, but nobody yet has contributed the time. + _________________________________________________________________ + + 3.6 OS X ctype.h is broken! How can I hack it? + + This is a long-standing bug in the OS X support. Fortunately, the + patch is quite simple, and well-known. [70]Here's a link to the + solution. + _________________________________________________________________ + 4.0 Known Bugs and Non-Bugs Note that this section can get rapdily outdated -- such is the nature *************** *** 364,370 **** include/Makefile, resulting in files like gthr.h and gthr-single.h not being found. ! Please read [66]the configuration instructions for GCC, specifically the part about configuring in a separate build directory, and how strongly recommended it is. Building in the source directory is fragile, is rarely tested, and tends to break, as in this case. This --- 405,411 ---- include/Makefile, resulting in files like gthr.h and gthr-single.h not being found. ! Please read [71]the configuration instructions for GCC, specifically the part about configuring in a separate build directory, and how strongly recommended it is. Building in the source directory is fragile, is rarely tested, and tends to break, as in this case. This *************** *** 378,407 **** 4.1 What works already? This is a verbatim clip from the "Status" section of the RELEASE-NOTES ! for the latest snapshot. New: --- ! - preliminary doxygen documentation has been added. Running "make ! doxygen" in the libstdc++-v3 build directory will generate HTML ! documentation that can be used to cross-reference names and files in ! the library. ! - a dejagnu based testing framework has been added ! - a new implementation of the concept checking code has been ported ! from the boost libraries. ! - support for -fno-exceptions has been added ! - stdexcept was re-written ! - using deprecated or antiquated headers now gives a warning ! - the stdio interface to iostreams has been tweaked, and now works ! with synchronized c/c++ io ! - new libsupc++ routines implementing the IA-64 C++ ABI. ! - HPUX configuration files ! - support for AIX added ! - a lot of bugs were fixed. ! - preliminary named locales implemented ! - portability improvements made to generation of ! - speedups to improve configuration time. ! - DJGPP support added. ! - support for dlopening shared libstdc++ _________________________________________________________________ 4.2 Bugs in gcc/g++ (not libstdc++-v3) --- 419,470 ---- 4.1 What works already? This is a verbatim clip from the "Status" section of the RELEASE-NOTES ! for the latest snapshot. For a list of fixed bugs, see that file. New: --- ! (post 3.0.97) ! - more doxygen documentation ! - more named locale fixups ! - stdio_filebuf that takes fd, FILE ! - io performance tuning ! - allocation tuning, valgrind fixups ! - __cxa_demangle now supported ! (3.0.97) ! - more doxygen documentation. ! - more named locale bug fixes ! - support for symbol versioning when using GNU ld >= 2.12 ! - wide-io ! - tuning for executable size ! (3.0.96) ! - more doxygen documentation. ! - extensions moved out of namespace std ! - HPUX long long support ! - more string optimizations ! - support for NetBSD cross compiles ! - concept_check merge from boost ! - header simplification ! - named locale bug shakeout ! - thread testsuite ! (3.0.95) ! - add S390, m68k, x86-64 support. ! - doxygen documentation has been extended, including man pages. ! - verbose terminate handling has been added. ! - some libsupc++ tweaks ! - warnings for deprecated headers now active. ! - dejagnu testsuite preliminary documentation. ! - dejagnu testsuite default. ! - dejagnu testsuite cross compiler, multilib safe. ! - long long iostreams on by default, rework of ISO C99 support. ! - iterator re-write and testsuites. ! - container testsuites. ! - allocator revamp and testsuites. ! - more concept-checking work. ! - basic_string optimization and MT fixes. ! - new limits implementation. ! - update -fno-exceptions code, verify it works. ! - full named locale support fpr all facets, choice of gnu, ! ieee_1003.1-200x (POSIX 2), or generic models. Full support depends ! on target OS and underlying "C" library support. _________________________________________________________________ 4.2 Bugs in gcc/g++ (not libstdc++-v3) *************** New: *** 410,435 **** some problems that users may encounter when building or using libstdc++. If you are experiencing one of these problems, you can find more information on the libstdc++ and the GCC mailing lists. ! * As of 2.91, these bugs have all been fixed. We look forward to new ! ones, well, not exactly... _________________________________________________________________ 4.3 Bugs in the C++ language/lib specification ! Yes, unfortunately, there are some. In a [67]message to the list, Nathan Myers announced that he has started a list of problems in the ISO C++ Standard itself, especially with regard to the chapters that ! concern the library. The list itself is [68]posted on his website. Developers who are having problems interpreting the Standard may wish to consult his notes. For those people who are not part of the ISO Library Group (i.e., nearly all of us needing to read this page in the first place :-), a ! public list of the library defects is occasionally published [69]here. ! Some of these have resulted in [70]code changes. _________________________________________________________________ ! 4.4 Things in libstdc++ that look like bugs There are things which are not bugs in the compiler (4.2) nor the language specification (4.3), but aren't really bugs in libstdc++, --- 473,506 ---- some problems that users may encounter when building or using libstdc++. If you are experiencing one of these problems, you can find more information on the libstdc++ and the GCC mailing lists. ! ! Before reporting a bug, examine the [72]bugs database with the ! category set to "libstdc++". The BUGS file in the source tree also ! tracks known serious problems. ! * Debugging is problematic, due to bugs in line-number generation ! (mostly fixed in the compiler) and gdb lagging behind the compiler ! (lack of personnel). We recommend configuring the compiler using ! --with-dwarf2 if the DWARF2 debugging format is not already the ! default on your platform. Also, [73]changing your GDB settings can ! have a profound effect on your C++ debugging experiences. :-) _________________________________________________________________ 4.3 Bugs in the C++ language/lib specification ! Yes, unfortunately, there are some. In a [74]message to the list, Nathan Myers announced that he has started a list of problems in the ISO C++ Standard itself, especially with regard to the chapters that ! concern the library. The list itself is [75]posted on his website. Developers who are having problems interpreting the Standard may wish to consult his notes. For those people who are not part of the ISO Library Group (i.e., nearly all of us needing to read this page in the first place :-), a ! public list of the library defects is occasionally published [76]here. ! Some of these have resulted in [77]code changes. _________________________________________________________________ ! 4.4 Things in libstdc++ that only look like bugs There are things which are not bugs in the compiler (4.2) nor the language specification (4.3), but aren't really bugs in libstdc++, *************** New: *** 439,446 **** the library headers emitted when -Weffc++ is used. Making libstdc++ "-Weffc++-clean" is not a goal of the project, for a few reasons. Mainly, that option tries to enforce object-oriented programming, ! while the Standard Library isn't necessarily trying to be OO. There ! are multiple solutions under discussion. reopening a stream fails Did I just say that -Weffc++ was our biggest false-bug report? I lied. (It used to be.) Today it seems to be --- 510,516 ---- the library headers emitted when -Weffc++ is used. Making libstdc++ "-Weffc++-clean" is not a goal of the project, for a few reasons. Mainly, that option tries to enforce object-oriented programming, ! while the Standard Library isn't necessarily trying to be OO. reopening a stream fails Did I just say that -Weffc++ was our biggest false-bug report? I lied. (It used to be.) Today it seems to be *************** New: *** 459,465 **** state on the previous file. The reason is that the state flags are not cleared on a successful call to open(). The standard unfortunately did not specify behavior in this case, and to everybody's great sorrow, ! the [71]proposed LWG resolution (see DR #22) is to leave the flags unchanged. You must insert a call to fs.clear() between the calls to close() and open(), and then everything will work like we all expect it to work. --- 529,535 ---- state on the previous file. The reason is that the state flags are not cleared on a successful call to open(). The standard unfortunately did not specify behavior in this case, and to everybody's great sorrow, ! the [78]proposed LWG resolution (see DR #22) is to leave the flags unchanged. You must insert a call to fs.clear() between the calls to close() and open(), and then everything will work like we all expect it to work. *************** New: *** 469,482 **** same namespace as other comparison functions (e.g., 'using' them and the header), then you will suddenly be faced with huge numbers of ambiguity errors. This was discussed on the -v3 list; ! Nathan Myers [72]sums things up here. The g++-3 headers are not ours If you have found an extremely broken header file which is causing problems for you, look carefully before submitting a "high" priority bug report (which you probably shouldn't do anyhow; see the last ! paragraph of the page describing [73]the GCC bug database). If the headers are in ${prefix}/include/g++-3, or if the installed library's name looks like libstdc++-2.10.a or libstdc++-libc6-2.10.so, --- 539,553 ---- same namespace as other comparison functions (e.g., 'using' them and the header), then you will suddenly be faced with huge numbers of ambiguity errors. This was discussed on the -v3 list; ! Nathan Myers [79]sums things up here. The collisions with ! vector/string iterator types have been fixed for 3.1. The g++-3 headers are not ours If you have found an extremely broken header file which is causing problems for you, look carefully before submitting a "high" priority bug report (which you probably shouldn't do anyhow; see the last ! paragraph of the page describing [80]the GCC bug database). If the headers are in ${prefix}/include/g++-3, or if the installed library's name looks like libstdc++-2.10.a or libstdc++-libc6-2.10.so, *************** New: *** 486,492 **** Currently our header files are installed in ${prefix}/include/g++-v3 (see the 'v'?). This may change with the next release of GCC, as it ! may be too confusing, but [74]the question has not yet been decided. glibc If you're on a GNU/Linux system and have just upgraded to glibc 2.2, but are still using gcc 2.95.2, then you should have read the --- 557,563 ---- Currently our header files are installed in ${prefix}/include/g++-v3 (see the 'v'?). This may change with the next release of GCC, as it ! may be too confusing, but [81]the question has not yet been decided. glibc If you're on a GNU/Linux system and have just upgraded to glibc 2.2, but are still using gcc 2.95.2, then you should have read the *************** type has changed in glibc 2.2. The patc *** 499,505 **** http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff ! Note that 2.95.x shipped with the [75]old v2 library which is no longer maintained. Also note that gcc 2.95.3 fixes this problem, but requires a separate patch for libstdc++-v3. --- 570,576 ---- http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff ! Note that 2.95.x shipped with the [82]old v2 library which is no longer maintained. Also note that gcc 2.95.3 fixes this problem, but requires a separate patch for libstdc++-v3. *************** http://clisp.cons.org/~haible/gccinclude *** 512,534 **** visibility, or you just plain forgot, etc). More information, including how to optionally enable/disable the ! checks, is available [76]here. _________________________________________________________________ 4.5 Aw, that's easy to fix! If you have found a bug in the library and you think you have a working fix, then send it in! The main GCC site has a page on ! [77]submitting patches that covers the procedure, but for libstdc++ you should also send the patch to our mailing list in addition to the ! GCC patches mailing list. The libstdc++ [78]contributors' page also talks about how to submit patches. In addition to the description, the patch, and the ChangeLog entry, it is a Good Thing if you can additionally create a small test program to test for the presence of the bug that your patch fixes. Bugs have a way of being reintroduced; if an old bug creeps back in, it will be ! caught immediately by the [79]testsuite -- but only if such a test exists. _________________________________________________________________ --- 583,620 ---- visibility, or you just plain forgot, etc). More information, including how to optionally enable/disable the ! checks, is available [83]here. ! ! dlopen/dlsym If you are using the C++ library across ! dynamically-loaded objects, make certain that you are passing the ! correct options when compiling and linking: ! // compile the library components ! g++ -fPIC -c a.cc ! g++ -fPIC -c b.cc ! ... ! g++ -fPIC -c z.cc ! ! // create the library ! g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o ! ! // link the executable ! g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl _________________________________________________________________ 4.5 Aw, that's easy to fix! If you have found a bug in the library and you think you have a working fix, then send it in! The main GCC site has a page on ! [84]submitting patches that covers the procedure, but for libstdc++ you should also send the patch to our mailing list in addition to the ! GCC patches mailing list. The libstdc++ [85]contributors' page also talks about how to submit patches. In addition to the description, the patch, and the ChangeLog entry, it is a Good Thing if you can additionally create a small test program to test for the presence of the bug that your patch fixes. Bugs have a way of being reintroduced; if an old bug creeps back in, it will be ! caught immediately by the [86]testsuite -- but only if such a test exists. _________________________________________________________________ *************** http://clisp.cons.org/~haible/gccinclude *** 562,576 **** libstdc++. Some of that is already happening, see 4.2. Some of those changes are being predicted by the library maintainers, and we add code to the library based on what the current proposed ! resolution specifies. Those additions are listed in [80]the extensions page. 2. Performance tuning. Lots of performance tuning. This too is already underway for post-3.0 releases, starting with memory expansion in container classes and buffer usage in synchronized stream objects. ! 3. An ABI for libstdc++ will eventually be developed, so that ! multiple binary-incompatible copies of the library can be replaced ! with a single backwards-compatible library, like libgcc_s.so is. 4. The current libstdc++ contains extensions to the Library which must be explicitly requested by client code (for example, the hash tables from SGI). Other extensions may be added to libstdc++-v3 if --- 648,662 ---- libstdc++. Some of that is already happening, see 4.2. Some of those changes are being predicted by the library maintainers, and we add code to the library based on what the current proposed ! resolution specifies. Those additions are listed in [87]the extensions page. 2. Performance tuning. Lots of performance tuning. This too is already underway for post-3.0 releases, starting with memory expansion in container classes and buffer usage in synchronized stream objects. ! 3. An ABI for libstdc++ is being developed, so that multiple ! binary-incompatible copies of the library can be replaced with a ! single backwards-compatible library, like libgcc_s.so is. 4. The current libstdc++ contains extensions to the Library which must be explicitly requested by client code (for example, the hash tables from SGI). Other extensions may be added to libstdc++-v3 if *************** http://clisp.cons.org/~haible/gccinclude *** 578,590 **** type from C99.) Bugfixes and rewrites (to improve or fix thread safety, for instance) will of course be a continuing task. ! [81]This question about the next libstdc++ prompted some brief but ! interesting [82]speculation. _________________________________________________________________ 5.3 What about the STL from SGI? ! The [83]STL from SGI, version 3.3, was the most recent merge of the STL codebase. The code in libstdc++ contains many fixes and changes, and it is very likely that the SGI code is no longer under active development. We expect that no future merges will take place. --- 664,676 ---- type from C99.) Bugfixes and rewrites (to improve or fix thread safety, for instance) will of course be a continuing task. ! [88]This question about the next libstdc++ prompted some brief but ! interesting [89]speculation. _________________________________________________________________ 5.3 What about the STL from SGI? ! The [90]STL from SGI, version 3.3, was the most recent merge of the STL codebase. The code in libstdc++ contains many fixes and changes, and it is very likely that the SGI code is no longer under active development. We expect that no future merges will take place. *************** http://clisp.cons.org/~haible/gccinclude *** 605,611 **** #include ! Extensions to the library have [84]their own page. _________________________________________________________________ 5.5 [removed] --- 691,697 ---- #include ! Extensions to the library have [91]their own page. _________________________________________________________________ 5.5 [removed] *************** a *** 654,661 **** otherwise documented as safe, do not assume that two threads may access a shared standard library object at the same time. ! See chapters [85]17 (library introduction), [86]23 (containers), and ! [87]27 (I/O) for more information. _________________________________________________________________ 5.7 How do I get a copy of the ISO C++ Standard? --- 740,747 ---- otherwise documented as safe, do not assume that two threads may access a shared standard library object at the same time. ! See chapters [92]17 (library introduction), [93]23 (containers), and ! [94]27 (I/O) for more information. _________________________________________________________________ 5.7 How do I get a copy of the ISO C++ Standard? *************** a *** 666,676 **** their two-meeting commitment for voting rights, may get a copy of the standard from their respective national standards organization. In the USA, this national standards organization is ANSI and their website is ! right [88]here. (And if you've already registered with them, clicking ! this link will take you to directly to the place where you can [89]buy the standard on-line. ! Who is your country's member body? Visit the [90]ISO homepage and find out! _________________________________________________________________ --- 752,762 ---- their two-meeting commitment for voting rights, may get a copy of the standard from their respective national standards organization. In the USA, this national standards organization is ANSI and their website is ! right [95]here. (And if you've already registered with them, clicking ! this link will take you to directly to the place where you can [96]buy the standard on-line. ! Who is your country's member body? Visit the [97]ISO homepage and find out! _________________________________________________________________ *************** a *** 721,820 **** encompasses the standard library. _________________________________________________________________ ! See [91]license.html for copying conditions. Comments and suggestions ! are welcome, and may be sent to [92]the libstdc++ mailing list. References 1. http://gcc.gnu.org/onlinedocs/libstdc++/faq/ ! 2. http://gcc.gnu.org/libstdc++/ ! 3. ../faq/index.html#1_0 ! 4. ../faq/index.html#1_1 ! 5. ../faq/index.html#1_2 ! 6. ../faq/index.html#1_3 ! 7. ../faq/index.html#1_4 ! 8. ../faq/index.html#1_5 ! 9. ../faq/index.html#1_6 ! 10. ../faq/index.html#1_7 ! 11. ../faq/index.html#1_8 ! 12. ../faq/index.html#1_9 ! 13. ../faq/index.html#2_0 ! 14. ../faq/index.html#2_1 ! 15. ../faq/index.html#2_2 ! 16. ../faq/index.html#2_3 ! 17. ../faq/index.html#2_4 ! 18. ../faq/index.html#2_5 ! 19. ../faq/index.html#3_0 ! 20. ../faq/index.html#3_1 ! 21. ../faq/index.html#3_2 ! 22. ../faq/index.html#3_3 ! 23. ../faq/index.html#3_4 ! 24. ../faq/index.html#4_0 ! 25. ../faq/index.html#4_1 ! 26. ../faq/index.html#4_2 ! 27. ../faq/index.html#4_3 ! 28. ../faq/index.html#4_4 ! 29. ../faq/index.html#4_4_iostreamclear ! 30. ../faq/index.html#4_4_Weff ! 31. ../faq/index.html#4_4_rel_ops ! 32. ../faq/index.html#4_4_interface ! 33. ../faq/index.html#4_4_glibc ! 34. ../faq/index.html#4_4_checks ! 35. ../faq/index.html#4_5 ! 36. ../faq/index.html#5_0 ! 37. ../faq/index.html#5_1 ! 38. ../faq/index.html#5_2 ! 39. ../faq/index.html#5_3 ! 40. ../faq/index.html#5_4 ! 41. ../faq/index.html#5_5 ! 42. ../faq/index.html#5_6 ! 43. ../faq/index.html#5_7 ! 44. ../faq/index.html#5_8 ! 45. http://gcc.gnu.org/libstdc++/download.html ! 46. ../faq/index.html#4_4_interface ! 47. ../17_intro/DESIGN ! 48. http://gcc.gnu.org/ ! 49. http://gcc.gnu.org/gcc-2.95/buildstat.html ! 50. http://gcc.gnu.org/libstdc++/ ! 51. http://gcc.gnu.org/libstdc++/download.html ! 52. http://gcc.gnu.org/libstdc++/ ! 53. ../17_intro/contribute.html ! 54. http://www.boost.org/ ! 55. http://gcc.gnu.org/fom_serv/cache/33.html ! 56. mailto:libstdc++@gcc.gnu.org ! 57. mailto:pme@gcc.gnu.org ! 58. mailto:gdr@gcc.gnu.org ! 59. ../17_intro/license.html ! 60. ../documentation.html ! 61. ../17_intro/RELEASE-NOTES ! 62. http://www.gnu.org/software/cvs/cvs.html ! 63. http://www.cvshome.org/ ! 64. ../18_support/howto.html ! 65. http://gcc.gnu.org/ml/libstdc++/2000-12/msg00279.html ! 66. http://gcc.gnu.org/install/configure.html ! 67. http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html ! 68. http://www.cantrip.org/draft-bugs.txt ! 69. http://anubis.dkuug.dk/jtc1/sc22/wg21/ ! 70. ../faq/index.html#5_2 ! 71. ../ext/howto.html#5 ! 72. http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html ! 73. http://gcc.gnu.org/gnatswrite.html ! 74. http://gcc.gnu.org/ml/gcc/2000-10/msg00732.html ! 75. ../faq/index.html#4_4_interface ! 76. ../19_diagnostics/howto.html#3 ! 77. http://gcc.gnu.org/contribute.html ! 78. ../17_intro/contribute.html ! 79. ../faq/index.html#2_4 ! 80. ../ext/howto.html#5 ! 81. http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html ! 82. http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html ! 83. http://www.sgi.com/Technology/STL/ ! 84. ../ext/howto.html ! 85. ../17_intro/howto.html#3 ! 86. ../23_containers/howto.html#3 ! 87. ../27_io/howto.html#9 ! 88. http://www.ansi.org/ ! 89. http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998 ! 90. http://www.iso.ch/ ! 91. ../17_intro/license.html ! 92. mailto:libstdc++@gcc.gnu.org --- 807,913 ---- encompasses the standard library. _________________________________________________________________ ! See [98]license.html for copying conditions. Comments and suggestions ! are welcome, and may be sent to [99]the libstdc++ mailing list. References 1. http://gcc.gnu.org/onlinedocs/libstdc++/faq/ ! 2. http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html ! 3. http://gcc.gnu.org/libstdc++/ ! 4. ../faq/index.html#1_0 ! 5. ../faq/index.html#1_1 ! 6. ../faq/index.html#1_2 ! 7. ../faq/index.html#1_3 ! 8. ../faq/index.html#1_4 ! 9. ../faq/index.html#1_5 ! 10. ../faq/index.html#1_6 ! 11. ../faq/index.html#1_7 ! 12. ../faq/index.html#1_8 ! 13. ../faq/index.html#1_9 ! 14. ../faq/index.html#2_0 ! 15. ../faq/index.html#2_1 ! 16. ../faq/index.html#2_2 ! 17. ../faq/index.html#2_3 ! 18. ../faq/index.html#2_4 ! 19. ../faq/index.html#2_5 ! 20. ../faq/index.html#3_0 ! 21. ../faq/index.html#3_1 ! 22. ../faq/index.html#3_2 ! 23. ../faq/index.html#3_3 ! 24. ../faq/index.html#3_4 ! 25. ../faq/index.html#3_5 ! 26. ../faq/index.html#3_6 ! 27. ../faq/index.html#4_0 ! 28. ../faq/index.html#4_1 ! 29. ../faq/index.html#4_2 ! 30. ../faq/index.html#4_3 ! 31. ../faq/index.html#4_4 ! 32. ../faq/index.html#4_4_iostreamclear ! 33. ../faq/index.html#4_4_Weff ! 34. ../faq/index.html#4_4_rel_ops ! 35. ../faq/index.html#4_4_interface ! 36. ../faq/index.html#4_4_glibc ! 37. ../faq/index.html#4_4_checks ! 38. ../faq/index.html#4_4_dlsym ! 39. ../faq/index.html#4_5 ! 40. ../faq/index.html#5_0 ! 41. ../faq/index.html#5_1 ! 42. ../faq/index.html#5_2 ! 43. ../faq/index.html#5_3 ! 44. ../faq/index.html#5_4 ! 45. ../faq/index.html#5_5 ! 46. ../faq/index.html#5_6 ! 47. ../faq/index.html#5_7 ! 48. ../faq/index.html#5_8 ! 49. http://gcc.gnu.org/libstdc++/download.html ! 50. ../faq/index.html#4_4_interface ! 51. ../17_intro/DESIGN ! 52. http://gcc.gnu.org/ ! 53. http://gcc.gnu.org/gcc-3.0/buildstat.html ! 54. http://gcc.gnu.org/libstdc++/ ! 55. http://gcc.gnu.org/libstdc++/download.html ! 56. http://gcc.gnu.org/libstdc++/ ! 57. ../17_intro/contribute.html ! 58. http://www.boost.org/ ! 59. http://gcc.gnu.org/fom_serv/cache/33.html ! 60. mailto:libstdc++@gcc.gnu.org ! 61. mailto:pme@gcc.gnu.org ! 62. mailto:gdr@gcc.gnu.org ! 63. ../17_intro/license.html ! 64. ../documentation.html ! 65. ../17_intro/RELEASE-NOTES ! 66. http://www.gnu.org/software/cvs/cvs.html ! 67. http://www.cvshome.org/ ! 68. ../18_support/howto.html ! 69. http://gcc.gnu.org/cgi-bin/htsearch?method=and&format=builtin-long&sort=score&words=_XOPEN_SOURCE+Solaris ! 70. http://gcc.gnu.org/ml/gcc/2002-03/msg00817.html ! 71. http://gcc.gnu.org/install/configure.html ! 72. http://gcc.gnu.org/bugs.html ! 73. http://gcc.gnu.org/ml/libstdc++/2002-02/msg00034.html ! 74. http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html ! 75. http://www.cantrip.org/draft-bugs.txt ! 76. http://anubis.dkuug.dk/jtc1/sc22/wg21/ ! 77. ../faq/index.html#5_2 ! 78. ../ext/howto.html#5 ! 79. http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html ! 80. http://gcc.gnu.org/gnatswrite.html ! 81. http://gcc.gnu.org/ml/gcc/2000-10/msg00732.html ! 82. ../faq/index.html#4_4_interface ! 83. ../19_diagnostics/howto.html#3 ! 84. http://gcc.gnu.org/contribute.html ! 85. ../17_intro/contribute.html ! 86. ../faq/index.html#2_4 ! 87. ../ext/howto.html#5 ! 88. http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html ! 89. http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html ! 90. http://www.sgi.com/Technology/STL/ ! 91. ../ext/howto.html ! 92. ../17_intro/howto.html#3 ! 93. ../23_containers/howto.html#3 ! 94. ../27_io/howto.html#9 ! 95. http://www.ansi.org/ ! 96. http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998 ! 97. http://www.iso.ch/ ! 98. ../17_intro/license.html ! 99. mailto:libstdc++@gcc.gnu.org diff -Nrc3pad gcc-3.0.4/libstdc++-v3/docs/html/install.html gcc-3.1/libstdc++-v3/docs/html/install.html *** gcc-3.0.4/libstdc++-v3/docs/html/install.html Fri Oct 19 20:07:34 2001 --- gcc-3.1/libstdc++-v3/docs/html/install.html Mon Apr 1 22:09:28 2002 *************** *** 39,49 ****

            Tools you will need beforehand

            You will need a recent version of g++ to compile the snapshot of libstdc++, such as one of the GCC 3.x snapshots (insert standard ! caveat about using snapshots rather than formal releases). You ! will need the full source ! distribution to whatever compiler release you are using. The ! GCC snapshots can be had from one of the sites on their ! mirror list.

            In addition, if you plan to modify the makefiles or regenerate the --- 39,51 ----

            Tools you will need beforehand

            You will need a recent version of g++ to compile the snapshot of libstdc++, such as one of the GCC 3.x snapshots (insert standard ! caveat about using snapshots rather than formal releases). You will ! need the full source distribution to whatever compiler release you are ! using. The GCC snapshots can be had from one of the sites on their ! mirror list. If you are ! using a 2.x compiler, see ! the status page ! first.

            In addition, if you plan to modify the makefiles or regenerate the *************** *** 57,65 **** worries as long as the versions are correct).

            -

            GNU Make is the only 'make' that will parse the makefiles correctly. -

            -

            To test your build, you will need either DejaGNU 1.4 (to run 'make check' like the rest of GCC), --- 59,64 ---- *************** *** 76,81 **** --- 75,87 ---- well as releases) of binutils here.

            + +

            If you are using a 3.1-series libstdc++ snapshot, then the + requirements are slightly more stringent: the compiler sources must + also be 3.1 or later (for both technical and licensing reasons), and + your binutils must be 2.11.95 or later if you want to use symbol + versioning in shared libraries. +