1. 07 Apr, 2020 14 commits
    • arm: MVE: Fix v[id]wdup's · 9ce780ef
      This patch fixes v[id]wdup intrinsics. They had two issues:
      1) the predicated versions did not link the incoming inactive vector parameter
      to the output
      2) The backend didn't enforce the wrap limit operand be in an odd register.
      
      1) was fixed like we did for all other predicated intrinsics
      2) requires a temporary hack where we pass the value in the top end of DImode
      operand. The proper fix would be to add a register CLASS but this interacted
      badly with other existing targets codegen.  We will look to fix this properly in GCC 11.
      
      gcc/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* config/arm/arm_mve.h: Fix v[id]wdup intrinsics.
      	* config/arm/mve/md: Fix v[id]wdup patterns.
      Andre Simoes Dias Vieira committed
    • arm: MVE: Fix constant load pattern · b094133c
      This patch fixes the constant load pattern for MVE, this was not accounting
      correctly for label + offset cases.
      
      Added test that ICE'd before and removed the scan assemblers for the mve_vector*
      tests as they were too fragile.
      
      gcc/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* config/arm/arm.c (output_move_neon): Deal with label + offset cases.
      	* config/arm/mve.md (*mve_mov<mode>): Handle const vectors.
      
      gcc/testsuite/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* gcc.target/arm/mve/intrinsics/mve_load_from_array.c: New test.
      	* gcc.target/arm/mve/intrinsics/mve_vector_float.c: Remove
      	scan-assembler.
      	* gcc.target/arm/mve/intrinsics/mve_vector_float1.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/mve_vector_int1.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/mve_vector_int2.c: Likewise.
      Andre Simoes Dias Vieira committed
    • arm: MVE: Do not use typeof for pointer parameters · 3ce755a8
      To make sure our inlining of _Generic doesn't go crazy we added an in between
      declaration of the parameters used for _Generic selection. However, this will
      not work if the parameter being passed in is an array.  Since none of our
      intrinsics return pointers we do not need to use typeof here as we will never be
      able to nest intrinsics through this parameter. I also removed the unnecessary
      const pointers in mve_typeid.
      
      gcc/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* config/arm/arm_mve.h: Remove use of typeof for addr pointer parameters
      	and remove const_ptr enums.
      Andre Simoes Dias Vieira committed
    • arm: MVE: Fix polymorphism for scalars and constants · 0f3cc1b3
      This patch merges some polymorphic functions that were uncorrectly separating
      scalar variants. It also simplifies the way we detect scalars and constants in
      mve_typeid.
      
      I also fixed some polymorphic intrinsics that were splitting of scalar cases.
      
      gcc/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* config/arm/arm_mve.h (vsubq_n): Merge with...
      	(vsubq): ... this.
      	(vmulq_n): Merge with...
      	(vmulq): ... this.
      	(__ARM_mve_typeid): Simplify scalar and constant detection.
      
      gcc/testsuite/ChangeLog:
      2020-04-07  Andre Vieira  <andre.simoesdiasvieira@arm.com>
      
      	* gcc.target/arm/mve/intrinsics/vmulq_n_f16.c: Fix test.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_f32.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_s16.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_s32.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_s8.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_u16.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_u32.c: Likewise.
      	* gcc.target/arm/mve/intrinsics/vmulq_n_u8.c: Likewise.
      Andre Simoes Dias Vieira committed
    • S/390: Fix layout of struct sigaction_t · 434fe1a4
      The ordering of some fields in  struct sigaction on s390x (64bit)
      differs compared to s390 and other architectures.
      This patch adjusts this order according to the definition of
      <glibc-src>/sysdeps/unix/sysv/linux/s390/bits/sigaction.h
      
      Without this fix e.g. the call
      sigaction( suspendSignalNumber, &sigusr1, null ) in thread.d
      leads to setting the sa_restorer field to 0xffffffffffffffff.
      In case a signal, the signal handler returns to this address
      and the process stops with a SIGILL.
      
      This was observable in several execution testcases on s390x:
      libphobos.druntime/core/thread.d
      libphobos.druntime_shared/core/thread.d
      libphobos.thread/tlsgc_sections.d
      libphobos.allocations/tls_gc_integration.d
      libphobos.phobos/std/parallelism.d
      libphobos.phobos_shared/std/parallelism.d
      libphobos.shared/host.c
      libphobos.shared/linkD.c
      libphobos.shared/linkDR.c
      libphobos.shared/link_linkdep.d
      libphobos.shared/load.d
      libphobos.shared/loadDR.c
      libphobos.shared/load_linkdep.d
      libphobos.shared/load_loaddep.d
      
      libphobos/ChangeLog:
      
      2020-04-07  Stefan Liebler  <stli@linux.ibm.com>
      
      	* libdruntime/core/sys/posix/signal.d:
      	Add struct sigaction_t for SystemZ.
      Stefan Liebler committed
    • c++: Fix usage of CONSTRUCTOR_PLACEHOLDER_BOUNDARY inside array initializers [PR90996] · 23f1f679
      This PR reports that ever since the introduction of the
      CONSTRUCTOR_PLACEHOLDER_BOUNDARY flag, we are sometimes failing to resolve
      PLACEHOLDER_EXPRs inside array initializers that refer to some inner
      constructor.  In the testcase in the PR, we have as the initializer for "S c[];"
      the following
      
        {{.a=(int &) &_ZGR1c_, .b={*(&<PLACEHOLDER_EXPR struct S>)->a}}}
      
      where CONSTRUCTOR_PLACEHOLDER_BOUNDARY is set on the middle constructor.  When
      calling replace_placeholders from store_init_value, we pass the entire
      initializer to it, and as a result we fail to resolve the PLACEHOLDER_EXPR
      within due to the CONSTRUCTOR_PLACEHOLDER_BOUNDARY flag on the middle
      constructor blocking replace_placeholders_r from reaching it.
      
      To fix this, we could perhaps either call replace_placeholders in more places,
      or we could change where we set CONSTRUCTOR_PLACEHOLDER_BOUNDARY.  This patch
      takes this latter approach -- when building up an array initializer, we now
      bubble any CONSTRUCTOR_PLACEHOLDER_BOUNDARY flag from the element initializers
      up to the array initializer so that the boundary doesn't later impede us when we
      call replace_placeholders from store_init_value.
      
      Besides fixing the kind of code like in the testcase, this shouldn't cause any
      other differences in PLACEHOLDER_EXPR resolution because we don't create or use
      PLACEHOLDER_EXPRs of array type in the frontend, as far as I can tell.
      
      gcc/cp/ChangeLog:
      
      	PR c++/90996
      	* tree.c (replace_placeholders): Look through all handled components,
      	not just COMPONENT_REFs.
      	* typeck2.c (process_init_constructor_array): Propagate
      	CONSTRUCTOR_PLACEHOLDER_BOUNDARY up from each element initializer to
      	the array initializer.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/90996
      	* g++.dg/cpp1y/pr90996.C: New test.
      Patrick Palka committed
    • i386: Fix V{64QI,32HI}mode constant permutations [PR94509] · d51af82b
      The following testcases are miscompiled, because expand_vec_perm_pshufb
      incorrectly thinks it can use vpshufb instruction for the permutations
      when it can't.
      The
                if (vmode == V32QImode)
                  {
                    /* vpshufb only works intra lanes, it is not
                       possible to shuffle bytes in between the lanes.  */
                    for (i = 0; i < nelt; ++i)
                      if ((d->perm[i] ^ i) & (nelt / 2))
                        return false;
                  }
      intra-lane check which is correct has been copied and adjusted for 64-byte
      modes into:
                if (vmode == V64QImode)
                  {
                    /* vpshufb only works intra lanes, it is not
                       possible to shuffle bytes in between the lanes.  */
                    for (i = 0; i < nelt; ++i)
                      if ((d->perm[i] ^ i) & (nelt / 4))
                        return false;
                  }
      which is not correct, because 64-byte modes have 4 lanes rather than just
      two and the above is only testing that the permutation grabs even lane elts
      from even lanes and odd lane elts from odd lanes, but not that they are
      from the same 256-bit half.
      
      The following patch fixes it by using 3 * nelt / 4 instead of nelt / 4,
      so we actually check the most significant 2 bits rather than just one.
      
      2020-04-07  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/94509
      	* config/i386/i386-expand.c (expand_vec_perm_pshufb): Fix the check
      	for inter-lane permutation for 64-byte modes.
      
      	* gcc.target/i386/avx512bw-pr94509-1.c: New test.
      	* gcc.target/i386/avx512bw-pr94509-2.c: New test.
      Jakub Jelinek committed
    • openmp: Fix parallel master error recovery [PR94512] · 4df50a05
      We need to set OMP_PARALLEL_COMBINED only if the parsing of omp_master
      succeeded, because otherwise there is no nested master construct in the
      parallel.
      
      2020-04-07  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/94512
      	* c-parser.c (c_parser_omp_parallel): Set OMP_PARALLEL_COMBINED
      	if c_parser_omp_master succeeded.
      
      	* parser.c (cp_parser_omp_parallel): Set OMP_PARALLEL_COMBINED
      	if cp_parser_omp_master succeeded.
      
      	* g++.dg/gomp/pr94512.C: New test.
      Jakub Jelinek committed
    • aarch64: Fix {ash[lr],lshr}<mode>3 expanders [PR94488] · 7a6588fe
      The following testcase ICEs on aarch64 apparently since the introduction of
      the aarch64 port.  The reason is that the {ashl,ashr,lshr}<mode>3 expanders
      completely unnecessarily FAIL; if operands[2] is something other than
      a CONST_INT or REG or MEM and the middle-end code can't cope with the
      pattern giving up in these cases.  All the expanders use general_operand
      predicate for the shift amount operand, but then have just a special case
      for CONST_INT (if in-bound, emit an immediate shift, otherwise force into
      REG), or MEM (force into REG), or REG (that is the case it handles).
      In the testcase, operands[2] is a lowpart SUBREG of a REG, which is valid
      general_operand.
      I don't see any reason what is magic about MEMs that it should be forced
      into REG and others like SUBREGs that it shouldn't, there isn't even a
      reason to check for !REG_P because force_reg will do nothing if the operand
      is already a REG, and otherwise can handle general_operand just fine.
      
      2020-04-07  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/94488
      	* config/aarch64/aarch64-simd.md (ashl<mode>3, lshr<mode>3,
      	ashr<mode>3): Force operands[2] into reg whenever it is not CONST_INT.
      	Assume it is a REG after that instead of testing it and doing FAIL
      	otherwise.  Formatting fix.
      
      	* gcc.c-torture/compile/pr94488.c: New test.
      Jakub Jelinek committed
    • d: Always set ASM_VOLATILE_P on asm statements (PR94425) · 30d26118
      gcc/d/ChangeLog:
      
      	PR d/94425
      	* toir.cc (IRVisitor::visit (GccAsmStatement *)): Set ASM_VOLATILE_P
      	on all asm statements.
      Iain Buclaw committed
    • RTEMS: Delete useless mcpu=8540 multilib · 42867b87
      The support for the 32-bit float GPRs was removed in GCC 8.
      
      gcc/
      
      	* config/rs6000/t-rtems: Delete mcpu=8540 multilib.
      Sebastian Huber committed
    • i386: Fix emit_reduc_half on V{64Q,32H}Imode [PR94500] · bee27152
      The following testcase is miscompiled in 8.x, because emit_reduc_half is
      prepared to handle for 512-bit modes only i equal to 512, 256, 128 and 64.
      V32HImode also needs i equal to 32 and V64QImode i equal to 32 and 16,
      but emit_reduc_half in that case performs a redundant permutation exactly
      like i == 32.  In 9+ the testcase works because Richard in r9-3393
      changed the reduc_* expanders so that they actually don't call
      ix86_expand_reduc on 512-bit modes, but only 128-bit ones.
      
      The patch fixes emit_reduc_half to handle also i of 32 and 16 similarly to
      how V32QImode/V16HImode are handled for AVX2.  I think it shouldn't hurt
      to fix the function even on the trunk and 9 branch even when nothing uses
      it ATM.
      
      2020-04-07  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/94500
      	* config/i386/i386-expand.c (emit_reduc_half): For V{64QI,32HI}mode
      	handle i < 64 using avx512bw_lshrv4ti3.  Formatting fixes.
      
      	* gcc.target/i386/avx512bw-pr94500.c: New test.
      Jakub Jelinek committed
    • c++: Fix ICE with implicit operator== [PR94462] · 467fc7c8
      duplicate_decls assumed that any TREE_ARTIFICIAL function at namespace scope
      was a built-in function, but now in C++20 it's possible to have an
      implicitly declared hidden friend operator==.  We just need to move the
      assert into the if condition.
      
      gcc/cp/ChangeLog
      2020-04-06  Jason Merrill  <jason@redhat.com>
      
      	PR c++/94462
      	* decl.c (duplicate_decls): Fix handling of DECL_HIDDEN_FRIEND_P.
      Jason Merrill committed
    • Daily bump. · 93a49d2d
      GCC Administrator committed
  2. 06 Apr, 2020 12 commits
    • libgo: update to almost the 1.14.2 release · 52fa80f8
      Update to edea4a79e8d7dea2456b688f492c8af33d381dc2 which is likely to
      be approximately the 1.14.2 release.
      
      Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/227377
      Ian Lance Taylor committed
    • libgomp/test: Remove a build sysroot fix regression · 749bd22d
      Fix a problem with commit c8e759b4 ("libgomp/test: Fix compilation
      for build sysroot") that caused a regression in some standalone test
      environments where testsuite/libgomp-test-support.exp is used, but the
      compiler is expected to be determined by `[find_gcc]', and set the
      GCC_UNDER_TEST TCL variable in testsuite/libgomp-site-extra.exp instead.
      
      	libgomp/
      	* configure.ac: Add testsuite/libgomp-site-extra.exp to output
      	files.
      	* configure: Regenerate.
      	* testsuite/libgomp-site-extra.exp.in: New file.
      	* testsuite/libgomp-test-support.exp.in (GCC_UNDER_TEST): Remove
      	variable.
      	* testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): New
      	variable.
      	* testsuite/Makefile.in: Regenerate.
      Maciej W. Rozycki committed
    • libatomic/test: Fix compilation for build sysroot · 5ff06d76
      Fix a problem with the libatomic testsuite using a method to determine
      the compiler to use resulting in the tool being different from one the
      library has been built with, and causing a catastrophic failure from the
      lack of a suitable `--sysroot=' option where the `--with-build-sysroot='
      configuration option has been used to build the compiler resulting in
      the inability to link executables.
      
      Address this problem by providing a DejaGNU configuration file defining
      the compiler to use, via the GCC_UNDER_TEST TCL variable, set from $CC
      by autoconf, which will have all the required options set for the target
      compiler to build executables in the environment configured, removing
      failures like:
      
      .../bin/riscv64-linux-gnu-ld: cannot find crt1.o: No such file or directory
      .../bin/riscv64-linux-gnu-ld: cannot find -lm
      collect2: error: ld returned 1 exit status
      compiler exited with status 1
      FAIL: libatomic.c/atomic-compare-exchange-1.c (test for excess errors)
      Excess errors:
      .../bin/riscv64-linux-gnu-ld: cannot find crt1.o: No such file or directory
      .../bin/riscv64-linux-gnu-ld: cannot find -lm
      
      UNRESOLVED: libatomic.c/atomic-compare-exchange-1.c compilation failed to produce executable
      
      and bringing overall test results for the `riscv64-linux-gnu' target
      (here with the `x86_64-linux-gnu' host and RISC-V QEMU in the Linux user
      emulation mode as the target board) from:
      
      		=== libatomic Summary ===
      
      # of unexpected failures	27
      # of unresolved testcases	27
      
      to:
      
      		=== libatomic Summary ===
      
      # of expected passes		54
      
      	libatomic/
      	* configure.ac: Add testsuite/libatomic-site-extra.exp to output
      	files.
      	* configure: Regenerate.
      	* libatomic/testsuite/libatomic-site-extra.exp.in: New file.
      	* testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): New
      	variable.
      	* testsuite/Makefile.in: Regenerate.
      Maciej W. Rozycki committed
    • cselib: Fix endless cselib loop on (plus:P (reg) (const_int 0)) · 8662d059
      getopt.c hangs the compiler on h8300-elf with -O2 -g, because the
      IL contains addition of constant 0, the first PLUS operand is determined
      to have the SP_DERIVED_VALUE_P and the new code in cselib recurses
      indefinitely on seeing SP_DERIVED_VALUE_P with locs of
      (plus:P SP_DERIVED_VALUE_P (const_int 0)).
      
      Fixed by making sure cselib_subst_to_values canonicalizes it, hashing
      already hashes it the same too.
      
      2020-04-06  Jakub Jelinek  <jakub@redhat.com>
      
      	* cselib.c (cselib_subst_to_values): For SP_DERIVED_VALUE_P
      	+ const0_rtx return the SP_DERIVED_VALUE_P.
      Jakub Jelinek committed
    • Update gcc sv.po. · e0fd9ce2
      	* sv.po: Update.
      Joseph Myers committed
    • Update cpplib eo.po. · 6a38c697
      	* eo.po: Update.
      Joseph Myers committed
    • Fix fortran/93686 -- ICE matching data statements with derived-type pointers. · d42a2e46
      gcc/fortran/ChangeLog:
      
      2020-04-06  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/93686
      	* decl.c (gfc_match_data): Handle data matching for derived type
      	pointers.
      
      gcc/testsuite/ChangeLog:
      
      2020-04-06  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	PR fortran/93686
      	* gfortran.dg/pr93686_1.f90: New test.
      	* gfortran.dg/pr93686_2.f90: Likewise.
      	* gfortran.dg/pr93686_3.f90: Likewise.
      	* gfortran.dg/pr93686_4.f90: Likewise.
      Fritz Reese committed
    • skip gcc.target/arm/div64-unwinding.c on vxworks_kernel targets · 130f703d
      This test verifies, by using a weak reference to _Unwind_RaiseException,
      that performing division by zero does not cause that symbol to get
      indirectly pulled into our closure.
      
      The testing methodology unfortunately does not work on VxWorks targets
      when building in kernel mode. This is inherent to how kernel mode
      on VxWorks works: The link is only partial and the remaining symbols
      which have not been resolved already get automatically resolved by
      the VxWorks loader at the moment the module is loaded onto the target,
      prior to execution. The resolution includes weak symbols too, which
      defeats the purpose of this test.
      
      gcc/testsuite/
      
              * gcc.target/arm/div64-unwinding.c: Skip on vxworks_kernel targets.
      Joel Brobecker committed
    • lra: Stop eh_return data regs being incorrectly marked live [PR92989] · e83714f6
      lra_assign has an assert to make sure that no pseudo is allocated
      to a conflicting hard register.  It used to be restricted to
      !flag_ipa_ra, but in g:a1e6ee38 I'd enabled it for
      flag_ipa_ra too.  It then tripped a few times while building
      libstdc++ for mips-mti-linux.
      
      Previous patches fixed one of the problems: registers clobbered
      by the taking of an exception were being treated as live at the
      beginning of the EH receiver, and this got propagated to predecessor
      blocks.  But it turns out that there was a second problem: eh_return
      data registers were also being marked live in the same way.
      
      These registers are defined by the unwinder and so in reality they
      are live on entry to the EH receiver.  But definitions can only happen
      in blocks, not on edges, so for liveness purposes we use artificial
      definitions at the start of the EH receiver.  process_bb_lives should
      therefore model the effect of a definition, not a plain use.
      
      2020-04-06  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR rtl-optimization/92989
      	* lra-lives.c (process_bb_lives): Do not treat eh_return data
      	registers as being live at the beginning of the EH receiver.
      Richard Sandiford committed
    • libstdc++: Make string_view::copy usable in constant expressions (PR 94498) · b6966987
      	PR libstdc++/94498
      	* include/bits/char_traits.h (__gnu_cxx::char_traits::move): Make it
      	usable in constant expressions for C++20.
      	(__gnu_cxx::char_traits::copy, __gnu_cxx::char_traits::assign): Add
      	_GLIBCXX20_CONSTEXPR.
      	(std::char_traits<char>, std::char_traits<wchar_t>)
      	(std::char_traits<char8_t>): Make move, copy and assign usable in
      	constant expressions for C++20.
      	(std::char_traits<char16_t>, std::char_traits<char32_t>): Make move
      	and copy usable in constant expressions for C++20.
      	* include/std/string_view (basic_string_view::copy): Add
      	_GLIBCXX20_CONSTEXPR.
      	* testsuite/21_strings/basic_string_view/operations/copy/char/
      	constexpr.cc: New test.
      	* testsuite/21_strings/basic_string_view/operations/copy/wchar_t/
      	constexpr.cc: New test.
      Jonathan Wakely committed
    • c++: Fix crash in gimplifier with paren init of aggregates [PR94155] · f84aded8
      Here we crash in the gimplifier because gimplify_init_ctor_eval doesn't
      expect null indexes for a constructor:
      
            /* ??? Here's to hoping the front end fills in all of the indices,
               so we don't have to figure out what's missing ourselves.  */
            gcc_assert (purpose);
      
      The indexes weren't filled because we never called reshape_init: for
      a constructor that represents parenthesized initialization of an
      aggregate we don't allow brace elision or designated initializers.
      
      	PR c++/94155 - crash in gimplifier with paren init of aggregates.
      	* init.c (build_vec_init): Fill in indexes.
      
      	* g++.dg/cpp2a/paren-init22.C: New test.
      Marek Polacek committed
    • Daily bump. · c72a1b6f
      GCC Administrator committed
  3. 05 Apr, 2020 6 commits
  4. 04 Apr, 2020 8 commits
    • debug: Improve debug info of c++14 deduced return type [PR94459] · 0be9efad
      On the following testcase, in gdb ptype S<long>::m1 prints long as return
      type, but all the other methods show void instead.
      PR53756 added code to add_type_attribute if the return type is
      auto/decltype(auto), but we actually should look through references,
      pointers and qualifiers.
      Haven't included there DW_TAG_atomic_type, because I think at least ATM
      one can't use that in C++.  Not sure about DW_TAG_array_type or what else
      could be deduced.
      
      > http://eel.is/c++draft/dcl.spec.auto#3 says it has to appear as a
      > decl-specifier.
      >
      > http://eel.is/c++draft/temp.deduct.type#8 lists the forms where a template
      > argument can be deduced.
      >
      > Looks like you are missing arrays, pointers to members, and function return
      > types.
      
      2020-04-04  Hannes Domani  <ssbssa@yahoo.de>
      	    Jakub Jelinek  <jakub@redhat.com>
      
      	PR debug/94459
      	* dwarf2out.c (gen_subprogram_die): Look through references, pointers,
      	arrays, pointer-to-members, function types and qualifiers when
      	checking if in-class DIE had an 'auto' or 'decltype(auto)' return type
      	to emit type again on definition.
      
      	* g++.dg/debug/pr94459.C: New test.
      
      Co-Authored-By: Hannes Domani <ssbssa@yahoo.de>
      Jakub Jelinek committed
    • libgcc: only use __mmap if glibc >- 2.26 · 458ca332
      	* generic-morestack.c: Only use __mmap on glibc >= 2.26.
      Ian Lance Taylor committed
    • c++: Mangling of dependent conversions [PR91377] · 75c8d6e5
      We skip over other conversion codes when mangling expressions, we should do
      the same with IMPLICIT_CONV_EXPR.
      
      gcc/cp/ChangeLog
      2020-04-04  Jason Merrill  <jason@redhat.com>
      
      	PR c++/91377
      	* mangle.c (write_expression): Skip IMPLICIT_CONV_EXPR.
      Jason Merrill committed
    • c++: Refrain from using replace_placeholders in constexpr evaluation [PR94205] · 49a86fce
      This removes the use of replace_placeholders in cxx_eval_constant_expression
      (which is causing the new test lambda-this6.C to ICE due to replace_placeholders
      mutating the shared TARGET_EXPR_INITIAL tree which then trips up the
      gimplifier).
      
      In its place, this patch adds a 'parent' field to constexpr_ctx which is used to
      store a pointer to an outer constexpr_ctx that refers to another object under
      construction.  With this new field, we can beef up lookup_placeholder to resolve
      PLACEHOLDER_EXPRs which refer to former objects under construction, which fixes
      PR94205 without needing to do replace_placeholders.  Also we can now respect the
      CONSTRUCTOR_PLACEHOLDER_BOUNDARY flag when resolving PLACEHOLDER_EXPRs, and
      doing so fixes the constexpr analogue of PR79937.
      
      gcc/cp/ChangeLog:
      
      	PR c++/94205
      	PR c++/79937
      	* constexpr.c (struct constexpr_ctx): New field 'parent'.
      	(cxx_eval_bare_aggregate): Propagate CONSTRUCTOR_PLACEHOLDER_BOUNDARY
      	flag from the original constructor to the reduced constructor.
      	(lookup_placeholder): Prefer to return the outermost matching object
      	by recursively calling lookup_placeholder on the 'parent' context,
      	but don't cross CONSTRUCTOR_PLACEHOLDER_BOUNDARY constructors.
      	(cxx_eval_constant_expression): Link the 'ctx' context to the 'new_ctx'
      	context via 'new_ctx.parent' when being expanded without an explicit
      	target.  Don't call replace_placeholders.
      	(cxx_eval_outermost_constant_expr): Initialize 'ctx.parent' to NULL.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94205
      	PR c++/79937
      	* g++.dg/cpp1y/pr79937-5.C: New test.
      	* g++.dg/cpp1z/lambda-this6.C: New test.
      Patrick Palka committed
    • c++: Fix constexpr evaluation of self-modifying CONSTRUCTORs [PR94219] · 37244b21
      This PR reveals that cxx_eval_bare_aggregate and cxx_eval_store_expression do
      not anticipate that a constructor element's initializer could mutate the
      underlying CONSTRUCTOR.  Evaluation of the initializer could add new elements to
      the underlying CONSTRUCTOR, thereby potentially invalidating any pointers to
      or assumptions about the CONSTRUCTOR's elements, and so these routines should be
      prepared for that.
      
      To fix this problem, this patch makes cxx_eval_bare_aggregate and
      cxx_eval_store_expression recompute the constructor_elt pointers through which
      we're assigning, after it evaluates the initializer.  Care is taken to to not
      slow down the common case where the initializer does not modify the underlying
      CONSTRUCTOR.
      
      gcc/cp/ChangeLog:
      
      	PR c++/94219
      	PR c++/94205
      	* constexpr.c (get_or_insert_ctor_field): Split out (while adding
      	support for VECTOR_TYPEs, and optimizations for the common case)
      	from ...
      	(cxx_eval_store_expression): ... here.  Rename local variable
      	'changed_active_union_member_p' to 'activated_union_member_p'.  Record
      	the sequence of indexes into 'indexes' that yields the subobject we're
      	assigning to.  Record the integer offsets of the constructor indexes
      	we're assigning through into 'index_pos_hints'.  After evaluating the
      	initializer of the store expression, recompute 'valp' using 'indexes'
      	and using 'index_pos_hints' as hints.
      	(cxx_eval_bare_aggregate): Tweak comments.  Use get_or_insert_ctor_field
      	to recompute the constructor_elt pointer we're assigning through after
      	evaluating each initializer.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94219
      	PR c++/94205
      	* g++.dg/cpp1y/constexpr-nsdmi3.C: New test.
      	* g++.dg/cpp1y/constexpr-nsdmi4.C: New test.
      	* g++.dg/cpp1y/constexpr-nsdmi5.C: New test.
      	* g++.dg/cpp1z/lambda-this5.C: New test.
      Patrick Palka committed
    • Fix previous commit. · 21e28527
      gcc/ChangeLog:
      
      2020-04-04  Jan Hubicka  <hubicka@ucw.cz>
      
      	PR ipa/93940
      	* ipa-fnsummary.c (vrp_will_run_p): New function.
      	(fre_will_run_p): New function.
      	(evaluate_properties_for_edge): Use it.
      	* ipa-inline.c (can_inline_edge_by_limits_p): Do not inline
      	!optimize_debug to optimize_debug.
      
      gcc/testsuite/ChangeLog:
      
      2020-04-04  Jan Hubicka  <hubicka@ucw.cz>
      
      	* g++.dg/tree-ssa/pr93940.C: New test.
      Jan Hubicka committed
    • c++: Fix invalid pointer-to-member in requires [PR67825] · f1ad7bac
      A recent change to cmcstl2 led to two tests failing due to this bug: our
      valid expression checking in the context of a requires-expression wasn't
      catching that an expression of member function type can only appear as the
      function operand of a call expression.  Fixed by using convert_to_void to do
      the same checking as a discarded-value expression.
      
      This patch also fixes 67825, which already had a testcase, but the testcase
      was testing for the wrong behavior.
      
      gcc/cp/ChangeLog
      2020-04-04  Jason Merrill  <jason@redhat.com>
      
      	PR c++/67825
      	* constraint.cc (tsubst_valid_expression_requirement): Call
      	convert_to_void.
      Jason Merrill committed
    • c++: Fix reuse of class constants [PR94453] · 9f143008
      The testcase hit an ICE trying to expand a TARGET_EXPR temporary cached from
      the other lambda-expression.  This patch fixes this in two ways:
      
      1) Avoid reusing a TARGET_EXPR from another function.
      2) Avoid ending up with a TARGET_EXPR at all; the use of 'p' had become
      <TARGET_EXPR<NON_LVALUE_EXPR<TARGET_EXPR ...>>>, which doesn't make any
      sense.
      
      gcc/cp/ChangeLog
      2020-04-04  Jason Merrill  <jason@redhat.com>
      
      	PR c++/94453
      	* constexpr.c (maybe_constant_value): Use break_out_target_exprs.
      	* expr.c (mark_use) [VIEW_CONVERT_EXPR]: Don't wrap a TARGET_EXPR in
      	NON_LVALUE_EXPR.
      Jason Merrill committed