From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2168) id E17D03861024; Fri, 3 Sep 2021 00:17:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E17D03861024 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" From: GCC Administrator To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-3322] Daily bump. X-Act-Checkin: gcc X-Git-Author: GCC Administrator X-Git-Refname: refs/heads/master X-Git-Oldrev: 93b6b2f614eb692d1d8126ec6cb946984a9d01d7 X-Git-Newrev: 9f7c2bad52e51ec88a71c0d50826bfa2e6f44b15 Message-Id: <20210903001705.E17D03861024@sourceware.org> Date: Fri, 3 Sep 2021 00:17:05 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Sep 2021 00:17:06 -0000 https://gcc.gnu.org/g:9f7c2bad52e51ec88a71c0d50826bfa2e6f44b15 commit r12-3322-g9f7c2bad52e51ec88a71c0d50826bfa2e6f44b15 Author: GCC Administrator Date: Fri Sep 3 00:16:33 2021 +0000 Daily bump. Diff: --- gcc/ChangeLog | 83 +++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/lto/ChangeLog | 5 ++ gcc/testsuite/ChangeLog | 231 ++++++++++++++++++++++++++++++++++++++++++++++++ libgcc/ChangeLog | 18 ++++ libgfortran/ChangeLog | 16 ++++ libstdc++-v3/ChangeLog | 35 ++++++++ 7 files changed, 389 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7f4787467b..81cbe64b5a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,86 @@ +2021-09-02 Martin Sebor + + PR tree-optimization/17506 + PR testsuite/37182 + * tree-ssa-uninit.c (warn_uninit): Remove conditional guarding note. + +2021-09-02 Richard Biener + + * tree-ssa-loop-im.c (fill_always_executed_in_1): Refine + fix for PR78185 and continue processing when leaving + finite inner loops. + +2021-09-02 Jakub Jelinek + + PR tree-optimization/99591 + * match.pd: Demote operands of IFN_{ADD,SUB,MUL}_OVERFLOW if they + were promoted. + +2021-09-02 Richard Biener + + Revert: + 2021-09-02 Richard Biener + + PR tree-optimization/102155 + * tree-ssa-loop-im.c (fill_always_executed_in_1): Iterate + over a part of the RPO array and do not recurse here. + Dump blocks marked as always executed. + (fill_always_executed_in): Walk over the RPO array and + process loops whose header we run into. + (loop_invariant_motion_in_fun): Compute the first RPO + using rev_post_order_and_mark_dfs_back_seme in iteration + order and pass that to fill_always_executed_in. + +2021-09-02 liuhongt + + * config/i386/i386-modes.def (FLOAT_MODE): Define ieee HFmode. + * config/i386/i386.c (enum x86_64_reg_class): Add + X86_64_SSEHF_CLASS. + (merge_classes): Handle X86_64_SSEHF_CLASS. + (examine_argument): Ditto. + (construct_container): Ditto. + (classify_argument): Ditto, and set HFmode/HCmode to + X86_64_SSEHF_CLASS. + (function_value_32): Return _FLoat16/Complex Float16 by + %xmm0. + (function_value_64): Return _Float16/Complex Float16 by SSE + register. + (ix86_print_operand): Handle CONST_DOUBLE HFmode. + (ix86_secondary_reload): Require gpr as intermediate register + to store _Float16 from sse register when sse4 is not + available. + (ix86_libgcc_floating_mode_supported_p): Enable _FLoat16 under + sse2. + (ix86_scalar_mode_supported_p): Ditto. + (TARGET_LIBGCC_FLOATING_MODE_SUPPORTED_P): Defined. + * config/i386/i386.h (VALID_SSE2_REG_MODE): Add HFmode. + (VALID_INT_MODE_P): Add HFmode and HCmode. + * config/i386/i386.md (*pushhf_rex64): New define_insn. + (*pushhf): Ditto. + (*movhf_internal): Ditto. + * doc/extend.texi (Half-Precision Floating Point): Documemt + _Float16 for x86. + +2021-09-02 Richard Biener + + PR tree-optimization/102155 + * tree-ssa-loop-im.c (fill_always_executed_in_1): Iterate + over a part of the RPO array and do not recurse here. + Dump blocks marked as always executed. + (fill_always_executed_in): Walk over the RPO array and + process loops whose header we run into. + (loop_invariant_motion_in_fun): Compute the first RPO + using rev_post_order_and_mark_dfs_back_seme in iteration + order and pass that to fill_always_executed_in. + +2021-09-02 YunQiang Su + + Revert: + 2021-08-31 YunQiang Su + + * config/mips/mips.c (mips_module_isa_name): New. + mips_file_start: add .module mipsREV to all asm output + 2021-09-01 Jeff Law PR tree-optimization/102152 diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index c1532a2693f..1591e4e43ac 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210902 +20210903 diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 301e5f42242..34fca8e6825 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,8 @@ +2021-09-02 liuhongt + + * lto-lang.c (lto_type_for_mode): Return float16_type_node + when mode == TYPE_MODE (float16_type_node). + 2021-05-31 Martin Liska * lto-common.c (compare_tree_sccs_1): Compare diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cef16da61a5..0d8eb186f47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,234 @@ +2021-09-02 Sandra Loosemore + José Rui Faustino de Sousa + + PR fortran/100911 + PR fortran/100915 + PR fortran/100916 + * gfortran.dg/PR100911.c: New file. + * gfortran.dg/PR100911.f90: New file. + * gfortran.dg/PR100914.c: New file. + * gfortran.dg/PR100914.f90: New file. + * gfortran.dg/PR100915.c: New file. + * gfortran.dg/PR100915.f90: New file. + +2021-09-02 Sandra Loosemore + + * gfortran.dg/c-interop/allocatable-dummy-c.c: New file. + * gfortran.dg/c-interop/allocatable-dummy.f90: New file. + * gfortran.dg/c-interop/allocatable-optional-pointer.f90: New file. + * gfortran.dg/c-interop/allocate-c.c: New file. + * gfortran.dg/c-interop/allocate-errors-c.c: New file. + * gfortran.dg/c-interop/allocate-errors.f90: New file. + * gfortran.dg/c-interop/allocate.f90: New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-1.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-2.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-3.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-4.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-5.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-6.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-7.f90: + New file. + * gfortran.dg/c-interop/argument-association-assumed-rank-8.f90: + New file. + * gfortran.dg/c-interop/assumed-type-dummy.f90: New file. + * gfortran.dg/c-interop/c-interop.exp: New file. + * gfortran.dg/c-interop/c1255-1.f90: New file. + * gfortran.dg/c-interop/c1255-2.f90: New file. + * gfortran.dg/c-interop/c1255a.f90: New file. + * gfortran.dg/c-interop/c407a-1.f90: New file. + * gfortran.dg/c-interop/c407a-2.f90: New file. + * gfortran.dg/c-interop/c407b-1.f90: New file. + * gfortran.dg/c-interop/c407b-2.f90: New file. + * gfortran.dg/c-interop/c407c-1.f90: New file. + * gfortran.dg/c-interop/c516.f90: New file. + * gfortran.dg/c-interop/c524a.f90: New file. + * gfortran.dg/c-interop/c535a-1.f90: New file. + * gfortran.dg/c-interop/c535a-2.f90: New file. + * gfortran.dg/c-interop/c535b-1.f90: New file. + * gfortran.dg/c-interop/c535b-2.f90: New file. + * gfortran.dg/c-interop/c535b-3.f90: New file. + * gfortran.dg/c-interop/c535c-1.f90: New file. + * gfortran.dg/c-interop/c535c-2.f90: New file. + * gfortran.dg/c-interop/c535c-3.f90: New file. + * gfortran.dg/c-interop/c535c-4.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-1-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-1.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-2-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-2.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-3-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-3.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-4-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-4.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-5-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-5.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-6-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-6.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-7-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-7.f90: New file. + * gfortran.dg/c-interop/cf-descriptor-8-c.c: New file. + * gfortran.dg/c-interop/cf-descriptor-8.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-1-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-1.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-2-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-2.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-3-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-3.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-4-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-4.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-5-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-5.f90: New file. + * gfortran.dg/c-interop/cf-out-descriptor-6-c.c: New file. + * gfortran.dg/c-interop/cf-out-descriptor-6.f90: New file. + * gfortran.dg/c-interop/contiguous-1-c.c: New file. + * gfortran.dg/c-interop/contiguous-1.f90: New file. + * gfortran.dg/c-interop/contiguous-2-c.c: New file. + * gfortran.dg/c-interop/contiguous-2.f90: New file. + * gfortran.dg/c-interop/contiguous-3-c.c: New file. + * gfortran.dg/c-interop/contiguous-3.f90: New file. + * gfortran.dg/c-interop/deferred-character-1.f90: New file. + * gfortran.dg/c-interop/deferred-character-2.f90: New file. + * gfortran.dg/c-interop/dump-descriptors.c: New file. + * gfortran.dg/c-interop/dump-descriptors.h: New file. + * gfortran.dg/c-interop/establish-c.c: New file. + * gfortran.dg/c-interop/establish-errors-c.c: New file. + * gfortran.dg/c-interop/establish-errors.f90: New file. + * gfortran.dg/c-interop/establish.f90: New file. + * gfortran.dg/c-interop/explicit-interface.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-1-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-1.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-2-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-2.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-3-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-3.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-4-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-4.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-5-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-5.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-6-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-6.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-7-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-7.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-8-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-8.f90: New file. + * gfortran.dg/c-interop/fc-descriptor-9-c.c: New file. + * gfortran.dg/c-interop/fc-descriptor-9.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-1-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-1.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-2-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-2.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-3-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-3.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-4-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-4.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-5-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-5.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-6-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-6.f90: New file. + * gfortran.dg/c-interop/fc-out-descriptor-7-c.c: New file. + * gfortran.dg/c-interop/fc-out-descriptor-7.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-1.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-2.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-3.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-4.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-5.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-6.f90: New file. + * gfortran.dg/c-interop/ff-descriptor-7.f90: New file. + * gfortran.dg/c-interop/note-5-3.f90: New file. + * gfortran.dg/c-interop/note-5-4-c.c: New file. + * gfortran.dg/c-interop/note-5-4.f90: New file. + * gfortran.dg/c-interop/optional-c.c: New file. + * gfortran.dg/c-interop/optional.f90: New file. + * gfortran.dg/c-interop/rank-class.f90: New file. + * gfortran.dg/c-interop/rank.f90: New file. + * gfortran.dg/c-interop/removed-restrictions-1.f90: New file. + * gfortran.dg/c-interop/removed-restrictions-2.f90: New file. + * gfortran.dg/c-interop/removed-restrictions-3.f90: New file. + * gfortran.dg/c-interop/removed-restrictions-4.f90: New file. + * gfortran.dg/c-interop/section-1-c.c: New file. + * gfortran.dg/c-interop/section-1.f90: New file. + * gfortran.dg/c-interop/section-1p.f90: New file. + * gfortran.dg/c-interop/section-2-c.c: New file. + * gfortran.dg/c-interop/section-2.f90: New file. + * gfortran.dg/c-interop/section-2p.f90: New file. + * gfortran.dg/c-interop/section-3-c.c: New file. + * gfortran.dg/c-interop/section-3.f90: New file. + * gfortran.dg/c-interop/section-3p.f90: New file. + * gfortran.dg/c-interop/section-4-c.c: New file. + * gfortran.dg/c-interop/section-4.f90: New file. + * gfortran.dg/c-interop/section-errors-c.c: New file. + * gfortran.dg/c-interop/section-errors.f90: New file. + * gfortran.dg/c-interop/select-c.c: New file. + * gfortran.dg/c-interop/select-errors-c.c: New file. + * gfortran.dg/c-interop/select-errors.f90: New file. + * gfortran.dg/c-interop/select.f90: New file. + * gfortran.dg/c-interop/setpointer-c.c: New file. + * gfortran.dg/c-interop/setpointer-errors-c.c: New file. + * gfortran.dg/c-interop/setpointer-errors.f90: New file. + * gfortran.dg/c-interop/setpointer.f90: New file. + * gfortran.dg/c-interop/shape.f90: New file. + * gfortran.dg/c-interop/size.f90: New file. + * gfortran.dg/c-interop/tkr.f90: New file. + * gfortran.dg/c-interop/typecodes-array-basic-c.c: New file. + * gfortran.dg/c-interop/typecodes-array-basic.f90: New file. + * gfortran.dg/c-interop/typecodes-array-char-c.c: New file. + * gfortran.dg/c-interop/typecodes-array-char.f90: New file. + * gfortran.dg/c-interop/typecodes-array-float128-c.c: New file. + * gfortran.dg/c-interop/typecodes-array-float128.f90: New file. + * gfortran.dg/c-interop/typecodes-array-int128-c.c: New file. + * gfortran.dg/c-interop/typecodes-array-int128.f90: New file. + * gfortran.dg/c-interop/typecodes-array-longdouble-c.c: New file. + * gfortran.dg/c-interop/typecodes-array-longdouble.f90: New file. + * gfortran.dg/c-interop/typecodes-sanity-c.c: New file. + * gfortran.dg/c-interop/typecodes-sanity.f90: New file. + * gfortran.dg/c-interop/typecodes-scalar-basic-c.c: New file. + * gfortran.dg/c-interop/typecodes-scalar-basic.f90: New file. + * gfortran.dg/c-interop/typecodes-scalar-float128-c.c: New file. + * gfortran.dg/c-interop/typecodes-scalar-float128.f90: New file. + * gfortran.dg/c-interop/typecodes-scalar-int128-c.c: New file. + * gfortran.dg/c-interop/typecodes-scalar-int128.f90: New file. + * gfortran.dg/c-interop/typecodes-scalar-longdouble-c.c: New file. + * gfortran.dg/c-interop/typecodes-scalar-longdouble.f90: New file. + * gfortran.dg/c-interop/ubound.f90: New file. + * lib/target-supports.exp + (check_effective_target_fortran_real_c_float128): New function. + +2021-09-02 Martin Sebor + + PR tree-optimization/17506 + PR testsuite/37182 + * gcc.dg/diagnostic-tree-expr-ranges-2.c: Add expected output. + * gcc.dg/uninit-15-O0.c: Remove xfail. + * gcc.dg/uninit-15.c: Same. + +2021-09-02 Marcel Vollweiler + + * gfortran.dg/gomp/target-device-ancestor-4.f90: Comment out dg-final to avoid + UNRESOLVED. + +2021-09-02 Richard Biener + + * gcc.dg/tree-ssa/ssa-lim-16.c: New testcase. + +2021-09-02 Jakub Jelinek + + PR tree-optimization/99591 + * gcc.target/i386/pr99591.c: New test. + * gcc.target/i386/pr97950.c: Match or reject setb or jn?b instructions + together with seta or jn?a. + +2021-09-02 liuhongt + + * gcc.target/i386/sse2-float16-1.c: New test. + * gcc.target/i386/sse2-float16-2.c: Ditto. + * gcc.target/i386/sse2-float16-3.c: Ditto. + * gcc.target/i386/float16-5.c: New test. + 2021-09-01 Jeff Law PR tree-optimization/102152 diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 593e642b56f..5fe8adec99b 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,21 @@ +2021-09-02 liuhongt + + * config/i386/32/sfp-machine.h (_FP_NANFRAC_H): New macro. + * config/i386/64/sfp-machine.h (_FP_NANFRAC_H): Ditto. + * config/i386/sfp-machine.h (_FP_NANSIGN_H): Ditto. + * config/i386/t-softfp: Add hf soft-fp. + * config.host: Add i386/64/t-softfp. + * config/i386/64/t-softfp: New file. + +2021-09-02 liuhongt + + * soft-fp/eqhf2.c: New file. + * soft-fp/extendhfdf2.c: New file. + * soft-fp/extendhfsf2.c: New file. + * soft-fp/half.h (FP_CMP_EQ_H): New marco. + * soft-fp/truncdfhf2.c: New file + * soft-fp/truncsfhf2.c: New file + 2021-09-01 Sebastian Huber * unwind-arm-common.inc (abort): Remove. diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 18a4186a04c..e27093dac97 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,19 @@ +2021-09-02 Sandra Loosemore + José Rui Faustino de Sousa + + PR fortran/100907 + PR fortran/100911 + PR fortran/100914 + PR fortran/100915 + PR fortran/100917 + * ISO_Fortran_binding-1-tmpl.h (CFI_type_cfunptr): Make equivalent + to CFI_type_cptr. + * runtime/ISO_Fortran_binding.c (cfi_desc_to_gfc_desc): Fix + handling of CFI_type_cptr and CFI_type_cfunptr. Additional error + checking and code cleanup. + (gfc_desc_to_cfi_desc): Likewise. Also correct kind mapping + for character, complex, and long double types. + 2021-08-27 Iain Sandoe * Makefile.am: Use configured libm availability. diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e77bac43390..47666416818 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,38 @@ +2021-09-02 Jonathan Wakely + + * include/bits/atomic_base.h (__atomic_base::compare_exchange_weak): + Add new functions. + * include/std/atomic (atomic::compare_exchange_weak): Use + it. + +2021-09-02 Jonathan Wakely + + * include/std/atomic: Tweak whitespace. + +2021-09-02 Jonathan Wakely + + PR c++/102177 + * include/bits/atomic_base.h (__is_valid_cmpexch_failure_order): + New function to check if a memory order is valid for the failure + case of compare exchange operations. + (__atomic_base::compare_exchange_weak): Simplify assertions + by using __is_valid_cmpexch_failure_order. + (__atomic_base::compare_exchange_strong): Likewise. + (__atomic_base::compare_exchange_weak): Likewise. + (__atomic_base::compare_exchange_strong): Likewise. + (__atomic_impl::compare_exchange_weak): Add assertion. + (__atomic_impl::compare_exchange_strong): Likewise. + * include/std/atomic (atomic::compare_exchange_weak): Likewise. + (atomic::compare_exchange_strong): Likewise. + +2021-09-02 Jonathan Wakely + + * include/std/functional (invoke_r): Define. + * include/std/version (__cpp_lib_invoke_r): Define. + * testsuite/20_util/function_objects/invoke/version.cc: Check + for __cpp_lib_invoke_r as well as __cpp_lib_invoke. + * testsuite/20_util/function_objects/invoke/4.cc: New test. + 2021-08-31 Jonathan Wakely PR libstdc++/98421