diff options
236 files changed, 6446 insertions, 2368 deletions
diff --git a/ChangeLog b/ChangeLog index c895b85d4b8..d513945a749 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-12-18 Ben Elliston <bje@au.ibm.com> + + * config.sub, config.guess: Update from upstream sources. + 2009-12-07 Shujing Zhao <pearly.zhao@oracle.com> * MAINTAINERS (Write After Approval): Add myself. diff --git a/ChangeLog.MELT b/ChangeLog.MELT index ef24f82c150..19e47fdd69c 100644 --- a/ChangeLog.MELT +++ b/ChangeLog.MELT @@ -1,4 +1,8 @@ +2009-12-18 Basile Starynkevitch <basile@starynkevitch.net> + + MELT branch merged with trunk rev 155344 + 2009-12-14 Basile Starynkevitch <basile@starynkevitch.net> MELT branch merged with trunk rev 155213 diff --git a/config.guess b/config.guess index d53e309f4b9..64cae2741b9 100755 --- a/config.guess +++ b/config.guess @@ -4,7 +4,7 @@ # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. -timestamp='2009-11-19' +timestamp='2009-12-13' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -57,7 +57,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -333,6 +333,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" diff --git a/config.sub b/config.sub index 17c91458a8a..110a68e347e 100755 --- a/config.sub +++ b/config.sub @@ -4,7 +4,7 @@ # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. -timestamp='2009-11-07' +timestamp='2009-12-13' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -76,7 +76,7 @@ version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -1256,6 +1256,9 @@ case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; @@ -1277,8 +1280,8 @@ case $os in # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -kopensolaris* \ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9079c3aa87..c74baf6b393 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,322 @@ +2009-12-17 Jakub Jelinek <jakub@redhat.com> + + * dwarf2out.c (loc_descriptor): For SYMBOL_REFs and LABEL_REFs + use DW_OP_addr+DW_OP_stack_value instead of DW_OP_implicit_value. + (add_const_value_attribute): For CONST_STRING, SYMBOL_REFs and + LABEL_REFs use DW_OP_addr+DW_OP_stack_value DW_AT_location instead of + DW_AT_const_value. + +2009-12-17 Alexandre Oliva <aoliva@redhat.com> + + PR debug/41679 + * var-tracking.c (count_uses): Count MO_VAL_USE of original + MO_VAL_SET value for COND_EXEC. + (add_stores): Handle conditional stores. + + PR debug/41679 + * var-tracking.c (use_type): Remove indirection from loc. + (count_uses): Dereference incoming loc early. + (add_uses): Dereference incoming loc early. + + PR debug/41679 + * var-tracking.c (add_stores): Avoid value mode mismatch for + promoted declarations. + +2009-12-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/42386 + * ipa.c (function_and_variable_visibility): Clear same_comdat_group + links of DECL_EXTERNAL nodes. + +2009-12-17 Sandra Loosemore <sandra@codesourcery.com> + + * doc/rtl.texi (Vector Operations): Clarify vec_select result mode. + +2009-12-17 Julian Brown <julian@codesourcery.com> + + * config/arm/bpabi-v6m.S (test_div_by_zero): New macro. + (aeabi_ldivmod, aeabi_uldivmod): Use above macro. + * config/arm/bpabi.S (test_div_by_zero): New macro. + (aeabi_ldivmod, aeabi_uldivmod): Use above macro. + * config/arm/lib1funcs.asm (ARM_LDIV0): Tail-call int div-by-zero + handler for EABI. Add signed/unsigned argument, pass correct value + to that handler. + (THUMB_LDIV0): Same, for Thumb. + (DIV_FUNC_END): Add signed argument. + (WEAK): New macro (for EABI). + (__udivsi3, __umodsi3): Add unsigned argument to DIV_FUNC_END. For + __udivsi3, add entry point which skips division-by-zero test. + (__divsi3, __modsi3): Add signed argument to DIV_FUNC_END. + (__aeabi_uidivmod, __aeabi_idivmod): Check for division by zero. + Call __udivsi3 or __divsi3 via entry points which skip + division-by-zero tests. + (__div0): Rename to __aeabi_idiv0, __aeabi_ldiv0 for EABI, and + declare those names weak. + +2009-12-17 Richard Guenther <rguenther@suse.de> + + PR middle-end/42397 + * builtins.c (get_object_alignment): Properly deal with + a CONST_DECL base. + * expr.c (emit_block_move_hints): Assert the alignment makes + sense. + +2009-12-17 Uros Bizjak <ubizjak@gmail.com> + + PR target/32280 + * config/i386/i386-modes.def (V1TI): New vector mode. + * config/i386/i386.h (VALID_SSE_REG_MODE): Add V1TImode. + (SSE_REG_MODE_P): Ditto. + * config/i386/sse.md (SSEMODE16): New mode iterator. + (AVXMODE16): Ditto. + (avxvecmode): Handle V1TI mode. + (*avx_mov<mode>_internal): Use AVXMODE16 instead of AVXMODE. + (mov<mode>): Use SSEMODE16 instead of SSEMODE. + (*mov<mode>_internal): Ditto. + (push<mode>1): Ditto. + (movmisalign<mode>): Ditto. + (sse2_ashlv1ti): Rename from sse2_ashlti. + (sse2_lshrv1ti): Rename from sse2_lshrti. + (*avx_ashlv1ti): Rename from *avx_ashlti and move from i386.md. + (*avx_lshrv1ti): Rename from *avx_lshrti and move from i386.md. + (vec_shl_<mode>): Convert operands to V1TImode and use V1TI shift. + (vec_shr_<mode>): Ditto. + (*sse2_mulv4si3): Update for renamed sse2_ashlv1ti3. + (udot_prodv4si): Ditto. + * config/i386/i386.c (classify_argument): Handle V1TImode. + (function_arg_advance_32): Ditto. + (function_arg_32): Ditto. + (ix86_expand_sse4_unpack): Convert operands to V1TImode and update + for renamed gen_sse2_lshrv1ti3. + (ix86_expand_args_builtin) <V2DI_FTYPE_V2DI_INT_CONVERT>: Set rmode + to V1TImode. + (struct builtin_description) <__builtin_ia32_pslldqi128>: Update + for renamed sse2_ashlv1ti3. + <__builtin_ia32_psrldqi128>: Update for renamed sse2_lshrv1ti3. + + Revert: + 2007-06-11 Uros Bizjak <ubizjak@gmail.com> + + PR target/32280 + * config/i386/sse.md ("sse2_ashlti", "sse2_lshrti3"): Move ... + * config/i386/i386.md ("sse2_ashlti", "sse2_lshrti3"): ... to here. + +2009-12-17 Richard Earnshaw <rearnsha@arm.com> + + PR target/42372 + * arm.md (pic_add_dot_plus_eight): Change output constraint from + update to write. + +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): + Update build_indirect_ref calls. + +2009-12-17 Uros Bizjak <ubizjak@gmail.com> + + * config/i386/sync.md (IMODE): Remove mode iterator. + (modesuffix): Remove mode attribute. + (modeconstraint): Ditto. + (immconstraint): Ditto. + (*sync_compare_and_swap<mode>): Use SWI mode iterator instead of + IMODE mode iterator, imodesuffix mode attribute instead of modesuffix, + <r> mode attribute instead of modeconstraint and <i> mode attribute + instead of immconstraint. + (sync_double_compare_and_swap<mode>): Ditto. + (sync_old_add<mode>): Ditto. + (sync_lock_test_and_set<mode>): Ditto. + (sync_add<mode>): Ditto. + (sync_sub<mode>): Ditto. + (sync_and<mode>): Ditto. + (sync_ior<mode>): Ditto. + (sync_xor<mode>): Ditto. + (sync_<code><mode>): Macroize insn pattern from + sync_{and,ior,xor}<mode> using any_logic code iterator. + +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + PR c/40885 + * c-common.h (ref_operator): New type. + (build_indirect_ref): Adjust prototype with new argument. + * c-typeck.c (build_indirect_ref): Accept ref_operator as argument and + emit the diagnostics for easy translation. + (build_array_ref): Update calls to build_indirect_ref. + * c-omp.c (c_finish_omp_atomic): Likewise. + * c-parser.c (c_parser_unary_expression, + c_parser_postfix_expression_after_primary): Likewise. + +2009-12-16 Richard Guenther <rguenther@suse.de> + + PR lto/42392 + * langhooks.c (lhd_begin_section): Make sure to switch back + to the text section, not some random one. + +2009-12-16 Jakub Jelinek <jakub@redhat.com> + + * tree-chrec.c (chrec_convert_1): Only fold (T2)(t +- x) to + (T2)t +- (T2)x if only integer types are involved. + +2009-12-16 Ben Elliston <bje@au.ibm.com> + + * tree-data-ref.h (dot_rdg): Remove prototype. + * tree-data-ref.c (dog_rdg_1, dot_rdg): Remove. + +2009-12-16 Kazu Hirata <kazu@codesourcery.com> + + * doc/invoke.texi, doc/options.texi, doc/plugins.texi, + doc/tm.texi: Fix typos. + +2009-12-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * doc/extend.texi (Function Attributes, Extended Asm): + Replace TABs with spaces. + * doc/md.texi (Standard Names): Likewise. + * doc/plugins.texi (Plugins): Likewise. + + * doc/c-tree.texi (Expression trees): Use @itemx for all but + the first item for merged items. + * doc/extend.texi (Variable Attributes): Likewise. + * doc/install.texi (Configuration): Likewise. + * doc/invoke.texi (RS/6000 and PowerPC Options, RX Options): + Likewise. + +2009-12-15 Richard Guenther <rguenther@suse.de> + + * tree.c (free_lang_data_in_binfo): Do not free BINFO_OFFSET + and BINFO_VPTR_FIELD. + (free_lang_data_in_type): Do not free TYPE_STUB_DECL if we + generate debug information. + (free_lang_data_in_decl): Do not free DECL_SIZE_UNIT, + DECL_SIZE, DECL_FIELD_OFFSET and DECL_FCONTEXT. + (free_lang_data): Do not disable debuginfo. + * lto-streamer-out.c (write_symbol_vec): Deal with + non-constant DECL_SIZE. + (pack_ts_base_value_fields): Write types with false + TREE_ASM_WRITTEN. + (lto_output_ts_type_tree_pointers): Stream TYPE_STUB_DECL. + * lto-streamer-in.c (lto_input_ts_type_tree_pointers): Stream + TYPE_STUB_DECL. + * dwarf2out.c (add_pure_or_virtual_attribute): Check for + DECL_CONTEXT. + (gen_type_die_for_member): Test for TYPE_STUB_DECL. + * opts.c (decode_options): Do not disable var-tracking for lto. + * doc/invoke.texi (-flto): Document -flto vs. -g experimental + status. + (-fwhopr): Document experimental status. + +2009-12-15 Aldy Hernandez <aldyh@redhat.com> + + PR graphite/42185 + * graphite-sese-to-poly.c (is_reduction_operation_p): Assert that + we are a GIMPLE_ASSIGN. Do not calculate rhs code twice. + (follow_ssa_with_commutative_ops): Return NULL on non assignment. + +2009-12-15 Eric Botcazou <ebotcazou@adacore.com> + + * config/rs6000/rs6000.md (probe_stack): Use an enclosing SET. + +2009-12-15 Richard Guenther <rguenther@suse.de> + + * gimple.h (compare_field_offset): Declare. + * gimple.c (compare_field_offset): Export. + * lto-streamer-in.c (input_gimple_stmt): Use compare_field_offset. + +2009-12-15 Richard Guenther <rguenther@suse.de> + + * lto-cgraph.c (lto_output_node): Also stream the alias + for regular aliases. + (input_node): Likewise. + +2009-12-15 Paolo Bonzini <bonzini@gnu.org> + Shujing Zhao <pearly.zhao@oracle.com> + + * intl.c (get_spaces): New. + * intl.h (get_spaces): New. + +2009-12-14 Jakub Jelinek <jakub@redhat.com> + + PR bootstrap/42369 + * config/i386/i386.c (ix86_expand_special_args_builtin): Avoid + using switch with CODE_FOR_lwp_lwp* cases. + + * config/i386/i386-builtin-types.def (PVOID_FTYPE_VOID): Use + DEF_FUNCTION_TYPE (PVOID) instead of DEF_FUNCTION_TYPE (PVOID, VOID). + +2009-12-14 Eric Botcazou <ebotcazou@adacore.com> + + * cfgexpand.c (expand_debug_expr) <INDIRECT_REF>: Remove overzealous + assertion and useless code. + <TARGET_MEM_REF>: Likewise. + +2009-12-14 Alexandre Oliva <aoliva@redhat.com> + + PR debug/41473 + * dwarf2out.c (AT_loc_list_ptr): New. + (resolve_addr): Remove unresolved attributes and loc_list entries. + + PR debug/41473 + * dwarf2out.c (add_var_loc_to_decl): Don't drop initial empty + locations. + (new_loc_list): Drop gensym arg. Move generation of ll_symbol... + (gen_llsym): ... here. New function. + (add_loc_descr_to_loc_list): Removed. + (loc_descriptor): Infer mode from CONST_DOUBLEs and CONST_VECTORs. + (single_element_loc_list): Removed. + (dw_loc_list): Don't create entries without a location. Don't + special-case the first node of the list, only single nodes. + (single_element_loc_list_p): Simplify. + (loc_list_from_tree): Don't use DECL_RTL if loc_list is nonempty. + (add_location_or_const_value_attribute): Test var loc for NULL. + (convert_cfa_to_fb_loc_list): Adjust calls to new new_loc_list, + call gen_llsym if needed. + +2009-12-14 Jakub Jelinek <jakub@redhat.com> + + * cgraph.h (cgraph_set_nothrow_flag, cgraph_set_readonly_flag, + cgraph_set_pure_flag, cgraph_set_looping_const_or_pure_flag): New + prototypes. + * cgraph.c (cgraph_set_nothrow_flag, cgraph_set_readonly_flag, + cgraph_set_pure_flag, cgraph_set_looping_const_or_pure_flag): New + functions. + * except.h (set_nothrow_function_flags): Remove prototype. + * except.c (set_nothrow_function_flags): Use cgraph_set_nothrow_flag. + Make static. + * ipa-pure-const.c (propagate): Use cgraph_set_nothrow_flag, + cgraph_set_readonly_flag, cgraph_set_pure_flag + and cgraph_set_looping_const_or_pure_flag. + (local_pure_const): Likewise. + +2009-12-14 Jakub Jelinek <jakub@redhat.com> + Sebastian Pop <sebastian.pop@amd.com> + + * config/i386/i386-builtin-types.def (PVOID): Declared. + (VOID_FTYPE_PVOID): Declared. + (PVOID_FTYPE_VOID): Declared. + (UCHAR_FTYPE_USHORT_UINT_USHORT): Removed. + (VOID_FTYPE_USHORT_UINT_USHORT): Removed. + * config/i386/i386.c (IX86_BUILTIN_LLWPCB16, IX86_BUILTIN_LLWPCB32, + IX86_BUILTIN_LLWPCB64, IX86_BUILTIN_SLWPCB16, IX86_BUILTIN_SLWPCB32, + IX86_BUILTIN_SLWPCB64, IX86_BUILTIN_LWPVAL16, IX86_BUILTIN_LWPINS16): + Removed. + (IX86_BUILTIN_LLWPCB, IX86_BUILTIN_SLWPCB): New. + (bdesc_special_args): Adjust declaration of __builtin_ia32_llwpcb, + __builtin_ia32_slwpcb, __builtin_ia32_lwpval32, + __builtin_ia32_lwpval64, __builtin_ia32_lwpins32, and + __builtin_ia32_lwpins64. + (ix86_expand_special_args_builtin): Handle VOID_FTYPE_PVOID. + Do not handle VOID_FTYPE_USHORT_UINT_USHORT and + UCHAR_FTYPE_USHORT_UINT_USHORT. Warn when the third operand is + not an immediate. Also handle builtin functions with 3 arguments. + (ix86_expand_builtin): Handle IX86_BUILTIN_LLWPCB and + IX86_BUILTIN_SLWPCB. + * config/i386/i386.md (UNSPEC_LLWP_INTRINSIC, UNSPEC_SLWP_INTRINSIC): + Renamed UNSPECV_LLWP_INTRINSIC and UNSPECV_SLWP_INTRINSIC. + (memory attribute): Handle lwp. + (lwp*): Rewrite all the insn patterns for LWP. + * config/i386/lwpintrin.h (__llwpcb16, __llwpcb32, __llwpcb64, + __slwpcb16, __slwpcb32, __slwpcb64, __lwpval16, __lwpins16): Removed. + (__llwpcb, __slwpcb): New. + 2009-12-14 Dmitry Gorbachev <d.g.gorbachev@gmail.com> * dominance.c (set_immediate_dominator): Don't mark as inline. @@ -40,7 +359,7 @@ (divmodhi4): Ditto. (udivmodhi4): Ditto. (divmodsi4): Ditto. - (udivmodsi4): Ditto. + (udivmodsi4): Ditto. 2009-12-13 Richard Guenther <rguenther@suse.de> @@ -187,7 +506,7 @@ * builtins.c (do_mpc_ckconv): Pass the component type to real_from_mpfr(). - + 2009-12-09 Xinliang David Li <davidxl@google.com> PR tree-optimization/42337 diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index a9197a56d67..9974d1934af 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,20 @@ +2009-12-12 Sebastian Pop <sebpop@gmail.com> + + PR middle-end/42284 + * graphite-sese-to-poly.c (rewrite_close_phi_out_of_ssa): Call + insert_out_of_ssa_copy_on_edge for anything else than SSA_NAMEs. + (detect_commutative_reduction_arg): Simplified. + (detect_commutative_reduction): Early return when the argument of + the close phi is not of an SSA_NAME. + + * testsuite/gcc.dg/graphite/pr42284.c: New. + +2009-12-11 Alexander Monakov <amonakov@ispras.ru> + + * dbgcnt.def (graphite_scop): New counter. + * graphite.c: Include dbgcnt.h + (graphite_transform_loops): Use new counter to limit transformations. + 2009-12-08 Sebastian Pop <sebpop@gmail.com> PR middle-end/42285 diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 04be6cb2235..53c837de054 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20091214 +20091218 diff --git a/gcc/builtins.c b/gcc/builtins.c index 75a7e10ea6d..53d74a25b17 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -323,6 +323,8 @@ get_object_alignment (tree exp, unsigned int align, unsigned int max_align) offset = next_offset; } } + if (TREE_CODE (exp) == CONST_DECL) + exp = DECL_INITIAL (exp); if (DECL_P (exp)) align = MIN (inner, DECL_ALIGN (exp)); #ifdef CONSTANT_ALIGNMENT diff --git a/gcc/c-common.h b/gcc/c-common.h index 5830d7b9335..6f8d832d455 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -391,6 +391,20 @@ extern c_language_kind c_language; #define c_dialect_cxx() ((c_language & clk_cxx) != 0) #define c_dialect_objc() ((c_language & clk_objc) != 0) +/* The various name of operator that appears in error messages. */ +typedef enum ref_operator { + /* NULL */ + RO_NULL, + /* array indexing */ + RO_ARRAY_INDEXING, + /* unary * */ + RO_UNARY_STAR, + /* -> */ + RO_ARROW, + /* implicit conversion */ + RO_IMPLICIT_CONVERSION +} ref_operator; + /* Information about a statement tree. */ struct GTY(()) stmt_tree_s { @@ -448,7 +462,7 @@ extern tree pushdecl_top_level (tree); extern tree pushdecl (tree); extern tree build_modify_expr (location_t, tree, tree, enum tree_code, location_t, tree, tree); -extern tree build_indirect_ref (location_t, tree, const char *); +extern tree build_indirect_ref (location_t, tree, ref_operator); extern int c_expand_decl (tree); diff --git a/gcc/c-omp.c b/gcc/c-omp.c index 6f1cb99720e..eb6f3ef78de 100644 --- a/gcc/c-omp.c +++ b/gcc/c-omp.c @@ -145,7 +145,7 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, tree lhs, tree rhs) DECL_CONTEXT (var) = current_function_decl; addr = build4 (TARGET_EXPR, TREE_TYPE (addr), var, addr, NULL, NULL); } - lhs = build_indirect_ref (loc, addr, NULL); + lhs = build_indirect_ref (loc, addr, RO_NULL); /* There are lots of warnings, errors, and conversions that need to happen in the course of interpreting a statement. Use the normal mechanisms diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 37f77963513..bf66a584ba8 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -5102,7 +5102,7 @@ c_parser_unary_expression (c_parser *parser) exp_loc = c_parser_peek_token (parser)->location; op = c_parser_cast_expression (parser, NULL); op = default_function_array_conversion (exp_loc, op); - ret.value = build_indirect_ref (op_loc, op.value, "unary *"); + ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR); return ret; case CPP_PLUS: if (!c_dialect_objc () && !in_system_header) @@ -5947,7 +5947,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser, expr.value = build_component_ref (op_loc, build_indirect_ref (op_loc, expr.value, - "->"), + RO_ARROW), ident); expr.original_code = ERROR_MARK; if (TREE_CODE (expr.value) != COMPONENT_REF) diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 184b4063709..dbaddd68466 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2107,7 +2107,7 @@ build_component_ref (location_t loc, tree datum, tree component) LOC is the location to use for the generated tree. */ tree -build_indirect_ref (location_t loc, tree ptr, const char *errorstring) +build_indirect_ref (location_t loc, tree ptr, ref_operator errstring) { tree pointer = default_conversion (ptr); tree type = TREE_TYPE (pointer); @@ -2165,8 +2165,26 @@ build_indirect_ref (location_t loc, tree ptr, const char *errorstring) } } else if (TREE_CODE (pointer) != ERROR_MARK) - error_at (loc, - "invalid type argument of %qs (have %qT)", errorstring, type); + switch (errstring) + { + case RO_ARRAY_INDEXING: + error_at (loc, + "invalid type argument of array indexing (have %qT)", + type); + break; + case RO_UNARY_STAR: + error_at (loc, + "invalid type argument of unary %<*%> (have %qT)", + type); + break; + case RO_ARROW: + error_at (loc, + "invalid type argument of %<->%> (have %qT)", + type); + break; + default: + gcc_unreachable (); + } return error_mark_node; } @@ -2301,7 +2319,7 @@ build_array_ref (location_t loc, tree array, tree index) return build_indirect_ref (loc, build_binary_op (loc, PLUS_EXPR, ar, index, 0), - "array indexing"); + RO_ARRAY_INDEXING); } } diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 4245d0f7a7f..08b211e5244 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2186,7 +2186,6 @@ expand_debug_expr (tree exp) int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); addr_space_t as; enum machine_mode address_mode; - enum machine_mode pointer_mode; switch (TREE_CODE_CLASS (TREE_CODE (exp))) { @@ -2382,17 +2381,15 @@ expand_debug_expr (tree exp) return NULL; if (POINTER_TYPE_P (TREE_TYPE (exp))) - as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp))); + { + as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp))); + address_mode = targetm.addr_space.address_mode (as); + } else - as = ADDR_SPACE_GENERIC; - - address_mode = targetm.addr_space.address_mode (as); - pointer_mode = targetm.addr_space.pointer_mode (as); - - gcc_assert (GET_MODE (op0) == address_mode - || GET_MODE (op0) == pointer_mode - || GET_CODE (op0) == CONST_INT - || GET_CODE (op0) == CONST_DOUBLE); + { + as = ADDR_SPACE_GENERIC; + address_mode = Pmode; + } if (TREE_CODE (exp) == ALIGN_INDIRECT_REF) { @@ -2412,19 +2409,11 @@ expand_debug_expr (tree exp) return NULL; op0 = expand_debug_expr - (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), - exp)); + (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), exp)); if (!op0) return NULL; as = TYPE_ADDR_SPACE (TREE_TYPE (exp)); - address_mode = targetm.addr_space.address_mode (as); - pointer_mode = targetm.addr_space.pointer_mode (as); - - gcc_assert (GET_MODE (op0) == address_mode - || GET_MODE (op0) == pointer_mode - || GET_CODE (op0) == CONST_INT - || GET_CODE (op0) == CONST_DOUBLE); op0 = gen_rtx_MEM (mode, op0); diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 0ed097a8b0b..fc7ba1a50ba 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2208,4 +2208,53 @@ cgraph_make_node_local (struct cgraph_node *node) } } +/* Set TREE_NOTHROW on NODE's decl and on same_body aliases of NODE + if any to NOTHROW. */ + +void +cgraph_set_nothrow_flag (struct cgraph_node *node, bool nothrow) +{ + struct cgraph_node *alias; + TREE_NOTHROW (node->decl) = nothrow; + for (alias = node->same_body; alias; alias = alias->next) + TREE_NOTHROW (alias->decl) = nothrow; +} + +/* Set TREE_READONLY on NODE's decl and on same_body aliases of NODE + if any to READONLY. */ + +void +cgraph_set_readonly_flag (struct cgraph_node *node, bool readonly) +{ + struct cgraph_node *alias; + TREE_READONLY (node->decl) = readonly; + for (alias = node->same_body; alias; alias = alias->next) + TREE_READONLY (alias->decl) = readonly; +} + +/* Set DECL_PURE_P on NODE's decl and on same_body aliases of NODE + if any to PURE. */ + +void +cgraph_set_pure_flag (struct cgraph_node *node, bool pure) +{ + struct cgraph_node *alias; + DECL_PURE_P (node->decl) = pure; + for (alias = node->same_body; alias; alias = alias->next) + DECL_PURE_P (alias->decl) = pure; +} + +/* Set DECL_LOOPING_CONST_OR_PURE_P on NODE's decl and on + same_body aliases of NODE if any to LOOPING_CONST_OR_PURE. */ + +void +cgraph_set_looping_const_or_pure_flag (struct cgraph_node *node, + bool looping_const_or_pure) +{ + struct cgraph_node *alias; + DECL_LOOPING_CONST_OR_PURE_P (node->decl) = looping_const_or_pure; + for (alias = node->same_body; alias; alias = alias->next) + DECL_LOOPING_CONST_OR_PURE_P (alias->decl) = looping_const_or_pure; +} + #include "gt-cgraph.h" diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 268e6d442f3..867a68aaf30 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -475,6 +475,11 @@ struct cgraph_node * cgraph_create_virtual_clone (struct cgraph_node *old_node, VEC(ipa_replace_map_p,gc)* tree_map, bitmap args_to_skip); +void cgraph_set_nothrow_flag (struct cgraph_node *, bool); +void cgraph_set_readonly_flag (struct cgraph_node *, bool); +void cgraph_set_pure_flag (struct cgraph_node *, bool); +void cgraph_set_looping_const_or_pure_flag (struct cgraph_node *, bool); + /* In cgraphunit.c */ void cgraph_finalize_function (tree, bool); void cgraph_mark_if_needed (tree); diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 994029239a0..367b00d70a6 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -5292,7 +5292,7 @@ ) (define_insn "tls_load_dot_plus_eight" - [(set (match_operand:SI 0 "register_operand" "+r") + [(set (match_operand:SI 0 "register_operand" "=r") (mem:SI (unspec:SI [(match_operand:SI 1 "register_operand" "r") (const_int 8) (match_operand 2 "" "")] diff --git a/gcc/config/arm/bpabi-v6m.S b/gcc/config/arm/bpabi-v6m.S index 77018e15478..75d50d967a7 100644 --- a/gcc/config/arm/bpabi-v6m.S +++ b/gcc/config/arm/bpabi-v6m.S @@ -69,9 +69,52 @@ FUNC_START aeabi_ulcmp #endif /* L_aeabi_ulcmp */ +.macro test_div_by_zero signed + cmp yyh, #0 + bne 7f + cmp yyl, #0 + bne 7f + cmp xxh, #0 + bne 2f + cmp xxl, #0 +2: + .ifc \signed, unsigned + beq 3f + mov xxh, #0 + mvn xxh, xxh @ 0xffffffff + mov xxl, xxh +3: + .else + beq 5f + blt 6f + mov xxl, #0 + mvn xxl, xxl @ 0xffffffff + lsr xxh, xxl, #1 @ 0x7fffffff + b 5f +6: mov xxh, #0x80 + lsl xxh, xxh, #24 @ 0x80000000 + mov xxl, #0 +5: + .endif + @ tailcalls are tricky on v6-m. + push {r0, r1, r2} + ldr r0, 1f + adr r1, 1f + add r0, r1 + str r0, [sp, #8] + @ We know we are not on armv4t, so pop pc is safe. + pop {r0, r1, pc} + .align 2 +1: + .word __aeabi_ldiv0 - 1b +7: +.endm + #ifdef L_aeabi_ldivmod FUNC_START aeabi_ldivmod + test_div_by_zero signed + push {r0, r1} mov r0, sp push {r0, lr} @@ -89,6 +132,8 @@ FUNC_START aeabi_ldivmod #ifdef L_aeabi_uldivmod FUNC_START aeabi_uldivmod + test_div_by_zero unsigned + push {r0, r1} mov r0, sp push {r0, lr} diff --git a/gcc/config/arm/bpabi.S b/gcc/config/arm/bpabi.S index 850381e4af6..ccc569e9821 100644 --- a/gcc/config/arm/bpabi.S +++ b/gcc/config/arm/bpabi.S @@ -64,9 +64,57 @@ ARM_FUNC_START aeabi_ulcmp #endif /* L_aeabi_ulcmp */ +.macro test_div_by_zero signed +/* Tail-call to divide-by-zero handlers which may be overridden by the user, + so unwinding works properly. */ +#if defined(__thumb2__) + cbnz yyh, 1f + cbnz yyl, 1f + cmp xxh, #0 + do_it eq + cmpeq xxl, #0 + .ifc \signed, unsigned + beq 2f + mov xxh, #0xffffffff + mov xxl, xxh +2: + .else + do_it lt, t + movlt xxl, #0 + movlt xxh, #0x80000000 + do_it gt, t + movgt xxh, #0x7fffffff + movgt xxl, #0xffffffff + .endif + b SYM (__aeabi_ldiv0) __PLT__ +1: +#else + /* Note: Thumb-1 code calls via an ARM shim on processors which + support ARM mode. */ + cmp yyh, #0 + cmpeq yyl, #0 + bne 2f + cmp xxh, #0 + cmpeq xxl, #0 + .ifc \signed, unsigned + movne xxh, #0xffffffff + movne xxl, #0xffffffff + .else + movlt xxh, #0x80000000 + movlt xxl, #0 + movgt xxh, #0x7fffffff + movgt xxl, #0xffffffff + .endif + b SYM (__aeabi_ldiv0) __PLT__ +2: +#endif +.endm + #ifdef L_aeabi_ldivmod ARM_FUNC_START aeabi_ldivmod + test_div_by_zero signed + sub sp, sp, #8 #if defined(__thumb2__) mov ip, sp @@ -85,6 +133,8 @@ ARM_FUNC_START aeabi_ldivmod #ifdef L_aeabi_uldivmod ARM_FUNC_START aeabi_uldivmod + test_div_by_zero unsigned + sub sp, sp, #8 #if defined(__thumb2__) mov ip, sp diff --git a/gcc/config/arm/lib1funcs.asm b/gcc/config/arm/lib1funcs.asm index 9f7cc63e469..1035a3cecad 100644 --- a/gcc/config/arm/lib1funcs.asm +++ b/gcc/config/arm/lib1funcs.asm @@ -265,16 +265,91 @@ LSYM(Lend_fde): .endm #endif -.macro ARM_LDIV0 name +#ifdef __ARM_EABI__ +.macro ARM_LDIV0 name signed + cmp r0, #0 + .ifc \signed, unsigned + movne r0, #0xffffffff + .else + movgt r0, #0x7fffffff + movlt r0, #0x80000000 + .endif + b SYM (__aeabi_idiv0) __PLT__ +.endm +#else +.macro ARM_LDIV0 name signed str lr, [sp, #-8]! 98: cfi_push 98b - __\name, 0xe, -0x8, 0x8 bl SYM (__div0) __PLT__ mov r0, #0 @ About as wrong as it could be. RETLDM unwind=98b .endm +#endif -.macro THUMB_LDIV0 name +#ifdef __ARM_EABI__ +.macro THUMB_LDIV0 name signed +#if defined(__ARM_ARCH_6M__) + .ifc \signed, unsigned + cmp r0, #0 + beq 1f + mov r0, #0 + mvn r0, r0 @ 0xffffffff +1: + .else + cmp r0, #0 + beq 2f + blt 3f + mov r0, #0 + mvn r0, r0 + lsr r0, r0, #1 @ 0x7fffffff + b 2f +3: mov r0, #0x80 + lsl r0, r0, #24 @ 0x80000000 +2: + .endif + push {r0, r1, r2} + ldr r0, 4f + adr r1, 4f + add r0, r1 + str r0, [sp, #8] + @ We know we are not on armv4t, so pop pc is safe. + pop {r0, r1, pc} + .align 2 +4: + .word __aeabi_idiv0 - 4b +#elif defined(__thumb2__) + .syntax unified + .ifc \signed, unsigned + cbz r0, 1f + mov r0, #0xffffffff +1: + .else + cmp r0, #0 + do_it gt + movgt r0, #0x7fffffff + do_it lt + movlt r0, #0x80000000 + .endif + b.w SYM(__aeabi_idiv0) __PLT__ +#else + .align 2 + bx pc + nop + .arm + cmp r0, #0 + .ifc \signed, unsigned + movne r0, #0xffffffff + .else + movgt r0, #0x7fffffff + movlt r0, #0x80000000 + .endif + b SYM(__aeabi_idiv0) __PLT__ + .thumb +#endif +.endm +#else +.macro THUMB_LDIV0 name signed push { r1, lr } 98: cfi_push 98b - __\name, 0xe, -0x4, 0x8 bl SYM (__div0) @@ -286,18 +361,19 @@ LSYM(Lend_fde): pop { r1, pc } #endif .endm +#endif .macro FUNC_END name SIZE (__\name) .endm -.macro DIV_FUNC_END name +.macro DIV_FUNC_END name signed cfi_start __\name, LSYM(Lend_div0) LSYM(Ldiv0): #ifdef __thumb__ - THUMB_LDIV0 \name + THUMB_LDIV0 \name \signed #else - ARM_LDIV0 \name + ARM_LDIV0 \name \signed #endif cfi_end LSYM(Lend_div0) FUNC_END \name @@ -422,6 +498,12 @@ SYM (__\name): #define yyl r2 #endif +#ifdef __ARM_EABI__ +.macro WEAK name + .weak SYM (__\name) +.endm +#endif + #ifdef __thumb__ /* Register aliases. */ @@ -842,6 +924,7 @@ LSYM(Lgot_result): cmp divisor, #0 beq LSYM(Ldiv0) +LSYM(udivsi3_skip_div0_test): mov curbit, #1 mov result, #0 @@ -860,6 +943,9 @@ LSYM(Lgot_result): ARM_FUNC_START udivsi3 ARM_FUNC_ALIAS aeabi_uidiv udivsi3 + /* Note: if called via udivsi3_skip_div0_test, this will unnecessarily + check for division-by-zero a second time. */ +LSYM(udivsi3_skip_div0_test): subs r2, r1, #1 do_it eq RETc(eq) @@ -886,20 +972,24 @@ LSYM(Lgot_result): #endif /* ARM version */ - DIV_FUNC_END udivsi3 + DIV_FUNC_END udivsi3 unsigned #if defined(__ARM_ARCH_6M__) FUNC_START aeabi_uidivmod + cmp r1, #0 + beq LSYM(Ldiv0) push {r0, r1, lr} - bl SYM(__udivsi3) + bl LSYM(udivsi3_skip_div0_test) POP {r1, r2, r3} mul r2, r0 sub r1, r1, r2 bx r3 #else ARM_FUNC_START aeabi_uidivmod + cmp r1, #0 + beq LSYM(Ldiv0) stmfd sp!, { r0, r1, lr } - bl SYM(__udivsi3) + bl LSYM(udivsi3_skip_div0_test) ldmfd sp!, { r1, r2, lr } mul r3, r2, r0 sub r1, r1, r3 @@ -946,7 +1036,7 @@ LSYM(Lover10): #endif /* ARM version. */ - DIV_FUNC_END umodsi3 + DIV_FUNC_END umodsi3 unsigned #endif /* L_umodsi3 */ /* ------------------------------------------------------------------------ */ @@ -959,7 +1049,7 @@ LSYM(Lover10): cmp divisor, #0 beq LSYM(Ldiv0) - +LSYM(divsi3_skip_div0_test): push { work } mov work, dividend eor work, divisor @ Save the sign of the result. @@ -994,8 +1084,9 @@ LSYM(Lover12): ARM_FUNC_ALIAS aeabi_idiv divsi3 cmp r1, #0 - eor ip, r0, r1 @ save the sign of the result. beq LSYM(Ldiv0) +LSYM(divsi3_skip_div0_test): + eor ip, r0, r1 @ save the sign of the result. do_it mi rsbmi r1, r1, #0 @ loops below use unsigned. subs r2, r1, #1 @ division by 1 or -1 ? @@ -1037,20 +1128,24 @@ LSYM(Lover12): #endif /* ARM version */ - DIV_FUNC_END divsi3 + DIV_FUNC_END divsi3 signed #if defined(__ARM_ARCH_6M__) FUNC_START aeabi_idivmod + cmp r1, #0 + beq LSYM(Ldiv0) push {r0, r1, lr} - bl SYM(__divsi3) + bl LSYM(divsi3_skip_div0_test) POP {r1, r2, r3} mul r2, r0 sub r1, r1, r2 bx r3 #else ARM_FUNC_START aeabi_idivmod + cmp r1, #0 + beq LSYM(Ldiv0) stmfd sp!, { r0, r1, lr } - bl SYM(__divsi3) + bl LSYM(divsi3_skip_div0_test) ldmfd sp!, { r1, r2, lr } mul r3, r2, r0 sub r1, r1, r3 @@ -1116,21 +1211,25 @@ LSYM(Lover12): #endif /* ARM version */ - DIV_FUNC_END modsi3 + DIV_FUNC_END modsi3 signed #endif /* L_modsi3 */ /* ------------------------------------------------------------------------ */ #ifdef L_dvmd_tls - FUNC_START div0 - FUNC_ALIAS aeabi_idiv0 div0 - FUNC_ALIAS aeabi_ldiv0 div0 - +#ifdef __ARM_EABI__ + WEAK aeabi_idiv0 + WEAK aeabi_ldiv0 + FUNC_START aeabi_idiv0 + FUNC_START aeabi_ldiv0 RET - FUNC_END aeabi_ldiv0 FUNC_END aeabi_idiv0 +#else + FUNC_START div0 + RET FUNC_END div0 +#endif #endif /* L_divmodsi_tools */ /* ------------------------------------------------------------------------ */ @@ -1140,14 +1239,26 @@ LSYM(Lover12): /* Constant taken from <asm/signal.h>. */ #define SIGFPE 8 +#ifdef __ARM_EABI__ + WEAK aeabi_idiv0 + WEAK aeabi_ldiv0 + ARM_FUNC_START aeabi_idiv0 + ARM_FUNC_START aeabi_ldiv0 +#else ARM_FUNC_START div0 +#endif do_push {r1, lr} mov r0, #SIGFPE bl SYM(raise) __PLT__ RETLDM r1 +#ifdef __ARM_EABI__ + FUNC_END aeabi_ldiv0 + FUNC_END aeabi_idiv0 +#else FUNC_END div0 +#endif #endif /* L_dvmd_lnx */ #ifdef L_clear_cache diff --git a/gcc/config/i386/i386-builtin-types.def b/gcc/config/i386/i386-builtin-types.def index e9e4d0c4c83..5fec96443a6 100644 --- a/gcc/config/i386/i386-builtin-types.def +++ b/gcc/config/i386/i386-builtin-types.def @@ -104,6 +104,7 @@ DEF_POINTER_TYPE (PCDOUBLE, DOUBLE, CONST) DEF_POINTER_TYPE (PCFLOAT, FLOAT, CONST) DEF_POINTER_TYPE (PCHAR, CHAR) DEF_POINTER_TYPE (PCVOID, VOID, CONST) +DEF_POINTER_TYPE (PVOID, VOID) DEF_POINTER_TYPE (PDOUBLE, DOUBLE) DEF_POINTER_TYPE (PFLOAT, FLOAT) DEF_POINTER_TYPE (PINT, INT) @@ -128,6 +129,7 @@ DEF_FUNCTION_TYPE (FLOAT128) DEF_FUNCTION_TYPE (UINT64) DEF_FUNCTION_TYPE (UNSIGNED) DEF_FUNCTION_TYPE (VOID) +DEF_FUNCTION_TYPE (PVOID) DEF_FUNCTION_TYPE (FLOAT, FLOAT) DEF_FUNCTION_TYPE (FLOAT128, FLOAT128) @@ -195,6 +197,7 @@ DEF_FUNCTION_TYPE (V8SF, V8SI) DEF_FUNCTION_TYPE (V8SI, V4SI) DEF_FUNCTION_TYPE (V8SI, V8SF) DEF_FUNCTION_TYPE (VOID, PCVOID) +DEF_FUNCTION_TYPE (VOID, PVOID) DEF_FUNCTION_TYPE (VOID, UNSIGNED) DEF_FUNCTION_TYPE (DI, V2DI, INT) @@ -301,7 +304,6 @@ DEF_FUNCTION_TYPE (VOID, UNSIGNED, UNSIGNED) DEF_FUNCTION_TYPE (INT, V16QI, V16QI, INT) DEF_FUNCTION_TYPE (UCHAR, UINT, UINT, UINT) DEF_FUNCTION_TYPE (UCHAR, UINT64, UINT, UINT) -DEF_FUNCTION_TYPE (UCHAR, USHORT, UINT, USHORT) DEF_FUNCTION_TYPE (V16HI, V16HI, V16HI, V16HI) DEF_FUNCTION_TYPE (V16QI, V16QI, QI, INT) DEF_FUNCTION_TYPE (V16QI, V16QI, V16QI, INT) @@ -343,7 +345,6 @@ DEF_FUNCTION_TYPE (VOID, PV4SF, V4SF, V4SF) DEF_FUNCTION_TYPE (VOID, PV8SF, V8SF, V8SF) DEF_FUNCTION_TYPE (VOID, UINT, UINT, UINT) DEF_FUNCTION_TYPE (VOID, UINT64, UINT, UINT) -DEF_FUNCTION_TYPE (VOID, USHORT, UINT, USHORT) DEF_FUNCTION_TYPE (VOID, V16QI, V16QI, PCHAR) DEF_FUNCTION_TYPE (VOID, V8QI, V8QI, PCHAR) DEF_FUNCTION_TYPE (V2DF, V2DF, V2DF, V2DI) diff --git a/gcc/config/i386/i386-modes.def b/gcc/config/i386/i386-modes.def index f2e06ee248f..c1e82cc6d79 100644 --- a/gcc/config/i386/i386-modes.def +++ b/gcc/config/i386/i386-modes.def @@ -80,6 +80,7 @@ VECTOR_MODES (FLOAT, 8); /* V4HF V2SF */ VECTOR_MODES (FLOAT, 16); /* V8HF V4SF V2DF */ VECTOR_MODES (FLOAT, 32); /* V16HF V8SF V4DF */ VECTOR_MODES (FLOAT, 64); /* V32HF V16SF V8DF */ +VECTOR_MODE (INT, TI, 1); /* V1TI */ VECTOR_MODE (INT, DI, 1); /* V1DI */ VECTOR_MODE (INT, SI, 1); /* V1SI */ VECTOR_MODE (INT, QI, 2); /* V2QI */ diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 0e58a176a82..dfe12dee4f9 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5346,7 +5346,7 @@ classify_argument (enum machine_mode mode, const_tree type, } /* for V1xx modes, just use the base mode */ - if (VECTOR_MODE_P (mode) && mode != V1DImode + if (VECTOR_MODE_P (mode) && mode != V1DImode && mode != V1TImode && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes) mode = GET_MODE_INNER (mode); @@ -5470,6 +5470,7 @@ classify_argument (enum machine_mode mode, const_tree type, classes[0] = X86_64_SSE_CLASS; classes[1] = X86_64_SSEUP_CLASS; return 2; + case V1TImode: case V1DImode: case V2SFmode: case V2SImode: @@ -5814,6 +5815,7 @@ function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode, case V4HImode: case V2SImode: case V2SFmode: + case V1TImode: case V1DImode: if (!type || !AGGREGATE_TYPE_P (type)) { @@ -6001,6 +6003,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode, case V4HImode: case V2SImode: case V2SFmode: + case V1TImode: case V1DImode: if (!type || !AGGREGATE_TYPE_P (type)) { @@ -16391,9 +16394,9 @@ ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p) { /* Shift higher 8 bytes to lower 8 bytes. */ src = gen_reg_rtx (imode); - emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src), - gen_lowpart (TImode, operands[1]), - GEN_INT (64))); + emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, src), + gen_lowpart (V1TImode, operands[1]), + GEN_INT (64))); } else src = operands[1]; @@ -21251,16 +21254,10 @@ enum ix86_builtins IX86_BUILTIN_VPCOMTRUEQ, /* LWP instructions. */ - IX86_BUILTIN_LLWPCB16, - IX86_BUILTIN_LLWPCB32, - IX86_BUILTIN_LLWPCB64, - IX86_BUILTIN_SLWPCB16, - IX86_BUILTIN_SLWPCB32, - IX86_BUILTIN_SLWPCB64, - IX86_BUILTIN_LWPVAL16, + IX86_BUILTIN_LLWPCB, + IX86_BUILTIN_SLWPCB, IX86_BUILTIN_LWPVAL32, IX86_BUILTIN_LWPVAL64, - IX86_BUILTIN_LWPINS16, IX86_BUILTIN_LWPINS32, IX86_BUILTIN_LWPINS64, @@ -21532,20 +21529,12 @@ static const struct builtin_description bdesc_special_args[] = { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF }, { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbhi1, "__builtin_ia32_llwpcb16", IX86_BUILTIN_LLWPCB16, UNKNOWN, (int) VOID_FTYPE_VOID }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbsi1, "__builtin_ia32_llwpcb32", IX86_BUILTIN_LLWPCB32, UNKNOWN, (int) VOID_FTYPE_VOID }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbdi1, "__builtin_ia32_llwpcb64", IX86_BUILTIN_LLWPCB64, UNKNOWN, (int) VOID_FTYPE_VOID }, - - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbhi1, "__builtin_ia32_slwpcb16", IX86_BUILTIN_SLWPCB16, UNKNOWN, (int) VOID_FTYPE_VOID }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbsi1, "__builtin_ia32_slwpcb32", IX86_BUILTIN_SLWPCB32, UNKNOWN, (int) VOID_FTYPE_VOID }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbdi1, "__builtin_ia32_slwpcb64", IX86_BUILTIN_SLWPCB64, UNKNOWN, (int) VOID_FTYPE_VOID }, - - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalhi3, "__builtin_ia32_lwpval16", IX86_BUILTIN_LWPVAL16, UNKNOWN, (int) VOID_FTYPE_USHORT_UINT_USHORT }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinshi3, "__builtin_ia32_lwpins16", IX86_BUILTIN_LWPINS16, UNKNOWN, (int) UCHAR_FTYPE_USHORT_UINT_USHORT }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT }, - { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT }, + { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT }, }; @@ -21900,7 +21889,7 @@ static const struct builtin_description bdesc_args[] = { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF }, { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF }, - { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT }, + { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlv1ti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT }, @@ -21908,7 +21897,7 @@ static const struct builtin_description bdesc_args[] = { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT }, - { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT }, + { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrv1ti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT }, { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT }, @@ -23506,7 +23495,7 @@ ix86_expand_args_builtin (const struct builtin_description *d, break; case V2DI_FTYPE_V2DI_INT_CONVERT: nargs = 2; - rmode = V2DImode; + rmode = V1TImode; nargs_constant = 1; break; case V8HI_FTYPE_V8HI_INT: @@ -23734,7 +23723,7 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, { rtx op; enum machine_mode mode; - } args[2]; + } args[3]; enum insn_code icode = d->icode; bool last_arg_constant = false; const struct insn_data *insn_p = &insn_data[icode]; @@ -23761,6 +23750,7 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, case V4DF_FTYPE_PCV2DF: case V4DF_FTYPE_PCDOUBLE: case V2DF_FTYPE_PCDOUBLE: + case VOID_FTYPE_PVOID: nargs = 1; klass = load; memory = 0; @@ -23804,15 +23794,14 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, /* Reserve memory operand for target. */ memory = ARRAY_SIZE (args); break; - case VOID_FTYPE_USHORT_UINT_USHORT: case VOID_FTYPE_UINT_UINT_UINT: case VOID_FTYPE_UINT64_UINT_UINT: - case UCHAR_FTYPE_USHORT_UINT_USHORT: case UCHAR_FTYPE_UINT_UINT_UINT: case UCHAR_FTYPE_UINT64_UINT_UINT: nargs = 3; - klass = store; - memory = 0; + klass = load; + memory = ARRAY_SIZE (args); + last_arg_constant = true; break; default: gcc_unreachable (); @@ -23850,12 +23839,16 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, if (last_arg_constant && (i + 1) == nargs) { if (!match) - switch (icode) - { - default: + { + if (icode == CODE_FOR_lwp_lwpvalsi3 + || icode == CODE_FOR_lwp_lwpinssi3 + || icode == CODE_FOR_lwp_lwpvaldi3 + || icode == CODE_FOR_lwp_lwpinsdi3) + error ("the last argument must be a 32-bit immediate"); + else error ("the last argument must be an 8-bit immediate"); - return const0_rtx; - } + return const0_rtx; + } } else { @@ -23893,6 +23886,9 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, case 2: pat = GEN_FCN (icode) (target, args[0].op, args[1].op); break; + case 3: + pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op); + break; default: gcc_unreachable (); } @@ -24205,6 +24201,23 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, return target; } + case IX86_BUILTIN_LLWPCB: + arg0 = CALL_EXPR_ARG (exp, 0); + op0 = expand_normal (arg0); + icode = CODE_FOR_lwp_llwpcb; + if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode)) + op0 = copy_to_mode_reg (Pmode, op0); + emit_insn (gen_lwp_llwpcb (op0)); + return 0; + + case IX86_BUILTIN_SLWPCB: + icode = CODE_FOR_lwp_slwpcb; + if (!target + || ! (*insn_data[icode].operand[0].predicate) (target, Pmode)) + target = gen_reg_rtx (Pmode); + emit_insn (gen_lwp_slwpcb (target)); + return target; + default: break; } diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 860d234efbd..962a14c8005 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1013,7 +1013,8 @@ enum target_cpu_default || (MODE) == V2DImode || (MODE) == DFmode) #define VALID_SSE_REG_MODE(MODE) \ - ((MODE) == TImode || (MODE) == V4SFmode || (MODE) == V4SImode \ + ((MODE) == V1TImode || (MODE) == TImode \ + || (MODE) == V4SFmode || (MODE) == V4SImode \ || (MODE) == SFmode || (MODE) == TFmode) #define VALID_MMX_REG_MODE_3DNOW(MODE) \ @@ -1051,11 +1052,11 @@ enum target_cpu_default /* Return true for modes passed in SSE registers. */ #define SSE_REG_MODE_P(MODE) \ - ((MODE) == TImode || (MODE) == V16QImode || (MODE) == TFmode \ - || (MODE) == V8HImode || (MODE) == V2DFmode || (MODE) == V2DImode \ - || (MODE) == V4SFmode || (MODE) == V4SImode || (MODE) == V32QImode \ - || (MODE) == V16HImode || (MODE) == V8SImode || (MODE) == V4DImode \ - || (MODE) == V8SFmode || (MODE) == V4DFmode) + ((MODE) == V1TImode || (MODE) == TImode || (MODE) == V16QImode \ + || (MODE) == TFmode || (MODE) == V8HImode || (MODE) == V2DFmode \ + || (MODE) == V2DImode || (MODE) == V4SFmode || (MODE) == V4SImode \ + || (MODE) == V32QImode || (MODE) == V16HImode || (MODE) == V8SImode \ + || (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode) /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */ diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index a4e688a8d14..b4a8a83064b 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -204,10 +204,6 @@ (UNSPEC_XOP_TRUEFALSE 152) (UNSPEC_XOP_PERMUTE 153) (UNSPEC_FRCZ 154) - (UNSPEC_LLWP_INTRINSIC 155) - (UNSPEC_SLWP_INTRINSIC 156) - (UNSPECV_LWPVAL_INTRINSIC 157) - (UNSPECV_LWPINS_INTRINSIC 158) ; For AES support (UNSPEC_AESENC 159) @@ -251,7 +247,11 @@ (UNSPECV_RDTSC 18) (UNSPECV_RDTSCP 19) (UNSPECV_RDPMC 20) - (UNSPECV_VSWAPMOV 21) + (UNSPECV_VSWAPMOV 21) + (UNSPECV_LLWP_INTRINSIC 22) + (UNSPECV_SLWP_INTRINSIC 23) + (UNSPECV_LWPVAL_INTRINSIC 24) + (UNSPECV_LWPINS_INTRINSIC 25) ]) ;; Constants to represent pcomtrue/pcomfalse variants @@ -578,7 +578,7 @@ ;; if the instruction is complex. (define_attr "memory" "none,load,store,both,unknown" - (cond [(eq_attr "type" "other,multi,str") + (cond [(eq_attr "type" "other,multi,str,lwp") (const_string "unknown") (eq_attr "type" "lea,fcmov,fpspc") (const_string "none") @@ -717,10 +717,8 @@ (umax "maxu") (umin "minu")]) (define_code_attr maxminfprefix [(smax "max") (smin "min")]) -;; Mapping of parallel logic operators +;; Mapping of logic operators (define_code_iterator any_logic [and ior xor]) - -;; Mapping of parallel logic operators (define_code_iterator any_or [ior xor]) ;; Base name for insn mnemonic. @@ -9680,37 +9678,6 @@ "TARGET_64BIT" "ix86_expand_binary_operator (ASHIFT, TImode, operands); DONE;") -;; This pattern must be defined before *ashlti3_1 to prevent -;; combine pass from converting sse2_ashlti3 to *ashlti3_1. - -(define_insn "*avx_ashlti3" - [(set (match_operand:TI 0 "register_operand" "=x") - (ashift:TI (match_operand:TI 1 "register_operand" "x") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] - "TARGET_AVX" -{ - operands[2] = GEN_INT (INTVAL (operands[2]) / 8); - return "vpslldq\t{%2, %1, %0|%0, %1, %2}"; -} - [(set_attr "type" "sseishft") - (set_attr "prefix" "vex") - (set_attr "length_immediate" "1") - (set_attr "mode" "TI")]) - -(define_insn "sse2_ashlti3" - [(set (match_operand:TI 0 "register_operand" "=x") - (ashift:TI (match_operand:TI 1 "register_operand" "0") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] - "TARGET_SSE2" -{ - operands[2] = GEN_INT (INTVAL (operands[2]) / 8); - return "pslldq\t{%2, %0|%0, %2}"; -} - [(set_attr "type" "sseishft") - (set_attr "prefix_data16" "1") - (set_attr "length_immediate" "1") - (set_attr "mode" "TI")]) - (define_insn "*ashlti3_1" [(set (match_operand:TI 0 "register_operand" "=&r,r") (ashift:TI (match_operand:TI 1 "reg_or_pm1_operand" "n,0") @@ -11534,37 +11501,6 @@ "TARGET_64BIT" "ix86_expand_binary_operator (LSHIFTRT, TImode, operands); DONE;") -;; This pattern must be defined before *lshrti3_1 to prevent -;; combine pass from converting sse2_lshrti3 to *lshrti3_1. - -(define_insn "*avx_lshrti3" - [(set (match_operand:TI 0 "register_operand" "=x") - (lshiftrt:TI (match_operand:TI 1 "register_operand" "x") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] - "TARGET_AVX" -{ - operands[2] = GEN_INT (INTVAL (operands[2]) / 8); - return "vpsrldq\t{%2, %1, %0|%0, %1, %2}"; -} - [(set_attr "type" "sseishft") - (set_attr "prefix" "vex") - (set_attr "length_immediate" "1") - (set_attr "mode" "TI")]) - -(define_insn "sse2_lshrti3" - [(set (match_operand:TI 0 "register_operand" "=x") - (lshiftrt:TI (match_operand:TI 1 "register_operand" "0") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] - "TARGET_SSE2" -{ - operands[2] = GEN_INT (INTVAL (operands[2]) / 8); - return "psrldq\t{%2, %0|%0, %2}"; -} - [(set_attr "type" "sseishft") - (set_attr "prefix_data16" "1") - (set_attr "length_immediate" "1") - (set_attr "mode" "TI")]) - (define_insn "*lshrti3_1" [(set (match_operand:TI 0 "register_operand" "=r") (lshiftrt:TI (match_operand:TI 1 "register_operand" "0") @@ -20835,113 +20771,86 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_insn "lwp_llwpcbhi1" - [(unspec [(match_operand:HI 0 "register_operand" "r")] - UNSPEC_LLWP_INTRINSIC)] - "TARGET_LWP" - "llwpcb\t%0" - [(set_attr "type" "lwp") - (set_attr "mode" "HI")]) - -(define_insn "lwp_llwpcbsi1" - [(unspec [(match_operand:SI 0 "register_operand" "r")] - UNSPEC_LLWP_INTRINSIC)] +(define_expand "lwp_llwpcb" + [(unspec_volatile [(match_operand 0 "register_operand" "r")] + UNSPECV_LLWP_INTRINSIC)] "TARGET_LWP" - "llwpcb\t%0" - [(set_attr "type" "lwp") - (set_attr "mode" "SI")]) + "") -(define_insn "lwp_llwpcbdi1" - [(unspec [(match_operand:DI 0 "register_operand" "r")] - UNSPEC_LLWP_INTRINSIC)] +(define_insn "*lwp_llwpcb<mode>1" + [(unspec_volatile [(match_operand:P 0 "register_operand" "r")] + UNSPECV_LLWP_INTRINSIC)] "TARGET_LWP" "llwpcb\t%0" [(set_attr "type" "lwp") - (set_attr "mode" "DI")]) - -(define_insn "lwp_slwpcbhi1" - [(unspec [(match_operand:HI 0 "register_operand" "r")] - UNSPEC_SLWP_INTRINSIC)] - "TARGET_LWP" - "slwpcb\t%0" - [(set_attr "type" "lwp") - (set_attr "mode" "HI")]) + (set_attr "mode" "<MODE>") + (set_attr "length" "5")]) -(define_insn "lwp_slwpcbsi1" - [(unspec [(match_operand:SI 0 "register_operand" "r")] - UNSPEC_SLWP_INTRINSIC)] +(define_expand "lwp_slwpcb" + [(set (match_operand 0 "register_operand" "=r") + (unspec_volatile [(const_int 0)] UNSPECV_SLWP_INTRINSIC))] "TARGET_LWP" - "slwpcb\t%0" - [(set_attr "type" "lwp") - (set_attr "mode" "SI")]) - -(define_insn "lwp_slwpcbdi1" - [(unspec [(match_operand:DI 0 "register_operand" "r")] - UNSPEC_SLWP_INTRINSIC)] + { + if (TARGET_64BIT) + emit_insn (gen_lwp_slwpcbdi (operands[0])); + else + emit_insn (gen_lwp_slwpcbsi (operands[0])); + DONE; + }) + +(define_insn "lwp_slwpcb<mode>" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec_volatile:P [(const_int 0)] UNSPECV_SLWP_INTRINSIC))] "TARGET_LWP" "slwpcb\t%0" [(set_attr "type" "lwp") - (set_attr "mode" "DI")]) - -(define_insn "lwp_lwpvalhi3" - [(unspec_volatile [(match_operand:HI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:HI 2 "const_int_operand" "")] - UNSPECV_LWPVAL_INTRINSIC)] - "TARGET_LWP" - "lwpval\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "lwp") - (set_attr "mode" "HI")]) + (set_attr "mode" "<MODE>") + (set_attr "length" "5")]) -(define_insn "lwp_lwpvalsi3" - [(unspec_volatile [(match_operand:SI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:SI 2 "const_int_operand" "")] +(define_expand "lwp_lwpval<mode>3" + [(unspec_volatile [(match_operand:SWI48 1 "register_operand" "r") + (match_operand:SI 2 "nonimmediate_operand" "rm") + (match_operand:SI 3 "const_int_operand" "i")] UNSPECV_LWPVAL_INTRINSIC)] "TARGET_LWP" - "lwpval\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "lwp") - (set_attr "mode" "SI")]) + "/* Avoid unused variable warning. */ + (void) operand0;") -(define_insn "lwp_lwpvaldi3" - [(unspec_volatile [(match_operand:DI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:SI 2 "const_int_operand" "")] +(define_insn "*lwp_lwpval<mode>3_1" + [(unspec_volatile [(match_operand:SWI48 0 "register_operand" "r") + (match_operand:SI 1 "nonimmediate_operand" "rm") + (match_operand:SI 2 "const_int_operand" "i")] UNSPECV_LWPVAL_INTRINSIC)] "TARGET_LWP" "lwpval\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "lwp") - (set_attr "mode" "DI")]) - -(define_insn "lwp_lwpinshi3" - [(unspec_volatile [(match_operand:HI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:HI 2 "const_int_operand" "")] - UNSPECV_LWPINS_INTRINSIC)] - "TARGET_LWP" - "lwpins\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "lwp") - (set_attr "mode" "HI")]) + (set_attr "mode" "<MODE>") + (set (attr "length") + (symbol_ref "ix86_attr_length_address_default (insn) + 9"))]) -(define_insn "lwp_lwpinssi3" - [(unspec_volatile [(match_operand:SI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:SI 2 "const_int_operand" "")] - UNSPECV_LWPINS_INTRINSIC)] +(define_expand "lwp_lwpins<mode>3" + [(set (reg:CCC FLAGS_REG) + (unspec_volatile:CCC [(match_operand:SWI48 1 "register_operand" "r") + (match_operand:SI 2 "nonimmediate_operand" "rm") + (match_operand:SI 3 "const_int_operand" "i")] + UNSPECV_LWPINS_INTRINSIC)) + (set (match_operand:QI 0 "nonimmediate_operand" "=qm") + (eq:QI (reg:CCC FLAGS_REG) (const_int 0)))] "TARGET_LWP" - "lwpins\t{%2, %1, %0|%0, %1, %2}" - [(set_attr "type" "lwp") - (set_attr "mode" "SI")]) + "") -(define_insn "lwp_lwpinsdi3" - [(unspec_volatile [(match_operand:DI 0 "register_operand" "r") - (match_operand:SI 1 "nonimmediate_operand" "rm") - (match_operand:SI 2 "const_int_operand" "")] - UNSPECV_LWPINS_INTRINSIC)] +(define_insn "*lwp_lwpins<mode>3_1" + [(set (reg:CCC FLAGS_REG) + (unspec_volatile:CCC [(match_operand:SWI48 0 "register_operand" "r") + (match_operand:SI 1 "nonimmediate_operand" "rm") + (match_operand:SI 2 "const_int_operand" "i")] + UNSPECV_LWPINS_INTRINSIC))] "TARGET_LWP" "lwpins\t{%2, %1, %0|%0, %1, %2}" [(set_attr "type" "lwp") - (set_attr "mode" "DI")]) + (set_attr "mode" "<MODE>") + (set (attr "length") + (symbol_ref "ix86_attr_length_address_default (insn) + 9"))]) (include "mmx.md") (include "sse.md") diff --git a/gcc/config/i386/lwpintrin.h b/gcc/config/i386/lwpintrin.h index e5137ec24f4..954b039e542 100644 --- a/gcc/config/i386/lwpintrin.h +++ b/gcc/config/i386/lwpintrin.h @@ -33,77 +33,68 @@ #else extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__llwpcb16 (void *pcbAddress) +__llwpcb (void *pcbAddress) { - __builtin_ia32_llwpcb16 (pcbAddress); -} - -extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__llwpcb32 (void *pcbAddress) -{ - __builtin_ia32_llwpcb32 (pcbAddress); -} - -extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__llwpcb64 (void *pcbAddress) -{ - __builtin_ia32_llwpcb64 (pcbAddress); -} - -extern __inline void * __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__slwpcb16 (void) -{ - return __builtin_ia32_slwpcb16 (); -} - -extern __inline void * __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__slwpcb32 (void) -{ - return __builtin_ia32_slwpcb32 (); + __builtin_ia32_llwpcb (pcbAddress); } extern __inline void * __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__slwpcb64 (void) +__slwpcb (void) { - return __builtin_ia32_slwpcb64 (); + return __builtin_ia32_slwpcb (); } -extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__lwpval16 (unsigned short data2, unsigned int data1, unsigned short flags) -{ - __builtin_ia32_lwpval16 (data2, data1, flags); -} -/* +#ifdef __OPTIMIZE__ extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __lwpval32 (unsigned int data2, unsigned int data1, unsigned int flags) { __builtin_ia32_lwpval32 (data2, data1, flags); } +#ifdef __x86_64__ extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__lwpval64 (unsigned __int64 data2, unsigned int data1, unsigned int flags) +__lwpval64 (unsigned long long data2, unsigned int data1, unsigned int flags) { __builtin_ia32_lwpval64 (data2, data1, flags); } +#endif +#else +#define __lwpval32(D2, D1, F) \ + (__builtin_ia32_lwpval32 ((unsigned int) (D2), (unsigned int) (D1), \ + (unsigned int) (F))) +#ifdef __x86_64__ +#define __lwpval64(D2, D1, F) \ + (__builtin_ia32_lwpval64 ((unsigned long long) (D2), (unsigned int) (D1), \ + (unsigned int) (F))) +#endif +#endif -extern __inline unsigned char __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__lwpins16 (unsigned short data2, unsigned int data1, unsigned short flags) -{ - return __builtin_ia32_lwpins16 (data2, data1, flags); -} +#ifdef __OPTIMIZE__ extern __inline unsigned char __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __lwpins32 (unsigned int data2, unsigned int data1, unsigned int flags) { return __builtin_ia32_lwpins32 (data2, data1, flags); } +#ifdef __x86_64__ extern __inline unsigned char __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__lwpins64 (unsigned __int64 data2, unsigned int data1, unsigned int flags) +__lwpins64 (unsigned long long data2, unsigned int data1, unsigned int flags) { return __builtin_ia32_lwpins64 (data2, data1, flags); } -*/ +#endif +#else +#define __lwpins32(D2, D1, F) \ + (__builtin_ia32_lwpins32 ((unsigned int) (D2), (unsigned int) (D1), \ + (unsigned int) (F))) +#ifdef __x86_64__ +#define __lwpins64(D2, D1, F) \ + (__builtin_ia32_lwpins64 ((unsigned long long) (D2), (unsigned int) (D1), \ + (unsigned int) (F))) +#endif +#endif + #endif /* __LWP__ */ #endif /* _LWPINTRIN_H_INCLUDED */ diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 24d66357be8..9bbea8031a5 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -19,12 +19,12 @@ ;; <http://www.gnu.org/licenses/>. -;; 16 byte integral modes handled by SSE, minus TImode, which gets -;; special-cased for TARGET_64BIT. +;; 16 byte integral modes handled by SSE (define_mode_iterator SSEMODEI [V16QI V8HI V4SI V2DI]) ;; All 16-byte vector modes handled by SSE (define_mode_iterator SSEMODE [V16QI V8HI V4SI V2DI V4SF V2DF]) +(define_mode_iterator SSEMODE16 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF]) ;; 32 byte integral vector modes handled by AVX (define_mode_iterator AVX256MODEI [V32QI V16HI V8SI V4DI]) @@ -39,7 +39,10 @@ (define_mode_iterator AVXMODEDI [V4DI V2DI]) ;; All vector modes handled by AVX -(define_mode_iterator AVXMODE [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF]) +(define_mode_iterator AVXMODE + [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF]) +(define_mode_iterator AVXMODE16 + [V16QI V8HI V4SI V2DI V1TI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF]) ;; Mix-n-match (define_mode_iterator SSEMODE12 [V16QI V8HI]) @@ -121,9 +124,9 @@ ;; Mapping for AVX (define_mode_attr avxvecmode - [(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V4SF "V4SF") - (V2DF "V2DF") (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI") - (V8SF "V8SF") (V4DF "V4DF")]) + [(V16QI "TI") (V8HI "TI") (V4SI "TI") (V2DI "TI") (V1TI "TI") + (V4SF "V4SF") (V8SF "V8SF") (V2DF "V2DF") (V4DF "V4DF") + (V32QI "OI") (V16HI "OI") (V8SI "OI") (V4DI "OI")]) (define_mode_attr avxvecpsmode [(V16QI "V4SF") (V8HI "V4SF") (V4SI "V4SF") (V2DI "V4SF") (V32QI "V8SF") (V16HI "V8SF") (V8SI "V8SF") (V4DI "V8SF")]) @@ -172,8 +175,8 @@ }) (define_insn "*avx_mov<mode>_internal" - [(set (match_operand:AVXMODE 0 "nonimmediate_operand" "=x,x ,m") - (match_operand:AVXMODE 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))] + [(set (match_operand:AVXMODE16 0 "nonimmediate_operand" "=x,x ,m") + (match_operand:AVXMODE16 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))] "TARGET_AVX && (register_operand (operands[0], <MODE>mode) || register_operand (operands[1], <MODE>mode))" @@ -207,8 +210,8 @@ ;; This is essential for maintaining stable calling conventions. (define_expand "mov<mode>" - [(set (match_operand:SSEMODE 0 "nonimmediate_operand" "") - (match_operand:SSEMODE 1 "nonimmediate_operand" ""))] + [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "") + (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))] "TARGET_SSE" { ix86_expand_vector_move (<MODE>mode, operands); @@ -216,8 +219,8 @@ }) (define_insn "*mov<mode>_internal" - [(set (match_operand:SSEMODE 0 "nonimmediate_operand" "=x,x ,m") - (match_operand:SSEMODE 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))] + [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "=x,x ,m") + (match_operand:SSEMODE16 1 "nonimmediate_or_sse_const_operand" "C ,xm,x"))] "TARGET_SSE && (register_operand (operands[0], <MODE>mode) || register_operand (operands[1], <MODE>mode))" @@ -326,7 +329,7 @@ }) (define_expand "push<mode>1" - [(match_operand:SSEMODE 0 "register_operand" "")] + [(match_operand:SSEMODE16 0 "register_operand" "")] "TARGET_SSE" { ix86_expand_push (<MODE>mode, operands[0]); @@ -343,8 +346,8 @@ }) (define_expand "movmisalign<mode>" - [(set (match_operand:SSEMODE 0 "nonimmediate_operand" "") - (match_operand:SSEMODE 1 "nonimmediate_operand" ""))] + [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "") + (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))] "TARGET_SSE" { ix86_expand_vector_move_misalign (<MODE>mode, operands); @@ -5537,12 +5540,12 @@ /* Shift both input vectors down one element, so that elements 3 and 1 are now in the slots for elements 2 and 0. For K8, at least, this is faster than using a shuffle. */ - emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, t2), - gen_lowpart (TImode, op1), - thirtytwo)); - emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, t3), - gen_lowpart (TImode, op2), - thirtytwo)); + emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2), + gen_lowpart (V1TImode, op1), + thirtytwo)); + emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3), + gen_lowpart (V1TImode, op2), + thirtytwo)); /* Multiply elements 3 and 1. */ emit_insn (gen_sse2_umulv2siv2di3 (gen_lowpart (V2DImode, t4), t2, t3)); @@ -5837,12 +5840,12 @@ t2 = gen_reg_rtx (V4SImode); t3 = gen_reg_rtx (V4SImode); - emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, t2), - gen_lowpart (TImode, operands[1]), - GEN_INT (32))); - emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, t3), - gen_lowpart (TImode, operands[2]), - GEN_INT (32))); + emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t2), + gen_lowpart (V1TImode, operands[1]), + GEN_INT (32))); + emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, t3), + gen_lowpart (V1TImode, operands[2]), + GEN_INT (32))); t4 = gen_reg_rtx (V2DImode); emit_insn (gen_sse2_umulv2siv2di3 (t4, t2, t3)); @@ -5881,6 +5884,21 @@ (const_string "0"))) (set_attr "mode" "TI")]) +(define_insn "*avx_lshrv1ti3" + [(set (match_operand:V1TI 0 "register_operand" "=x") + (lshiftrt:V1TI + (match_operand:V1TI 1 "register_operand" "x") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] + "TARGET_AVX" +{ + operands[2] = GEN_INT (INTVAL (operands[2]) / 8); + return "vpsrldq\t{%2, %1, %0|%0, %1, %2}"; +} + [(set_attr "type" "sseishft") + (set_attr "prefix" "vex") + (set_attr "length_immediate" "1") + (set_attr "mode" "TI")]) + (define_insn "*avx_lshr<mode>3" [(set (match_operand:SSEMODE248 0 "register_operand" "=x") (lshiftrt:SSEMODE248 @@ -5896,6 +5914,21 @@ (const_string "0"))) (set_attr "mode" "TI")]) +(define_insn "sse2_lshrv1ti3" + [(set (match_operand:V1TI 0 "register_operand" "=x") + (lshiftrt:V1TI + (match_operand:V1TI 1 "register_operand" "0") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] + "TARGET_SSE2" +{ + operands[2] = GEN_INT (INTVAL (operands[2]) / 8); + return "psrldq\t{%2, %0|%0, %2}"; +} + [(set_attr "type" "sseishft") + (set_attr "prefix_data16" "1") + (set_attr "length_immediate" "1") + (set_attr "mode" "TI")]) + (define_insn "lshr<mode>3" [(set (match_operand:SSEMODE248 0 "register_operand" "=x") (lshiftrt:SSEMODE248 @@ -5911,6 +5944,20 @@ (const_string "0"))) (set_attr "mode" "TI")]) +(define_insn "*avx_ashlv1ti3" + [(set (match_operand:V1TI 0 "register_operand" "=x") + (ashift:V1TI (match_operand:V1TI 1 "register_operand" "x") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] + "TARGET_AVX" +{ + operands[2] = GEN_INT (INTVAL (operands[2]) / 8); + return "vpslldq\t{%2, %1, %0|%0, %1, %2}"; +} + [(set_attr "type" "sseishft") + (set_attr "prefix" "vex") + (set_attr "length_immediate" "1") + (set_attr "mode" "TI")]) + (define_insn "*avx_ashl<mode>3" [(set (match_operand:SSEMODE248 0 "register_operand" "=x") (ashift:SSEMODE248 @@ -5926,6 +5973,20 @@ (const_string "0"))) (set_attr "mode" "TI")]) +(define_insn "sse2_ashlv1ti3" + [(set (match_operand:V1TI 0 "register_operand" "=x") + (ashift:V1TI (match_operand:V1TI 1 "register_operand" "0") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))] + "TARGET_SSE2" +{ + operands[2] = GEN_INT (INTVAL (operands[2]) / 8); + return "pslldq\t{%2, %0|%0, %2}"; +} + [(set_attr "type" "sseishft") + (set_attr "prefix_data16" "1") + (set_attr "length_immediate" "1") + (set_attr "mode" "TI")]) + (define_insn "ashl<mode>3" [(set (match_operand:SSEMODE248 0 "register_operand" "=x") (ashift:SSEMODE248 @@ -5943,22 +6004,24 @@ (define_expand "vec_shl_<mode>" [(set (match_operand:SSEMODEI 0 "register_operand" "") - (ashift:TI (match_operand:SSEMODEI 1 "register_operand" "") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))] + (ashift:V1TI + (match_operand:SSEMODEI 1 "register_operand" "") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))] "TARGET_SSE2" { - operands[0] = gen_lowpart (TImode, operands[0]); - operands[1] = gen_lowpart (TImode, operands[1]); + operands[0] = gen_lowpart (V1TImode, operands[0]); + operands[1] = gen_lowpart (V1TImode, operands[1]); }) (define_expand "vec_shr_<mode>" [(set (match_operand:SSEMODEI 0 "register_operand" "") - (lshiftrt:TI (match_operand:SSEMODEI 1 "register_operand" "") - (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))] + (lshiftrt:V1TI + (match_operand:SSEMODEI 1 "register_operand" "") + (match_operand:SI 2 "const_0_to_255_mul_8_operand" "")))] "TARGET_SSE2" { - operands[0] = gen_lowpart (TImode, operands[0]); - operands[1] = gen_lowpart (TImode, operands[1]); + operands[0] = gen_lowpart (V1TImode, operands[0]); + operands[1] = gen_lowpart (V1TImode, operands[1]); }) (define_insn "*avx_<code><mode>3" diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md index 7167a71932a..0df85c73037 100644 --- a/gcc/config/i386/sync.md +++ b/gcc/config/i386/sync.md @@ -18,13 +18,9 @@ ;; along with GCC; see the file COPYING3. If not see ;; <http://www.gnu.org/licenses/>. -(define_mode_iterator IMODE [QI HI SI (DI "TARGET_64BIT")]) -(define_mode_attr modesuffix [(QI "b") (HI "w") (SI "l") (DI "q")]) -(define_mode_attr modeconstraint [(QI "q") (HI "r") (SI "r") (DI "r")]) -(define_mode_attr immconstraint [(QI "i") (HI "i") (SI "i") (DI "e")]) - -(define_mode_iterator CASMODE [QI HI SI (DI "TARGET_64BIT || TARGET_CMPXCHG8B") - (TI "TARGET_64BIT && TARGET_CMPXCHG16B")]) +(define_mode_iterator CASMODE + [QI HI SI (DI "TARGET_64BIT || TARGET_CMPXCHG8B") + (TI "TARGET_64BIT && TARGET_CMPXCHG16B")]) (define_mode_iterator DCASMODE [(DI "!TARGET_64BIT && TARGET_CMPXCHG8B && !flag_pic") (TI "TARGET_64BIT && TARGET_CMPXCHG16B")]) @@ -105,21 +101,21 @@ }) (define_insn "*sync_compare_and_swap<mode>" - [(set (match_operand:IMODE 0 "register_operand" "=a") - (match_operand:IMODE 1 "memory_operand" "+m")) + [(set (match_operand:SWI 0 "register_operand" "=a") + (match_operand:SWI 1 "memory_operand" "+m")) (set (match_dup 1) - (unspec_volatile:IMODE + (unspec_volatile:SWI [(match_dup 1) - (match_operand:IMODE 2 "register_operand" "a") - (match_operand:IMODE 3 "register_operand" "<modeconstraint>")] + (match_operand:SWI 2 "register_operand" "a") + (match_operand:SWI 3 "register_operand" "<r>")] UNSPECV_CMPXCHG)) (set (reg:CCZ FLAGS_REG) (compare:CCZ - (unspec_volatile:IMODE + (unspec_volatile:SWI [(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG) (match_dup 2)))] "TARGET_CMPXCHG" - "lock{%;| }cmpxchg{<modesuffix>}\t{%3, %1|%1, %3}") + "lock{%;| }cmpxchg{<imodesuffix>}\t{%3, %1|%1, %3}") (define_insn "sync_double_compare_and_swap<mode>" [(set (match_operand:DCASMODE 0 "register_operand" "=A") @@ -169,31 +165,31 @@ "xchg{l}\t%%ebx, %3\;lock{%;| }cmpxchg8b\t%1\;xchg{l}\t%%ebx, %3") (define_insn "sync_old_add<mode>" - [(set (match_operand:IMODE 0 "register_operand" "=<modeconstraint>") - (unspec_volatile:IMODE - [(match_operand:IMODE 1 "memory_operand" "+m")] UNSPECV_XCHG)) + [(set (match_operand:SWI 0 "register_operand" "=<r>") + (unspec_volatile:SWI + [(match_operand:SWI 1 "memory_operand" "+m")] UNSPECV_XCHG)) (set (match_dup 1) - (plus:IMODE (match_dup 1) - (match_operand:IMODE 2 "register_operand" "0"))) + (plus:SWI (match_dup 1) + (match_operand:SWI 2 "register_operand" "0"))) (clobber (reg:CC FLAGS_REG))] "TARGET_XADD" - "lock{%;| }xadd{<modesuffix>}\t{%0, %1|%1, %0}") + "lock{%;| }xadd{<imodesuffix>}\t{%0, %1|%1, %0}") ;; Recall that xchg implicitly sets LOCK#, so adding it again wastes space. (define_insn "sync_lock_test_and_set<mode>" - [(set (match_operand:IMODE 0 "register_operand" "=<modeconstraint>") - (unspec_volatile:IMODE - [(match_operand:IMODE 1 "memory_operand" "+m")] UNSPECV_XCHG)) + [(set (match_operand:SWI 0 "register_operand" "=<r>") + (unspec_volatile:SWI + [(match_operand:SWI 1 "memory_operand" "+m")] UNSPECV_XCHG)) (set (match_dup 1) - (match_operand:IMODE 2 "register_operand" "0"))] + (match_operand:SWI 2 "register_operand" "0"))] "" - "xchg{<modesuffix>}\t{%1, %0|%0, %1}") + "xchg{<imodesuffix>}\t{%1, %0|%0, %1}") (define_insn "sync_add<mode>" - [(set (match_operand:IMODE 0 "memory_operand" "+m") - (unspec_volatile:IMODE - [(plus:IMODE (match_dup 0) - (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))] + [(set (match_operand:SWI 0 "memory_operand" "+m") + (unspec_volatile:SWI + [(plus:SWI (match_dup 0) + (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))] UNSPECV_LOCK)) (clobber (reg:CC FLAGS_REG))] "" @@ -201,19 +197,19 @@ if (TARGET_USE_INCDEC) { if (operands[1] == const1_rtx) - return "lock{%;| }inc{<modesuffix>}\t%0"; + return "lock{%;| }inc{<imodesuffix>}\t%0"; if (operands[1] == constm1_rtx) - return "lock{%;| }dec{<modesuffix>}\t%0"; + return "lock{%;| }dec{<imodesuffix>}\t%0"; } - return "lock{%;| }add{<modesuffix>}\t{%1, %0|%0, %1}"; + return "lock{%;| }add{<imodesuffix>}\t{%1, %0|%0, %1}"; }) (define_insn "sync_sub<mode>" - [(set (match_operand:IMODE 0 "memory_operand" "+m") - (unspec_volatile:IMODE - [(minus:IMODE (match_dup 0) - (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))] + [(set (match_operand:SWI 0 "memory_operand" "+m") + (unspec_volatile:SWI + [(minus:SWI (match_dup 0) + (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))] UNSPECV_LOCK)) (clobber (reg:CC FLAGS_REG))] "" @@ -221,40 +217,20 @@ if (TARGET_USE_INCDEC) { if (operands[1] == const1_rtx) - return "lock{%;| }dec{<modesuffix>}\t%0"; + return "lock{%;| }dec{<imodesuffix>}\t%0"; if (operands[1] == constm1_rtx) - return "lock{%;| }inc{<modesuffix>}\t%0"; + return "lock{%;| }inc{<imodesuffix>}\t%0"; } - return "lock{%;| }sub{<modesuffix>}\t{%1, %0|%0, %1}"; + return "lock{%;| }sub{<imodesuffix>}\t{%1, %0|%0, %1}"; }) -(define_insn "sync_ior<mode>" - [(set (match_operand:IMODE 0 "memory_operand" "+m") - (unspec_volatile:IMODE - [(ior:IMODE (match_dup 0) - (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))] - UNSPECV_LOCK)) - (clobber (reg:CC FLAGS_REG))] - "" - "lock{%;| }or{<modesuffix>}\t{%1, %0|%0, %1}") - -(define_insn "sync_and<mode>" - [(set (match_operand:IMODE 0 "memory_operand" "+m") - (unspec_volatile:IMODE - [(and:IMODE (match_dup 0) - (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))] - UNSPECV_LOCK)) - (clobber (reg:CC FLAGS_REG))] - "" - "lock{%;| }and{<modesuffix>}\t{%1, %0|%0, %1}") - -(define_insn "sync_xor<mode>" - [(set (match_operand:IMODE 0 "memory_operand" "+m") - (unspec_volatile:IMODE - [(xor:IMODE (match_dup 0) - (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))] +(define_insn "sync_<code><mode>" + [(set (match_operand:SWI 0 "memory_operand" "+m") + (unspec_volatile:SWI + [(any_logic:SWI (match_dup 0) + (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))] UNSPECV_LOCK)) (clobber (reg:CC FLAGS_REG))] "" - "lock{%;| }xor{<modesuffix>}\t{%1, %0|%0, %1}") + "lock{%;| }<logicprefix>{<imodesuffix>}\t{%1, %0|%0, %1}") diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c index 94354528ebf..da5a360665a 100644 --- a/gcc/config/rs6000/rs6000-c.c +++ b/gcc/config/rs6000/rs6000-c.c @@ -3365,7 +3365,7 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, stmt = build_unary_op (loc, ADDR_EXPR, stmt, 0); stmt = convert (innerptrtype, stmt); stmt = build_binary_op (loc, PLUS_EXPR, stmt, arg2, 1); - stmt = build_indirect_ref (loc, stmt, NULL); + stmt = build_indirect_ref (loc, stmt, RO_NULL); return stmt; } @@ -3444,7 +3444,7 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, stmt = build_unary_op (loc, ADDR_EXPR, stmt, 0); stmt = convert (innerptrtype, stmt); stmt = build_binary_op (loc, PLUS_EXPR, stmt, arg2, 1); - stmt = build_indirect_ref (loc, stmt, NULL); + stmt = build_indirect_ref (loc, stmt, RO_NULL); stmt = build2 (MODIFY_EXPR, TREE_TYPE (stmt), stmt, convert (TREE_TYPE (stmt), arg0)); stmt = build2 (COMPOUND_EXPR, arg1_type, stmt, decl); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 5e959db7ebc..f30cb38d246 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -12552,7 +12552,8 @@ "") (define_insn "probe_stack" - [(unspec [(match_operand 0 "memory_operand" "=m")] UNSPEC_PROBE_STACK)] + [(set (match_operand 0 "memory_operand" "=m") + (unspec [(const_int 0)] UNSPEC_PROBE_STACK))] "" "{st%U0%X0|stw%U0%X0} 0,%0" [(set_attr "type" "store") diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e51641b51a2..1b7411b835e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,81 @@ +2009-12-18 Shujing Zhao <pearly.zhao@oracle.com> + + PR c++/31665 + * decl.c (duplicate_decls, grokdeclarator): Put the diagnostics in + full sentences for easy translation and wrapped into G_(). + * typeck.c (build_x_unary_op): Likewise. + +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + * call.c (build_over_call, build_java_interface_fn_ref): Update + cp_build_indirect_ref calls. + * typeck2.c (build_m_component_ref): Likewise. + +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + * typeck.c (build_indirect_ref): Update the argument. + (build_x_indirect_ref): Likewise. + (cp_build_indirect_ref): Update the argument and emit the diagnostics + for easy translation. + (build_class_member_access_expr, build_array_ref, + get_member_function_from_ptrfunc): Update calls. + * cp-tree.h (build_x_indirect_ref, cp_build_indirect_ref): Update + prototypes. + * call.c (build_new_op, convert_like_real, build_x_va_arg, + build_over_call): Update calls. + * class.c (build_base_path, build_simple_base_path, build_vfn_ref): + Likewise. + * decl.c (start_preparsed_function): Likewise. + * except.c (expand_start_catch_block, build_throw): Likewise. + * init.c (emit_mem_initializers, expand_virtual_init, + expand_virtual_init, build_new_1, build_vec_init, build_delete, + build_vec_delete): Likewise. + * parser.c (cp_parser_unary_expression): Likewise. + * pt.c (tsubst_copy_and_build): Likewise. + * rtti.c (build_headof, get_tinfo_decl_dynamic, get_typeid): Likewise. + * semantics.c (finish_non_static_data_member, thisify_lambda_field): + Likewise. + * tree.c (build_dummy_object, stabilize_expr): Likewise. + * typeck2.c (build_x_arrow): Likewise. + +2009-12-16 Jason Merrill <jason@redhat.com> + + PR c++/42387 + * decl.c (compute_array_index_type): Mark a VLA as dependent. + +2009-12-15 Jason Merrill <jason@redhat.com> + + PR c++/42358 + * pt.c (iterative_hash_template_arg): Completely ignore + ARGUMENT_PACK_SELECT. + +2009-12-15 Jakub Jelinek <jakub@redhat.com> + + PR c++/41183 + * cp-tree.h (current_class_ptr): Give NULL even when cfun + has NULL cfun->language. + +2009-12-14 Jason Merrill <jason@redhat.com> + + PR c++/42364 + * pt.c (function_parameter_expanded_from_pack_p): Don't require + a pack to have a name. + (tsubst_decl): Do typedef magic after applying attributes. + +2009-12-15 Paolo Bonzini <bonzini@gnu.org> + Shujing Zhao <pearly.zhao@oracle.com> + + * Makefile.in (cp/pt.o): Depend on intl.h + * call.c (print_z_candidates): Make loop more compact, + choose head string depending on number of candidates, + extract creation of spaces string to intl.c. + * pt.c (print_overloaded_functions): Replace with... + (print_candidates_1): ... this rewrite. + (print_candidates): Rewrite to call print_candidates_1. + (most_specialized_class): Make loop more compact, + choose head string depending on number of candidates, + and size indents depending on translations. + 2009-12-11 Jason Merrill <jason@redhat.com> PR c++/42219 diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index 913993ac36f..9b134edee61 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -292,7 +292,7 @@ cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(RTL_H) $(FLAGS_H) $(EXPR_H) \ toplev.h except.h $(TM_P_H) cp/pt.o: cp/pt.c $(CXX_TREE_H) $(TM_H) cp/decl.h cp/cp-objcp-common.h \ toplev.h $(RTL_H) except.h $(TREE_INLINE_H) pointer-set.h gt-cp-pt.h \ - vecprim.h + vecprim.h intl.h cp/error.o: cp/error.c $(CXX_TREE_H) $(TM_H) toplev.h $(DIAGNOSTIC_H) \ $(FLAGS_H) $(REAL_H) $(LANGHOOKS_DEF_H) $(CXX_PRETTY_PRINT_H) cp/repo.o: cp/repo.c $(CXX_TREE_H) $(TM_H) toplev.h $(DIAGNOSTIC_H) \ diff --git a/gcc/cp/call.c b/gcc/cp/call.c index a6041f5596f..0ed338301c5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -2730,6 +2730,7 @@ print_z_candidates (struct z_candidate *candidates) const char *str; struct z_candidate *cand1; struct z_candidate **cand2; + char *spaces; if (!candidates) return; @@ -2770,25 +2771,14 @@ print_z_candidates (struct z_candidate *candidates) } } - str = _("candidates are:"); - print_z_candidate (str, candidates); - if (candidates->next) + str = candidates->next ? _("candidates are:") : _("candidate is:"); + spaces = NULL; + for (; candidates; candidates = candidates->next) { - /* Indent successive candidates by the width of the translation - of the above string. */ - size_t len = gcc_gettext_width (str) + 1; - char *spaces = (char *) alloca (len); - memset (spaces, ' ', len-1); - spaces[len - 1] = '\0'; - - candidates = candidates->next; - do - { - print_z_candidate (spaces, candidates); - candidates = candidates->next; - } - while (candidates); + print_z_candidate (spaces ? spaces : str, candidates); + spaces = spaces ? spaces : get_spaces (str); } + free (spaces); } /* USER_SEQ is a user-defined conversion sequence, beginning with a @@ -4474,7 +4464,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, return cp_build_modify_expr (arg1, code2, arg2, complain); case INDIRECT_REF: - return cp_build_indirect_ref (arg1, "unary *", complain); + return cp_build_indirect_ref (arg1, RO_UNARY_STAR, complain); case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: @@ -4519,7 +4509,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, return build_array_ref (input_location, arg1, arg2); case MEMBER_REF: - return build_m_component_ref (cp_build_indirect_ref (arg1, NULL, + return build_m_component_ref (cp_build_indirect_ref (arg1, RO_NULL, complain), arg2); @@ -5034,7 +5024,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, expr = cp_build_unary_op (ADDR_EXPR, expr, 0, complain); expr = convert_to_base (expr, build_pointer_type (totype), !c_cast_p, /*nonnull=*/true); - expr = cp_build_indirect_ref (expr, "implicit conversion", complain); + expr = cp_build_indirect_ref (expr, RO_IMPLICIT_CONVERSION, complain); return expr; } @@ -5252,7 +5242,7 @@ build_x_va_arg (tree expr, tree type) error ("cannot receive objects of non-trivially-copyable type %q#T " "through %<...%>; ", type); expr = convert (build_pointer_type (type1), null_node); - expr = cp_build_indirect_ref (expr, NULL, tf_warning_or_error); + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); return expr; } @@ -5749,7 +5739,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) if (targ) arg = targ; else - arg = cp_build_indirect_ref (arg, 0, complain); + arg = cp_build_indirect_ref (arg, RO_NULL, complain); if (TREE_CODE (arg) == TARGET_EXPR && TARGET_EXPR_LIST_INIT_P (arg)) @@ -5784,7 +5774,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) || (TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)) && !move_fn_p (fn))) { - tree to = stabilize_reference (cp_build_indirect_ref (fa, 0, + tree to = stabilize_reference (cp_build_indirect_ref (fa, RO_NULL, complain)); val = build2 (INIT_EXPR, DECL_CONTEXT (fn), to, arg); @@ -5796,14 +5786,14 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) && TYPE_HAS_TRIVIAL_ASSIGN_REF (DECL_CONTEXT (fn))) { tree to = stabilize_reference - (cp_build_indirect_ref (argarray[0], 0, complain)); + (cp_build_indirect_ref (argarray[0], RO_NULL, complain)); tree type = TREE_TYPE (to); tree as_base = CLASSTYPE_AS_BASE (type); tree arg = argarray[1]; if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base))) { - arg = cp_build_indirect_ref (arg, 0, complain); + arg = cp_build_indirect_ref (arg, RO_NULL, complain); val = build2 (MODIFY_EXPR, TREE_TYPE (to), to, arg); } else @@ -5836,7 +5826,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) t = convert (TREE_TYPE (arg0), t); if (test) t = build3 (COND_EXPR, TREE_TYPE (t), test, arg0, t); - val = cp_build_indirect_ref (t, 0, complain); + val = cp_build_indirect_ref (t, RO_NULL, complain); TREE_NO_WARNING (val) = 1; } @@ -5944,7 +5934,7 @@ build_java_interface_fn_ref (tree fn, tree instance) /* Look up the pointer to the runtime java.lang.Class object for `instance'. This is the first entry in the vtable. */ - klass_ref = build_vtbl_ref (cp_build_indirect_ref (instance, 0, + klass_ref = build_vtbl_ref (cp_build_indirect_ref (instance, RO_NULL, tf_warning_or_error), integer_zero_node); diff --git a/gcc/cp/class.c b/gcc/cp/class.c index fff438033d3..16d566682a6 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -297,7 +297,7 @@ build_base_path (enum tree_code code, { expr = build_nop (build_pointer_type (target_type), expr); if (!want_pointer) - expr = build_indirect_ref (EXPR_LOCATION (expr), expr, NULL); + expr = build_indirect_ref (EXPR_LOCATION (expr), expr, RO_NULL); return expr; } @@ -343,7 +343,7 @@ build_base_path (enum tree_code code, interesting to the optimizers anyway. */ && !has_empty) { - expr = cp_build_indirect_ref (expr, NULL, tf_warning_or_error); + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); expr = build_simple_base_path (expr, binfo); if (want_pointer) expr = build_address (expr); @@ -368,11 +368,11 @@ build_base_path (enum tree_code code, t = TREE_TYPE (TYPE_VFIELD (current_class_type)); t = build_pointer_type (t); v_offset = convert (t, current_vtt_parm); - v_offset = cp_build_indirect_ref (v_offset, NULL, + v_offset = cp_build_indirect_ref (v_offset, RO_NULL, tf_warning_or_error); } else - v_offset = build_vfield_ref (cp_build_indirect_ref (expr, NULL, + v_offset = build_vfield_ref (cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error), TREE_TYPE (TREE_TYPE (expr))); @@ -381,7 +381,7 @@ build_base_path (enum tree_code code, v_offset = build1 (NOP_EXPR, build_pointer_type (ptrdiff_type_node), v_offset); - v_offset = cp_build_indirect_ref (v_offset, NULL, tf_warning_or_error); + v_offset = cp_build_indirect_ref (v_offset, RO_NULL, tf_warning_or_error); TREE_CONSTANT (v_offset) = 1; offset = convert_to_integer (ptrdiff_type_node, @@ -424,7 +424,7 @@ build_base_path (enum tree_code code, null_test = NULL; if (!want_pointer) - expr = cp_build_indirect_ref (expr, NULL, tf_warning_or_error); + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); out: if (null_test) @@ -458,7 +458,7 @@ build_simple_base_path (tree expr, tree binfo) in the back end. */ temp = unary_complex_lvalue (ADDR_EXPR, expr); if (temp) - expr = cp_build_indirect_ref (temp, NULL, tf_warning_or_error); + expr = cp_build_indirect_ref (temp, RO_NULL, tf_warning_or_error); return expr; } @@ -646,7 +646,7 @@ build_vfn_ref (tree instance_ptr, tree idx) { tree aref; - aref = build_vtbl_ref_1 (cp_build_indirect_ref (instance_ptr, 0, + aref = build_vtbl_ref_1 (cp_build_indirect_ref (instance_ptr, RO_NULL, tf_warning_or_error), idx); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index eb7f06d33bb..469dcecb184 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1026,7 +1026,8 @@ struct GTY(()) language_function { expression for `*this'. */ #define current_class_ptr \ - (cfun ? cp_function_chain->x_current_class_ptr : NULL_TREE) + (cfun && cp_function_chain \ + ? cp_function_chain->x_current_class_ptr : NULL_TREE) #define current_class_ref \ (cfun ? cp_function_chain->x_current_class_ref : NULL_TREE) @@ -5296,9 +5297,9 @@ extern tree build_class_member_access_expr (tree, tree, tree, bool, tsubst_flags_t); extern tree finish_class_member_access_expr (tree, tree, bool, tsubst_flags_t); -extern tree build_x_indirect_ref (tree, const char *, +extern tree build_x_indirect_ref (tree, ref_operator, tsubst_flags_t); -extern tree cp_build_indirect_ref (tree, const char *, +extern tree cp_build_indirect_ref (tree, ref_operator, tsubst_flags_t); extern tree build_array_ref (location_t, tree, tree); extern tree get_member_function_from_ptrfunc (tree *, tree); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5b37ef7e710..3c9649d2a27 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1180,9 +1180,10 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) bad choice of name. */ if (! TREE_PUBLIC (newdecl)) { - warning (OPT_Wshadow, "shadowing %s function %q#D", - DECL_BUILT_IN (olddecl) ? "built-in" : "library", - olddecl); + warning (OPT_Wshadow, + DECL_BUILT_IN (olddecl) + ? G_("shadowing built-in function %q#D") + : G_("shadowing library function %q#D"), olddecl); /* Discard the old built-in function. */ return NULL_TREE; } @@ -1253,9 +1254,10 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) olddecl); } else - warning (OPT_Wshadow, "shadowing %s function %q#D", - DECL_BUILT_IN (olddecl) ? "built-in" : "library", - olddecl); + warning (OPT_Wshadow, + DECL_BUILT_IN (olddecl) + ? G_("shadowing built-in function %q#D") + : G_("shadowing library function %q#D"), olddecl); } else /* Discard the old built-in function. */ @@ -7270,11 +7272,8 @@ compute_array_index_type (tree name, tree size) structural equality checks. */ itype = build_index_type (build_min (MINUS_EXPR, sizetype, size, integer_one_node)); - if (!TREE_SIDE_EFFECTS (size)) - { - TYPE_DEPENDENT_P (itype) = 1; - TYPE_DEPENDENT_P_VALID (itype) = 1; - } + TYPE_DEPENDENT_P (itype) = 1; + TYPE_DEPENDENT_P_VALID (itype) = 1; SET_TYPE_STRUCTURAL_EQUALITY (itype); return itype; } @@ -8619,8 +8618,9 @@ grokdeclarator (const cp_declarator *declarator, if (TREE_CODE (type) == FUNCTION_TYPE && cp_type_quals (type) != TYPE_UNQUALIFIED) - error ("cannot declare %s to qualified function type %qT", - declarator->kind == cdk_reference ? "reference" : "pointer", + error (declarator->kind == cdk_reference + ? G_("cannot declare reference to qualified function type %qT") + : G_("cannot declare pointer to qualified function type %qT"), type); if (declarator->kind == cdk_reference) @@ -11919,7 +11919,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) gcc_assert (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE); cp_function_chain->x_current_class_ref - = cp_build_indirect_ref (t, NULL, tf_warning_or_error); + = cp_build_indirect_ref (t, RO_NULL, tf_warning_or_error); cp_function_chain->x_current_class_ptr = t; /* Constructors and destructors need to know whether they're "in diff --git a/gcc/cp/except.c b/gcc/cp/except.c index 66dc14eaefb..83164c86a7e 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -442,7 +442,7 @@ expand_start_catch_block (tree decl) fold_build1_loc (input_location, NEGATE_EXPR, sizetype, TYPE_SIZE_UNIT (TREE_TYPE (exp)))); - exp = cp_build_indirect_ref (exp, NULL, tf_warning_or_error); + exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error); initialize_handler_parm (decl, exp); return type; } @@ -718,7 +718,7 @@ build_throw (tree exp) allocate_expr = get_target_expr (allocate_expr); ptr = TARGET_EXPR_SLOT (allocate_expr); object = build_nop (build_pointer_type (temp_type), ptr); - object = cp_build_indirect_ref (object, NULL, tf_warning_or_error); + object = cp_build_indirect_ref (object, RO_NULL, tf_warning_or_error); elided = (TREE_CODE (exp) == TARGET_EXPR); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index e6397446b02..1bd80ffa0f8 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -834,7 +834,7 @@ emit_mem_initializers (tree mem_inits) base_addr = build_base_path (PLUS_EXPR, current_class_ptr, subobject, 1); expand_aggr_init_1 (subobject, NULL_TREE, - cp_build_indirect_ref (base_addr, NULL, + cp_build_indirect_ref (base_addr, RO_NULL, tf_warning_or_error), arguments, LOOKUP_NORMAL, @@ -918,7 +918,7 @@ expand_virtual_init (tree binfo, tree decl) TREE_TYPE (vtt_parm), vtt_parm, vtt_index); - vtbl2 = cp_build_indirect_ref (vtbl2, NULL, tf_warning_or_error); + vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error); vtbl2 = convert (TREE_TYPE (vtbl), vtbl2); /* The actual initializer is the VTT value only in the subobject @@ -933,7 +933,7 @@ expand_virtual_init (tree binfo, tree decl) } /* Compute the location of the vtpr. */ - vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, NULL, + vtbl_ptr = build_vfield_ref (cp_build_indirect_ref (decl, RO_NULL, tf_warning_or_error), TREE_TYPE (binfo)); gcc_assert (vtbl_ptr != error_mark_node); @@ -2055,7 +2055,7 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, alloc_node, cookie_ptr); size_ptr_type = build_pointer_type (sizetype); cookie_ptr = fold_convert (size_ptr_type, cookie_ptr); - cookie = cp_build_indirect_ref (cookie_ptr, NULL, complain); + cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain); cookie_expr = build2 (MODIFY_EXPR, sizetype, cookie, nelts); @@ -2067,7 +2067,7 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, NEGATE_EXPR, sizetype, size_in_bytes (sizetype))); - cookie = cp_build_indirect_ref (cookie_ptr, NULL, complain); + cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain); cookie = build2 (MODIFY_EXPR, sizetype, cookie, size_in_bytes (elt_type)); cookie_expr = build2 (COMPOUND_EXPR, TREE_TYPE (cookie_expr), @@ -2154,7 +2154,7 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, } else { - init_expr = cp_build_indirect_ref (data_addr, NULL, complain); + init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain); if (TYPE_NEEDS_CONSTRUCTING (type) && !explicit_value_init_p) { @@ -2949,7 +2949,7 @@ build_vec_init (tree base, tree maxindex, tree init, { atype = build_pointer_type (atype); stmt_expr = build1 (NOP_EXPR, atype, stmt_expr); - stmt_expr = cp_build_indirect_ref (stmt_expr, NULL, complain); + stmt_expr = cp_build_indirect_ref (stmt_expr, RO_NULL, complain); TREE_NO_WARNING (stmt_expr) = 1; } @@ -3144,7 +3144,7 @@ build_delete (tree type, tree addr, special_function_kind auto_delete, /*alloc_fn=*/NULL_TREE); } - expr = build_dtor_call (cp_build_indirect_ref (addr, NULL, + expr = build_dtor_call (cp_build_indirect_ref (addr, RO_NULL, tf_warning_or_error), auto_delete, flags); if (do_delete) @@ -3298,7 +3298,7 @@ build_vec_delete (tree base, tree maxindex, size_ptr_type, fold_convert (size_ptr_type, base), cookie_addr); - maxindex = cp_build_indirect_ref (cookie_addr, NULL, tf_warning_or_error); + maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, tf_warning_or_error); } else if (TREE_CODE (type) == ARRAY_TYPE) { diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f65dda48cc7..ee4fece6818 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5628,7 +5628,7 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p, { case INDIRECT_REF: non_constant_p = "%<*%>"; - expression = build_x_indirect_ref (cast_expression, "unary *", + expression = build_x_indirect_ref (cast_expression, RO_UNARY_STAR, tf_warning_or_error); break; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6f76d46d527..395a026311c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "tm.h" #include "obstack.h" #include "tree.h" +#include "intl.h" #include "pointer-set.h" #include "flags.h" #include "c-common.h" @@ -1456,6 +1457,11 @@ iterative_hash_template_arg (tree arg, hashval_t val) if (!TYPE_P (arg)) STRIP_NOPS (arg); + if (TREE_CODE (arg) == ARGUMENT_PACK_SELECT) + /* We can get one of these when re-hashing a previous entry in the middle + of substituting into a pack expansion. Just look through it. */ + arg = ARGUMENT_PACK_SELECT_FROM_PACK (arg); + code = TREE_CODE (arg); tclass = TREE_CODE_CLASS (code); @@ -1481,11 +1487,6 @@ iterative_hash_template_arg (tree arg, hashval_t val) case EXPR_PACK_EXPANSION: return iterative_hash_template_arg (PACK_EXPANSION_PATTERN (arg), val); - case ARGUMENT_PACK_SELECT: - /* We can get one of these when re-hashing a previous entry in the middle - of substituting into a pack expansion. Just look through it... */ - arg = ARGUMENT_PACK_SELECT_FROM_PACK (arg); - /* ...and fall through. */ case TYPE_ARGUMENT_PACK: case NONTYPE_ARGUMENT_PACK: return iterative_hash_template_arg (ARGUMENT_PACK_ARGS (arg), val); @@ -1646,19 +1647,52 @@ explicit_class_specialization_p (tree type) return !uses_template_parms (CLASSTYPE_TI_ARGS (type)); } -/* Print the list of overloaded FNS in an error message. */ +/* Print the list of functions at FNS, going through all the overloads + for each element of the list. Alternatively, FNS can not be a + TREE_LIST, in which case it will be printed together with all the + overloads. + + MORE and *STR should respectively be FALSE and NULL when the function + is called from the outside. They are used internally on recursive + calls. print_candidates manages the two parameters and leaves NULL + in *STR when it ends. */ static void -print_overloaded_functions (tree fns, const char **str) +print_candidates_1 (tree fns, bool more, const char **str) { - tree fn; + tree fn, fn2; + char *spaces = NULL; + for (fn = fns; fn; fn = OVL_NEXT (fn)) + if (TREE_CODE (fn) == TREE_LIST) + { + gcc_assert (!OVL_NEXT (fn) && !is_overloaded_fn (fn)); + for (fn2 = fn; fn2 != NULL_TREE; fn2 = TREE_CHAIN (fn2)) + print_candidates_1 (TREE_VALUE (fn2), + TREE_CHAIN (fn2) || more, str); + } + else + { + if (!*str) + { + /* Pick the prefix string. */ + if (!more && !OVL_NEXT (fns)) + { + error ("candidate is: %+#D", OVL_CURRENT (fn)); + continue; + } + + *str = _("candidates are:"); + spaces = get_spaces (*str); + } + error ("%s %+#D", *str, OVL_CURRENT (fn)); + *str = spaces ? spaces : *str; + } + + if (!more) { - if (TREE_CODE (fn) == TREE_LIST) - print_candidates (fn); - else - error ("%s %+#D", *str, OVL_CURRENT (fn)); - *str = " "; + free (spaces); + *str = NULL; } } @@ -1667,16 +1701,9 @@ print_overloaded_functions (tree fns, const char **str) void print_candidates (tree fns) { - const char *str = "candidates are:"; - - if (is_overloaded_fn (fns)) - print_overloaded_functions (fns, &str); - else - { - tree fn; - for (fn = fns; fn != NULL_TREE; fn = TREE_CHAIN (fn)) - print_overloaded_functions (TREE_VALUE (fn), &str); - } + const char *str = NULL; + print_candidates_1 (fns, false, &str); + gcc_assert (str == NULL); } /* Returns the template (one of the functions given by TEMPLATE_ID) @@ -2703,15 +2730,13 @@ get_function_template_decl (const_tree primary_func_tmpl_inst) bool function_parameter_expanded_from_pack_p (tree param_decl, tree pack) { - if (DECL_ARTIFICIAL (param_decl) - || !function_parameter_pack_p (pack)) - return false; - - gcc_assert (DECL_NAME (param_decl) && DECL_NAME (pack)); + if (DECL_ARTIFICIAL (param_decl) + || !function_parameter_pack_p (pack)) + return false; - /* The parameter pack and its pack arguments have the same - DECL_PARM_INDEX. */ - return DECL_PARM_INDEX (pack) == DECL_PARM_INDEX (param_decl); + /* The parameter pack and its pack arguments have the same + DECL_PARM_INDEX. */ + return DECL_PARM_INDEX (pack) == DECL_PARM_INDEX (param_decl); } /* Determine whether ARGS describes a variadic template args list, @@ -9246,7 +9271,13 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) /* Create a new node for the specialization we need. */ r = copy_decl (t); if (type == NULL_TREE) - type = tsubst (TREE_TYPE (t), args, complain, in_decl); + { + if (is_typedef_decl (t)) + type = DECL_ORIGINAL_TYPE (t); + else + type = TREE_TYPE (t); + type = tsubst (type, args, complain, in_decl); + } if (TREE_CODE (r) == VAR_DECL) { /* Even if the original location is out of scope, the @@ -9317,16 +9348,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) } determine_visibility (r); } - /* Preserve a typedef that names a type. */ - else if (TREE_CODE (r) == TYPE_DECL - && DECL_ORIGINAL_TYPE (t) - && type != error_mark_node) - { - DECL_ORIGINAL_TYPE (r) = tsubst (DECL_ORIGINAL_TYPE (t), - args, complain, in_decl); - TREE_TYPE (r) = type = build_variant_type_copy (type); - TYPE_NAME (type) = r; - } if (!local_p) { @@ -9364,6 +9385,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) apply_late_template_attributes (&r, DECL_ATTRIBUTES (r), (int) ATTR_FLAG_TYPE_IN_PLACE, args, complain, in_decl); + + /* Preserve a typedef that names a type. */ + if (is_typedef_decl (r)) + { + DECL_ORIGINAL_TYPE (r) = NULL_TREE; + set_underlying_type (r); + } + layout_decl (r, 0); } break; @@ -11829,7 +11858,7 @@ tsubst_copy_and_build (tree t, r = convert_from_reference (r); } else - r = build_x_indirect_ref (r, "unary *", complain); + r = build_x_indirect_ref (r, RO_UNARY_STAR, complain); return r; } @@ -15753,13 +15782,16 @@ most_specialized_class (tree type, tree tmpl) if (ambiguous_p) { - const char *str = "candidates are:"; + const char *str; + char *spaces = NULL; error ("ambiguous class template instantiation for %q#T", type); + str = TREE_CHAIN (list) ? _("candidates are:") : _("candidate is:"); for (t = list; t; t = TREE_CHAIN (t)) - { - error ("%s %+#T", str, TREE_TYPE (t)); - str = " "; - } + { + error ("%s %+#T", spaces ? spaces : str, TREE_TYPE (t)); + spaces = spaces ? spaces : get_spaces (str); + } + free (spaces); return error_mark_node; } diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 7378f89fd1a..0f7225fc542 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -188,7 +188,7 @@ build_headof (tree exp) index = build_int_cst (NULL_TREE, -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE); - offset = build_vtbl_ref (cp_build_indirect_ref (exp, NULL, + offset = build_vtbl_ref (cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error), index); @@ -277,7 +277,7 @@ get_tinfo_decl_dynamic (tree exp) /* Otherwise return the type_info for the static type of the expr. */ t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type)); - return cp_build_indirect_ref (t, NULL, tf_warning_or_error); + return cp_build_indirect_ref (t, RO_NULL, tf_warning_or_error); } static bool @@ -483,7 +483,7 @@ get_typeid (tree type) if (!type) return error_mark_node; - return cp_build_indirect_ref (get_tinfo_ptr (type), NULL, + return cp_build_indirect_ref (get_tinfo_ptr (type), RO_NULL, tf_warning_or_error); } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 841efc8fafc..547e89934c1 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1458,7 +1458,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) object = cp_build_indirect_ref (lambda_expr_this_capture (CLASSTYPE_LAMBDA_EXPR (TREE_TYPE (object))), - /*errorstring=*/"", + RO_NULL, /*complain=*/tf_warning_or_error); if (current_class_ptr) @@ -5689,7 +5689,7 @@ thisify_lambda_field (tree decl) { tree context = lambda_function (DECL_CONTEXT (decl)); tree object = cp_build_indirect_ref (DECL_ARGUMENTS (context), - /*errorstring*/"", + RO_NULL, tf_warning_or_error); return finish_non_static_data_member (decl, object, /*qualifying_scope*/NULL_TREE); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 7097f8c68b6..865abbcfdd3 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2292,7 +2292,7 @@ tree build_dummy_object (tree type) { tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node); - return cp_build_indirect_ref (decl, NULL, tf_warning_or_error); + return cp_build_indirect_ref (decl, RO_NULL, tf_warning_or_error); } /* We've gotten a reference to a member of TYPE. Return *this if appropriate, @@ -2956,7 +2956,7 @@ stabilize_expr (tree exp, tree* initp) exp = cp_build_unary_op (ADDR_EXPR, exp, 1, tf_warning_or_error); init_expr = get_target_expr (exp); exp = TARGET_EXPR_SLOT (init_expr); - exp = cp_build_indirect_ref (exp, 0, tf_warning_or_error); + exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error); } *initp = init_expr; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 782502d2734..e001a07771f 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2092,7 +2092,7 @@ build_class_member_access_expr (tree object, tree member, { tree temp = unary_complex_lvalue (ADDR_EXPR, object); if (temp) - object = cp_build_indirect_ref (temp, NULL, complain); + object = cp_build_indirect_ref (temp, RO_NULL, complain); } /* In [expr.ref], there is an explicit list of the valid choices for @@ -2592,7 +2592,7 @@ build_ptrmemfunc_access_expr (tree ptrmem, tree member_name) Must also handle REFERENCE_TYPEs for C++. */ tree -build_x_indirect_ref (tree expr, const char *errorstring, +build_x_indirect_ref (tree expr, ref_operator errorstring, tsubst_flags_t complain) { tree orig_expr = expr; @@ -2623,13 +2623,13 @@ build_x_indirect_ref (tree expr, const char *errorstring, /* Helper function called from c-common. */ tree build_indirect_ref (location_t loc __attribute__ ((__unused__)), - tree ptr, const char *errorstring) + tree ptr, ref_operator errorstring) { return cp_build_indirect_ref (ptr, errorstring, tf_warning_or_error); } tree -cp_build_indirect_ref (tree ptr, const char *errorstring, +cp_build_indirect_ref (tree ptr, ref_operator errorstring, tsubst_flags_t complain) { tree pointer, type; @@ -2697,14 +2697,38 @@ cp_build_indirect_ref (tree ptr, const char *errorstring, /* `pointer' won't be an error_mark_node if we were given a pointer to member, so it's cool to check for this here. */ else if (TYPE_PTR_TO_MEMBER_P (type)) - error ("invalid use of %qs on pointer to member", errorstring); + switch (errorstring) + { + case RO_ARRAY_INDEXING: + error ("invalid use of array indexing on pointer to member"); + break; + case RO_UNARY_STAR: + error ("invalid use of unary %<*%> on pointer to member"); + break; + case RO_IMPLICIT_CONVERSION: + error ("invalid use of implicit conversion on pointer to member"); + break; + default: + gcc_unreachable (); + } else if (pointer != error_mark_node) - { - if (errorstring) - error ("invalid type argument of %qs", errorstring); - else - error ("invalid type argument"); - } + switch (errorstring) + { + case RO_NULL: + error ("invalid type argument"); + break; + case RO_ARRAY_INDEXING: + error ("invalid type argument of array indexing"); + break; + case RO_UNARY_STAR: + error ("invalid type argument of unary %<*%>"); + break; + case RO_IMPLICIT_CONVERSION: + error ("invalid type argument of implicit conversion"); + break; + default: + gcc_unreachable (); + } return error_mark_node; } @@ -2871,7 +2895,7 @@ build_array_ref (location_t loc, tree array, tree idx) ret = cp_build_indirect_ref (cp_build_binary_op (input_location, PLUS_EXPR, ar, ind, tf_warning_or_error), - "array indexing", + RO_ARRAY_INDEXING, tf_warning_or_error); protected_set_expr_location (ret, loc); return ret; @@ -2980,7 +3004,7 @@ get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function) /* Next extract the vtable pointer from the object. */ vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node), instance_ptr); - vtbl = cp_build_indirect_ref (vtbl, NULL, tf_warning_or_error); + vtbl = cp_build_indirect_ref (vtbl, RO_NULL, tf_warning_or_error); /* If the object is not dynamic the access invokes undefined behavior. As it is not executed in this case silence the spurious warnings it may provoke. */ @@ -2990,7 +3014,7 @@ get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function) e2 = fold_build2_loc (input_location, POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl, fold_convert (sizetype, idx)); - e2 = cp_build_indirect_ref (e2, NULL, tf_warning_or_error); + e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error); TREE_CONSTANT (e2) = 1; /* When using function descriptors, the address of the @@ -4337,9 +4361,10 @@ build_x_unary_op (enum tree_code code, tree xarg, tsubst_flags_t complain) tree fn = get_first_fn (xarg); if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn)) { - const char *type = - (DECL_CONSTRUCTOR_P (fn) ? "constructor" : "destructor"); - error ("taking address of %s %qE", type, xarg); + error (DECL_CONSTRUCTOR_P (fn) + ? G_("taking address of constructor %qE") + : G_("taking address of destructor %qE"), + xarg); return error_mark_node; } } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 348c6576c11..66ff3c16264 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1434,7 +1434,7 @@ build_x_arrow (tree expr) return expr; } - return cp_build_indirect_ref (last_rval, NULL, tf_warning_or_error); + return cp_build_indirect_ref (last_rval, RO_NULL, tf_warning_or_error); } if (types_memoized) @@ -1526,7 +1526,7 @@ build_m_component_ref (tree datum, tree component) datum = build2 (POINTER_PLUS_EXPR, ptype, fold_convert (ptype, datum), build_nop (sizetype, component)); - return cp_build_indirect_ref (datum, 0, tf_warning_or_error); + return cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error); } else return build2 (OFFSET_REF, type, datum, component); diff --git a/gcc/doc/c-tree.texi b/gcc/doc/c-tree.texi index 35498583ccd..b53f758828b 100644 --- a/gcc/doc/c-tree.texi +++ b/gcc/doc/c-tree.texi @@ -2871,7 +2871,7 @@ chained together. This facilitates adding new clauses during compilation. @item VEC_LSHIFT_EXPR -@item VEC_RSHIFT_EXPR +@itemx VEC_RSHIFT_EXPR These nodes represent whole vector left and right shifts, respectively. The first operand is the vector to shift; it will always be of vector type. The second operand is an expression for the number of bits by which to @@ -2879,7 +2879,7 @@ shift. Note that the result is undefined if the second operand is larger than or equal to the first operand's type size. @item VEC_WIDEN_MULT_HI_EXPR -@item VEC_WIDEN_MULT_LO_EXPR +@itemx VEC_WIDEN_MULT_LO_EXPR These nodes represent widening vector multiplication of the high and low parts of the two input vectors, respectively. Their operands are vectors that contain the same number of elements (@code{N}) of the same integral type. @@ -2891,7 +2891,7 @@ low @code{N/2} elements of the two vector are multiplied to produce the vector of @code{N/2} products. @item VEC_UNPACK_HI_EXPR -@item VEC_UNPACK_LO_EXPR +@itemx VEC_UNPACK_LO_EXPR These nodes represent unpacking of the high and low parts of the input vector, respectively. The single operand is a vector that contains @code{N} elements of the same integral or floating point type. The result is a vector @@ -2902,7 +2902,7 @@ In the case of @code{VEC_UNPACK_LO_EXPR} the low @code{N/2} elements of the vector are extracted and widened (promoted). @item VEC_UNPACK_FLOAT_HI_EXPR -@item VEC_UNPACK_FLOAT_LO_EXPR +@itemx VEC_UNPACK_FLOAT_LO_EXPR These nodes represent unpacking of the high and low parts of the input vector, where the values are converted from fixed point to floating point. The single operand is a vector that contains @code{N} elements of the same @@ -2938,13 +2938,13 @@ elements of the two vectors are merged (concatenated) to form the output vector. @item VEC_EXTRACT_EVEN_EXPR -@item VEC_EXTRACT_ODD_EXPR +@itemx VEC_EXTRACT_ODD_EXPR These nodes represent extracting of the even/odd elements of the two input vectors, respectively. Their operands and result are vectors that contain the same number of elements of the same type. @item VEC_INTERLEAVE_HIGH_EXPR -@item VEC_INTERLEAVE_LOW_EXPR +@itemx VEC_INTERLEAVE_LOW_EXPR These nodes represent merging and interleaving of the high/low elements of the two input vectors, respectively. The operands and the result are vectors that contain the same number of elements (@code{N}) of the same type. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index dd5a89c1002..59270e57852 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -2550,14 +2550,14 @@ void __attribute__ ((interrupt, use_shadow_register_set)) v1 (); void __attribute__ ((interrupt, keep_interrupts_masked)) v2 (); void __attribute__ ((interrupt, use_debug_exception_return)) v3 (); void __attribute__ ((interrupt, use_shadow_register_set, - keep_interrupts_masked)) v4 (); + keep_interrupts_masked)) v4 (); void __attribute__ ((interrupt, use_shadow_register_set, - use_debug_exception_return)) v5 (); + use_debug_exception_return)) v5 (); void __attribute__ ((interrupt, keep_interrupts_masked, - use_debug_exception_return)) v6 (); + use_debug_exception_return)) v6 (); void __attribute__ ((interrupt, use_shadow_register_set, - keep_interrupts_masked, - use_debug_exception_return)) v7 (); + keep_interrupts_masked, + use_debug_exception_return)) v7 (); @end smallexample @item interrupt_handler @@ -4235,8 +4235,8 @@ Three attributes are currently defined for the Blackfin. @table @code @item l1_data -@item l1_data_A -@item l1_data_B +@itemx l1_data_A +@itemx l1_data_B @cindex @code{l1_data} variable attribute @cindex @code{l1_data_A} variable attribute @cindex @code{l1_data_B} variable attribute @@ -4308,7 +4308,7 @@ allows modules to make no assumptions about where variables might be stored. @item io -@item io (@var{addr}) +@itemx io (@var{addr}) Variables with the @code{io} attribute are used to address memory-mapped peripherals. If an address is specified, the variable is assigned that address, else it is not assigned an address (it is @@ -4319,7 +4319,7 @@ int timer_count __attribute__((io(0x123))); @end example @item cb -@item cb (@var{addr}) +@itemx cb (@var{addr}) Variables with the @code{cb} attribute are used to access the control bus, using special instructions. @code{addr} indicates the control bus address. Example: @@ -5434,9 +5434,9 @@ void doit(void) int i = 0; asm goto ("mfsr %%r1, 123; jmp %%r1;" ".pushsection doit_table;" - ".long %l0, %l1, %l2, %l3;" - ".popsection" - : : : "r1" : label1, label2, label3, label4); + ".long %l0, %l1, %l2, %l3;" + ".popsection" + : : : "r1" : label1, label2, label3, label4); __builtin_unreachable (); label1: diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index 977aa80fe4d..b5bf1fd1af4 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1432,7 +1432,7 @@ increase the risk of undetected internal errors causing wrong code to be generated. @item --disable-stage1-checking -@item --enable-stage1-checking +@itemx --enable-stage1-checking @itemx --enable-stage1-checking=@var{list} If no @option{--enable-checking} option is specified the stage1 compiler will be built with @samp{yes} checking enabled, otherwise diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 3c77c6877f1..36461f6c00a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -7326,6 +7326,10 @@ types of hosts. The bytecode files are versioned and there is a strict version check, so bytecode files generated in one version of GCC will not work with an older/newer version of GCC. +Link time optimization does not play well with generating debugging +information. Combining @option{-flto} or @option{-fwhopr} with +@option{-g} is experimental. + This option is disabled by default. @item -fwhopr @@ -7342,6 +7346,8 @@ that otherwise would not fit in memory. This option enables Disabled by default. +This option is experimental. + @item -fwpa @opindex fwpa This is an internal option used by GCC when compiling with @@ -15071,7 +15077,7 @@ stored, which means code that walks the stack frame across interrupts or signals may get corrupted data. @item -mavoid-indexed-addresses -@item -mno-avoid-indexed-addresses +@itemx -mno-avoid-indexed-addresses @opindex mavoid-indexed-addresses @opindex mno-avoid-indexed-addresses Generate code that tries to avoid (not avoid) the use of indexed load @@ -15532,24 +15538,24 @@ held in @code{r13} are now pushed onto the stack. Note, common variables (variables which have not been initialised) and constants are not placed into the small data area as they are assigned -to other sections in the output executeable. +to other sections in the output executable. The default value is zero, which disables this feature. Note, this feature is not enabled by default with higher optimization levels -(@option{-O2} etc) because of the potentially deterimental effects of +(@option{-O2} etc) because of the potentially detrimental effects of reserving register @code{r13}. It is up to the programmer to experiment and discover whether this feature is of benefit to their program. @item -msim -@item -mno-sim +@itemx -mno-sim @opindex msim @opindex mno-sim Use the simulator runtime. The default is to use the libgloss board specific runtime. @item -mas100-syntax -@item -mno-as100-syntax +@itemx -mno-as100-syntax @opindex mas100-syntax @opindex mno-as100-syntax When generating assembler output use a syntax that is compatible with @@ -15561,7 +15567,7 @@ default option. @opindex mmax-constant-size Specifies the maxium size, in bytes, of a constant that can be used as an operand in a RX instruction. Although the RX instruction set does -allow consants of up to 4 bytes in length to be used in instructions, +allow constants of up to 4 bytes in length to be used in instructions, a longer value equates to a longer instruction. Thus in some circumstances it can be beneficial to restrict the size of constants that are used in instructions. Constants that are too big are instead @@ -16811,7 +16817,7 @@ that MinGW-specific thread support is to be used. @opindex municode This option is available for mingw-w64 targets. It specifies that the UNICODE macro is getting pre-defined and that the -unicode capable runtime startup code is choosen. +unicode capable runtime startup code is chosen. @item -mwin32 @opindex mwin32 diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 5a92a809fc6..bcdbabcafdf 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -5189,7 +5189,7 @@ A typical @code{ctrap} pattern looks like (define_insn "ctrapsi4" [(trap_if (match_operator 0 "trap_operator" [(match_operand 1 "register_operand") - (match_operand 2 "immediate_operand")]) + (match_operand 2 "immediate_operand")]) (match_operand 3 "const_int_operand" "i"))] "" "@dots{}") diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi index 2041de97353..284ea49cdfe 100644 --- a/gcc/doc/options.texi +++ b/gcc/doc/options.texi @@ -85,7 +85,7 @@ configurations and yet the masks always need to be defined. @section Option properties The second field of an option record can specify any of the following -properties. When an option takes an argument, it is enlosed in parentheses +properties. When an option takes an argument, it is enclosed in parentheses following the option property name. The parser that handles option files is quite simplistic, and will be tricked by any nested parentheses within the argument text itself; in this case, the entire option argument can diff --git a/gcc/doc/plugins.texi b/gcc/doc/plugins.texi index 8aac0f7b65c..d446f9fd5c6 100644 --- a/gcc/doc/plugins.texi +++ b/gcc/doc/plugins.texi @@ -317,7 +317,7 @@ custom attributes. /* Attribute handler callback */ static tree handle_user_attribute (tree *node, tree name, tree args, - int flags, bool *no_add_attrs) + int flags, bool *no_add_attrs) @{ return NULL_TREE; @} @@ -399,7 +399,7 @@ When a pass is first added to one of the pass lists, the event @section Building GCC plugins If plugins are enabled, GCC installs the headers needed to build a -plugin (somehwere in the installation tree, e.g. under +plugin (somewhere in the installation tree, e.g. under @file{/usr/local}). In particular a @file{plugin/include} directory is installed, containing all the header files needed to build plugins. diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi index 4888eb3f1e1..eda42c79eae 100644 --- a/gcc/doc/rtl.texi +++ b/gcc/doc/rtl.texi @@ -2614,9 +2614,12 @@ a set bit indicates it is taken from @var{vec1}. @findex vec_select @item (vec_select:@var{m} @var{vec1} @var{selection}) This describes an operation that selects parts of a vector. @var{vec1} is -the source vector, @var{selection} is a @code{parallel} that contains a +the source vector, and @var{selection} is a @code{parallel} that contains a @code{const_int} for each of the subparts of the result vector, giving the -number of the source subpart that should be stored into it. +number of the source subpart that should be stored into it. +The result mode @var{m} is either the submode for a single element of +@var{vec1} (if only one subpart is selected), or another vector mode +with that element submode (if multiple subparts are selected). @findex vec_concat @item (vec_concat:@var{m} @var{vec1} @var{vec2}) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 6a2991777cf..5616b480987 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -9933,7 +9933,7 @@ contained within the @var{superset} named address space. Pointers to a named address space that is a subset of another named address space will be converted automatically without a cast if used together in arithmetic operations. Pointers to a superset address space can be -converted to pointers to a subset address space via explict casts. +converted to pointers to a subset address space via explicit casts. @end deftypefn @deftypefn {Target Hook} {rtx} TARGET_ADDR_SPACE_CONVERT (rtx @var{op}, tree @var{from_type}, tree @var{to_type}) @@ -11038,7 +11038,7 @@ On some architectures it can take multiple instructions to synthesize a constant. If there is another constant already in a register that is close enough in value then it is preferable that the new constant is computed from this register using immediate addition or -substraction. We accomplish this through CSE. Besides the value of +subtraction. We accomplish this through CSE. Besides the value of the constant we also add a lower and an upper constant anchor to the available expressions. These are then queried when encountering new constants. The anchors are computed by rounding the constant up and diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index ec5298c0ccb..da0405774c6 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -6177,10 +6177,7 @@ static void gen_generic_params_dies (tree); static void splice_child_die (dw_die_ref, dw_die_ref); static int file_info_cmp (const void *, const void *); static dw_loc_list_ref new_loc_list (dw_loc_descr_ref, const char *, - const char *, const char *, unsigned); -static void add_loc_descr_to_loc_list (dw_loc_list_ref *, dw_loc_descr_ref, - const char *, const char *, - const char *); + const char *, const char *); static void output_loc_list (dw_loc_list_ref); static char *gen_internal_sym (const char *); @@ -7214,6 +7211,13 @@ AT_loc_list (dw_attr_ref a) return a->dw_attr_val.v.val_loc_list; } +static inline dw_loc_list_ref * +AT_loc_list_ptr (dw_attr_ref a) +{ + gcc_assert (a && AT_class (a) == dw_val_class_loc_list); + return &a->dw_attr_val.v.val_loc_list; +} + /* Add an address constant attribute value to a DIE. */ static inline void @@ -7793,8 +7797,7 @@ add_var_loc_to_decl (tree decl, struct var_loc_node *loc) temp->last = loc; } } - /* Do not add empty location to the beginning of the list. */ - else if (NOTE_VAR_LOCATION_LOC (loc->var_loc_note) != NULL_RTX) + else { temp->first = loc; temp->last = loc; @@ -10302,12 +10305,11 @@ output_die_symbol (dw_die_ref die) } /* Return a new location list, given the begin and end range, and the - expression. gensym tells us whether to generate a new internal symbol for - this location list node, which is done for the head of the list only. */ + expression. */ static inline dw_loc_list_ref new_loc_list (dw_loc_descr_ref expr, const char *begin, const char *end, - const char *section, unsigned int gensym) + const char *section) { dw_loc_list_ref retlist = GGC_CNEW (dw_loc_list_node); @@ -10315,27 +10317,18 @@ new_loc_list (dw_loc_descr_ref expr, const char *begin, const char *end, retlist->end = end; retlist->expr = expr; retlist->section = section; - if (gensym) - retlist->ll_symbol = gen_internal_sym ("LLST"); return retlist; } -/* Add a location description expression to a location list. */ +/* Generate a new internal symbol for this location list node, if it + hasn't got one yet. */ static inline void -add_loc_descr_to_loc_list (dw_loc_list_ref *list_head, dw_loc_descr_ref descr, - const char *begin, const char *end, - const char *section) +gen_llsym (dw_loc_list_ref list) { - dw_loc_list_ref *d; - - /* Find the end of the chain. */ - for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next) - ; - - /* Add a new location list node to the list. */ - *d = new_loc_list (descr, begin, end, section, 0); + gcc_assert (!list->ll_symbol); + list->ll_symbol = gen_internal_sym ("LLST"); } /* Output the location list given to us. */ @@ -13653,15 +13646,17 @@ loc_descriptor (rtx rtl, enum machine_mode mode, break; case CONST_DOUBLE: + if (mode == VOIDmode) + mode = GET_MODE (rtl); + if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict)) { + gcc_assert (mode == GET_MODE (rtl) || VOIDmode == GET_MODE (rtl)); + /* Note that a CONST_DOUBLE rtx could represent either an integer or a floating-point constant. A CONST_DOUBLE is used whenever the constant requires more than one word in order to be adequately represented. We output CONST_DOUBLEs as blocks. */ - if (GET_MODE (rtl) != VOIDmode) - mode = GET_MODE (rtl); - loc_result = new_loc_descr (DW_OP_implicit_value, GET_MODE_SIZE (mode), 0); if (SCALAR_FLOAT_MODE_P (mode)) @@ -13687,6 +13682,9 @@ loc_descriptor (rtx rtl, enum machine_mode mode, break; case CONST_VECTOR: + if (mode == VOIDmode) + mode = GET_MODE (rtl); + if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict)) { unsigned int elt_size = GET_MODE_UNIT_SIZE (GET_MODE (rtl)); @@ -13695,7 +13693,7 @@ loc_descriptor (rtx rtl, enum machine_mode mode, unsigned int i; unsigned char *p; - mode = GET_MODE (rtl); + gcc_assert (mode == GET_MODE (rtl) || VOIDmode == GET_MODE (rtl)); switch (GET_MODE_CLASS (mode)) { case MODE_VECTOR_INT: @@ -13777,10 +13775,10 @@ loc_descriptor (rtx rtl, enum machine_mode mode, if (mode != VOIDmode && GET_MODE_SIZE (mode) == DWARF2_ADDR_SIZE && (dwarf_version >= 4 || !dwarf_strict)) { - loc_result = new_loc_descr (DW_OP_implicit_value, - DWARF2_ADDR_SIZE, 0); - loc_result->dw_loc_oprnd2.val_class = dw_val_class_addr; - loc_result->dw_loc_oprnd2.v.val_addr = rtl; + loc_result = new_loc_descr (DW_OP_addr, 0, 0); + loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr; + loc_result->dw_loc_oprnd1.v.val_addr = rtl; + add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0)); VEC_safe_push (rtx, gc, used_rtx_array, rtl); } break; @@ -13842,14 +13840,6 @@ decl_by_reference_p (tree decl) && DECL_BY_REFERENCE (decl)); } -/* Return single element location list containing loc descr REF. */ - -static dw_loc_list_ref -single_element_loc_list (dw_loc_descr_ref ref) -{ - return new_loc_list (ref, NULL, NULL, NULL, 0); -} - /* Helper function for dw_loc_list. Compute proper Dwarf location descriptor for VARLOC. */ @@ -13931,20 +13921,21 @@ dw_loc_list_1 (tree loc, rtx varloc, int want_address, return descr; } -/* Return dwarf representation of location list representing for - LOC_LIST of DECL. WANT_ADDRESS has the same meaning as in - loc_list_from_tree function. */ +/* Return the dwarf representation of the location list LOC_LIST of + DECL. WANT_ADDRESS has the same meaning as in loc_list_from_tree + function. */ static dw_loc_list_ref -dw_loc_list (var_loc_list * loc_list, tree decl, int want_address) +dw_loc_list (var_loc_list *loc_list, tree decl, int want_address) { const char *endname, *secname; - dw_loc_list_ref list; rtx varloc; enum var_init_status initialized; struct var_loc_node *node; dw_loc_descr_ref descr; char label_id[MAX_ARTIFICIAL_LABEL_BYTES]; + dw_loc_list_ref list = NULL; + dw_loc_list_ref *listp = &list; /* Now that we know what section we are using for a base, actually construct the list of locations. @@ -13957,26 +13948,9 @@ dw_loc_list (var_loc_list * loc_list, tree decl, int want_address) This means we have to special case the last node, and generate a range of [last location start, end of function label]. */ - node = loc_list->first; secname = secname_for_decl (decl); - if (NOTE_VAR_LOCATION_LOC (node->var_loc_note)) - initialized = NOTE_VAR_LOCATION_STATUS (node->var_loc_note); - else - initialized = VAR_INIT_STATUS_INITIALIZED; - varloc = NOTE_VAR_LOCATION (node->var_loc_note); - descr = dw_loc_list_1 (decl, varloc, want_address, initialized); - - if (loc_list && loc_list->first != loc_list->last) - list = new_loc_list (descr, node->label, node->next->label, secname, 1); - else - return single_element_loc_list (descr); - node = node->next; - - if (!node) - return NULL; - - for (; node->next; node = node->next) + for (node = loc_list->first; node->next; node = node->next) if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX) { /* The variable has a location between NODE->LABEL and @@ -13984,28 +13958,46 @@ dw_loc_list (var_loc_list * loc_list, tree decl, int want_address) initialized = NOTE_VAR_LOCATION_STATUS (node->var_loc_note); varloc = NOTE_VAR_LOCATION (node->var_loc_note); descr = dw_loc_list_1 (decl, varloc, want_address, initialized); - add_loc_descr_to_loc_list (&list, descr, - node->label, node->next->label, secname); + if (descr) + { + *listp = new_loc_list (descr, node->label, node->next->label, + secname); + listp = &(*listp)->dw_loc_next; + } } /* If the variable has a location at the last label it keeps its location until the end of function. */ if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX) { - if (!current_function_decl) - endname = text_end_label; - else - { - ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL, - current_function_funcdef_no); - endname = ggc_strdup (label_id); - } - initialized = NOTE_VAR_LOCATION_STATUS (node->var_loc_note); varloc = NOTE_VAR_LOCATION (node->var_loc_note); descr = dw_loc_list_1 (decl, varloc, want_address, initialized); - add_loc_descr_to_loc_list (&list, descr, node->label, endname, secname); + if (descr) + { + if (!current_function_decl) + endname = text_end_label; + else + { + ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL, + current_function_funcdef_no); + endname = ggc_strdup (label_id); + } + + *listp = new_loc_list (descr, node->label, endname, secname); + listp = &(*listp)->dw_loc_next; + } } + + /* Try to avoid the overhead of a location list emitting a location + expression instead, but only if we didn't have more than one + location entry in the first place. If some entries were not + representable, we don't want to pretend a single entry that was + applies to the entire scope in which the variable is + available. */ + if (list && loc_list->first->next) + gen_llsym (list); + return list; } @@ -14015,7 +14007,8 @@ dw_loc_list (var_loc_list * loc_list, tree decl, int want_address) static bool single_element_loc_list_p (dw_loc_list_ref list) { - return (!list->dw_loc_next && !list->begin && !list->end); + gcc_assert (!list->dw_loc_next || list->ll_symbol); + return !list->ll_symbol; } /* To each location in list LIST add loc descr REF. */ @@ -14315,9 +14308,9 @@ loc_list_from_tree (tree loc, int want_address) rtx rtl; var_loc_list *loc_list = lookup_decl_loc (loc); - if (loc_list && loc_list->first - && (list_ret = dw_loc_list (loc_list, loc, want_address))) + if (loc_list && loc_list->first) { + list_ret = dw_loc_list (loc_list, loc, want_address); have_address = want_address != 0; break; } @@ -14728,7 +14721,7 @@ loc_list_from_tree (tree loc, int want_address) add_loc_descr_to_each (list_ret, new_loc_descr (op, size, 0)); } if (ret) - list_ret = single_element_loc_list (ret); + list_ret = new_loc_list (ret, NULL, NULL, NULL); return list_ret; } @@ -15230,10 +15223,20 @@ add_const_value_attribute (dw_die_ref die, rtx rtl) return true; case CONST_STRING: - resolve_one_addr (&rtl, NULL); - add_AT_addr (die, DW_AT_const_value, rtl); - VEC_safe_push (rtx, gc, used_rtx_array, rtl); - return true; + if (dwarf_version >= 4 || !dwarf_strict) + { + dw_loc_descr_ref loc_result; + resolve_one_addr (&rtl, NULL); + rtl_addr: + loc_result = new_loc_descr (DW_OP_addr, 0, 0); + loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr; + loc_result->dw_loc_oprnd1.v.val_addr = rtl; + add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0)); + add_AT_loc (die, DW_AT_location, loc_result); + VEC_safe_push (rtx, gc, used_rtx_array, rtl); + return true; + } + return false; case CONST: if (CONSTANT_P (XEXP (rtl, 0))) @@ -15243,9 +15246,9 @@ add_const_value_attribute (dw_die_ref die, rtx rtl) if (!const_ok_for_output (rtl)) return false; case LABEL_REF: - add_AT_addr (die, DW_AT_const_value, rtl); - VEC_safe_push (rtx, gc, used_rtx_array, rtl); - return true; + if (dwarf_version >= 4 || !dwarf_strict) + goto rtl_addr; + return false; case PLUS: /* In cases where an inlined instance of an inline function is passed @@ -15722,15 +15725,18 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, a constant value. That way we are better to use add_const_value_attribute rather than expanding constant value equivalent. */ loc_list = lookup_decl_loc (decl); - if (loc_list && loc_list->first && loc_list->first == loc_list->last) + if (loc_list + && loc_list->first + && loc_list->first == loc_list->last + && NOTE_VAR_LOCATION (loc_list->first->var_loc_note) + && NOTE_VAR_LOCATION_LOC (loc_list->first->var_loc_note)) { struct var_loc_node *node; node = loc_list->first; - rtl = NOTE_VAR_LOCATION (node->var_loc_note); - if (GET_CODE (rtl) == VAR_LOCATION - && GET_CODE (XEXP (rtl, 1)) != PARALLEL) - rtl = XEXP (XEXP (rtl, 1), 0); + rtl = NOTE_VAR_LOCATION_LOC (node->var_loc_note); + if (GET_CODE (rtl) != PARALLEL) + rtl = XEXP (rtl, 0); if ((CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING) && add_const_value_attribute (die, rtl)) return true; @@ -16017,8 +16023,7 @@ convert_cfa_to_fb_loc_list (HOST_WIDE_INT offset) if (!cfa_equal_p (&last_cfa, &next_cfa)) { *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset), - start_label, last_label, section, - list == NULL); + start_label, last_label, section); list_tail = &(*list_tail)->dw_loc_next; last_cfa = next_cfa; @@ -16039,14 +16044,16 @@ convert_cfa_to_fb_loc_list (HOST_WIDE_INT offset) if (!cfa_equal_p (&last_cfa, &next_cfa)) { *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset), - start_label, last_label, section, - list == NULL); + start_label, last_label, section); list_tail = &(*list_tail)->dw_loc_next; start_label = last_label; } + *list_tail = new_loc_list (build_cfa_loc (&next_cfa, offset), - start_label, fde->dw_fde_end, section, - list == NULL); + start_label, fde->dw_fde_end, section); + + if (list && list->dw_loc_next) + gen_llsym (list); return list; } @@ -16476,7 +16483,8 @@ add_pure_or_virtual_attribute (dw_die_ref die, tree func_decl) 0)); /* GNU extension: Record what type this method came from originally. */ - if (debug_info_level > DINFO_LEVEL_TERSE) + if (debug_info_level > DINFO_LEVEL_TERSE + && DECL_CONTEXT (func_decl)) add_AT_die_ref (die, DW_AT_containing_type, lookup_type_die (DECL_CONTEXT (func_decl))); } @@ -17396,7 +17404,8 @@ gen_type_die_for_member (tree type, tree member, dw_die_ref context_die) /* If we're trying to avoid duplicate debug info, we may not have emitted the member decl for this function. Emit it now. */ - if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) + if (TYPE_STUB_DECL (type) + && TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) && ! lookup_decl_die (member)) { dw_die_ref type_die; @@ -20978,28 +20987,48 @@ resolve_addr (dw_die_ref die) { dw_die_ref c; dw_attr_ref a; - dw_loc_list_ref curr; + dw_loc_list_ref *curr; unsigned ix; for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++) switch (AT_class (a)) { case dw_val_class_loc_list: - for (curr = AT_loc_list (a); curr != NULL; curr = curr->dw_loc_next) - if (!resolve_addr_in_expr (curr->expr)) - curr->expr = NULL; + curr = AT_loc_list_ptr (a); + while (*curr) + { + if (!resolve_addr_in_expr ((*curr)->expr)) + { + dw_loc_list_ref next = (*curr)->dw_loc_next; + if (next && (*curr)->ll_symbol) + { + gcc_assert (!next->ll_symbol); + next->ll_symbol = (*curr)->ll_symbol; + } + *curr = next; + } + else + curr = &(*curr)->dw_loc_next; + } + if (!AT_loc_list (a)) + { + remove_AT (die, a->dw_attr); + ix--; + } break; case dw_val_class_loc: if (!resolve_addr_in_expr (AT_loc (a))) - a->dw_attr_val.v.val_loc = NULL; + { + remove_AT (die, a->dw_attr); + ix--; + } break; case dw_val_class_addr: if (a->dw_attr == DW_AT_const_value && resolve_one_addr (&a->dw_attr_val.v.val_addr, NULL)) { - a->dw_attr = DW_AT_location; - a->dw_attr_val.val_class = dw_val_class_loc; - a->dw_attr_val.v.val_loc = NULL; + remove_AT (die, a->dw_attr); + ix--; } break; default: diff --git a/gcc/except.c b/gcc/except.c index 572aad0f842..10b547dcf3c 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1835,7 +1835,7 @@ can_nonlocal_goto (const_rtx insn) /* Set TREE_NOTHROW and crtl->all_throwers_are_sibcalls. */ -unsigned int +static unsigned int set_nothrow_function_flags (void) { rtx insn; @@ -1892,7 +1892,7 @@ set_nothrow_function_flags (void) struct cgraph_edge *e; for (e = node->callers; e; e = e->next_caller) e->can_throw_external = false; - TREE_NOTHROW (current_function_decl) = 1; + cgraph_set_nothrow_flag (node, true); if (dump_file) fprintf (dump_file, "Marking function nothrow: %s\n\n", diff --git a/gcc/except.h b/gcc/except.h index 13aadd79ccb..99f620be0d6 100644 --- a/gcc/except.h +++ b/gcc/except.h @@ -228,9 +228,6 @@ extern int doing_eh (int); loop hackery; should not be used by new code. */ extern void for_each_eh_label (void (*) (rtx)); -/* Set TREE_NOTHROW and cfun->all_throwers_are_sibcalls. */ -extern unsigned int set_nothrow_function_flags (void); - extern void init_eh (void); extern void init_eh_for_function (void); diff --git a/gcc/expr.c b/gcc/expr.c index 13ae5fffc9f..d1cd815dd9b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1194,6 +1194,7 @@ emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method, } align = MIN (MEM_ALIGN (x), MEM_ALIGN (y)); + gcc_assert (align >= BITS_PER_UNIT); gcc_assert (MEM_P (x)); gcc_assert (MEM_P (y)); diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4fd3ff03a0a..f65bcd0c718 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,28 @@ +2009-12-17 Janus Weil <janus@gcc.gnu.org> + + PR fortran/42144 + * trans-expr.c (select_class_proc): Skip abstract base types. + +2009-12-16 Kazu Hirata <kazu@codesourcery.com> + + * gfc-internals.texi, gfortran.texi, invoke.texi: Fix typos. + Follow spelling conventions. + +2009-12-15 Tobias Burnus <burnus@net-b.de> + Daniel Franke <franke.daniel@gmail.com> + + PR fortran/41235 + * resolve.c (resolve_global_procedure): Add check for + presence of an explicit interface for nonconstant, + nonassumed character-length functions. + (resolve_fl_procedure): Remove check for nonconstant + character-length functions. + +2009-12-14 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/42354 + * expr.c (check_init_expr): Do not check for specification functions. + 2009-12-11 Janus Weil <janus@gcc.gnu.org> PR fortran/42257 @@ -5,13 +30,13 @@ 2009-12-11 Daniel Franke <franke.daniel@gmail.com> - PR fortran/40290 - * expr.c (gfc_type_convert_binary): Added warn-on-conversion flag, - passed on to gfc_convert_type_warn() instead of gfc_convert_type(); - enabled warnings on all callers but ... - * arith.c (eval_intrinsic): Disabled warnings on implicit type - conversion. - * gfortran.h gfc_type_convert_binary): Adjusted prototype. + PR fortran/40290 + * expr.c (gfc_type_convert_binary): Added warn-on-conversion flag, + passed on to gfc_convert_type_warn() instead of gfc_convert_type(); + enabled warnings on all callers but ... + * arith.c (eval_intrinsic): Disabled warnings on implicit type + conversion. + * gfortran.h gfc_type_convert_binary): Adjusted prototype. 2009-12-11 Janus Weil <janus@gcc.gnu.org> diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 35918a69f9d..72420ff01b5 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2286,40 +2286,39 @@ check_init_expr (gfc_expr *e) case EXPR_FUNCTION: t = FAILURE; - if ((m = check_specification_function (e)) != MATCH_YES) - { - gfc_intrinsic_sym* isym; - gfc_symbol* sym; + { + gfc_intrinsic_sym* isym; + gfc_symbol* sym; - sym = e->symtree->n.sym; - if (!gfc_is_intrinsic (sym, 0, e->where) - || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES) - { - gfc_error ("Function '%s' in initialization expression at %L " - "must be an intrinsic or a specification function", - e->symtree->n.sym->name, &e->where); - break; - } + sym = e->symtree->n.sym; + if (!gfc_is_intrinsic (sym, 0, e->where) + || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES) + { + gfc_error ("Function '%s' in initialization expression at %L " + "must be an intrinsic function", + e->symtree->n.sym->name, &e->where); + break; + } - if ((m = check_conversion (e)) == MATCH_NO - && (m = check_inquiry (e, 1)) == MATCH_NO - && (m = check_null (e)) == MATCH_NO - && (m = check_transformational (e)) == MATCH_NO - && (m = check_elemental (e)) == MATCH_NO) - { - gfc_error ("Intrinsic function '%s' at %L is not permitted " - "in an initialization expression", - e->symtree->n.sym->name, &e->where); - m = MATCH_ERROR; - } + if ((m = check_conversion (e)) == MATCH_NO + && (m = check_inquiry (e, 1)) == MATCH_NO + && (m = check_null (e)) == MATCH_NO + && (m = check_transformational (e)) == MATCH_NO + && (m = check_elemental (e)) == MATCH_NO) + { + gfc_error ("Intrinsic function '%s' at %L is not permitted " + "in an initialization expression", + e->symtree->n.sym->name, &e->where); + m = MATCH_ERROR; + } - /* Try to scalarize an elemental intrinsic function that has an - array argument. */ - isym = gfc_find_function (e->symtree->n.sym->name); - if (isym && isym->elemental - && (t = scalarize_intrinsic_call (e)) == SUCCESS) - break; - } + /* Try to scalarize an elemental intrinsic function that has an + array argument. */ + isym = gfc_find_function (e->symtree->n.sym->name); + if (isym && isym->elemental + && (t = scalarize_intrinsic_call (e)) == SUCCESS) + break; + } if (m == MATCH_YES) t = gfc_simplify_expr (e, 0); diff --git a/gcc/fortran/gfc-internals.texi b/gcc/fortran/gfc-internals.texi index 8a55b8f5c8c..4e812103606 100644 --- a/gcc/fortran/gfc-internals.texi +++ b/gcc/fortran/gfc-internals.texi @@ -425,7 +425,7 @@ the type, rank and, if applicable, shape of the whole expression or expression tree of which the current structure is the root. @code{where} is the locus of this expression in the source code. -Depending on the flavour of the expression being described by the object +Depending on the flavor of the expression being described by the object (that is, the value of its @code{expr_type} member), the corresponding structure in the @code{value} union will usually contain additional data describing the expression's value in a type-specific manner. The @code{ref} member is used to diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index e9adb3d229b..834e524c15c 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -1911,7 +1911,7 @@ all C features have a Fortran equivalent or vice versa. For instance, neither C's unsigned integers nor C's functions with variable number of arguments have an equivalent in Fortran. -Note that array dimensions are reversely orded in C and that arrays in +Note that array dimensions are reversely ordered in C and that arrays in C always start with index 0 while in Fortran they start by default with 1. Thus, an array declaration @code{A(n,m)} in Fortran matches @code{A[m][n]} in C and accessing the element @code{A(i,j)} matches diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 68cc0128eed..47cb14950dd 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -761,7 +761,7 @@ check that the declared interfaces are consistent across program units. Warn if @command{gfortran} finds a procedure named like an intrinsic not available in the currently selected standard (with @option{-std}) and treats it as @code{EXTERNAL} procedure because of this. @option{-fall-intrinsics} can -be used to never trigger this behaviour and always link to the intrinsic +be used to never trigger this behavior and always link to the intrinsic regardless of the selected standard. @item -Wsurprising diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 00bd4413529..78b0a7850d6 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1830,6 +1830,21 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, gfc_error ("The reference to function '%s' at %L either needs an " "explicit INTERFACE or the rank is incorrect", sym->name, where); + + /* Non-assumed length character functions. */ + if (sym->attr.function && sym->ts.type == BT_CHARACTER + && gsym->ns->proc_name->ts.u.cl->length != NULL) + { + gfc_charlen *cl = sym->ts.u.cl; + + if (!sym->attr.entry_master && sym->attr.if_source == IFSRC_UNKNOWN + && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) + { + gfc_error ("Nonconstant character-length function '%s' at %L " + "must have an explicit interface", sym->name, + &sym->declared_at); + } + } if (gfc_option.flag_whole_file == 1 || ((gfc_option.warn_std & GFC_STD_LEGACY) @@ -9038,23 +9053,12 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) && resolve_charlen (cl) == FAILURE) return FAILURE; - if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT) + if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT) + && sym->attr.proc == PROC_ST_FUNCTION) { - if (sym->attr.proc == PROC_ST_FUNCTION) - { - gfc_error ("Character-valued statement function '%s' at %L must " - "have constant length", sym->name, &sym->declared_at); - return FAILURE; - } - - if (sym->attr.external && sym->formal == NULL - && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) - { - gfc_error ("Automatic character length function '%s' at %L must " - "have an explicit interface", sym->name, - &sym->declared_at); - return FAILURE; - } + gfc_error ("Character-valued statement function '%s' at %L must " + "have constant length", sym->name, &sym->declared_at); + return FAILURE; } } diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index acca306a2ff..b0c19c9627c 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1556,6 +1556,10 @@ select_class_proc (gfc_se *se, gfc_class_esym_list *elist, if (elist->derived == NULL) goto free_elist; + /* Skip abstract base types. */ + if (elist->derived->attr.abstract) + goto free_elist; + /* Run through the chain picking up all the cases that call the same procedure. */ tmp_elist = elist; diff --git a/gcc/gimple.c b/gcc/gimple.c index a04683a87ac..02d8cc4a5df 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -3171,7 +3171,7 @@ compare_type_names_p (tree t1, tree t2, bool for_completion_p) /* Return true if the field decls F1 and F2 are at the same offset. */ -static bool +bool compare_field_offset (tree f1, tree f2) { if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2)) diff --git a/gcc/gimple.h b/gcc/gimple.h index 7872d9e30e5..8bddb2a38b7 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -921,6 +921,7 @@ extern bool is_gimple_call_addr (tree); extern tree get_call_expr_in (tree t); extern void recalculate_side_effects (tree); +extern bool compare_field_offset (tree, tree); extern tree gimple_register_type (tree); extern void print_gimple_types_stats (void); extern void free_gimple_type_tables (void); diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 37b20354d6f..370bbff5ddd 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -2186,7 +2186,11 @@ rewrite_close_phi_out_of_ssa (gimple_stmt_iterator *psi) gimple stmt = gimple_build_assign (res, zero_dim_array); tree arg = gimple_phi_arg_def (phi, 0); - insert_out_of_ssa_copy (zero_dim_array, arg); + if (TREE_CODE (arg) == SSA_NAME) + insert_out_of_ssa_copy (zero_dim_array, arg); + else + insert_out_of_ssa_copy_on_edge (single_pred_edge (gimple_bb (phi)), + zero_dim_array, arg); remove_phi_node (psi, false); gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); @@ -2458,9 +2462,14 @@ split_reduction_stmt (gimple stmt) static inline bool is_reduction_operation_p (gimple stmt) { + enum tree_code code; + + gcc_assert (is_gimple_assign (stmt)); + code = gimple_assign_rhs_code (stmt); + return flag_associative_math - && commutative_tree_code (gimple_assign_rhs_code (stmt)) - && associative_tree_code (gimple_assign_rhs_code (stmt)); + && commutative_tree_code (code) + && associative_tree_code (code); } /* Returns true when PHI contains an argument ARG. */ @@ -2496,6 +2505,9 @@ follow_ssa_with_commutative_ops (tree arg, tree lhs) return NULL; } + if (!is_gimple_assign (stmt)) + return NULL; + if (gimple_num_ops (stmt) == 2) return follow_ssa_with_commutative_ops (gimple_assign_rhs1 (stmt), lhs); @@ -2511,7 +2523,7 @@ follow_ssa_with_commutative_ops (tree arg, tree lhs) } /* Detect commutative and associative scalar reductions starting at - the STMT. */ + the STMT. Return the phi node of the reduction cycle, or NULL. */ static gimple detect_commutative_reduction_arg (tree lhs, gimple stmt, tree arg, @@ -2520,18 +2532,16 @@ detect_commutative_reduction_arg (tree lhs, gimple stmt, tree arg, { gimple phi = follow_ssa_with_commutative_ops (arg, lhs); - if (phi) - { - VEC_safe_push (gimple, heap, *in, stmt); - VEC_safe_push (gimple, heap, *out, stmt); - return phi; - } + if (!phi) + return NULL; - return NULL; + VEC_safe_push (gimple, heap, *in, stmt); + VEC_safe_push (gimple, heap, *out, stmt); + return phi; } /* Detect commutative and associative scalar reductions starting at - the STMT. */ + the STMT. Return the phi node of the reduction cycle, or NULL. */ static gimple detect_commutative_reduction_assign (gimple stmt, VEC (gimple, heap) **in, @@ -2619,7 +2629,8 @@ initial_value_for_loop_phi (gimple phi) } /* Detect commutative and associative scalar reductions starting at - the loop closed phi node CLOSE_PHI. */ + the loop closed phi node CLOSE_PHI. Return the phi node of the + reduction cycle, or NULL. */ static gimple detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in, @@ -2628,8 +2639,13 @@ detect_commutative_reduction (gimple stmt, VEC (gimple, heap) **in, if (scalar_close_phi_node_p (stmt)) { tree arg = gimple_phi_arg_def (stmt, 0); - gimple def = SSA_NAME_DEF_STMT (arg); - gimple loop_phi = detect_commutative_reduction (def, in, out); + gimple def, loop_phi; + + if (TREE_CODE (arg) != SSA_NAME) + return NULL; + + def = SSA_NAME_DEF_STMT (arg); + loop_phi = detect_commutative_reduction (def, in, out); if (loop_phi) { diff --git a/gcc/intl.c b/gcc/intl.c index 5b486151dcd..63de3ec4d83 100644 --- a/gcc/intl.c +++ b/gcc/intl.c @@ -120,3 +120,20 @@ gcc_gettext_width (const char *msgstr) #endif #endif /* ENABLE_NLS */ + +/* Return the indent for successive lines, using the width of + the STR. STR must have been translated already. The string + must be freed by the caller. */ + +char * +get_spaces (const char *str) +{ + size_t len = gcc_gettext_width (str); + char *spaces = XNEWVEC(char, len + 1); + memset (spaces, ' ', len); + spaces[len] = '\0'; + return spaces; +} + + + diff --git a/gcc/intl.h b/gcc/intl.h index 902e7ae423c..2df9b178c00 100644 --- a/gcc/intl.h +++ b/gcc/intl.h @@ -54,6 +54,8 @@ extern size_t gcc_gettext_width (const char *); # define G_(gmsgid) gmsgid #endif +extern char *get_spaces (const char *); + extern const char *open_quote; extern const char *close_quote; extern const char *locale_encoding; diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 7ee9f5dcf37..31883a22afd 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -941,8 +941,8 @@ propagate (void) fprintf (dump_file, "Function found to be %sconst: %s\n", this_looping ? "looping " : "", cgraph_node_name (w)); - TREE_READONLY (w->decl) = 1; - DECL_LOOPING_CONST_OR_PURE_P (w->decl) = this_looping; + cgraph_set_readonly_flag (w, true); + cgraph_set_looping_const_or_pure_flag (w, this_looping); break; case IPA_PURE: @@ -950,8 +950,8 @@ propagate (void) fprintf (dump_file, "Function found to be %spure: %s\n", this_looping ? "looping " : "", cgraph_node_name (w)); - DECL_PURE_P (w->decl) = 1; - DECL_LOOPING_CONST_OR_PURE_P (w->decl) = this_looping; + cgraph_set_pure_flag (w, true); + cgraph_set_looping_const_or_pure_flag (w, this_looping); break; default: @@ -1032,7 +1032,7 @@ propagate (void) if (!can_throw && !TREE_NOTHROW (w->decl)) { struct cgraph_edge *e; - TREE_NOTHROW (w->decl) = true; + cgraph_set_nothrow_flag (w, true); for (e = w->callers; e; e = e->next_caller) e->can_throw_external = false; if (dump_file) @@ -1110,6 +1110,7 @@ local_pure_const (void) { bool changed = false; funct_state l; + struct cgraph_node *node; /* Because we do not schedule pass_fixup_cfg over whole program after early optimizations we must not promote functions that are called by already processed functions. */ @@ -1120,23 +1121,23 @@ local_pure_const (void) fprintf (dump_file, "Function called in recursive cycle; ignoring\n"); return 0; } - if (cgraph_function_body_availability (cgraph_node (current_function_decl)) - <= AVAIL_OVERWRITABLE) + node = cgraph_node (current_function_decl); + if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE) { if (dump_file) fprintf (dump_file, "Function has wrong visibility; ignoring\n"); return 0; } - l = analyze_function (cgraph_node (current_function_decl), false); + l = analyze_function (node, false); switch (l->pure_const_state) { case IPA_CONST: if (!TREE_READONLY (current_function_decl)) { - TREE_READONLY (current_function_decl) = 1; - DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) = l->looping; + cgraph_set_readonly_flag (node, true); + cgraph_set_looping_const_or_pure_flag (node, l->looping); changed = true; if (dump_file) fprintf (dump_file, "Function found to be %sconst: %s\n", @@ -1147,7 +1148,7 @@ local_pure_const (void) else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) && !l->looping) { - DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) = false; + cgraph_set_looping_const_or_pure_flag (node, false); changed = true; if (dump_file) fprintf (dump_file, "Function found to be non-looping: %s\n", @@ -1159,8 +1160,8 @@ local_pure_const (void) case IPA_PURE: if (!TREE_READONLY (current_function_decl)) { - DECL_PURE_P (current_function_decl) = 1; - DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) = l->looping; + cgraph_set_pure_flag (node, true); + cgraph_set_looping_const_or_pure_flag (node, l->looping); changed = true; if (dump_file) fprintf (dump_file, "Function found to be %spure: %s\n", @@ -1171,7 +1172,7 @@ local_pure_const (void) else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) && !l->looping) { - DECL_LOOPING_CONST_OR_PURE_P (current_function_decl) = false; + cgraph_set_looping_const_or_pure_flag (node, false); changed = true; if (dump_file) fprintf (dump_file, "Function found to be non-looping: %s\n", @@ -1187,9 +1188,8 @@ local_pure_const (void) { struct cgraph_edge *e; - TREE_NOTHROW (current_function_decl) = true; - for (e = cgraph_node (current_function_decl)->callers; - e; e = e->next_caller) + cgraph_set_nothrow_flag (node, true); + for (e = node->callers; e; e = e->next_caller) e->can_throw_external = false; changed = true; if (dump_file) diff --git a/gcc/ipa.c b/gcc/ipa.c index b1844db256e..1230448ecbf 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -370,6 +370,23 @@ function_and_variable_visibility (bool whole_program) happy. Clear the flag here to avoid confusion in middle-end. */ if (DECL_COMDAT (node->decl) && !TREE_PUBLIC (node->decl)) DECL_COMDAT (node->decl) = 0; + /* For external decls stop tracking same_comdat_group, it doesn't matter + what comdat group they are in when they won't be emitted in this TU, + and simplifies later passes. */ + if (node->same_comdat_group && DECL_EXTERNAL (node->decl)) + { + struct cgraph_node *n = node, *next; + do + { + /* If at least one of same comdat group functions is external, + all of them have to be, otherwise it is a front-end bug. */ + gcc_assert (DECL_EXTERNAL (n->decl)); + next = n->same_comdat_group; + n->same_comdat_group = NULL; + n = next; + } + while (n != node); + } gcc_assert ((!DECL_WEAK (node->decl) && !DECL_COMDAT (node->decl)) || TREE_PUBLIC (node->decl) || DECL_EXTERNAL (node->decl)); if (cgraph_externally_visible_p (node, whole_program)) diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 8505ec40b98..92eacd465e0 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -604,6 +604,8 @@ lhd_begin_section (const char *name) /* Save the old section so we can restore it in lto_end_asm_section. */ gcc_assert (!saved_section); saved_section = in_section; + if (!saved_section) + saved_section = text_section; /* Create a new section and switch to it. */ section = get_section (name, SECTION_DEBUG, NULL); diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index e02999d98a1..e3deb9c8b06 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -340,7 +340,11 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, alias->thunk.alias); } else - lto_output_uleb128_stream (ob->main_stream, 0); + { + lto_output_uleb128_stream (ob->main_stream, 0); + lto_output_fn_decl_index (ob->decl_state, ob->main_stream, + alias->thunk.alias); + } alias = alias->previous; } while (alias); @@ -630,7 +634,12 @@ input_node (struct lto_file_decl_data *file_data, alias_decl = lto_file_decl_data_get_fn_decl (file_data, decl_index); type = lto_input_uleb128 (ib); if (!type) - cgraph_same_body_alias (alias_decl, fn_decl); + { + tree real_alias; + decl_index = lto_input_uleb128 (ib); + real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index); + cgraph_same_body_alias (alias_decl, real_alias); + } else { HOST_WIDE_INT fixed_offset = lto_input_uleb128 (ib); diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 9f831a85409..c390f272b08 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -1082,12 +1082,7 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in, { if (tem == field || (TREE_TYPE (tem) == TREE_TYPE (field) - && (DECL_FIELD_OFFSET (tem) - == DECL_FIELD_OFFSET (field)) - && (DECL_FIELD_BIT_OFFSET (tem) - == DECL_FIELD_BIT_OFFSET (field)) - && (DECL_OFFSET_ALIGN (tem) - == DECL_OFFSET_ALIGN (field)))) + && compare_field_offset (tem, field))) break; } /* In case of type mismatches across units we can fail @@ -2167,6 +2162,7 @@ lto_input_ts_type_tree_pointers (struct lto_input_block *ib, TYPE_BINFO (expr) = lto_input_tree (ib, data_in); TYPE_CONTEXT (expr) = lto_input_tree (ib, data_in); TYPE_CANONICAL (expr) = lto_input_tree (ib, data_in); + TYPE_STUB_DECL (expr) = lto_input_tree (ib, data_in); } diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 920cd270865..c489e429011 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -342,7 +342,8 @@ pack_ts_base_value_fields (struct bitpack_d *bp, tree expr) bp_pack_value (bp, DECL_UNSIGNED (expr), 1); else if (TYPE_P (expr)) bp_pack_value (bp, TYPE_UNSIGNED (expr), 1); - bp_pack_value (bp, TREE_ASM_WRITTEN (expr), 1); + /* We write debug info two times, do not confuse the second one. */ + bp_pack_value (bp, TYPE_P (expr) ? 0 : TREE_ASM_WRITTEN (expr), 1); bp_pack_value (bp, TREE_NO_WARNING (expr), 1); bp_pack_value (bp, TREE_USED (expr), 1); bp_pack_value (bp, TREE_NOTHROW (expr), 1); @@ -966,6 +967,7 @@ lto_output_ts_type_tree_pointers (struct output_block *ob, tree expr, lto_output_tree_or_ref (ob, TYPE_BINFO (expr), ref_p); lto_output_tree_or_ref (ob, TYPE_CONTEXT (expr), ref_p); lto_output_tree_or_ref (ob, TYPE_CANONICAL (expr), ref_p); + lto_output_tree_or_ref (ob, TYPE_STUB_DECL (expr), ref_p); } @@ -2335,7 +2337,9 @@ write_symbol_vec (struct lto_streamer_cache_d *cache, break; } - if (kind == GCCPK_COMMON && DECL_SIZE (t)) + if (kind == GCCPK_COMMON + && DECL_SIZE (t) + && TREE_CODE (DECL_SIZE (t)) == INTEGER_CST) size = (((uint64_t) TREE_INT_CST_HIGH (DECL_SIZE (t))) << 32) | TREE_INT_CST_LOW (DECL_SIZE (t)); else diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index f6760172331..04807e30026 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,8 @@ +2009-12-15 Richard Guenther <rguenther@suse.de> + + * lto.c (lto_fixup_field_decl): Fixup DECL_FIELD_OFFSET. + (lto_post_options): Do not disable debuginfo. + 2009-12-14 Dmitry Gorbachev <d.g.gorbachev@gmail.com> * Make-lang.in ($(LTO_EXE)): Use $(LINKER). diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 4c187b5091e..970265c2a74 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -646,16 +646,6 @@ lto_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED) static bool lto_post_options (const char **pfilename ATTRIBUTE_UNUSED) { - /* FIXME lto: We have stripped enough type and other - debugging information out of the IR that it may - appear ill-formed to dwarf2out, etc. We must not - attempt to generate debug info in lto1. A more - graceful solution would disable the option flags - rather than ignoring them, but we'd also have to - worry about default debugging options. */ - write_symbols = NO_DEBUG; - debug_info_level = DINFO_LEVEL_NONE; - /* -fltrans and -fwpa are mutually exclusive. Check for that here. */ if (flag_wpa && flag_ltrans) error ("-fwpa and -fltrans are mutually exclusive"); diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index c7ac7c32e15..e62bc02fe48 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1376,7 +1376,7 @@ static void lto_fixup_field_decl (tree t, void *data) { lto_fixup_decl_common (t, data); - gcc_assert (no_fixup_p (DECL_FIELD_OFFSET (t))); + LTO_FIXUP_SUBTREE (DECL_FIELD_OFFSET (t)); LTO_FIXUP_SUBTREE (DECL_BIT_FIELD_TYPE (t)); LTO_FIXUP_SUBTREE (DECL_QUALIFIER (t)); gcc_assert (no_fixup_p (DECL_FIELD_BIT_OFFSET (t))); diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index d6e2b1f5432..7f43dc018af 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,8 @@ +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + * objc-act.c (objc_substitute_decl, build_ivar_reference, + get_super_receiver): Update build_indirect_ref calls. + 2009-11-28 Jakub Jelinek <jakub@redhat.com> * objc-act.c (generate_shared_structures): Remove unused sc_spec and diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index e39462dcc23..2680fd85bb5 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -3115,7 +3115,7 @@ objc_substitute_decl (tree expr, tree oldexpr, tree newexpr) return build_indirect_ref (input_location, objc_substitute_decl (TREE_OPERAND (expr, 0), oldexpr, - newexpr), "->"); + newexpr), RO_ARROW); default: return expr; } @@ -6823,7 +6823,8 @@ build_ivar_reference (tree id) } return objc_build_component_ref (build_indirect_ref (input_location, - self_decl, "->"), id); + self_decl, RO_ARROW), + id); } /* Compute a hash value for a given method SEL_NAME. */ @@ -8841,7 +8842,7 @@ get_super_receiver (void) (input_location, build_c_cast (input_location, build_pointer_type (objc_class_type), - super_class), "unary *"); + super_class), RO_UNARY_STAR); } else { diff --git a/gcc/opts.c b/gcc/opts.c index 7660bd894fd..540752769bf 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1129,10 +1129,6 @@ decode_options (unsigned int argc, const char **argv) Otherwise, symbols will be privatized too early, causing link errors later. */ flag_whole_program = 0; - - /* FIXME lto. Disable var-tracking until debug information - is properly handled in free_lang_data. */ - flag_var_tracking = 0; #else error ("LTO support has not been enabled in this configuration"); #endif diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog index 81085c7ba28..d443a59c05c 100644 --- a/gcc/po/ChangeLog +++ b/gcc/po/ChangeLog @@ -1,3 +1,11 @@ +2009-12-18 Joseph Myers <joseph@codesourcery.com> + + * zh_CN.po: Update. + +2009-12-16 Joseph Myers <joseph@codesourcery.com> + + * zh_CN.po: Update. + 2009-12-14 Joseph Myers <joseph@codesourcery.com> * zh_CN.po: Update. diff --git a/gcc/po/zh_CN.po b/gcc/po/zh_CN.po index 368f6e2388a..3e57339a2ef 100644 --- a/gcc/po/zh_CN.po +++ b/gcc/po/zh_CN.po @@ -8,9 +8,9 @@ msgstr "" "Project-Id-Version: gcc 4.5-b20091203\n" "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" "POT-Creation-Date: 2009-12-03 21:28+0000\n" -"PO-Revision-Date: 2009-12-14 15:51+0800\n" -"Last-Translator: Zuxy Meng <zuxy.meng@gmail.com>\n" -"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists.sourceforge.net>\n" +"PO-Revision-Date: 2009-12-18 17:43+0800\n" +"Last-Translator: Meng Jie <zuxy.meng@gmail.com>\n" +"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -1190,7 +1190,7 @@ msgstr "‘-%s’缺少实å‚" #: gcc.c:4764 #, c-format msgid "unable to locate default linker script '%s' in the library search paths" -msgstr "" +msgstr "æ— æ³•åœ¨åº“æœç´¢è·¯å¾„ä¸å®šä½é»˜è®¤é“¾æŽ¥å™¨è„šæœ¬â€˜%s’" #: gcc.c:4945 #, c-format @@ -1483,7 +1483,7 @@ msgstr "%%:compare-debug-auxbase-opt 的实å‚太多" #: gcc.c:8933 #, c-format msgid "argument to %%:compare-debug-auxbase-opt does not end in .gk" -msgstr "" +msgstr "%%:compare-debug-auxbase-opt çš„å‚数未以 .gk 结尾" #: gcov.c:403 #, c-format @@ -1838,7 +1838,7 @@ msgstr "’" #: langhooks.c:355 msgid "At top level:" -msgstr "在文件层:" +msgstr "在文件作用域:" #: langhooks.c:375 cp/error.c:2720 #, c-format @@ -2360,7 +2360,7 @@ msgstr "给定的编译å•å…ƒå› 跨进程常é‡ä¼ é€’é€ æˆçš„编译å•å…ƒä½“积 #: params.def:187 msgid "Maximal estimated growth of function body caused by early inlining of single call" -msgstr "" +msgstr "对å•ä¸ªè°ƒç”¨è¿›è¡Œçš„早期内è”所导致的函数体代ç 膨胀的最大估计值" #: params.def:191 msgid "The size of stack frame to be considered large" @@ -2515,9 +2515,8 @@ msgid "The minimum cost of an expensive expression in the loop invariant motion" msgstr "循环ä¸å˜é‡è½¬ç§»æ—¶ä¸€æ¡æ˜‚贵的表达å¼çš„最å°å¼€é”€" #: params.def:414 -#, fuzzy msgid "Bound on number of candidates below that all candidates are considered in iv optimizations" -msgstr "候选数界é™ä½ŽäºŽå…¨éƒ¨ä»¥ iv 优化æ¥çœ‹çš„候选数" +msgstr "当备选少于æ¤è®¾å®šå€¼æ—¶æ‰€æœ‰å¤‡é€‰éƒ½å°†ä¸ºå½’纳å˜é‡ä¼˜åŒ–所考虑" #: params.def:422 msgid "Bound on number of iv uses in loop optimized in iv optimizations" @@ -2680,9 +2679,8 @@ msgid "Whether to use canonical types" msgstr "是å¦ä½¿ç”¨åˆä¹Žè§„范的类型" #: params.def:699 -#, fuzzy msgid "Maximum length of partial antic set when performing tree pre optimization" -msgstr "å½“æ‰§è¡Œæ ‘é¢„ä¼˜åŒ–æ—¶éƒ¨åˆ† antic 设置的最大的长度" +msgstr "è¿›è¡Œæ ‘ä¸Šéƒ¨åˆ†å†—ä½™æ¶ˆé™¤æ—¶éƒ¨åˆ†å¯é¢„期集的最大长度" #: params.def:709 msgid "Maximum size of a SCC before SCCVN stops processing a function" @@ -2706,11 +2704,11 @@ msgstr "当数组大å°ä¸Žå¼€å…³åˆ†æ”¯çš„比率大于æ¤å€¼æ—¶å¼€å…³è½¬æ¢ä¸ä¼š #: params.def:740 msgid "size of tiles for loop blocking" -msgstr "" +msgstr "循环分å—ä¸æ¯å°å—的大å°" #: params.def:747 msgid "Max basic blocks number in loop for loop invariant motion" -msgstr "" +msgstr "用作循环ä¸å˜é‡è½¬ç§»çš„循环ä¸åŸºæœ¬å—的最大数é‡" #: params.def:753 msgid "Maximum number of instructions in basic block to be considered for SLP vectorization" @@ -2718,19 +2716,19 @@ msgstr "考虑进行基本å—矢é‡åŒ–的基本å—能包å«çš„指令数上é™" #: params.def:758 msgid "Min. ratio of insns to prefetches to enable prefetching for a loop with an unknown trip count" -msgstr "" +msgstr "为有未知路程计数的循环å¯ç”¨é¢„å–时最å°çš„指令/预å–比" #: params.def:764 msgid "Min. ratio of insns to mem ops to enable prefetching in a loop" -msgstr "" +msgstr "为循环å¯ç”¨é¢„å–时最å°çš„指令/内å˜æ“作比" #: params.def:771 msgid "The minimum UID to be used for a nondebug insn" -msgstr "" +msgstr "éžè°ƒè¯•æŒ‡ä»¤æ‰€ä½¿ç”¨çš„æœ€å° UID" #: params.def:776 msgid "Maximum allowed growth of size of new parameters ipa-sra replaces a pointer to an aggregate with" -msgstr "" +msgstr "IPA-SRA 考虑将指å‘çš„èšåˆçš„指针替æ¢ä¸ºå‚数时这些å‚数总和大å°ç›¸å¯¹åŽŸæŒ‡é’ˆå‚数大å°å€æ•°çš„最大值" #: config/alpha/alpha.c:5131 #, c-format @@ -3192,14 +3190,14 @@ msgid "'%%&' used without any local dynamic TLS references" msgstr "使用‘%%&’ æ—¶æ²¡æœ‰æŒ‡å®šä»»ä½•åŠ¨æ€ TLS 引用" #: config/i386/i386.c:11445 config/i386/i386.c:11520 -#, fuzzy, c-format +#, c-format msgid "invalid operand size for operand code '%c'" -msgstr "fr30_print_operandï¼šæ— æ•ˆçš„ %%x 代ç " +msgstr "æ“作数代ç ‘%c’的æ“作数大å°æ— 效" #: config/i386/i386.c:11515 -#, fuzzy, c-format +#, c-format msgid "invalid operand type used with operand code '%c'" -msgstr "代ç ‘%c’的æ“ä½œæ•°æ— æ•ˆ" +msgstr "æ“作数代ç ‘%c’的æ“ä½œæ•°ç±»åž‹æ— æ•ˆ" #: config/i386/i386.c:11595 config/i386/i386.c:11635 #, c-format @@ -3310,7 +3308,7 @@ msgstr "错误的æ“作数" #: config/lm32/lm32.c:582 msgid "can't use non gp relative absolute address" -msgstr "" +msgstr "ä¸èƒ½ä½¿ç”¨éž GP 相对的ç»å¯¹åœ°å€" #: config/lm32/lm32.c:586 msgid "invalid addressing mode" @@ -3704,12 +3702,12 @@ msgstr "output_move_single:" #: config/vax/vax.c:399 #, c-format msgid "symbol used with both base and indexed registers" -msgstr "" +msgstr "符å·åŒæ—¶ä½¿ç”¨äº†åŸºå€å’Œå˜å€å¯„å˜å™¨" #: config/vax/vax.c:408 #, c-format msgid "symbol with offset used in PIC mode" -msgstr "" +msgstr "带å移é‡çš„符å·åœ¨ PIC 模å¼ä¸‹è¢«ä½¿ç”¨" #: config/vax/vax.c:494 #, c-format @@ -3868,7 +3866,7 @@ msgstr "<表达å¼é”™è¯¯>" #: cp/error.c:2295 msgid "<unknown operator>" -msgstr "<未知的æ“作符>" +msgstr "<未知的è¿ç®—符>" #: cp/error.c:2502 msgid "<unknown>" @@ -4055,14 +4053,14 @@ msgid "Integer outside symmetric range implied by Standard Fortran at %L" msgstr "%Lå¤„æ•´æ•°è¶…å‡ºæ ‡å‡† Fortran éšå«çš„对称范围" #: fortran/arith.c:1151 fortran/arith.c:1173 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: Noninteger exponent in an initialization expression at %L" -msgstr "Fortran 2003:在 %L 处åˆå§‹åŒ–表达å¼ä¸éžæ•´æ•°æŒ‡æ•°" +msgstr "Fortran 2003:%L处åˆå§‹åŒ–表达å¼ä¸éžæ•´æ•°æŒ‡æ•°" #: fortran/arith.c:1159 #, no-c-format msgid "Raising a negative REAL at %L to a REAL power is prohibited" -msgstr "" +msgstr "%L处ä¸èƒ½ä¸ºè´Ÿçš„ REAL å– REAL 次幂" #: fortran/arith.c:1666 msgid "elemental binary operation" @@ -4079,14 +4077,14 @@ msgid "Arithmetic overflow converting %s to %s at %L. This check can be disabled msgstr "%3$L处将 %1$s 转æ¢åˆ° %2$s 时算术溢出。这一检查å¯ç”¨ -fno-range-check 选项关é—" #: fortran/arith.c:2259 -#, fuzzy, no-c-format +#, no-c-format msgid "Arithmetic underflow converting %s to %s at %L. This check can be disabled with the option -fno-range-check" -msgstr "%3$L 处将 %1$s 转æ¢åˆ° %2$s 时算术下溢。这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" +msgstr "%3$L处将 %1$s 转æ¢åˆ° %2$s 时算术下溢。这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" #: fortran/arith.c:2264 -#, fuzzy, no-c-format +#, no-c-format msgid "Arithmetic NaN converting %s to %s at %L. This check can be disabled with the option -fno-range-check" -msgstr "%2$L 处将 %1$s 转æ¢åˆ° %2$s 时算术 NaN。这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" +msgstr "%3$L处将 %1$s 转æ¢åˆ° %2$s 时产生算术 NaN。这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" #: fortran/arith.c:2269 #, no-c-format @@ -4169,9 +4167,9 @@ msgid "Array specification at %C has more than %d dimensions" msgstr "%C处数组指定了多于 %d çš„ç»´æ•°" #: fortran/array.c:438 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2008: Array specification at %C with more than 7 dimensions" -msgstr "Fortran 2008:%C å¤„æ•°ç»„è§„æ ¼è¯´æ˜Žå¤šäºŽ 7 个维数" +msgstr "Fortran 2008:%C处多于 7 维的数组" #: fortran/array.c:645 #, no-c-format @@ -4194,9 +4192,9 @@ msgid "Fortran 2003: [...] style array constructors at %C" msgstr "Fortran 2003:%C处 [...] é£Žæ ¼çš„æ•°ç»„æž„é€ " #: fortran/array.c:916 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: Array constructor including type specification at %C" -msgstr "Fortran 2003:%C 处包å«ç±»åž‹è§„æ ¼è¯´æ˜Žçš„æ•°ç»„æž„é€ å™¨" +msgstr "Fortran 2003:%C处包å«æŒ‡å®šç±»åž‹çš„æ•°ç»„æž„é€ " #: fortran/array.c:931 #, no-c-format @@ -4276,7 +4274,7 @@ msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须具有与‘%4$s†#: fortran/check.c:241 #, no-c-format msgid "'%s' argument of '%s' intrinsic at %L must be of rank %d" -msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须为 %4$d" +msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’的秩必须为 %4$d" #: fortran/check.c:256 #, no-c-format @@ -4392,14 +4390,14 @@ msgid "'%s' argument of '%s' intrinsic at %L must be default real" msgstr "%3$L处内建函数‘%2$s’的‘%1$s’实å‚类型必须为默认实型" #: fortran/check.c:1171 fortran/check.c:2024 fortran/check.c:2078 -#, fuzzy, c-format +#, c-format msgid "arguments '%s' and '%s' for intrinsic %s" -msgstr "%2$L处 %1$s 内建函数缺少实å‚" +msgstr "‘%s’和‘%s’用作内建函数‘%s’的实å‚" #: fortran/check.c:1244 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2008: COMPLEX argument '%s' argument of '%s' intrinsic at %L" -msgstr "Fortran 2003:%2$L处的‘%1$s’内建函数有 KIND 实å‚" +msgstr "Fortran 2003:%3L处的‘%2s’内建函数有 COMPLEX 实å‚‘%1$s’" #: fortran/check.c:1425 #, no-c-format @@ -4429,7 +4427,7 @@ msgstr "%3$L处内建函数‘%2$s’的实å‚‘a%1$d’必须是 %4$s(%5$d)" #: fortran/check.c:1830 #, fuzzy, c-format msgid "arguments 'a%d' and 'a%d' for intrinsic '%s'" -msgstr "%2$L处 %1$s 内建函数缺少实å‚" +msgstr "‘%s’和‘%s’用作内建函数‘%s’的实å‚" #: fortran/check.c:1852 #, no-c-format @@ -4474,7 +4472,7 @@ msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实å‚å¿…é¡»æœ‰ç› #: fortran/check.c:2238 fortran/intrinsic.c:3639 #, fuzzy, c-format msgid "arguments '%s' and '%s' for intrinsic '%s'" -msgstr "%2$L处 %1$s 内建函数缺少实å‚" +msgstr "‘%s’和‘%s’用作内建函数‘%s’的实å‚" #: fortran/check.c:2289 fortran/check.c:3244 #, fuzzy, no-c-format @@ -4587,9 +4585,9 @@ msgid "'%s' and '%s' arguments of '%s' intrinsic at %L must have identical shape msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实å‚必须有相åŒçš„外形。" #: fortran/check.c:3514 fortran/check.c:3546 -#, fuzzy, no-c-format +#, no-c-format msgid "Size of '%s' argument of '%s' intrinsic at %L too small (%i/%i)" -msgstr "%3$L 处内建函数“%2$sâ€çš„实å‚“%1$sâ€çš„大å°å¤ªå°( %4$i/$5$i)" +msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’的大å°å¤ªå°(%4$i/%5$i)" #: fortran/check.c:3554 #, no-c-format @@ -4832,9 +4830,9 @@ msgid "NULL() initialization at %C is ambiguous" msgstr "%C处的 NULL() åˆå§‹åŒ–有æ§ä¹‰" #: fortran/decl.c:1654 fortran/decl.c:5833 -#, fuzzy, no-c-format +#, no-c-format msgid "Duplicate array spec for Cray pointee at %C" -msgstr "%C 处 Cray 指针的é‡å¤æ•°ç»„指定" +msgstr "%C处 Cray 指针é‡å¤æŒ‡å®šäº†æ•°ç»„" #: fortran/decl.c:1725 #, fuzzy, no-c-format @@ -4952,9 +4950,9 @@ msgid "DOUBLE COMPLEX at %C does not conform to the Fortran 95 standard" msgstr "%C处的 DOUBLE COMPLEX ä¸éµå¾ª Fortran 95 æ ‡å‡†" #: fortran/decl.c:2387 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: CLASS statement at %C" -msgstr "Fortran 2003:%C处的 IMPORT è¯å¥" +msgstr "Fortran 2003:%C处的 CLASS è¯å¥" #: fortran/decl.c:2410 fortran/decl.c:2419 fortran/decl.c:2732 #: fortran/decl.c:2740 @@ -5194,7 +5192,7 @@ msgstr "%C处带有 NAME çš„ BIND(C)过程ä¸èƒ½æœ‰ POINTER 属性" #: fortran/decl.c:4315 #, no-c-format msgid "Dummy procedure at %C may not have BIND(C) attribute with NAME" -msgstr "%C处的哑过程‘%s’ä¸èƒ½æœ‰å¸¦æœ‰ NAME çš„ BIND(C) 属性" +msgstr "%C处的哑过程ä¸èƒ½æœ‰å¸¦æœ‰ NAME çš„ BIND(C) 属性" #: fortran/decl.c:4338 #, no-c-format @@ -5214,7 +5212,7 @@ msgstr "%C处绑定属性åŽéœ€è¦â€˜::’" #: fortran/decl.c:4455 #, no-c-format msgid "NOPASS or explicit interface required at %C" -msgstr "" +msgstr "%Cå¤„éœ€è¦ NOPASS 或显å¼æŽ¥å£" #: fortran/decl.c:4459 #, no-c-format @@ -5437,12 +5435,12 @@ msgstr "在%C处需è¦â€œ,â€æˆ–è¯å¥å°¾" #: fortran/decl.c:5891 #, no-c-format msgid "INTENT is not allowed inside of BLOCK at %C" -msgstr "" +msgstr "INTENT ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" #: fortran/decl.c:5923 #, no-c-format msgid "OPTIONAL is not allowed inside of BLOCK at %C" -msgstr "" +msgstr "OPTIONAL ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" #: fortran/decl.c:5942 #, no-c-format @@ -5522,7 +5520,7 @@ msgstr "%C SAVE è¯å¥è¯æ³•é”™è¯¯" #: fortran/decl.c:6386 #, no-c-format msgid "VALUE is not allowed inside of BLOCK at %C" -msgstr "" +msgstr "VALUE ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" #: fortran/decl.c:6390 #, no-c-format @@ -5694,7 +5692,7 @@ msgstr "%C处需è¦ç»‘定属性" #: fortran/decl.c:7309 #, no-c-format msgid "NON_OVERRIDABLE and DEFERRED can't both appear at %C" -msgstr "" +msgstr "NON_OVERRIDABLE å’Œ DEFERRED ä¸èƒ½åŒæ—¶å‡ºçŽ°åœ¨%C处" #: fortran/decl.c:7321 #, no-c-format @@ -5729,7 +5727,7 @@ msgstr "%C处需è¦ç»‘定å" #: fortran/decl.c:7428 #, no-c-format msgid "'=> target' is invalid for DEFERRED binding at %C" -msgstr "" +msgstr "‘=> target’对%C处的 DEFERRED ç»‘å®šè€Œè¨€æ— æ•ˆ" #: fortran/decl.c:7434 #, no-c-format @@ -6298,9 +6296,9 @@ msgid "Syntax error in generic specification at %C" msgstr "%C 泛型指定è¯æ³•é”™è¯¯" #: fortran/interface.c:201 -#, fuzzy, no-c-format +#, no-c-format msgid "Syntax error: Trailing garbage in INTERFACE statement at %C" -msgstr "è¯æ³•é”™è¯¯ï¼šåœ¨ %C 处 INTERFACE è¯å¥ä¸å°¾éšçš„垃圾" +msgstr "è¯æ³•é”™è¯¯ï¼šåœ¨ %C处 INTERFACE è¯å¥åŽæœ‰åžƒåœ¾å—符" #: fortran/interface.c:220 #, no-c-format @@ -6313,14 +6311,14 @@ msgid "Fortran 2003: ABSTRACT INTERFACE at %C" msgstr "Fortran 2003:%C处的 ABSTRACT INTERFACE" #: fortran/interface.c:261 -#, fuzzy, no-c-format +#, no-c-format msgid "Syntax error in ABSTRACT INTERFACE statement at %C" -msgstr "%C 处 ABSTRACT INTERFACE è¯å¥ä¸çš„è¯æ³•é”™è¯¯" +msgstr "%C处 ABSTRACT INTERFACE è¯å¥è¯æ³•é”™è¯¯" #: fortran/interface.c:292 -#, fuzzy, no-c-format +#, no-c-format msgid "Syntax error: Trailing garbage in END INTERFACE statement at %C" -msgstr "è¯æ³•é”™è¯¯ï¼šEND INTERFACE è¯å¥ä¸å°¾éšçš„垃圾" +msgstr "è¯æ³•é”™è¯¯ï¼š%C处 END INTERFACE è¯å¥åŽæœ‰åžƒåœ¾å—符" #: fortran/interface.c:305 #, no-c-format @@ -6368,14 +6366,14 @@ msgid "Assignment operator interface at %L must have two arguments" msgstr "%L处的赋值è¿ç®—符接å£å¿…须有两个实å‚" #: fortran/interface.c:635 -#, fuzzy, no-c-format +#, no-c-format msgid "Assignment operator interface at %L must not redefine an INTRINSIC type assignment" -msgstr "%L 处的赋值è¿ç®—符接å£ä¸å¿…é‡å¤å®šä¹‰ä¸€ä¸ª INTRINSIC 类型" +msgstr "%L处的赋值è¿ç®—符接å£ä¸èƒ½é‡å¤å®šä¹‰ä¸€ä¸ª INTRINSIC 类型赋值" #: fortran/interface.c:644 -#, fuzzy, no-c-format +#, no-c-format msgid "Intrinsic operator interface at %L must be a FUNCTION" -msgstr "%L 处内建è¿ç®—符接å£å¿…须是一个 FUNCTION" +msgstr "%L处内建è¿ç®—符接å£å¿…须是一个 FUNCTION" #: fortran/interface.c:655 #, fuzzy, no-c-format @@ -6403,9 +6401,9 @@ msgid "Operator interface at %L conflicts with intrinsic interface" msgstr "%L处è¿ç®—符接å£ä¸Žå†…建接å£å†²çª" #: fortran/interface.c:1075 -#, fuzzy, no-c-format +#, no-c-format msgid "Procedure '%s' in %s at %L has no explicit interface" -msgstr "在 %3$L 处“%2$sâ€ä¸çš„过程“%1$sâ€æ²¡æœ‰æ˜¾å¼æŽ¥å£" +msgstr "%3$L处 %2$s ä¸çš„过程‘%1$s’没有显å¼æŽ¥å£" #: fortran/interface.c:1078 #, no-c-format @@ -6513,9 +6511,9 @@ msgid "Expected a PURE procedure for argument '%s' at %L" msgstr "å‚数‘%s’在%L处需è¦ä¸€ä¸ª PURE 过程" #: fortran/interface.c:1970 -#, fuzzy, no-c-format +#, no-c-format msgid "Actual argument for '%s' cannot be an assumed-size array at %L" -msgstr "“%sâ€çš„实å‚在 %L 处必须ä¸æ˜¯ä¸€ä¸ªå‡å®šå¤§å°çš„数组" +msgstr "‘%s’的实å‚在%L处必须ä¸æ˜¯ä¸€ä¸ªå‡å®šå¤§å°çš„数组" #: fortran/interface.c:1979 #, no-c-format @@ -6528,9 +6526,9 @@ msgid "Actual argument for '%s' must be ALLOCATABLE at %L" msgstr "‘%s’的实å‚在%L处必须是 ALLOCATABLE çš„" #: fortran/interface.c:2001 -#, fuzzy, no-c-format +#, no-c-format msgid "Actual argument at %L must be definable as the dummy argument '%s' is INTENT = OUT/INOUT" -msgstr "在 %L 处实际的å‚数必须是å¯å®šä¹‰çš„ï¼Œå› ä¸º å‡å‚数“%sâ€æ˜¯ INTENT = OUT/INOUT" +msgstr "%L处的实å‚必须是å¯å®šä¹‰çš„ï¼Œå› ä¸ºå“‘å‚数‘%s’是 INTENT = OUT/INOUT" #: fortran/interface.c:2010 #, fuzzy, no-c-format @@ -6648,9 +6646,9 @@ msgid "Type of argument '%s' in call to '%s' at %L should be %s, not %s" msgstr "%3$L 处对“%2$sâ€çš„调用ä¸å‚数“%1$sâ€çš„类型应该是“%1$sâ€ï¼Œè€Œéžâ€œ%1$sâ€" #: fortran/intrinsic.c:3717 -#, fuzzy, no-c-format +#, no-c-format msgid "Intrinsic '%s' (is %s) is used at %L" -msgstr "%3$L 处使用了内建的“%1$sâ€(是 %2$s)" +msgstr "%3$L处使用了内建的‘%1$s’(是 %2$s)" #: fortran/intrinsic.c:3781 #, no-c-format @@ -6663,9 +6661,9 @@ msgid "Fortran 2003: Elemental function as initialization expression with non-in msgstr "Fortran 2003:作为åˆå§‹è¡¨è¾¾å¼çš„基本函数在 %L 处用整数或éžå—符的å‚æ•°" #: fortran/intrinsic.c:3918 -#, fuzzy, no-c-format +#, no-c-format msgid "Subroutine call to intrinsic '%s' at %L is not PURE" -msgstr "在 %2$L 处调用内建“%1$sâ€çš„å例程ä¸æ˜¯ PURE" +msgstr "在%2$L处调用内建‘%1$s’的å例程ä¸æ˜¯ PURE" #: fortran/intrinsic.c:3990 #, no-c-format @@ -6985,9 +6983,9 @@ msgid "Fortran 2003: ENCODING= at %C not allowed in Fortran 95" msgstr "Fortran 2003:%C处的 ENCODING= ä¸å…许用在 Fortran 95 ä¸" #: fortran/io.c:1965 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran F2003: ROUND= at %C not allowed in Fortran 95" -msgstr "Fortran 2003:%C处的 ASYNCHRONOUS= ä¸å…许用在 Fortran 95 ä¸" +msgstr "Fortran 2003:%C处的 ROUND= ä¸å…许用在 Fortran 95 ä¸" #: fortran/io.c:1985 #, no-c-format @@ -7005,9 +7003,9 @@ msgid "UNIT number in CLOSE statement at %L must be non-negative" msgstr "%L处 CASE è¯å¥ä¸çš„表达å¼å¿…须具有 %s 类型" #: fortran/io.c:2343 fortran/match.c:1976 -#, fuzzy, no-c-format +#, no-c-format msgid "%s statement not allowed in PURE procedure at %C" -msgstr "OPEN å™è¿°ä¸å…许出现在 %C 处的 PURE 程åºä¸" +msgstr "%s è¯å¥ä¸å…许出现在%C处的 PURE 程åºä¸" #: fortran/io.c:2375 fortran/io.c:2783 #, fuzzy, no-c-format @@ -7136,9 +7134,9 @@ msgid "Syntax error in %s statement at %C" msgstr "%s è¯å¥åœ¨%C处è¯æ³•é”™è¯¯" #: fortran/io.c:3173 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: Internal file at %L with namelist" -msgstr "Fortran 2003:属性 %s 在 %L 处出现在 TYPE 定义ä¸" +msgstr "Fortran 2003:%L处内部文件有åå—列表" #: fortran/io.c:3227 #, no-c-format @@ -7146,14 +7144,14 @@ msgid "ASYNCHRONOUS= specifier at %L must be an initialization expression" msgstr "必须为%L处的 ASYNCHRONOUS= 指定一个åˆå§‹åŒ–表达å¼" #: fortran/io.c:3295 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: PAD= at %C not allowed in Fortran 95" -msgstr "Fortran 2003:%C 处的 PAD= ä¸å…许用在 Fortran 95 ä¸" +msgstr "Fortran 2003:%C处的 PAD= ä¸å…许用在 Fortran 95 ä¸" #: fortran/io.c:3316 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: ROUND= at %C not allowed in Fortran 95" -msgstr "Fortran 2003:%C处的 ASYNCHRONOUS= ä¸å…许用在 Fortran 95 ä¸" +msgstr "Fortran 2003:%C处的 ROUND= ä¸å…许用在 Fortran 95 ä¸" #: fortran/io.c:3510 #, no-c-format @@ -7291,9 +7289,9 @@ msgid "Invalid form of PROGRAM statement at %C" msgstr "%C处 PROGRAM è¯å¥æ ¼å¼æ— 效" #: fortran/match.c:1389 fortran/match.c:1470 -#, fuzzy, no-c-format +#, no-c-format msgid "Obsolescent feature: Arithmetic IF statement at %C" -msgstr "%L 处的算数 IF è¯å¥è¦æ±‚一个数å—表达å¼" +msgstr "已过时的特性:%C处的算术 IF è¯å¥" #: fortran/match.c:1445 #, no-c-format @@ -7412,9 +7410,9 @@ msgid "Invalid type-spec at %C" msgstr "%Cå¤„ç±»åž‹æŒ‡å®šæ— æ•ˆ" #: fortran/match.c:2422 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: typespec in ALLOCATE at %L" -msgstr "Fortran 2003:%s 属性与 %s 属性冲çªï¼Œåœ¨â€˜%s’ä¸ï¼Œä½äºŽ %L" +msgstr "Fortran 2003:%L处 ALLOCATE ä¸æœ‰ typespec" #: fortran/match.c:2454 #, fuzzy, no-c-format @@ -7437,9 +7435,9 @@ msgid "Allocate-object at %C is not a nonprocedure pointer or an allocatable var msgstr "" #: fortran/match.c:2518 fortran/match.c:2772 -#, no-c-format +#, fuzzy, no-c-format msgid "Redundant STAT tag found at %L " -msgstr "" +msgstr "%L有多余的 ERRMSG æ ‡è®°" #: fortran/match.c:2537 #, no-c-format @@ -7447,9 +7445,9 @@ msgid "Fortran 2003: ERRMSG tag at %L" msgstr "Fortran 2003:%L处的 ERRMSG æ ‡è®°" #: fortran/match.c:2544 fortran/match.c:2798 -#, fuzzy, no-c-format +#, no-c-format msgid "Redundant ERRMSG tag found at %L " -msgstr "Fortran 2003:%L处的 ERRMSG æ ‡è®°" +msgstr "%L有多余的 ERRMSG æ ‡è®°" #: fortran/match.c:2560 #, no-c-format @@ -7457,14 +7455,14 @@ msgid "Fortran 2003: SOURCE tag at %L" msgstr "Fortran 2003:%L处的 SOURCE æ ‡è®°" #: fortran/match.c:2567 -#, fuzzy, no-c-format +#, no-c-format msgid "Redundant SOURCE tag found at %L " -msgstr "Fortran 2003:%L处的 SOURCE æ ‡è®°" +msgstr "%L有多余的 SOURCE æ ‡è®°" #: fortran/match.c:2574 #, no-c-format msgid "SOURCE tag at %L conflicts with the typespec at %L" -msgstr "" +msgstr "%L处的 SOURCE æ ‡è®°ä¸Ž%L处的类型指定冲çª" #: fortran/match.c:2581 #, no-c-format @@ -7492,9 +7490,9 @@ msgid "Alternate RETURN statement at %C is only allowed within a SUBROUTINE" msgstr "%C处的替代 RETURN è¯å¥åªå…许出现在 SUBROUTINE ä¸" #: fortran/match.c:2857 -#, fuzzy, no-c-format +#, no-c-format msgid "Obsolescent feature: Alternate RETURN at %C" -msgstr "%L ä¸å…许有 ALTERNATIVE RETURN" +msgstr "已过时的特性:%C处交替的 RETURN" #: fortran/match.c:2887 #, no-c-format @@ -7615,9 +7613,9 @@ msgid "Statement function at %L is recursive" msgstr "%L处的è¯å¥å‡½æ•°æ˜¯é€’å½’çš„" #: fortran/match.c:3800 -#, fuzzy, no-c-format +#, no-c-format msgid "Obsolescent feature: Statement function at %C" -msgstr "%L处的è¯å¥å‡½æ•°æ˜¯é€’å½’çš„" +msgstr "已过时的特性:%C处的è¯å¥å‡½æ•°" #: fortran/match.c:3886 #, no-c-format @@ -7635,9 +7633,9 @@ msgid "Selector in SELECT TYPE at %C is not a named variable; use associate-name msgstr "" #: fortran/match.c:4047 -#, fuzzy, no-c-format +#, no-c-format msgid "Selector shall be polymorphic in SELECT TYPE statement at %C" -msgstr "%C处 PROTECTED è¯å¥è¯æ³•é”™è¯¯" +msgstr "%C处 SELECT TYPE è¯å¥ä¸çš„选择å应该是多æ€çš„" #: fortran/match.c:4075 #, no-c-format @@ -7645,9 +7643,9 @@ msgid "Unexpected CASE statement at %C" msgstr "%C处éžé¢„期的 CASE è¯å¥" #: fortran/match.c:4127 -#, fuzzy, no-c-format +#, no-c-format msgid "Syntax error in CASE specification at %C" -msgstr "%C 泛型指定è¯æ³•é”™è¯¯" +msgstr "%C处 CASE 指定è¯æ³•é”™è¯¯" #: fortran/match.c:4145 #, no-c-format @@ -7716,9 +7714,9 @@ msgid "Out of memory-- malloc() failed" msgstr "内å˜ä¸è¶³ -- malloc() 失败" #: fortran/module.c:519 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: module nature in USE statement at %C" -msgstr "Fortran 2003:%C 处的 USE è¯å¥ä¸æ¨¡å—本性" +msgstr "Fortran 2003:%C处的 USE è¯å¥ä¸æ¨¡å—本性" #: fortran/module.c:531 #, fuzzy, no-c-format @@ -7726,9 +7724,9 @@ msgid "Module nature in USE statement at %C shall be either INTRINSIC or NON_INT msgstr "在 %C 处 USE è¯å¥ä¸çš„模å—本性应该是 INTRINSIC 或 NON_INTRINSIC ä¸çš„任何一个" #: fortran/module.c:544 -#, fuzzy, no-c-format +#, no-c-format msgid "\"::\" was expected after module nature at %C but was not found" -msgstr "在 %C 处在模å—本性åŽæœŸå¾…的是“::â€ï¼Œä½†æ˜¯æ‰¾ä¸åˆ°" +msgstr "%C处在模å—本性åŽéœ€è¦â€œ::â€" #: fortran/module.c:553 #, no-c-format @@ -7853,14 +7851,14 @@ msgid "Symbol '%s' referenced at %L not found in module '%s'" msgstr "%2$L处引用的符å·â€˜%1$s’在模å—‘%3$s’ä¸æ‰¾ä¸åˆ°" #: fortran/module.c:4443 -#, fuzzy, no-c-format +#, no-c-format msgid "User operator '%s' referenced at %L not found in module '%s'" -msgstr "%2$L 处引用的用户æ“作符“%1$sâ€åœ¨æ¨¡å—“%3$sâ€ä¸æ‰¾ä¸åˆ°" +msgstr "%2$L处引用的用户è¿ç®—符‘%1$s’在模å—‘%3$s’ä¸æ‰¾ä¸åˆ°" #: fortran/module.c:4448 -#, fuzzy, no-c-format +#, no-c-format msgid "Intrinsic operator '%s' referenced at %L not found in module '%s'" -msgstr "%2$L 处引用的内建æ“作符“%1$sâ€åœ¨æ¨¡å—“%3$sâ€ä¸æ‰¾ä¸åˆ°" +msgstr "%2$L处引用的内建è¿ç®—符‘%1$s’在模å—‘%3$s’ä¸æ‰¾ä¸åˆ°" #: fortran/module.c:5057 #, no-c-format @@ -7957,9 +7955,9 @@ msgid "Unexpected end of module" msgstr "éžé¢„期的模å—结æŸ" #: fortran/module.c:5478 -#, fuzzy, no-c-format +#, no-c-format msgid "File '%s' opened at %C is not a GFORTRAN module file" -msgstr "%2$C 处打开的文件的“%1$sâ€å¹¶éžä¸€ä¸ª GFORTRAN 模å—文件" +msgstr "%2$C处打开的文件的‘%1$s’并éžä¸€ä¸ª GFORTRAN 模å—文件" #: fortran/module.c:5485 #, fuzzy, no-c-format @@ -7997,9 +7995,9 @@ msgid "COLLAPSE clause argument not constant positive integer at %C" msgstr "%C 处的 COLLAPSE 分å¥å‚æ•°ä¸æ˜¯ä¸å˜çš„æ£æ•´æ•°" #: fortran/openmp.c:542 -#, fuzzy, no-c-format +#, no-c-format msgid "Threadprivate variable at %C is an element of a COMMON block" -msgstr " %C 处 Threadprivate å˜é‡æ˜¯ä¸ª COMMON å—çš„å…ƒç´ " +msgstr " %C 处线程局部å˜é‡æ˜¯ä¸ª COMMON å—çš„å…ƒç´ " #: fortran/openmp.c:582 #, no-c-format @@ -8033,9 +8031,9 @@ msgid "Symbol '%s' present on multiple clauses at %L" msgstr "%L 处符å·â€œ%1$sâ€å‡ºçŽ°åœ¨å¤šä¸ªåˆ†å¥ä¸Š" #: fortran/openmp.c:874 -#, fuzzy, no-c-format +#, no-c-format msgid "Non-THREADPRIVATE object '%s' in COPYIN clause at %L" -msgstr "%2$L 处 COPYIN 分å¥ä¸çš„ Non-THREADPRIVATE 对象“%1$sâ€" +msgstr "%2$L处 COPYIN 分å¥ä¸çš„éž THREADPRIVATE 对象‘%1$s’" #: fortran/openmp.c:877 #, fuzzy, no-c-format @@ -8053,9 +8051,9 @@ msgid "COPYPRIVATE clause object '%s' at %L has ALLOCATABLE components" msgstr "%2$L 处 COPYPRIVATE 分å¥å¯¹è±¡â€œ%1$sâ€æœ‰ ALLOCATABLE 组件" #: fortran/openmp.c:896 -#, fuzzy, no-c-format +#, no-c-format msgid "THREADPRIVATE object '%s' in SHARED clause at %L" -msgstr "%2$L 处 SHARED 分å¥ä¸çš„ THREADPRIVATE 对象“%1$sâ€" +msgstr "%2$L处 SHARED 分å¥ä¸çš„ THREADPRIVATE 对象‘%1$s’" #: fortran/openmp.c:899 #, fuzzy, no-c-format @@ -8063,9 +8061,9 @@ msgid "Cray pointee '%s' in SHARED clause at %L" msgstr "%2$L 处 SHARED 分å¥ä¸çš„ Cray 指针“%1$sâ€" #: fortran/openmp.c:907 -#, fuzzy, no-c-format +#, no-c-format msgid "THREADPRIVATE object '%s' in %s clause at %L" -msgstr "%2$L 处分å¥ä¸çš„ THREADPRIVATE 对象“%1$sâ€" +msgstr "%3$L处 %2$s 分å¥ä¸çš„ THREADPRIVATE 对象‘%1$s’" #: fortran/openmp.c:910 #, no-c-format @@ -8198,14 +8196,14 @@ msgid "!$OMP DO collapsed loops don't form rectangular iteration space at %L" msgstr "在 %L 处,!$OMP DO 崩溃的循环ä¸å½¢æˆçŸ©å½¢è¿ä»£ç©ºç™½" #: fortran/openmp.c:1477 -#, fuzzy, no-c-format +#, no-c-format msgid "collapsed !$OMP DO loops not perfectly nested at %L" -msgstr "折å çš„ !$OMP DO 循环没有完美的嵌套于 %L 处" +msgstr "折å çš„ !$OMP DO 循环没有完美的嵌套于%L处" #: fortran/openmp.c:1486 fortran/openmp.c:1493 -#, fuzzy, no-c-format +#, no-c-format msgid "not enough DO loops for collapsed !$OMP DO at %L" -msgstr "在 %L 处崩溃的 !$OMP DO 没有足够的 DO 循环" +msgstr "%L处折å çš„ !$OMP DO 没有足够的 DO 循环" #: fortran/options.c:308 #, no-c-format @@ -8338,9 +8336,9 @@ msgid "Semicolon at %C needs to be preceded by statement" msgstr "%C处分å·å‰å¿…须是一个è¯å¥" #: fortran/parse.c:661 fortran/parse.c:855 -#, fuzzy, no-c-format +#, no-c-format msgid "Ignoring statement label in empty statement at %L" -msgstr "%C处è¯å¥æ ‡å·ä¸æ•°å—太多" +msgstr "忽略%L处空è¯å¥ä¸çš„è¯å¥æ ‡å·" #: fortran/parse.c:782 fortran/parse.c:822 #, no-c-format @@ -8429,24 +8427,24 @@ msgid "Fortran 2003: GENERIC binding at %C" msgstr "Fortran 2003:%L处的 GENERIC 绑定" #: fortran/parse.c:1864 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: FINAL procedure declaration at %C" -msgstr "Fortran 2003:%C 处的的 FINAL 过程声明" +msgstr "Fortran 2003:%C处的的 FINAL 过程声明" #: fortran/parse.c:1876 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2008: Derived type definition at %C with empty CONTAINS section" -msgstr "Fortran 2008:%C 处的派生类型定义有空的 CONTAINS 部分" +msgstr "Fortran 2008:%C的派生类型定义有空的 CONTAINS 节" #: fortran/parse.c:1887 fortran/parse.c:1993 -#, fuzzy, no-c-format +#, no-c-format msgid "PRIVATE statement in TYPE at %C must be inside a MODULE" -msgstr "%C 处 TYPE ä¸çš„ PRIVATE è¯å¥å¿…须在 MODULE ä¸" +msgstr "%C处 TYPE ä¸çš„ PRIVATE è¯å¥å¿…须在 MODULE ä¸" #: fortran/parse.c:1895 -#, fuzzy, no-c-format +#, no-c-format msgid "PRIVATE statement at %C must precede procedure bindings" -msgstr "%C 处 PRINT è¯å¥å¿…须先于过程é™å®š" +msgstr "%C 处 PRIVATE è¯å¥å¿…须先于过程绑定" #: fortran/parse.c:1903 fortran/parse.c:2009 #, no-c-format @@ -8454,19 +8452,19 @@ msgid "Duplicate PRIVATE statement at %C" msgstr "%C处é‡å¤çš„ PRIVATE è¯å¥" #: fortran/parse.c:1913 -#, fuzzy, no-c-format +#, no-c-format msgid "SEQUENCE statement at %C must precede CONTAINS" -msgstr "%C 处 SEQUENCE è¯å¥å¿…须先于 CONTAINS" +msgstr "%C处 SEQUENCE è¯å¥å¿…须先于 CONTAINS" #: fortran/parse.c:1918 -#, fuzzy, no-c-format +#, no-c-format msgid "Already inside a CONTAINS block at %C" -msgstr "å·²ç»åœ¨ %C 上的一个 CONTAINS å—内部 " +msgstr "%C处已在一个 CONTAINS å—内部 " #: fortran/parse.c:1973 -#, fuzzy, no-c-format +#, no-c-format msgid "FINAL declaration at %C must be inside CONTAINS" -msgstr "%C 处的 FINAL 声明必须是在 CONTAINS 内" +msgstr "%C处的 FINAL 声明必须在 CONTAINS 内" #: fortran/parse.c:1982 #, no-c-format @@ -8474,19 +8472,19 @@ msgid "Fortran 2003: Derived type definition at %C without components" msgstr "Fortran 2003:%C处的派生类型定义没有组件" #: fortran/parse.c:2001 -#, fuzzy, no-c-format +#, no-c-format msgid "PRIVATE statement at %C must precede structure components" -msgstr "%C 处 PRIVATE è¯å¥å¿…须先于结构组件" +msgstr "%C处 PRIVATE è¯å¥å¿…须先于结构组件" #: fortran/parse.c:2022 -#, fuzzy, no-c-format +#, no-c-format msgid "SEQUENCE statement at %C must precede structure components" -msgstr "%C 处 SEQUENCE è¯å¥å¿…须先于结构组件" +msgstr "%C处 SEQUENCE è¯å¥å¿…须先于结构组件" #: fortran/parse.c:2029 -#, fuzzy, no-c-format +#, no-c-format msgid "SEQUENCE attribute at %C already specified in TYPE statement" -msgstr "%C 处 SEQUENCE 属性已ç»åœ¨ TYPE è¯å¥ä¸æŒ‡å®š" +msgstr "%C处 SEQUENCE 属性已ç»åœ¨ TYPE è¯å¥ä¸æŒ‡å®š" #: fortran/parse.c:2034 #, no-c-format @@ -8494,9 +8492,9 @@ msgid "Duplicate SEQUENCE statement at %C" msgstr "%C处é‡å¤çš„ SEQUENCE è¯å¥" #: fortran/parse.c:2045 -#, fuzzy, no-c-format +#, no-c-format msgid "Fortran 2003: CONTAINS block in derived type definition at %C" -msgstr "Fortran 2003:%C 处的派生类型定义ä¸çš„ CONTAINS å—" +msgstr "Fortran 2003:%C处的派生类型定义ä¸çš„ CONTAINS å—" #: fortran/parse.c:2135 #, fuzzy, no-c-format @@ -8534,9 +8532,9 @@ msgid "INTERFACE procedure '%s' at %L has the same name as the enclosing procedu msgstr "在 %2$L 处 INTERFACE 过程“%1$sâ€æœ‰ä¸ŽåŒ…装过程相åŒçš„åå—" #: fortran/parse.c:2431 -#, fuzzy, no-c-format +#, no-c-format msgid "%s statement is not allowed inside of BLOCK at %C" -msgstr "%C 处的 IF è¯å¥å—æ ‡è®°ä¸é€‚åˆ" +msgstr "%s è¯å¥ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" #: fortran/parse.c:2517 #, no-c-format @@ -8591,7 +8589,7 @@ msgstr "在 %C 处期待的一个 CASE 或 END SELECT è¯å¥åŽè·Ÿ SELECT CASE" #: fortran/parse.c:2929 #, no-c-format msgid "Expected TYPE IS, CLASS IS or END SELECT statement following SELECT TYPE at %C" -msgstr "" +msgstr "%C处的 SELECT TYPE 之åŽéœ€è¦ TYPE ISã€CLASS IS 或 END SELECT è¯å¥" #: fortran/parse.c:2991 #, no-c-format @@ -8692,9 +8690,9 @@ msgid "Integer kind %d at %C not available" msgstr "æ•´æ•°ç§åˆ« %d 在%C处ä¸å¯ç”¨" #: fortran/primary.c:225 -#, fuzzy, no-c-format +#, no-c-format msgid "Integer too big for its kind at %C. This check can be disabled with the option -fno-range-check" -msgstr "%C 处该类的整数太大。这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" +msgstr "%C整数相对其ç§åˆ«è€Œè¨€å¤ªå¤§ã€‚这一检查å¯ç”¨ -fno-range-check 选项ç¦ç”¨" #: fortran/primary.c:254 #, no-c-format @@ -8722,9 +8720,9 @@ msgid "Extension: Hexadecimal constant at %C uses non-standard syntax" msgstr "扩展:%C处的åå…进制常é‡ä½¿ç”¨äº†éžæ ‡å‡†è¯æ³•" #: fortran/primary.c:380 -#, fuzzy, no-c-format +#, no-c-format msgid "Empty set of digits in BOZ constant at %C" -msgstr "%C 处 BOZ 常数ä¸çš„æ•°å—符集åˆä¸ºç©º" +msgstr "%C处 BOZ 常é‡ä¸çš„æ•°å—符集åˆä¸ºç©º" #: fortran/primary.c:386 #, no-c-format @@ -8752,9 +8750,9 @@ msgid "Missing exponent in real number at %C" msgstr "%C处实数缺少指数部分" #: fortran/primary.c:602 -#, fuzzy, no-c-format +#, no-c-format msgid "Real number at %C has a 'd' exponent and an explicit kind" -msgstr "在 %C 处实数有一个'd'指数和一个显å¼çš„类别" +msgstr "%C处的实数有一个‘d’指数和一个显å¼çš„ç§åˆ«" #: fortran/primary.c:615 #, no-c-format @@ -8872,9 +8870,9 @@ msgid "No initializer for component '%s' given in the structure constructor at % msgstr "对 %C å¤„ç»“æž„æž„é€ ä¸ç»™å‡ºçš„“%1$sâ€ç»„件没有åˆå§‹åŒ–器" #: fortran/primary.c:2260 -#, fuzzy, no-c-format +#, no-c-format msgid "Can't construct ABSTRACT type '%s' at %C" -msgstr "%C å¤„æ— æ³•æž„å»º ABSTRACT 类型“%sâ€" +msgstr "%2$Cå¤„æ— æ³•æž„å»º ABSTRACT 类型‘%1$s’" #: fortran/primary.c:2288 #, fuzzy, no-c-format @@ -8962,9 +8960,9 @@ msgid "'%s' at %L is of the ABSTRACT type '%s'" msgstr "%2$L 处的“%1$sâ€æ˜¯ ABSTRACT 类型“%3$sâ€" #: fortran/resolve.c:114 -#, fuzzy, no-c-format +#, no-c-format msgid "ABSTRACT type '%s' used at %L" -msgstr "用于 %1$L 处的 ABSTRACT 类型“%2$sâ€" +msgstr "%2$L处使用了 ABSTRACT 类型‘%1$s’" #: fortran/resolve.c:164 #, no-c-format @@ -9150,9 +9148,9 @@ msgid "The element in the derived type constructor at %L, for pointer component msgstr "%L 处的派生类型构建器ä¸çš„å…ƒç´ ï¼Œå¯¹æŒ‡é’ˆç»„ä»¶â€œ%sâ€è€Œè¨€æ˜¯ä¸ª %s 但应该是 %s" #: fortran/resolve.c:899 -#, fuzzy, no-c-format +#, no-c-format msgid "The NULL in the derived type constructor at %L is being applied to component '%s', which is neither a POINTER nor ALLOCATABLE" -msgstr "在 %L å¤„æ´¾ç”Ÿç±»åž‹æž„é€ æˆå‘˜ä¸çš„ NULL 适用于既ä¸æ˜¯ä¸€ä¸ªæŒ‡é’ˆä¹Ÿä¸æ˜¯ ALLOCATABLE 的组件“%sâ€" +msgstr "%Lå¤„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸çš„ NULL 被用在既ä¸æ˜¯ä¸€ä¸ªæŒ‡é’ˆä¹Ÿä¸æ˜¯ ALLOCATABLE 的组件‘%s’上" #: fortran/resolve.c:913 #, fuzzy, no-c-format @@ -9269,9 +9267,9 @@ msgid "The reference to function '%s' at %L either needs an explicit INTERFACE o msgstr "" #: fortran/resolve.c:1930 -#, fuzzy, no-c-format +#, no-c-format msgid "There is no specific function for the generic '%s' at %L" -msgstr "在 %2$L 处通用的“%1$sâ€æ²¡æœ‰ç‰¹å®šçš„函数" +msgstr "%2$L处的泛型‘%1$s’没有指定的函数" #: fortran/resolve.c:1939 #, fuzzy, no-c-format @@ -9399,9 +9397,9 @@ msgid "Subroutine call to '%s' in FORALL block at %L is not PURE" msgstr "在 %2$L 处调用 FORALL å—内“%1$sâ€çš„å例程ä¸æ˜¯ PURE" #: fortran/resolve.c:2766 -#, fuzzy, no-c-format +#, no-c-format msgid "Subroutine call to '%s' at %L is not PURE" -msgstr "在 %2$L 处调用“%1$sâ€çš„å例程ä¸æ˜¯ PURE" +msgstr "%2$L处调用‘%1$s’的å例程ä¸æ˜¯ PURE" #: fortran/resolve.c:2829 #, no-c-format @@ -9429,9 +9427,9 @@ msgid "Subroutine '%s' at %L is INTRINSIC but is not compatible with an intrinsi msgstr "在 %2$L 处的å例程“%sâ€æ˜¯ INTRINSIC,但ä¸æ˜¯ä¸Žä¸€ä¸ªå†…建å例程å¯å…¼å®¹" #: fortran/resolve.c:3065 -#, fuzzy, no-c-format +#, no-c-format msgid "Unable to resolve the specific subroutine '%s' at %L" -msgstr "ä¸èƒ½è§£å†³ %2$L 处的特定å例程“%1$sâ€" +msgstr "ä¸èƒ½è§£å†³%2$L处的指定å例程‘%1$s’" #: fortran/resolve.c:3125 #, fuzzy, no-c-format @@ -9500,7 +9498,7 @@ msgstr "比较è¿ç®—符‘%s’(ä½äºŽ %%L)çš„æ“作数为 %s/%s" #: fortran/resolve.c:3433 #, c-format msgid "Unknown operator '%s' at %%L" -msgstr "未知的æ“作符‘%s’在 %%L处" +msgstr "未知的è¿ç®—符‘%s’在 %%L处" #: fortran/resolve.c:3435 #, c-format @@ -9513,9 +9511,9 @@ msgid "Operands of user operator '%s' at %%L are %s/%s" msgstr "用户è¿ç®—符‘%s’(ä½äºŽ %%L)çš„æ“作数为 %s/%s" #: fortran/resolve.c:3524 -#, fuzzy, c-format +#, c-format msgid "Inconsistent ranks for operator at %%L and %%L" -msgstr "%%L å’Œ %%L 处的æ“作数的行列ä¸ä¸€è‡´" +msgstr "%%Lå’Œ%%L处的æ“作数的秩ä¸ä¸€è‡´" #: fortran/resolve.c:3727 #, no-c-format @@ -9653,9 +9651,9 @@ msgid "Variable '%s' is used at %L before the ENTRY statement in which it is a p msgstr "在 %L 处使用å˜é‡â€œ%sâ€ï¼Œç”¨åœ¨å®ƒæ˜¯ä¸€ä¸ªå‚æ•°çš„ ENTRY è¯å¥ä»¥å‰" #: fortran/resolve.c:4786 fortran/resolve.c:4858 -#, fuzzy, no-c-format +#, no-c-format msgid "Passed-object at %L must be scalar" -msgstr "在 %L å¤„ä¼ é€’çš„å¯¹è±¡å¿…é¡»æ˜¯æ ‡é‡" +msgstr "%Lå¤„ä¼ é€’çš„å¯¹è±¡å¿…é¡»æ˜¯æ ‡é‡" #: fortran/resolve.c:4887 #, no-c-format @@ -9791,9 +9789,9 @@ msgid "Array specification required in ALLOCATE statement at %L" msgstr "%L 处的 ALLOCATE è¯å¥ä¸è¦æ±‚çš„æ•°ç»„è§„æ ¼è¯´æ˜Ž" #: fortran/resolve.c:6197 -#, fuzzy, no-c-format +#, no-c-format msgid "Bad array specification in ALLOCATE statement at %L" -msgstr "%L 处的 ALLOCATE è¯å¥ä¸åçš„æ•°ç»„è§„æ ¼è¯´æ˜Ž" +msgstr "%L处的 ALLOCATE è¯å¥æŒ‡å®šäº†é”™è¯¯çš„数组" #: fortran/resolve.c:6217 #, fuzzy, no-c-format @@ -9823,12 +9821,12 @@ msgstr "%C READ è¯å¥éœ€è¦å˜é‡" #: fortran/resolve.c:6266 #, no-c-format msgid "ERRMSG at %L is useless without a STAT tag" -msgstr "" +msgstr "%L处的 ERRMSG 没有 STAT æ ‡è®°æ‰€ä»¥ä¸èµ·ä½œç”¨" #: fortran/resolve.c:6270 -#, fuzzy, no-c-format +#, no-c-format msgid "Errmsg-variable '%s' at %L cannot be INTENT(IN)" -msgstr "循环å˜é‡â€˜%s’在%C处ä¸èƒ½æ˜¯ INTENT(IN)" +msgstr "错误信æ¯å˜é‡â€˜%s’在%L处ä¸èƒ½æ˜¯ INTENT(IN)" #: fortran/resolve.c:6274 #, fuzzy, no-c-format @@ -9848,7 +9846,7 @@ msgstr "" #: fortran/resolve.c:6305 #, no-c-format msgid "Allocate-object at %L also appears at %L" -msgstr "" +msgstr "%L处分é…的对象也出现在%L处" #. The cases overlap, or they are the same #. element in the list. Either way, we must @@ -9915,19 +9913,19 @@ msgid "Logical SELECT CASE block at %L has more that two cases" msgstr "在 %L 处逻辑的 SELECT CASE å—多于两个的情况" #: fortran/resolve.c:6884 -#, fuzzy, no-c-format +#, no-c-format msgid "Derived type '%s' at %L must be extensible" -msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须具有å¯æ‰©å±•ç±»åž‹" +msgstr "%2$L处派生类型‘%1$s’必须是å¯æ‰©å±•çš„" #: fortran/resolve.c:6894 -#, fuzzy, no-c-format +#, no-c-format msgid "Derived type '%s' at %L must be an extension of '%s'" -msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须是派生类型" +msgstr "%2$L处派生类型‘%1$s’必须是‘%3$s’的一个扩展" #: fortran/resolve.c:7040 #, no-c-format msgid "Double CLASS IS block in SELECT TYPE statement at %L" -msgstr "" +msgstr "%L处 SELECT TYPE è¯å¥ä¸æœ‰åŒé‡çš„ CLASS IS å—" #: fortran/resolve.c:7135 #, fuzzy, no-c-format @@ -9955,9 +9953,9 @@ msgid "Statement at %L is not a valid branch target statement for the branch sta msgstr "在 %L 处的è¯å¥å¯¹äºŽåœ¨ %L 处的分支è¯å¥ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„åˆ†æ”¯ç›®æ ‡è¯å¥" #: fortran/resolve.c:7229 -#, fuzzy, no-c-format +#, no-c-format msgid "Branch at %L may result in an infinite loop" -msgstr "%L å¤„çš„åˆ†æ”¯å¯¼è‡´æ— ç©·å¾ªçŽ¯" +msgstr "%L处的分支å¯èƒ½å¯¼è‡´æ— 穷循环" #. The label is not in an enclosing block, so illegal. This was #. allowed in Fortran 66, so we allow it as extension. No @@ -10013,9 +10011,9 @@ msgid "CHARACTER expression will be truncated in assignment (%d/%d) at %L" msgstr "CHARACTER 表达å¼åœ¨ %3$L 处赋值(%1$d/%2$d)时被截æ–" #: fortran/resolve.c:7831 -#, fuzzy, no-c-format +#, no-c-format msgid "Cannot assign to variable '%s' in PURE procedure at %L" -msgstr "ä¸èƒ½åœ¨ %L 处的 PURE 过程ä¸ä¸ºå˜é‡â€œ%1$sâ€èµ‹å€¼" +msgstr "ä¸èƒ½åœ¨%2$L处的 PURE 过程ä¸ä¸ºå˜é‡â€˜%1$s’赋值" #: fortran/resolve.c:7843 #, fuzzy, no-c-format @@ -10101,9 +10099,9 @@ msgid "CHARACTER variable has zero length at %L" msgstr "%L处的 CHARACTER å˜é‡é•¿åº¦ä¸ºé›¶" #: fortran/resolve.c:8475 -#, fuzzy, no-c-format +#, no-c-format msgid "String length at %L is too large" -msgstr "%L处å串结æŸç´¢å¼•å¤ªå¤§" +msgstr "%L处å—符串太长" #: fortran/resolve.c:8777 #, no-c-format @@ -10193,9 +10191,9 @@ msgid "Automatic array '%s' at %L cannot have an initializer" msgstr "自动数组‘%s’在%L处ä¸èƒ½æœ‰åˆå§‹å€¼è®¾å®š" #: fortran/resolve.c:9026 -#, fuzzy, no-c-format +#, no-c-format msgid "Although not referenced, '%s' at %L has ambiguous interfaces" -msgstr "å³ä½¿ä¸å¼•ç”¨ï¼Œåœ¨ %L 处的“%sâ€æœ‰äºŒä¹‰æ€§æŽ¥å£" +msgstr "尽管没有被引用,%2$L处的‘%1$s’的接å£ä¹Ÿæœ‰æ§ä¹‰" #: fortran/resolve.c:9045 #, fuzzy, no-c-format @@ -10253,9 +10251,9 @@ msgid "CHARACTER(*) function '%s' at %L cannot be recursive" msgstr "CHARACTER(*) 函数‘%s’在%L处ä¸èƒ½æ˜¯é€’å½’çš„" #: fortran/resolve.c:9203 -#, fuzzy, no-c-format +#, no-c-format msgid "Obsolescent feature: CHARACTER(*) function '%s' at %L" -msgstr "已过时:%C处的旧å¼å—符长度" +msgstr "已过时的特性:%2$L处的 CHARACTER(*) 函数‘%1$s’" #: fortran/resolve.c:9258 #, fuzzy, no-c-format @@ -10293,29 +10291,29 @@ msgid "FINAL procedure at %L must have exactly one argument" msgstr "%L 处的 FINAL 过程必须åªæœ‰ä¸€ä¸ªå‚æ•°" #: fortran/resolve.c:9347 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of FINAL procedure at %L must be of type '%s'" -msgstr "%L 处 FINAL 过程的å‚数必须是“%sâ€ç±»åž‹" +msgstr "%L处 FINAL 过程的å‚数必须是‘%s’类型" #: fortran/resolve.c:9355 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of FINAL procedure at %L must not be a POINTER" -msgstr "%L 处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ POINTER" +msgstr "%L处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ POINTER" #: fortran/resolve.c:9361 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of FINAL procedure at %L must not be ALLOCATABLE" -msgstr "%L 处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ ALLOCATABLE" +msgstr "%L处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ ALLOCATABLE" #: fortran/resolve.c:9367 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of FINAL procedure at %L must not be OPTIONAL" -msgstr "%L 处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ OPTIONAL" +msgstr "%L处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ OPTIONAL" #: fortran/resolve.c:9375 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of FINAL procedure at %L must not be INTENT(OUT)" -msgstr "%L 处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ INTENT(OUT)" +msgstr "%L处 FINAL 过程的å‚æ•°å¿…é¡»ä¸æ˜¯ INTENT(OUT)" #: fortran/resolve.c:9383 #, fuzzy, no-c-format @@ -10334,19 +10332,19 @@ msgstr "仅数组 FINAL 过程声明了在 %L 处定义的派生类型“%sâ€ï¼ #. TODO: Remove this error when finalization is finished. #: fortran/resolve.c:9440 -#, fuzzy, no-c-format +#, no-c-format msgid "Finalization at %L is not yet implemented" -msgstr "在 %C 处的åˆå§‹åŒ–还未实现" +msgstr "%L处的终结化还未实现" #: fortran/resolve.c:9466 #, no-c-format msgid "Can't overwrite GENERIC '%s' at %L" -msgstr "ä¸èƒ½è¦†ç›–‘%1$L’处的 GENERIC‘%2$s’" +msgstr "ä¸èƒ½è¦†ç›–%2$L处的 GENERIC‘%1$s’" #: fortran/resolve.c:9478 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a procedure binding declared NON_OVERRIDABLE" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Šé™å®šå£°æ˜Ž NON_OVERRIDABLE 的过程" +msgstr "%2$L处的‘%1$s’覆盖了一个绑定声明为 NON_OVERRIDABLE 的过程" #: fortran/resolve.c:9486 #, no-c-format @@ -10354,39 +10352,39 @@ msgid "'%s' at %L must not be DEFERRED as it overrides a non-DEFERRED binding" msgstr "" #: fortran/resolve.c:9494 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a PURE procedure and must also be PURE" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š PURE 过程并且必须也是 PURE" +msgstr "%2$L处的‘%1$s’覆盖了一个 PURE è¿‡ç¨‹å› æ¤å¿…须也是 PURE" #: fortran/resolve.c:9503 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides an ELEMENTAL procedure and must also be ELEMENTAL" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š ELEMENTAL 过程并且也必须是个 ELEMENTAL" +msgstr "%2$L处的‘%1$s’覆盖了一个 ELEMENTAL è¿‡ç¨‹å› æ¤ä¹Ÿå¿…须是 ELEMENTAL" #: fortran/resolve.c:9509 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a non-ELEMENTAL procedure and must not be ELEMENTAL, either" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Šéž ELEMENTAL 过程并且必须ä¸æ˜¯ä¸ª ELEMENTAL," +msgstr "%2$L处的‘%1$sâ€™è¦†ç›–äº†ä¸€ä¸ªéž ELEMENTAL è¿‡ç¨‹å› æ¤å¿…须也ä¸æ˜¯ ELEMENTAL" #: fortran/resolve.c:9518 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a SUBROUTINE and must also be a SUBROUTINE" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š SUBROUTINE 并且也必须是个 SUBROUTINE" +msgstr "%2$L处的‘%1$s’覆盖了一个 SUBROUTINE å› æ¤ä¹Ÿå¿…须是 SUBROUTINE" #: fortran/resolve.c:9529 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a FUNCTION and must also be a FUNCTION" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š FUNCTION 并且也必须是个 FUNCTION" +msgstr "%2$L处的‘%1$s’覆盖了一个 FUNCTION å› æ¤ä¹Ÿå¿…须是 FUNCTION" #: fortran/resolve.c:9540 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L and the overridden FUNCTION should have matching result types" -msgstr "在 %L 处的“%sâ€å’Œè·¨è¿‡çš„ FUNCTION 应该有匹é…的结果类型" +msgstr "%2$L处的‘%1$s’和它覆盖的 FUNCTION 应该有匹é…的返回类型" #: fortran/resolve.c:9551 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a PUBLIC procedure and must not be PRIVATE" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š PUBLIC 过程并且必须ä¸æ˜¯ PRIVATE" +msgstr "%2$L处的‘%1$s’覆盖了一个 PUBLIC è¿‡ç¨‹å› æ¤å¿…é¡»ä¸æ˜¯ PRIVATE" #: fortran/resolve.c:9580 #, fuzzy, no-c-format @@ -10404,14 +10402,14 @@ msgid "'%s' at %L must have the same number of formal arguments as the overridde msgstr "在 %2$L 处的“%1$sâ€å¿…须有与被跨越的过程相åŒçš„å½¢å¼å‚æ•°" #: fortran/resolve.c:9612 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a NOPASS binding and must also be NOPASS" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Š NOPASS é™å®šå¹¶ä¸”也必须是个 NPASSO" +msgstr "%2$L处的‘%1$s’覆盖了一个 NOPASS ç»‘å®šå› æ¤å¿…须也是 NOPASS" #: fortran/resolve.c:9623 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' at %L overrides a binding with PASS and must also be PASS" -msgstr "%2$L 处的“%1$sâ€è·¨è¶Šå…·æœ‰ PASS çš„é™å®šå¹¶ä¸”也必须是个 PASS" +msgstr "%2$L处的‘%1$s’覆盖了一个具有 PASS çš„ç»‘å®šå› æ¤ä¹Ÿå¿…须是 PASS" #: fortran/resolve.c:9630 #, fuzzy, no-c-format @@ -10619,9 +10617,9 @@ msgid "Implicitly typed PARAMETER '%s' at %L doesn't match a later IMPLICIT type msgstr "在 %2$L 处éšå¼åœ°æ‰“å—çš„ PARAMETER“%1$sâ€ä¸Žä¸€ä¸ªæ›´åŽé¢çš„ IMPLICIT 类型ä¸åŒ¹é…" #: fortran/resolve.c:10703 -#, fuzzy, no-c-format +#, no-c-format msgid "Incompatible derived type in PARAMETER at %L" -msgstr "在 %L 处 PARAMETER ä¸æ´¾ç”Ÿç±»åž‹ç§©ä¸å…¼å®¹" +msgstr "%L处 PARAMETER ä¸æ´¾ç”Ÿç±»åž‹ä¸å…¼å®¹" #: fortran/resolve.c:10766 #, fuzzy, no-c-format @@ -10929,14 +10927,14 @@ msgid "Invalid KIND parameter of %s at %L" msgstr "%s ä½äºŽ %L çš„ KIND å‚æ•°æ— æ•ˆ" #: fortran/simplify.c:680 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of %s function at %L is negative" -msgstr "%2$L 处的 %1$s 函数的å‚数是负的" +msgstr "%2$L处 %1$s 函数的å‚数是负的" #: fortran/simplify.c:687 -#, fuzzy, no-c-format +#, no-c-format msgid "Argument of %s function at %L outside of range [0,127]" -msgstr "%L 处 %s 函数的å‚æ•°ä¸åœ¨[0,127]范围内" +msgstr "%2$L处 %1$s 函数的å‚æ•°ä¸åœ¨[0,127]范围内" #: fortran/simplify.c:705 #, fuzzy, no-c-format @@ -10999,9 +10997,9 @@ msgid "Invalid third argument of IBITS at %L" msgstr "%L处 IBITS 的第三个å‚æ•°æ— æ•ˆ" #: fortran/simplify.c:2325 -#, fuzzy, no-c-format +#, no-c-format msgid "Sum of second and third arguments of IBITS exceeds bit size at %L" -msgstr "%L 处 IBSET 的第二和第三å‚数的总和超过ä½å¤§å°" +msgstr "%L处 IBSET 的第二个和第三个å‚数的总和超过ä½å¤§å°" #: fortran/simplify.c:2372 #, no-c-format @@ -11009,9 +11007,9 @@ msgid "Invalid second argument of IBSET at %L" msgstr "%L处 IBSET 的第二个å‚æ•°æ— æ•ˆ" #: fortran/simplify.c:2380 -#, fuzzy, no-c-format +#, no-c-format msgid "Second argument of IBSET exceeds bit size at %L" -msgstr "%L 处 IBSET 的第二个å‚数超过ä½å¤§å°" +msgstr "%L处 IBSET 的第二个å‚数超过ä½å¤§å°" #: fortran/simplify.c:2410 #, no-c-format @@ -11202,9 +11200,9 @@ msgid "Fortran 2003: Procedure pointer at %C" msgstr "Fortran 2003:%C处的过程指针组件" #: fortran/symbol.c:617 -#, fuzzy, no-c-format +#, no-c-format msgid "%s attribute applied to %s %s at %L" -msgstr "%1$s 属性应用于 %4$L 处的 %2$s %3$s" +msgstr "%1$s 属性应用于%4$L处的 %2$s %3$s" #: fortran/symbol.c:624 #, fuzzy, no-c-format @@ -11392,24 +11390,24 @@ msgid "Duplicate statement label %d at %L and %L" msgstr "é‡å¤çš„è¯å¥æ ‡å· %d 出现在 %L å’Œ%L处" #: fortran/symbol.c:2089 -#, fuzzy, no-c-format +#, no-c-format msgid "Label %d at %C already referenced as branch target" -msgstr "在 %2$C å¤„çš„æ ‡å· %1$d å·²ä½œä¸ºåˆ†æ”¯ç›®æ ‡å¼•ç”¨" +msgstr "%2$Cå¤„çš„æ ‡å· %1$d å·²ä½œä¸ºåˆ†æ”¯ç›®æ ‡å¼•ç”¨" #: fortran/symbol.c:2098 -#, fuzzy, no-c-format +#, no-c-format msgid "Label %d at %C already referenced as a format label" -msgstr "在 %C å¤„çš„æ ‡å· %d å·²ä½œä¸ºæ ¼å¼æ ‡å·å¼•ç”¨" +msgstr "%2$Cå¤„çš„æ ‡å· %1$d å·²ä½œä¸ºæ ¼å¼æ ‡å·å¼•ç”¨" #: fortran/symbol.c:2140 -#, fuzzy, no-c-format +#, no-c-format msgid "Label %d at %C previously used as a FORMAT label" -msgstr "在 %2$C å¤„çš„æ ‡å· %1$d 以å‰ç”¨ä½œ FORMAT æ ‡å·" +msgstr "%2$Cå¤„çš„æ ‡å· %1$d å…ˆå‰ç”¨ä½œ FORMAT æ ‡å·" #: fortran/symbol.c:2148 -#, fuzzy, no-c-format +#, no-c-format msgid "Label %d at %C previously used as branch target" -msgstr "在 %2$C å¤„çš„æ ‡å· %1$d 以å‰ç”¨ä½œåˆ†æ”¯ç›®æ ‡" +msgstr "%2$Cå¤„çš„æ ‡å· %1$d å…ˆå‰ç”¨ä½œåˆ†æ”¯ç›®æ ‡" #: fortran/symbol.c:2463 #, fuzzy, no-c-format @@ -11478,19 +11476,19 @@ msgid "Derived type '%s' at %L cannot have the SEQUENCE attribute because it is msgstr "%2$L 处派生类型“%1$sâ€ä¸èƒ½æœ‰ SEQUENCE å±žæ€§ï¼Œå› ä¸ºå®ƒæ˜¯ BIND(C)" #: fortran/symbol.c:4507 -#, fuzzy, no-c-format +#, no-c-format msgid "Symbol '%s' is used before it is typed at %L" -msgstr "%L 处打入以å‰ç¬¦å·â€œ%1$sâ€å·²è¢«ä½¿ç”¨" +msgstr "%2$L处符å·â€˜%1$s’在指定类型之å‰è¢«ä½¿ç”¨" #: fortran/symbol.c:4513 -#, fuzzy, no-c-format +#, no-c-format msgid "Extension: Symbol '%s' is used before it is typed at %L" -msgstr "扩展:%C 处打入以å‰ç¬¦å·â€œ%1$sâ€å·²è¢«ä½¿ç”¨" +msgstr "扩展:%2$L处符å·â€˜%1$s’在指定类型之å‰è¢«ä½¿ç”¨" #: fortran/symbol.c:4852 fortran/symbol.c:4926 -#, fuzzy, no-c-format +#, no-c-format msgid "'%s' of '%s' is PRIVATE at %L" -msgstr "组件‘%s’在%C处是‘%s’的 PRIVATE 组件" +msgstr "‘%2$s’的‘%1$s’在%3$L处是 PRIVATE" #: fortran/target-memory.c:659 #, fuzzy, no-c-format @@ -11592,14 +11590,14 @@ msgid "non-constant initialization expression at %L" msgstr "%C处需è¦æ ‡é‡åˆå§‹åŒ–表达å¼" #: fortran/trans-decl.c:3085 fortran/trans-decl.c:4408 -#, fuzzy, no-c-format +#, no-c-format msgid "Return value of function '%s' at %L not set" -msgstr "%2$L 处函数“%1$sâ€çš„返回值没有设置" +msgstr "%2$L处函数‘%1$s’的返回值没有设置" #: fortran/trans-decl.c:3782 -#, fuzzy, no-c-format +#, no-c-format msgid "Dummy argument '%s' at %L was declared INTENT(OUT) but was not set" -msgstr "%2$L 处的“%1$sâ€å“‘å…ƒå‚数声明为 INTENT(OUT),但没有设置" +msgstr "%2$L处的哑元å‚数‘%1$s’被声明为 INTENT(OUT),但没有设置" #: fortran/trans-decl.c:3787 #, no-c-format @@ -11633,7 +11631,7 @@ msgstr "å‚数‘%s’在%L处缺少实å‚" #: fortran/trans-expr.c:1616 msgid "internal error: bad hash value in dynamic dispatch" -msgstr "" +msgstr "内部错误:动æ€åˆ†å‘时散列值错误" #: fortran/trans-expr.c:2530 #, no-c-format @@ -11885,7 +11883,7 @@ msgstr "å–æ ·ä¸æ”¯æŒ -mg\n" #: config/i386/linux-unwind.h:186 msgid "ax ; {int $0x80 | syscall" -msgstr "" +msgstr "ax ; {int $0x80 | syscall" #: config/darwin.h:306 msgid "-current_version only allowed with -dynamiclib" @@ -12207,7 +12205,6 @@ msgid "Warn about underflow of numerical constant expressions" msgstr "æ•°å—常é‡è¡¨è¾¾å¼ä¸‹æº¢æ—¶è¦å‘Š" #: fortran/lang.opt:125 -#, fuzzy msgid "Warn if a user-procedure has the same name as an intrinsic" msgstr "如果用户过程有与内建过程相åŒçš„åå—则è¦å‘Š" @@ -12237,9 +12234,8 @@ msgid "Specify that backslash in string introduces an escape character" msgstr "指定å—符串ä¸çš„åæ–œæ 引入一个转义å—符" #: fortran/lang.opt:161 -#, fuzzy msgid "Produce a backtrace when a runtime error is encountered" -msgstr "é‡åˆ°è¿è¡Œæ—¶é”™è¯¯æ—¶äº§ç”Ÿä¸€ä¸ªå跟踪" +msgstr "é‡åˆ°è¿è¡Œæ—¶é”™è¯¯æ—¶æ‰“å°å‡½æ•°è°ƒç”¨å›žæº¯" #: fortran/lang.opt:165 msgid "-fblas-matmul-limit=<n> Size of the smallest matrix for which matmul will use BLAS" @@ -12303,9 +12299,8 @@ msgid "Display the code tree after parsing" msgstr "解æžåŽæ˜¾ç¤ºä»£ç æ ‘" #: fortran/lang.opt:225 -#, fuzzy msgid "Specify that an external BLAS library should be used for matmul calls on large-size arrays" -msgstr "指定一个外部的 BLAS 库应该于大尺寸数组时为 matmul 调用所使用" +msgstr "为大尺寸数组调用 matmul 时应当使用一个外部 BLAS 库" #: fortran/lang.opt:229 msgid "Use f2c calling convention" @@ -12388,9 +12383,8 @@ msgid "Size in bytes of the largest array that will be put on the stack" msgstr "以å—节大å°è¡¨ç¤ºçš„å¯ä»¥è¢«æ”¾å…¥å †æ ˆçš„数组的最大大å°" #: fortran/lang.opt:309 -#, fuzzy msgid "Set default accessibility of module entities to PRIVATE." -msgstr "将模å—实体的默认访问æƒè®¾ç½®ä¸º PRIVATE。" +msgstr "将模å—实体的默认访问æƒé™è®¾ç½®ä¸º PRIVATE。" #: fortran/lang.opt:317 msgid "Try to lay out derived types as compactly as possible" @@ -12418,9 +12412,8 @@ msgid "Copy array sections into a contiguous block on procedure entry" msgstr "把数组节å¤åˆ¶è¿›è¿‡ç¨‹è¡¨é¡¹ä¸Šçš„一个连ç»å—" #: fortran/lang.opt:345 -#, fuzzy msgid "Specify which runtime checks are to be performed" -msgstr "指定是å¦åº”当使用 r10k 缓å˜å±éšœ" +msgstr "指定è¦è¿›è¡Œå“ªç§è¿è¡Œæ—¶æ£€æŸ¥" #: fortran/lang.opt:349 msgid "Append a second underscore if the name already contains an underscore" @@ -12436,7 +12429,7 @@ msgstr "为外部å¯è§çš„åå—æ·»åŠ ä¸‹åˆ’çº¿" #: fortran/lang.opt:365 msgid "Compile all program units at once and check all interfaces" -msgstr "" +msgstr "ç«‹å³ç¼–译所有程åºå•å…ƒå¹¶æ£€æŸ¥æŽ¥å£" #: fortran/lang.opt:405 msgid "Statically link the GNU Fortran helper library (libgfortran)" @@ -12727,9 +12720,8 @@ msgid "Cause gas to print tomcat statistics" msgstr "让 gas æ‰“å° tomcat 统计" #: config/frv/frv.opt:195 -#, fuzzy msgid "Link with the library-pic libraries" -msgstr "与 library-pic 库的链接" +msgstr "与 library-pic 库链接" #: config/frv/frv.opt:199 msgid "Allow branches to be packed with other instructions" @@ -12760,9 +12752,8 @@ msgid "Enable TPF-OS tracing code" msgstr "å¯ç”¨ TPF-OS 追踪代ç " #: config/s390/tpf.opt:27 -#, fuzzy msgid "Specify main object for TPF-OS" -msgstr "指定 TPF-OS 主è¦å¯¹è±¡" +msgstr "指定 TPF-OS 的主对象" #: config/s390/s390.opt:23 msgid "31 bit ABI" @@ -12984,9 +12975,8 @@ msgid "Place a stop bit after every cycle when scheduling" msgstr "调度时在æ¯å‘¨æœŸåŽéƒ½æ”¾ç½®åœæ¢ä½" #: config/ia64/ia64.opt:167 -#, fuzzy msgid "Assume that floating-point stores and loads are not likely to cause conflict when placed into one instruction group" -msgstr "å‡å®šæµ®ç‚¹å˜å‚¨å’Œè£…载当放进一个指令组时ä¸å¤ªä¼šå¼•èµ·å†²çªæ˜¯" +msgstr "å‡å®šæµ®ç‚¹å˜å‚¨å’Œè£…载放在一个指令组时ä¸å¤ªä¼šå¼•èµ·å†²çª" #: config/ia64/ia64.opt:171 #, fuzzy @@ -12994,14 +12984,12 @@ msgid "Soft limit on number of memory insns per instruction group, giving lower msgstr "软件é™å®šæ¯æŒ‡ä»¤ç»„å†…å˜ insns 数,给åŽæ¥çš„试图在相åŒçš„ insn 组ä¸åŽ»è°ƒåº¦çš„å†…å˜ insns 低的优先数 。防æ¢é«˜é€Ÿç¼“å˜é“¶è¡Œå†²çªå¸¸å¸¸æ˜¯æœ‰ç”¨çš„。 默认值是 1" #: config/ia64/ia64.opt:175 -#, fuzzy msgid "Disallow more than `msched-max-memory-insns' in instruction group. Otherwise, limit is `soft' (prefer non-memory operations when limit is reached)" -msgstr "在指令组ä¸ä¸å‡†å¤šäºŽ `msched-max-memory-insns' 。å¦åˆ™ï¼Œé™å®šå€¼æ˜¯`软的' (当达到é™å®šå€¼æ—¶å®å¯éžå†…å˜æ“作)" +msgstr "一个指令组ä¸è‡³å¤šæœ‰â€˜msched-max-memory-insns’æ¡æŒ‡ä»¤ã€‚å¦åˆ™ï¼Œé™å®šå€¼æ˜¯`软的' (当达到é™å®šå€¼æ—¶ä¼˜å…ˆé€‰æ‹©éžå†…å˜æ“作)" #: config/ia64/ia64.opt:179 -#, fuzzy msgid "Don't generate checks for control speculation in selective scheduling" -msgstr "在选择调度ä¸ä¸ä¸ºæŽ§åˆ¶æŽ¨æµ‹äº§ç”Ÿæ£€æŸ¥" +msgstr "在选择性调度ä¸ä¸ä¸ºæŽ§åˆ¶æŠ•æœºç”Ÿæˆæ£€æŸ¥" #: config/ia64/ia64.opt:183 msgid "Enable fused multiply/add and multiply/subtract instructions" @@ -13009,11 +12997,11 @@ msgstr "å¯ç”¨èžåˆçš„ä¹˜åŠ å’Œä¹˜å‡æŒ‡ä»¤" #: config/ia64/vms_symvec_libgcc_s.opt:3 msgid "! It would be better to auto-generate this file." -msgstr "" +msgstr "! 最好自动生æˆæ¤æ–‡ä»¶ã€‚" #: config/ia64/vms_symvec_libgcc_s.opt:7 msgid "SYMBOL_VECTOR=(__divdi3=PROCEDURE)" -msgstr "" +msgstr "SYMBOL_VECTOR=(__divdi3=PROCEDURE)" #: config/m32c/m32c.opt:24 config/bfin/bfin.opt:23 config/mep/mep.opt:138 msgid "Use simulator runtime" @@ -13180,9 +13168,8 @@ msgid "Don't call any cache flush trap" msgstr "ä¸è°ƒç”¨ä»»ä½•æ¸…空缓å˜çš„陷阱" #: config/m32r/m32r.opt:82 -#, fuzzy msgid "Small data area: none, sdata, use" -msgstr "å°æ•°æ®åŒºåŸŸ: none, sdata, use" +msgstr "å°æ•°æ®åŒºåŸŸ: noneã€sdataã€use" #: config/m68k/m68k.opt:23 msgid "Generate code for a 520X" @@ -13342,7 +13329,7 @@ msgstr "在 ColdFire 上支æŒè¶…过 8192 个 GOT æ¡ç›®" #: config/m68k/m68k.opt:188 msgid "Support TLS segment larger than 64K" -msgstr "" +msgstr "支æŒå¤§äºŽ 64K çš„ TLS 段" #: config/m68k/ieee.opt:24 config/i386/i386.opt:137 msgid "Use IEEE math for fp comparisons" @@ -13655,11 +13642,11 @@ msgstr "使用 PE æ ¼å¼çš„ GNU 扩展æ¥å¯¹é½ common æ•°æ®" #: config/i386/cygming.opt:55 msgid "Compile code that relies on Cygwin DLL wrappers to support C++ operator new/delete replacement" -msgstr "" +msgstr "生æˆä¾èµ– Cygwin DLL 包装的代ç 以支æŒå¯¹ C++ è¿ç®—符 new/delete 的替æ¢" #: config/i386/mingw-w64.opt:23 msgid "Use unicode startup and define UNICODE macro" -msgstr "" +msgstr "使用 unicode å¯åŠ¨å¹¶ä¸”定义 UNICODE å®" #: config/rs6000/aix.opt:24 config/rs6000/rs6000.opt:195 msgid "Conform more closely to IBM XLC semantics" @@ -13782,18 +13769,16 @@ msgid "Generate load/store with update instructions" msgstr "生æˆå¸¦æ›´æ–°çš„åŠ è½½/å˜å‚¨æŒ‡ä»¤" #: config/rs6000/rs6000.opt:168 -#, fuzzy msgid "Avoid generation of indexed load/store instructions when possible" -msgstr "当å¯èƒ½çš„æ—¶é¿å… 装载/å˜å‚¨ 指令索引的产生" +msgstr "å°½å¯èƒ½é¿å…生æˆå˜å€è£…è½½/å˜å‚¨æŒ‡ä»¤" #: config/rs6000/rs6000.opt:172 msgid "Generate fused multiply/add instructions" msgstr "生æˆèžåˆçš„乘/åŠ æŒ‡ä»¤" #: config/rs6000/rs6000.opt:176 -#, fuzzy msgid "Mark __tls_get_addr calls with argument info" -msgstr "调用%<__builtin_next_arg%>时没有给定实å‚" +msgstr "用实å‚ä¿¡æ¯æ ‡æ³¨å¯¹ __tls_get_addr 的调用" #: config/rs6000/rs6000.opt:183 msgid "Schedule the start and end of the procedure" @@ -13909,9 +13894,8 @@ msgid "Specify which post scheduling nop insertion scheme to apply" msgstr "指定应用的事åŽè°ƒåº¦ nop æ’入计划" #: config/rs6000/rs6000.opt:314 -#, fuzzy msgid "Specify alignment of structure fields default/natural" -msgstr "指定结构å—段默认或本æ¥çš„对é½" +msgstr "指定结构å—段默认或自然的对é½" #: config/rs6000/rs6000.opt:318 #, fuzzy @@ -13931,9 +13915,8 @@ msgid "Floating point unit does not support divide & sqrt" msgstr "浮点å•å…ƒä¸æ”¯æŒé™¤æ³•å’Œå¼€æ–¹" #: config/rs6000/rs6000.opt:334 -#, fuzzy msgid "Specify FP (sp, dp, sp-lite, dp-lite) (implies -mxilinx-fpu)" -msgstr "指定 FP (sp,dp,sp-lite,dp-lite) (implies -mxilinx-fpu)" +msgstr "指定 FP (spã€dpã€sp-liteã€dp-lite)(åŒæ—¶æŒ‡å®šäº† -mxilinx-fpu)" #: config/rs6000/rs6000.opt:338 msgid "Specify Xilinx FPU." @@ -13948,9 +13931,8 @@ msgid "Compile for 32-bit pointers" msgstr "为 32 ä½æŒ‡é’ˆç¼–译" #: config/rs6000/aix64.opt:32 -#, fuzzy msgid "Support message passing with the Parallel Environment" -msgstr "支æŒç”¨å¹¶è¡ŒçŽ¯å¢ƒçš„消æ¯ä¼ é€" +msgstr "支æŒå¹¶è¡ŒçŽ¯å¢ƒä¸‹çš„消æ¯ä¼ é€" #: config/rs6000/linux64.opt:24 #, fuzzy @@ -13962,7 +13944,6 @@ msgid "Select ABI calling convention" msgstr "选择 ABI 调用约定" #: config/rs6000/sysv4.opt:28 -#, fuzzy msgid "Select method for sdata handling" msgstr "ä¸ºå¤„ç† sdata 选择方法" @@ -14006,7 +13987,7 @@ msgstr "使用å¦ä¸€å¥—寄å˜å™¨å" #: config/rs6000/sysv4.opt:101 msgid "Use default method for sdata handling" -msgstr "" +msgstr "å¤„ç† sdata 使用默认的方法" #: config/rs6000/sysv4.opt:105 msgid "Link with libsim.a, libc.a and sim-crt0.o" @@ -14037,14 +14018,12 @@ msgid "Generate code for old exec BSS PLT" msgstr "为旧的å¯æ‰§è¡Œ BSS PLT 生æˆä»£ç " #: config/spu/spu.opt:20 -#, fuzzy msgid "Emit warnings when run-time relocations are generated" -msgstr "Emit 当è¿è¡Œæ—¶é—´é‡å®šä½ç”Ÿæˆæ—¶è¦å‘Š" +msgstr "生æˆè¿è¡Œæ—¶é‡å®šä½æ—¶ç»™å‡ºè¦å‘Š" #: config/spu/spu.opt:24 -#, fuzzy msgid "Emit errors when run-time relocations are generated" -msgstr "Emit 当è¿è¡Œæ—¶é—´é‡å®šä½ç”Ÿæˆæ—¶å‡ºé”™è¯¯" +msgstr "生æˆè¿è¡Œæ—¶é‡å®šä½æ—¶ç»™å‡ºé”™è¯¯" #: config/spu/spu.opt:28 msgid "Specify cost of branches (Default 20)" @@ -14059,9 +14038,8 @@ msgid "volatile must be specified on any memory that is effected by DMA" msgstr "所有为 DMA 所影å“的内å˜å¿…é¡»è¢«æ ‡ä¸º volatile" #: config/spu/spu.opt:40 config/spu/spu.opt:44 -#, fuzzy msgid "Insert nops when it might improve performance by allowing dual issue (default)" -msgstr "å½“å› å…许åŒå‘出(默认)å¯èƒ½æ”¹å–„性能时æ’å…¥ nops" +msgstr "å¯èƒ½å› å…许åŒå‘射而改善性能时æ’å…¥ nop(默认)" #: config/spu/spu.opt:48 msgid "Use standard main function as entry for startup" @@ -14072,14 +14050,12 @@ msgid "Generate branch hints for branches" msgstr "为跳转生æˆæš—示" #: config/spu/spu.opt:56 -#, fuzzy msgid "Maximum number of nops to insert for a hint (Default 2)" -msgstr "为 æ示æ’入的 nops 的最大数(默认 2)" +msgstr "为实现跳转æ示æ’入的 nop 的最大数(默认 2)" #: config/spu/spu.opt:60 -#, fuzzy msgid "Approximate maximum number of instructions to allow between a hint and its branch [125]" -msgstr "建议和其分支[125]之间所å…许的大致最大指令数" +msgstr "跳转æ示和其分支之间所å…许的大致最大指令数[125]" #: config/spu/spu.opt:64 msgid "Generate code for 18 bit addressing" @@ -14090,21 +14066,20 @@ msgid "Generate code for 32 bit addressing" msgstr "为 32 ä½å¯»å€ç”Ÿæˆä»£ç " #: config/spu/spu.opt:76 -#, fuzzy msgid "Insert hbrp instructions after hinted branch targets to avoid the SPU hang issue" -msgstr "在æç¤ºåˆ†æ”¯ç›®æ ‡ä»¥é¿å… SPU hang å‘出以åŽæ’å…¥ hbrp 指令" +msgstr "在æç¤ºåˆ†æ”¯ç›®æ ‡åŽæ’å…¥ hbrp 指令以é¿å… SPU æ»é”" #: config/spu/spu.opt:88 msgid "Access variables in 32-bit PPU objects (default)" -msgstr "" +msgstr "在 32 ä½ PPU 对象访问å˜é‡(默认)" #: config/spu/spu.opt:92 msgid "Access variables in 64-bit PPU objects" -msgstr "" +msgstr "在 64 ä½ PPU 对象访问å˜é‡" #: config/spu/spu.opt:96 msgid "Allow conversions between __ea and generic pointers (default)" -msgstr "" +msgstr "支æŒåœ¨ __ea 和普通指针之间的转æ¢(默认)" #: config/spu/spu.opt:100 msgid "Size (in KB) of software data cache" @@ -14112,7 +14087,7 @@ msgstr "以 KB 表示的软件数æ®ç¼“å˜çš„大å°" #: config/spu/spu.opt:104 msgid "Atomically write back software data cache lines (default)" -msgstr "" +msgstr "原å化对软件数æ®ç¼“å˜çš„写回æ“作(默认)" #: config/mcore/mcore.opt:23 msgid "Generate code for the M*Core M210" @@ -14147,9 +14122,8 @@ msgid "Generate little-endian code" msgstr "生æˆå°ç«¯åœ¨å‰çš„代ç " #: config/mcore/mcore.opt:56 config/fr30/fr30.opt:27 -#, fuzzy msgid "Assume that run-time support has been provided, so omit -lsim from the linker command line" -msgstr "å‡å®š è¿è¡Œ-时间支æŒå·²è¢«æä¾›, 那么从链接器命令行çœç•¥ -lsim" +msgstr "å‡å®šè¿è¡Œæ—¶æ”¯æŒå·²è¢«æä¾›ï¼Œå› æ¤ä»Žé“¾æŽ¥å™¨å‘½ä»¤è¡Œçœç•¥ -lsim" #: config/mcore/mcore.opt:60 msgid "Use arbitrary sized immediates in bit operations" @@ -14160,9 +14134,8 @@ msgid "Prefer word accesses over byte accesses" msgstr "å°½é‡æŒ‰å—访问而ä¸æ˜¯æŒ‰å—节访问" #: config/mcore/mcore.opt:68 -#, fuzzy msgid "Set the maximum amount for a single stack increment operation" -msgstr "为å•ä¸ªå †æ ˆå¢žé‡æ“作è¿ç®—设置最大的总é‡" +msgstr "设定å•ä¸ªå †æ ˆå¢žé‡æ“作è¿ç®—总é‡çš„上é™" #: config/mcore/mcore.opt:72 msgid "Always treat bitfields as int-sized" @@ -14369,9 +14342,8 @@ msgid "Enable cbranchdi4 pattern" msgstr "å¯ç”¨ cbranchdi4 æ ·å¼" #: config/sh/sh.opt:229 -#, fuzzy msgid "Emit cmpeqdi_t pattern even when -mcbranchdi is in effect." -msgstr "ç”Ÿæˆ cmpeqdi_t æ ·å¼ï¼Œå³ä½¿ -mcbranchdi å’Œ -mexpand-cbranchdi 起作用。" +msgstr "ç”Ÿæˆ cmpeqdi_t æ ·å¼ï¼Œå³ä½¿ -mcbranchdi 起作用。" #: config/sh/sh.opt:233 msgid "Enable SH5 cut2 workaround" @@ -14391,7 +14363,7 @@ msgstr "指定 32 ä½æœ‰ç¬¦å·é™¤æ³•å‡½æ•°çš„å称" #: config/sh/sh.opt:249 msgid "Enable the use of 64-bit floating point registers in fmov instructions. See -mdalign if 64-bit alignment is required." -msgstr "" +msgstr "在 fmov 指令ä¸å¯ç”¨ 64 ä½æµ®ç‚¹å¯„å˜å™¨ã€‚å¦‚éœ€è¦ 64 ä½å¯¹é½è¯·å‚è§ -mdalign。" #: config/sh/sh.opt:257 msgid "Enable the use of the fused floating point multiply-accumulate operation" @@ -14423,7 +14395,7 @@ msgstr "å‡å®šç¬¦å·å¯èƒ½æ— 效" #: config/sh/sh.opt:285 msgid "Annotate assembler instructions with estimated addresses" -msgstr "使用估算的地å€æ ‡è®°æ±‡ç¼–指令" +msgstr "使用估算的地å€è¯„注汇编指令" #: config/sh/sh.opt:289 msgid "Generate code in little endian mode" @@ -14467,7 +14439,6 @@ msgid "Pretend a branch-around-a-move is a conditional move." msgstr "将数æ®ä¼ 输周围的跳转认为是æ¡ä»¶è½¬ç§»ã€‚" #: config/sh/superh.opt:6 -#, fuzzy msgid "Board name [and memory region]." msgstr "æ¿åå—[和内å˜åŒºåŸŸ]。" @@ -14600,9 +14571,8 @@ msgid "Use Neon quad-word (rather than double-word) registers for vectorization" msgstr "使用 Neon å››å—(而éžåŒå—)寄å˜å™¨æ¥è¿›è¡ŒçŸ¢é‡åŒ–" #: config/arm/arm.opt:166 -#, fuzzy msgid "Only generate absolute relocations on word sized values." -msgstr "于å—大å°å€¼ä»…产生ç»å¯¹çš„é‡å®šä½ã€‚" +msgstr "对å—大å°çš„值仅产生ç»å¯¹é‡å®šä½ã€‚" #: config/arm/arm.opt:170 #, fuzzy @@ -15018,7 +14988,7 @@ msgstr "使用 64 ä½ long 类型" #: config/mips/mips.opt:213 msgid "Pass the address of the ra save location to _mcount in $12" -msgstr "" +msgstr "å°†ä¿å˜ RA çš„ä½ç½®çš„地å€ä¼ 递给 $12 ä¸çš„ _mcount" #: config/mips/mips.opt:217 msgid "Don't optimize block moves" @@ -15058,7 +15028,7 @@ msgstr "指定是å¦åº”当使用 r10k 缓å˜å±éšœ" #: config/mips/mips.opt:253 msgid "Try to allow the linker to turn PIC calls into direct calls" -msgstr "" +msgstr "å…许链接器将 PIC 调用转化为直接调用" #: config/mips/mips.opt:257 msgid "When generating -mabicalls code, make the code suitable for use in shared libraries" @@ -15517,7 +15487,6 @@ msgid "Assume ICPLBs are enabled at runtime." msgstr "å‡å®šåœ¨è¿è¡Œæ—¶ ICPLB 是被å¯ç”¨çš„。" #: config/picochip/picochip.opt:23 -#, fuzzy msgid "Specify which type of AE to target. This option sets the mul-type and byte-access." msgstr "æŒ‡å®šåŽ»åˆ°ç›®æ ‡çš„ AE 类型。这个选项设置 mul-type å’Œå—节访问。" @@ -15526,9 +15495,8 @@ msgid "Specify which type of multiplication to use. Can be mem, mac or none." msgstr "指定使用的乘法类型。å¯ä»¥æ˜¯ memã€mac 或 none。" #: config/picochip/picochip.opt:31 -#, fuzzy msgid "Specify whether the byte access instructions should be used. Enabled by default." -msgstr "指定应该使用的å—节访问指令。按照默认被å¯ç”¨ã€‚" +msgstr "指定是å¦åº”该使用å—节访问指令。默认被å¯ç”¨ã€‚" #: config/picochip/picochip.opt:35 msgid "Enable debug output to be generated." @@ -15640,7 +15608,7 @@ msgstr "å¯ç”¨å‡å€¼æŒ‡ä»¤" #: config/mep/mep.opt:33 msgid "Variables this size and smaller go in the based section. (default 0)" -msgstr "" +msgstr "大å°ç‰äºŽæˆ–å°äºŽè®¾å®šå€¼(默认为 0)çš„å˜é‡æ”¾åœ¨åŸºæœ¬èŠ‚ä¸ã€‚" #: config/mep/mep.opt:37 msgid "Enable bit manipulation instructions" @@ -15648,7 +15616,7 @@ msgstr "å¯ç”¨ä½æ“作指令" #: config/mep/mep.opt:41 msgid "Section to put all const variables in (tiny, near, far) (no default)" -msgstr "" +msgstr "设置å˜æ”¾æ‰€æœ‰å¸¸å˜é‡çš„节(tinyã€near 或 far)(没有默认值)" #: config/mep/mep.opt:45 msgid "Enable clip instructions" @@ -15736,7 +15704,7 @@ msgstr "所有å˜é‡é»˜è®¤ä½äºŽ far 节ä¸" #: config/mep/mep.opt:150 msgid "Variables this size and smaller go in the tiny section. (default 4)" -msgstr "" +msgstr "大å°ç‰äºŽæˆ–å°äºŽè®¾å®šå€¼(默认 4)çš„å˜é‡æ”¾åœ¨ tiny 节ä¸ã€‚" #: config/vms/vms.opt:21 msgid "Malloc data into P2 space" @@ -15780,7 +15748,7 @@ msgstr "æ•°æ®è¢«å˜å‚¨ä¸ºå°ç«¯åœ¨å‰çš„æ ¼å¼ã€‚(默认)" #: config/rx/rx.opt:62 msgid "Maximum size of global and static variables which can be placed into the small data area." -msgstr "" +msgstr "能被放在å°å†…å˜åŒºçš„全局和é™æ€å˜é‡çš„最大尺寸。" #: config/rx/rx.opt:68 msgid "Use the simulator runtime." @@ -15788,7 +15756,7 @@ msgstr "使用仿真器è¿è¡Œæ—¶ã€‚" #: config/rx/rx.opt:74 msgid "Generate assembler output that is compatible with the Renesas AS100 assembler. This may restrict some of the compiler's capabilities. The default is to generate GAS compatable syntax." -msgstr "" +msgstr "生æˆä¸Ž Renesas AS100 兼容的汇编输出。这å¯èƒ½ä¼šé™åˆ¶ç¼–译器的æŸäº›åŠŸèƒ½ã€‚默认是使用与 GAS 兼容的è¯æ³•ã€‚" #: config/rx/rx.opt:80 msgid "Enable linker relaxation." @@ -15796,7 +15764,7 @@ msgstr "使用更çŸçš„地å€å¼•ç”¨ã€‚" #: config/rx/rx.opt:86 msgid "Maximum size in bytes of constant values allowed as operands." -msgstr "" +msgstr "用å—节表示的能被用作æ“作数的常é‡çš„最大尺寸。" #: config/rx/rx.opt:92 msgid "Specifies the number of registers to reserve for interrupt handlers." @@ -15804,7 +15772,7 @@ msgstr "指定ä¿ç•™ç»™ä¸æ–处ç†å‡½æ•°ä½¿ç”¨çš„寄å˜å™¨çš„æ•°é‡" #: config/rx/rx.opt:98 msgid "Specifies whether interrupt functions should save and restore the accumulator register." -msgstr "" +msgstr "指定ä¸æ–函数是å¦è¦ä¿å˜å’Œæ¢å¤ç´¯ç§¯å¯„å˜å™¨ã€‚" #: config/lm32/lm32.opt:24 msgid "Enable multiply instructions" @@ -16688,15 +16656,15 @@ msgstr "å¯ç”¨è¯¦ç»†è¾“出" #: lto/lang.opt:29 msgid "Run the link-time optimizer in local transformation (LTRANS) mode." -msgstr "" +msgstr "在局部转化(LTRANS)模å¼ä¸‹è¿è¡Œé“¾æŽ¥æ—¶ä¼˜åŒ–器。" #: lto/lang.opt:33 msgid "Specify a file to which a list of files output by LTRANS is written." -msgstr "" +msgstr "指定å˜æ”¾ LTRANS 输出的文件列表的文件。" #: lto/lang.opt:37 msgid "Run the link-time optimizer in whole program analysis (WPA) mode." -msgstr "" +msgstr "在全程åºåˆ†æž(WPA)模å¼ä¸‹è¿è¡Œé“¾æŽ¥æ—¶ä¼˜åŒ–器。" #: lto/lang.opt:41 msgid "The resolution file" @@ -17099,9 +17067,8 @@ msgid "Do not suppress C++ class debug information." msgstr "ä¿ç•™ C++ 类调试信æ¯ã€‚" #: common.opt:507 -#, fuzzy msgid "Generate debug information to support Identical Code Folding (ICF)" -msgstr "ç”Ÿæˆ XCOFF æ‰©å±•æ ¼å¼çš„调试信æ¯" +msgstr "生æˆå¿…è¦çš„调试信æ¯ä»¥æ”¯æŒç›¸åŒä»£ç 折å (ICF)" #: common.opt:511 msgid "Enable exception handling" @@ -17288,14 +17255,12 @@ msgid "Use IRA based register pressure calculation" msgstr "使用基于 IRA 的寄å˜å™¨åŽ‹åŠ›è®¡ç®—" #: common.opt:727 -#, fuzzy msgid "Share slots for saving different hard registers." msgstr "为ä¿å˜ä¸åŒçš„硬寄å˜å™¨çš„共享槽。" #: common.opt:731 -#, fuzzy msgid "Share stack slots for spilled pseudo-registers." -msgstr "对于溢出的伪寄å˜å™¨å…±äº«å †æ ˆæ§½ã€‚" +msgstr "为溢出的伪寄å˜å™¨å…±äº«å †æ ˆæ§½ã€‚" #: common.opt:735 msgid "-fira-verbose=<number> Control IRA's level of diagnostic messages." @@ -17330,9 +17295,8 @@ msgid "-flto-compression-level=<number> Use zlib compression level <number> for msgstr "-flto-compression-level=<N> 为 IL 使用 zlib 压缩级别<N>" #: common.opt:772 -#, fuzzy msgid "Report various link-time optimization statistics" -msgstr "进行寄å˜å™¨é‡å‘½å优化" +msgstr "报告å„ç§é“¾æŽ¥æ—¶ä¼˜åŒ–统计" #: common.opt:776 msgid "Set errno after built-in math functions" @@ -17492,18 +17456,16 @@ msgid "Enable common options for generating profile info for profile feedback di msgstr "å¯ç”¨ä¸€äº›å…¬å…±é€‰é¡¹æ¥ç”Ÿæˆæ ·æœ¬æ–‡ä»¶ï¼Œä»¥ä¾¿è¿›è¡ŒåŸºäºŽå–æ ·çš„ä¼˜åŒ–" #: common.opt:940 -#, fuzzy msgid "Enable common options for generating profile info for profile feedback directed optimizations, and set -fprofile-dir=" -msgstr "å¯ç”¨ä¸€äº›ç”Ÿæˆæ ·æœ¬ä¿¡æ¯çš„公共选项æ¥ç”Ÿæˆæ ·æœ¬å›žé¦ˆç›´æŽ¥ä¼˜åŒ–,并且设置-fprofile-dir=" +msgstr "å¯ç”¨ç”Ÿæˆå–æ ·ä¿¡æ¯çš„公共选项以支æŒåŸºäºŽå–æ ·å馈的优化,åŒæ—¶è®¾ç½® -fprofile-dir=" #: common.opt:944 msgid "Enable common options for performing profile feedback directed optimizations" msgstr "å¯ç”¨ä¸€äº›å…¬å…±é€‰é¡¹ä»¥è¿›è¡ŒåŸºäºŽå–æ ·çš„ä¼˜åŒ–" #: common.opt:948 -#, fuzzy msgid "Enable common options for performing profile feedback directed optimizations, and set -fprofile-dir=" -msgstr "å¯ç”¨å…¬å…±é€‰é¡¹ä»¥è¿›è¡Œå–æ ·å›žé¦ˆç›´æŽ¥çš„ä¼˜åŒ–ï¼Œå¹¶è®¾ç½® -fprofile-dir=" +msgstr "å¯ç”¨å…¬å…±é€‰é¡¹ä»¥è¿›è¡ŒåŸºäºŽå–æ ·å馈的优化,åŒæ—¶è®¾ç½® -fprofile-dir=" #: common.opt:952 msgid "Insert code to profile values of expressions" @@ -17650,22 +17612,20 @@ msgid "Enable the dependent count heuristic in the scheduler" msgstr "为调度器å¯ç”¨ä¾èµ–计数å¯å‘å¼å‘现" #: common.opt:1118 -#, fuzzy msgid "Access data in the same section from shared anchor points" msgstr "从共享的锚点访问在åŒæ ·çš„节ä¸çš„æ•°æ®" #: common.opt:1126 -#, fuzzy msgid "Show column numbers in diagnostics, when available. Default on" msgstr "诊æ–ä¿¡æ¯ä¸ç»™å‡ºè¡Œå·ã€‚默认打开" #: common.opt:1130 msgid "Disable optimizations observable by IEEE signaling NaNs" -msgstr "ç¦ç”¨ä¸º IEEE è®¯æ¯ NaN å¯è§çš„优化" +msgstr "ç¦ç”¨ä¸º IEEE NaN å¯è§çš„优化" #: common.opt:1134 msgid "Disable floating point optimizations that ignore the IEEE signedness of zero" -msgstr "ç¦ç”¨å¿½ç•¥ IEEE 零符å·çš„浮点优化" +msgstr "ç¦ç”¨å¿½ç•¥ IEEE ä¸é›¶çš„符å·çš„浮点优化" #: common.opt:1138 msgid "Convert floating point constants to single precision constants" @@ -17737,7 +17697,7 @@ msgstr "设定默认的线程局部å˜å‚¨ä»£ç 生æˆæ¨¡å¼" #: common.opt:1217 msgid "Reorder top level functions, variables, and asms" -msgstr "é‡æ–°æŽ’åºæ–‡ä»¶åŸŸçš„函数ã€å˜é‡å’Œæ±‡ç¼–" +msgstr "é‡æ–°æŽ’åºæ–‡ä»¶ä½œç”¨åŸŸçš„函数ã€å˜é‡å’Œæ±‡ç¼–" #: common.opt:1221 msgid "Perform superblock formation via tail duplication" @@ -17820,18 +17780,16 @@ msgid "Enable automatic parallelization of loops" msgstr "å¯ç”¨å¾ªçŽ¯çš„自动并行化" #: common.opt:1312 -#, fuzzy msgid "Enable hoisting loads from conditional pointers." -msgstr "å¯ç”¨æ¡ä»¶è½¬ç§»" +msgstr "为æ¡ä»¶æŒ‡é’ˆå¤–æ内å˜è¯»å–æ“作。" #: common.opt:1316 msgid "Enable SSA-PRE optimization on trees" msgstr "å¯ç”¨æ ‘上的 SSA-PRE 优化" #: common.opt:1320 -#, fuzzy msgid "Perform function-local points-to analysis on trees." -msgstr "进行进程间的指å‘分æž" +msgstr "åœ¨æ ‘ä¸Šè¿›è¡Œå‡½æ•°å†…çš„æŒ‡å‘分æžã€‚" #: common.opt:1324 msgid "Enable reassociation on tree level" @@ -17898,9 +17856,8 @@ msgid "Perform variable tracking" msgstr "进行å˜é‡è·Ÿè¸ª" #: common.opt:1403 -#, fuzzy msgid "Perform variable tracking by annotating assignments" -msgstr "进行å˜é‡è·Ÿè¸ª" +msgstr "评注赋值以进行å˜é‡è·Ÿè¸ª" #: common.opt:1407 msgid "Toggle -fvar-tracking-assignments" @@ -17996,11 +17953,11 @@ msgstr "生æˆæ‰©å±• STABS æ ¼å¼çš„调试信æ¯" #: common.opt:1506 msgid "Emit DWARF additions beyond selected version" -msgstr "" +msgstr "生æˆè¾ƒæ‰€é€‰ç‰ˆæœ¬æ›´å…ˆè¿›çš„ DWARF é™„åŠ ä¿¡æ¯" #: common.opt:1510 msgid "Don't emit DWARF additions beyond selected version" -msgstr "" +msgstr "ä¸ç”Ÿæˆè¾ƒæ‰€é€‰ç‰ˆæœ¬æ›´å…ˆè¿›çš„ DWARF é™„åŠ ä¿¡æ¯" #: common.opt:1514 msgid "Toggle debug information generation" @@ -18447,7 +18404,7 @@ msgstr "case æ ‡å·èŒƒå›´çš„上é™å€¼æ¯”该类型的最大值还è¦å¤§" #: c-common.c:2885 #, gcc-internal-format msgid "GCC cannot support operators with integer types and fixed-point types that have too many integral and fractional bits together" -msgstr "GCC ä¸æ”¯æŒæ•´æ•°ç±»åž‹å’Œæ•´æ•°åŠåˆ†æ•°ä½å¤ªå¤šçš„定点类型间的æ“作符" +msgstr "GCC ä¸æ”¯æŒæ•´æ•°ç±»åž‹å’Œæ•´æ•°åŠåˆ†æ•°ä½å¤ªå¤šçš„定点类型间的è¿ç®—符" #: c-common.c:3372 #, gcc-internal-format @@ -18780,9 +18737,9 @@ msgid "alias argument not a string" msgstr "alias çš„å‚æ•°ä¸æ˜¯ä¸€ä¸ªå—符串" #: c-common.c:6836 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "weakref attribute must appear before alias attribute" -msgstr "%Jweakref 属性必须出现在 alias 属性å‰" +msgstr "weakref 属性必须出现在 alias 属性å‰" #: c-common.c:6865 #, gcc-internal-format @@ -19000,7 +18957,7 @@ msgstr "试图å–ä½æ®µç»“æž„æˆå‘˜%qD的地å€" #: c-common.c:8435 #, gcc-internal-format msgid "index %E denotes an offset greater than size of %qT" -msgstr "" +msgstr "索引 %E 指定了一个大于%qT大å°çš„å移é‡" #: c-common.c:8472 #, gcc-internal-format @@ -20162,7 +20119,7 @@ msgstr "å½¢å‚ %u (%q+D)类型为 void" #: c-decl.c:6112 #, gcc-internal-format msgid "parameter %u has void type" -msgstr "å‚æ•° %u 类型为 void" +msgstr "第 %u 个å‚数类型为 void" #: c-decl.c:6182 #, gcc-internal-format @@ -20518,7 +20475,7 @@ msgstr "在%<for%>循环åˆå§‹å£°æ˜Žä¸å£°æ˜Žäº†éžå˜é‡%qD" #: c-decl.c:8416 #, gcc-internal-format msgid "incompatible address space qualifiers %qs and %qs" -msgstr "" +msgstr "ä¸å…¼å®¹çš„地å€ç©ºé—´é™å®šç¬¦%qså’Œ%qs" #: c-decl.c:8455 c-decl.c:8752 c-decl.c:9118 #, gcc-internal-format @@ -21000,7 +20957,7 @@ msgstr "程åºä¸æœ‰æ¸¸ç¦»çš„%<\\%o%>" #: c-lex.c:572 #, gcc-internal-format msgid "this decimal constant is unsigned only in ISO C90" -msgstr "这个å°æ•°å¸¸é‡ä»… ISO C90 ä¸æ˜¯æ— 符å·çš„" +msgstr "这个å进制数常é‡ä»… ISO C90 ä¸æ˜¯æ— 符å·çš„" #: c-lex.c:576 #, gcc-internal-format @@ -21532,7 +21489,7 @@ msgstr "å¤åˆå—é¢å€¼æœ‰å¯å˜çš„大å°" #: c-parser.c:5817 #, gcc-internal-format msgid "compound literal qualified by address-space qualifier" -msgstr "" +msgstr "组åˆå—é¢å¸¸é‡æœ‰åœ°å€ç©ºé—´é™å®š" #: c-parser.c:5822 #, gcc-internal-format @@ -21632,7 +21589,7 @@ msgstr "%qs对%qsè€Œè¨€æ— æ•ˆ" #: c-parser.c:7882 #, gcc-internal-format msgid "invalid operator for %<#pragma omp atomic%>" -msgstr "%<#pragma omp atomic%>æ“ä½œç¬¦æ— æ•ˆ" +msgstr "%<#pragma omp atomic%>è¿ç®—ç¬¦æ— æ•ˆ" #: c-parser.c:7941 c-parser.c:7962 #, gcc-internal-format @@ -22020,9 +21977,9 @@ msgid "junk at end of %<#pragma %s%>" msgstr "%<#pragma %s%>末尾有垃圾" #: c-pragma.c:1106 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%<#pragma STDC FLOAT_CONST_DECIMAL64%> is not supported for C++" -msgstr "%<#pragma STDC FLOAT_CONST_DECIMAL64%> 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" +msgstr "%<#pragma STDC FLOAT_CONST_DECIMAL64%> ä¸ä¸º C++ 所支æŒ" #: c-pragma.c:1115 #, gcc-internal-format @@ -22476,17 +22433,17 @@ msgstr "类型转æ¢çš„æºç±»åž‹æœªå‡ºçŽ°åœ¨è”åˆä¸" #: c-typeck.c:4457 #, gcc-internal-format msgid "cast to %s address space pointer from disjoint generic address space pointer" -msgstr "" +msgstr "å°†ä¸é‡å 的普通地å€ç©ºé—´æŒ‡é’ˆè½¬æ¢ä¸º %s 地å€ç©ºé—´æŒ‡é’ˆ" #: c-typeck.c:4462 #, gcc-internal-format msgid "cast to generic address space pointer from disjoint %s address space pointer" -msgstr "" +msgstr "å°†ä¸é‡å çš„ %s 地å€ç©ºé—´æŒ‡é’ˆè½¬æ¢ä¸ºæ™®é€šåœ°å€ç©ºé—´æŒ‡é’ˆ" #: c-typeck.c:4467 #, fuzzy, gcc-internal-format msgid "cast to %s address space pointer from disjoint %s address space pointer" -msgstr "为指针赋值给未被包围的地å€ç©ºé—´" +msgstr "å°†ä¸é‡å 的普通地å€ç©ºé—´æŒ‡é’ˆè½¬æ¢ä¸º %s 地å€ç©ºé—´æŒ‡é’ˆ" #: c-typeck.c:4487 #, gcc-internal-format @@ -22539,7 +22496,7 @@ msgstr "需è¦ç±»åž‹%qT,但实å‚的类型为%qT" #: c-typeck.c:4907 #, gcc-internal-format msgid "enum conversion when passing argument %d of %qE is invalid in C++" -msgstr "C++ ç¦æ¢åœ¨ä¼ 递%2$qEçš„å‚æ•° %1$d 时进行枚举转æ¢" +msgstr "C++ ç¦æ¢åœ¨ä¼ 递%2$qE的第 %1$d 个å‚数时进行枚举转æ¢" #: c-typeck.c:4913 #, gcc-internal-format @@ -22604,12 +22561,12 @@ msgstr "C++ ä¸ä¸å…许从%qT到%qTçš„éšå¼è½¬æ¢" #: c-typeck.c:5148 #, gcc-internal-format msgid "passing argument %d of %qE from pointer to non-enclosed address space" -msgstr "ä¼ é€’%2$qEçš„å‚æ•° %1$d 时从指针转æ¢ä¸ºæœªè¢«åŒ…围的地å€ç©ºé—´" +msgstr "ä¼ é€’%2$qE的第 %1$d 个å‚数时从指针转æ¢ä¸ºæœªè¢«åŒ…围的地å€ç©ºé—´" #: c-typeck.c:5152 #, gcc-internal-format msgid "assignment from pointer to non-enclosed address space" -msgstr "为指针赋值给未被包围的地å€ç©ºé—´" +msgstr "将指针赋值给未被包围的地å€ç©ºé—´" #: c-typeck.c:5156 #, gcc-internal-format @@ -22617,9 +22574,9 @@ msgid "initialization from pointer to non-enclosed address space" msgstr "从指针å‘未被包围的地å€ç©ºé—´åˆå§‹åŒ–" #: c-typeck.c:5160 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "return from pointer to non-enclosed address space" -msgstr "为指针赋值给未被包围的地å€ç©ºé—´" +msgstr "返回时将指针赋值给未被包围的地å€ç©ºé—´" #: c-typeck.c:5178 #, gcc-internal-format @@ -22664,7 +22621,7 @@ msgstr "ISO C ä¸å…许在函数指针和%<void *%>间返回" #: c-typeck.c:5257 #, gcc-internal-format msgid "pointer targets in passing argument %d of %qE differ in signedness" -msgstr "ä¼ é€’%2$qEçš„å‚æ•° %1$d ç»™æŒ‡é’ˆæ—¶ï¼Œç›®æ ‡ä¸ŽæŒ‡é’ˆç¬¦å·ä¸ä¸€è‡´" +msgstr "ä¼ é€’%2$qE的第 %1$d 个å‚æ•°ç»™æŒ‡é’ˆæ—¶ï¼Œç›®æ ‡ä¸ŽæŒ‡é’ˆç¬¦å·ä¸ä¸€è‡´" #: c-typeck.c:5259 #, gcc-internal-format @@ -23267,9 +23224,9 @@ msgid "%d exits recorded for loop %d (having %d exits)" msgstr "%1$d 为循环 %2$d 记录的退出(有 %3$d 的退出)" #: cfgrtl.c:1817 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "BB_RTL flag not set for block %d" -msgstr "å¯¹äºŽå— %d BB_RTL æ ‡å¿—ä¸è®¾ç½®" +msgstr "å— %d 没有设置 BB_RTL æ ‡å¿—" #: cfgrtl.c:1824 #, fuzzy, gcc-internal-format @@ -23307,9 +23264,9 @@ msgid "too many eh edges %i" msgstr "eh 边缘 %i 太多" #: cfgrtl.c:1917 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "too many outgoing branch edges from bb %i" -msgstr "从 bb %i 分出太多的分支边" +msgstr "ä»ŽåŸºæœ¬å— %i 分出太多的分支边" #: cfgrtl.c:1922 #, gcc-internal-format @@ -23494,22 +23451,22 @@ msgstr "节点有错误的 clone_of" #: cgraphunit.c:698 #, gcc-internal-format msgid "node has wrong clone list" -msgstr "" +msgstr "节点的克隆列表ä¸æ£ç¡®" #: cgraphunit.c:704 #, gcc-internal-format msgid "node is in clone list but it is not clone" -msgstr "" +msgstr "节点在克隆列表ä¸ï¼Œä½†å¹¶ä¸æ˜¯å…‹éš†" #: cgraphunit.c:709 #, gcc-internal-format msgid "node has wrong prev_clone pointer" -msgstr "" +msgstr "节点的 prev_clone 指针错误" #: cgraphunit.c:714 #, gcc-internal-format msgid "double linked list of clones corrupted" -msgstr "" +msgstr "åŒå‘克隆链接列表已æŸå" #: cgraphunit.c:744 #, gcc-internal-format @@ -23557,9 +23514,9 @@ msgid "nodes with unreleased memory found" msgstr "找到未释放内å˜çš„节点" #: collect2.c:1505 opts.c:1137 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "LTO support has not been enabled in this configuration" -msgstr "在当å‰é…置下 -m64 ä¸è¢«æ”¯æŒ" +msgstr "LTO 支æŒåœ¨æ¤é…置下未被å¯ç”¨" #: collect2.c:1598 #, gcc-internal-format @@ -23737,9 +23694,9 @@ msgid "Multiple EH personalities are supported only with assemblers supporting . msgstr "" #: dwarf2out.c:5392 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "DW_LOC_OP %s not implemented" -msgstr "DW_LOC_OP %s 尚未实作" +msgstr "DW_LOC_OP %s 尚未实现" #: emit-rtl.c:2460 #, gcc-internal-format @@ -23787,9 +23744,9 @@ msgid "region_array is corrupted for region %i" msgstr "区域 %i çš„ region_array è¢«ç ´å" #: except.c:3347 except.c:3378 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "lp_array is corrupted for lp %i" -msgstr "区域 %i çš„ region_array è¢«ç ´å" +msgstr "lp %i çš„ lp_array è¢«ç ´å" #: except.c:3364 #, gcc-internal-format @@ -23802,7 +23759,7 @@ msgid "negative nesting depth of region %i" msgstr "区域 %i 的负嵌套深度" #: except.c:3383 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "region of lp %i is wrong" msgstr "区域 %i çš„ lp 错误" @@ -23814,12 +23771,12 @@ msgstr "æ ‘åˆ—è¡¨ç»“æŸäºŽæ·±åº¦ %i" #: except.c:3415 #, gcc-internal-format msgid "region_array does not match region_tree" -msgstr "" +msgstr "region_array ä¸åŒ¹é… region_tree" #: except.c:3420 #, gcc-internal-format msgid "lp_array does not match region_tree" -msgstr "" +msgstr "lp_array ä¸åŒ¹é… region_tree" #: except.c:3427 #, gcc-internal-format @@ -23850,14 +23807,14 @@ msgid "the frame size of %wd bytes is larger than %wd bytes" msgstr "å †æ ˆæ¡†æž¶æœ‰ %wd å—节,超过了 %wd å—节" #: final.c:4367 toplev.c:1921 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "could not open final insn dump file %qs: %s" -msgstr "æ— æ³•æ‰“å¼€è½¬å‚¨æ–‡ä»¶%qs:%s" +msgstr "æ— æ³•æ‰“å¼€æœ€ç»ˆæŒ‡ä»¤è½¬å‚¨æ–‡ä»¶%qs:%s" #: final.c:4423 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "could not close final insn dump file %qs: %s" -msgstr "æ— æ³•æ‰“å¼€è½¬å‚¨æ–‡ä»¶%qs:%s" +msgstr "æ— æ³•å…³é—最终指令转储文件%qs:%s" #: fixed-value.c:104 #, gcc-internal-format @@ -23905,7 +23862,7 @@ msgid "assuming signed overflow does not occur when combining constants around a msgstr "在比较周围组åˆå˜é‡æ—¶å‡å®šæœ‰ç¬¦å·æ•°ä»Žä¸æº¢å‡º" #: fold-const.c:14213 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "fold check: original tree changed by fold" msgstr "折å 检查: åŽŸå§‹æ ‘å› æŠ˜å è€Œæ”¹å˜ " @@ -24003,9 +23960,9 @@ msgid "%s: -fcompare-debug failure (length)" msgstr "%s:-fcompare-debug 失败(长度)" #: gcc.c:6694 gcc.c:6735 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%s: could not open compare-debug file %s" -msgstr "æ— æ³•æ‰“å¼€ä¸´æ—¶å“应文件 %s" +msgstr "%sï¼šæ— æ³•æ‰“å¼€æ¯”è¾ƒè°ƒè¯•æ–‡ä»¶ %s" #: gcc.c:6714 gcc.c:6751 #, gcc-internal-format @@ -24141,9 +24098,9 @@ msgid "memory input %d is not directly addressable" msgstr "内å˜è¾“å…¥ %d ä¸å¯ç›´æŽ¥å¯»å€" #: gimplify.c:5391 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE not specified in enclosing parallel" -msgstr "%qs 未为在括入的并行指定" +msgstr "%qE未为在括入的并行ä¸æŒ‡å®š" #: gimplify.c:5393 #, gcc-internal-format @@ -24198,27 +24155,27 @@ msgstr "%s ä¸èƒ½åœ¨è¿™é‡Œç”¨äºŽ asm" #: lto-cgraph.c:571 #, gcc-internal-format msgid "bytecode stream: found multiple instances of cgraph node %d" -msgstr "" +msgstr "å—节ç æµï¼šæ‰¾åˆ° cgraph 节点 %d 的多个实例" #: lto-cgraph.c:634 #, gcc-internal-format msgid "bytecode stream: no caller found while reading edge" -msgstr "" +msgstr "å—节ç æµï¼šè¯»å–边时找ä¸åˆ°è°ƒç”¨è€…" #: lto-cgraph.c:638 #, gcc-internal-format msgid "bytecode stream: no callee found while reading edge" -msgstr "" +msgstr "å—节ç æµï¼šè¯»å–边时找ä¸åˆ°è¢«è°ƒç”¨è€…" #: lto-cgraph.c:687 #, gcc-internal-format msgid "bytecode stream: found empty cgraph node" -msgstr "" +msgstr "å—节ç æµï¼šæ‰¾åˆ°ç©ºçš„ cgraph 节点" #: lto-cgraph.c:745 #, gcc-internal-format msgid "Combining units with different profiles is not supported." -msgstr "" +msgstr "ä¸æ”¯æŒç»„åˆæœ‰ä¸åŒå–æ ·ä¿¡æ¯çš„å•å…ƒã€‚" #: lto-compress.c:190 lto-compress.c:198 lto-compress.c:219 lto-compress.c:280 #: lto-compress.c:288 lto-compress.c:309 @@ -24229,22 +24186,22 @@ msgstr "压缩的æµï¼š%s" #: lto-section-in.c:66 #, gcc-internal-format msgid "bytecode stream: trying to read %d bytes after the end of the input buffer" -msgstr "" +msgstr "å—节ç æµï¼šè¯•å›¾åœ¨è¾“入缓冲区结æŸå¤„è¯»å– %d å—节" #: lto-streamer-in.c:81 #, gcc-internal-format msgid "bytecode stream: unexpected tag %s" -msgstr "" +msgstr "å—节ç æµï¼šéžé¢„æœŸçš„æ ‡è®° %s" #: lto-streamer-in.c:92 #, gcc-internal-format msgid "bytecode stream: tag %s is not in the expected range [%s, %s]" -msgstr "" +msgstr "å—节ç æµï¼šæ ‡è®° %s ä¸åœ¨é¢„期的范围[%s,%s]内" #: lto-streamer-in.c:106 #, gcc-internal-format msgid "bytecode stream: expected tag %s instead of %s" -msgstr "" +msgstr "å—节ç æµï¼šéœ€è¦æ ‡è®° %s è€Œéž %s" #: lto-streamer-in.c:150 #, gcc-internal-format @@ -24254,12 +24211,12 @@ msgstr "å—节ç æµï¼šå—符串对å—符串表而言太长" #: lto-streamer-in.c:210 #, gcc-internal-format msgid "bytecode stream: found non-null terminated string" -msgstr "" +msgstr "å—节ç æµï¼šæ‰¾åˆ°éž NULL 结尾的å—符串" #: lto-streamer-in.c:1112 #, gcc-internal-format msgid "bytecode stream: unknown GIMPLE statement tag %s" -msgstr "" +msgstr "å—节ç æµï¼šæœªçŸ¥çš„ GIMPLE è¯å¥æ ‡è®° %s" #: lto-streamer-in.c:2387 #, gcc-internal-format @@ -24274,7 +24231,7 @@ msgstr "尚未支æŒç›®æ ‡ä¼˜åŒ–选项" #: lto-streamer-in.c:2535 #, gcc-internal-format msgid "bytecode stream: tried to jump backwards in the stream" -msgstr "" +msgstr "å—节ç æµï¼šè¯•å›¾åœ¨æµä¸åå‘跳转" #: lto-streamer-in.c:2579 #, gcc-internal-format @@ -24299,17 +24256,17 @@ msgstr "32 ä½ç³»ç»Ÿä¸æ”¯æŒ -mcmodel=" #: lto-streamer-out.c:1238 #, gcc-internal-format msgid "gimple bytecode streams do not support machine specific builtin functions on this target" -msgstr "" +msgstr "GIMPLE å—节ç æµåœ¨æ¤ç›®æ ‡æœºä¸Šä¸æ”¯æŒæœºå™¨ç›¸å…³çš„内建函数" #: lto-streamer.c:176 #, gcc-internal-format msgid "bytecode stream: unexpected LTO section %s" -msgstr "" +msgstr "å—节ç æµï¼šéžé¢„期的 LTO 节 %s" #: lto-streamer.c:859 #, gcc-internal-format msgid "bytecode stream generated with LTO version %d.%d instead of the expected %d.%d" -msgstr "" +msgstr "å—节ç æµæ˜¯ç”± LTO 版本 %d.%d 生æˆï¼Œè€Œéžé¢„期的 %d.%d" #: lto-symtab.c:432 #, gcc-internal-format @@ -24322,14 +24279,14 @@ msgid "previously defined here" msgstr "以å‰åœ¨æ¤å®šä¹‰è¿‡" #: lto-symtab.c:504 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "type of %qD does not match original declaration" -msgstr "%2$q+D的模æ¿æ ‡è¯†ç¬¦%1$qDä¸åŒ¹é…任何模æ¿å£°æ˜Ž" +msgstr "类型%qDä¸åŒ¹é…原先的声明" #: lto-symtab.c:511 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "alignment of %qD is bigger than original declaration" -msgstr "赋值(ä¸æ˜¯åˆå§‹åŒ–)出现在声明ä¸" +msgstr "%qD的对é½" #: lto-symtab.c:517 lto-symtab.c:614 #, gcc-internal-format @@ -24347,34 +24304,34 @@ msgid "function %qD redeclared as variable" msgstr "函数%qDé‡å£°æ˜Žä¸ºå˜é‡" #: omp-low.c:1837 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "barrier region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region" -msgstr "æ¡åŒºåŸŸåœ¨å·¥ä½œå…±äº«ã€ä¸´ç•Œã€æŽ’次åºã€ä¸»è¦çš„或显å¼çš„任务区域内部ä¸å¯ä»¥ç´§å¯†åµŒå¥—" +msgstr "å±éšœåŒºåŸŸä¸å¯ä»¥ç´§å¯†åµŒå¥—在工作共享ã€ä¸´ç•Œã€æœ‰åºã€ä¸»è¦çš„或显å¼çš„任务区域内" #: omp-low.c:1842 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region" -msgstr "工作共享区域在工作共享ã€ä¸´ç•Œã€æŽ’次åºã€ä¸»è¦çš„或显å¼çš„任务区域内部ä¸å¯ä»¥ç´§å¯†åµŒå¥—" +msgstr "工作共享区域ä¸å¯ä»¥ç´§å¯†åµŒå¥—在工作共享ã€ä¸´ç•Œã€æœ‰åºã€ä¸»è¦çš„或显å¼çš„任务区域内" #: omp-low.c:1860 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "master region may not be closely nested inside of work-sharing or explicit task region" -msgstr "主è¦åŒºåŸŸ ä¸å¯ä»¥åœ¨å·¥ä½œå…±äº«æˆ–显å¼çš„任务区域内部紧密嵌套" +msgstr "主è¦åŒºåŸŸä¸å¯ä»¥ç´§å¯†åµŒå¥—在工作共享或显å¼çš„任务区域内" #: omp-low.c:1875 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ordered region may not be closely nested inside of critical or explicit task region" -msgstr "排åºçš„区域ä¸å¯ä»¥ç´§å¯†åµŒå¥—在临界或显å¼çš„任务区域内部" +msgstr "有åºåŒºåŸŸä¸å¯ä»¥ç´§å¯†åµŒå¥—在临界或显å¼çš„任务区域内" #: omp-low.c:1881 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ordered region must be closely nested inside a loop region with an ordered clause" -msgstr "有次åºåŒºåŸŸå¿…须是具有一个有次åºåˆ†å¥çš„循环内部密切嵌套的区域" +msgstr "有åºåŒºåŸŸå¿…须紧密嵌套在一个有次åºåˆ†å¥çš„循环内" #: omp-low.c:1896 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "critical region may not be nested inside a critical region with the same name" -msgstr "一个具有相åŒåå—临界区域的内部临界的区域ä¸å¯ä»¥è¢«åµŒå¥—" +msgstr "临界区域ä¸å¯ä»¥è¢«åµŒå¥—在åŒå的临界区域内" #: omp-low.c:6750 cp/decl.c:2709 cp/parser.c:8399 cp/parser.c:8419 #, gcc-internal-format @@ -24388,9 +24345,9 @@ msgstr "OpenMP 结构å—å…¥å£æ— 效" #. Otherwise, be vague and lazy, but efficient. #: omp-low.c:6760 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid branch to/from an OpenMP structured block" -msgstr "进出 OpenMP 结构å—çš„éžæ³•åˆ†æ”¯" +msgstr "进出 OpenMP 结构å—çš„åˆ†æ”¯æ— æ•ˆ" #: opts.c:171 #, gcc-internal-format @@ -24434,19 +24391,19 @@ msgid "argument to \"%s\" should be a non-negative integer" msgstr "“%sâ€çš„实å‚应该是一个éžè´Ÿæ•´æ•°" #: opts.c:1000 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "Section anchors must be disabled when unit-at-a-time is disabled." -msgstr "当 unit-at-a-time 被ç¦æ¢æ—¶èŠ‚锚必须被ç¦æ¢ã€‚" +msgstr "当 unit-at-a-time 被ç¦ç”¨æ—¶èŠ‚ä¸é”šç‚¹ä¹Ÿå¿…须被ç¦ç”¨ã€‚" #: opts.c:1004 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "Toplevel reorder must be disabled when unit-at-a-time is disabled." -msgstr "当unit-at-a-time 被ç¦æ¢æ—¶é¡¶å±‚é‡æ–°æŽ’åºå¿…é¡»ç¦æ¢ã€‚" +msgstr "unit-at-a-time 被ç¦ç”¨æ—¶æ–‡ä»¶ä½œç”¨åŸŸé‡æŽ’åºä¹Ÿå¿…须被ç¦ç”¨" #: opts.c:1019 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "section anchors must be disabled when toplevel reorder is disabled" -msgstr "当顶层é‡æ–°æŽ’åºè¢«ç¦æ¢æ—¶èŠ‚下锚必须ç¦æ¢" +msgstr "当文件作用域é‡æŽ’åºè¢«ç¦ç”¨æ—¶ä¹Ÿå¿…é¡»ç¦ç”¨èŠ‚ä¸é”šç‚¹" #: opts.c:1054 config/darwin.c:1705 config/sh/sh.c:903 #, gcc-internal-format @@ -24491,7 +24448,7 @@ msgstr "结构的对é½å¿…须是 2 的较å°æ¬¡æ–¹ï¼Œè€Œä¸æ˜¯ %d" #: opts.c:1826 opts.c:1834 #, gcc-internal-format msgid "Plugin support is disabled. Configure with --enable-plugin." -msgstr "" +msgstr "æ’件支æŒè¢«ç¦ç”¨ã€‚é…置时需带 -enable-plugin。" #: opts.c:1913 #, gcc-internal-format @@ -24611,31 +24568,34 @@ msgid "" "%s\n" "%s" msgstr "" +"æ’件 %s 指定了ä¸åŒçš„路径:\n" +"%s\n" +"%s" #: plugin.c:199 #, gcc-internal-format msgid "Malformed option -fplugin-arg-%s (multiple '=' signs)" -msgstr "" +msgstr "-fplugin-arg-%s é€‰é¡¹æ ¼å¼ä¸å¯¹(多个‘=’)" #: plugin.c:215 #, gcc-internal-format msgid "Malformed option -fplugin-arg-%s (missing -<key>[=<value>])" -msgstr "" +msgstr "-fplugin-arg-%s é€‰é¡¹æ ¼å¼ä¸å¯¹(缺少 -<é”®>[=<值>])" #: plugin.c:277 #, gcc-internal-format msgid "Plugin %s should be specified before -fplugin-arg-%s in the command line" -msgstr "" +msgstr "在命令行ä¸ï¼Œæ’件 %s 需è¦å‡ºçŽ°åœ¨ -fplugin-arg-%s 之å‰" #: plugin.c:397 #, gcc-internal-format msgid "Unknown callback event registered by plugin %s" -msgstr "" +msgstr "æ’件 %s 注册了未知的回调事件" #: plugin.c:425 #, gcc-internal-format msgid "Plugin %s registered a null callback function for event %s" -msgstr "" +msgstr "æ’件 %s 为事件 %s 注册了一个空的回调函数" #: plugin.c:550 #, gcc-internal-format @@ -24652,6 +24612,8 @@ msgid "" "plugin %s is not licensed under a GPL-compatible license\n" "%s" msgstr "" +"æ’件 %s 带有与 GPL ä¸å…¼å®¹çš„许å¯\n" +"%s" #: plugin.c:568 #, gcc-internal-format @@ -25215,9 +25177,9 @@ msgid "-f%sleading-underscore not supported on this target machine" msgstr "-f%sleading-underscore 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" #: toplev.c:1927 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "could not close zeroed insn dump file %qs: %s" -msgstr "æ— æ³•æ‰“å¼€è½¬å‚¨æ–‡ä»¶%qs:%s" +msgstr "æ— æ³•æ‰“å¼€ç”¨é›¶å¡«å……çš„æŒ‡ä»¤è½¬å‚¨æ–‡ä»¶%qs:%s" #: toplev.c:1992 #, gcc-internal-format @@ -25310,9 +25272,9 @@ msgid "SSA name in freelist but still referenced" msgstr "SSA å在 freelist ä¸ï¼Œå´ä»ç„¶è¢«æ领" #: tree-cfg.c:2544 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "Indirect reference's operand is not a register or a constant." -msgstr "i间接引用的æ“作数ä¸æ˜¯å¯„å˜å™¨æˆ–一个常é‡ã€‚" +msgstr "间接引用的æ“作数ä¸æ˜¯å¯„å˜å™¨æˆ–常é‡ã€‚" #: tree-cfg.c:2553 #, fuzzy, gcc-internal-format @@ -25335,9 +25297,9 @@ msgid "side effects not recomputed when ADDR_EXPR changed" msgstr "ADDR_EXPR å˜åŒ–时副作用未被é‡æ–°è®¡ç®—" #: tree-cfg.c:2603 tree-ssa.c:822 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "address taken, but ADDRESSABLE bit not set" -msgstr "å–地å€ï¼Œä½†æ˜¯ ADDRESSABLE ä½ä¸è®¾ç½®" +msgstr "å·²å–地å€ï¼Œä½†æ˜¯ ADDRESSABLE ä½æœªè¢«è®¾ç½®" #: tree-cfg.c:2608 #, gcc-internal-format @@ -25435,24 +25397,24 @@ msgid "Conversion of an SSA_NAME on the left hand side." msgstr "" #: tree-cfg.c:2961 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "non-function in gimple call" -msgstr "在 gimple 调用ä¸çš„éžå‡½æ•°" +msgstr "gimple 调用了éžå‡½æ•°" #: tree-cfg.c:2969 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid LHS in gimple call" -msgstr "在 gimple 调用ä¸çš„éžæ³• LHS" +msgstr "gimple 调用ä¸å·¦æ“ä½œæ•°æ— æ•ˆ" #: tree-cfg.c:2985 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid conversion in gimple call" -msgstr "在 gimple 调用ä¸çš„éžæ³•è½¬æ¢" +msgstr "gimple 调用ä¸è½¬æ¢æ— 效" #: tree-cfg.c:2998 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "static chain in indirect gimple call" -msgstr "æ— æ•ˆçš„ç‰ˆæœ¬å·â€˜%s’" +msgstr "间接 gimple 调用ä¸æœ‰é™æ€è°ƒç”¨é“¾" #: tree-cfg.c:3005 #, gcc-internal-format @@ -25460,9 +25422,9 @@ msgid "static chain with function that doesn't use one" msgstr "" #: tree-cfg.c:3029 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid operands in gimple comparison" -msgstr "在 gimple 比较ä¸çš„éžæ³•æ“作数" +msgstr "gimple 比较ä¸æ“ä½œæ•°æ— æ•ˆ" #: tree-cfg.c:3047 #, gcc-internal-format @@ -25485,9 +25447,9 @@ msgid "invalid types in nop conversion" msgstr "空转æ¢ä¸ç±»åž‹æ— 效" #: tree-cfg.c:3129 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid types in address space conversion" -msgstr "整点转æ¢ä¸ç±»åž‹æ— 效" +msgstr "地å€ç©ºé—´è½¬æ¢ä¸ç±»åž‹æ— 效" #: tree-cfg.c:3143 #, gcc-internal-format @@ -25540,9 +25502,9 @@ msgid "non-element sized vector shift of floating point vector" msgstr "" #: tree-cfg.c:3335 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid non-vector operands to vector valued plus" -msgstr "+/-(指针)æ“ä½œæ•°æ— æ•ˆ" +msgstr "矢é‡å€¼çš„åŠ æ³•ä¸æœ‰æ— 效的éžçŸ¢é‡æ“作数" #: tree-cfg.c:3359 #, gcc-internal-format @@ -25580,9 +25542,9 @@ msgid "type mismatch in address expression" msgstr "地å€è¡¨è¾¾å¼ç±»åž‹ä¸åŒ¹é…" #: tree-cfg.c:3539 tree-cfg.c:3565 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid rhs for gimple memory store" -msgstr "gimple 内å˜å˜å‚¨çš„éžæ³• rhs" +msgstr "gimple 内å˜å˜å‚¨ä¸å³æ“ä½œæ•°æ— æ•ˆ" #: tree-cfg.c:3629 #, gcc-internal-format @@ -25615,9 +25577,9 @@ msgid "Invalid PHI argument" msgstr "æ— æ•ˆçš„ PHI 实å‚" #: tree-cfg.c:3718 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "Incompatible types in PHI argument %u" -msgstr "æŒ‡é’ˆç›®æ ‡ç±»åž‹åœ¨ C++ ä¸ä¸å…¼å®¹" +msgstr "PHI å®žå‚ %u 类型ä¸å…¼å®¹" #: tree-cfg.c:3858 #, gcc-internal-format @@ -25700,14 +25662,14 @@ msgid "verify_stmts failed" msgstr "verify_stmts 失败" #: tree-cfg.c:4196 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ENTRY_BLOCK has IL associated with it" msgstr "ENTRY_BLOCK 有与之关è”çš„ IL" #: tree-cfg.c:4202 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "EXIT_BLOCK has IL associated with it" -msgstr "EXIT_BLOCK 有与之相关的 IL" +msgstr "EXIT_BLOCK 有与之关è”çš„ IL" #: tree-cfg.c:4209 #, fuzzy, gcc-internal-format @@ -25790,14 +25752,14 @@ msgid "function might be possible candidate for attribute %<noreturn%>" msgstr "函数å¯èƒ½æ˜¯%qsformat 属性的备选" #: tree-cfg.c:7312 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ignoring return value of %qD, declared with attribute warn_unused_result" -msgstr "%H忽略声明有 warn_unused_result 属性的%qD的返回值" +msgstr "忽略声明有 warn_unused_result 属性的%qD的返回值" #: tree-cfg.c:7317 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ignoring return value of function declared with attribute warn_unused_result" -msgstr "%H忽略声明有 warn_unused_result 属性的函数的返回值" +msgstr "忽略声明有 warn_unused_result 属性的函数的返回值" #: tree-dump.c:930 #, gcc-internal-format @@ -25817,12 +25779,12 @@ msgstr "åŸºæœ¬å— %i 有多个 EH è¾¹" #: tree-eh.c:3889 #, gcc-internal-format msgid "BB %i can not throw but has an EH edge" -msgstr "" +msgstr "åŸºæœ¬å— %i ä¸èƒ½æŠ›å‡ºå¼‚常但å´æœ‰ EH è¾¹" #: tree-eh.c:3897 #, gcc-internal-format msgid "BB %i last statement has incorrectly set lp" -msgstr "åŸºæœ¬å— %i 最åŽä¸€æ¡è¯å¥è®¾ç½®äº†ä¸æ£ç¡®çš„ IP" +msgstr "åŸºæœ¬å— %i 最åŽä¸€æ¡è¯å¥è®¾ç½®äº†ä¸æ£ç¡®çš„ lp" #: tree-eh.c:3903 #, gcc-internal-format @@ -25840,19 +25802,19 @@ msgid "BB %i is missing an edge" msgstr "åŸºæœ¬å— %i 缺少一æ¡è¾¹" #: tree-eh.c:3979 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "BB %i too many fallthru edges" -msgstr "从 bb %i 分出太多的分支边" +msgstr "åŸºæœ¬å— %i 下è½è¾¹å¤ªå¤š" #: tree-eh.c:3988 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "BB %i has incorrect edge" -msgstr "åŸºæœ¬å— %i 缺少一æ¡è¾¹" +msgstr "åŸºæœ¬å— %i 有ä¸æ£ç¡®çš„è¾¹" #: tree-eh.c:3994 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "BB %i has incorrect fallthru edge" -msgstr "fallthru 边缘交å‰èŠ‚分界线(bb %i)" +msgstr "åŸºæœ¬å— %i 有ä¸æ£ç¡®çš„下è½è¾¹" #: tree-inline.c:2773 #, gcc-internal-format @@ -26016,7 +25978,7 @@ msgid "missing definition" msgstr "定义缺失" #: tree-ssa.c:709 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "definition in block %i does not dominate use in block %i" msgstr "å— %i ä¸çš„定义ä¸æ”¯é…å— %i ä¸çš„使用" @@ -26083,12 +26045,12 @@ msgstr "" #: tree-ssa.c:975 #, gcc-internal-format msgid "statement has VDEF but no VUSE operand" -msgstr "" +msgstr "è¯å¥æœ‰ VDEF 而没有 VUSE æ“作数" #: tree-ssa.c:981 #, gcc-internal-format msgid "VDEF and VUSE do not use the same symbol" -msgstr "" +msgstr "VDEF å’Œ VUSE 没有使用相åŒçš„符å·" #: tree-ssa.c:990 #, gcc-internal-format @@ -26116,19 +26078,19 @@ msgid "%qD may be used uninitialized in this function" msgstr "æ¤å‡½æ•°ä¸çš„%qD在使用å‰å¯èƒ½æœªåˆå§‹åŒ–" #: tree-vrp.c:5015 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "array subscript is outside array bounds" -msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" +msgstr "æ•°ç»„ä¸‹æ ‡è¶Šè¿‡äº†æ•°ç»„è¾¹ç•Œ" #: tree-vrp.c:5030 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "array subscript is above array bounds" -msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" +msgstr "æ•°ç»„ä¸‹æ ‡å¤§äºŽæ•°ç»„è¾¹ç•Œ" #: tree-vrp.c:5037 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "array subscript is below array bounds" -msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" +msgstr "æ•°ç»„ä¸‹æ ‡å°äºŽæ•°ç»„边界" #: tree-vrp.c:5706 #, gcc-internal-format @@ -26151,14 +26113,14 @@ msgid "comparison always true due to limited range of data type" msgstr "由于数æ®ç±»åž‹èŒƒå›´é™åˆ¶ï¼Œæ¯”较结果永远为真" #: tree-vrp.c:6598 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "assuming signed overflow does not occur when simplifying %</%> or %<%%%> to %<>>%> or %<&%>" -msgstr "å°† && 或 || 简化为 & 或 | æ—¶å‡å®šæœ‰ç¬¦å·æ•°ä»Žä¸æº¢å‡º" +msgstr "å°†%</%>或%<%%%>简化为%<>>%>或%<&%>æ—¶å‡å®šæœ‰ç¬¦å·æ•°ä»Žä¸æº¢å‡º" #: tree-vrp.c:6680 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "assuming signed overflow does not occur when simplifying %<abs (X)%> to %<X%> or %<-X%>" -msgstr "å°† ==ã€!= 或 ! 简化为或åŒä¸€æ“作或 ^ æ—¶å‡å®šæœ‰ç¬¦å·æ•°ä»Žä¸æº¢å‡º" +msgstr "å°†%<abs (X)%>简化为%<X%>或%<-X%>æ—¶å‡å®šæœ‰ç¬¦å·æ•°ä»Žä¸æº¢å‡º" #: tree.c:4068 #, gcc-internal-format @@ -26196,14 +26158,14 @@ msgid "variable %q+D definition is marked dllimport" msgstr "å˜é‡%q+Dçš„å®šä¹‰è¢«æ ‡è®°ä¸º dllimport" #: tree.c:5384 config/sh/symbian-c.c:164 config/sh/symbian-cxx.c:651 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "external linkage required for symbol %q+D because of %qE attribute" -msgstr "符å·%q+D需è¦å¤–éƒ¨é“¾æŽ¥ï¼Œå› ä¸º%qs属性" +msgstr "符å·%q+D需è¦å¤–éƒ¨é“¾æŽ¥ï¼Œå› ä¸º%qE属性" #: tree.c:5398 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE implies default visibility, but %qD has already been declared with a different visibility" -msgstr "%qsæ„味ç€é»˜è®¤å¯è§æ€§ï¼›ä½†%qDå·²ç»è¢«å£°æ˜Žä¸ºæœ‰ä¸åŒçš„å¯è§æ€§" +msgstr "%qEæ„味ç€é»˜è®¤å¯è§æ€§ï¼›ä½†%qDå·²ç»è¢«å£°æ˜Žä¸ºæœ‰ä¸åŒçš„å¯è§æ€§" #: tree.c:6998 #, gcc-internal-format @@ -26251,7 +26213,7 @@ msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" msgstr "æ ‘æ£€æŸ¥ï¼šåœ¨ %4$s:%5$d 处,%3$s ä¸ %d 个 elts 访问了 tree_vec çš„ elt %1$d" #: tree.c:8546 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d" msgstr "æ ‘æ£€æŸ¥ï¼šåœ¨ %4$s ä¸è®¿é—®æœ‰ %3$d 个æ“作数的 %2$s 的第 %1$d 个æ“作数,于 %5$s:%6$d" @@ -26266,9 +26228,9 @@ msgid "Dead histogram" msgstr "ä¸æ´»è·ƒç›´æ–¹å›¾" #: value-prof.c:407 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "Histogram value statement does not correspond to the statement it is associated with" -msgstr "直方图值è¯å¥ä¸å’Œä¸Žå®ƒç›¸å…³çš„è¯å¥å¯¹åº”" +msgstr "直方图值è¯å¥ä¸å’Œä¸Žå®ƒç›¸å…³è”çš„è¯å¥å¯¹åº”" #: value-prof.c:420 #, gcc-internal-format @@ -26361,9 +26323,9 @@ msgid "initializer for floating value is not a floating constant" msgstr "浮点值的åˆå§‹å€¼è®¾å®šä¸æ˜¯ä¸€ä¸ªæµ®ç‚¹å¸¸é‡" #: varasm.c:4872 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid initial value for member %qE" -msgstr "æˆå‘˜%qsçš„åˆå§‹å€¼æ— 效" +msgstr "æˆå‘˜%qEçš„åˆå§‹å€¼æ— 效" #: varasm.c:5181 varasm.c:5225 #, gcc-internal-format @@ -26416,9 +26378,9 @@ msgid "weakref %q+D must have static linkage" msgstr "弱引用%q+D必须有é™æ€é“¾æŽ¥" #: varasm.c:5649 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "alias definitions not supported in this configuration" -msgstr "弱引用在æ¤é…置下ä¸å—支æŒ" +msgstr "别å定义在æ¤é…置下ä¸å—支æŒ" #: varasm.c:5715 #, gcc-internal-format @@ -26442,7 +26404,7 @@ msgstr "çŸ¢é‡ %s %s 域错误,在 %s 于 %s:%u" #. Print an error message for unrecognized stab codes. #: xcoffout.c:187 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no sclass for %s stab (0x%x)" msgstr "%s stab (0x%x)没有 sclass" @@ -26498,7 +26460,7 @@ msgid "junk at end of '#pragma ms_struct'" msgstr "‘#pragma ms_struct’末尾有垃圾å—符" #: config/darwin-c.c:406 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "subframework include %s conflicts with framework include" msgstr "åæ¡†æž¶åŒ…å« %s 与框架包å«å†²çª" @@ -26690,14 +26652,14 @@ msgid "bad builtin fcode" msgstr "错误的内建 fcode" #: config/arc/arc.c:393 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument of %qE attribute is not a string constant" -msgstr "%qs属性的实å‚ä¸æ˜¯ä¸€ä¸ªå—符串常é‡" +msgstr "%qE属性的实å‚ä¸æ˜¯ä¸€ä¸ªå—符串常é‡" #: config/arc/arc.c:401 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument of %qE attribute is not \"ilink1\" or \"ilink2\"" -msgstr "%qs属性的实å‚ä¸æ˜¯â€œilink1â€æˆ–“ilink2â€" +msgstr "%qE属性的实å‚ä¸æ˜¯â€œilink1â€æˆ–“ilink2â€" #: config/arm/arm.c:1337 #, gcc-internal-format @@ -26710,9 +26672,9 @@ msgid "bad value (%s) for %s switch" msgstr "开关%2$sçš„å‚æ•°%1$sä¸æ£ç¡®" #: config/arm/arm.c:1460 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid __fp16 format option: -mfp16-format=%s" -msgstr "æ— æ•ˆçš„æµ®ç‚¹é€‰é¡¹ï¼š-mfpu=%s" +msgstr "æ— æ•ˆçš„ __fp16 浮点选项:-mfp16-format=%s" #: config/arm/arm.c:1477 #, gcc-internal-format @@ -26737,7 +26699,7 @@ msgstr "ç›®æ ‡ CPU ä¸æ”¯æŒ THUMB 指令" #: config/arm/arm.c:1515 #, gcc-internal-format msgid "enabling backtrace support is only meaningful when compiling for the Thumb" -msgstr "回溯支æŒåªåœ¨ä¸º Thumb 编译时有æ„义" +msgstr "函数调用回溯支æŒåªåœ¨ä¸º Thumb 编译时有æ„义" #: config/arm/arm.c:1518 #, gcc-internal-format @@ -26805,14 +26767,14 @@ msgid "FPA is unsupported in the AAPCS" msgstr "AAPCS ä¸æ”¯æŒ FPA" #: config/arm/arm.c:1693 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "AAPCS does not support -mcaller-super-interworking" -msgstr "ç›®æ ‡ CPU ä¸æ”¯æŒäº¤äº’工作" +msgstr "AAPCS ä¸æ”¯æŒ -mcaller-super-interworking" #: config/arm/arm.c:1696 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "AAPCS does not support -mcallee-super-interworking" -msgstr "ç›®æ ‡ CPU ä¸æ”¯æŒäº¤äº’工作" +msgstr "AAPCS ä¸æ”¯æŒ -mcallee-super-interworking" #: config/arm/arm.c:1703 #, gcc-internal-format @@ -26877,12 +26839,12 @@ msgstr "-freorder-blocks-and-partition ä¸èƒ½åœ¨æ¤æž¶æž„下工作" #: config/arm/arm.c:3633 #, gcc-internal-format msgid "Non-AAPCS derived PCS variant" -msgstr "" +msgstr "ä¸æ˜¯ä»Ž AAPCS 派生出的 PCS å˜ç§" #: config/arm/arm.c:3635 #, gcc-internal-format msgid "Variadic functions must use the base AAPCS variant" -msgstr "" +msgstr "å¯å˜å‚数函数必须使用基础的 AAPCS å˜ç§" #: config/arm/arm.c:3654 #, gcc-internal-format @@ -27571,9 +27533,9 @@ msgid "unsupported operand size for extended register" msgstr "扩展的寄å˜å™¨ä¸æ”¯æŒçš„æ“作数大å°" #: config/i386/i386.c:11452 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "non-integer operand used with operand code '%c'" -msgstr "æ— æ•ˆçš„æ“作数代ç ‘%c’" +msgstr "éžæ•´æ•°æ“作数使用了æ“作数代ç ‘%c’" #: config/i386/i386.c:22882 #, gcc-internal-format @@ -27661,14 +27623,14 @@ msgid "ms_hook_prologue attribute needs assembler swap suffix support" msgstr "" #: config/i386/i386.c:30067 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "vector permutation requires vector constant" -msgstr "%qE属性需è¦ä¸€ä¸ªæ•´å¸¸é‡ä½œä¸ºå®žå‚" +msgstr "矢é‡ç½®æ¢éœ€è¦çŸ¢é‡å¸¸é‡" #: config/i386/i386.c:30077 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid vector permutation constant" -msgstr "CHARACTER 常é‡çš„ç§åˆ« %d æ— æ•ˆï¼Œåœ¨%C处" +msgstr "æ— æ•ˆçš„çŸ¢é‡ç½®æ¢å¸¸é‡" #: config/i386/i386.c:30125 #, gcc-internal-format @@ -27854,7 +27816,7 @@ msgstr "%qE属性的å‚数应当在 18 å’Œ 255 之间" #: config/m32c/m32c.c:4001 #, gcc-internal-format msgid "%<bank_switch%> has no effect on non-interrupt functions" -msgstr "" +msgstr "%<bank_switch%>对éžä¸æ–函数ä¸èµ·ä½œç”¨" #: config/m32c/m32c.c:4102 #, gcc-internal-format @@ -28039,7 +28001,7 @@ msgstr "-mc= 必须是 -mc=tiny,-mc=near 或者 -mc=far" #: config/mep/mep.c:1534 #, gcc-internal-format msgid "unusual TP-relative address" -msgstr "" +msgstr "ä¸å¯»å¸¸çš„ TP 相对地å€" #: config/mep/mep.c:3530 #, gcc-internal-format @@ -28047,19 +28009,19 @@ msgid "unconvertible operand %c %qs" msgstr "æ— æ³•è½¬æ¢çš„æ“作数 %c%qs" #: config/mep/mep.c:3972 config/mep/mep.c:4035 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "address region attributes not allowed with auto storage class" -msgstr "__BELOW100__ 属性ä¸å…许用于自动å˜å‚¨ç±»" +msgstr "地å€åŒºåŸŸå±žæ€§ä¸å…许用于自动å˜å‚¨ç±»" #: config/mep/mep.c:3978 config/mep/mep.c:4041 #, gcc-internal-format msgid "address region attributes on pointed-to types ignored" -msgstr "" +msgstr "被指å‘的类型上的内å˜åŒºåŸŸå±žæ€§è¢«å¿½ç•¥" #: config/mep/mep.c:4027 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE attribute only applies to variables and functions" -msgstr "%qE属性åªèƒ½ä¸ºå…·æœ‰å¤–部链接的已åˆå§‹åŒ–çš„å˜é‡ä½¿ç”¨" +msgstr "%qE属性åªèƒ½ä¸ºå˜é‡æˆ–函数所使用" #: config/mep/mep.c:4047 config/mep/mep.c:4335 #, gcc-internal-format @@ -28082,19 +28044,19 @@ msgid "interrupt function must have no arguments" msgstr "ä¸æ–函数ä¸èƒ½æœ‰å‚æ•°" #: config/mep/mep.c:4113 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE attribute allows only an integer constant argument" -msgstr "%qs属性需è¦ä¸€ä¸ªæ•´å¸¸é‡ä½œä¸ºå®žå‚" +msgstr "%qE属性需è¦ä¸€ä¸ªæ•´å¸¸é‡ä½œä¸ºå®žå‚" #: config/mep/mep.c:4146 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE attribute only applies to functions, not %s" -msgstr "%qE属性åªèƒ½ç”¨äºŽå¸¦å¯å˜å‚数函数" +msgstr "%qE属性åªèƒ½ç”¨äºŽå‡½æ•°è€Œéž %s" #: config/mep/mep.c:4156 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "To describe a pointer to a VLIW function, use syntax like this:" -msgstr "æè¿° VLIW 函数指针时使用下列è¯æ³•ï¼š" +msgstr "æè¿° VLIW 函数指针时请使用下列è¯æ³•ï¼š" #: config/mep/mep.c:4157 #, gcc-internal-format @@ -28117,9 +28079,9 @@ msgid "VLIW functions are not allowed without a VLIW configuration" msgstr "没有 VLIW é…置时 VLIW 函数ä¸è¢«æ”¯æŒ" #: config/mep/mep.c:4318 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "\"#pragma disinterrupt %s\" not used" -msgstr "%q+D定义åŽæœªä½¿ç”¨" +msgstr "“#pragma disinterrupt %sâ€æœªä½¿ç”¨" #: config/mep/mep.c:4460 #, gcc-internal-format @@ -28127,44 +28089,44 @@ msgid "__io address 0x%x is the same for %qE and %qE" msgstr "__io åœ°å€ 0x%x 对%qEå’Œ%qE而言是相åŒçš„" #: config/mep/mep.c:4608 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "variable %s (%ld bytes) is too large for the %s section (%d bytes)" -msgstr "å †æ ˆæ¡†æž¶æœ‰ %wd å—节,超过了 %wd å—节" +msgstr "å˜é‡ %s 大å°ä¸º %ld å—节,而 %s 节å´åªæœ‰ %d å—节" #: config/mep/mep.c:4706 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "variable %D of type %<io%> must be uninitialized" -msgstr "%c REDUCTION å˜é‡â€˜%s’在%L处必须具有数å—ç±»åž‹è€Œéž %s" +msgstr "类型为%<io%>çš„å˜é‡ %D ä¸èƒ½è¢«åˆå§‹åŒ–" #: config/mep/mep.c:4711 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "variable %D of type %<cb%> must be uninitialized" -msgstr "%c REDUCTION å˜é‡â€˜%s’在%L处必须具有数å—ç±»åž‹è€Œéž %s" +msgstr "类型为%<cb%>çš„å˜é‡ %D ä¸èƒ½è¢«åˆå§‹åŒ–" #: config/mep/mep.c:6164 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "coprocessor intrinsic %qs is not available in this configuration" -msgstr "æ¤é…ç½®ä¸æ”¯æŒå‘½ä»¤è¡Œé€‰é¡¹%qs" +msgstr "å处ç†å™¨å†…建函数%qs在æ¤é…置下ä¸å¯ç”¨" #: config/mep/mep.c:6167 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qs is not available in VLIW functions" -msgstr "%qDä¸æ˜¯ä¸€ä¸ªæ¨¡æ¿å‡½æ•°" +msgstr "%qs在 VLIW 函数ä¸ä¸å¯ç”¨" #: config/mep/mep.c:6170 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qs is not available in non-VLIW functions" -msgstr "%q+D通常是一个éžé™æ€çš„函数" +msgstr "%qsåœ¨éž VLIW 函数ä¸ä¸å¯ç”¨" #: config/mep/mep.c:6332 config/mep/mep.c:6450 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument %d of %qE must be in the range %d...%d" -msgstr "选择å必须是 0 到 %wi 间的整常é‡" +msgstr "%2$qE的第 %1$d 个å‚数必须是在 %3$d å’Œ %4$d 之间" #: config/mep/mep.c:6335 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument %d of %qE must be a multiple of %d" -msgstr "%2$qEçš„å®žå‚ %1$d 必须是地å€" +msgstr "%2$qE的第 %1$d 个å‚数必须是 %3$d çš„å€æ•°" #: config/mep/mep.c:6389 #, gcc-internal-format @@ -28182,14 +28144,14 @@ msgid "argument %d of %qE must be an address" msgstr "%2$qEçš„å®žå‚ %1$d 必须是地å€" #: config/mep/mep.c:7208 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "2 byte cop instructions are not allowed in 64-bit VLIW mode" -msgstr "指定何时指令å…许被访问代ç " +msgstr "2 å—节 cop 指针ä¸å…许被用在 VLIW 模å¼ä¸" #: config/mep/mep.c:7214 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "unexpected %d byte cop instruction" -msgstr "预测到的 Thumb 指令" +msgstr "éžé¢„期的 %d å—节 cop 指令" #: config/mips/mips.c:1343 config/mips/mips.c:1345 #, gcc-internal-format @@ -28197,14 +28159,14 @@ msgid "%qs attribute only applies to functions" msgstr "%qs属性åªèƒ½åº”用于函数" #: config/mips/mips.c:1355 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE cannot have both %<mips16%> and %<nomips16%> attributes" -msgstr "%qsä¸èƒ½åŒæ—¶æœ‰%<mips16%> å’Œ %<nomips16%>属性" +msgstr "%qEä¸èƒ½åŒæ—¶æœ‰%<mips16%>å’Œ%<nomips16%>属性" #: config/mips/mips.c:1377 config/mips/mips.c:1380 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE redeclared with conflicting %qs attributes" -msgstr "%qsé‡å£°æ˜Žæœ‰å†²çªçš„属性%qs" +msgstr "%qEé‡å£°æ˜Žæœ‰å†²çªçš„属性%qs" #: config/mips/mips.c:2895 #, gcc-internal-format @@ -28237,9 +28199,9 @@ msgid "invalid argument to built-in function" msgstr "内建函数实å‚æ— æ•ˆ" #: config/mips/mips.c:13335 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "built-in function %qE not supported for MIPS16" -msgstr "MIPS16 ä¸æ”¯æŒå†…建函数%qs" +msgstr "MIPS16 ä¸æ”¯æŒå†…建函数%qE" #: config/mips/mips.c:13925 #, gcc-internal-format @@ -28347,9 +28309,9 @@ msgid "%qs requires branch-likely instructions" msgstr "%qséœ€è¦ Branch-Likely 指令" #: config/mips/mips.c:15719 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "the %qs architecture does not support the synci instruction" -msgstr "%qs架构ä¸æ”¯æŒ Branch-Likely 指令" +msgstr "%qs架构ä¸æ”¯æŒ synci 指令" #: config/mips/mips.c:16186 #, gcc-internal-format @@ -28458,29 +28420,29 @@ msgid "Defaulting to stack for %s register creation\n" msgstr "对于 %s 寄å˜å™¨åˆ›å»ºé»˜è®¤ä¸ºå †æ ˆ\n" #: config/picochip/picochip.c:1342 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "LCFI labels have already been deferred." -msgstr "LCFI æ ‡è®°å·²ç»è¢«æŽ¨è¿Ÿã€‚" +msgstr "LCFI æ ‡å·å·²ç»è¢«æŽ¨è¿Ÿã€‚" #: config/picochip/picochip.c:1405 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "LM label has already been deferred." -msgstr "LM æ ‡è®°å·²ç»è¢«æŽ¨è¿Ÿã€‚" +msgstr "LM æ ‡å·å·²ç»è¢«æŽ¨è¿Ÿã€‚" #: config/picochip/picochip.c:1685 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "picochip_asm_output_opcode - Found multiple lines in VLIW packet %s\n" msgstr "picochip_asm_output_opcode - 在 VLIW 包 %s ä¸æ‰¾åˆ°å¤šè¡Œ\n" #: config/picochip/picochip.c:1788 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "picochip_asm_output_opcode - can't output unknown operator %c\n" -msgstr "picochip_asm_output_opcode - æ— æ³•è¾“å‡ºæœªçŸ¥çš„æ“作符 %c\n" +msgstr "picochip_asm_output_opcode - æ— æ³•è¾“å‡ºæœªçŸ¥çš„è¿ç®—符 %c\n" #: config/picochip/picochip.c:2040 config/picochip/picochip.c:2099 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%s: At least one operand can't be handled" -msgstr "%s: 至少一个æ“作数ä¸èƒ½è¢«å¤„ç†" +msgstr "%s:至少有一个æ“作数ä¸èƒ½è¢«å¤„ç†" #: config/picochip/picochip.c:2180 #, gcc-internal-format @@ -28783,14 +28745,14 @@ msgid "argument 3 must be a 4-bit unsigned literal" msgstr "å®žå‚ 3 必须是一个 4 ä½æ— 符å·å—é¢å€¼" #: config/rs6000/rs6000.c:9918 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument 3 must be a 2-bit unsigned literal" -msgstr "å®žå‚ 2 必须是一个 5 ä½æ— 符å·å—é¢å€¼" +msgstr "å®žå‚ 2 必须是一个 2 ä½æ— 符å·å—é¢å€¼" #: config/rs6000/rs6000.c:9930 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "argument 3 must be a 1-bit unsigned literal" -msgstr "å®žå‚ 2 必须是一个 5 ä½æ— 符å·å—é¢å€¼" +msgstr "å®žå‚ 2 必须是一个 1 ä½æ— 符å·å—é¢å€¼" #: config/rs6000/rs6000.c:10106 #, gcc-internal-format @@ -28828,9 +28790,9 @@ msgid "argument 1 of __builtin_spe_predicate is out of range" msgstr "__builtin_spe_predicate 的第 1 个实å‚越界" #: config/rs6000/rs6000.c:12141 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "internal error: builtin function %s had no type" -msgstr "内部错误:内建函数 %s 有éžé¢„期的返回类型 %s" +msgstr "内部错误:内建函数 %s 没有类型" #: config/rs6000/rs6000.c:12148 #, gcc-internal-format @@ -28840,7 +28802,7 @@ msgstr "内部错误:内建函数 %s 有éžé¢„期的返回类型 %s" #: config/rs6000/rs6000.c:12161 #, gcc-internal-format msgid "internal error: builtin function %s, argument %d had unexpected argument type %s" -msgstr "内部错误:内建函数 %s çš„å‚æ•° %d 有éžé¢„期的å‚数类型 %s" +msgstr "内部错误:内建函数 %s 的第 %d 个å‚数有éžé¢„期的å‚数类型 %s" #: config/rs6000/rs6000.c:17854 #, gcc-internal-format @@ -29142,9 +29104,9 @@ msgid "%qE attribute only applies to interrupt functions" msgstr "%qE属性åªèƒ½ç”¨äºŽä¸æ–函数" #: config/sh/sh.c:8674 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE attribute is supported only for SH2A" -msgstr "%qE属性在 R8C ç›®æ ‡æœºä¸Šä¸å—支æŒ" +msgstr "%qE属性åªä¸º SH2A 所支æŒ" #: config/sh/sh.c:8704 #, gcc-internal-format @@ -29398,7 +29360,7 @@ msgid "value passed to %<-m%s%> is too large" msgstr "ä¼ é€’ç»™%<-m%s%>的值太大" #: config/v850/v850.c:2117 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "data area attributes cannot be specified for local variables" msgstr "ä¸èƒ½ä¸ºå±€éƒ¨å˜é‡æŒ‡å®šåœ°å€åŒºåŸŸå±žæ€§" @@ -29530,64 +29492,64 @@ msgid "call of %<(%T) (%A)%> is ambiguous" msgstr "对%<(%T) (%A)%>的调用有æ§ä¹‰" #: cp/call.c:3505 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for ternary %<operator?:%> in %<%E ? %E : %E%>" -msgstr "%s 为三元%<operator?:%>在%<%E ? %E : %E%>ä¸" +msgstr "三元%<operator?:%>在%<%E ? %E : %E%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3508 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for ternary %<operator?:%> in %<%E ? %E : %E%>" -msgstr "%s 为三元%<operator?:%>在%<%E ? %E : %E%>ä¸" +msgstr "三元%<operator?:%>在%<%E ? %E : %E%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3515 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for %<operator%s%> in %<%E%s%>" -msgstr "%s 为%<operator%s%>在%<%E%s%>ä¸" +msgstr "%<operator%s%>在%<%E%s%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3518 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for %<operator%s%> in %<%E%s%>" -msgstr "没有åˆé€‚çš„%<operator %s%>ç»™%qT" +msgstr "%<operator%s%>在%<%E%s%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3524 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for %<operator[]%> in %<%E[%E]%>" -msgstr "%s 为%<operator[]%>在%<%E[%E]%>ä¸" +msgstr "%<operator[]%>在%<%E[%E]%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3527 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for %<operator[]%> in %<%E[%E]%>" -msgstr "没有åˆé€‚çš„%<operator %s%>ç»™%qT" +msgstr "%<operator[]%>在%<%E[%E]%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3534 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for %qs in %<%s %E%>" -msgstr "%s 为%qs在%<%s %E%>" +msgstr "%qs在%<%s %E%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3537 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for %qs in %<%s %E%>" -msgstr "对%<(%T) (%A)%>的调用没有匹é…" +msgstr "%qs在%<%s %E%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3544 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for %<operator%s%> in %<%E %s %E%>" -msgstr "%s 为%<operator%s%>在%<%E %s %E%>ä¸" +msgstr "%<operator%s%>在%<%E %s %E%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3547 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for %<operator%s%> in %<%E %s %E%>" -msgstr "没有åˆé€‚çš„%<operator %s%>ç»™%qT" +msgstr "%<operator%s%>在%<%E %s %E%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3551 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "ambiguous overload for %<operator%s%> in %<%s%E%>" -msgstr "%s 为%<operator%s%>在%<%s%E%>ä¸" +msgstr "%<operator%s%>在 %<%s%E%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" #: cp/call.c:3554 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no match for %<operator%s%> in %<%s%E%>" -msgstr "没有åˆé€‚çš„%<operator %s%>ç»™%qT" +msgstr "%<operator%s%>在%<%s%E%>ä¸æ²¡æœ‰åŒ¹é…" #: cp/call.c:3649 #, gcc-internal-format @@ -29597,12 +29559,12 @@ msgstr "ISO C ä¸å…许çœç•¥ ?: 表达å¼ä¸çš„第二项" #: cp/call.c:3730 #, gcc-internal-format msgid "second operand to the conditional operator is of type %<void%>, but the third operand is neither a throw-expression nor of type %<void%>" -msgstr "æ¡ä»¶æ“作符的第二个æ“作数类型为%<void%>,但第三个æ“作数既ä¸æ˜¯å¼‚常表达å¼ï¼Œä¹Ÿä¸æ‹¥æœ‰%<void%>类型" +msgstr "æ¡ä»¶è¿ç®—符的第二个æ“作数类型为%<void%>,但第三个æ“作数既ä¸æ˜¯å¼‚常表达å¼ï¼Œä¹Ÿä¸æ‹¥æœ‰%<void%>类型" #: cp/call.c:3735 #, gcc-internal-format msgid "third operand to the conditional operator is of type %<void%>, but the second operand is neither a throw-expression nor of type %<void%>" -msgstr "æ¡ä»¶æ“作符的第三个æ“作数类型为%<void%>,但第二个æ“作数既ä¸æ˜¯å¼‚常表达å¼ï¼Œä¹Ÿä¸æ‹¥æœ‰%<void%>类型" +msgstr "æ¡ä»¶è¿ç®—符的第三个æ“作数类型为%<void%>,但第二个æ“作数既ä¸æ˜¯å¼‚常表达å¼ï¼Œä¹Ÿä¸æ‹¥æœ‰%<void%>类型" #: cp/call.c:3777 cp/call.c:4015 #, gcc-internal-format @@ -29625,9 +29587,9 @@ msgid "no %<%D(int)%> declared for postfix %qs, trying prefix operator instead" msgstr "%<%D(int)%>没有出现在åŽç¼€%qsä¸ï¼Œå°è¯•ä½¿ç”¨å‰ç¼€è¿ç®—符" #: cp/call.c:4322 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "no %<%D(int)%> declared for postfix %qs" -msgstr "%<%D(int)%>没有出现在åŽç¼€%qsä¸ï¼Œå°è¯•ä½¿ç”¨å‰ç¼€è¿ç®—符" +msgstr "没有为åŽç¼€%2$qs声明%<%1$D(int)%>" #: cp/call.c:4416 #, gcc-internal-format @@ -29635,14 +29597,14 @@ msgid "comparison between %q#T and %q#T" msgstr "在%q#Tå’Œ%q#T间比较" #: cp/call.c:4660 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "non-placement deallocation function %q+D" -msgstr "å…ˆå‰å¯¹äºŽ%q+#Dçš„éžå‡½æ•°å£°æ˜Ž" +msgstr "éžé¢„定ä½çš„释放函数%q+D" #: cp/call.c:4661 #, gcc-internal-format msgid "selected for placement delete" -msgstr "" +msgstr "被选择为预定ä½åˆ 除" #: cp/call.c:4740 #, gcc-internal-format @@ -29690,9 +29652,9 @@ msgid "converting %<false%> to pointer type for argument %P of %qD" msgstr "å°†%<false%>转æ¢ä¸ºæŒ‡å‘%2$qDçš„å®žå‚ %1$P 的指针类型" #: cp/call.c:4862 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "too many braces around initializer for %qT" -msgstr "%qTçš„åˆå§‹åŒ–器周围花括å·å¤ªå¤š" +msgstr "%qTçš„åˆå§‹å€¼è®¾å®šå‘¨å›´èŠ±æ‹¬å·å¤ªå¤š" #: cp/call.c:4884 cp/cvt.c:217 #, gcc-internal-format @@ -29710,14 +29672,14 @@ msgid "converting to %qT from initializer list would use explicit constructor %q msgstr "从åˆå§‹åŒ–列表转æ¢ä¸º%qT将使用显å¼æž„é€ å‡½æ•°%qD" #: cp/call.c:5070 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "cannot bind %qT lvalue to %qT" -msgstr "æ— æ³•å°†å·¦å€¼ %qT 绑定到 %qT" +msgstr "æ— æ³•å°†å·¦å€¼%qT绑定到%qT" #: cp/call.c:5073 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid " initializing argument %P of %q+D" -msgstr " åˆå§‹åŒ–%2$qDçš„å®žå‚ %1$P" +msgstr "以åˆå§‹åŒ–%2$q+Dçš„å®žå‚ %1$P" #: cp/call.c:5100 #, gcc-internal-format @@ -29735,15 +29697,15 @@ msgid "cannot bind rvalue %qE to %qT" msgstr "æ— æ³•å°†å³å€¼%qE绑定到%qT" #: cp/call.c:5225 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "cannot pass objects of non-trivially-copyable type %q#T through %<...%>" -msgstr "ä¸èƒ½é€šè¿‡%<...%>ä¼ é€’æœ‰éžç®€å•æ—§æ•°æ®ç±»åž‹%q#T的对象;调用会在è¿è¡Œæ—¶ä¸æ¢" +msgstr "ä¸èƒ½é€šè¿‡%<...%>ä¼ é€’æœ‰éžå¹³å‡¡å¤åˆ¶çš„类型%q#T" #. conditionally-supported behavior [expr.call] 5.2.2/7. #: cp/call.c:5252 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "cannot receive objects of non-trivially-copyable type %q#T through %<...%>; " -msgstr "ä¸èƒ½é€šè¿‡%<...%>接å—有éžç®€å•æ—§æ•°æ®ç±»åž‹%q#T的对象;调用会在è¿è¡Œæ—¶ä¸æ¢" +msgstr "ä¸èƒ½é€šè¿‡%<...%>接å—有éžå¹³å‡¡å¤åˆ¶çš„类型%q#Tï¼›" #: cp/call.c:5298 #, gcc-internal-format @@ -29778,12 +29740,12 @@ msgstr "演绎 %qT 为 %qT" #: cp/call.c:5682 #, gcc-internal-format msgid " in call to %q+D" -msgstr " 在调用%q+Dæ—¶" +msgstr "在调用%q+Dæ—¶" #: cp/call.c:5684 #, gcc-internal-format msgid " (you can disable this with -fno-deduce-init-list)" -msgstr " (您å¯ä»¥ç”¨ -fno-deduce-init-lis ç¦ç”¨å®ƒ)" +msgstr "(您å¯ä»¥ç”¨ -fno-deduce-init-lis ç¦ç”¨å®ƒ)" #: cp/call.c:5957 #, gcc-internal-format @@ -29818,7 +29780,7 @@ msgstr "ä¼ é€’%qT时选择%qT而ä¸æ˜¯%qT" #: cp/call.c:7110 cp/name-lookup.c:5036 #, gcc-internal-format msgid " in call to %qD" -msgstr " 在调用%qDæ—¶" +msgstr "在调用%qDæ—¶" #: cp/call.c:7167 #, gcc-internal-format @@ -29828,12 +29790,12 @@ msgstr "选择%qD而ä¸æ˜¯%qD" #: cp/call.c:7168 #, gcc-internal-format msgid " for conversion from %qT to %qT" -msgstr " 当从%qT转æ¢ä¸º%qTæ—¶" +msgstr "以从%qT转æ¢ä¸º%qT" #: cp/call.c:7171 #, gcc-internal-format msgid " because conversion sequence for the argument is better" -msgstr " å› ä¸ºå‰è€…的实å‚类型转æ¢åºåˆ—更好" +msgstr "å› ä¸ºå‰è€…的实å‚类型转æ¢åºåˆ—更好" #: cp/call.c:7289 #, gcc-internal-format @@ -29861,9 +29823,9 @@ msgid "could not convert %qE to %qT" msgstr "ä¸èƒ½å°†%qE转æ¢ä¸º%qT" #: cp/call.c:7703 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "invalid initialization of non-const reference of type %qT from an rvalue of type %qT" -msgstr "ä¸èƒ½å°†ç±»åž‹ä¸º%qTçš„éž const 引用åˆå§‹åŒ–为类型为%qT的临时å˜é‡" +msgstr "用类型为%2$qTçš„å³å€¼åˆå§‹åŒ–类型为%1$qTçš„éžå¸¸é‡å¼•ç”¨æ— 效" #: cp/call.c:7707 #, gcc-internal-format @@ -29959,12 +29921,12 @@ msgstr "%qD的最终é‡è½½åœ¨%qTä¸ä¸å”¯ä¸€" #: cp/class.c:2505 #, gcc-internal-format msgid "%q+D was hidden" -msgstr "%q+D被éšè—" +msgstr "%q+D为" #: cp/class.c:2506 #, gcc-internal-format msgid " by %q+D" -msgstr " 为%q+D" +msgstr "%q+D所éšè—" #: cp/class.c:2549 cp/decl2.c:1292 #, gcc-internal-format @@ -30084,17 +30046,17 @@ msgstr "%q#T有指针数æ®æˆå‘˜" #: cp/class.c:3159 #, gcc-internal-format msgid " but does not override %<%T(const %T&)%>" -msgstr " 但没有é‡è½½%<%T(const %T&)%>" +msgstr "但没有é‡è½½%<%T(const %T&)%>" #: cp/class.c:3161 #, gcc-internal-format msgid " or %<operator=(const %T&)%>" -msgstr " 或%<operator=(const %T&)%>" +msgstr "或者%<operator=(const %T&)%>" #: cp/class.c:3165 #, gcc-internal-format msgid " but does not override %<operator=(const %T&)%>" -msgstr " 也没有é‡è½½%<operator=(const %T&)%>" +msgstr "但没有é‡è½½%<operator=(const %T&)%>" #: cp/class.c:3628 #, gcc-internal-format @@ -30131,7 +30093,7 @@ msgstr "%q+D被声明为å–常é‡å¼•ç”¨ï¼Œä½†æ˜¯éšå¼å£°æ˜Žå–éžå¸¸é‡å¼•ç”¨" #: cp/class.c:4460 #, gcc-internal-format msgid "%q+D declared to take non-const reference cannot be defaulted in the class body" -msgstr "%q+D被声明为å–éžå¸¸é‡å¼•ç”¨ï¼Œä¸èƒ½åœ¨ç±»ä½“内指定默认值" +msgstr "%q+D被声明为å–éžå¸¸é‡å¼•ç”¨ï¼Œä¸èƒ½åœ¨ç±»ä½“内默认化" #: cp/class.c:4679 #, gcc-internal-format @@ -30573,38 +30535,38 @@ msgstr "跳转至 case æ ‡å·" #: cp/decl.c:2508 cp/decl.c:2648 cp/decl.c:2689 #, gcc-internal-format msgid " from here" -msgstr " 从这里" +msgstr "从这里" #: cp/decl.c:2527 cp/decl.c:2692 #, gcc-internal-format msgid " exits OpenMP structured block" -msgstr " 退出 OpenMP 结构å—" +msgstr "退出了 OpenMP 结构å—" #: cp/decl.c:2548 #, gcc-internal-format msgid " crosses initialization of %q+#D" -msgstr " 跳过%q+#Dçš„åˆå§‹åŒ–" +msgstr "跳过了%q+#Dçš„åˆå§‹åŒ–" #: cp/decl.c:2550 cp/decl.c:2666 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid " enters scope of %q+#D which has non-trivial destructor" -msgstr "基类%q#T有一个éžè™šæžæž„函数" +msgstr "进入了有éžå¹³å‡¡æžæž„函数的%q+#D的作用域" #: cp/decl.c:2564 cp/decl.c:2671 #, gcc-internal-format msgid " enters try block" -msgstr " 进入 try å—" +msgstr "进入了 try å—" #. Can't skip init of __exception_info. #: cp/decl.c:2566 cp/decl.c:2660 cp/decl.c:2673 #, gcc-internal-format msgid " enters catch block" -msgstr " 进入 catch å—" +msgstr "进入了 catch å—" #: cp/decl.c:2576 cp/decl.c:2676 #, gcc-internal-format msgid " enters OpenMP structured block" -msgstr " 进入 OpenMP 结构å—" +msgstr "进入了 OpenMP 结构å—" #: cp/decl.c:2647 cp/decl.c:2688 #, gcc-internal-format @@ -30614,7 +30576,7 @@ msgstr "è·³è½¬è‡³æ ‡å·%q+D" #: cp/decl.c:2664 #, gcc-internal-format msgid " skips initialization of %q+#D" -msgstr " 跳过%q+#Dçš„åˆå§‹åŒ–" +msgstr "跳过了%q+#Dçš„åˆå§‹åŒ–" #: cp/decl.c:2741 #, gcc-internal-format @@ -30642,9 +30604,9 @@ msgid "no class template named %q#T in %q#T" msgstr "没有å为%q#T的类模æ¿ï¼Œåœ¨%q#Tä¸ " #: cp/decl.c:3064 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "lookup of %qT in %qT is ambiguous" -msgstr "从%qT到%qT的转æ¢æœ‰æ§ä¹‰" +msgstr "在%2$qTä¸æŸ¥è¯¢%1$qT有æ§ä¹‰" #: cp/decl.c:3073 #, gcc-internal-format @@ -30803,9 +30765,9 @@ msgid "duplicate initialization of %qD" msgstr "ISO C++ ä¸å…许æˆå‘˜%qDçš„åˆå§‹åŒ–" #: cp/decl.c:4200 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qD declared %<constexpr%> outside its class" -msgstr "constexpr 函数ä¸èƒ½å®šä¹‰åœ¨ç±»å¤–" +msgstr "%qD在其类外被声明为%<constexpr%>" #: cp/decl.c:4237 #, gcc-internal-format @@ -31252,14 +31214,14 @@ msgid "creating array of references" msgstr "创建引用的数组" #: cp/decl.c:7465 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "declaration of %qD as array of function members" -msgstr "%qs声明为函数的数组" +msgstr "%qD声明为函数æˆå‘˜çš„数组" #: cp/decl.c:7467 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "creating array of function members" -msgstr "在%L处建立临时数组" +msgstr "创建函数æˆå‘˜çš„组织" #: cp/decl.c:7482 #, gcc-internal-format @@ -31437,9 +31399,9 @@ msgid "typedef declaration invalid in parameter declaration" msgstr "å½¢å‚声明ä¸å‡ºçŽ°çš„ typedef å£°æ˜Žæ— æ•ˆ" #: cp/decl.c:8210 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "storage class specified for template parameter %qs" -msgstr "为形å‚%qs指定了å˜å‚¨ç±»" +msgstr "为模æ¿å‚æ•°%qs指定了å˜å‚¨ç±»" #: cp/decl.c:8216 #, gcc-internal-format @@ -31452,9 +31414,9 @@ msgid "parameter declared %<auto%>" msgstr "å½¢å‚声明为%<auto%>" #: cp/decl.c:8228 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "a parameter cannot be declared %<constexpr%>" -msgstr "æž„é€ å‡½æ•°ä¸èƒ½è¢«å£°æ˜Žä¸ºè™šå‡½æ•°" +msgstr "å½¢å‚ä¸èƒ½è¢«å£°æ˜Žä¸º%<constexpr%>" #: cp/decl.c:8237 #, gcc-internal-format @@ -31583,9 +31545,9 @@ msgid "cannot declare pointer to %q#T member" msgstr "æ— æ³•å£°æ˜ŽæŒ‡å‘%q#Tæˆå‘˜çš„指针" #: cp/decl.c:8622 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "cannot declare %s to qualified function type %qT" -msgstr "ä¸èƒ½å°† %1$s 声明为å—é™åˆ¶çš„函数类型 %2$qT" +msgstr "ä¸èƒ½å°† %s 声明为é™å®šçš„函数类型%qT" #: cp/decl.c:8659 #, gcc-internal-format @@ -31675,9 +31637,9 @@ msgid "const %qs cannot be declared %<mutable%>" msgstr "常é‡%qsä¸èƒ½è¢«å£°æ˜Žä¸º%<mutable%>" #: cp/decl.c:8935 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "typedef name may not be a nested-name-specifier" -msgstr "%Jtypedef åä¸èƒ½æ˜¯åµŒå¥—å指定" +msgstr "typedef åä¸èƒ½æ˜¯åµŒå¥—å指定" #: cp/decl.c:8953 #, gcc-internal-format @@ -31771,9 +31733,9 @@ msgid "declaration of %qD as member of %qT" msgstr "%qD声明为%qT的一个æˆå‘˜" #: cp/decl.c:9273 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "a destructor cannot be %<constexpr%>" -msgstr "æžæž„函数ä¸èƒ½æ˜¯é™æ€æˆå‘˜å‡½æ•°" +msgstr "æžæž„函数ä¸èƒ½æ˜¯ %<constexpr%>" #: cp/decl.c:9277 #, gcc-internal-format @@ -31793,7 +31755,7 @@ msgstr "åå—%qT类型ä¸å®Œå…¨" #: cp/decl.c:9352 #, gcc-internal-format msgid " in instantiation of template %qT" -msgstr " 在模æ¿%qT的实例化ä¸" +msgstr "在模æ¿%qT的实例化ä¸" #: cp/decl.c:9361 #, gcc-internal-format @@ -31823,9 +31785,9 @@ msgid "making %qD static" msgstr "使%qDæˆä¸ºé™æ€çš„" #: cp/decl.c:9450 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "non-static data member %qE declared %<constexpr%>" -msgstr "é™æ€æˆå‘˜%qD声明为%<register%>" +msgstr "éžé™æ€æ•°æ®æˆå‘˜%qE被声明为%<constexpr%>" #: cp/decl.c:9485 #, gcc-internal-format @@ -31853,9 +31815,9 @@ msgid "%<inline%> specifier invalid for function %qs declared out of global scop msgstr "在全局作用域外为函数%qs指定%<inline%>æ— æ•ˆ" #: cp/decl.c:9512 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%q#T is not a class or a namespace" -msgstr "%q#T ä¸æ˜¯ç±»æˆ–命å空间" +msgstr "%q#T ä¸æ˜¯ä¸€ä¸ªç±»æˆ–命å空间" #: cp/decl.c:9520 #, gcc-internal-format @@ -31863,9 +31825,9 @@ msgid "virtual non-class function %qs" msgstr "虚函数%qsä¸æ˜¯ç±»æˆå‘˜" #: cp/decl.c:9527 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qs defined in a non-class scope" -msgstr "在éžç±»ä½œç”¨åŸŸä¸å®šä¹‰çš„ %qs" +msgstr "%qs定义在在éžç±»ä½œç”¨åŸŸä¸" #: cp/decl.c:9560 #, gcc-internal-format @@ -31929,14 +31891,14 @@ msgid "parameter %qD invalidly declared method type" msgstr "å½¢å‚%qDè¢«æ— æ•ˆåœ°è¢«å£°æ˜Žä¸ºå…·æœ‰æ–¹æ³•ç±»åž‹" #: cp/decl.c:9915 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "parameter %qD includes pointer to array of unknown bound %qT" -msgstr "å‚æ•°%qD包å«äº† %s,åŽè€…指å‘有未知边界%qT的数组" +msgstr "å½¢å‚%qD包å«äº†æŒ‡å‘具有未知边界数组%qT的指针" #: cp/decl.c:9917 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "parameter %qD includes reference to array of unknown bound %qT" -msgstr "å‚æ•°%qD包å«äº† %s,åŽè€…指å‘有未知边界%qT的数组" +msgstr "å½¢å‚%qD包å«äº†æŒ‡å‘具有未知边界数组%qT的引用" #: cp/decl.c:9932 #, gcc-internal-format @@ -31989,34 +31951,34 @@ msgid "%qD must have an argument of class or enumerated type" msgstr "%qD的实å‚必须有类或枚举类型" #: cp/decl.c:10373 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to a reference to void will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘æŒ‡å‘ void 的引用的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #: cp/decl.c:10375 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to void will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘ void 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #: cp/decl.c:10382 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to a reference to the same type will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘具有相åŒç±»åž‹çš„引用的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #: cp/decl.c:10384 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to the same type will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘相åŒç±»åž‹çš„转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #: cp/decl.c:10392 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to a reference to a base class will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘指å‘基类的引用的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #: cp/decl.c:10394 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "conversion to a base class will never use a type conversion operator" -msgstr "å‘ %s%s 的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" +msgstr "å‘基类的转æ¢æ°¸è¿œä¸ä¼šç”¨åˆ°ç±»åž‹è½¬æ¢è¿ç®—符" #. 13.4.0.3 #: cp/decl.c:10403 @@ -32322,9 +32284,9 @@ msgid "Java method %qD has non-Java parameter type %qT" msgstr "Java 方法%qDæœ‰éž Java 类型形å‚%qT" #: cp/decl2.c:596 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "template parameter lists provided don't match the template parameters of %qD" -msgstr "æ供的模æ¿å‚数列表与 %qD 的模æ¿ä¸ç¬¦" +msgstr "æ供的模æ¿å‚数列表与%qD的模æ¿å‚æ•°ä¸ç¬¦" #: cp/decl2.c:664 #, gcc-internal-format @@ -32347,9 +32309,9 @@ msgid "(an out of class initialization is required)" msgstr "(需è¦ä¸€ä¸ªç±»å¤–çš„åˆå§‹åŒ–)" #: cp/decl2.c:812 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "explicit template argument list not allowed" -msgstr "模æ¿å‚æ•° %d æ— æ•ˆ" +msgstr "ä¸å…许显å¼æ¨¡æ¿å‚数列表" #: cp/decl2.c:818 #, gcc-internal-format @@ -32466,14 +32428,14 @@ msgid "%qT declared with greater visibility than its base %qT" msgstr "%qT被声明为比其基类%qT有更高的å¯è§æ€§" #: cp/decl2.c:3441 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%q+#D, declared using anonymous type, is used but never defined" -msgstr "%q+F声明为%<static%>å´ä»Žæœªå®šä¹‰è¿‡" +msgstr "%q+#D声明为具有匿å类型,在使用å‰æœªè¢«å®šä¹‰" #: cp/decl2.c:3448 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%q+#D, declared using local type %qT, is used but never defined" -msgstr "%q+F声明为%<static%>å´ä»Žæœªå®šä¹‰è¿‡" +msgstr "%q+#D声明为具有局部类型%qT,在使用å‰æœªè¢«å®šä¹‰" #: cp/decl2.c:3740 #, gcc-internal-format @@ -32503,7 +32465,7 @@ msgstr "扩展åˆå§‹å€¼è®¾å®šåˆ—表åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" #: cp/error.c:2904 #, gcc-internal-format msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x" -msgstr "显å¼è½¬æ¢æ“作符åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" +msgstr "显å¼è½¬æ¢è¿ç®—符åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" #: cp/error.c:2909 #, gcc-internal-format @@ -32526,9 +32488,9 @@ msgid "scoped enums only available with -std=c++0x or -std=gnu++0x" msgstr "带作用域的枚举åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" #: cp/error.c:2927 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x" -msgstr "%s åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" +msgstr "é»˜è®¤åŒ–å’Œè¢«åˆ é™¤çš„å‡½æ•°åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" #. Can't throw a reference. #: cp/except.c:277 @@ -32583,9 +32545,9 @@ msgid " by earlier handler for %qT" msgstr "为%qT更早的处ç†è€…所æ•èŽ·" #: cp/except.c:1028 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%<...%> handler must be the last handler for its try block" -msgstr "%H%<...%>处ç†è€…必须是其 try å—ä¸çš„最åŽä¸€ä¸ªå¤„ç†è€…" +msgstr "%<...%>处ç†è€…必须是其 try å—ä¸çš„最åŽä¸€ä¸ªå¤„ç†è€…" #: cp/friend.c:156 #, gcc-internal-format @@ -32677,29 +32639,29 @@ msgid "value-initialization of reference" msgstr "引用被值所åˆå§‹åŒ–" #: cp/init.c:431 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qD should be initialized in the member initialization list" -msgstr "%J%qD应该在æˆå‘˜åˆå§‹åŒ–列表ä¸è¢«åˆå§‹åŒ–" +msgstr "%qD应该在æˆå‘˜åˆå§‹åŒ–列表ä¸è¢«åˆå§‹åŒ–" #: cp/init.c:457 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "value-initialization of %q#D, which has reference type" -msgstr "%J默认åˆå§‹åŒ–具有引用类型的%q#D" +msgstr "用值åˆå§‹åŒ–具有引用类型的%q#D" #: cp/init.c:498 cp/init.c:515 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "uninitialized member %qD with %<const%> type %qT" -msgstr "%J未åˆå§‹åŒ–çš„æˆå‘˜%qD具有%<const%>类型%qT" +msgstr "未åˆå§‹åŒ–çš„æˆå‘˜%qD具有%<const%>类型%qT" #: cp/init.c:511 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "uninitialized reference member %qD" -msgstr "æˆå‘˜%qD是未åˆå§‹åŒ–的引用" +msgstr "未åˆå§‹åŒ–的引用æˆå‘˜%qD" #: cp/init.c:660 #, gcc-internal-format msgid "%q+D will be initialized after" -msgstr "%q+Då°†éšåŽè¢«åˆå§‹åŒ–" +msgstr "%q+D将在" #: cp/init.c:663 #, gcc-internal-format @@ -32714,32 +32676,32 @@ msgstr "%q+#D" #: cp/init.c:668 #, gcc-internal-format msgid " base %qT" -msgstr " 基类%qT" +msgstr "基类%qT" #: cp/init.c:670 #, gcc-internal-format msgid " when initialized here" -msgstr " 当在这里åˆå§‹åŒ–æ—¶" +msgstr "在æ¤å¤„åˆå§‹åŒ–åŽè¢«åˆå§‹åŒ–" #: cp/init.c:687 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "multiple initializations given for %qD" -msgstr "%J为%qD给定了多个åˆå§‹åŒ–设定" +msgstr "为%qD给定了多个åˆå§‹åŒ–设定" #: cp/init.c:691 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "multiple initializations given for base %qT" -msgstr "%J为基类%qT给定了多个åˆå§‹åŒ–设定" +msgstr "为基类%qT给定了多个åˆå§‹åŒ–设定" #: cp/init.c:759 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "initializations for multiple members of %qT" -msgstr "%Jåˆå§‹åŒ–%qT的多个æˆå‘˜" +msgstr "åˆå§‹åŒ–%qT的多个æˆå‘˜" #: cp/init.c:823 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "base class %q#T should be explicitly initialized in the copy constructor" -msgstr "%J基类%q#T应该在å¤åˆ¶æž„é€ å‡½æ•°ä¸æ˜¾å¼åœ°åˆå§‹åŒ–" +msgstr "基类%q#T应该在å¤åˆ¶æž„é€ å‡½æ•°ä¸æ˜¾å¼åœ°åˆå§‹åŒ–" #: cp/init.c:1047 cp/init.c:1066 #, gcc-internal-format @@ -32842,9 +32804,9 @@ msgid "request for member %qD is ambiguous" msgstr "对æˆå‘˜%qD的请求有æ§ä¹‰" #: cp/init.c:2125 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "non-constant array size in new, unable to verify length of initializer-list" -msgstr "在新的内éžå¸¸æ•°æ•°ç»„大å°ï¼Œä¸èƒ½æ ¸å¯¹åˆå§‹åŒ–器列表的长度" +msgstr "new ä¸æ•°ç»„大å°ä¸æ˜¯å¸¸é‡ï¼Œæ— 法检查åˆå§‹å€¼åˆ—表的长度" #: cp/init.c:2134 #, gcc-internal-format @@ -33012,39 +32974,39 @@ msgid "synthesized method %qD first required here " msgstr "在这里第一次需è¦ç”Ÿæˆçš„方法%qD" #: cp/method.c:1015 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "defaulted declaration %q+D" -msgstr "默认的声明 %q+D" +msgstr "默认化声明%q+D" #: cp/method.c:1017 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "does not match expected signature %qD" -msgstr "å½¢å‚表ä¸åŒ¹é… %s() 的有效ç¾å" +msgstr "ä¸åŒ¹é…%qD预期的ç¾å" #: cp/method.c:1049 #, gcc-internal-format msgid "%qD cannot be defaulted" -msgstr "%qDä¸èƒ½ä½œä¸ºé»˜è®¤" +msgstr "%qDä¸èƒ½è¢«é»˜è®¤åŒ–" #: cp/method.c:1058 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "defaulted function %q+D with default argument" -msgstr "%H文件在默认å‚数处结æŸ" +msgstr "默认化函数%q+D有默认å‚æ•°" #: cp/method.c:1064 #, gcc-internal-format msgid "%qD declared explicit cannot be defaulted in the class body" -msgstr "声明为 explicit çš„%qDä¸èƒ½åœ¨ç±»ä½“内指定默认值" +msgstr "声明为 explicit çš„%qDä¸èƒ½åœ¨ç±»ä½“内被默认化" #: cp/method.c:1067 #, gcc-internal-format msgid "%qD declared with non-public access cannot be defaulted in the class body" -msgstr "声明有éžå…¬å…±è®¿é—®æƒé™çš„%qDä¸èƒ½åœ¨ç±»ä½“内指定默认值" +msgstr "声明有éžå…¬å…±è®¿é—®æƒé™çš„%qDä¸èƒ½åœ¨ç±»ä½“内被默认化" #: cp/method.c:1070 #, gcc-internal-format msgid "function %q+D defaulted on its first declaration must not have an exception-specification" -msgstr "" +msgstr "首次声明时被默认化的函数%q+Dä¸å¯ä»¥æŒ‡å®šå¼‚常" #: cp/method.c:1119 #, gcc-internal-format @@ -33131,12 +33093,12 @@ msgstr "%qDçš„å称查阅已改å˜" #: cp/name-lookup.c:1214 #, gcc-internal-format msgid " matches this %q+D under ISO standard rules" -msgstr " 在 ISO æ ‡å‡†è§„åˆ™ä¸‹åŒ¹é…æ¤%q+D" +msgstr "在 ISO æ ‡å‡†è§„åˆ™ä¸‹åŒ¹é…æ¤%q+D" #: cp/name-lookup.c:1216 #, gcc-internal-format msgid " matches this %q+D under old rules" -msgstr " 在旧规则下匹é…æ¤%q+D" +msgstr "在旧规则下匹é…æ¤%q+D" #: cp/name-lookup.c:1234 cp/name-lookup.c:1242 #, gcc-internal-format @@ -33146,12 +33108,12 @@ msgstr "在 ISO%<for%>作用域ä¸ï¼Œ%qDçš„å称查找有å˜åŒ–" #: cp/name-lookup.c:1236 #, gcc-internal-format msgid " cannot use obsolete binding at %q+D because it has a destructor" -msgstr " ä¸èƒ½åœ¨%q+Dä½¿ç”¨è¿‡æ—¶çš„ç»‘å®šï¼Œå› ä¸ºå®ƒæœ‰æžæž„函数" +msgstr "ä¸èƒ½åœ¨%q+Dä½¿ç”¨è¿‡æ—¶çš„ç»‘å®šï¼Œå› ä¸ºå®ƒæœ‰æžæž„函数" #: cp/name-lookup.c:1245 #, gcc-internal-format msgid " using obsolete binding at %q+D" -msgstr " 在%q+D使用过时的绑定" +msgstr "在%q+D使用过时的绑定" #: cp/name-lookup.c:1251 cp/parser.c:10890 #, gcc-internal-format @@ -33304,9 +33266,9 @@ msgid "XXX leaving pop_everything ()\n" msgstr "XXX 离开 pop_everything ()\n" #: cp/parser.c:435 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "identifier %qE will become a keyword in C++0x" -msgstr "æ ‡å¿—ç¬¦%<%s%>将会æˆä¸º C++0x 的一个关键å—" +msgstr "æ ‡å¿—ç¬¦%qE将会æˆä¸º C++0x 的一个关键å—" #: cp/parser.c:2100 #, gcc-internal-format @@ -33434,7 +33396,7 @@ msgstr "且%qT没有模æ¿æž„é€ å‡½æ•°" #: cp/parser.c:2415 #, gcc-internal-format msgid "need %<typename%> before %<%T::%E%> because %qT is a dependent scope" -msgstr "" +msgstr "%<%T::%E%>之å‰éœ€è¦%<typename%>ï¼Œå› ä¸º%qT是一个有ä¾èµ–的作用域" #: cp/parser.c:2419 #, gcc-internal-format @@ -33521,7 +33483,7 @@ msgstr "使用旧å¼çš„类型转æ¢" #: cp/parser.c:6349 #, gcc-internal-format msgid "%<>>%> operator will be treated as two right angle brackets in C++0x" -msgstr "%<>>%>æ“作符在 C++0x ä¸å°†è¢«è®¤ä¸ºæ˜¯ä¸¤ä¸ªå³å°–括å·" +msgstr "%<>>%>è¿ç®—符在 C++0x ä¸å°†è¢«è®¤ä¸ºæ˜¯ä¸¤ä¸ªå³å°–括å·" #: cp/parser.c:6352 #, gcc-internal-format @@ -33556,7 +33518,7 @@ msgstr "case æ ‡å·%qE未出现在 switch è¯å¥ä¸" #: cp/parser.c:7811 #, gcc-internal-format msgid "need %<typename%> before %qE because %qT is a dependent scope" -msgstr "" +msgstr "%qE之å‰éœ€è¦%<typename%>ï¼Œå› ä¸º%qT是一个有ä¾èµ–的作用域" #: cp/parser.c:7820 #, gcc-internal-format @@ -33609,7 +33571,7 @@ msgstr "模æ¿ä¸èƒ½æ˜¯%<virtual%>çš„" #: cp/parser.c:9771 #, gcc-internal-format msgid "invalid use of %<auto%> in conversion operator" -msgstr "在转æ¢æ“作符ä¸ä½¿ç”¨%<auto%>æ— æ•ˆ" +msgstr "在转æ¢è¿ç®—符ä¸ä½¿ç”¨%<auto%>æ— æ•ˆ" #: cp/parser.c:9856 #, gcc-internal-format @@ -33864,9 +33826,9 @@ msgid "keyword %<typename%> not allowed in this context (the base class is impli msgstr "关键å—%<typename%>ä¸å…许用在æ¤ä¸Šä¸‹æ–‡ä¸(基类éšå¼åœ°æ˜¯ä¸€ä¸ªç±»åž‹)" #: cp/parser.c:18286 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "specializing member %<%T::%E%> requires %<template<>%> syntax" -msgstr "å‘现 %d 个%<template<>%>ï¼Œéœ€è¦ %d æ¥ç‰¹ä¾‹åŒ–一个æˆå‘˜å‡½æ•°æ¨¡æ¿" +msgstr "特例化æˆå‘˜%<%T::%E%>需è¦%<template<>%>è¯æ³•" #: cp/parser.c:18291 #, gcc-internal-format @@ -33953,7 +33915,7 @@ msgid "misplaced %<@%D%> Objective-C++ construct" msgstr "ä½ç½®é”™è¯¯çš„%<@%D%>Objective-C++ æž„é€ " #: cp/parser.c:20263 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%<@encode%> must specify a type as an argument" msgstr "%<@encode%>必须指定一个类型作为实å‚" @@ -33978,9 +33940,9 @@ msgid "iteration variable %qD should not be reduction" msgstr "è¿ä»£å˜é‡%qDä¸åº”当是 reduction" #: cp/parser.c:22484 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "not enough collapsed for loops" -msgstr "折å 的循环没有完美的嵌套" +msgstr "循环折å å¾—ä¸å¤Ÿ" #: cp/parser.c:22946 #, gcc-internal-format @@ -34275,12 +34237,12 @@ msgstr "得到 %d 个模æ¿å‚数,为%q#D" #: cp/pt.c:4407 #, gcc-internal-format msgid "got %d template parameters for %q#T" -msgstr "得到 %d 个模æ¿å‚数,为%q#T" +msgstr "%2$q#T得到了 %1$d 个模æ¿å‚æ•°" #: cp/pt.c:4409 #, gcc-internal-format msgid " but %d required" -msgstr " ä½†å®žé™…éœ€è¦ %d 个" +msgstr "ä½†å®žé™…éœ€è¦ %d 个" #: cp/pt.c:4427 #, gcc-internal-format @@ -34342,9 +34304,9 @@ msgid "%qE is not a valid template argument for type %qT because function %qD ha msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå‡½æ•°%qD没有外部链接" #: cp/pt.c:4722 cp/pt.c:5009 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE is not a valid template argument for type %qT" -msgstr "%qE ä¸æ˜¯ç±»åž‹ %qT 的有效模æ¿å‚æ•°" +msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å‚æ•°" #: cp/pt.c:4724 #, gcc-internal-format @@ -34387,14 +34349,14 @@ msgid "%qE is not a valid template argument for type %qT because it is not an lv msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå®ƒä¸æ˜¯ä¸€ä¸ªå·¦å€¼" #: cp/pt.c:4960 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%q#D is not a valid template argument for type %qT because a reference variable does not have a constant address" -msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå®ƒæ˜¯ä¸€ä¸ªéžå¸¸é‡çš„表达å¼" +msgstr "%q#Dä¸æ˜¯ç±»åž‹%qT的有效模æ¿å‚æ•°ï¼Œå› ä¸ºä¸€ä¸ªå¼•ç”¨å˜é‡æ²¡æœ‰å¸¸é‡åœ°å€" #: cp/pt.c:4969 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "%qE is not a valid template argument for type %qT because it is not an object with external linkage" -msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå¯¹è±¡%qD没有外部链接" +msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå®ƒæ²¡æœ‰å¤–éƒ¨é“¾æŽ¥" #: cp/pt.c:4977 #, gcc-internal-format @@ -34402,7 +34364,7 @@ msgid "%qE is not a valid template argument for type %qT because object %qD has msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå¯¹è±¡%qD没有外部链接" #: cp/pt.c:5010 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "it must be the address of a function with external linkage" msgstr "它必须是一个具有外部链接函数的地å€" @@ -34427,9 +34389,9 @@ msgid "standard conversions are not allowed in this context" msgstr "æ¤ä¸Šä¸‹æ–‡ä¸ä¸å…è®¸æ ‡å‡†è½¬æ¢" #: cp/pt.c:5402 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "injected-class-name %qD used as template template argument" -msgstr "ç±»åéšè—了模æ¿çš„模æ¿å½¢å‚%qD" +msgstr "注入的类å%qD被用作模æ¿çš„模æ¿å‚æ•°" #: cp/pt.c:5427 #, gcc-internal-format @@ -34444,37 +34406,37 @@ msgstr "å®žå‚ %d 的类型/值ä¸åŒ¹é…,在%qD的模æ¿å‚数列表ä¸" #: cp/pt.c:5447 #, gcc-internal-format msgid " expected a constant of type %qT, got %qT" -msgstr " 需è¦ä¸€ä¸ª%qT类型的常é‡ï¼Œå´ç»™å‡ºäº†%qT" +msgstr "需è¦ä¸€ä¸ª%qT类型的常é‡ï¼Œå´ç»™å‡ºäº†%qT" #: cp/pt.c:5451 #, gcc-internal-format msgid " expected a class template, got %qE" -msgstr " 需è¦ä¸€ä¸ªç±»æ¨¡æ¿ï¼Œå´ç»™å‡ºäº†%qE" +msgstr "需è¦ä¸€ä¸ªç±»æ¨¡æ¿ï¼Œå´ç»™å‡ºäº†%qE" #: cp/pt.c:5453 #, gcc-internal-format msgid " expected a type, got %qE" -msgstr " 需è¦ä¸€ä¸ªç±»åž‹ï¼Œå´ç»™å‡ºäº†%qE" +msgstr "需è¦ä¸€ä¸ªç±»åž‹ï¼Œå´ç»™å‡ºäº†%qE" #: cp/pt.c:5466 #, gcc-internal-format msgid " expected a type, got %qT" -msgstr " 需è¦ä¸€ä¸ªç±»åž‹ï¼Œå´ç»™å‡ºäº†%qT" +msgstr "需è¦ä¸€ä¸ªç±»åž‹ï¼Œå´ç»™å‡ºäº†%qT" #: cp/pt.c:5468 #, gcc-internal-format msgid " expected a class template, got %qT" -msgstr " 需è¦ä¸€ä¸ªç±»æ¨¡æ¿ï¼Œå´ç»™å‡ºäº†%qT" +msgstr "需è¦ä¸€ä¸ªç±»æ¨¡æ¿ï¼Œå´ç»™å‡ºäº†%qT" #: cp/pt.c:5511 #, gcc-internal-format msgid " expected a template of type %qD, got %qT" -msgstr " 需è¦æœ‰%qD类型的模æ¿ï¼Œå´å¾—到了%qT" +msgstr "需è¦æœ‰%qD类型的模æ¿ï¼Œå´å¾—到了%qT" #. Not sure if this is reachable, but it doesn't hurt #. to be robust. #: cp/pt.c:5551 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "type mismatch in nontype parameter pack" msgstr "éžç±»åž‹å‚数包ä¸ç±»åž‹ä¸åŒ¹é…" @@ -34511,7 +34473,7 @@ msgstr "æ— æ³•å°†%<%T%>展开æˆå®šé•¿å®žå‚列表" #: cp/pt.c:5857 #, gcc-internal-format msgid "template argument %d is invalid" -msgstr "模æ¿å‚æ•° %d æ— æ•ˆ" +msgstr "模æ¿ç¬¬ %d 个å‚æ•°æ— æ•ˆ" #: cp/pt.c:6179 #, gcc-internal-format @@ -34652,9 +34614,9 @@ msgid "use of %qs in template" msgstr "在模æ¿ä¸ä½¿ç”¨%qs" #: cp/pt.c:10524 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "qualifying type %qT does not match destructor name ~%qT" -msgstr "é™å®šçš„类型%qTä¸åŒ¹é…æžæž„函数å ~%qT" +msgstr "é™å®šç±»åž‹%qTä¸åŒ¹é…æžæž„函数å ~%qT" #: cp/pt.c:10539 #, gcc-internal-format @@ -34814,9 +34776,9 @@ msgid "%q#T is not a valid type for a template constant parameter" msgstr "%q#Tä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„模æ¿å¸¸é‡å‚数类型" #: cp/pt.c:17999 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "deducing from brace-enclosed initializer list requires #include <initializer_list>" -msgstr "从花括å·ä¸çš„åˆå§‹åŒ–列表推导 auto éœ€è¦ #include <initializer_list>" +msgstr "从花括å·ä¸çš„åˆå§‹åŒ–åˆ—è¡¨æ¼”ç»Žéœ€è¦ #include <initializer_list>" #: cp/pt.c:18049 #, gcc-internal-format @@ -34826,7 +34788,7 @@ msgstr "æ— æ³•ä»Ž%2$qE推导出%1$qT" #: cp/pt.c:18060 #, gcc-internal-format msgid "inconsistent deduction for %qT: %qT and then %qT" -msgstr "" +msgstr "对%qTä¸ä¸€è‡´çš„演绎:先是%qT然åŽæ˜¯%qT" #: cp/repo.c:119 #, gcc-internal-format @@ -34886,12 +34848,12 @@ msgstr "%qT是%qTä¸å¯è®¿é—®çš„基类" #: cp/search.c:1841 #, gcc-internal-format msgid "deprecated covariant return type for %q+#D" -msgstr "ä¸å»ºè®®ä¸º%q+#D使用åå˜è¿”回类型" +msgstr "ä¸å»ºè®®ä¸º%q+#D使用的åå˜è¿”回类型" #: cp/search.c:1843 cp/search.c:1858 cp/search.c:1863 cp/search.c:1882 #, gcc-internal-format msgid " overriding %q+#D" -msgstr " 覆盖了%q+#D" +msgstr "覆盖了%q+#D" #: cp/search.c:1857 #, gcc-internal-format @@ -34906,12 +34868,12 @@ msgstr "为%q+#D指定了冲çªçš„返回类型" #: cp/search.c:1872 #, gcc-internal-format msgid "looser throw specifier for %q+#F" -msgstr "放æ¾%q+#Fçš„ throw é™å®š" +msgstr "对%q+#F放æ¾çš„ throw é™å®š" #: cp/search.c:1873 #, gcc-internal-format msgid " overriding %q+#F" -msgstr " 覆盖了%q+#F" +msgstr "覆盖了%q+#F" #: cp/search.c:1881 #, gcc-internal-format @@ -34943,7 +34905,7 @@ msgstr "æ— æ³•å£°æ˜Ž%q+#D" #: cp/search.c:1990 #, gcc-internal-format msgid " since %q+#D declared in base class" -msgstr " å› ä¸º%q+#D已在基类ä¸å£°æ˜Žè¿‡" +msgstr "å› ä¸º%q+#D已在基类ä¸å£°æ˜Žè¿‡" #: cp/semantics.c:762 #, gcc-internal-format @@ -34998,7 +34960,7 @@ msgstr "在éžæˆå‘˜å‡½æ•°ä¸ä½¿ç”¨%<this%>æ— æ•ˆ" #: cp/semantics.c:2127 #, gcc-internal-format msgid "invalid use of %<this%> at top level" -msgstr "在文件层使用%<this%>æ— æ•ˆ" +msgstr "在文件作用域使用%<this%>æ— æ•ˆ" #: cp/semantics.c:2151 #, gcc-internal-format @@ -35182,9 +35144,9 @@ msgid "%<threadprivate%> %qE directive not in %qT definition" msgstr "%<threadprivate%>%qE指示ä¸åœ¨%qT定义ä¸" #: cp/semantics.c:4160 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "difference between %qE and %qD does not have integer type" -msgstr "%H%qEå’Œ%qD之间的差ä¸å…·æœ‰æ•´æ•°ç±»åž‹" +msgstr "%qEå’Œ%qD之间的差ä¸å…·æœ‰æ•´æ•°ç±»åž‹" #. Report the error. #: cp/semantics.c:4686 @@ -35223,9 +35185,9 @@ msgid "incomplete type %qT not allowed" msgstr "ä¸å…许ä¸å®Œå…¨ç±»åž‹%qT" #: cp/semantics.c:5306 -#, fuzzy, gcc-internal-format +#, gcc-internal-format msgid "the type %qT of constexpr variable %qD is not literal" -msgstr "函数%2$qD的返回值类型%1$qTä¸æ˜¯ä¸€ä¸ªå—é¢ç±»åž‹" +msgstr "constexpr å˜é‡%2$qD的类型%1$qTä¸æ˜¯å—é¢å¸¸é‡" #: cp/semantics.c:5341 #, gcc-internal-format @@ -35627,12 +35589,12 @@ msgstr "å– %s%qE的地å€" #: cp/typeck.c:4311 #, gcc-internal-format msgid "invalid use of %qE to form a pointer-to-member-function" -msgstr "用%qEå½¢æˆæˆå‘˜å‡½æ•°æŒ‡é’ˆçš„ç”¨æ³•æ— æ•ˆã€‚" +msgstr "用%qEå½¢æˆæˆå‘˜å‡½æ•°æŒ‡é’ˆçš„ç”¨æ³•æ— æ•ˆ" #: cp/typeck.c:4314 #, gcc-internal-format msgid " a qualified-id is required" -msgstr " 需è¦ä¸€ä¸ªé™å®šçš„æ ‡è¯†ç¬¦" +msgstr "需è¦ä¸€ä¸ªé™å®šçš„æ ‡è¯†ç¬¦" #: cp/typeck.c:4319 #, gcc-internal-format @@ -35677,7 +35639,7 @@ msgstr "ISO C++ ä¸å…许对类型为%qT的指针自å‡" #: cp/typeck.c:4668 #, gcc-internal-format msgid "invalid use of Boolean expression as operand to %<operator--%>" -msgstr "布尔表达å¼ä¸èƒ½ç”¨ä½œ%<æ“作符--%>çš„æ“作数" +msgstr "布尔表达å¼ä¸èƒ½ç”¨ä½œ%<è¿ç®—符--%>çš„æ“作数" #: cp/typeck.c:4703 #, gcc-internal-format @@ -35817,7 +35779,7 @@ msgstr "å‘函数类型%qT的转æ¢æ— 效" #: cp/typeck.c:6300 #, gcc-internal-format msgid " in evaluation of %<%Q(%#T, %#T)%>" -msgstr " 在求%<%Q(%#T, %#T)%>值时" +msgstr "在求%<%Q(%#T, %#T)%>值时" #: cp/typeck.c:6358 #, gcc-internal-format @@ -35837,7 +35799,7 @@ msgstr "æ— æ•ˆçš„æ•°ç»„èµ‹å€¼" #: cp/typeck.c:6474 #, gcc-internal-format msgid " in pointer to member function conversion" -msgstr " 在æˆå‘˜å‡½æ•°æŒ‡é’ˆè½¬æ¢ä¸" +msgstr "在æˆå‘˜å‡½æ•°æŒ‡é’ˆè½¬æ¢ä¸" #: cp/typeck.c:6485 #, gcc-internal-format @@ -35847,7 +35809,7 @@ msgstr "æˆå‘˜æŒ‡é’ˆè½¬æ¢ç»ç”±è™šåŸºç±»%qT" #: cp/typeck.c:6525 cp/typeck.c:6538 #, gcc-internal-format msgid " in pointer to member conversion" -msgstr " 在æˆå‘˜æŒ‡é’ˆè½¬æ¢ä¸" +msgstr "在æˆå‘˜æŒ‡é’ˆè½¬æ¢ä¸" #: cp/typeck.c:6616 #, gcc-internal-format @@ -35915,12 +35877,12 @@ msgstr "æž„é€ å‡½æ•°è¿”å›žå€¼" #: cp/typeck.c:7144 #, gcc-internal-format msgid "lambda return type can only be deduced when the return statement is the only statement in the function body" -msgstr "" +msgstr "åªæœ‰å½“返回è¯å是函数体ä¸å”¯ä¸€ä¸€æ¡è¯å¥æ—¶æ‰èƒ½æ¼”绎 Lambda 返回类型" #: cp/typeck.c:7150 #, gcc-internal-format msgid "inconsistent types %qT and %qT deduced for lambda return type" -msgstr "" +msgstr "Lambda 返回类型演绎得到ä¸ä¸€è‡´çš„类型%qTå’Œ%qT" #: cp/typeck.c:7176 #, gcc-internal-format @@ -35950,7 +35912,7 @@ msgstr "å‘åªè¯»ç»“æž„çš„æ•°æ®æˆå‘˜%qD赋值" #: cp/typeck2.c:108 #, gcc-internal-format msgid "assignment (via 'asm' output) of data-member %qD in read-only structure" -msgstr "" +msgstr "通过‘asm’输出å‘åªè¯»ç»“æž„çš„æ•°æ®æˆå‘˜%qD赋值" #: cp/typeck2.c:110 #, gcc-internal-format @@ -36725,7 +36687,7 @@ msgstr "æ— æ³•æ‰“å¼€æ–‡ä»¶ %s" #: lto/lto-elf.c:587 #, gcc-internal-format msgid "ELF library is older than that used when building GCC" -msgstr "" +msgstr "ELF 库比构建 GCC 时所使用的还è¦æ—§" #: lto/lto-elf.c:596 #, gcc-internal-format @@ -36780,7 +36742,7 @@ msgstr "-fwpa å’Œ -fltrans 互斥" #: lto/lto.c:244 #, gcc-internal-format msgid "bytecode stream: garbage at the end of symbols section" -msgstr "" +msgstr "å—节ç æµï¼šç¬¦å·èŠ‚结尾有垃圾å—符" #: lto/lto.c:268 #, gcc-internal-format diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index da700243eac..7e55a57ba48 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,172 @@ +2009-12-18 Shujing Zhao <pearly.zhao@oracle.com> + + * g++.old-deja/g++.brendan/misc6.C: Make expected dg-error strings + explicit. + +2009-12-17 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/debug/dwarf2/const-1.c: Don't expect DW_AT_const_value, + but instead DW_AT_location with DW_OP_addr+DW_OP_stack_value. Add + -gno-strict-dwarf -fno-merge-debug-strings to dg-options. + * g++.dg/debug/dwarf2/const1.C: Likewise. + * g++.dg/debug/dwarf2/template-params-3.C: Likewise. + * g++.dg/debug/dwarf2/template-func-params-3.C: Likewise. + +2009-12-17 Alexandre Oliva <aoliva@redhat.com> + + PR debug/41679 + * gcc.target/arm/pr41679.c: New. + +2009-12-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/42386 + * g++.dg/opt/dtor3.C: New test. + +2009-12-17 Arnaud Charlet <charlet@adacore.com> + + * ada/acats/run_all.sh: Strip comments from norun.lst + +2009-12-17 Uros Bizjak <ubizjak@gmail.com> + + PR target/32280 + * gcc.target/i386/pr32280-1.c: New test. + +2009-12-17 Uros Bizjak <ubizjak@gmail.com> + + * objc/execute/forward-1.x: XFAIL for -fgnu-runtime on + x86_64-*-darwin*, powerpc*-*-darwin* and alpha*-*-linux* targets. + +2009-12-17 Janus Weil <janus@gcc.gnu.org> + + PR fortran/42144 + * gfortran.dg/dynamic_dispatch_6.f03: New test. + +2009-12-17 Shujing Zhao <pearly.zhao@oracle.com> + + * g++.old-deja/g++.mike/net31.C: Make expected dg-error strings + explicit. + * g++.old-deja/g++.bugs/900213_02.C: Likewise. + * g++.old-deja/g++.bugs/900215_02.C: Likewise. + +2009-12-16 Richard Guenther <rguenther@suse.de> + + PR lto/42392 + * gcc.dg/lto/20091216-1_0.c: New testcase. + +2009-12-15 Jason Merrill <jason@redhat.com> + + PR c++/42387 + * g++.dg/ext/vla8.C: New. + +2009-12-16 Jakub Jelinek <jakub@redhat.com> + + * gcc.c-torture/compile/20091215-1.c: New test. + + * gcc.dg/debug/tls-1.c: New test. + +2009-12-15 Jason Merrill <jason@redhat.com> + + PR c++/42358 + * g++.dg/cpp0x/variadic98.C: New. + +2009-12-14 Jason Merrill <jason@redhat.com> + + PR c++/42373 + * g++.dg/cpp0x/lambda/lambda-mangle.C: Adjust regexps for darwin. + +2009-12-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * ada/acats/norun.lst: Sort. + +2009-12-15 Jakub Jelinek <jakub@redhat.com> + + PR c++/41183 + * g++.dg/torture/pr41183.C: New test. + +2009-12-15 Tobias Burnus <burnus@net-b.de> + + PR fortran/41235 + * gfortran.dg/auto_char_len_1.f90: New test. + * gfortran.dg/auto_char_len_2.f90: New test. + * gfortran.dg/auto_char_len_4.f90: Correct test. + +2009-12-14 Jason Merrill <jason@redhat.com> + + PR c++/42364 + * g++.dg/cpp0x/variadic31.C: Compile with -g. + * g++.dg/ext/attrib33.C: Likewise. + +2009-12-15 Shujing Zhao <pearly.zhao@oracle.com> + + * g++.dg/other/error20.C: Adjust dg-message strings. + * g++.dg/other/error31.C: Likewise. + * g++.dg/rtti/typeid6.C: Likewise. + * g++.dg/ext/ms-1.C: Likewise. + * g++.dg/parse/error19.C: Likewise. + * g++.dg/parse/crash5.C: Likewise. + * g++.dg/cpp0x/explicit4.C: Likewise. + * g++.dg/template/ptrmem4.C: Likewise. + * g++.dg/template/crash37.C: Likewise. + * g++.dg/template/qualttp5.C: Likewise. + * g++.dg/template/local6.C: Likewise. + * g++.dg/template/instantiate5.C: Likewise. + * g++.old-deja/g++.brendan/overload1.C: Likewise. + * g++.old-deja/g++.brendan/cvt3.C: Likewise. + * g++.old-deja/g++.brendan/overload4.C: Likewise. + * g++.old-deja/g++.jason/conversion11.C: Likewise. + * g++.old-deja/g++.jason/scoping10.C: Likewise. + * g++.old-deja/g++.other/expr1.C: Likewise. + * g++.old-deja/g++.other/pmf3.C: Likewise. + * g++.old-deja/g++.other/crash24.C: Likewise. + * g++.old-deja/g++.niklas/t120.C: Likewise. + * g++.old-deja/g++.niklas/t121.C: Likewise. + * g++.old-deja/g++.law/operators9.C: Likewise. + * g++.old-deja/g++.law/arm9.C: Likewise. + * g++.old-deja/g++.law/enum4.C: Likewise. + * g++.old-deja/g++.law/arg11.C: Likewise. + * g++.old-deja/g++.benjamin/15800-1.C: Likewise. + * g++.old-deja/g++.mike/p2431.C: Likewise. + * g++.old-deja/g++.mike/p438.C: Likewise. + * g++.old-deja/g++.mike/p9068.C: Likewise. + * g++.old-deja/g++.mike/p11110.C: Likewise. + * g++.old-deja/g++.bugs/900330_02.C: Likewise. + +2009-12-14 Uros Bizjak <ubizjak@gmail.com> + + * g++.dg/other/i386-2.C: Add -mpopcnt -mabm -mlwp to dg-options. + * g++.dg/other/i386-3.C: Ditto. + * g++.dg/other/i386-5.C: Remove duplicated test. + * g++.dg/other/i386-6.C: Ditto. + +2009-12-14 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/42354 + * gfortran.dg/iso_c_binding_init_expr.f03: New. + * gfortran.dg/intrinsic_std_1.f90: Fixed expected error message. + * gfortran.dg/function_kinds_5.f90: Likewise. + * gfortran.dg/selected_char_kind_3.f90: Likewise. + +2009-12-14 Dominique d'Humieres <dominiq@lps.ens.fr> + + * gfortran.dg/boz_15.f90: Fix typos. + +2009-12-14 Jakub Jelinek <jakub@redhat.com> + Sebastian Pop <sebastian.pop@amd.com> + + * gcc.target/i386/sse-12.c: Add -mpopcnt and -mlwp. + * gcc.target/i386/sse-13.c: Same. + (__builtin_ia32_lwpval32, __builtin_ia32_lwpval64, + __builtin_ia32_lwpins32, __builtin_ia32_lwpins64): Added testcases. + * gcc.target/i386/sse-14.c: Add -mpopcnt -mabm -mlwp. + Added tests for __lwpval32, __lwpins32, __lwpval64, and __lwpins64. + * gcc.target/i386/sse-22.c: Added tests for popcnt, abm, and lwp. + * gcc.target/i386/sse-23.c: Same. + +2009-12-14 Sebastian Pop <sebpop@gmail.com> + + PR middle-end/42284 + * testsuite/gcc.dg/graphite/pr42284.c: New. + 2009-12-13 Richard Guenther <rguenther@suse.de> PR tree-optimization/42357 @@ -80,7 +249,7 @@ * gfortran.dg/typebound_proc_13.f03: New test. 2009-12-08 Olga Golovanevsky <olga@il.ibm.com> - Jakub Jelinek <jakub@redhat.com> + Jakub Jelinek <jakub@redhat.com> PR midle-end/41843 * gcc.dg/struct/wo_prof_empty_str.c: New testcase. @@ -224,7 +393,7 @@ PR c++/41611 * g++.dg/abi/guard1.C: New. -2009-12-91 Uros Bizjak <ubizjak@gmail.com> +2009-12-01 Uros Bizjak <ubizjak@gmail.com> * gcc.target/i386/vperm-v4sf-1.c (dg-options): Use -msse. @@ -538,7 +707,7 @@ * gcc-dg/raw-string-2.c: Ditto. * gcc-dg/utf-array-short-wchar.c: Ditto. * gcc-dg/utf-array.c: Ditto. - * gcc-dg/utf8-2.c: Ditto. + * gcc-dg/utf8-2.c: Ditto. 2009-11-23 Andy Hutchinson <hutchinsonandy@gcc.gnu.org> @@ -764,7 +933,7 @@ * gcc.misc-tests/linkage.exp: Also check -m32 for i*86-*-linux*. 2009-11-18 Nick Clifton <nickc@redhat.com> - + * g++.dg/lto/20091002-1_0.C: Replace -shared with -r -nostlib. * g++.dg/lto/20081120-1_0.C: Likewise. * g++.dg/lto/20091002-2_0.C: Likewise. @@ -1179,7 +1348,7 @@ * g++.dg/other/i386-3.C: Ditto. * g++.dg/other/i386-5.C: Ditto. * g++.dg/other/i386-6.C: Ditto. - + 2009-11-04 Wei Guozhi <carrot@google.com> PR target/40835 diff --git a/gcc/testsuite/ada/acats/norun.lst b/gcc/testsuite/ada/acats/norun.lst index c0b08e42c07..e9f64b4ded9 100644 --- a/gcc/testsuite/ada/acats/norun.lst +++ b/gcc/testsuite/ada/acats/norun.lst @@ -1,2 +1,2 @@ -templat # Tests must be sorted in alphabetical order +templat diff --git a/gcc/testsuite/ada/acats/run_all.sh b/gcc/testsuite/ada/acats/run_all.sh index e28ec7a838a..92446fa875a 100755 --- a/gcc/testsuite/ada/acats/run_all.sh +++ b/gcc/testsuite/ada/acats/run_all.sh @@ -129,6 +129,7 @@ sed -e "s,ACATS4GNATDIR,$dir,g" \ cp $testdir/tests/cd/*.c $dir/support cp $testdir/tests/cxb/*.c $dir/support +grep -v '^#' $testdir/norun.lst > $dir/support/norun.lst rm -rf $dir/run mv $dir/tests $dir/tests.$$ 2> /dev/null @@ -206,7 +207,7 @@ for chapter in $chapters; do cd $dir/tests/$chapter ls *.a *.ada *.adt *.am *.dep 2> /dev/null | sed -e 's/\(.*\)\..*/\1/g' | \ - cut -c1-7 | sort | uniq | comm -23 - $testdir/norun.lst \ + cut -c1-7 | sort | uniq | comm -23 - $dir/support/norun.lst \ > $dir/tests/$chapter/${chapter}.lst countn=`wc -l < $dir/tests/$chapter/${chapter}.lst` glob_countn=`expr $glob_countn + $countn` diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit4.C b/gcc/testsuite/g++.dg/cpp0x/explicit4.C index 74726a99cad..67c60f67928 100644 --- a/gcc/testsuite/g++.dg/cpp0x/explicit4.C +++ b/gcc/testsuite/g++.dg/cpp0x/explicit4.C @@ -2,7 +2,7 @@ // { dg-options "-std=c++0x" } struct A { - A(const A&, int = 0); // { dg-message "candidates" } + A(const A&, int = 0); // { dg-message "candidate" } }; struct B { diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C index aa7462b4fcf..12aa8491118 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -1,4 +1,5 @@ // Test lambda mangling +// { dg-require-weak "" } // { dg-options "-std=c++0x -fno-inline" } template<typename F> int algo(F fn) { return fn(); } @@ -10,7 +11,7 @@ inline void g(int n) { // The call operator of that type is _ZZ1giENKUlvE_clEv. // { dg-final { scan-assembler "_ZZ1giENUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZ1giENUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1giENUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } algo([=]{return n+bef();}); // The captured entities do not participate in <lambda-sig> @@ -32,7 +33,7 @@ struct S { // Type: ZN1S1fEiiEd0_UlvE_ // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv // { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZZN1S1fEiiEd0_NUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZN1S1fEiiEd0_NUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } []{return 1;}() // Type: ZN1S1fEiiEd0_UlvE0_ // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv @@ -53,7 +54,7 @@ template int R<int>::x; // Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E // Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv // { dg-final { scan-assembler "_ZN1RIiE1xMUlvE_clEv" } } -// { dg-final { scan-assembler "weak\[ \t\]*_?_ZN1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZN1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } void bar() { diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic31.C b/gcc/testsuite/g++.dg/cpp0x/variadic31.C index eacf568978a..db8daa89858 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic31.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic31.C @@ -1,4 +1,4 @@ -// { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -g" } template<typename... T> void eat(T...) { } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic98.C b/gcc/testsuite/g++.dg/cpp0x/variadic98.C new file mode 100644 index 00000000000..6af599fcaa0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic98.C @@ -0,0 +1,411 @@ +// PR c++/42358 +// { dg-do assemble } +// { dg-options -std=c++0x } + +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __SIZE_TYPE__ size_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::size_t; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + struct __sfinae_types { + typedef char __one; + typedef struct { + } __two; + }; + template<typename _Tp, _Tp __v> struct integral_constant { + static const _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + }; + typedef integral_constant<bool, false> false_type; + template<typename> struct remove_cv; + template<typename> struct __is_void_helper : public false_type { + }; + template<typename _Tp> struct is_void : public integral_constant<bool, (__is_void_helper<typename remove_cv<_Tp>::type>::value)> { + }; + template<typename> struct is_array : public false_type { + }; + template<typename> struct is_function : public false_type { + }; + template<typename, unsigned _Uint = 0> struct extent : public integral_constant<std::size_t, 0> { + }; + template<typename _Tp> struct remove_const { + typedef _Tp type; + }; + template<typename _Tp> struct remove_volatile { + typedef _Tp type; + }; + template<typename _Tp> struct remove_cv { + typedef typename remove_const<typename remove_volatile<_Tp>::type>::type type; + }; + template<typename> struct is_lvalue_reference : public false_type { + }; + template<typename> struct is_rvalue_reference : public false_type { + }; + template<typename _Tp> struct is_reference : public integral_constant<bool, (is_lvalue_reference<_Tp>::value || is_rvalue_reference<_Tp>::value)> { + }; + template<typename _Tp> struct remove_reference { + typedef _Tp type; + }; + template<typename _Tp, bool = !is_reference<_Tp>::value && !is_void<_Tp>::value> struct __add_rvalue_reference_helper { + typedef _Tp type; + }; + template<typename _Tp> struct add_rvalue_reference : public __add_rvalue_reference_helper<_Tp> { + }; + template<typename _Tp> typename add_rvalue_reference<_Tp>::type declval(); + template<typename _From, typename _To, bool = (is_void<_From>::value || is_void<_To>::value || is_function<_To>::value || is_array<_To>::value)> struct __is_convertible_helper { + }; + template<typename _From, typename _To> struct __is_convertible_helper<_From, _To, false> : public __sfinae_types { + static __one __test(_To); + static __two __test(...); + static const bool __value = sizeof(__test(declval<_From>())) == 1; + }; + template<typename _From, typename _To> struct is_convertible : public integral_constant<bool, __is_convertible_helper<_From, _To>::__value> { + }; + template<bool, typename _Tp = void> struct enable_if { + }; + template<typename _Tp> struct enable_if<true, _Tp> { + typedef _Tp type; + }; + template<typename _Tp> struct identity { + typedef _Tp type; + }; + template<typename _Tp> inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type forward(typename std::identity<_Tp>::type& __t) { + } + template<typename _Tp> inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type forward(typename std::identity<_Tp>::type __t) { + } + template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { + } + template<class _T1, class _T2> struct pair { + typedef _T1 first_type; + typedef _T2 second_type; + _T1 first; + _T2 second; + template<class _U1, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type> pair(_U1&& __x, const _T2& __y) : first(std::forward<_U1>(__x)), second(__y) { + } + template<class _U2, class = typename std::enable_if<std::is_convertible<_U2, _T2>::value>::type> pair(const _T1& __x, _U2&& __y) : first(__x), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2> pair(pair<_U1, _U2>&& __p) : first(std::move(__p.first)), second(std::move(__p.second)) { + } + template<class _U1, class _U2> pair& operator=(pair<_U1, _U2>&& __p) { + } + }; + struct input_iterator_tag { + }; + struct output_iterator_tag { + }; + struct forward_iterator_tag : public input_iterator_tag { + }; + struct bidirectional_iterator_tag : public forward_iterator_tag { + }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator { + typedef _Category iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + }; + template<typename _Iterator> struct iterator_traits { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; + template<typename _Iter> inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { + return std::__distance(__first, __last, std::__iterator_category(__first)); + } + template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference> { + }; + template<typename _Container> class back_insert_iterator : public iterator<output_iterator_tag, void, void, void, void> { + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + new_allocator() throw() { + } + new_allocator(const new_allocator&) throw() { + } + template<typename _Tp1> new_allocator(const new_allocator<_Tp1>&) throw() { + } + template<typename... _Args> void construct(pointer __p, _Args&&... __args) { + } + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + template<typename _Tp1> struct rebind { + typedef allocator<_Tp1> other; + }; + allocator() throw() { + } + template<typename _Tp1> allocator(const allocator<_Tp1>&) throw() { + } + }; + extern template class allocator<char>; + extern template class allocator<wchar_t>; + template<typename _Arg, typename _Result> struct unary_function { + typedef _Arg argument_type; + typedef _Result result_type; + }; + template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + }; + template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { + bool operator()(const _Tp& __x, const _Tp& __y) const { + } + }; + template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { + const typename _Pair::first_type& operator()(const _Pair& __x) const { + } + }; + struct _Rb_tree_node_base { + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + }; + template<typename _Val> struct _Rb_tree_node : public _Rb_tree_node_base { + typedef _Rb_tree_node<_Val>* _Link_type; + _Val _M_value_field; + template<typename... _Args> _Rb_tree_node(_Args&&... __args) : _Rb_tree_node_base(), _M_value_field(std::forward<_Args>(__args)...) { + } + }; + template<typename _Tp> struct _Rb_tree_iterator { + typedef _Tp value_type; + typedef _Tp& reference; + typedef _Tp* pointer; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + typedef _Rb_tree_node<_Tp>* _Link_type; + _Base_ptr _M_node; + }; + template<typename _Tp> struct _Rb_tree_const_iterator { + typedef _Tp value_type; + typedef const _Tp& reference; + typedef const _Tp* pointer; + typedef _Rb_tree_iterator<_Tp> iterator; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_const_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; + typedef const _Rb_tree_node<_Tp>* _Link_type; + explicit _Rb_tree_const_iterator(_Link_type __x) : _M_node(__x) { + } + _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) { + } + _Base_ptr _M_node; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > class _Rb_tree { + typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator; + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + public: + typedef _Key key_type; + typedef _Val value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _Rb_tree_node<_Val>* _Link_type; + typedef const _Rb_tree_node<_Val>* _Const_Link_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Alloc allocator_type; + _Node_allocator& _M_get_Node_allocator() { + } + _Link_type _M_get_node() { + } + template<typename... _Args> _Link_type _M_create_node(_Args&&... __args) { + _Link_type __tmp = _M_get_node(); + try { + _M_get_Node_allocator().construct(__tmp, std::forward<_Args>(__args)...); + } + catch(...) { + } + } + template<typename _Key_compare, bool _Is_pod_comparator = __is_pod(_Key_compare)> struct _Rb_tree_impl : public _Node_allocator { + _Key_compare _M_key_compare; + _Rb_tree_node_base _M_header; + size_type _M_node_count; + _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), _M_node_count(0) { + } + void _M_initialize() { + } + }; + _Rb_tree_impl<_Compare> _M_impl; + _Base_ptr& _M_rightmost() { + } + _Link_type _M_begin() { + } + _Link_type _M_end() { + } + _Const_Link_type _M_end() const { + } + static _Link_type _S_right(_Base_ptr __x) { + } + static const_reference _S_value(_Const_Base_ptr __x) { + } + static const _Key& _S_key(_Const_Base_ptr __x) { + return _KeyOfValue()(_S_value(__x)); + } + typedef _Rb_tree_iterator<value_type> iterator; + typedef _Rb_tree_const_iterator<value_type> const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + iterator _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __y, const value_type& __v); + iterator _M_insert_lower(_Base_ptr __x, _Base_ptr __y, const value_type& __v); + iterator _M_insert_equal_lower(const value_type& __x); + iterator _M_lower_bound(_Link_type __x, _Link_type __y, const _Key& __k); + iterator _M_upper_bound(_Link_type __x, _Link_type __y, const _Key& __k); + _Rb_tree(const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_impl(__comp, __a) { + } + iterator end() { + } + iterator _M_insert_equal_(const_iterator __position, const value_type& __x); + template<typename _InputIterator> void _M_insert_unique(_InputIterator __first, _InputIterator __last); + template<typename _InputIterator> void _M_insert_equal(_InputIterator __first, _InputIterator __last); + size_type count(const key_type& __k) const; + pair<iterator, iterator> equal_range(const key_type& __k); + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_lower(_Base_ptr __x, _Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_lower(const _Val& __v) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + return _M_insert_lower(__x, __y, __v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + while (__x != 0) { + if (_M_impl._M_key_compare(_S_key(__x), __k)) __x = _S_right(__x); + else { + _Link_type __xu(__x), __yu(__y); + return pair<iterator, iterator>(_M_lower_bound(__x, __y, __k), _M_upper_bound(__xu, __yu, __k)); + } + } + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) const { + _Const_Link_type __y = _M_end(); + return pair<const_iterator, const_iterator>(const_iterator(__y), const_iterator(__y)); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_(const_iterator __position, const _Val& __v) { + if (__position._M_node == _M_end()) { + if (__position._M_node == _M_rightmost()) return _M_insert_(0, _M_rightmost(), __v); + else return _M_insert_equal_lower(__v); + } + } + template<typename _Key, typename _Val, typename _KoV, typename _Cmp, typename _Alloc> template<class _II> void _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>:: _M_insert_equal(_II __first, _II __last) { + for (; + __first != __last; + ++__first) _M_insert_equal_(end(), *__first); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: count(const _Key& __k) const { + pair<const_iterator, const_iterator> __p = equal_range(__k); + const size_type __n = std::distance(__p.first, __p.second); + } + template<class _E> class initializer_list { + public: + typedef _E value_type; + typedef const _E& reference; + typedef const _E& const_reference; + typedef size_t size_type; + typedef const _E* iterator; + typedef const _E* const_iterator; + iterator _M_array; + size_type _M_len; + initializer_list(const_iterator __a, size_type __l) : _M_array(__a), _M_len(__l) { + } + const_iterator begin() const { + } + const_iterator end() const { + } + }; + template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class multimap { + typedef _Key key_type; + typedef _Tp mapped_type; + typedef std::pair<const _Key, _Tp> value_type; + typedef _Compare key_compare; + typedef _Alloc allocator_type; + typedef typename _Alloc::value_type _Alloc_value_type; + typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type; + typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type; + _Rep_type _M_t; + public: + typedef typename _Pair_alloc_type::pointer pointer; + typedef typename _Pair_alloc_type::const_pointer const_pointer; + typedef typename _Pair_alloc_type::reference reference; + typedef typename _Pair_alloc_type::const_reference const_reference; + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + multimap(initializer_list<value_type> __l, const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + _M_t._M_insert_equal(__l.begin(), __l.end()); + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last) : _M_t() { + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last, const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + } + template<typename _InputIterator> void insert(_InputIterator __first, _InputIterator __last) { + } + size_type count(const key_type& __x) const { + return _M_t.count(__x); + } + std::pair<iterator, iterator> equal_range(const key_type& __x) { + return _M_t.equal_range(__x); + } + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator==(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator<(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + }; +} +extern "C" { + extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__)); +} +using namespace std; +int test01() { + typedef multimap<int,double> Container; + typedef Container::iterator iterator; + typedef pair<iterator,iterator> itpair; + Container m({ + { + 1, 1.0 } + } + ); + itpair ip = m.equal_range(1); + ((distance(ip.first, ip.second) == 3) ? static_cast<void> (0) : __assert_fail ("distance(ip.first, ip.second) == 3", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 36, __PRETTY_FUNCTION__)); + ((m.count(7) == 2) ? static_cast<void> (0) : __assert_fail ("m.count(7) == 2", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 54, __PRETTY_FUNCTION__)); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const1.C b/gcc/testsuite/g++.dg/debug/dwarf2/const1.C index eaed5bd603e..7b18fa0693b 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/const1.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/const1.C @@ -1,7 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -gdwarf-2 -dA" } */ +/* { dg-options "-O -gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "DW_AT_const_value" } } */ +/* { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*fnx\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ -extern void x () __attribute__((visibility ("hidden"))); -void (* const f) () = x; +extern void fnx () __attribute__((visibility ("hidden"))); +void (* const f) () = fnx; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C index 9f3dc8c2870..4c72490351b 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C @@ -1,9 +1,9 @@ // Contributed by Dodji Seketeli <dodji@redhat.com> // Origin PR debug/30161 -// { dg-options "-g -dA" } +// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" } // { dg-final { scan-assembler "DW_TAG_template_value_param" } } // { dg-final { scan-assembler "f.*DW_AT_name" } } -// { dg-final { scan-assembler "_Z4blehv.*DW_AT_const_value" } } +// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ typedef void (*func_ptr)(); diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C index 06b0e2b821a..e69e1c9f37b 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C @@ -1,9 +1,9 @@ // Contributed by Dodji Seketeli <dodji@redhat.com> // Origin PR debug/30161 -// { dg-options "-g -dA" } +// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" } // { dg-final { scan-assembler "DW_TAG_template_value_param" } } // { dg-final { scan-assembler "f.*DW_AT_name" } } -// { dg-final { scan-assembler "_Z4blehv.*DW_AT_const_value" } } +// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ typedef void (*func_ptr) (); diff --git a/gcc/testsuite/g++.dg/ext/attrib33.C b/gcc/testsuite/g++.dg/ext/attrib33.C index 5b989849128..55bfc4cadb8 100644 --- a/gcc/testsuite/g++.dg/ext/attrib33.C +++ b/gcc/testsuite/g++.dg/ext/attrib33.C @@ -1,5 +1,6 @@ // PR c++/35546 // { dg-do compile } +// { dg-options "-g" } template <int N> struct T diff --git a/gcc/testsuite/g++.dg/ext/ms-1.C b/gcc/testsuite/g++.dg/ext/ms-1.C index dcd1d0466ef..3963b7561d1 100644 --- a/gcc/testsuite/g++.dg/ext/ms-1.C +++ b/gcc/testsuite/g++.dg/ext/ms-1.C @@ -10,7 +10,7 @@ struct X void Quux (void (X::*) ()); -void X::Foo (X *ptr) // { dg-message "candidates" } +void X::Foo (X *ptr) // { dg-message "candidate" } { Quux (Foo); // { dg-error "no matches" } Quux (Bar); diff --git a/gcc/testsuite/g++.dg/ext/vla8.C b/gcc/testsuite/g++.dg/ext/vla8.C new file mode 100644 index 00000000000..7b7428d07a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla8.C @@ -0,0 +1,15 @@ +// PR c++/42387 +// { dg-options "" } + +template<class PF> +struct AvlTreeIter +{ + int Num(); + + AvlTreeIter() + { + new (void* [Num()]); + } +}; + +AvlTreeIter<int> a; diff --git a/gcc/testsuite/g++.dg/opt/dtor3.C b/gcc/testsuite/g++.dg/opt/dtor3.C new file mode 100644 index 00000000000..2d930987760 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor3.C @@ -0,0 +1,11 @@ +// PR c++/42386 +// { dg-do compile } +// { dg-options "-O2" } +# 1 "A.h" 1 +#pragma interface +struct D { virtual bool d () const; }; +struct E { virtual ~E (); virtual void *e () const = 0; }; +struct A : public D, public E { ~A () {} }; +# 5 "dtor3.C" 1 +struct F : public A { void *f () const; void *e () const; }; +void *F::e () const { return __null; } diff --git a/gcc/testsuite/g++.dg/other/error20.C b/gcc/testsuite/g++.dg/other/error20.C index 50a4495cff9..6033c0e783d 100644 --- a/gcc/testsuite/g++.dg/other/error20.C +++ b/gcc/testsuite/g++.dg/other/error20.C @@ -2,7 +2,7 @@ // { dg-do compile } struct A -{ // { dg-message "candidates" } +{ // { dg-message "candidate is" } virtual A foo (); }; diff --git a/gcc/testsuite/g++.dg/other/error31.C b/gcc/testsuite/g++.dg/other/error31.C index c9e8351bcf3..c4095504d6d 100644 --- a/gcc/testsuite/g++.dg/other/error31.C +++ b/gcc/testsuite/g++.dg/other/error31.C @@ -3,7 +3,7 @@ // { dg-options "" } // { dg-bogus "not supported by" "" { target *-*-* } 0 } -struct A {}; // { dg-message "note: candidates are" } +struct A {}; // { dg-message "note: candidate is" } void foo () diff --git a/gcc/testsuite/g++.dg/other/i386-2.C b/gcc/testsuite/g++.dg/other/i386-2.C index 1ef6b2775d8..952fa14c364 100644 --- a/gcc/testsuite/g++.dg/other/i386-2.C +++ b/gcc/testsuite/g++.dg/other/i386-2.C @@ -1,7 +1,9 @@ -/* Test that {,x,e,p,t,s,w,a,i}mmintrin.h, fma4intrin.h, xopintrin.h, mm3dnow.h and - mm_malloc.h are usable with -O -pedantic-errors. */ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -pedantic-errors -march=k8 -m3dnow -mavx -msse4a -mfma4 -mxop -maes -mpclmul" } */ +/* { dg-options "-O -pedantic-errors -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ + +/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, xopintrin.h, abmintrin.h, + lwpintrin.h, popcntintrin.h and mm3dnow.h are usable with + -O -pedantic-errors. */ #include <x86intrin.h> diff --git a/gcc/testsuite/g++.dg/other/i386-3.C b/gcc/testsuite/g++.dg/other/i386-3.C index df33af8bbd9..88dd7693891 100644 --- a/gcc/testsuite/g++.dg/other/i386-3.C +++ b/gcc/testsuite/g++.dg/other/i386-3.C @@ -1,6 +1,8 @@ -/* Test that {,x,e,p,t,s,w,a,i}mmintrin.h, fma4intrin.h, mm3dnow.h, xopintrin.h and - mm_malloc.h are usable with -O -fkeep-inline-functions. */ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -mavx -msse4a -mfma4 -mxop -maes -mpclmul" } */ +/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ + +/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, xopintrin.h, abmintrin.h, + lwpintrin.h, popcntintrin.h and mm3dnow.h are usable with + -O -fkeep-inline-functions. */ #include <x86intrin.h> diff --git a/gcc/testsuite/g++.dg/other/i386-5.C b/gcc/testsuite/g++.dg/other/i386-5.C deleted file mode 100644 index 383aae365bb..00000000000 --- a/gcc/testsuite/g++.dg/other/i386-5.C +++ /dev/null @@ -1,6 +0,0 @@ -/* Test that {,x,e,p,t,s,w,a,i}mmintrin.h, fma4intrin.h, xopintrin.h, mm3dnow.h and - mm_malloc.h are usable with -O -fkeep-inline-functions. */ -/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -fkeep-inline-functions -march=k8 -m3dnow -mavx -msse4a -mfma4 -mxop -maes -mpclmul" } */ - -#include <x86intrin.h> diff --git a/gcc/testsuite/g++.dg/other/i386-6.C b/gcc/testsuite/g++.dg/other/i386-6.C deleted file mode 100644 index 2bd4609d671..00000000000 --- a/gcc/testsuite/g++.dg/other/i386-6.C +++ /dev/null @@ -1,8 +0,0 @@ -/* Test that {,x,e,p,t,s,w,a,i}mmintrin.h, fma4intrin.h, xopintrin.h, mm3dnow.h and - mm_malloc.h are usable with -O -pedantic-errors. */ -/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-O -pedantic-errors -march=k8 -m3dnow -mavx -msse4a -mfma4 -mxop -maes -mpclmul" } */ - -#include <x86intrin.h> - -int dummy; diff --git a/gcc/testsuite/g++.dg/parse/crash5.C b/gcc/testsuite/g++.dg/parse/crash5.C index acf9e9d4bba..4597d6cf9af 100644 --- a/gcc/testsuite/g++.dg/parse/crash5.C +++ b/gcc/testsuite/g++.dg/parse/crash5.C @@ -1,7 +1,7 @@ // { dg-options "-w" } class QString { // { dg-error "previous definition" } - QString (const QString & a); // { dg-message "candidates" } + QString (const QString & a); // { dg-message "candidate is" } }; class QString { }; // { dg-error "redefinition" } diff --git a/gcc/testsuite/g++.dg/parse/error19.C b/gcc/testsuite/g++.dg/parse/error19.C index 5582891c974..39c2d785837 100644 --- a/gcc/testsuite/g++.dg/parse/error19.C +++ b/gcc/testsuite/g++.dg/parse/error19.C @@ -2,7 +2,7 @@ // PR C++/17867 struct A -{ // { dg-message "1:candidates are:" } +{ // { dg-message "1:candidate is:" } A(int); }; diff --git a/gcc/testsuite/g++.dg/rtti/typeid6.C b/gcc/testsuite/g++.dg/rtti/typeid6.C index 18709b4976d..adc5bbb02fb 100644 --- a/gcc/testsuite/g++.dg/rtti/typeid6.C +++ b/gcc/testsuite/g++.dg/rtti/typeid6.C @@ -7,5 +7,5 @@ namespace std template<int> void foo() { - !typeid(void); // { dg-error "!typeid\\(void\\)|candidates" } + !typeid(void); // { dg-error "!typeid\\(void\\)|candidate is" } } diff --git a/gcc/testsuite/g++.dg/template/crash37.C b/gcc/testsuite/g++.dg/template/crash37.C index 8af516018f7..aef0df0846e 100644 --- a/gcc/testsuite/g++.dg/template/crash37.C +++ b/gcc/testsuite/g++.dg/template/crash37.C @@ -11,7 +11,7 @@ struct coperator_stack struct helper {}; template<class F> -void bla(F f) // { dg-message "candidates" } +void bla(F f) // { dg-message "candidate is" } { } diff --git a/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc/testsuite/g++.dg/template/instantiate5.C index 70ed2b059f9..9cdf310c738 100644 --- a/gcc/testsuite/g++.dg/template/instantiate5.C +++ b/gcc/testsuite/g++.dg/template/instantiate5.C @@ -13,7 +13,7 @@ int baz() { return A<0>::i; } struct B { - static void foo (int); // { dg-message "candidates" } + static void foo (int); // { dg-message "candidate is" } }; template <typename T> struct C diff --git a/gcc/testsuite/g++.dg/template/local6.C b/gcc/testsuite/g++.dg/template/local6.C index 7094e7480d8..c691c4c789b 100644 --- a/gcc/testsuite/g++.dg/template/local6.C +++ b/gcc/testsuite/g++.dg/template/local6.C @@ -1,5 +1,5 @@ template <class T> struct PCVector2 -{ // { dg-message "candidates" } +{ // { dg-message "candidate is" } template <class T2> PCVector2(const PCVector2<T> &cv) ; PCVector2<T> operator- (const PCVector2<T> &ov) const diff --git a/gcc/testsuite/g++.dg/template/ptrmem4.C b/gcc/testsuite/g++.dg/template/ptrmem4.C index 0ea73a13106..b1422c3e811 100644 --- a/gcc/testsuite/g++.dg/template/ptrmem4.C +++ b/gcc/testsuite/g++.dg/template/ptrmem4.C @@ -6,7 +6,7 @@ // Pointer to member function template argument deduction ICE. -template <class CONT> void queryAliases(CONT& fill_me); // { dg-message "candidates" } +template <class CONT> void queryAliases(CONT& fill_me); // { dg-message "candidate is" } struct SpyExample { diff --git a/gcc/testsuite/g++.dg/template/qualttp5.C b/gcc/testsuite/g++.dg/template/qualttp5.C index 7d1062e3a8f..fc93f462835 100644 --- a/gcc/testsuite/g++.dg/template/qualttp5.C +++ b/gcc/testsuite/g++.dg/template/qualttp5.C @@ -4,7 +4,7 @@ template <class U> struct A { - template <class T> class B {}; // { dg-message "candidates" } + template <class T> class B {}; // { dg-message "candidate is" } }; template <template <class> class TT> void f() diff --git a/gcc/testsuite/g++.dg/torture/pr41183.C b/gcc/testsuite/g++.dg/torture/pr41183.C new file mode 100644 index 00000000000..df3e303410e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41183.C @@ -0,0 +1,30 @@ +// PR c++/41183 +// { dg-do compile } + +void foo (const char *); + +template <int *> +struct A +{ + template <typename T> A (const int &, T); + int i; +}; + +template <int *X> +template <typename T> +A<X>::A (const int &j, T) : i(j) +{ + foo (0); + foo (0); + foo (__PRETTY_FUNCTION__); +} + +int N; + +struct B +{ + B (); + A<&N> a; +}; + +B::B() : a(N, 0) {} diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/15800-1.C b/gcc/testsuite/g++.old-deja/g++.benjamin/15800-1.C index deedfba75a2..3441ae5bed0 100644 --- a/gcc/testsuite/g++.old-deja/g++.benjamin/15800-1.C +++ b/gcc/testsuite/g++.old-deja/g++.benjamin/15800-1.C @@ -5,7 +5,7 @@ struct panama { panama(); panama(panama &); - panama& operator=(panama&); // { dg-message "candidates" } + panama& operator=(panama&); // { dg-message "candidate is" } }; extern panama dig(); diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/cvt3.C b/gcc/testsuite/g++.old-deja/g++.brendan/cvt3.C index 638ba9f9252..e77c437a6d0 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/cvt3.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/cvt3.C @@ -38,7 +38,7 @@ struct bar class nnyacc { public: - static void assign(void*& lval, void*& rval); // { dg-message "candidates" } + static void assign(void*& lval, void*& rval); // { dg-message "candidate is" } }; void diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/misc6.C b/gcc/testsuite/g++.old-deja/g++.brendan/misc6.C index 1738f6545c0..93b241b9e04 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/misc6.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/misc6.C @@ -4,6 +4,6 @@ inline int i;// { dg-error "" } .* struct c { inline int i; };// { dg-error "" } .* int foo (inline int i);// { dg-error "" } .* -inline class c; // { dg-error "" } inline +inline class c; // { dg-error "'inline' can only be specified for functions" } inline inline typedef int t; // { dg-error "" } inline -class d { inline friend class c; }; // { dg-error "" } inline +class d { inline friend class c; }; // { dg-error "'inline' can only be specified for functions" } inline diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/overload1.C b/gcc/testsuite/g++.old-deja/g++.brendan/overload1.C index 92b04c4d02b..328bcdfe2ce 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/overload1.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/overload1.C @@ -9,7 +9,7 @@ public: class Bar : public Foo { public: - int f (int); // { dg-message "candidates" } + int f (int); // { dg-message "candidate is" } }; int main () diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/overload4.C b/gcc/testsuite/g++.old-deja/g++.brendan/overload4.C index d832a4b47c1..7a1941cac4e 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/overload4.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/overload4.C @@ -5,7 +5,7 @@ class B { public: - static void WantsNew (NewObject creator); // { dg-message "candidates" } + static void WantsNew (NewObject creator); // { dg-message "candidate is" } }; class A diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900213_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900213_02.C index c6415e1ac0d..9b9ae994de9 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900213_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900213_02.C @@ -16,7 +16,7 @@ int struct0::*dmp; void global_function_0 () { - i = *dmp; // { dg-error "" } causes abort + i = *dmp; // { dg-error "invalid use of unary '\\\*' on pointer to member" } causes abort } int main () { return 0; } diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900215_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900215_02.C index 6802299b6b0..3309c886384 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900215_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900215_02.C @@ -41,8 +41,8 @@ void struct0::function_member () i = (this->*fmp) (); // perfectly legal - for both cfront and g++ i = this->*dmp; // perfectly legal - for both cfront and g++ - i = (*fmp) (); // { dg-error "" } - i = *dmp; // { dg-error "" } + i = (*fmp) (); // { dg-error "invalid use of unary '\\\*' on pointer to member" } + i = *dmp; // { dg-error "invalid use of unary '\\\*' on pointer to member" } } int main () { return 0; } diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900330_02.C b/gcc/testsuite/g++.old-deja/g++.bugs/900330_02.C index f1da7fba722..5038f23b16c 100644 --- a/gcc/testsuite/g++.old-deja/g++.bugs/900330_02.C +++ b/gcc/testsuite/g++.old-deja/g++.bugs/900330_02.C @@ -19,7 +19,7 @@ struct B { }; struct D : public B { - int f(struct B); // { dg-message "candidates" } referred to below + int f(struct B); // { dg-message "candidate is" } referred to below }; void h(D* pd) diff --git a/gcc/testsuite/g++.old-deja/g++.jason/conversion11.C b/gcc/testsuite/g++.old-deja/g++.jason/conversion11.C index 78e46e1cd38..1e64693d804 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/conversion11.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/conversion11.C @@ -14,7 +14,7 @@ public: class Something { public: - void DoSomething(Ding A); // { dg-message "candidates" } referred to + void DoSomething(Ding A); // { dg-message "candidate is" } referred to }; void DoSomething(Ding A); diff --git a/gcc/testsuite/g++.old-deja/g++.jason/scoping10.C b/gcc/testsuite/g++.old-deja/g++.jason/scoping10.C index d5763748f61..9e6ae0f6898 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/scoping10.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/scoping10.C @@ -3,7 +3,7 @@ void f (char *); struct A { - void f (); // { dg-message "candidates" } referred to + void f (); // { dg-message "candidate is" } referred to }; struct B : public A { void g (char *); diff --git a/gcc/testsuite/g++.old-deja/g++.law/arg11.C b/gcc/testsuite/g++.old-deja/g++.law/arg11.C index b6a0194f314..01331535ee2 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/arg11.C +++ b/gcc/testsuite/g++.old-deja/g++.law/arg11.C @@ -9,7 +9,7 @@ struct String { String(const char*); }; struct Ack { Ack(String); }; -struct S { void method(Ack); }; // { dg-message "candidates" } referenced below +struct S { void method(Ack); }; // { dg-message "candidate is" } referenced below void function(Ack); diff --git a/gcc/testsuite/g++.old-deja/g++.law/arm9.C b/gcc/testsuite/g++.old-deja/g++.law/arm9.C index 7c7cfea0c8f..b8128c6f686 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/arm9.C +++ b/gcc/testsuite/g++.old-deja/g++.law/arm9.C @@ -19,7 +19,7 @@ class B : public A { public: void set (f2 f); }; -void B::set (f2 f) { std::cout << "called B\n";} // { dg-message "candidates" } +void B::set (f2 f) { std::cout << "called B\n";} // { dg-message "candidate is" } int main() { B b; diff --git a/gcc/testsuite/g++.old-deja/g++.law/enum4.C b/gcc/testsuite/g++.old-deja/g++.law/enum4.C index 742f54bc459..37836595b2f 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/enum4.C +++ b/gcc/testsuite/g++.old-deja/g++.law/enum4.C @@ -11,7 +11,7 @@ enum Enum {enumerator1, enumerator2}; struct Struct { int i; - int getI(Enum) {return i;} // { dg-message "candidates" } + int getI(Enum) {return i;} // { dg-message "candidate is" } }; int funct (Enum) diff --git a/gcc/testsuite/g++.old-deja/g++.law/operators9.C b/gcc/testsuite/g++.old-deja/g++.law/operators9.C index 8ec6825abfa..d00c707c915 100644 --- a/gcc/testsuite/g++.old-deja/g++.law/operators9.C +++ b/gcc/testsuite/g++.old-deja/g++.law/operators9.C @@ -10,7 +10,7 @@ class B { public: operator=(B &); // { dg-error "no type" } - // { dg-message "candidates" "note" { target *-*-* } 12 } + // { dg-message "candidate is" "note" { target *-*-* } 12 } }; void diff --git a/gcc/testsuite/g++.old-deja/g++.mike/net31.C b/gcc/testsuite/g++.old-deja/g++.mike/net31.C index 6565a3697a9..8bc159b136e 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/net31.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/net31.C @@ -40,7 +40,7 @@ foo_b& foo_c<TP>::bug_func(int x) { static foo_b retval(m); retval.bar_a(m); for (register int i = 0; i < m; i++) - retval(i) = (*(operator()(i)))(x); // { dg-error "" } + retval(i) = (*(operator()(i)))(x); // { dg-error "invalid use of unary '\\\*'" } return retval; } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p11110.C b/gcc/testsuite/g++.old-deja/g++.mike/p11110.C index 746a57ccfd6..e234d57c323 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p11110.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p11110.C @@ -6,7 +6,7 @@ class data; class conatiner { public: virtual void* first (); - virtual data* contents (void* i); // { dg-message "candidates" } + virtual data* contents (void* i); // { dg-message "candidate is" } }; class user { diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p2431.C b/gcc/testsuite/g++.old-deja/g++.mike/p2431.C index 1d5b3974f9a..0bb2648215a 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p2431.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p2431.C @@ -3,7 +3,7 @@ class A { public: - A(A &); // { dg-message "candidates" } + A(A &); // { dg-message "candidate is" } }; class B diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p438.C b/gcc/testsuite/g++.old-deja/g++.mike/p438.C index a08a404aa91..16dc628b613 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p438.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p438.C @@ -12,7 +12,7 @@ class C class D { public: - void a(C& b); // { dg-message "candidates" } + void a(C& b); // { dg-message "candidate is" } }; void C::test() const diff --git a/gcc/testsuite/g++.old-deja/g++.mike/p9068.C b/gcc/testsuite/g++.old-deja/g++.mike/p9068.C index aff4a6a7bc7..ff5454b2289 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/p9068.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/p9068.C @@ -2,7 +2,7 @@ // prms-id: 9068 struct ostream { - void operator<< (int); // { dg-message "candidates" } fn ref in err msg + void operator<< (int); // { dg-message "candidate is" } fn ref in err msg }; class C { diff --git a/gcc/testsuite/g++.old-deja/g++.niklas/t120.C b/gcc/testsuite/g++.old-deja/g++.niklas/t120.C index 17eaf0743fc..bef06655220 100644 --- a/gcc/testsuite/g++.old-deja/g++.niklas/t120.C +++ b/gcc/testsuite/g++.old-deja/g++.niklas/t120.C @@ -3,4 +3,4 @@ typedef void (*T) (...); void f (); struct S { void g (T); void h() { g(f); } };// { dg-error "match" "match" } -// { dg-message "candidates" "note" { target *-*-* } 5 } +// { dg-message "candidate is" "note" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.old-deja/g++.niklas/t121.C b/gcc/testsuite/g++.old-deja/g++.niklas/t121.C index cf3373964a2..4510a280312 100644 --- a/gcc/testsuite/g++.old-deja/g++.niklas/t121.C +++ b/gcc/testsuite/g++.old-deja/g++.niklas/t121.C @@ -3,4 +3,4 @@ void f (); void g1 (void (*) (...)); void h1 () { g1 (f); }// { dg-error "invalid conversion" } struct S { void g2 (void (*) (...)); void h2 () { g2 (f); } };// { dg-error "match" "match" } -// { dg-message "candidates" "note" { target *-*-* } 5 } +// { dg-message "candidate is" "note" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash24.C b/gcc/testsuite/g++.old-deja/g++.other/crash24.C index 9d6af1dfe87..a49ce56b1aa 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/crash24.C +++ b/gcc/testsuite/g++.old-deja/g++.other/crash24.C @@ -7,7 +7,7 @@ class foo { friend class __iterator; typedef __iterator const_iterator; virtual ~foo() { } - __iterator begin(); // { dg-message "candidates" } + __iterator begin(); // { dg-message "candidate is" } }; static void iteratorTest(const foo &x) { diff --git a/gcc/testsuite/g++.old-deja/g++.other/expr1.C b/gcc/testsuite/g++.old-deja/g++.other/expr1.C index 1f1f60d19c2..485594dfbe3 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/expr1.C +++ b/gcc/testsuite/g++.old-deja/g++.other/expr1.C @@ -3,7 +3,7 @@ // Simplified from bug report by Trevor Taylor <ttaylor@powerup.com.au> struct T { - int operator()(int) { } // { dg-message "candidates" } + int operator()(int) { } // { dg-message "candidate is" } }; int main() { diff --git a/gcc/testsuite/g++.old-deja/g++.other/pmf3.C b/gcc/testsuite/g++.old-deja/g++.other/pmf3.C index d8568dd9b1b..f43ed65ef2a 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/pmf3.C +++ b/gcc/testsuite/g++.old-deja/g++.other/pmf3.C @@ -3,7 +3,7 @@ // Bug: g++ was crashing after giving errors. template<class T> - void connect_to_method( // { dg-message "candidates are" } + void connect_to_method( // { dg-message "candidate is" } T *receiver, void (T::*method)()) {} diff --git a/gcc/testsuite/gcc.c-torture/compile/20091215-1.c b/gcc/testsuite/gcc.c-torture/compile/20091215-1.c new file mode 100644 index 00000000000..7862e2fb03f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20091215-1.c @@ -0,0 +1,15 @@ +void bar (); + +void +foo (void *x, short y) +{ + bar (x, y + 1); +} + +void +bar (x, y) + void *x; + char *y; +{ + baz (y); +} diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/const-1.c b/gcc/testsuite/gcc.dg/debug/dwarf2/const-1.c index 26aa9bd8c50..bc5c7d611de 100644 --- a/gcc/testsuite/gcc.dg/debug/dwarf2/const-1.c +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/const-1.c @@ -1,7 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -gdwarf-2 -dA" } */ +/* { dg-options "-O -gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "DW_AT_const_value" } } */ +/* { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*fnx\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ -extern void x() __attribute__((visibility("hidden"))); -static void (*f)() = x; +extern void fnx() __attribute__((visibility("hidden"))); +static void (*f)() = fnx; diff --git a/gcc/testsuite/gcc.dg/debug/tls-1.c b/gcc/testsuite/gcc.dg/debug/tls-1.c new file mode 100644 index 00000000000..a9431ef00b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/tls-1.c @@ -0,0 +1,19 @@ +/* Test that optimized out __thread var doesn't have its location + referenced in debug info. */ +/* { dg-do link } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target tls } */ + +static __thread int vara; + +int +foo (int b) +{ + return vara + b; +} + +int +main (void) +{ + return foo (0); +} diff --git a/gcc/testsuite/gcc.dg/graphite/pr42284.c b/gcc/testsuite/gcc.dg/graphite/pr42284.c new file mode 100644 index 00000000000..854c2514fa0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr42284.c @@ -0,0 +1,27 @@ +/* { dg-options "-O2 -fgraphite-identity" } */ + +int +huft_build (unsigned *b) +{ + int k; + for (k = 0; k <= 10; k++) + if (foo ()); +} +int +inflate_fixed () +{ + int i; + unsigned l[288]; + for (i = 0; i < 144; i++) + l[i] = 8; + for (; i < 256; i++) + l[i] = 9; + for (; i < 280; i++) + l[i] = 7; + for (; i < 288; i++) + l[i] = 8; + if ((i = huft_build (l)) != 0) + return i; + for (i = 0; i < 30; i++) + l[i] = 5; +} diff --git a/gcc/testsuite/gcc.dg/lto/20091216-1_0.c b/gcc/testsuite/gcc.dg/lto/20091216-1_0.c new file mode 100644 index 00000000000..8d120224312 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20091216-1_0.c @@ -0,0 +1,9 @@ +/* { dg-lto-do run } */ + +asm (".globl start; start: nop"); + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/pr41679.c b/gcc/testsuite/gcc.target/arm/pr41679.c new file mode 100644 index 00000000000..8b248985fe0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr41679.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv5te -g -O2" } */ + +extern int a; +extern char b; +extern int foo (void); + +void +test (void) +{ + int c; + b = foo () ? '~' : '\0'; + while ((c = foo ())) + if (c == '7') + a = 0; +} diff --git a/gcc/testsuite/gcc.target/i386/pr32280-1.c b/gcc/testsuite/gcc.target/i386/pr32280-1.c new file mode 100644 index 00000000000..1dbe2ccbb4f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr32280-1.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2" } */ + +__uint128_t +t1 (__uint128_t a) +{ + return a << 8; +} + +__uint128_t +t2 (__uint128_t a) +{ + return a >> 8; +} + +/* { dg-final { scan-assembler-not "pslldq" } } */ +/* { dg-final { scan-assembler-not "psrldq" } } */ diff --git a/gcc/testsuite/gcc.target/i386/sse-12.c b/gcc/testsuite/gcc.target/i386/sse-12.c index 4a314e842c6..77baff0f4b9 100644 --- a/gcc/testsuite/gcc.target/i386/sse-12.c +++ b/gcc/testsuite/gcc.target/i386/sse-12.c @@ -1,8 +1,8 @@ /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, xopintrin.h, mm3dnow.h, - abmintrin.h and mm_malloc.h are usable with -O -std=c89 - -pedantic-errors. */ + abmintrin.h, lwpintrin.h, popcntintrin.h and mm_malloc.h are usable + with -O -std=c89 -pedantic-errors. */ /* { dg-do compile } */ -/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mabm" } */ +/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ #include <x86intrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-13.c b/gcc/testsuite/gcc.target/i386/sse-13.c index 546a99fdc08..96214e02280 100644 --- a/gcc/testsuite/gcc.target/i386/sse-13.c +++ b/gcc/testsuite/gcc.target/i386/sse-13.c @@ -1,13 +1,14 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mabm" } */ +/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -maes -mpclmul -mpopcnt -mabm -mlwp" } */ #include <mm_malloc.h> /* Test that the intrinsics compile with optimization. All of them are defined as inline functions in {,x,e,p,t,s,w,a,b,i}mmintrin.h, - xopintrin.h, abmintrin.h and mm3dnow.h that reference the proper - builtin functions. Defining away "extern" and "__inline" results - in all of them being compiled as proper functions. */ + xopintrin.h, abmintrin.h, lwpintrin.h, popcntintrin.h and mm3dnow.h + that reference the proper builtin functions. Defining away + "extern" and "__inline" results in all of them being compiled as + proper functions. */ #define extern #define __inline @@ -127,9 +128,15 @@ #define __builtin_ia32_shufps(A, B, N) __builtin_ia32_shufps(A, B, 0) /* xopintrin.h */ -#define __builtin_ia32_vprotbi(A, N) __builtin_ia32_vprotbi (A,1) -#define __builtin_ia32_vprotwi(A, N) __builtin_ia32_vprotwi (A,1) -#define __builtin_ia32_vprotdi(A, N) __builtin_ia32_vprotdi (A,1) -#define __builtin_ia32_vprotqi(A, N) __builtin_ia32_vprotqi (A,1) +#define __builtin_ia32_vprotbi(A, N) __builtin_ia32_vprotbi (A,1) +#define __builtin_ia32_vprotwi(A, N) __builtin_ia32_vprotwi (A,1) +#define __builtin_ia32_vprotdi(A, N) __builtin_ia32_vprotdi (A,1) +#define __builtin_ia32_vprotqi(A, N) __builtin_ia32_vprotqi (A,1) + +/* lwpintrin.h */ +#define __builtin_ia32_lwpval32(D2, D1, F) __builtin_ia32_lwpval32 (D2, D1, 1) +#define __builtin_ia32_lwpval64(D2, D1, F) __builtin_ia32_lwpval64 (D2, D1, 1) +#define __builtin_ia32_lwpins32(D2, D1, F) __builtin_ia32_lwpins32 (D2, D1, 1) +#define __builtin_ia32_lwpins64(D2, D1, F) __builtin_ia32_lwpins64 (D2, D1, 1) #include <x86intrin.h> diff --git a/gcc/testsuite/gcc.target/i386/sse-14.c b/gcc/testsuite/gcc.target/i386/sse-14.c index 783cd0af106..c3f72e419c7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-14.c +++ b/gcc/testsuite/gcc.target/i386/sse-14.c @@ -1,12 +1,13 @@ /* { dg-do compile } */ -/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -msse4a -maes -mpclmul" } */ +/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -m3dnow -mavx -mxop -msse4a -maes -mpclmul -mpopcnt -mabm -mlwp" } */ #include <mm_malloc.h> /* Test that the intrinsics compile without optimization. All of them are - defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, xopintrin.h and mm3dnow.h - that reference the proper builtin functions. Defining away "extern" and - "__inline" results in all of them being compiled as proper functions. */ + defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, xopintrin.h, + lwpintrin.h and mm3dnow.h that reference the proper builtin functions. + Defining away "extern" and "__inline" results in all of them being compiled + as proper functions. */ #define extern #define __inline @@ -162,3 +163,10 @@ test_1 ( _mm_roti_epi16, __m128i, __m128i, 1) test_1 ( _mm_roti_epi32, __m128i, __m128i, 1) test_1 ( _mm_roti_epi64, __m128i, __m128i, 1) +/* lwpintrin.h */ +test_2 ( __lwpval32, void, unsigned int, unsigned int, 1) +test_2 ( __lwpins32, unsigned char, unsigned int, unsigned int, 1) +#ifdef __x86_64__ +test_2 ( __lwpval64, void, unsigned long long, unsigned int, 1) +test_2 ( __lwpins64, unsigned char, unsigned long long, unsigned int, 1) +#endif diff --git a/gcc/testsuite/gcc.target/i386/sse-22.c b/gcc/testsuite/gcc.target/i386/sse-22.c index 541cad4d439..6d976972d28 100644 --- a/gcc/testsuite/gcc.target/i386/sse-22.c +++ b/gcc/testsuite/gcc.target/i386/sse-22.c @@ -4,10 +4,12 @@ #include <mm_malloc.h> -/* Test that the intrinsics compile without optimization. All of them are - defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, xopintrin.h and mm3dnow.h - that reference the proper builtin functions. Defining away "extern" and - "__inline" results in all of them being compiled as proper functions. */ +/* Test that the intrinsics compile without optimization. All of them + are defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, + xopintrin.h, lwpintrin.h, popcntintrin.h and mm3dnow.h that + reference the proper builtin functions. Defining away "extern" and + "__inline" results in all of them being compiled as proper + functions. */ #define extern #define __inline @@ -37,7 +39,7 @@ #ifndef DIFFERENT_PRAGMAS -#pragma GCC target ("mmx,3dnow,sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,aes,pclmul,xop") +#pragma GCC target ("mmx,3dnow,sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,aes,pclmul,xop,popcnt,abm,lwp") #endif /* Following intrinsics require immediate arguments. They @@ -162,10 +164,18 @@ test_2 (_mm_round_ss, __m128, __m128, __m128, 1) /* xopintrin.h (XOP). */ #ifdef DIFFERENT_PRAGMAS -#pragma GCC target ("xop") +#pragma GCC target ("xop,lwp") #endif #include <x86intrin.h> test_1 ( _mm_roti_epi8, __m128i, __m128i, 1) test_1 ( _mm_roti_epi16, __m128i, __m128i, 1) test_1 ( _mm_roti_epi32, __m128i, __m128i, 1) test_1 ( _mm_roti_epi64, __m128i, __m128i, 1) + +/* lwpintrin.h (LWP). */ +test_2 ( __lwpval32, void, unsigned int, unsigned int, 1) +test_2 ( __lwpins32, unsigned char, unsigned int, unsigned int, 1) +#ifdef __x86_64__ +test_2 ( __lwpval64, void, unsigned long long, unsigned int, 1) +test_2 ( __lwpins64, unsigned char, unsigned long long, unsigned int, 1) +#endif diff --git a/gcc/testsuite/gcc.target/i386/sse-23.c b/gcc/testsuite/gcc.target/i386/sse-23.c index 3e0fa1f5ca4..f74d3a71f6e 100644 --- a/gcc/testsuite/gcc.target/i386/sse-23.c +++ b/gcc/testsuite/gcc.target/i386/sse-23.c @@ -3,10 +3,12 @@ #include <mm_malloc.h> -/* Test that the intrinsics compile with optimization. All of them are - defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, xopintrin.h and mm3dnow.h - that reference the proper builtin functions. Defining away "extern" and - "__inline" results in all of them being compiled as proper functions. */ +/* Test that the intrinsics compile with optimization. All of them + are defined as inline functions in {,x,e,p,t,s,w,a}mmintrin.h, + xopintrin.h, lwpintrin.h, popcntintrin.h and mm3dnow.h that + reference the proper builtin functions. Defining away "extern" and + "__inline" results in all of them being compiled as proper + functions. */ #define extern #define __inline @@ -93,13 +95,52 @@ #define __builtin_ia32_vec_ext_v4hi(A, N) __builtin_ia32_vec_ext_v4hi(A, 0) #define __builtin_ia32_shufps(A, B, N) __builtin_ia32_shufps(A, B, 0) +/* immintrin.h */ +#define __builtin_ia32_blendpd256(X, Y, M) __builtin_ia32_blendpd256(X, Y, 1) +#define __builtin_ia32_blendps256(X, Y, M) __builtin_ia32_blendps256(X, Y, 1) +#define __builtin_ia32_dpps256(X, Y, M) __builtin_ia32_dpps256(X, Y, 1) +#define __builtin_ia32_shufpd256(X, Y, M) __builtin_ia32_shufpd256(X, Y, 1) +#define __builtin_ia32_shufps256(X, Y, M) __builtin_ia32_shufps256(X, Y, 1) +#define __builtin_ia32_cmpsd(X, Y, O) __builtin_ia32_cmpsd(X, Y, 1) +#define __builtin_ia32_cmpss(X, Y, O) __builtin_ia32_cmpss(X, Y, 1) +#define __builtin_ia32_cmppd(X, Y, O) __builtin_ia32_cmppd(X, Y, 1) +#define __builtin_ia32_cmpps(X, Y, O) __builtin_ia32_cmpps(X, Y, 1) +#define __builtin_ia32_cmppd256(X, Y, O) __builtin_ia32_cmppd256(X, Y, 1) +#define __builtin_ia32_cmpps256(X, Y, O) __builtin_ia32_cmpps256(X, Y, 1) +#define __builtin_ia32_vextractf128_pd256(X, N) __builtin_ia32_vextractf128_pd256(X, 1) +#define __builtin_ia32_vextractf128_ps256(X, N) __builtin_ia32_vextractf128_ps256(X, 1) +#define __builtin_ia32_vextractf128_si256(X, N) __builtin_ia32_vextractf128_si256(X, 1) +#define __builtin_ia32_vpermilpd(X, N) __builtin_ia32_vpermilpd(X, 1) +#define __builtin_ia32_vpermilpd256(X, N) __builtin_ia32_vpermilpd256(X, 1) +#define __builtin_ia32_vpermilps(X, N) __builtin_ia32_vpermilps(X, 1) +#define __builtin_ia32_vpermilps256(X, N) __builtin_ia32_vpermilps256(X, 1) +#define __builtin_ia32_vpermil2pd(X, Y, C, I) __builtin_ia32_vpermil2pd(X, Y, C, 1) +#define __builtin_ia32_vpermil2pd256(X, Y, C, I) __builtin_ia32_vpermil2pd256(X, Y, C, 1) +#define __builtin_ia32_vpermil2ps(X, Y, C, I) __builtin_ia32_vpermil2ps(X, Y, C, 1) +#define __builtin_ia32_vpermil2ps256(X, Y, C, I) __builtin_ia32_vpermil2ps256(X, Y, C, 1) +#define __builtin_ia32_vperm2f128_pd256(X, Y, C) __builtin_ia32_vperm2f128_pd256(X, Y, 1) +#define __builtin_ia32_vperm2f128_ps256(X, Y, C) __builtin_ia32_vperm2f128_ps256(X, Y, 1) +#define __builtin_ia32_vperm2f128_si256(X, Y, C) __builtin_ia32_vperm2f128_si256(X, Y, 1) +#define __builtin_ia32_vinsertf128_pd256(X, Y, C) __builtin_ia32_vinsertf128_pd256(X, Y, 1) +#define __builtin_ia32_vinsertf128_ps256(X, Y, C) __builtin_ia32_vinsertf128_ps256(X, Y, 1) +#define __builtin_ia32_vinsertf128_si256(X, Y, C) __builtin_ia32_vinsertf128_si256(X, Y, 1) +#define __builtin_ia32_roundpd256(V, M) __builtin_ia32_roundpd256(V, 1) +#define __builtin_ia32_roundps256(V, M) __builtin_ia32_roundps256(V, 1) + /* xopintrin.h */ #define __builtin_ia32_vprotbi(A, B) __builtin_ia32_vprotbi(A,1) #define __builtin_ia32_vprotwi(A, B) __builtin_ia32_vprotwi(A,1) #define __builtin_ia32_vprotdi(A, B) __builtin_ia32_vprotdi(A,1) #define __builtin_ia32_vprotqi(A, B) __builtin_ia32_vprotqi(A,1) -#pragma GCC target ("3dnow,sse4,sse4a,aes,pclmul,xop") +/* lwpintrin.h */ +#define __builtin_ia32_lwpval32(D2, D1, F) __builtin_ia32_lwpval32 (D2, D1, 1) +#define __builtin_ia32_lwpval64(D2, D1, F) __builtin_ia32_lwpval64 (D2, D1, 1) +#define __builtin_ia32_lwpins32(D2, D1, F) __builtin_ia32_lwpins32 (D2, D1, 1) +#define __builtin_ia32_lwpins64(D2, D1, F) __builtin_ia32_lwpins64 (D2, D1, 1) + +#pragma GCC target ("3dnow,sse4,sse4a,aes,pclmul,xop,abm,popcnt,lwp") #include <wmmintrin.h> #include <smmintrin.h> #include <mm3dnow.h> +#include <x86intrin.h> diff --git a/gcc/testsuite/gfortran.dg/auto_char_len_1.f90 b/gcc/testsuite/gfortran.dg/auto_char_len_1.f90 new file mode 100644 index 00000000000..628e6e9148e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_char_len_1.f90 @@ -0,0 +1,27 @@ +! { dg-do compile } +! { dg-options "" } +! [option to disable -pedantic as assumed character length +! functions are obsolescent] +! +! PR fortran/41235 +! + +character(len=*) function func() + func = 'ABC' +end function func + +subroutine test(i) + integer :: i + character(len=i), external :: func + print *, func() +end subroutine test + +subroutine test2(i) + integer :: i + character(len=i) :: func + print *, func() +end subroutine test2 + +call test(2) +call test2(2) +end diff --git a/gcc/testsuite/gfortran.dg/auto_char_len_2.f90 b/gcc/testsuite/gfortran.dg/auto_char_len_2.f90 new file mode 100644 index 00000000000..95825c4205a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_char_len_2.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-fwhole-file" } +! +! PR fortran/41235 +! + +character(len=*) function func() + func = 'ABC' +end function func + +subroutine test(i) + integer :: i + character(len=i), external :: func + print *, func() +end subroutine test + +subroutine test2(i) + integer :: i + character(len=i) :: func + print *, func() +end subroutine test2 + +call test(2) +call test2(2) +end diff --git a/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 b/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 index 3749abd8ed3..6b4e26e6b45 100644 --- a/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 +++ b/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 @@ -1,20 +1,31 @@ ! { dg-do compile } +! { dg-options "-fwhole-file" } +! ! Tests the fix for PR25087, in which the following invalid code ! was not detected. ! ! Contributed by Joost VandeVondele <jv244@cam.ac.uk> ! +! Modified by Tobias Burnus to fix PR fortran/41235. +! +FUNCTION a() + CHARACTER(len=10) :: a + a = '' +END FUNCTION a + SUBROUTINE s(n) CHARACTER(LEN=n), EXTERNAL :: a ! { dg-error "must have an explicit interface" } + CHARACTER(LEN=n), EXTERNAL :: d ! { dg-error "must have an explicit interface" } interface function b (m) ! This is OK CHARACTER(LEN=m) :: b integer :: m end function b end interface - write(6,*) a(n) + write(6,*) a() write(6,*) b(n) write(6,*) c() + write(6,*) d() contains function c () ! This is OK CHARACTER(LEN=n):: c @@ -22,3 +33,7 @@ contains end function c END SUBROUTINE s +FUNCTION d() + CHARACTER(len=99) :: d + d = '' +END FUNCTION d diff --git a/gcc/testsuite/gfortran.dg/boz_15.f90 b/gcc/testsuite/gfortran.dg/boz_15.f90 index 40ad514cffd..f481f16e80e 100644 --- a/gcc/testsuite/gfortran.dg/boz_15.f90 +++ b/gcc/testsuite/gfortran.dg/boz_15.f90 @@ -8,7 +8,7 @@ ! which needs integer(16) support. ! implicit none -character(len=255) :: str +character(len=256) :: str integer,parameter :: xp = selected_real_kind (precision (0.0d0)+1) real(xp) :: r1,r2 complex(xp) :: z1,z2 @@ -16,8 +16,8 @@ complex(xp) :: z1,z2 r2 = 5.0_xp r1 = 2.0_xp ! Real B(OZ) -write(str,'(b126)') r1 -read (str,'(b126)') r2 +write(str,'(b128)') r1 +read (str,'(b128)') r2 if(r2 /= r1) call abort() ! Real (B)O(Z) r2 = 5.0_xp @@ -33,8 +33,8 @@ if(r2 /= r1) call abort() z2 = cmplx(5.0_xp,7.0_xp) z1 = cmplx(2.0_xp,3.0_xp) ! Complex B(OZ) -write(str,'(2b126)') z1 -read (str,'(2b126)') z2 +write(str,'(2b128)') z1 +read (str,'(2b128)') z2 if(z2 /= z1) call abort() ! Complex (B)O(Z) z2 = cmplx(5.0_xp,7.0_xp) diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_6.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_6.f03 new file mode 100644 index 00000000000..e2d880e0efa --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dynamic_dispatch_6.f03 @@ -0,0 +1,69 @@ +! { dg-do run } +! +! PR 42144: [OOP] deferred TBPs do not work +! +! Contributed by Damian Rouson <damian@rouson.net> + +module field_module + implicit none + private + public :: field + type ,abstract :: field + end type +end module + +module periodic_5th_order_module + use field_module ,only : field + implicit none + type ,extends(field) :: periodic_5th_order + end type +end module + +module field_factory_module + implicit none + private + public :: field_factory + type, abstract :: field_factory + contains + procedure(create_interface), deferred :: create + end type + abstract interface + function create_interface(this) + use field_module ,only : field + import :: field_factory + class(field_factory), intent(in) :: this + class(field) ,pointer :: create_interface + end function + end interface +end module + +module periodic_5th_factory_module + use field_factory_module , only : field_factory + implicit none + private + public :: periodic_5th_factory + type, extends(field_factory) :: periodic_5th_factory + contains + procedure :: create=>new_periodic_5th_order + end type +contains + function new_periodic_5th_order(this) + use field_module ,only : field + use periodic_5th_order_module ,only : periodic_5th_order + class(periodic_5th_factory), intent(in) :: this + class(field) ,pointer :: new_periodic_5th_order + end function +end module + +program main + use field_module ,only : field + use field_factory_module ,only : field_factory + use periodic_5th_factory_module ,only : periodic_5th_factory + implicit none + class(field) ,pointer :: u + class(field_factory), allocatable :: field_creator + allocate (periodic_5th_factory :: field_creator) + u => field_creator%create() +end program + +! { dg-final { cleanup-modules "field_module periodic_5th_order_module field_factory_module periodic_5th_factory_module" } } diff --git a/gcc/testsuite/gfortran.dg/function_kinds_5.f90 b/gcc/testsuite/gfortran.dg/function_kinds_5.f90 index fde5bef12f8..e48484ec30d 100644 --- a/gcc/testsuite/gfortran.dg/function_kinds_5.f90 +++ b/gcc/testsuite/gfortran.dg/function_kinds_5.f90 @@ -5,6 +5,6 @@ ! ! Contributed by Tobias Burnus <burnus@gcc.gnu.org> ! -real (bad_kind(0d0)) function foo () ! { dg-error "must be an intrinsic or" } +real (bad_kind(0d0)) function foo () ! { dg-error "must be an intrinsic function" } foo = real (kind (foo)) end function diff --git a/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 b/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 new file mode 100644 index 00000000000..0918f72874c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/graphite/pr42185.f90 @@ -0,0 +1,27 @@ +! { dg-compile } +! { dg-options "-fgraphite -O -ffast-math" } + +MODULE powell + INTEGER, PARAMETER :: dp=8 +CONTAINS + SUBROUTINE trsapp (n,npt,xopt,xpt,gq,hq,pq,delta,step,d,g,hd,hs,crvmin) + REAL(dp), DIMENSION(*), INTENT(INOUT) :: step, d, g, hd, hs + LOGICAL :: jump1, jump2 + REAL(dp) :: alpha, angle, angtest, bstep, cf, cth, dd, delsq, dg, dhd, & + reduc, sg, sgk, shs, ss, sth, temp, tempa, tempb + DO i=1,n + dd=dd+d(i)**2 + END DO + mainloop : DO + IF ( .NOT. jump2 ) THEN + IF ( .NOT. jump1 ) THEN + bstep=temp/(ds+SQRT(ds*ds+dd*temp)) + IF (alpha < bstep) THEN + IF (ss < delsq) CYCLE mainloop + END IF + IF (gg <= 1.0e-4_dp*ggbeg) EXIT mainloop + END IF + END IF + END DO mainloop + END SUBROUTINE trsapp +END MODULE powell diff --git a/gcc/testsuite/gfortran.dg/intrinsic_std_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_std_1.f90 index 8f406fecaa8..9c97b7eaa5d 100644 --- a/gcc/testsuite/gfortran.dg/intrinsic_std_1.f90 +++ b/gcc/testsuite/gfortran.dg/intrinsic_std_1.f90 @@ -32,7 +32,7 @@ END SUBROUTINE implicit_type SUBROUTINE specification_expression CHARACTER(KIND=selected_char_kind("ascii")) :: x -! { dg-error "specification function" "" { target "*-*-*" } 34 } +! { dg-error "must be an intrinsic function" "" { target "*-*-*" } 34 } ! { dg-warning "Fortran 2003" "" { target "*-*-*" } 34 } END SUBROUTINE specification_expression diff --git a/gcc/testsuite/gfortran.dg/iso_c_binding_init_expr.f03 b/gcc/testsuite/gfortran.dg/iso_c_binding_init_expr.f03 new file mode 100644 index 00000000000..840b60e4eb2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/iso_c_binding_init_expr.f03 @@ -0,0 +1,11 @@ +! { dg-do "compile" } +! PR fortran/42354 + +use iso_c_binding +implicit none +integer, target :: a +type t + type(c_ptr) :: ptr = c_loc(a) ! { dg-error "must be an intrinsic function" } +end type t +type(c_ptr) :: ptr2 = c_loc(a) ! { dg-error "must be an intrinsic function" } +end diff --git a/gcc/testsuite/gfortran.dg/selected_char_kind_3.f90 b/gcc/testsuite/gfortran.dg/selected_char_kind_3.f90 index a7b7ae7d895..59bc18f1f6f 100644 --- a/gcc/testsuite/gfortran.dg/selected_char_kind_3.f90 +++ b/gcc/testsuite/gfortran.dg/selected_char_kind_3.f90 @@ -4,7 +4,7 @@ ! Check that SELECTED_CHAR_KIND is rejected with -std=f95 ! implicit none - character(kind=selected_char_kind("ascii")) :: s ! { dg-error "must be an intrinsic or a specification function" } + character(kind=selected_char_kind("ascii")) :: s ! { dg-error "must be an intrinsic function" } s = "" ! { dg-error "has no IMPLICIT type" } print *, s end diff --git a/gcc/testsuite/objc/execute/forward-1.x b/gcc/testsuite/objc/execute/forward-1.x index 2b7ca2a8e68..8d4bcf5ff45 100644 --- a/gcc/testsuite/objc/execute/forward-1.x +++ b/gcc/testsuite/objc/execute/forward-1.x @@ -1,8 +1,6 @@ load_lib target-supports.exp # XFAIL: PR libobjc/36610, for targets which pass arguments via registers -# For powerpc-darwin it fails with -fgnu-runtime, passes with -fnext-runtime, -# but that would be too ugly to handle; let it fail there. if { ([istarget x86_64-*-linux*] && [check_effective_target_lp64] ) || [istarget powerpc*-*-linux*] @@ -15,4 +13,21 @@ if { ([istarget x86_64-*-linux*] && [check_effective_target_lp64] ) set torture_execute_xfail "*-*-*" } +# For darwin and alpha-linux it fails with -fgnu-runtime, +# passes with -fnext-runtime. + +if { ([istarget x86_64-*-darwin*] && [check_effective_target_lp64] ) + || [istarget powerpc*-*-darwin*] + || [istarget alpha*-*-linux*] } { + set torture_eval_before_execute { + global compiler_conditional_xfail_data + set compiler_conditional_xfail_data { + "Target fails with -fgnu-runtime" \ + "*-*-*" \ + { "-fgnu-runtime" } \ + { "" } + } + } +} + return 0 diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index 9711e20b5be..18ed4ed2a38 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -1293,6 +1293,8 @@ keep_cast: if (use_overflow_semantics && (TREE_CODE (chrec) == PLUS_EXPR || TREE_CODE (chrec) == MINUS_EXPR) + && TREE_CODE (type) == INTEGER_TYPE + && TREE_CODE (ct) == INTEGER_TYPE && TYPE_PRECISION (type) > TYPE_PRECISION (ct) && TYPE_OVERFLOW_UNDEFINED (ct)) res = fold_build2 (TREE_CODE (chrec), type, diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 1b0421c5ef0..dbdd3237d5e 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -4630,70 +4630,6 @@ debug_rdg (struct graph *rdg) dump_rdg (stderr, rdg); } -static void -dot_rdg_1 (FILE *file, struct graph *rdg) -{ - int i; - - fprintf (file, "digraph RDG {\n"); - - for (i = 0; i < rdg->n_vertices; i++) - { - struct vertex *v = &(rdg->vertices[i]); - struct graph_edge *e; - - /* Highlight reads from memory. */ - if (RDG_MEM_READS_STMT (rdg, i)) - fprintf (file, "%d [style=filled, fillcolor=green]\n", i); - - /* Highlight stores to memory. */ - if (RDG_MEM_WRITE_STMT (rdg, i)) - fprintf (file, "%d [style=filled, fillcolor=red]\n", i); - - if (v->succ) - for (e = v->succ; e; e = e->succ_next) - switch (RDGE_TYPE (e)) - { - case input_dd: - fprintf (file, "%d -> %d [label=input] \n", i, e->dest); - break; - - case output_dd: - fprintf (file, "%d -> %d [label=output] \n", i, e->dest); - break; - - case flow_dd: - /* These are the most common dependences: don't print these. */ - fprintf (file, "%d -> %d \n", i, e->dest); - break; - - case anti_dd: - fprintf (file, "%d -> %d [label=anti] \n", i, e->dest); - break; - - default: - gcc_unreachable (); - } - } - - fprintf (file, "}\n\n"); -} - -/* Display SCOP using dotty. */ - -void -dot_rdg (struct graph *rdg) -{ - FILE *file = fopen ("/tmp/rdg.dot", "w"); - gcc_assert (file != NULL); - - dot_rdg_1 (file, rdg); - fclose (file); - - system ("dotty /tmp/rdg.dot"); -} - - /* This structure is used for recording the mapping statement index in the RDG. */ diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h index e945ecb464d..678eb10cc18 100644 --- a/gcc/tree-data-ref.h +++ b/gcc/tree-data-ref.h @@ -504,7 +504,6 @@ void dump_rdg_component (FILE *, struct graph *, int, bitmap); void debug_rdg_component (struct graph *, int); void dump_rdg (FILE *, struct graph *); void debug_rdg (struct graph *); -void dot_rdg (struct graph *); int rdg_vertex_for_stmt (struct graph *, gimple); /* Data dependence type. */ diff --git a/gcc/tree.c b/gcc/tree.c index 769b332e244..7fa7649d2f9 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -4152,13 +4152,10 @@ free_lang_data_in_binfo (tree binfo) gcc_assert (TREE_CODE (binfo) == TREE_BINFO); - BINFO_OFFSET (binfo) = NULL_TREE; BINFO_VTABLE (binfo) = NULL_TREE; - BINFO_VPTR_FIELD (binfo) = NULL_TREE; BINFO_BASE_ACCESSES (binfo) = NULL; BINFO_INHERITANCE_CHAIN (binfo) = NULL_TREE; BINFO_SUBVTT_INDEX (binfo) = NULL_TREE; - BINFO_VPTR_FIELD (binfo) = NULL_TREE; for (i = 0; VEC_iterate (tree, BINFO_BASE_BINFOS (binfo), i, t); i++) free_lang_data_in_binfo (t); @@ -4253,7 +4250,8 @@ free_lang_data_in_type (tree type) } TYPE_CONTEXT (type) = NULL_TREE; - TYPE_STUB_DECL (type) = NULL_TREE; + if (debug_info_level < DINFO_LEVEL_TERSE) + TYPE_STUB_DECL (type) = NULL_TREE; } @@ -4380,29 +4378,16 @@ free_lang_data_in_decl (tree decl) } } - if (TREE_CODE (decl) == PARM_DECL - || TREE_CODE (decl) == FIELD_DECL - || TREE_CODE (decl) == RESULT_DECL) - { - tree unit_size = DECL_SIZE_UNIT (decl); - tree size = DECL_SIZE (decl); - if ((unit_size && TREE_CODE (unit_size) != INTEGER_CST) - || (size && TREE_CODE (size) != INTEGER_CST)) - { - DECL_SIZE_UNIT (decl) = NULL_TREE; - DECL_SIZE (decl) = NULL_TREE; - } + /* ??? We could free non-constant DECL_SIZE, DECL_SIZE_UNIT + and DECL_FIELD_OFFSET. But it's cheap enough to not do + that and refrain from adding workarounds to dwarf2out.c */ - if (TREE_CODE (decl) == FIELD_DECL - && DECL_FIELD_OFFSET (decl) - && TREE_CODE (DECL_FIELD_OFFSET (decl)) != INTEGER_CST) - DECL_FIELD_OFFSET (decl) = NULL_TREE; + /* DECL_FCONTEXT is only used for debug info generation. */ + if (TREE_CODE (decl) == FIELD_DECL + && debug_info_level < DINFO_LEVEL_TERSE) + DECL_FCONTEXT (decl) = NULL_TREE; - /* DECL_FCONTEXT is only used for debug info generation. */ - if (TREE_CODE (decl) == FIELD_DECL) - DECL_FCONTEXT (decl) = NULL_TREE; - } - else if (TREE_CODE (decl) == FUNCTION_DECL) + if (TREE_CODE (decl) == FUNCTION_DECL) { if (gimple_has_body_p (decl)) { @@ -4977,13 +4962,6 @@ free_lang_data (void) diagnostic_finalizer (global_dc) = default_diagnostic_finalizer; diagnostic_format_decoder (global_dc) = default_tree_printer; - /* FIXME. We remove sufficient language data that the debug - info writer gets completely confused. Disable debug information - for now. */ - debug_info_level = DINFO_LEVEL_NONE; - write_symbols = NO_DEBUG; - debug_hooks = &do_nothing_debug_hooks; - return 0; } diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 8267df825ee..db7778b8e74 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -4375,19 +4375,19 @@ replace_expr_with_values (rtx loc) MO_CLOBBER if no micro operation is to be generated. */ static enum micro_operation_type -use_type (rtx *loc, struct count_use_info *cui, enum machine_mode *modep) +use_type (rtx loc, struct count_use_info *cui, enum machine_mode *modep) { tree expr; cselib_val *val; if (cui && cui->sets) { - if (GET_CODE (*loc) == VAR_LOCATION) + if (GET_CODE (loc) == VAR_LOCATION) { - if (track_expr_p (PAT_VAR_LOCATION_DECL (*loc), false)) + if (track_expr_p (PAT_VAR_LOCATION_DECL (loc), false)) { - rtx ploc = PAT_VAR_LOCATION_LOC (*loc); - cselib_val *val = cselib_lookup (ploc, GET_MODE (*loc), 1); + rtx ploc = PAT_VAR_LOCATION_LOC (loc); + cselib_val *val = cselib_lookup (ploc, GET_MODE (loc), 1); /* ??? flag_float_store and volatile mems are never given values, but we could in theory use them for @@ -4399,15 +4399,15 @@ use_type (rtx *loc, struct count_use_info *cui, enum machine_mode *modep) return MO_CLOBBER; } - if ((REG_P (*loc) || MEM_P (*loc)) - && (val = find_use_val (*loc, GET_MODE (*loc), cui))) + if ((REG_P (loc) || MEM_P (loc)) + && (val = find_use_val (loc, GET_MODE (loc), cui))) { if (modep) - *modep = GET_MODE (*loc); + *modep = GET_MODE (loc); if (cui->store_p) { - if (REG_P (*loc) - || cselib_lookup (XEXP (*loc, 0), GET_MODE (*loc), 0)) + if (REG_P (loc) + || cselib_lookup (XEXP (loc, 0), GET_MODE (loc), 0)) return MO_VAL_SET; } else if (!cselib_preserved_value_p (val)) @@ -4415,31 +4415,31 @@ use_type (rtx *loc, struct count_use_info *cui, enum machine_mode *modep) } } - if (REG_P (*loc)) + if (REG_P (loc)) { - gcc_assert (REGNO (*loc) < FIRST_PSEUDO_REGISTER); + gcc_assert (REGNO (loc) < FIRST_PSEUDO_REGISTER); - expr = REG_EXPR (*loc); + expr = REG_EXPR (loc); if (!expr) return MO_USE_NO_VAR; else if (target_for_debug_bind (var_debug_decl (expr))) return MO_CLOBBER; - else if (track_loc_p (*loc, expr, REG_OFFSET (*loc), + else if (track_loc_p (loc, expr, REG_OFFSET (loc), false, modep, NULL)) return MO_USE; else return MO_USE_NO_VAR; } - else if (MEM_P (*loc)) + else if (MEM_P (loc)) { - expr = MEM_EXPR (*loc); + expr = MEM_EXPR (loc); if (!expr) return MO_CLOBBER; else if (target_for_debug_bind (var_debug_decl (expr))) return MO_CLOBBER; - else if (track_loc_p (*loc, expr, INT_MEM_OFFSET (*loc), + else if (track_loc_p (loc, expr, INT_MEM_OFFSET (loc), false, modep, NULL)) return MO_USE; else @@ -4467,37 +4467,38 @@ log_op_type (rtx x, basic_block bb, rtx insn, INSN is instruction which the LOC is part of. */ static int -count_uses (rtx *loc, void *cuip) +count_uses (rtx *ploc, void *cuip) { + rtx loc = *ploc; struct count_use_info *cui = (struct count_use_info *) cuip; enum micro_operation_type mopt = use_type (loc, cui, NULL); if (mopt != MO_CLOBBER) { cselib_val *val; - enum machine_mode mode = GET_MODE (*loc); + enum machine_mode mode = GET_MODE (loc); VTI (cui->bb)->n_mos++; if (dump_file && (dump_flags & TDF_DETAILS)) - log_op_type (*loc, cui->bb, cui->insn, mopt, dump_file); + log_op_type (loc, cui->bb, cui->insn, mopt, dump_file); switch (mopt) { case MO_VAL_LOC: - loc = &PAT_VAR_LOCATION_LOC (*loc); - if (VAR_LOC_UNKNOWN_P (*loc)) + loc = PAT_VAR_LOCATION_LOC (loc); + if (VAR_LOC_UNKNOWN_P (loc)) break; /* Fall through. */ case MO_VAL_USE: case MO_VAL_SET: - if (MEM_P (*loc) - && !REG_P (XEXP (*loc, 0)) && !MEM_P (XEXP (*loc, 0))) + if (MEM_P (loc) + && !REG_P (XEXP (loc, 0)) && !MEM_P (XEXP (loc, 0))) { enum machine_mode address_mode - = targetm.addr_space.address_mode (MEM_ADDR_SPACE (*loc)); - val = cselib_lookup (XEXP (*loc, 0), address_mode, false); + = targetm.addr_space.address_mode (MEM_ADDR_SPACE (loc)); + val = cselib_lookup (XEXP (loc, 0), address_mode, false); if (val && !cselib_preserved_value_p (val)) { @@ -4506,9 +4507,30 @@ count_uses (rtx *loc, void *cuip) } } - val = find_use_val (*loc, mode, cui); + val = find_use_val (loc, mode, cui); if (val) - cselib_preserve_value (val); + { + if (mopt == MO_VAL_SET + && GET_CODE (PATTERN (cui->insn)) == COND_EXEC + && (REG_P (loc) + || (MEM_P (loc) + && (use_type (loc, NULL, NULL) == MO_USE + || cui->sets)))) + { + cselib_val *oval = cselib_lookup (loc, GET_MODE (loc), 0); + + gcc_assert (oval != val); + gcc_assert (REG_P (loc) || MEM_P (loc)); + + if (!cselib_preserved_value_p (oval)) + { + VTI (cui->bb)->n_mos++; + cselib_preserve_value (oval); + } + } + + cselib_preserve_value (val); + } else gcc_assert (mopt == MO_VAL_LOC); @@ -4590,8 +4612,9 @@ count_with_sets (rtx insn, struct cselib_set *sets, int n_sets) to VTI (bb)->mos. INSN is instruction which the LOC is part of. */ static int -add_uses (rtx *loc, void *data) +add_uses (rtx *ploc, void *data) { + rtx loc = *ploc; enum machine_mode mode = VOIDmode; struct count_use_info *cui = (struct count_use_info *)data; enum micro_operation_type type = use_type (loc, cui, &mode); @@ -4602,12 +4625,12 @@ add_uses (rtx *loc, void *data) micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; mo->type = type; - mo->u.loc = type == MO_USE ? var_lowpart (mode, *loc) : *loc; + mo->u.loc = type == MO_USE ? var_lowpart (mode, loc) : loc; mo->insn = cui->insn; if (type == MO_VAL_LOC) { - rtx oloc = *loc; + rtx oloc = loc; rtx vloc = PAT_VAR_LOCATION_LOC (oloc); cselib_val *val; @@ -4655,7 +4678,7 @@ add_uses (rtx *loc, void *data) oloc = gen_rtx_CONCAT (mode, val->val_rtx, oloc); - type2 = use_type (&vloc, 0, &mode2); + type2 = use_type (vloc, 0, &mode2); gcc_assert (type2 == MO_USE || type2 == MO_USE_NO_VAR || type2 == MO_CLOBBER); @@ -4679,8 +4702,8 @@ add_uses (rtx *loc, void *data) { enum machine_mode mode2 = VOIDmode; enum micro_operation_type type2; - cselib_val *val = find_use_val (*loc, GET_MODE (*loc), cui); - rtx vloc, oloc = *loc, nloc; + cselib_val *val = find_use_val (loc, GET_MODE (loc), cui); + rtx vloc, oloc = loc, nloc; gcc_assert (cui->sets); @@ -4718,7 +4741,7 @@ add_uses (rtx *loc, void *data) || type2 == MO_CLOBBER); if (type2 == MO_USE) - vloc = var_lowpart (mode2, *loc); + vloc = var_lowpart (mode2, loc); else vloc = oloc; @@ -4732,7 +4755,7 @@ add_uses (rtx *loc, void *data) */ - nloc = replace_expr_with_values (*loc); + nloc = replace_expr_with_values (loc); if (!nloc) nloc = oloc; @@ -4781,7 +4804,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip) basic_block bb = cui->bb; micro_operation *mo; rtx oloc = loc, nloc, src = NULL; - enum micro_operation_type type = use_type (&loc, cui, &mode); + enum micro_operation_type type = use_type (loc, cui, &mode); bool track_p = false; cselib_val *v; bool resolve, preserve; @@ -4796,7 +4819,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip) mo = VTI (bb)->mos + VTI (bb)->n_mos++; if ((GET_CODE (expr) == CLOBBER && type != MO_VAL_SET) - || !(track_p = use_type (&loc, NULL, &mode2) == MO_USE) + || !(track_p = use_type (loc, NULL, &mode2) == MO_USE) || GET_CODE (expr) == CLOBBER) { mo->type = MO_CLOBBER; @@ -4815,19 +4838,21 @@ add_stores (rtx loc, const_rtx expr, void *cuip) } else { + rtx xexpr = CONST_CAST_RTX (expr); + if (SET_SRC (expr) != src) - expr = gen_rtx_SET (VOIDmode, loc, src); + xexpr = gen_rtx_SET (VOIDmode, loc, src); if (same_variable_part_p (src, REG_EXPR (loc), REG_OFFSET (loc))) mo->type = MO_COPY; else mo->type = MO_SET; - mo->u.loc = CONST_CAST_RTX (expr); + mo->u.loc = xexpr; } } mo->insn = cui->insn; } else if (MEM_P (loc) - && ((track_p = use_type (&loc, NULL, &mode2) == MO_USE) + && ((track_p = use_type (loc, NULL, &mode2) == MO_USE) || cui->sets)) { mo = VTI (bb)->mos + VTI (bb)->n_mos++; @@ -4872,15 +4897,17 @@ add_stores (rtx loc, const_rtx expr, void *cuip) } else { + rtx xexpr = CONST_CAST_RTX (expr); + if (SET_SRC (expr) != src) - expr = gen_rtx_SET (VOIDmode, loc, src); - if (same_variable_part_p (SET_SRC (expr), + xexpr = gen_rtx_SET (VOIDmode, loc, src); + if (same_variable_part_p (SET_SRC (xexpr), MEM_EXPR (loc), INT_MEM_OFFSET (loc))) mo->type = MO_COPY; else mo->type = MO_SET; - mo->u.loc = CONST_CAST_RTX (expr); + mo->u.loc = xexpr; } } mo->insn = cui->insn; @@ -4899,9 +4926,41 @@ add_stores (rtx loc, const_rtx expr, void *cuip) if (nloc) oloc = nloc; - if (resolve && GET_CODE (mo->u.loc) == SET) + if (GET_CODE (PATTERN (cui->insn)) == COND_EXEC) { - nloc = replace_expr_with_values (SET_SRC (mo->u.loc)); + cselib_val *oval = cselib_lookup (oloc, GET_MODE (oloc), 0); + + gcc_assert (oval != v); + gcc_assert (REG_P (oloc) || MEM_P (oloc)); + + if (!cselib_preserved_value_p (oval)) + { + micro_operation *nmo = VTI (bb)->mos + VTI (bb)->n_mos++; + + cselib_preserve_value (oval); + + nmo->type = MO_VAL_USE; + nmo->u.loc = gen_rtx_CONCAT (mode, oval->val_rtx, oloc); + VAL_NEEDS_RESOLUTION (nmo->u.loc) = 1; + nmo->insn = mo->insn; + + if (dump_file && (dump_flags & TDF_DETAILS)) + log_op_type (nmo->u.loc, cui->bb, cui->insn, + nmo->type, dump_file); + } + + resolve = false; + } + else if (resolve && GET_CODE (mo->u.loc) == SET) + { + nloc = replace_expr_with_values (SET_SRC (expr)); + + /* Avoid the mode mismatch between oexpr and expr. */ + if (!nloc && mode != mode2) + { + nloc = SET_SRC (expr); + gcc_assert (oloc == SET_DEST (expr)); + } if (nloc) oloc = gen_rtx_SET (GET_MODE (mo->u.loc), oloc, nloc); @@ -4940,7 +4999,8 @@ add_stores (rtx loc, const_rtx expr, void *cuip) (concat (concat val dstv) (set dst src)): dst now holds val, copied from src. dstv is a value-based representation of dst, if - it differs from dst. If resolution is needed, src is a REG. + it differs from dst. If resolution is needed, src is a REG, and + its mode is the same as that of val. (concat (concat val (set dstv srcv)) (set dst src)): src copied to dst, holding val. dstv and srcv are value-based diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 647e91f55da..0d14813f74f 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,7 @@ +2009-12-15 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. + 2009-12-13 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE diff --git a/libffi/testsuite/libffi.call/ffitest.h b/libffi/testsuite/libffi.call/ffitest.h index 5f157788291..52220a39b24 100644 --- a/libffi/testsuite/libffi.call/ffitest.h +++ b/libffi/testsuite/libffi.call/ffitest.h @@ -54,6 +54,11 @@ #define PRIuLL "llu" #endif +/* PA HP-UX kludge. */ +#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) +#define PRIuPTR "lu" +#endif + /* Solaris < 10 kludge. */ #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) #if defined(__arch64__) || defined (__x86_64__) diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 510ba40cdd6..5d2822028e7 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2009-12-18 Jack Howarth <howarth@bromo.med.uc.edu> + + PR testsuite/42135 + * libgomp.graphite/force-parallel-2.c: Reduce array size. + 2009-12-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * Makefile.in: Regenerate. diff --git a/libgomp/testsuite/libgomp.graphite/force-parallel-2.c b/libgomp/testsuite/libgomp.graphite/force-parallel-2.c index 7f2c823f73e..03d823653a7 100644 --- a/libgomp/testsuite/libgomp.graphite/force-parallel-2.c +++ b/libgomp/testsuite/libgomp.graphite/force-parallel-2.c @@ -3,7 +3,7 @@ void abort (void); void parloop (int N) { int i, j; - int x[10000][10000]; + int x[500][500]; for (i = 0; i < N; i++) for (j = 0; j < N; j++) @@ -17,7 +17,7 @@ void parloop (int N) int main(void) { - parloop(10000); + parloop(500); return 0; } diff --git a/libjava/ChangeLog b/libjava/ChangeLog index adef8782f74..0701bd395a7 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2009-12-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure.ac: Remove code to un-precious-ize CC, CXX, + CXXFLAGS, CFLAGS, LDFLAGS. + * configure: Regenerate. + 2009-12-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * include/pa-signal.h: Do not include ucontext.h. diff --git a/libjava/configure b/libjava/configure index 1a7d625c96d..605225b19a0 100755 --- a/libjava/configure +++ b/libjava/configure @@ -961,8 +961,15 @@ with_jvm_jar_dir ac_precious_vars='build_alias host_alias target_alias -CPP +CC +CFLAGS +LDFLAGS +LIBS CPPFLAGS +CXX +CXXFLAGS +CCC +CPP CXXCPP XMKMF' ac_subdirs_all='classpath libltdl' @@ -3339,18 +3346,9 @@ fi # It may not be safe to run linking tests in AC_PROG_CC/AC_PROG_CXX. -# (1) We use an abnormal CXX (without library references), so we -# must cache it under a different name. -# (2) CC, CFLAGS, CXX, CXXFLAGS, LDFLAGS must not be 'precious', or -# the non-multilib-adjusted value will be used in multilibs. -# (3) As a side effect, we must SUBST CXXFLAGS, CFLAGS, and LDFLAGS ourselves. -# (4) As another side effect, automake doesn't automatically include them -# in Makefile.in. -# (5) For libstdc++-v3, -fno-builtin must be present here so that a +# For libstdc++-v3, -fno-builtin must be present here so that a # non-conflicting form of std::exit can be guessed by AC_PROG_CXX, and # used in later tests. This may not be necessary in libjava; I don't know. - - save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-builtin" ac_ext=c @@ -4406,10 +4404,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CXXFLAGS="$save_CXXFLAGS" - - - - am__api_version='1.11' # Find a good install program. We prefer a C program (faster), @@ -13244,7 +13238,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13247 "configure" +#line 13241 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13350,7 +13344,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13353 "configure" +#line 13347 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -19215,7 +19209,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then : enableval=$enable_sjlj_exceptions; : else cat > conftest.$ac_ext << EOF -#line 19218 "configure" +#line 19212 "configure" struct S { ~S(); }; void bar(); void foo() diff --git a/libjava/configure.ac b/libjava/configure.ac index d8cb6103fea..3721e1c34ed 100644 --- a/libjava/configure.ac +++ b/libjava/configure.ac @@ -142,27 +142,14 @@ AM_CONDITIONAL(JAVA_MAINTAINER_MODE, test "$enable_java_maintainer_mode" = yes) # It may not be safe to run linking tests in AC_PROG_CC/AC_PROG_CXX. GCC_NO_EXECUTABLES -# (1) We use an abnormal CXX (without library references), so we -# must cache it under a different name. -# (2) CC, CFLAGS, CXX, CXXFLAGS, LDFLAGS must not be 'precious', or -# the non-multilib-adjusted value will be used in multilibs. -# (3) As a side effect, we must SUBST CXXFLAGS, CFLAGS, and LDFLAGS ourselves. -# (4) As another side effect, automake doesn't automatically include them -# in Makefile.in. -# (5) For libstdc++-v3, -fno-builtin must be present here so that a +# For libstdc++-v3, -fno-builtin must be present here so that a # non-conflicting form of std::exit can be guessed by AC_PROG_CXX, and # used in later tests. This may not be necessary in libjava; I don't know. -m4_rename([_AC_ARG_VAR_PRECIOUS],[glibcxx_PRECIOUS]) -m4_define([_AC_ARG_VAR_PRECIOUS],[]) save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-builtin" AC_PROG_CC AC_PROG_CXX CXXFLAGS="$save_CXXFLAGS" -m4_rename_force([glibcxx_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) -AC_SUBST(CFLAGS) -AC_SUBST(CXXFLAGS) -AC_SUBST(LDFLAGS) AM_INIT_AUTOMAKE([1.9.0]) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7c20083923a..2077dc14ec7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,154 @@ +2009-12-18 Jimmy Guo <jguo@yahoo-inc.com> + + PR libstdc++/40088 + * src/locale_init.cc (locale::locale()): Optimize the common case + where _S_global still points to _S_classic. + +2009-12-17 Dave Korn <dave.korn.cygwin@gmail.com> + + PR target/42377 + * config/abi/pre/gnu.ver: Adjust mangled function signatures to permit + LLP64 sizetypes throughout. + +2009-12-17 Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/42198 + * src/thread.cc (thread::_M_start_thread): Throw system_error + immediately if the thread system is inactive. + +2009-12-16 Benjamin Kosnik <bkoz@redhat.com> + + PR libstdc++/21772 part 2 + * doc/xml/manual/test.xml: Add documentation about testing details. + * testsuite/util/exception/safety.h: New. Functor objects for + testing C++0x container classes. + * testsuite/util/testsuite_container_traits.h: Add traits. + + * testsuite/23_containers/list/requirements/exception/ + basic.cc: New. + generation_prohibited.cc: New. + propagation_consistent.cc: New. + +2009-12-15 Benjamin Kosnik <bkoz@redhat.com> + + PR libstdc++/21772 part 1 + * include/ext/throw_allocator.h: Rework. + (__gnu_cxx::throw_allocator): To... + (__gnu_cxx::throw_allocator_limit): ...this. + (__gnu_cxx::throw_allocator_random): ...and this. + (throw_value_base, throw_value_limit, throw_value_random): Add. + (condition_base, random_condition, limit_condition): Add. + (forced_exception_error): To... + (forced_error): ...this. + * testsuite/ext/throw_value: New. + * testsuite/ext/throw_value/cons.cc: New. + * testsuite/ext/throw_allocator/deallocate_global.cc: Adjust for + throw_allocator, forced_exception_error changes. + * testsuite/ext/throw_allocator/check_delete.cc: Same. + * testsuite/ext/throw_allocator/check_allocate_max_size.cc: Same. + * testsuite/ext/throw_allocator/check_deallocate_null.cc: Same. + * testsuite/ext/throw_allocator/explicit_instantiation.cc: Same. + * testsuite/ext/throw_allocator/check_new.cc: Same. + * testsuite/ext/throw_allocator/variadic_construct.cc: Same. + * testsuite/ext/throw_allocator/deallocate_local.cc: Same. + * testsuite/23_containers/list/modifiers/insert/25288.cc: Same. + * testsuite/23_containers/list/modifiers/insert/25288.h: Same. + * testsuite/util/regression/common_type.hpp: Same. + * testsuite/util/regression/rand/priority_queue/ + container_rand_regression_test.tcc: Same. + * testsuite/util/regression/rand/assoc/ + container_rand_regression_test.h: Same. + * testsuite/util/regression/rand/assoc/ + container_rand_regression_test.tcc: Same. + * testsuite/util/regression/basic_type.hpp: Same. + + * testsuite/ext/forced_exception_error/cons_virtual_derivation.cc: To... + * testsuite/ext/forced_error/cons_virtual_derivation.cc: ...this, same. + +2009-12-15 Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/42381 + * include/bits/stl_deque.h (_GLIBCXX_DEQUE_BUF_SIZE): Add. + (__deque_buf_size(size_t)): Use it. + * testsuite/23_containers/deque/requirements/dr438/ + assign_neg.cc: Adjust dg-error line numbers. + * testsuite/23_containers/deque/requirements/dr438/ + insert_neg.cc: Likewise. + * testsuite/23_containers/deque/requirements/dr438/ + constructor_1_neg.cc: Likewise. + * testsuite/23_containers/deque/requirements/dr438/ + constructor_2_neg.cc: Likewise. + +2009-12-15 Jonathan Wakely <jwakely.gcc@gmail.com> + + * include/std/future (unique_future::get, promise::set_value): Remove + workaround for c++/34022. + (packaged_task::get_future, packaged_task::operator()): Use + __throw_bad_function_call. + * testsuite/30_threads/packaged_task/cons/assign_neg.cc: Adjust. + * testsuite/30_threads/packaged_task/cons/copy_neg.cc: Likewise. + * testsuite/30_threads/promise/cons/assign_neg.cc: Likewise. + * testsuite/30_threads/promise/cons/copy_neg.cc: Likewise. + * testsuite/30_threads/shared_future/cons/assign_neg.cc: Likewise. + * testsuite/30_threads/unique_future/cons/assign_neg.cc: Likewise. + * testsuite/30_threads/unique_future/cons/copy_neg.cc: Likewise. + +2009-12-15 Jonathan Wakely <jwakely.gcc@gmail.com> + + * include/std/functional (function::function): Move construct target. + (function::operator=): Use perfect forwarding for argument. + (function::operator()): Use new __throw_bad_function_call. + * include/bits/functexcept.h (__throw_bad_function_call): Declare. + * src/functexcept.cc (__throw_bad_function_call): Define. + * config/abi/pre/gnu.ver: Add new symbol. + * testsuite/20_util/function/cons/move_target.cc: New. + * testsuite/20_util/function/assign/move_target.cc: New. + +2009-12-15 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/42379 + * testsuite/23_containers/set/operators/1_neg.cc: Fix dg-error strings. + * testsuite/23_containers/map/operators/1_neg.cc: Likewise. + +2009-12-14 Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/25304, DR 865 [Ready] + * include/bits/stl_algobase.h (fill_n): Add comment about DR 865. + * include/bits/stl_algo.h (generate_n): Likewise. + * include/bits/algorithmfwd.h: Remove obsolete comment. + * doc/xml/manual/intro.xml: Add an entry for DR 865. + +2009-12-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure.ac: Remove code to un-precious-ize CC, CXX, + CXXFLAGS, CFLAGS, LDFLAGS. + * configure: Regenerate. + +2009-12-14 Paolo Carlini <paolo.carlini@oracle.com> + + * testsuite/23_containers/queue/requirements/ + explicit_instantiation/1_c++0x.cc: New. + * testsuite/23_containers/priority_queue/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/multimap/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/bitset/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/set/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/vector/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/deque/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/stack/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/multiset/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/list/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + * testsuite/23_containers/map/requirements/ + explicit_instantiation/1_c++0x.cc: Likewise. + 2009-12-14 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/stl_list.h (splice(iterator, list&), splice(iterator, @@ -81,7 +232,7 @@ 2009-12-10 Paolo Carlini <paolo.carlini@oracle.com> Revert: - 2009-12-03 Paolo Carlini <paolo.carlini@oracle.com> + 2009-12-03 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/42261 * include/bits/basic_string.h (_S_construct_aux(_Integer, _Integer, @@ -211,21 +362,21 @@ 2009-11-30 Jonathan Wakely <jwakely.gcc@gmail.com> - * include/tr1_impl/functional (function): Add rvalue support and - tweak doxygen markup. - * testsuite/20_util/function/assign/move.cc: New. - * testsuite/20_util/function/cons/move.cc: New. - * testsuite/20_util/function/invoke/move_only.cc: New. - * testsuite/20_util/function/cmp/cmp_neg.cc: New. - * testsuite/20_util/function/1.cc: Copy from testsuite/tr1/. - * testsuite/20_util/function/2.cc: Likewise. - * testsuite/20_util/function/3.cc: Likewise. - * testsuite/20_util/function/4.cc: Likewise. - * testsuite/20_util/function/5.cc: Likewise. - * testsuite/20_util/function/6.cc: Likewise. - * testsuite/20_util/function/7.cc: Likewise. - * testsuite/20_util/function/8.cc: Likewise. - * testsuite/20_util/function/9.cc: Likewise. + * include/tr1_impl/functional (function): Add rvalue support and + tweak doxygen markup. + * testsuite/20_util/function/assign/move.cc: New. + * testsuite/20_util/function/cons/move.cc: New. + * testsuite/20_util/function/invoke/move_only.cc: New. + * testsuite/20_util/function/cmp/cmp_neg.cc: New. + * testsuite/20_util/function/1.cc: Copy from testsuite/tr1/. + * testsuite/20_util/function/2.cc: Likewise. + * testsuite/20_util/function/3.cc: Likewise. + * testsuite/20_util/function/4.cc: Likewise. + * testsuite/20_util/function/5.cc: Likewise. + * testsuite/20_util/function/6.cc: Likewise. + * testsuite/20_util/function/7.cc: Likewise. + * testsuite/20_util/function/8.cc: Likewise. + * testsuite/20_util/function/9.cc: Likewise. 2009-11-29 Jonathan Wakely <jwakely.gcc@gmail.com> @@ -290,10 +441,10 @@ 2009-11-19 Johannes Singler <singler@kit.edu> - * include/parallel/partition.h (__parallel_partition): Correctly - initialize chunk size. - (__parallel_nth_element): Respect nth_element_minimal_n. Use - sequential nth_element as base case, instead of sequential sort. + * include/parallel/partition.h (__parallel_partition): Correctly + initialize chunk size. + (__parallel_nth_element): Respect nth_element_minimal_n. Use + sequential nth_element as base case, instead of sequential sort. 2009-11-17 Benjamin Kosnik <bkoz@redhat.com> @@ -764,26 +915,26 @@ 009-10-20 Paolo Carlini <paolo.carlini@oracle.com> - PR libstdc++/41773 - Revert: - 2009-10-20 Paolo Carlini <paolo.carlini@oracle.com> - - * include/bits/basic_string.h (_S_construct(const _CharT*, size_type, - const _Alloc&)): New, declare. - (_S_construct(_CharT*, _CharT*, const _Alloc&), - _S_construct(const _CharT*, const _CharT*, const _Alloc&), - _S_construct(iterator, iterator, const _Alloc&), - _S_construct(const_iterator, const_iterator, const _Alloc&)): New, - forward to the latter. - * include/bits/basic_string.tcc (_S_construct(const _CharT*, - size_type, const _Alloc&)): Define. - (basic_string(const basic_string&, size_type, size_type), - basic_string(const basic_string&, size_type, size_type, - const _Alloc&), basic_string(const _CharT*, size_type, - const _Alloc&), basic_string(const _CharT*, const _Alloc&), - basic_string(initializer_list<>, const _Alloc&)): Call the latter. - * config/abi/pre/gnu.ver: Remove recently added exports. - * src/string-inst.cc: Remove instantiations. + PR libstdc++/41773 + Revert: + 2009-10-20 Paolo Carlini <paolo.carlini@oracle.com> + + * include/bits/basic_string.h (_S_construct(const _CharT*, size_type, + const _Alloc&)): New, declare. + (_S_construct(_CharT*, _CharT*, const _Alloc&), + _S_construct(const _CharT*, const _CharT*, const _Alloc&), + _S_construct(iterator, iterator, const _Alloc&), + _S_construct(const_iterator, const_iterator, const _Alloc&)): New, + forward to the latter. + * include/bits/basic_string.tcc (_S_construct(const _CharT*, + size_type, const _Alloc&)): Define. + (basic_string(const basic_string&, size_type, size_type), + basic_string(const basic_string&, size_type, size_type, + const _Alloc&), basic_string(const _CharT*, size_type, + const _Alloc&), basic_string(const _CharT*, const _Alloc&), + basic_string(initializer_list<>, const _Alloc&)): Call the latter. + * config/abi/pre/gnu.ver: Remove recently added exports. + * src/string-inst.cc: Remove instantiations. 2009-10-20 Paolo Carlini <paolo.carlini@oracle.com> diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 4ed1cfeb2cd..cbd0596fa9b 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -175,23 +175,28 @@ GLIBCXX_3.4 { # __gnu_debug::_Error_formatter* }; - # Names not in an 'extern' block are mangled names. + # Names not in an 'extern' block are mangled names. Character classes + # are used in many of the regex patterns to compensate for minor differences + # among the standard integer types and sizes on different platforms and + # under different modes of 64-bit architecture (ILP64, LLP64, etc.) # std::string - _ZNSsC[12][EI][PRjmvN]*; + # 'y' here and below represents 'unsigned long long' + # where it is used for size_type on LLP64 platforms. + _ZNSsC[12][EI][PRjmvyN]*; _ZNSsD*; _ZNSs[0-58-9][a-z]*; -# _ZNSs[67][a-z]*E[PRcjmv]*; - _ZNSs6appendE[PRcjmv]*; - _ZNSs6assignE[PRcjmv]*; - _ZNSs6insertE[PRcjmv]*; - _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEE[PRcjmv]*; - _ZNSs[67][j-z]*E[PRcjmv]*; - _ZNSs7[a-z]*EES2_[NPRjm]*; +# _ZNSs[67][a-z]*E[PRcjmvy]*; + _ZNSs6appendE[PRcjmvy]*; + _ZNSs6assignE[PRcjmvy]*; + _ZNSs6insertE[PRcjmvy]*; + _ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEE[PRcjmvy]*; + _ZNSs[67][j-z]*E[PRcjmvy]*; + _ZNSs7[a-z]*EES2_[NPRjmy]*; _ZNSs7[a-z]*EES2_S[12]*; _ZNSs12_Alloc_hiderC*; _ZNSs12_M_leak_hardEv; - _ZNSs12_S_constructE[jm]cRKSaIcE; + _ZNSs12_S_constructE[jmy]cRKSaIcE; _ZNSs12_S_empty_repEv; _ZNSs13_S_copy_chars*; _ZNSs[0-9][0-9]_M_replace*; @@ -204,10 +209,10 @@ GLIBCXX_3.4 { _ZNSs4_Rep15_M_set_sharableEv; _ZNSs4_Rep7_M_grab*; _ZNSs4_Rep8_M_clone*; - _ZNSs4_Rep9_S_createE[jm][jm]*; + _ZNSs4_Rep9_S_createE[jmy][jmy]*; _ZNSs7_M_dataEPc; _ZNSs7_M_leakEv; - _ZNSs9_M_mutateE[jm][jm][jm]; + _ZNSs9_M_mutateE[jmy][jmy][jmy]; _ZNSs4_Rep20_S_empty_rep_storageE; _ZNSs4_Rep11_S_max_sizeE; _ZNSs4_Rep11_S_terminalE; @@ -230,23 +235,23 @@ GLIBCXX_3.4 { _ZNKSs7compare*; _ZNKSs5c_strEv; _ZNKSs8capacityEv; - _ZNKSs4copyEPc[jm][jm]; + _ZNKSs4copyEPc[jmy][jmy]; # std::wstring - _ZNSbIwSt11char_traitsIwESaIwEEC[12][EI][PRjmvN]*; + _ZNSbIwSt11char_traitsIwESaIwEEC[12][EI][PRjmvyN]*; _ZNSbIwSt11char_traitsIwESaIwEED*; _ZNSbIwSt11char_traitsIwESaIwEE[0-58-9][a-z]*; -# _ZNSbIwSt11char_traitsIwESaIwEE[67][a-b]*E[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE6appendE[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE6assignE[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE6insertE[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EE[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE[67][j-z]*E[PRwjmv]*; - _ZNSbIwSt11char_traitsIwESaIwEE7[a-z]*EES6_[NPRjm]*; +# _ZNSbIwSt11char_traitsIwESaIwEE[67][a-b]*E[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE6appendE[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE6assignE[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE6insertE[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EE[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE[67][j-z]*E[PRwjmvy]*; + _ZNSbIwSt11char_traitsIwESaIwEE7[a-z]*EES6_[NPRjmy]*; _ZNSbIwSt11char_traitsIwESaIwEE7[a-z]*EES6_S[56]*; _ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC*; _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv; - _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructE[jm]wRKS1_; + _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructE[jmy]wRKS1_; _ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv; _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_chars*; _ZNSbIwSt11char_traitsIwESaIwEE[0-9][0-9]_M_replace*; @@ -259,10 +264,10 @@ GLIBCXX_3.4 { _ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grab*; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_clone*; - _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createE[jm][jm]*; + _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createE[jmy][jmy]*; _ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw; _ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv; - _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateE[jm][jm][jm]; + _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateE[jmy][jmy][jmy]; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE; @@ -285,7 +290,7 @@ GLIBCXX_3.4 { _ZNKSbIwSt11char_traitsIwESaIwEE7compare*; _ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv; _ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv; - _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPw[jm][jm]; + _ZNKSbIwSt11char_traitsIwESaIwEE4copyEPw[jmy][jmy]; # std::basic_streambuf _ZNSt15basic_streambufI[cw]St11char_traitsI[cw]EE[CD]*; @@ -354,7 +359,9 @@ GLIBCXX_3.4 { _ZNKSi[0-9][a-z]*; _ZNSi[0-9][a-h]*; _ZNSi[0-9][j-z]*; - _ZNSi6ignoreE[il][il]; + # 'x' here and below matches 'long long' where it + # is used for signed sizetypes on LLP64 platforms. + _ZNSi6ignoreE[ilx][ilx]; _ZNSirsE*[^g]; # std::basic_istream<wchar_t> @@ -363,7 +370,7 @@ GLIBCXX_3.4 { _ZNKSt13basic_istreamIwSt11char_traitsIwEE[0-9][a-z]*; _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][a-h]*; _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][j-z]*; - _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[il][ijlm]; + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[ilx][ijlmx]; _ZNSt13basic_istreamIwSt11char_traitsIwEErsE*[^g]; # std::istream operators and extractors @@ -380,7 +387,7 @@ GLIBCXX_3.4 { _ZNSoC*; _ZNSoD*; _ZNKSo6sentrycvbEv; - _ZNSo8_M_writeEPKc[il]; + _ZNSo8_M_writeEPKc[ilx]; _ZNSo[0-9][a-z]*; _ZNSolsE*[^g]; @@ -394,7 +401,7 @@ GLIBCXX_3.4 { _ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv; _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKw*; _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentry*; - _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKw[il]; + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKw[ilx]; _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*[^g]; # std::ostream operators and inserters @@ -533,9 +540,9 @@ GLIBCXX_3.4 { _ZSt24__throw_invalid_argumentPKc; # operator new(size_t) - _Znw[jm]; + _Znw[jmy]; # operator new(size_t, std::nothrow_t const&) - _Znw[jm]RKSt9nothrow_t; + _Znw[jmy]RKSt9nothrow_t; # operator delete(void*) _ZdlPv; @@ -543,9 +550,9 @@ GLIBCXX_3.4 { _ZdlPvRKSt9nothrow_t; # operator new[](size_t) - _Zna[jm]; + _Zna[jmy]; # operator new[](size_t, std::nothrow_t const&) - _Zna[jm]RKSt9nothrow_t; + _Zna[jmy]RKSt9nothrow_t; # operator delete[](void*) _ZdaPv; @@ -700,26 +707,26 @@ GLIBCXX_3.4 { # GLIBCXX_ABI compatibility only. # std::string _ZNKSs11_M_disjunctEPKc; - _ZNKSs15_M_check_lengthE[jm][jm]PKc; + _ZNKSs15_M_check_lengthE[jmy][jmy]PKc; _ZNSs4_Rep26_M_set_length_and_sharableE*; - _ZNSs7_M_copyEPcPKc[jm]; - _ZNSs7_M_moveEPcPKc[jm]; - _ZNSs9_M_assignEPc[jm]c; + _ZNSs7_M_copyEPcPKc[jmy]; + _ZNSs7_M_moveEPcPKc[jmy]; + _ZNSs9_M_assignEPc[jmy]c; # std::wstring _ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw; - _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthE[jm][jm]PKc; + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthE[jmy][jmy]PKc; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableE*; - _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKw[jm]; - _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKw[jm]; - _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPw[jm]w; + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKw[jmy]; + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKw[jmy]; + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPw[jmy]w; _ZNKSt13basic_fstreamI[cw]St11char_traitsI[cw]EE7is_openEv; _ZNKSt14basic_ifstreamI[cw]St11char_traitsI[cw]EE7is_openEv; _ZNKSt14basic_ofstreamI[cw]St11char_traitsI[cw]EE7is_openEv; - _ZNSi6ignoreE[ilv]; - _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[ilv]; + _ZNSi6ignoreE[ilvx]; + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[ilvx]; _ZNSt11char_traitsI[cw]E2eqERK[cw]S2_; @@ -747,8 +754,8 @@ GLIBCXX_3.4.2 { _ZN9__gnu_cxx18stdio_sync_filebufI[cw]St11char_traitsI[cw]EE4fileEv; - _ZN9__gnu_cxx17__pool_alloc_base9_M_refillE[jm]; - _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listE[jm]; + _ZN9__gnu_cxx17__pool_alloc_base9_M_refillE[jmy]; + _ZN9__gnu_cxx17__pool_alloc_base16_M_get_free_listE[jmy]; _ZN9__gnu_cxx17__pool_alloc_base12_M_get_mutexEv; } GLIBCXX_3.4.1; @@ -783,8 +790,8 @@ GLIBCXX_3.4.4 { _ZN9__gnu_cxx6__poolILb1EE13_M_initializeEPFvPvE; _ZN9__gnu_cxx6__poolILb1EE21_M_destroy_thread_keyEPv; _ZN9__gnu_cxx6__poolILb1EE16_M_get_thread_idEv; - _ZN9__gnu_cxx6__poolILb[01]EE16_M_reserve_blockE[jm][jm]; - _ZN9__gnu_cxx6__poolILb[01]EE16_M_reclaim_blockEPc[jm]; + _ZN9__gnu_cxx6__poolILb[01]EE16_M_reserve_blockE[jmy][jmy]; + _ZN9__gnu_cxx6__poolILb[01]EE16_M_reclaim_blockEPc[jmy]; _ZN9__gnu_cxx6__poolILb[01]EE10_M_destroyEv; _ZN9__gnu_cxx9free_list6_M_getE*; @@ -796,26 +803,26 @@ GLIBCXX_3.4.5 { # std::string _ZNKSs11_M_disjunctEPKc; - _ZNKSs15_M_check_lengthE[jm][jm]PKc; + _ZNKSs15_M_check_lengthE[jmy][jmy]PKc; _ZNSs4_Rep26_M_set_length_and_sharableE*; - _ZNSs7_M_copyEPcPKc[jm]; - _ZNSs7_M_moveEPcPKc[jm]; - _ZNSs9_M_assignEPc[jm]c; + _ZNSs7_M_copyEPcPKc[jmy]; + _ZNSs7_M_moveEPcPKc[jmy]; + _ZNSs9_M_assignEPc[jmy]c; # std::wstring _ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw; - _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthE[jm][jm]PKc; + _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthE[jmy][jmy]PKc; _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableE*; - _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKw[jm]; - _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKw[jm]; - _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPw[jm]w; + _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKw[jmy]; + _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKw[jmy]; + _ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPw[jmy]w; _ZNKSt13basic_fstreamI[cw]St11char_traitsI[cw]EE7is_openEv; _ZNKSt14basic_ifstreamI[cw]St11char_traitsI[cw]EE7is_openEv; _ZNKSt14basic_ofstreamI[cw]St11char_traitsI[cw]EE7is_openEv; - _ZNSi6ignoreE[ilv]; - _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[ilv]; + _ZNSi6ignoreE[ilvx]; + _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[ilvx]; _ZNSt11char_traitsI[cw]E2eqERK[cw]S2_; @@ -825,7 +832,7 @@ GLIBCXX_3.4.5 { GLIBCXX_3.4.6 { - _ZSt17__copy_streambufsI[cw]St11char_traitsI[cw]EEiPSt15basic_streambuf*; + _ZSt17__copy_streambufsI[cw]St11char_traitsI[cw]EE[ix]PSt15basic_streambuf*; _ZNSt8ios_base17_M_call_callbacksENS_5eventE; _ZNSt8ios_base20_M_dispose_callbacksEv; _ZNSt6locale5facet13_S_get_c_nameEv; @@ -840,7 +847,7 @@ GLIBCXX_3.4.6 { GLIBCXX_3.4.7 { - _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetE[jm]; + _ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetE[jmy]; } GLIBCXX_3.4.6; @@ -863,7 +870,7 @@ GLIBCXX_3.4.9 { _ZNSi10_M_extractI[^g]*; _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractI[^g]*; - _ZSt21__copy_streambufs_eofI[cw]St11char_traitsI[cw]EE[il]PSt15basic_streambuf*; + _ZSt21__copy_streambufs_eofI[cw]St11char_traitsI[cw]EE[ilx]PSt15basic_streambuf*; _ZSt16__ostream_insert*; @@ -1068,6 +1075,8 @@ GLIBCXX_3.4.14 { _ZNSs18_S_construct_aux_2*; _ZNSbIwSt11char_traitsIwESaIwEE18_S_construct_aux_2*; + _ZSt25__throw_bad_function_callv; + } GLIBCXX_3.4.13; # Symbols in the support library (libsupc++) have their own tag. diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 894ab7bbe7a..6bd3c2273e5 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -843,8 +843,15 @@ enable_version_specific_runtime_libs ac_precious_vars='build_alias host_alias target_alias -CPP +CC +CFLAGS +LDFLAGS +LIBS CPPFLAGS +CXX +CXXFLAGS +CCC +CPP CXXCPP' @@ -3485,26 +3492,9 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -# We're almost certainly being configured before anything else which uses -# C++, so all of our AC_PROG_* discoveries will be cached. It's vital that -# we not cache the value of CXX that we "discover" here, because it's set -# to something unique for us and libjava. Other target libraries need to -# find CXX for themselves. We yank the rug out from under the normal AC_* -# process by sneakily renaming the cache variable. This also lets us debug -# the value of "our" CXX in postmortems. -# -# We must also force CXX to /not/ be a precious variable, otherwise the -# wrong (non-multilib-adjusted) value will be used in multilibs. This -# little trick also affects CPPFLAGS, CXXFLAGS, and LDFLAGS. And as a side -# effect, CXXFLAGS is no longer automagically subst'd, so we have to do -# that ourselves. Un-preciousing AC_PROG_CC also affects CC and CFLAGS. -# # -fno-builtin must be present here so that a non-conflicting form of # std::exit can be guessed by AC_PROG_CXX, and used in later tests. - - - save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-builtin" ac_ext=c @@ -4317,11 +4307,11 @@ if test -z "$CXX"; then set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${glibcxx_cv_prog_CXX+set}" = set; then : +if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then - glibcxx_cv_prog_CXX="$CXX" # Let the user override the test. + ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -4330,7 +4320,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - glibcxx_cv_prog_CXX="$ac_tool_prefix$ac_prog" + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -4340,7 +4330,7 @@ IFS=$as_save_IFS fi fi -CXX=$glibcxx_cv_prog_CXX +CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } @@ -4560,9 +4550,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CXXFLAGS="$save_CXXFLAGS" - - - # Runs configure.host, and assorted other critical bits. Sets # up critical shell variables. @@ -11454,7 +11441,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11457 "configure" +#line 11444 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11560,7 +11547,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11563 "configure" +#line 11550 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14897,7 +14884,7 @@ fi # # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style. cat > conftest.$ac_ext << EOF -#line 14900 "configure" +#line 14887 "configure" struct S { ~S(); }; void bar(); void foo() @@ -15265,7 +15252,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; } # Fake what AC_TRY_COMPILE does. cat > conftest.$ac_ext << EOF -#line 15268 "configure" +#line 15255 "configure" int main() { typedef bool atomic_type; @@ -15302,7 +15289,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15305 "configure" +#line 15292 "configure" int main() { typedef short atomic_type; @@ -15339,7 +15326,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15342 "configure" +#line 15329 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -15377,7 +15364,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15380 "configure" +#line 15367 "configure" int main() { typedef long long atomic_type; @@ -15453,7 +15440,7 @@ $as_echo "$as_me: WARNING: Performance of certain classes will degrade as a resu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 15456 "configure" +#line 15443 "configure" int main() { _Decimal32 d1; diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 1fd8119b51d..2ee2bdbce28 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -78,34 +78,14 @@ AM_INIT_AUTOMAKE([1.9.3 no-define foreign no-dependencies -Wall -Wno-portability AH_TEMPLATE(PACKAGE, [Name of package]) AH_TEMPLATE(VERSION, [Version number of package]) -# We're almost certainly being configured before anything else which uses -# C++, so all of our AC_PROG_* discoveries will be cached. It's vital that -# we not cache the value of CXX that we "discover" here, because it's set -# to something unique for us and libjava. Other target libraries need to -# find CXX for themselves. We yank the rug out from under the normal AC_* -# process by sneakily renaming the cache variable. This also lets us debug -# the value of "our" CXX in postmortems. -# -# We must also force CXX to /not/ be a precious variable, otherwise the -# wrong (non-multilib-adjusted) value will be used in multilibs. This -# little trick also affects CPPFLAGS, CXXFLAGS, and LDFLAGS. And as a side -# effect, CXXFLAGS is no longer automagically subst'd, so we have to do -# that ourselves. Un-preciousing AC_PROG_CC also affects CC and CFLAGS. -# # -fno-builtin must be present here so that a non-conflicting form of # std::exit can be guessed by AC_PROG_CXX, and used in later tests. -m4_define([ac_cv_prog_CXX],[glibcxx_cv_prog_CXX]) -m4_rename([_AC_ARG_VAR_PRECIOUS],[glibcxx_PRECIOUS]) -m4_define([_AC_ARG_VAR_PRECIOUS],[]) save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-builtin" AC_PROG_CC AC_PROG_CXX CXXFLAGS="$save_CXXFLAGS" -m4_rename_force([glibcxx_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) -AC_SUBST(CFLAGS) -AC_SUBST(CXXFLAGS) # Runs configure.host, and assorted other critical bits. Sets # up critical shell variables. diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index 1c5e7f64e55..a3cdbdf1c46 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -815,6 +815,13 @@ requirements of the license of GCC. </term> <listitem><para>Update / add the signatures. </para></listitem></varlistentry> + + <varlistentry><term><ulink url="../ext/lwg-active.html#865">865</ulink>: + <emphasis>More algorithms that throw away information</emphasis> + </term> + <listitem><para>The traditional HP / SGI return type and value is blessed + by the resolution of the DR. + </para></listitem></varlistentry> </variablelist> </sect2> diff --git a/libstdc++-v3/doc/xml/manual/test.xml b/libstdc++-v3/doc/xml/manual/test.xml index 887f4035686..3da168ec45b 100644 --- a/libstdc++-v3/doc/xml/manual/test.xml +++ b/libstdc++-v3/doc/xml/manual/test.xml @@ -1,6 +1,6 @@ <sect1 id="manual.intro.setup.test" xreflabel="Testing"> <?dbhtml filename="test.html"?> - + <sect1info> <keywordset> <keyword> @@ -48,7 +48,7 @@ regressions, ABI, and performance. that are packaged in a separate testing library. </para> -<para> +<para> All test cases for functionality required by the runtime components of the C++ standard (ISO 14882) are files within the following directories. @@ -65,6 +65,9 @@ regressions, ABI, and performance. 25_algorithms 26_numerics 27_io +28_regex +29_atomics +30_threads </programlisting> <para> @@ -77,9 +80,8 @@ backward Tests for backwards compatibility and deprecated features. demangle Tests for __cxa_demangle, the IA 64 C++ ABI demangler ext Tests for extensions. performance Tests for performance analysis, and performance regressions. -thread Tests for threads. </programlisting> - + <para> Some directories don't have test files, but instead contain auxiliary information: @@ -104,7 +106,7 @@ util Files for libtestc++, utilities and testing routines. </para> <programlisting> 21_strings/find.cc - </programlisting> + </programlisting> <para> However, that practice soon became a liability as the test cases became huge and unwieldy, and testing new or extended @@ -123,11 +125,11 @@ util Files for libtestc++, utilities and testing routines. 21_strings/basic_string/find/wchar_t/1.cc 21_strings/basic_string/find/wchar_t/2.cc 21_strings/basic_string/find/wchar_t/3.cc - </programlisting> + </programlisting> <para> All new tests should be written with the policy of one test - case, one file in mind. + case, one file in mind. </para> </sect3> @@ -140,7 +142,7 @@ util Files for libtestc++, utilities and testing routines. used within the testsuite to designate particular kinds of tests. </para> - + <itemizedlist> <listitem> <para> @@ -151,10 +153,10 @@ util Files for libtestc++, utilities and testing routines. to finish or pass. At the moment, the interactive tests are not run by default. Instead, they are run by hand, like: </para> - <programlisting> + <programlisting> g++ 27_io/objects/char/3_xin.cc cat 27_io/objects/char/3_xin.in | a.out - </programlisting> + </programlisting> </listitem> <listitem> <para> @@ -232,7 +234,7 @@ cat 27_io/objects/char/3_xin.in | a.out <sect3 id="test.run.basic"> <title>Basic</title> - + <para> You can check the status of the build without installing it using the dejagnu harness, much like the rest of the gcc @@ -254,7 +256,7 @@ cat 27_io/objects/char/3_xin.in | a.out the exact command line passed to the compiler, the compiler output, and the executable output (if any). </para> - + <para> Archives of test results for various versions and platforms are available on the GCC website in the <ulink @@ -266,7 +268,7 @@ cat 27_io/objects/char/3_xin.in | a.out combination of source version, operating system, and host CPU. </para> </sect3> - + <sect3 id="test.run.variations"> <title>Variations</title> <para> @@ -322,7 +324,7 @@ make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=calmrisc32-sid" make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=arm-sim" </programlisting> - <para> + <para> Also, here is an example of how to run the libstdc++ testsuite for a multilibed build directory with different ABI settings: </para> @@ -330,7 +332,7 @@ make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=arm-sim" <programlisting> make check-target-libstdc++-v3 RUNTESTFLAGS='--target_board \"unix{-mabi=32,,-mabi=64}\"' </programlisting> - + <para> You can run the tests with a compiler and library that have already been installed. Make sure that the compiler (e.g., @@ -354,7 +356,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite testsuites in parallel from the same directory. </para> - <para> + <para> In addition, there are some testing options that are mostly of interest to library maintainers and system integrators. As such, these tests may not work on all cpu and host combinations, and @@ -378,7 +380,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> <emphasis>testsuite_files</emphasis> </para> - <para> + <para> This is a list of all the test cases that will be run. Each test case is on a separate line, given with an absolute path from the <emphasis>libsrcdir/testsuite</emphasis> directory. @@ -389,7 +391,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> <emphasis>testsuite_files_interactive</emphasis> </para> - <para> + <para> This is a list of all the interactive test cases, using the same format as the file list above. These tests are not run by default. @@ -400,7 +402,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> <emphasis>testsuite_files_performance</emphasis> </para> - <para> + <para> This is a list of all the performance test cases, using the same format as the file list above. These tests are not run by default. @@ -411,7 +413,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> <emphasis>testsuite_thread</emphasis> </para> - <para> + <para> This file indicates that the host system can run tests which involved multiple threads. </para> @@ -421,7 +423,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> <emphasis>testsuite_wchar_t</emphasis> </para> - <para> + <para> This file indicates that the host system can run the wchar_t tests, and corresponds to the macro definition <code> _GLIBCXX_USE_WCHAR_T</code> in the file c++config.h. @@ -432,11 +434,11 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <programlisting> make check-abi </programlisting> - + <para> The library ABI can be tested. This involves testing the shared library against an ABI-defining previous version of symbol - exports. + exports. </para> <programlisting> @@ -507,7 +509,7 @@ runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite <para> The first step in making a new test case is to choose the correct directory and file name, given the organization as previously - described. + described. </para> <para> @@ -638,7 +640,7 @@ up in the normal.exp file. <sect3 id="test.harness.dejagnu"> <title>Dejagnu Harness Details</title> - <para> + <para> Underlying details of testing for conformance and regressions are abstracted via the GNU Dejagnu package. This is similar to the rest of GCC. @@ -684,7 +686,7 @@ only default variables. <sect3 id="test.harness.utils"> <title>Utilities</title> - <para> + <para> </para> <para> The testsuite directory also contains some files that implement @@ -709,11 +711,11 @@ only default variables. <emphasis>testsuite_abi_check.cc</emphasis> </para> <para> - Creates the executable <emphasis>abi_check</emphasis>. - Used to check correctness of symbol versioning, visibility of - exported symbols, and compatibility on symbols in the shared - library, for hosts that support this feature. More information - can be found in the ABI documentation <link linkend="appendix.porting.abi">here</link> + Creates the executable <emphasis>abi_check</emphasis>. + Used to check correctness of symbol versioning, visibility of + exported symbols, and compatibility on symbols in the shared + library, for hosts that support this feature. More information + can be found in the ABI documentation <link linkend="appendix.porting.abi">here</link> </para> </listitem> <listitem> @@ -722,11 +724,11 @@ only default variables. <emphasis>testsuite_allocator.cc</emphasis> </para> <para> - Contains specialized allocators that keep track of construction - and destruction. Also, support for overriding global new and - delete operators, including verification that new and delete - are called during execution, and that allocation over max_size - fails. + Contains specialized allocators that keep track of construction + and destruction. Also, support for overriding global new and + delete operators, including verification that new and delete + are called during execution, and that allocation over max_size + fails. </para> </listitem> <listitem> @@ -734,9 +736,9 @@ only default variables. <emphasis>testsuite_character.h</emphasis> </para> <para> - Contains <code>std::char_traits</code> and - <code>std::codecvt</code> specializations for a user-defined - POD. + Contains <code>std::char_traits</code> and + <code>std::codecvt</code> specializations for a user-defined + POD. </para> </listitem> <listitem> @@ -748,20 +750,20 @@ only default variables. A large number of utilities, including: </para> <itemizedlist> - <listitem><para>VERIFY</para></listitem> - <listitem><para>set_memory_limits</para></listitem> - <listitem><para>verify_demangle</para></listitem> - <listitem><para>run_tests_wrapped_locale</para></listitem> - <listitem><para>run_tests_wrapped_env</para></listitem> - <listitem><para>try_named_locale</para></listitem> - <listitem><para>try_mkfifo</para></listitem> - <listitem><para>func_callback</para></listitem> - <listitem><para>counter</para></listitem> - <listitem><para>copy_tracker</para></listitem> - <listitem><para>copy_constructor</para></listitem> - <listitem><para>assignment_operator</para></listitem> - <listitem><para>destructor</para></listitem> - <listitem> + <listitem><para>VERIFY</para></listitem> + <listitem><para>set_memory_limits</para></listitem> + <listitem><para>verify_demangle</para></listitem> + <listitem><para>run_tests_wrapped_locale</para></listitem> + <listitem><para>run_tests_wrapped_env</para></listitem> + <listitem><para>try_named_locale</para></listitem> + <listitem><para>try_mkfifo</para></listitem> + <listitem><para>func_callback</para></listitem> + <listitem><para>counter</para></listitem> + <listitem><para>copy_tracker</para></listitem> + <listitem><para>copy_constructor</para></listitem> + <listitem><para>assignment_operator</para></listitem> + <listitem><para>destructor</para></listitem> + <listitem> <para>pod_char, pod_int and associated char_traits specializations</para> </listitem> </itemizedlist> @@ -792,13 +794,239 @@ only default variables. reporting functions including: </para> <itemizedlist> - <listitem><para>time_counter</para></listitem> - <listitem><para>resource_counter</para></listitem> - <listitem><para>report_performance</para></listitem> + <listitem><para>time_counter</para></listitem> + <listitem><para>resource_counter</para></listitem> + <listitem><para>report_performance</para></listitem> </itemizedlist> </listitem> </itemizedlist> </sect3> </sect2> + +<sect2 id="test.special"> +<title>Special Topics</title> + +<sect3 id="test.exception.safety"> +<title> + Qualifying Exception Safety Guarantees + <indexterm> + <primary>Test</primary> + <secondary>Exception Safety</secondary> + </indexterm> +</title> + +<sect4 id="test.exception.safety.overview"> +<title>Overview</title> + + <para> + Testing is composed of running a particular test sequence, + and looking at what happens to the surrounding code when + exceptions are thrown. Each test is composed of measuring + initial state, executing a particular sequence of code under + some instrumented conditions, measuring a final state, and + then examining the differences between the two states. + </para> + + <para> + Test sequences are composed of constructed code sequences + that exercise a particular function or member function, and + either confirm no exceptions were generated, or confirm the + consistency/coherency of the test subject in the event of a + thrown exception. + </para> + + <para> + Random code paths can be constructed using the the basic test + sequences and instrumentation as above, only combined in a + random or pseudo-random way. + </para> + + <para> To compute the code paths that throw, test instruments + are used that throw on allocation events + (<classname>__gnu_cxx::throw_allocator_random</classname> + and <classname>__gnu_cxx::throw_allocator_limit</classname>) + and copy, assignment, comparison, increment, swap, and + various operators + (<classname>__gnu_cxx::throw_type_random</classname> + and <classname>__gnu_cxx::throw_type_limit</classname>). Looping + through a given test sequence and conditionally throwing in + all instrumented places. Then, when the test sequence + completes without an exception being thrown, assume all + potential error paths have been exercised in a sequential + manner. + </para> +</sect4> + + +<sect4 id="test.exception.safety.status"> +<title> + Existing tests +</title> + + <itemizedlist> + <listitem> + <para> + Ad Hoc + </para> + <para> + For example, + <filename>testsuite/23_containers/list/modifiers/3.cc</filename>. + </para> + </listitem> + + <listitem> + <para> + Policy Based Data Structures + </para> + <para> + For example, take the test + functor <classname>rand_reg_test</classname> in + in <filename>testsuite/ext/pb_ds/regression/tree_no_data_map_rand.cc</filename>. This uses <classname>container_rand_regression_test</classname> in +<filename>testsuite/util/regression/rand/assoc/container_rand_regression_test.h</filename>. + + </para> + + <para> + Which has several tests for container member functions, +Includes control and test container objects. Configuration includes +random seed, iterations, number of distinct values, and the +probability that and exception will be thrown. Assumes instantiating +container uses an extension +allocator, <classname>__gnu_cxx::throw_allocator_random</classname>, +as the allocator type. + </para> + </listitem> + + <listitem> + <para> + C++0x Container Requirements. + </para> + + <para> + Coverage is currently limited to testing container + requirements for exception safety, + although <classname>__gnu_cxx::throw_type</classname> meets + the additional type requirements for testing numeric data + structures and instantiating algorithms. + </para> + + <para> + Of particular interest is extending testing to algorithms and + then to parallel algorithms. Also io, and locales. + </para> + </listitem> + </itemizedlist> +</sect4> + + +<sect4 id="test.exception.safety.containers"> +<title> +C++0x Requirements Test Sequence Descriptions +</title> + + <itemizedlist> + <listitem> + <para> + Basic + </para> + + <para> + Basic consistency on exception propagation tests. For + each container, an object of that container is constructed, + a specific member function is exercised in + a <literal>try</literal> block, and then any thrown + exceptions lead to error checking in the appropriate + <literal>catch</literal> block. The container's use of + resources is compared to the container's use prior to the + test block. Resource monitoring is limited to allocations + made through the container's <type>allocator_type</type>, + which should be sufficient for container data + structures. Included in these tests are member functions + are <type>iterator</type> and <type>const_iterator</type> + operations, <function>pop_front</function>, <function>pop_back</function>, <function>push_front</function>, <function>push_back</function>, <function>insert</function>, <function>erase</function>, <function>swap</function>, <function>clear</function>, + and <function>rehash</function>. The container in question is + instantiated with two instrumented template arguments, + with <classname>__gnu_cxx::throw_allocator_limit</classname> + as the allocator type, and + with <classname>__gnu_cxx::throw_type_limit</classname> as + the value type. This allows the test to loop through + conditional throw points. + </para> + + <para> + The general form is demonstrated in + <filename>testsuite/23_containers/list/requirements/exception/basic.cc + </filename>. The instantiating test object is <classname>__gnu_test::basic_safety</classname> and is detailed in <filename>testsuite/util/exception/safety.h</filename>. + </para> + </listitem> + + + <listitem> + <para> + Generation Prohibited + </para> + + <para> + Exception generation tests. For each container, an object of + that container is constructed and all member functions + required to not throw exceptions are exercised. Included in + these tests are member functions + are <type>iterator</type> and <type>const_iterator</type> operations, <function>erase</function>, <function>pop_front</function>, <function>pop_back</function>, <function>swap</function>, + and <function>clear</function>. The container in question is + instantiated with two instrumented template arguments, + with <classname>__gnu_cxx::throw_allocator_random</classname> + as the allocator type, and + with <classname>__gnu_cxx::throw_type_random</classname> as + the value type. This test does not loop, an instead is sudden + death: first error fails. + </para> + <para> + The general form is demonstrated in + <filename>testsuite/23_containers/list/requirements/exception/generation_prohibited.cc + </filename>. The instantiating test object is <classname>__gnu_test::generation_prohibited</classname> and is detailed in <filename>testsuite/util/exception/safety.h</filename>. + </para> + </listitem> + + + <listitem> + <para> + Propagation Consistent + </para> + + <para> + Container rollback on exception propagation tests. For + each container, an object of that container is constructed, + a specific member function that requires rollback to a previous + known good state is exercised in + a <literal>try</literal> block, and then any thrown + exceptions lead to error checking in the appropriate + <literal>catch</literal> block. The container is compared to + the container's last known good state using such parameters + as size, contents, and iterator references. Included in these + tests are member functions + are <function>push_front</function>, <function>push_back</function>, <function>insert</function>, + and <function>rehash</function>. The container in question is + instantiated with two instrumented template arguments, + with <classname>__gnu_cxx::throw_allocator_limit</classname> + as the allocator type, and + with <classname>__gnu_cxx::throw_type_limit</classname> as + the value type. This allows the test to loop through + conditional throw points. + </para> + + <para> + The general form demonstrated in + <filename>testsuite/23_containers/list/requirements/exception/propagation_coherent.cc + </filename>. The instantiating test object is <classname>__gnu_test::propagation_coherent</classname> and is detailed in <filename>testsuite/util/exception/safety.h</filename>. + </para> + </listitem> + </itemizedlist> + +</sect4> + +</sect3> + +</sect2> + </sect1> diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h index e33a14c3bdc..7625ee4af51 100644 --- a/libstdc++-v3/include/bits/algorithmfwd.h +++ b/libstdc++-v3/include/bits/algorithmfwd.h @@ -236,13 +236,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) void fill(_FIter, _FIter, const _Tp&); -/* - XXX NB: return type different from ISO C++. - template<typename _OIter, typename _Size, typename _Tp> - void - fill_n(_OIter, _Size, const _Tp&); -*/ - template<typename _OIter, typename _Size, typename _Tp> _OIter fill_n(_OIter, _Size, const _Tp&); @@ -620,13 +613,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P) void generate(_FIter, _FIter, _Generator); -/* - XXX NB: return type different from ISO C++. - template<typename _OIter, typename _Size, typename _Tp> - void - generate_n(_OIter, _Size, _Generator); -*/ - template<typename _OIter, typename _Size, typename _Generator> _OIter generate_n(_OIter, _Size, _Generator); diff --git a/libstdc++-v3/include/bits/functexcept.h b/libstdc++-v3/include/bits/functexcept.h index 62174819118..5b2e9fc0455 100644 --- a/libstdc++-v3/include/bits/functexcept.h +++ b/libstdc++-v3/include/bits/functexcept.h @@ -91,6 +91,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) void __throw_future_error(int) __attribute__((__noreturn__)); + // Helpers for exception objects in <functional> + void + __throw_bad_function_call() __attribute__((__noreturn__)); + _GLIBCXX_END_NAMESPACE #endif diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 088414d097f..f6c98f8f59c 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -4921,6 +4921,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P) * * Performs the assignment @c *i = @p gen() for each @c i in the range * @p [first,first+n). + * + * _GLIBCXX_RESOLVE_LIB_DEFECTS + * DR 865. More algorithms that throw away information */ template<typename _OutputIterator, typename _Size, typename _Generator> _OutputIterator diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index f9c3ab2b428..bc04723439e 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -781,6 +781,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * This function fills a range with copies of the same value. For char * types filling contiguous areas of memory, this becomes an inline call * to @c memset or @ wmemset. + * + * _GLIBCXX_RESOLVE_LIB_DEFECTS + * DR 865. More algorithms that throw away information */ template<typename _OI, typename _Size, typename _Tp> inline _OI diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 7f601cbf0fb..d7589f71d7a 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -72,11 +72,19 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * This function started off as a compiler kludge from SGI, but seems to * be a useful wrapper around a repeated constant expression. The '512' is * tunable (and no other code needs to change), but no investigation has - * been done since inheriting the SGI code. + * been done since inheriting the SGI code. Touch _GLIBCXX_DEQUE_BUF_SIZE + * only if you know what you are doing, however: changing it breaks the + * binary compatibility!! */ + +#ifndef _GLIBCXX_DEQUE_BUF_SIZE +#define _GLIBCXX_DEQUE_BUF_SIZE 512 +#endif + inline size_t __deque_buf_size(size_t __size) - { return __size < 512 ? size_t(512 / __size) : size_t(1); } + { return (__size < _GLIBCXX_DEQUE_BUF_SIZE + ? size_t(_GLIBCXX_DEQUE_BUF_SIZE / __size) : size_t(1)); } /** @@ -1798,6 +1806,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) swap(deque<_Tp,_Alloc>& __x, deque<_Tp,_Alloc>& __y) { __x.swap(__y); } +#undef _GLIBCXX_DEQUE_BUF_SIZE + _GLIBCXX_END_NESTED_NAMESPACE #endif /* _STL_DEQUE_H */ diff --git a/libstdc++-v3/include/ext/throw_allocator.h b/libstdc++-v3/include/ext/throw_allocator.h index 69daa15f5db..fd939b2e168 100644 --- a/libstdc++-v3/include/ext/throw_allocator.h +++ b/libstdc++-v3/include/ext/throw_allocator.h @@ -36,9 +36,11 @@ /** @file ext/throw_allocator.h * This file is a GNU extension to the Standard C++ Library. * - * Contains an exception-throwing allocator, useful for testing - * exception safety. In addition, allocation addresses are stored and - * sanity checked. + * Contains two exception-generating types (throw_value, throw_allocator) + * intended to be used as value and allocator types while testing + * exception safety in templatized containers and algorithms. The + * allocator has additional log and debug features. The exception + * generated is of type forced_exception_error. */ #ifndef _THROW_ALLOCATOR_H @@ -64,27 +66,30 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) /** - * @brief Thown by throw_allocator. + * @brief Thown by exception safety machinery. * @ingroup exceptions */ - struct forced_exception_error : public std::exception + struct forced_error : public std::exception { }; - // Substitute for concurrence_error object in the case of -fno-exceptions. + // Substitute for forced_error object when -fno-exceptions. inline void - __throw_forced_exception_error() + __throw_forced_error() { #if __EXCEPTIONS - throw forced_exception_error(); + throw forced_error(); #else __builtin_abort(); #endif } - // Base class for checking address and label information about - // allocations. Create a std::map between the allocated address - // (void*) and a datum for annotations, which are a pair of numbers - // corresponding to label and allocated size. + + /** + * @brief Base class for checking address and label information + * about allocations. Create a std::map between the allocated + * address (void*) and a datum for annotations, which are a pair of + * numbers corresponding to label and allocated size. + */ struct annotate_base { annotate_base() @@ -92,7 +97,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) label(); map(); } - + static void set_label(size_t l) { label() = l; } @@ -106,7 +111,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) { if (p == NULL) { - std::string error("throw_allocator_base::insert null insert!\n"); + std::string error("annotate_base::insert null insert!\n"); log_to_string(error, make_entry(p, size)); std::__throw_logic_error(error.c_str()); } @@ -114,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) const_iterator found = map().find(p); if (found != map().end()) { - std::string error("throw_allocator_base::insert double insert!\n"); + std::string error("annotate_base::insert double insert!\n"); log_to_string(error, make_entry(p, size)); log_to_string(error, *found); std::__throw_logic_error(error.c_str()); @@ -130,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) map().erase(p); } - // See if a particular address and size has been allocated. + // See if a particular address and allocation size has been saved. inline void check_allocated(void* p, size_t size) { @@ -142,7 +147,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) log_to_string(error, make_entry(p, size)); std::__throw_logic_error(error.c_str()); } - + if (found->second.second != size) { std::string error("annotate_base::check_allocated by value " @@ -166,7 +171,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) log_to_string(found, *beg); ++beg; } - + if (!found.empty()) { std::string error("annotate_base::check_allocated by label\n"); @@ -213,15 +218,15 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) static size_t& label() { - static size_t ll; - return ll; + static size_t _S_label(std::numeric_limits<size_t>::max()); + return _S_label; } static map_type& map() { - static map_type mp; - return mp; + static map_type _S_map; + return _S_map; } }; @@ -237,47 +242,133 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) return os << error; } - /// Base class for probability control and throw. - struct probability_base + + /** + * @brief Base struct for condition policy. + * + * Requires a public member function with the signature + * void throw_conditionally() + */ + struct condition_base + { + virtual ~condition_base() { }; + }; + + + /** + * @brief Base class for incremental control and throw. + */ + struct limit_condition : public condition_base { - // Scope-level probability adjustor objects: set probability for - // throw at the beginning of a scope block, and restores to - // previous probability when object is destroyed on exiting the - // block. + // Scope-level adjustor objects: set limit for throw at the + // beginning of a scope block, and restores to previous limit when + // object is destroyed on exiting the block. struct adjustor_base { private: - const double _M_prob; + const size_t _M_orig; public: - adjustor_base() : _M_prob(get_probability()) { } + adjustor_base() : _M_orig(limit()) { } + + virtual + ~adjustor_base() { set_limit(_M_orig); } + }; + + /// Never enter the condition. + struct never_adjustor : public adjustor_base + { + never_adjustor() { set_limit(std::numeric_limits<size_t>::max()); } + }; + + /// Always enter the condition. + struct always_adjustor : public adjustor_base + { + always_adjustor() { set_limit(count()); } + }; + + /// Enter the nth condition. + struct limit_adjustor : public adjustor_base + { + limit_adjustor(const size_t __l) { set_limit(__l); } + }; + + // Increment _S_count every time called. + // If _S_count matches the limit count, throw. + static void + throw_conditionally() + { + if (count() == limit()) + __throw_forced_error(); + ++count(); + } + + static size_t& + count() + { + static size_t _S_count(0); + return _S_count; + } + + static size_t& + limit() + { + static size_t _S_limit(std::numeric_limits<size_t>::max()); + return _S_limit; + } + + // Zero the throw counter, set limit to argument. + static void + set_limit(const size_t __l) + { + limit() = __l; + count() = 0; + } + }; + + + /** + * @brief Base class for random probability control and throw. + */ + struct random_condition : public condition_base + { + // Scope-level adjustor objects: set probability for throw at the + // beginning of a scope block, and restores to previous + // probability when object is destroyed on exiting the block. + struct adjustor_base + { + private: + const double _M_orig; + + public: + adjustor_base() : _M_orig(probability()) { } virtual ~adjustor_base() - { set_probability(_M_prob); } + { set_probability(_M_orig); } }; - // Group condition. + /// Group condition. struct group_adjustor : public adjustor_base { group_adjustor(size_t size) - { set_probability(1 - std::pow(double(1 - get_probability()), + { set_probability(1 - std::pow(double(1 - probability()), double(0.5 / (size + 1)))); } }; - // Never enter the condition. + /// Never enter the condition. struct never_adjustor : public adjustor_base { never_adjustor() { set_probability(0); } }; - // Always enter the condition. + /// Always enter the condition. struct always_adjustor : public adjustor_base { always_adjustor() { set_probability(1); } }; - probability_base() + random_condition() { probability(); engine(); @@ -287,15 +378,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) set_probability(double __p) { probability() = __p; } - static double& - get_probability() - { return probability(); } - - void + static void throw_conditionally() { - if (generate() < get_probability()) - __throw_forced_exception_error(); + if (generate() < probability()) + __throw_forced_error(); } void @@ -311,7 +398,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) typedef std::tr1::mt19937 engine_type; #endif - double + static double generate() { #ifdef __GXX_EXPERIMENTAL_CXX0X__ @@ -327,7 +414,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) double random = generator(); if (random < distribution.min() || random > distribution.max()) { - std::string __s("throw_allocator::throw_conditionally"); + std::string __s("random_condition::generate"); __s += "\n"; __s += "random number generated is: "; char buf[40]; @@ -342,54 +429,186 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) static double& probability() { - static double __p; - return __p; + static double _S_p; + return _S_p; } static engine_type& engine() { - static engine_type __e; - return __e; + static engine_type _S_e; + return _S_e; } }; + /** - * @brief Allocator class with logging and exception control. + * @brief Class with exception generation control. Intended to be + * used as a value_type in templatized code. + * + * Note: Destructor not allowed to throw. + */ + template<typename _Cond> + struct throw_value_base : public _Cond + { + typedef _Cond condition_type; + + using condition_type::throw_conditionally; + + std::size_t _M_i; + + throw_value_base() : _M_i(0) + { throw_conditionally(); } + + throw_value_base(const throw_value_base& __v) + : _M_i(__v._M_i) + { throw_conditionally(); } + + explicit throw_value_base(const std::size_t __i) + : _M_i(__i) + { throw_conditionally(); } + + throw_value_base& + operator=(const throw_value_base& __v) + { + throw_conditionally(); + _M_i = __v._M_i; + return *this; + } + + throw_value_base& + operator++() + { + throw_conditionally(); + ++_M_i; + return *this; + } + }; + + template<typename _Cond> + inline void + swap(throw_value_base<_Cond>& __a, throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + throw_value orig(__a); + __a = __b; + __b = orig; + } + + // General instantiable types requirements. + template<typename _Cond> + inline bool + operator==(const throw_value_base<_Cond>& __a, + const throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + bool __ret = __a._M_i == __b._M_i; + return __ret; + } + + template<typename _Cond> + inline bool + operator<(const throw_value_base<_Cond>& __a, + const throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + bool __ret = __a._M_i < __b._M_i; + return __ret; + } + + // Numeric algorithms instantiable types requirements. + template<typename _Cond> + inline throw_value_base<_Cond> + operator+(const throw_value_base<_Cond>& __a, + const throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + throw_value __ret(__a._M_i + __b._M_i); + return __ret; + } + + template<typename _Cond> + inline throw_value_base<_Cond> + operator-(const throw_value_base<_Cond>& __a, + const throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + throw_value __ret(__a._M_i - __b._M_i); + return __ret; + } + + template<typename _Cond> + inline throw_value_base<_Cond> + operator*(const throw_value_base<_Cond>& __a, + const throw_value_base<_Cond>& __b) + { + typedef throw_value_base<_Cond> throw_value; + throw_value::throw_conditionally(); + throw_value __ret(__a._M_i * __b._M_i); + return __ret; + } + + /// Type throwing via limit condition. + struct throw_value_limit : public throw_value_base<limit_condition> + { + typedef throw_value_base<limit_condition> base_type; + + throw_value_limit() { } + + throw_value_limit(const throw_value_limit& __other) + : base_type(__other._M_i) { } + + explicit throw_value_limit(const std::size_t __i) : base_type(__i) { } + }; + + /// Type throwing via random condition. + struct throw_value_random : public throw_value_base<random_condition> + { + typedef throw_value_base<random_condition> base_type; + + throw_value_random() { } + + throw_value_random(const throw_value_random& __other) + : base_type(__other._M_i) { } + + + explicit throw_value_random(const std::size_t __i) : base_type(__i) { } + }; + + + /** + * @brief Allocator class with logging and exception generation control. + * Intended to be used as an allocator_type in templatized code. * @ingroup allocators + * + * Note: Deallocate not allowed to throw. */ - template<typename T> - class throw_allocator - : public probability_base, public annotate_base + template<typename _Tp, typename _Cond> + class throw_allocator_base + : public annotate_base, public _Cond { public: typedef size_t size_type; typedef ptrdiff_t difference_type; - typedef T value_type; + typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; private: - std::allocator<value_type> _M_allocator; + typedef _Cond condition_type; - public: - template<typename U> - struct rebind - { - typedef throw_allocator<U> other; - }; - - throw_allocator() throw() { } - - throw_allocator(const throw_allocator&) throw() { } - - template<typename U> - throw_allocator(const throw_allocator<U>&) throw() { } + std::allocator<value_type> _M_allocator; - ~throw_allocator() throw() { } + using condition_type::throw_conditionally; + public: size_type max_size() const throw() { return _M_allocator.max_size(); } @@ -407,7 +626,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) } void - construct(pointer __p, const T& val) + construct(pointer __p, const value_type& val) { return _M_allocator.construct(__p, val); } #ifdef __GXX_EXPERIMENTAL_CXX0X__ @@ -435,19 +654,97 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) annotate_base::check_allocated(__p, __t); } - using annotate_base::check_allocated; - }; + void + check_allocated(size_type __n) + { annotate_base::check_allocated(__n); } + }; - template<typename T> + template<typename _Tp, typename _Cond> inline bool - operator==(const throw_allocator<T>&, const throw_allocator<T>&) + operator==(const throw_allocator_base<_Tp, _Cond>&, + const throw_allocator_base<_Tp, _Cond>&) { return true; } - template<typename T> + template<typename _Tp, typename _Cond> inline bool - operator!=(const throw_allocator<T>&, const throw_allocator<T>&) + operator!=(const throw_allocator_base<_Tp, _Cond>&, + const throw_allocator_base<_Tp, _Cond>&) { return false; } + /// Allocator throwing via limit condition. + template<typename _Tp> + struct throw_allocator_limit + : public throw_allocator_base<_Tp, limit_condition> + { + template<typename _Tp1> + struct rebind + { typedef throw_allocator_limit<_Tp1> other; }; + + throw_allocator_limit() throw() { } + + throw_allocator_limit(const throw_allocator_limit&) throw() { } + + template<typename _Tp1> + throw_allocator_limit(const throw_allocator_limit<_Tp1>&) throw() { } + + ~throw_allocator_limit() throw() { } + }; + + /// Allocator throwing via random condition. + template<typename _Tp> + struct throw_allocator_random + : public throw_allocator_base<_Tp, random_condition> + { + template<typename _Tp1> + struct rebind + { typedef throw_allocator_random<_Tp1> other; }; + + throw_allocator_random() throw() { } + + throw_allocator_random(const throw_allocator_random&) throw() { } + + template<typename _Tp1> + throw_allocator_random(const throw_allocator_random<_Tp1>&) throw() { } + + ~throw_allocator_random() throw() { } + }; + _GLIBCXX_END_NAMESPACE +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + +# include <bits/functional_hash.h> + +namespace std +{ + /// Explicit specialization of std::hash for __gnu_cxx::throw_value_limit. + template<> + struct hash<__gnu_cxx::throw_value_limit> + : public std::unary_function<__gnu_cxx::throw_value_limit, size_t> + { + size_t + operator()(__gnu_cxx::throw_value_limit __val) const + { + std::hash<std::size_t> h; + size_t __result = h(__val._M_i); + return __result; + } + }; + + /// Explicit specialization of std::hash for __gnu_cxx::throw_value_limit. + template<> + struct hash<__gnu_cxx::throw_value_random> + : public std::unary_function<__gnu_cxx::throw_value_random, size_t> + { + size_t + operator()(__gnu_cxx::throw_value_random __val) const + { + std::hash<std::size_t> h; + size_t __result = h(__val._M_i); + return __result; + } + }; +} // end namespace std +#endif + #endif diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index eb10b348ad1..19503bdf05e 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1571,8 +1571,8 @@ namespace std } static void - _M_init_functor(_Any_data& __functor, const _Functor& __f) - { _M_init_functor(__functor, __f, _Local_storage()); } + _M_init_functor(_Any_data& __functor, _Functor&& __f) + { _M_init_functor(__functor, std::move(__f), _Local_storage()); } template<typename _Signature> static bool @@ -1595,13 +1595,13 @@ namespace std { return true; } private: - static void - _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) - { new (__functor._M_access()) _Functor(__f); } + static void + _M_init_functor(_Any_data& __functor, _Functor&& __f, true_type) + { new (__functor._M_access()) _Functor(std::move(__f)); } static void - _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type) - { __functor._M_access<_Functor*>() = new _Functor(__f); } + _M_init_functor(_Any_data& __functor, _Functor&& __f, false_type) + { __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); } }; template<typename _Functor> @@ -1927,9 +1927,9 @@ namespace std template<typename _Functor> typename __gnu_cxx::__enable_if<!is_integral<_Functor>::value, function&>::__type - operator=(_Functor __f) + operator=(_Functor&& __f) { - function(__f).swap(*this); + function(std::forward<_Functor>(__f)).swap(*this); return *this; } @@ -1969,9 +1969,10 @@ namespace std /* template<typename _Functor, typename _Alloc> void - assign(_Functor __f, const _Alloc& __a) + assign(_Functor&& __f, const _Alloc& __a) { - function(__f, __a).swap(*this); + function(allocator_arg, __a, + std::forward<_Functor>(__f)).swap(*this); } */ @@ -2066,7 +2067,7 @@ namespace std { _M_invoker = &_My_handler::_M_invoke; _M_manager = &_My_handler::_M_manager; - _My_handler::_M_init_functor(_M_functor, __f); + _My_handler::_M_init_functor(_M_functor, std::move(__f)); } } @@ -2076,13 +2077,7 @@ namespace std operator()(_ArgTypes... __args) const { if (_M_empty()) - { -#if __EXCEPTIONS - throw bad_function_call(); -#else - __builtin_abort(); -#endif - } + __throw_bad_function_call(); return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...); } diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index b8c54b6075f..8f9975dea1a 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -42,6 +42,7 @@ #include <system_error> #include <exception> #include <cstdatomic> +#include <bits/functexcept.h> namespace std { @@ -172,7 +173,7 @@ namespace std void _M_set(_Res&& __res) { - ::new (_M_addr()) _Res(_Move_result<_Res>::_S_move(__res)); + ::new (_M_addr()) _Res(std::move(__res)); _M_initialized = true; } @@ -183,27 +184,6 @@ namespace std }; - /// Workaround for CWG issue 664 and c++/34022 - template<typename _Res, bool = is_scalar<_Res>::value> - struct _Move_result; - - /// Specialization for scalar types returns rvalue not rvalue-reference. - template<typename _Res> - struct _Move_result<_Res, true> - { - typedef _Res __rval_type; - static _Res _S_move(_Res __res) { return __res; } - }; - - /// Specialization for non-scalar types returns rvalue-reference. - template<typename _Res> - struct _Move_result<_Res, false> - { - typedef _Res&& __rval_type; - static _Res&& _S_move(_Res& __res) { return std::move(__res); } - }; - - // TODO: use template alias when available /* template<typename _Res> @@ -426,7 +406,6 @@ namespace std typedef __basic_future<_Res> _Base_type; typedef typename _Base_type::__state_type __state_type; - typedef __future_base::_Move_result<_Res> _Mover; explicit unique_future(const __state_type& __state) : _Base_type(__state) { } @@ -440,9 +419,9 @@ namespace std unique_future& operator=(const unique_future&) = delete; /// Retrieving the value - typename _Mover::__rval_type + _Res&& get() - { return _Mover::_S_move(this->_M_get_result()._M_value()); } + { return std::move(this->_M_get_result()._M_value()); } }; /// Partial specialization for unique_future<R&> @@ -586,7 +565,6 @@ namespace std template<typename> friend class packaged_task; typedef __future_base::_State _State; - typedef __future_base::_Move_result<_Res> _Mover; typedef __future_base::_Result<_Res> result_type; shared_ptr<_State> _M_future; @@ -654,7 +632,7 @@ namespace std set_value(_Res&& __r) { if (!_M_satisfied()) - _M_storage->_M_set(_Mover::_S_move(__r)); + _M_storage->_M_set(std::move(__r)); _M_future->_M_set_result(std::move(_M_storage)); } @@ -940,11 +918,9 @@ namespace std } __catch (const future_error& __e) { -#ifdef __EXCEPTIONS if (__e.code() == future_errc::future_already_retrieved) - throw std::bad_function_call(); - throw; -#endif + __throw_bad_function_call(); + __throw_exception_again; } } @@ -953,13 +929,7 @@ namespace std operator()(_ArgTypes... __args) { if (!static_cast<bool>(_M_task) || _M_promise._M_satisfied()) - { -#ifdef __EXCEPTIONS - throw std::bad_function_call(); -#else - __builtin_abort(); -#endif - } + __throw_bad_function_call(); __try { diff --git a/libstdc++-v3/src/functexcept.cc b/libstdc++-v3/src/functexcept.cc index 352a6b70aef..d47eccbe11c 100644 --- a/libstdc++-v3/src/functexcept.cc +++ b/libstdc++-v3/src/functexcept.cc @@ -29,6 +29,7 @@ #include <ios> #include <system_error> #include <future> +#include <functional> #ifdef _GLIBCXX_USE_NLS # include <libintl.h> @@ -104,6 +105,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __throw_future_error(int __i) { throw future_error(future_errc(__i)); } + void + __throw_bad_function_call() + { throw bad_function_call(); } #else void __throw_bad_exception(void) @@ -169,6 +173,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __throw_future_error(int) { std::abort(); } + void + __throw_bad_function_call() + { std::abort(); } + #endif //__EXCEPTIONS _GLIBCXX_END_NAMESPACE diff --git a/libstdc++-v3/src/locale_init.cc b/libstdc++-v3/src/locale_init.cc index 1a479742517..893b6063d5c 100644 --- a/libstdc++-v3/src/locale_init.cc +++ b/libstdc++-v3/src/locale_init.cc @@ -208,9 +208,25 @@ _GLIBCXX_BEGIN_NAMESPACE(std) locale::locale() throw() : _M_impl(0) { _S_initialize(); - __gnu_cxx::__scoped_lock sentry(get_locale_mutex()); - _S_global->_M_add_reference(); + + // Checked locking to optimize the common case where _S_global + // still points to _S_classic (locale::_S_initialize_once()): + // - If they are the same, just increment the reference count and + // we are done. This effectively constructs a C locale object + // identical to the static c_locale. + // - Otherwise, _S_global can and may be destroyed due to + // locale::global() call on another thread, in which case we + // fall back to lock protected access to both _S_global and + // its reference count. _M_impl = _S_global; + if (_M_impl == _S_classic) + _M_impl->_M_add_reference(); + else + { + __gnu_cxx::__scoped_lock sentry(get_locale_mutex()); + _S_global->_M_add_reference(); + _M_impl = _S_global; + } } locale diff --git a/libstdc++-v3/src/thread.cc b/libstdc++-v3/src/thread.cc index 334e5cb8f1f..879e864edd4 100644 --- a/libstdc++-v3/src/thread.cc +++ b/libstdc++-v3/src/thread.cc @@ -83,6 +83,9 @@ namespace std void thread::_M_start_thread(__shared_base_type __b) { + if (!__gthread_active_p()) + __throw_system_error(int(errc::operation_not_permitted)); + __b->_M_this_ptr = __b; int __e = __gthread_create(&_M_id._M_thread, &execute_native_thread_routine, __b.get()); diff --git a/libstdc++-v3/testsuite/20_util/function/assign/move_target.cc b/libstdc++-v3/testsuite/20_util/function/assign/move_target.cc new file mode 100644 index 00000000000..0a1c189e504 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function/assign/move_target.cc @@ -0,0 +1,47 @@ +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <functional> + +struct moveable +{ + moveable() = default; + ~moveable() = default; + // target object must be CopyConstructible, + // but should not be copied during this test + moveable(const moveable& c) { throw "copied"; } + moveable& operator=(const moveable&) = delete; + moveable(moveable&&) { } + + void operator()() const { } +}; + +void test01() +{ + std::function<void ()> f; + f = moveable(); + f(); +} + +int main() +{ + test01(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/20_util/function/cons/move_target.cc b/libstdc++-v3/testsuite/20_util/function/cons/move_target.cc new file mode 100644 index 00000000000..2396ca10171 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function/cons/move_target.cc @@ -0,0 +1,46 @@ +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <functional> + +struct moveable +{ + moveable() = default; + ~moveable() = default; + // target object must be CopyConstructible, + // but should not be copied during this test + moveable(const moveable& c) { throw "copied"; } + moveable& operator=(const moveable&) = delete; + moveable(moveable&&) { } + + void operator()() const { } +}; + +void test01() +{ + std::function<void ()> f = moveable(); + f(); +} + +int main() +{ + test01(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/bitset/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/bitset/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..0393ac71d16 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/bitset/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers. + +#include <bitset> + +template class std::bitset<10>; diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc index f7439944837..314a13f64e7 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1494 } +// { dg-error "no matching" "" { target *-*-* } 1502 } // { dg-excess-errors "" } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc index b1136f59cf7..2ae51b836d8 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1433 } +// { dg-error "no matching" "" { target *-*-* } 1441 } // { dg-excess-errors "" } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc index 8752a7e7b10..22bb275068b 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1433 } +// { dg-error "no matching" "" { target *-*-* } 1441 } // { dg-excess-errors "" } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc index 8cf322e8219..cdacae483f9 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1578 } +// { dg-error "no matching" "" { target *-*-* } 1586 } // { dg-excess-errors "" } #include <deque> diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..21997008251 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <deque> + +template class std::deque<int>; diff --git a/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.cc b/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.cc index e9195ddbc64..eb286e0f54d 100644 --- a/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.cc +++ b/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.cc @@ -23,7 +23,7 @@ int main() { typedef int value_type; - typedef __gnu_cxx::throw_allocator<value_type> allocator_type; + typedef __gnu_cxx::throw_allocator_random<value_type> allocator_type; typedef std::list<value_type, allocator_type> list_type; insert1<list_type>(); diff --git a/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.h b/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.h index c3ec6628f3d..aebbe0ba537 100644 --- a/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.h +++ b/libstdc++-v3/testsuite/23_containers/list/modifiers/insert/25288.h @@ -47,7 +47,7 @@ void insert1() list1.insert(list1.begin(), 10, 99); VERIFY( false ); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { VERIFY( true ); } @@ -74,7 +74,7 @@ void insert1() list2.insert(list2.begin(), data, data + 10); VERIFY( false ); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { VERIFY( true ); } diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/exception/basic.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/basic.cc new file mode 100644 index 00000000000..33232f965f6 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/basic.cc @@ -0,0 +1,40 @@ +// { dg-options "-std=gnu++0x" } +// { dg-require-cstdint "" } + +// 2009-11-30 Benjamin Kosnik <benjamin@redhat.com> + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <list> +#include <exception/safety.h> + +void +value() +{ + typedef __gnu_cxx::throw_value_limit value_type; + typedef __gnu_cxx::throw_allocator_limit<value_type> allocator_type; + typedef std::list<value_type, allocator_type> test_type; + __gnu_test::basic_safety<test_type> test; +} + +// Container requirement testing, exceptional behavior +int main() +{ + value(); + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/exception/generation_prohibited.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/generation_prohibited.cc new file mode 100644 index 00000000000..f3d16028e2a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/generation_prohibited.cc @@ -0,0 +1,34 @@ +// { dg-options "-std=gnu++0x" } +// { dg-require-cstdint "" } + +// 2009-09-09 Benjamin Kosnik <benjamin@redhat.com> + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <list> +#include <exception/safety.h> + +// Container requirement testing, exceptional behavior +int main() +{ + typedef __gnu_cxx::throw_value_random value_type; + typedef __gnu_cxx::throw_allocator_random<value_type> allocator_type; + typedef std::list<value_type, allocator_type> test_type; + __gnu_test::generation_prohibited<test_type> test; + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/exception/propagation_consistent.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/propagation_consistent.cc new file mode 100644 index 00000000000..02d8d0b254f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/exception/propagation_consistent.cc @@ -0,0 +1,34 @@ +// { dg-options "-std=gnu++0x" } +// { dg-require-cstdint "" } + +// 2009-09-09 Benjamin Kosnik <benjamin@redhat.com> + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <list> +#include <exception/safety.h> + +// Container requirement testing, exceptional behavior +int main() +{ + typedef __gnu_cxx::throw_value_limit value_type; + typedef __gnu_cxx::throw_allocator_limit<value_type> allocator_type; + typedef std::list<value_type, allocator_type> test_type; + __gnu_test::propagation_consistent<test_type> test; + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..78e026a7fd0 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <list> + +template class std::list<int>; diff --git a/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc b/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc index 031e4a749c3..647fef7f808 100644 --- a/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc @@ -41,5 +41,5 @@ void test01() test &= itr == mapByName.end(); // { dg-error "no" } } -// { dg-error "candidates are" "" { target *-*-* } 212 } -// { dg-error "candidates are" "" { target *-*-* } 216 } +// { dg-error "candidate is" "" { target *-*-* } 212 } +// { dg-error "candidate is" "" { target *-*-* } 216 } diff --git a/libstdc++-v3/testsuite/23_containers/map/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/map/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..3b35d54b0b1 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <map> + +template class std::map<int, double>; diff --git a/libstdc++-v3/testsuite/23_containers/multimap/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/multimap/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..be8fcb04917 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multimap/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <map> + +template class std::multimap<int, double>; diff --git a/libstdc++-v3/testsuite/23_containers/multiset/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/multiset/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..cb522b2e5c8 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multiset/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <set> + +template class std::multiset<int>; diff --git a/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..54a25271f1d --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/priority_queue/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers. + +#include <queue> + +template class std::priority_queue<int>; diff --git a/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..7daf02999ee --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/queue/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers. + +#include <queue> + +template class std::queue<int>; diff --git a/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc b/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc index 9f12a6bcfcf..6765fc1d1da 100644 --- a/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc @@ -39,5 +39,5 @@ void test01() test &= itr == setByName.end(); // { dg-error "no" } } -// { dg-error "candidates are" "" { target *-*-* } 287 } -// { dg-error "candidates are" "" { target *-*-* } 291 } +// { dg-error "candidate is" "" { target *-*-* } 287 } +// { dg-error "candidate is" "" { target *-*-* } 291 } diff --git a/libstdc++-v3/testsuite/23_containers/set/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/set/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..e957decf042 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/set/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <set> + +template class std::set<int>; diff --git a/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..93307bcf43d --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/stack/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers. + +#include <stack> + +template class std::stack<int>; diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/explicit_instantiation/1_c++0x.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/explicit_instantiation/1_c++0x.cc new file mode 100644 index 00000000000..2e5787702a0 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/explicit_instantiation/1_c++0x.cc @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// This file tests explicit instantiation of library containers + +#include <vector> + +template class std::vector<int>; diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc index db3baf35772..031ce0ba38e 100644 --- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc @@ -33,4 +33,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 32 } -// { dg-error "deleted function" "" { target *-*-* } 912 } +// { dg-error "deleted function" "" { target *-*-* } 890 } diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc index 8e57d3198f4..65cf9fdbf9c 100644 --- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc @@ -32,4 +32,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 31 } -// { dg-error "deleted function" "" { target *-*-* } 911 } +// { dg-error "deleted function" "" { target *-*-* } 889 } diff --git a/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc index 5e16d145ccc..54347408c53 100644 --- a/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc @@ -33,4 +33,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 32 } -// { dg-error "deleted function" "" { target *-*-* } 630 } +// { dg-error "deleted function" "" { target *-*-* } 608 } diff --git a/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc index 1e857977927..79d2e16639f 100644 --- a/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc @@ -32,4 +32,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 31 } -// { dg-error "deleted function" "" { target *-*-* } 614 } +// { dg-error "deleted function" "" { target *-*-* } 592 } diff --git a/libstdc++-v3/testsuite/30_threads/shared_future/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/shared_future/cons/assign_neg.cc index 26211fe1c76..0f284cd0a26 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_future/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_future/cons/assign_neg.cc @@ -35,4 +35,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 34 } -// { dg-error "deleted function" "" { target *-*-* } 514 } +// { dg-error "deleted function" "" { target *-*-* } 493 } diff --git a/libstdc++-v3/testsuite/30_threads/unique_future/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/unique_future/cons/assign_neg.cc index e29148ee785..69caf12edb4 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_future/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_future/cons/assign_neg.cc @@ -35,4 +35,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 34 } -// { dg-error "deleted function" "" { target *-*-* } 440 } +// { dg-error "deleted function" "" { target *-*-* } 419 } diff --git a/libstdc++-v3/testsuite/30_threads/unique_future/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/unique_future/cons/copy_neg.cc index 8134c7d9219..43e940cfa76 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_future/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_future/cons/copy_neg.cc @@ -34,4 +34,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 33 } -// { dg-error "deleted function" "" { target *-*-* } 439 } +// { dg-error "deleted function" "" { target *-*-* } 418 } diff --git a/libstdc++-v3/testsuite/ext/forced_exception_error/cons_virtual_derivation.cc b/libstdc++-v3/testsuite/ext/forced_error/cons_virtual_derivation.cc index ba6b1f49013..f505a796ed0 100644 --- a/libstdc++-v3/testsuite/ext/forced_exception_error/cons_virtual_derivation.cc +++ b/libstdc++-v3/testsuite/ext/forced_error/cons_virtual_derivation.cc @@ -24,7 +24,7 @@ int main() { - typedef __gnu_cxx::forced_exception_error test_type; + typedef __gnu_cxx::forced_error test_type; __gnu_test::diamond_derivation<test_type, true>::test(); return 0; } diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/check_allocate_max_size.cc b/libstdc++-v3/testsuite/ext/throw_allocator/check_allocate_max_size.cc index 1c7a6278bce..b4d099671e2 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/check_allocate_max_size.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/check_allocate_max_size.cc @@ -24,7 +24,7 @@ int main() { typedef int value_type; - typedef __gnu_cxx::throw_allocator<value_type> allocator_type; + typedef __gnu_cxx::throw_allocator_random<value_type> allocator_type; __gnu_test::check_allocate_max_size<allocator_type>(); return 0; } diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/check_deallocate_null.cc b/libstdc++-v3/testsuite/ext/throw_allocator/check_deallocate_null.cc index 1a98078c825..3f9d37ab12d 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/check_deallocate_null.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/check_deallocate_null.cc @@ -24,7 +24,7 @@ int main() { typedef int value_type; - typedef __gnu_cxx::throw_allocator<value_type> allocator_type; + typedef __gnu_cxx::throw_allocator_random<value_type> allocator_type; try { __gnu_test::check_deallocate_null<allocator_type>(); } catch (std::logic_error&) diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/check_delete.cc b/libstdc++-v3/testsuite/ext/throw_allocator/check_delete.cc index cfc38ee02f6..181a1ebc78e 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/check_delete.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/check_delete.cc @@ -24,7 +24,7 @@ int main() { - typedef __gnu_cxx::throw_allocator<unsigned int> allocator_type; + typedef __gnu_cxx::throw_allocator_random<unsigned int> allocator_type; __gnu_test::check_delete<allocator_type, true>(); return 0; } diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/check_new.cc b/libstdc++-v3/testsuite/ext/throw_allocator/check_new.cc index 2d42891766b..4338471a02a 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/check_new.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/check_new.cc @@ -24,7 +24,7 @@ int main() { - typedef __gnu_cxx::throw_allocator<unsigned int> allocator_type; + typedef __gnu_cxx::throw_allocator_random<unsigned int> allocator_type; __gnu_test::check_new<allocator_type, true>(); return 0; } diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc index c53517ebc13..65ef6dbb661 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_global.cc @@ -25,7 +25,7 @@ typedef char char_t; typedef std::char_traits<char_t> traits_t; -typedef __gnu_cxx::throw_allocator<char_t> allocator_t; +typedef __gnu_cxx::throw_allocator_random<char_t> allocator_t; typedef std::basic_string<char_t, traits_t, allocator_t> string_t; string_t s("bayou bend"); diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc index c2e918ccc25..4f00928c69b 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc @@ -24,7 +24,7 @@ typedef char char_t; typedef std::char_traits<char_t> traits_t; -typedef __gnu_cxx::throw_allocator<char_t> allocator_t; +typedef __gnu_cxx::throw_allocator_random<char_t> allocator_t; typedef std::basic_string<char_t, traits_t, allocator_t> string_t; int main() diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/explicit_instantiation.cc b/libstdc++-v3/testsuite/ext/throw_allocator/explicit_instantiation.cc index 659807d0be6..c2600446ff2 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/explicit_instantiation.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/explicit_instantiation.cc @@ -21,4 +21,5 @@ #include <cstdlib> #include <ext/throw_allocator.h> -template class __gnu_cxx::throw_allocator<int>; +template class __gnu_cxx::throw_allocator_random<int>; +template class __gnu_cxx::throw_allocator_limit<int>; diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/variadic_construct.cc b/libstdc++-v3/testsuite/ext/throw_allocator/variadic_construct.cc index 395cacc0348..fd1ee8df499 100644 --- a/libstdc++-v3/testsuite/ext/throw_allocator/variadic_construct.cc +++ b/libstdc++-v3/testsuite/ext/throw_allocator/variadic_construct.cc @@ -29,7 +29,7 @@ void test01() { bool test __attribute__((unused)) = true; typedef std::pair<int, char> pair_type; - __gnu_cxx::throw_allocator<pair_type> alloc1; + __gnu_cxx::throw_allocator_random<pair_type> alloc1; pair_type* ptp1 = alloc1.allocate(1); alloc1.construct(ptp1, 3, 'a'); diff --git a/libstdc++-v3/testsuite/ext/throw_value/cons.cc b/libstdc++-v3/testsuite/ext/throw_value/cons.cc new file mode 100644 index 00000000000..fa3f3f71ca0 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/throw_value/cons.cc @@ -0,0 +1,43 @@ +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <type_traits> +#include <ext/throw_allocator.h> + +void foo1() +{ + typedef __gnu_cxx::throw_value_limit value_type; + value_type v1; + value_type v2(v2); + value_type v3(value_type()); +} + +bool foo2() +{ + typedef __gnu_cxx::throw_value_limit value_type; + bool b = std::is_convertible<value_type, value_type>::value; + return b; +} + +int main() +{ + foo1(); + foo2(); + return 0; +} diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h new file mode 100644 index 00000000000..ce9dad4f7ba --- /dev/null +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -0,0 +1,1066 @@ +// -*- C++ -*- + +// Copyright (C) 2009 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#ifndef _GLIBCXX_EXCEPTION_SAFETY_H +#define _GLIBCXX_EXCEPTION_SAFETY_H + +#include <testsuite_container_traits.h> +#include <ext/throw_allocator.h> + +// Container requirement testing. +namespace __gnu_test +{ + // Base class for exception testing, contains utilities. + struct setup_base + { + typedef std::size_t size_type; + typedef std::uniform_int_distribution<size_type> distribution_type; + typedef std::mt19937 engine_type; + + // Return randomly generated integer on range [0, __max_size]. + static size_type + generate(size_type __max_size) + { + // Make the generator static... + const engine_type engine; + const distribution_type distribution; + static auto generator = std::bind(distribution, engine, + std::placeholders::_1); + + // ... but set the range for this particular invocation here. + const typename distribution_type::param_type p(0, __max_size); + size_type random = generator(p); + if (random < distribution.min() || random > distribution.max()) + { + std::string __s("setup_base::generate"); + __s += "\n"; + __s += "random number generated is: "; + char buf[40]; + __builtin_sprintf(buf, "%lu", random); + __s += buf; + __s += " on range ["; + __builtin_sprintf(buf, "%lu", distribution.min()); + __s += buf; + __s += ", "; + __builtin_sprintf(buf, "%lu", distribution.max()); + __s += buf; + __s += "]\n"; + std::__throw_out_of_range(__s.c_str()); + } + return random; + } + + // Given an instantiating type, return a unique value. + template<typename _Tp> + struct generate_unique + { + typedef _Tp value_type; + + operator value_type() + { + static value_type __ret; + ++__ret; + return __ret; + } + }; + + // Partial specialization for pair. + template<typename _Tp1, typename _Tp2> + struct generate_unique<std::pair<const _Tp1, _Tp2>> + { + typedef _Tp1 first_type; + typedef _Tp2 second_type; + typedef std::pair<const _Tp1, _Tp2> pair_type; + + operator pair_type() + { + static first_type _S_1; + static second_type _S_2; + ++_S_1; + ++_S_2; + return pair_type(_S_1, _S_2); + } + }; + + // Partial specialization for throw_value + template<typename _Cond> + struct generate_unique<__gnu_cxx::throw_value_base<_Cond>> + { + typedef __gnu_cxx::throw_value_base<_Cond> value_type; + + operator value_type() + { + static size_t _S_i(0); + return value_type(_S_i++); + } + }; + + + // Construct container of size n directly. _Tp == container type. + template<typename _Tp> + struct make_container_base + { + _Tp _M_container; + + make_container_base() = default; + make_container_base(const size_type n): _M_container(n) { } + + operator _Tp&() { return _M_container; } + }; + + // Construct container of size n, via multiple insertions. For + // associated and unordered types, unique value_type elements are + // necessary. + template<typename _Tp, bool = traits<_Tp>::is_mapped::value> + struct make_insert_container_base + : public make_container_base<_Tp> + { + using make_container_base<_Tp>::_M_container; + typedef typename _Tp::value_type value_type; + + make_insert_container_base(const size_type n) + { + for (size_type i = 0; i < n; ++i) + { + value_type v = generate_unique<value_type>(); + _M_container.insert(v); + } + assert(_M_container.size() == n); + } + }; + + template<typename _Tp> + struct make_insert_container_base<_Tp, false> + : public make_container_base<_Tp> + { + using make_container_base<_Tp>::_M_container; + typedef typename _Tp::value_type value_type; + + make_insert_container_base(const size_type n) + { + for (size_type i = 0; i < n; ++i) + { + value_type v = generate_unique<value_type>(); + _M_container.insert(_M_container.end(), v); + } + assert(_M_container.size() == n); + } + }; + + template<typename _Tp, bool = traits<_Tp>::has_size_type_constructor::value> + struct make_container_n; + + // Specialization for non-associative types that have a constructor with + // a size argument. + template<typename _Tp> + struct make_container_n<_Tp, true> + : public make_container_base<_Tp> + { + make_container_n(const size_type n) : make_container_base<_Tp>(n) { } + }; + + template<typename _Tp> + struct make_container_n<_Tp, false> + : public make_insert_container_base<_Tp> + { + make_container_n(const size_type n) + : make_insert_container_base<_Tp>(n) { } + }; + + + // Randomly size and populate a given container reference. + // NB: Responsibility for turning off exceptions lies with caller. + template<typename _Tp, bool = traits<_Tp>::is_allocator_aware::value> + struct populate + { + typedef _Tp container_type; + typedef typename container_type::allocator_type allocator_type; + typedef typename container_type::value_type value_type; + + populate(_Tp& __container) + { + const allocator_type a = __container.get_allocator(); + + // Size test container. + const size_type max_elements = 100; + size_type n = generate(max_elements); + + // Construct new container. + make_container_n<container_type> made(n); + container_type& tmp = made; + std::swap(tmp, __container); + } + }; + + // Partial specialization, empty. + template<typename _Tp> + struct populate<_Tp, false> + { + populate(_Tp&) { } + }; + + // Compare two containers for equivalence. + // Right now, that means size. + // Returns true if equal, throws if not. + template<typename _Tp> + static bool + compare(const _Tp& __control, const _Tp& __test) + { + // Make sure test container is in a consistent state, as + // compared to the control container. + // NB: Should be equivalent to __test != __control, but + // computed without equivalence operators + const size_type szt = std::distance(__test.begin(), __test.end()); + const size_type szc = std::distance(__control.begin(), + __control.end()); + bool __equal_size = szt == szc; + + // Should test iterator validity before and after exception. + bool __equal_it = std::equal(__test.begin(), __test.end(), + __control.begin()); + + if (!__equal_size || !__equal_it) + throw std::logic_error("setup_base::compare containers not equal"); + + return true; + } + }; + + + // Containing structure holding functors. + struct functor_base : public setup_base + { + // Abstract the erase function. + template<typename _Tp> + struct erase_base + { + typedef typename _Tp::iterator iterator; + + iterator (_Tp::* _F_erase_point)(iterator); + iterator (_Tp::* _F_erase_range)(iterator, iterator); + + erase_base() + : _F_erase_point(&_Tp::erase), _F_erase_range(&_Tp::erase) { } + }; + + // Specialization, as forward_list has erase_after. + template<typename _Tp1, typename _Tp2> + struct erase_base<std::forward_list<_Tp1, _Tp2>> + { + typedef std::forward_list<_Tp1, _Tp2> container_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::const_iterator const_iterator; + + void (container_type::* _F_erase_point)(const_iterator); + void (container_type::* _F_erase_range)(const_iterator, const_iterator); + + erase_base() + : _F_erase_point(&container_type::erase_after), + _F_erase_range(&container_type::erase_after) { } + }; + + template<typename _Tp, bool = traits<_Tp>::has_erase::value> + struct erase_point : public erase_base<_Tp> + { + using erase_base<_Tp>::_F_erase_point; + + void + operator()(_Tp& __container) + { + try + { + // NB: Should be equivalent to size() member function, but + // computed with begin() and end(). + const size_type sz = std::distance(__container.begin(), + __container.end()); + + // NB: Lowest common denominator: use forward iterator operations. + auto i = __container.begin(); + std::advance(i, generate(sz)); + + // Makes it easier to think of this as __container.erase(i) + (__container.*_F_erase_point)(i); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct erase_point<_Tp, false> + { + void + operator()(_Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::has_erase::value> + struct erase_range : public erase_base<_Tp> + { + using erase_base<_Tp>::_F_erase_range; + + void + operator()(_Tp& __container) + { + try + { + const size_type sz = std::distance(__container.begin(), + __container.end()); + size_type s1 = generate(sz); + size_type s2 = generate(sz); + auto i1 = __container.begin(); + auto i2 = __container.begin(); + std::advance(i1, std::min(s1, s2)); + std::advance(i2, std::max(s1, s2)); + + // Makes it easier to think of this as __container.erase(i1, i2). + (__container.*_F_erase_range)(i1, i2); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct erase_range<_Tp, false> + { + void + operator()(_Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::has_push_pop::value> + struct pop_front + { + void + operator()(_Tp& __container) + { + try + { + __container.pop_front(); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct pop_front<_Tp, false> + { + void + operator()(_Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::has_push_pop::value + && traits<_Tp>::is_reversible::value> + struct pop_back + { + void + operator()(_Tp& __container) + { + try + { + __container.pop_back(); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct pop_back<_Tp, false> + { + void + operator()(_Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::has_push_pop::value> + struct push_front + { + typedef _Tp container_type; + typedef typename container_type::value_type value_type; + + void + operator()(_Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + __test.push_front(cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + + // Assumes containers start out equivalent. + void + operator()(_Tp& __control, _Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + __test.push_front(cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct push_front<_Tp, false> + { + void + operator()(_Tp&) { } + + void + operator()(_Tp&, _Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::has_push_pop::value + && traits<_Tp>::is_reversible::value> + struct push_back + { + typedef _Tp container_type; + typedef typename container_type::value_type value_type; + + void + operator()(_Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + __test.push_back(cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + + // Assumes containers start out equivalent. + void + operator()(_Tp& __control, _Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + __test.push_back(cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct push_back<_Tp, false> + { + void + operator()(_Tp&) { } + + void + operator()(_Tp&, _Tp&) { } + }; + + + // Abstract the insert function into two parts: + // 1, insert_base_functions == holds function pointer + // 2, insert_base == links function pointer to class insert method + template<typename _Tp> + struct insert_base + { + typedef typename _Tp::iterator iterator; + typedef typename _Tp::value_type value_type; + + iterator (_Tp::* _F_insert_point)(iterator, const value_type&); + + insert_base() : _F_insert_point(&_Tp::insert) { } + }; + + // Specialization, as string insertion has a different signature. + template<typename _Tp1, typename _Tp2, typename _Tp3> + struct insert_base<std::basic_string<_Tp1, _Tp2, _Tp3>> + { + typedef std::basic_string<_Tp1, _Tp2, _Tp3> container_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::value_type value_type; + + iterator (container_type::* _F_insert_point)(iterator, value_type); + + insert_base() : _F_insert_point(&container_type::insert) { } + }; + + template<typename _Tp1, typename _Tp2, typename _Tp3> + struct insert_base<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3>> + { + typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3> container_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::value_type value_type; + + iterator (container_type::* _F_insert_point)(iterator, value_type); + + insert_base() : _F_insert_point(&container_type::insert) { } + }; + + // Specialization, as forward_list insertion has a different signature. + template<typename _Tp1, typename _Tp2> + struct insert_base<std::forward_list<_Tp1, _Tp2>> + { + typedef std::forward_list<_Tp1, _Tp2> container_type; + typedef typename container_type::iterator iterator; + typedef typename container_type::const_iterator const_iterator; + typedef typename container_type::value_type value_type; + + iterator (container_type::* _F_insert_point)(const_iterator, + const value_type&); + + insert_base() : _F_insert_point(&container_type::insert_after) { } + }; + + template<typename _Tp, bool = traits<_Tp>::has_insert::value> + struct insert_point : public insert_base<_Tp> + { + typedef _Tp container_type; + typedef typename container_type::value_type value_type; + using insert_base<_Tp>::_F_insert_point; + + void + operator()(_Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + const size_type sz = std::distance(__test.begin(), __test.end()); + size_type s = generate(sz); + auto i = __test.begin(); + std::advance(i, s); + (__test.*_F_insert_point)(i, cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + + // Assumes containers start out equivalent. + void + operator()(_Tp& __control, _Tp& __test) + { + try + { + const value_type cv = generate_unique<value_type>(); + const size_type sz = std::distance(__test.begin(), __test.end()); + size_type s = generate(sz); + auto i = __test.begin(); + std::advance(i, s); + (__test.*_F_insert_point)(i, cv); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct insert_point<_Tp, false> + { + void + operator()(_Tp&) { } + + void + operator()(_Tp&, _Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::is_associative::value + || traits<_Tp>::is_unordered::value> + struct clear + { + void + operator()(_Tp& __container) + { + try + { + __container.clear(); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct clear<_Tp, false> + { + void + operator()(_Tp&) { } + }; + + + template<typename _Tp, bool = traits<_Tp>::is_unordered::value> + struct rehash + { + void + operator()(_Tp& __test) + { + try + { + size_type s = generate(__test.bucket_count()); + __test.rehash(s); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + + void + operator()(_Tp& __control, _Tp& __test) + { + try + { + size_type s = generate(__test.bucket_count()); + __test.rehash(s); + } + catch(const __gnu_cxx::forced_error&) + { + // Also check hash status. + bool fail(false); + if (__control.load_factor() != __test.load_factor()) + fail = true; + if (__control.max_load_factor() != __test.max_load_factor()) + fail = true; + if (__control.bucket_count() != __test.bucket_count()) + fail = true; + if (__control.max_bucket_count() != __test.max_bucket_count()) + fail = true; + + if (fail) + { + char buf[40]; + std::string __s("setup_base::rehash " + "containers not equal"); + __s += "\n"; + __s += "\n"; + __s += "\t\t\tcontrol : test"; + __s += "\n"; + __s += "load_factor\t\t"; + __builtin_sprintf(buf, "%lu", __control.load_factor()); + __s += buf; + __s += " : "; + __builtin_sprintf(buf, "%lu", __test.load_factor()); + __s += buf; + __s += "\n"; + + __s += "max_load_factor\t\t"; + __builtin_sprintf(buf, "%lu", __control.max_load_factor()); + __s += buf; + __s += " : "; + __builtin_sprintf(buf, "%lu", __test.max_load_factor()); + __s += buf; + __s += "\n"; + + __s += "bucket_count\t\t"; + __builtin_sprintf(buf, "%lu", __control.bucket_count()); + __s += buf; + __s += " : "; + __builtin_sprintf(buf, "%lu", __test.bucket_count()); + __s += buf; + __s += "\n"; + + __s += "max_bucket_count\t"; + __builtin_sprintf(buf, "%lu", __control.max_bucket_count()); + __s += buf; + __s += " : "; + __builtin_sprintf(buf, "%lu", __test.max_bucket_count()); + __s += buf; + __s += "\n"; + + std::__throw_logic_error(__s.c_str()); + } + } + } + }; + + // Specialization, empty. + template<typename _Tp> + struct rehash<_Tp, false> + { + void + operator()(_Tp&) { } + + void + operator()(_Tp&, _Tp&) { } + }; + + + template<typename _Tp> + struct swap + { + _Tp _M_other; + + void + operator()(_Tp& __container) + { + try + { + __container.swap(_M_other); + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + + template<typename _Tp> + struct iterator_operations + { + typedef _Tp container_type; + typedef typename container_type::iterator iterator; + + void + operator()(_Tp& __container) + { + try + { + // Any will do. + iterator i = __container.begin(); + iterator __attribute__((unused)) icopy(i); + iterator __attribute__((unused)) iassign = i; + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + + + template<typename _Tp> + struct const_iterator_operations + { + typedef _Tp container_type; + typedef typename container_type::const_iterator const_iterator; + + void + operator()(_Tp& __container) + { + try + { + // Any will do. + const_iterator i = __container.begin(); + const_iterator __attribute__((unused)) icopy(i); + const_iterator __attribute__((unused)) iassign = i; + } + catch(const __gnu_cxx::forced_error&) + { throw; } + } + }; + }; + + // Base class for exception tests. + template<typename _Tp> + struct test_base: public functor_base + { + typedef _Tp container_type; + + typedef functor_base base_type; + typedef populate<container_type> populate; + typedef make_container_n<container_type> make_container_n; + + typedef clear<container_type> clear; + typedef erase_point<container_type> erase_point; + typedef erase_range<container_type> erase_range; + typedef insert_point<container_type> insert_point; + typedef pop_front<container_type> pop_front; + typedef pop_back<container_type> pop_back; + typedef push_front<container_type> push_front; + typedef push_back<container_type> push_back; + typedef rehash<container_type> rehash; + typedef swap<container_type> swap; + typedef iterator_operations<container_type> iterator_ops; + typedef const_iterator_operations<container_type> const_iterator_ops; + + using base_type::compare; + + // Functor objects. + clear _M_clear; + erase_point _M_erasep; + erase_range _M_eraser; + insert_point _M_insertp; + pop_front _M_popf; + pop_back _M_popb; + push_front _M_pushf; + push_back _M_pushb; + rehash _M_rehash; + swap _M_swap; + + iterator_ops _M_iops; + const_iterator_ops _M_ciops; + }; + + + // Run through all member functions for basic exception safety + // guarantee: no resource leaks when exceptions are thrown. + // + // Types of resources checked: memory. + // + // For each member function, use throw_value and throw_allocator as + // value_type and allocator_type to force potential exception safety + // errors. + // + // NB: Assumes + // _Tp::value_type is __gnu_cxx::throw_value_* + // _Tp::allocator_type is __gnu_cxx::throw_allocator_* + // And that the _Cond template parameter for them both is + // __gnu_cxx::limit_condition. + template<typename _Tp> + struct basic_safety : public test_base<_Tp> + { + typedef _Tp container_type; + typedef test_base<container_type> base_type; + typedef typename base_type::populate populate; + typedef std::function<void(container_type&)> function_type; + typedef __gnu_cxx::limit_condition condition_type; + + using base_type::generate; + + container_type _M_container; + std::vector<function_type> _M_functions; + + basic_safety() { run(); } + + void + run() + { + // Setup. + condition_type::never_adjustor off; + + // Construct containers. + populate p1(_M_container); + populate p2(base_type::_M_swap._M_other); + + // Construct list of member functions to exercise. + _M_functions.push_back(function_type(base_type::_M_iops)); + _M_functions.push_back(function_type(base_type::_M_ciops)); + + _M_functions.push_back(function_type(base_type::_M_erasep)); + _M_functions.push_back(function_type(base_type::_M_eraser)); + _M_functions.push_back(function_type(base_type::_M_insertp)); + _M_functions.push_back(function_type(base_type::_M_popf)); + _M_functions.push_back(function_type(base_type::_M_popb)); + _M_functions.push_back(function_type(base_type::_M_pushf)); + _M_functions.push_back(function_type(base_type::_M_pushb)); + _M_functions.push_back(function_type(base_type::_M_rehash)); + _M_functions.push_back(function_type(base_type::_M_swap)); + + // Last. + _M_functions.push_back(function_type(base_type::_M_clear)); + + // Run tests. + auto i = _M_functions.begin(); + for (auto i = _M_functions.begin(); i != _M_functions.end(); ++i) + { + function_type& f = *i; + run_steps_to_limit(f); + } + } + + template<typename _Funct> + void + run_steps_to_limit(const _Funct& __f) + { + size_t i(1); + bool exit(false); + auto a = _M_container.get_allocator(); + + do + { + // Use the current step as an allocator label. + a.set_label(i); + + try + { + condition_type::limit_adjustor limit(i); + __f(_M_container); + + // If we get here, done. + exit = true; + } + catch(const __gnu_cxx::forced_error&) + { + // Check this step for allocations. + // NB: Will throw std::logic_error if allocations. + a.check_allocated(i); + + // Check memory allocated with operator new. + + ++i; + } + } + while (!exit); + + // Log count info. + std::cout << __f.target_type().name() << std::endl; + std::cout << "end count " << i << std::endl; + } + }; + + + // Run through all member functions with a no throw requirement, sudden death. + // all: member functions erase, pop_back, pop_front, swap + // iterator copy ctor, assignment operator + // unordered and associative: clear + // NB: Assumes _Tp::allocator_type is __gnu_cxx::throw_allocator_random. + template<typename _Tp> + struct generation_prohibited : public test_base<_Tp> + { + typedef _Tp container_type; + typedef test_base<container_type> base_type; + typedef typename base_type::populate populate; + typedef __gnu_cxx::random_condition condition_type; + + container_type _M_container; + + generation_prohibited() { run(); } + + void + run() + { + // Furthermore, assumes that the test functor will throw + // forced_exception via throw_allocator, that all errors are + // propagated and in error. Sudden death! + + // Setup. + { + condition_type::never_adjustor off; + populate p1(_M_container); + populate p2(base_type::_M_swap._M_other); + } + + // Run tests. + { + condition_type::always_adjustor on; + + _M_erasep(_M_container); + _M_eraser(_M_container); + + _M_popf(_M_container); + _M_popb(_M_container); + + _M_iops(_M_container); + _M_ciops(_M_container); + + _M_swap(_M_container); + + // Last. + _M_clear(_M_container); + } + } + }; + + + // Test strong exception guarantee. + // Run through all member functions with a roll-back, consistent + // coherent requirement. + // all: member functions insert of a single element, push_back, push_front + // unordered: rehash + template<typename _Tp> + struct propagation_consistent : public test_base<_Tp> + { + typedef _Tp container_type; + typedef test_base<container_type> base_type; + typedef typename base_type::populate populate; + typedef std::function<void(container_type&)> function_type; + typedef __gnu_cxx::limit_condition condition_type; + + using base_type::compare; + + container_type _M_container_test; + container_type _M_container_control; + std::vector<function_type> _M_functions; + + propagation_consistent() { run(); } + + void + sync() + { _M_container_test = _M_container_control; } + + // Run test. + void + run() + { + // Setup. + condition_type::never_adjustor off; + + // Construct containers. + populate p(_M_container_control); + sync(); + + // Construct list of member functions to exercise. + _M_functions.push_back(function_type(base_type::_M_pushf)); + _M_functions.push_back(function_type(base_type::_M_pushb)); + _M_functions.push_back(function_type(base_type::_M_insertp)); + _M_functions.push_back(function_type(base_type::_M_rehash)); + + // Run tests. + auto i = _M_functions.begin(); + for (auto i = _M_functions.begin(); i != _M_functions.end(); ++i) + { + function_type& f = *i; + run_steps_to_limit(f); + } + } + + template<typename _Funct> + void + run_steps_to_limit(const _Funct& __f) + { + size_t i(1); + bool exit(false); + + do + { + sync(); + + try + { + condition_type::limit_adjustor limit(i); + __f(_M_container_test); + + // If we get here, done. + exit = true; + } + catch(const __gnu_cxx::forced_error&) + { + compare(_M_container_control, _M_container_test); + ++i; + } + } + while (!exit); + + // Log count info. + std::cout << __f.target_type().name() << std::endl; + std::cout << "end count " << i << std::endl; + } + }; + +} // namespace __gnu_test + +#endif diff --git a/libstdc++-v3/testsuite/util/regression/basic_type.hpp b/libstdc++-v3/testsuite/util/regression/basic_type.hpp index 6d12bd68f77..9fe6ef24d41 100644 --- a/libstdc++-v3/testsuite/util/regression/basic_type.hpp +++ b/libstdc++-v3/testsuite/util/regression/basic_type.hpp @@ -46,7 +46,7 @@ namespace test { #define PB_DS_BASE_C_DEC \ std::basic_string<char, std::char_traits<char>, \ - __gnu_cxx::throw_allocator<char> > + __gnu_cxx::throw_allocator_random<char> > struct basic_type : public PB_DS_BASE_C_DEC { diff --git a/libstdc++-v3/testsuite/util/regression/common_type.hpp b/libstdc++-v3/testsuite/util/regression/common_type.hpp index 9e6a80d68fc..37705bc2d7d 100644 --- a/libstdc++-v3/testsuite/util/regression/common_type.hpp +++ b/libstdc++-v3/testsuite/util/regression/common_type.hpp @@ -46,7 +46,7 @@ namespace __gnu_pbds { namespace test { - typedef __gnu_cxx::throw_allocator<basic_type> alloc_type; + typedef __gnu_cxx::throw_allocator_random<basic_type> alloc_type; struct hash { diff --git a/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.h b/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.h index 393463a4dc0..ca443321216 100644 --- a/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.h +++ b/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.h @@ -80,7 +80,7 @@ namespace detail typedef typename test_traits::native_type native_type; typedef twister_rand_gen gen; typedef __gnu_pbds::container_traits<Cntnr> container_traits; - typedef __gnu_cxx::throw_allocator<char> alloc_t; + typedef __gnu_cxx::throw_allocator_random<char> alloc_t; enum op { diff --git a/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.tcc b/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.tcc index d995a049ed6..43cdb9f2b62 100644 --- a/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.tcc +++ b/libstdc++-v3/testsuite/util/regression/rand/assoc/container_rand_regression_test.tcc @@ -66,7 +66,7 @@ default_constructor() { m_p_c = new Cntnr; } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -107,7 +107,7 @@ copy_constructor() p_c = new Cntnr(*m_p_c); std::swap(p_c, m_p_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -134,7 +134,7 @@ assignment_operator() * p_c =* m_p_c; std::swap(p_c, m_p_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -210,7 +210,7 @@ it_constructor_imp(__gnu_pbds::cc_hash_tag) }; std::swap(p_c, m_p_c); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { done = false; } @@ -293,7 +293,7 @@ it_constructor_imp(__gnu_pbds::gp_hash_tag) }; std::swap(p_c, m_p_c); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { done = false; } @@ -329,7 +329,7 @@ it_constructor_imp(__gnu_pbds::tree_tag) }; std::swap(p_c, m_p_c); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { done = false; } @@ -354,7 +354,7 @@ it_constructor_imp(__gnu_pbds::list_update_tag) p_c = new Cntnr(m_p_c->begin(), m_p_c->end()); std::swap(p_c, m_p_c); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { done = false; } @@ -392,7 +392,7 @@ it_constructor_imp(__gnu_pbds::pat_trie_tag) std::swap(p_c, m_p_c); } - catch (__gnu_cxx::forced_exception_error&) + catch (__gnu_cxx::forced_error&) { done = false; } @@ -1088,7 +1088,7 @@ insert() } m_native_c.insert(test_traits::native_value(v)); } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -1139,7 +1139,7 @@ subscript_imp(__gnu_pbds::detail::false_type) m_native_c[test_traits::native_value(v).first] = test_traits::native_value(v).second; } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -1164,7 +1164,7 @@ subscript_imp(__gnu_pbds::detail::true_type) (*m_p_c)[v] = __gnu_pbds::null_mapped_type(); m_native_c.insert(test_traits::native_value(v)); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -1213,7 +1213,7 @@ erase() PB_DS_THROW_IF_FAILED(m_p_c->find(k) == m_p_c->end(), "", m_p_c, &m_native_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; @@ -1251,7 +1251,7 @@ erase_if() PB_DS_THROW_IF_FAILED(ersd == native_ersd, ersd << " " << native_ersd, m_p_c, &m_native_c); } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; PB_DS_THROW_IF_FAILED(container_traits::erase_can_throw, @@ -1329,7 +1329,7 @@ erase_it_imp(__gnu_pbds::detail::true_type) if (range_guarantee) PB_DS_THROW_IF_FAILED(next_ers_it == next_it, "", m_p_c, &m_native_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; PB_DS_THROW_IF_FAILED(container_traits::erase_can_throw, container_traits::erase_can_throw, m_p_c, &m_native_c); @@ -1392,7 +1392,7 @@ erase_rev_it_imp(__gnu_pbds::detail::true_type) if (native_it != m_native_c.end()) m_native_c.erase(native_it); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; PB_DS_THROW_IF_FAILED(container_traits::erase_can_throw, @@ -1763,7 +1763,7 @@ split_join_imp(__gnu_pbds::detail::true_type) PB_DS_THROW_IF_FAILED(rhs.empty(), rhs.size(), m_p_c, &m_native_c); m_p_c->swap(lhs); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; PB_DS_THROW_IF_FAILED(container_traits::split_join_can_throw, diff --git a/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.tcc b/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.tcc index fe8ae6ba7ed..f964911facb 100644 --- a/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.tcc +++ b/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.tcc @@ -66,7 +66,7 @@ default_constructor() { m_p_c = new Cntnr; } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -110,7 +110,7 @@ copy_constructor() p_c = new Cntnr(*m_p_c); std::swap(p_c, m_p_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -139,7 +139,7 @@ assignment_operator() *p_c = *m_p_c; std::swap(p_c, m_p_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -180,7 +180,7 @@ it_constructor() std::swap(p_c, m_p_c); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -433,7 +433,7 @@ push() _GLIBCXX_THROW_IF(sz != m_p_c->size() - 1, sz, m_p_c, &m_native_c); m_native_c.push(test_traits::native_value(v)); } - catch(__gnu_cxx::forced_exception_error& ) + catch(__gnu_cxx::forced_error&) { done = false; } @@ -475,7 +475,7 @@ modify() m_native_c.modify(native_v, new_native_v); } } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; _GLIBCXX_THROW_IF(true, "", m_p_c, &m_native_c); @@ -517,7 +517,7 @@ pop() m_native_c.pop(); } } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; _GLIBCXX_THROW_IF(true, "", m_p_c, &m_native_c); @@ -560,7 +560,7 @@ erase_if() _GLIBCXX_THROW_IF(ersd != native_ersd, ersd << " " << native_ersd, m_p_c, &m_native_c); } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; _GLIBCXX_THROW_IF(true, "", m_p_c, &m_native_c); @@ -592,7 +592,7 @@ erase_it() m_p_c->erase(it); } } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; _GLIBCXX_THROW_IF(true, "", m_p_c, &m_native_c); @@ -715,7 +715,7 @@ split_join() _GLIBCXX_THROW_IF(rhs.size() != 0, rhs.size(), m_p_c, &m_native_c); _GLIBCXX_THROW_IF(!rhs.empty(), rhs.size(), m_p_c, &m_native_c); } - catch(__gnu_cxx::forced_exception_error&) + catch(__gnu_cxx::forced_error&) { done = false; const bool b = __gnu_pbds::container_traits<cntnr>::split_join_can_throw; diff --git a/libstdc++-v3/testsuite/util/testsuite_container_traits.h b/libstdc++-v3/testsuite/util/testsuite_container_traits.h index 7c4b1a27097..85d04c5728c 100644 --- a/libstdc++-v3/testsuite/util/testsuite_container_traits.h +++ b/libstdc++-v3/testsuite/util/testsuite_container_traits.h @@ -24,8 +24,9 @@ #include <ext/vstring.h> namespace __gnu_test -{ +{ // Container traits. + // Base class with default false values for all traits. struct traits_base { // Type, nested type, and typedef related traits. @@ -37,6 +38,11 @@ namespace __gnu_test typedef std::false_type is_associative; typedef std::false_type is_unordered; typedef std::false_type is_mapped; + + typedef std::false_type has_erase; + typedef std::false_type has_insert; + typedef std::false_type has_push_pop; + typedef std::false_type has_size_type_constructor; }; // Primary template does nothing. Specialize on each type under @@ -46,40 +52,55 @@ namespace __gnu_test // Specialize for each container. template<typename _Tp, size_t _Np> - struct traits<std::array<_Tp, _Np> > : public traits_base + struct traits<std::array<_Tp, _Np>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; }; - template<typename _Tp> - struct traits<std::deque<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::deque<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + typedef std::true_type has_insert; + typedef std::true_type has_push_pop; + typedef std::true_type has_size_type_constructor; }; - template<typename _Tp> - struct traits<std::forward_list<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::forward_list<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + typedef std::true_type has_insert; + typedef std::true_type has_push_pop; + typedef std::true_type has_size_type_constructor; }; - template<typename _Tp> - struct traits<std::list<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::list<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + typedef std::true_type has_insert; + typedef std::true_type has_push_pop; + typedef std::true_type has_size_type_constructor; }; - template<typename _Kp, typename _Tp> - struct traits<std::map<_Kp, _Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4> + struct traits<std::map<_Tp1, _Tp2, _Tp3, _Tp4>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; @@ -87,10 +108,12 @@ namespace __gnu_test typedef std::true_type is_pointer_aware; typedef std::true_type is_associative; typedef std::true_type is_mapped; + + typedef std::true_type has_insert; }; - template<typename _Kp, typename _Tp> - struct traits<std::multimap<_Kp, _Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4> + struct traits<std::multimap<_Tp1, _Tp2, _Tp3, _Tp4>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; @@ -100,108 +123,142 @@ namespace __gnu_test typedef std::true_type is_mapped; }; - template<typename _Tp> - struct traits<std::multiset<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3> + struct traits<std::multiset<_Tp1, _Tp2, _Tp3>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_associative; + + typedef std::true_type has_insert; }; - template<typename _Tp> - struct traits<std::priority_queue<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::priority_queue<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_adaptor; }; - template<typename _Tp> - struct traits<std::queue<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::queue<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_adaptor; }; - template<typename _Tp> - struct traits<std::set<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3> + struct traits<std::set<_Tp1, _Tp2, _Tp3>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_associative; + + typedef std::true_type has_insert; }; - template<typename _Tp> - struct traits<std::stack<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::stack<_Tp1, _Tp2> > : public traits_base { typedef std::true_type is_adaptor; }; - template<typename _Kp, typename _Tp> - struct traits<std::unordered_map<_Kp, _Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, + typename _Tp4, typename _Tp5> + struct traits<std::unordered_map<_Tp1, _Tp2, _Tp3, _Tp4, _Tp5>> + : public traits_base { typedef std::true_type is_container; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_unordered; typedef std::true_type is_mapped; + + typedef std::true_type has_size_type_constructor; + typedef std::true_type has_insert; }; - template<typename _Kp, typename _Tp> - struct traits<std::unordered_multimap<_Kp, _Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, + typename _Tp4, typename _Tp5> + struct traits<std::unordered_multimap<_Tp1, _Tp2, _Tp3, _Tp4, _Tp5>> + : public traits_base { typedef std::true_type is_container; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_unordered; typedef std::true_type is_mapped; + + typedef std::true_type has_size_type_constructor; }; - template<typename _Tp> - struct traits<std::unordered_multiset<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4> + struct traits<std::unordered_multiset<_Tp1, _Tp2, _Tp3, _Tp4>> + : public traits_base { typedef std::true_type is_container; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_unordered; + + typedef std::true_type has_insert; }; - template<typename _Tp> - struct traits<std::unordered_set<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4> + struct traits<std::unordered_set<_Tp1, _Tp2, _Tp3, _Tp4>> + : public traits_base { typedef std::true_type is_container; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; typedef std::true_type is_unordered; + + typedef std::true_type has_size_type_constructor; + typedef std::true_type has_insert; }; - template<typename _Tp> - struct traits<std::vector<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2> + struct traits<std::vector<_Tp1, _Tp2>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + typedef std::true_type has_insert; + typedef std::true_type has_size_type_constructor; }; - template<typename _Tp> - struct traits<std::basic_string<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3> + struct traits<std::basic_string<_Tp1, _Tp2, _Tp3>> : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + typedef std::true_type has_insert; }; - template<typename _Tp> - struct traits<__gnu_cxx::__versa_string<_Tp> > : public traits_base + template<typename _Tp1, typename _Tp2, typename _Tp3, + template <typename, typename, typename> class _Tp4> + struct traits<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>> + : public traits_base { typedef std::true_type is_container; typedef std::true_type is_reversible; typedef std::true_type is_allocator_aware; typedef std::true_type is_pointer_aware; + + typedef std::true_type has_erase; + + // XXX no vstring<rc>::insert + // typedef std::true_type has_insert; }; } // namespace __gnu_test -#endif +#endif |