1. 20 Jan, 2020 15 commits
    • PR testsuite/92829 - several -Wstringop-overflow test case failures on powerpc64 · 414231ba
      	* g++.dg/warn/Wstringop-overflow-4.C: Adjust test to avoid failures
      	due to an aparrent VRP limtation.
      	* gcc.dg/Wstringop-overflow-25.c: Same.
      Martin Sebor committed
    • Align __patchable_function_entries to POINTER_SIZE [PR93194] · a5d8a406
      2020-01-20  Fangrui Song  <maskray@google.com>
      
      gcc/
      	PR middle-end/93194
      	* targhooks.c (default_print_patchable_function_entry): Align to
      	POINTER_SIZE.
      Fangrui Song committed
    • [PR 80005] Fix __has_include · ad1a3914
      __has_include is funky in that it is macro-like from the POV of #ifdef and
      friends, but lexes its parenthesize argument #include-like.  We were
      failing the second part of that, because we used a forwarding macro to an
      internal name, and hence always lexed the argument in macro-parameter
      context.  We componded that by not setting the right flag when lexing, so
      it didn't even know.  Mostly users got lucky.
      
      This reimplements the handline.
      1) Remove the forwarding, but declare object-like macros that
      expand to themselves.  This satisfies the #ifdef requirement
      
      2) Correctly set angled_brackets when lexing the parameter.  This tells
      the lexer (a) <...> is a header name and (b) "..." is too (not a string).
      
      3) Remove the in__has_include lexer state, just tell find_file that that's
      what's happenning, so it doesn't emit an error.
      
      We lose the (undocumented) ability to #undef __has_include.  That may well
      have been an accident of implementation.  There are no tests for it.
      
      We gain __has_include behaviour for all users of the preprocessors -- not
      just the C-family ones that defined a forwarding macro.
      
      	libcpp/
      	PR preprocessor/80005
      	* include/cpplib.h (BT_HAS_ATTRIBUTE): Fix comment.
      	* internal.h (struct lexer_state): Delete in__has_include field.
      	(struct spec_nodes): Rename n__has_include{,_next}__ fields.
      	(_cpp_defined_macro_p): New.
      	(_cpp_find_file): Add has_include parm.
      	* directives.c (lex_macro_node): Combine defined,
      	__has_inline{,_next} checking.
      	(do_ifdef, do_ifndef): Use _cpp_defined_macro_p.
      	(_cpp_init_directives): Refactor.
      	* expr.c (parse_defined): Use _cpp_defined_macro_p.
      	(eval_token): Adjust parse_has_include calls.
      	(parse_has_include): Add OP parameter.  Reimplement.
      	* files.c (_cpp_find_file): Add HAS_INCLUDE parm.  Use it to
      	inhibit error message.
      	(_cpp_stack_include): Adjust _cpp_find_file call.
      	(_cpp_fake_include, _cpp_compare_file_date): Likewise.
      	(open_file_failed): Remove in__has_include check.
      	(_cpp_has_header): Adjust _cpp_find_file call.
      	* identifiers.c (_cpp_init_hashtable): Don't init
      	__has_include{,_next} here ...
      	* init.c (cpp_init_builtins): ... init them here.  Define as
      	macros.
      	(cpp_read_main_file): Adjust _cpp_find_file call.
      	* pch.c (cpp_read_state): Adjust __has_include{,_next} access.
      	* traditional.c (_cpp_scan_out_locgical_line): Likewise.
      
      	gcc/c-family/
      	PR preprocessor/80005
      	* c-cppbuiltins.c (c_cpp_builtins): Don't define __has_include{,_next}.
      
      	gcc/testsuite/
      	PR preprocessor/80005
      	* g++.dg/cpp1y/feat-cxx14.C: Adjust.
      	* g++.dg/cpp1z/feat-cxx17.C: Adjust.
      	* g++.dg/cpp2a/feat-cxx2a.C: Adjust.
      	* g++.dg/cpp/pr80005.C: New.
      Nathan Sidwell committed
    • [PATCH] PR Fortran/93263 Correct test case · e82ba180
      Should've have checked for the existance of a non static integer
      using scan-tree-dump instead of scan-tree-dump-not. A cut and paste
      error.
      Mark Eggleston committed
    • x32: Add x32 support to -mtls-dialect=gnu2 · 1a2b60b5
      To add x32 support to -mtls-dialect=gnu2, we need to replace DI with
      P in GNU2 TLS patterns.  Since DEST set by tls_dynamic_gnu2_64 is in
      ptr_mode, PLUS in GNU2 TLS address computation must be done in ptr_mode
      to support -maddress-mode=long.  Also replace the "{q}" suffix on lea
      with "%z0" to support both 32-bit and 64-bit destination register.
      
      Tested on Linux/x86-64.
      
      gcc/
      
      	PR target/93319
      	* config/i386/i386.c (legitimize_tls_address): Pass Pmode to
      	gen_tls_dynamic_gnu2_64.  Compute GNU2 TLS address in ptr_mode.
      	* config/i386/i386.md (tls_dynamic_gnu2_64): Renamed to ...
      	(@tls_dynamic_gnu2_64_<mode>): This.  Replace DI with P.
      	(*tls_dynamic_gnu2_lea_64): Renamed to ...
      	(*tls_dynamic_gnu2_lea_64_<mode>): This.  Replace DI with P.
      	Remove the {q} suffix from lea.
      	(*tls_dynamic_gnu2_call_64): Renamed to ...
      	(*tls_dynamic_gnu2_call_64_<mode>): This.  Replace DI with P.
      	(*tls_dynamic_gnu2_combine_64): Renamed to ...
      	(*tls_dynamic_gnu2_combine_64_<mode>): This.  Replace DI with P.
      	Pass Pmode to gen_tls_dynamic_gnu2_64.
      
      gcc/testsuite/
      
      	PR target/93319
      	* gcc.target/i386/pr93319-1a.c: New test.
      	* gcc.target/i386/pr93319-1b.c: Likewise.
      	* gcc.target/i386/pr93319-1c.c: Likewise.
      	* gcc.target/i386/pr93319-1d.c: Likewise.
      H.J. Lu committed
    • [AArch64] Set SLOW_BYTE_ACCESS · 35e58efb
      Contrary to all documentation, SLOW_BYTE_ACCESS simply means accessing
      bitfields by their declared type, which results in better codegeneration.
      
      gcc/
      	* config/aarch64/aarch64.h (SLOW_BYTE_ACCESS): Set to 1.
      Wilco Dijkstra committed
    • aarch64: Remove parameter name and ATTRIBUTE_UNUSED · 7387153c
      2020-01-20  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-sve-builtins-base.cc
      	(svld1ro_impl::memory_vector_mode): Remove parameter name.
      Richard Sandiford committed
    • debug/92763 keep DIEs that might be used in DW_TAG_inlined_subroutine · 991b9149
      We were pruning type-local subroutine DIEs if their context is unused
      despite us later needing those DIEs as abstract origins for inlines.
      The patch makes code already present for -fvar-tracking-assignments
      unconditional.
      
      2020-01-20  Richard Biener  <rguenther@suse.de>
      
      	PR debug/92763
      	* dwarf2out.c (prune_unused_types): Unconditionally mark
      	called function DIEs.
      
      	* g++.dg/debug/pr92763.C: New testcase.
      Richard Biener committed
    • contrib: New remotes structure for vendor and personal refs · 24b17818
      The initial structure for vendor and personal branches makes use of
      the default remote (normally origin) for the upstream
      repository).  Unfortunately, this causes some confusion, especially for
      personal branches because a push will not push to the correct upstream
      location.  This can be 'fixed' by adding a push refspec for the remote,
      but that has the unfortunate consequence of breaking the push.default
      behaviour for git push, and it becomes too easy to accidentally commit
      something unintended to the main parts of the repository.
      
      To work around this, this patch changes the configuration to use
      separate 'remotes' for these additional refs, with one remote for the
      personal space and another remote for each vendor's space.  The
      personal space is called after the user's preferred branch-space
      prefix (default 'me'), the vendor spaces are called
      vendors/<vendor-name>.
      
      As far as possible, I've made the script automatically restructure any
      existing fetch or push lines that earlier versions of the scripts may
      have created - the gcc-git-customization.sh script will convert all
      vendor refs that it can find, so it is not necessary to re-add any
      vendors you've already added.
      
      You might, however, want to run
        git remote prune <origin>
      after running to clean up any stale upstream-refs that might still be
      in your local repo, and then
        git fetch vendors/<vendor>
      or
        git fetch <me>
      to re-populate the remotes/ structures.
      
      Also, for any branch you already have that tracks a personal or vendor
      branch upstream, you might need to run
        git config branch.<name>.remote <new-remote>
      
      so that merges and pushes go to the right place (I haven't attempted
      to automate this last part).
      
      For vendors, the new structure means that
      
        git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
      
      will correctly set up a remote tracking branch.
      
      Please be aware that if you have multiple personal branches set up, then
      
        git push <me>
      
      will still consider all of them for pushing.  If you only want to push
      one branch, then either write
        git push <me> HEAD
      or
        git push <me> <me>/branch
      as appropriate.
      
      And don't forget '-n' (--dry-run) to see what would be done if this
      were not a dry run.
      
      Finally, now that the vendors spaces are isolated from each other and
      from the other spaces, I've added an option "--enable-push" to
      git-fetch-vendor.sh.  If passed, then a "push" spec will be added for
      that vendor to enable pushing to the upstream.  If you re-run the
      script for the same vendor without the option, the push spec will be
      removed.
      
      	* gcc-git-customization.sh: Check that user-supplied remote
      	name exists before continuting.  Use a separate remotes for the
      	personal commit area.  Convert existing personal and vendor
      	fetch rules to new layout.
      	* git-fetch-vendor.sh: New vendor layout.  Add --enable-push
      	option.
      Richard Earnshaw committed
    • Add testcase of PR c++/92536, already fixed. · 0757f0bb
      	PR c++/92536
      	* g++.dg/cpp1z/pr92536.C: New.
      Paolo Carlini committed
    • Record outer non-cleanup region in TREE EH. · 92ce93c7
      	PR tree-optimization/93199
      	* tree-eh.c (struct leh_state): Add
      	new field outer_non_cleanup.
      	(cleanup_is_dead_in): Pass leh_state instead
      	of eh_region.  Add a checking that state->outer_non_cleanup
      	points to outer non-clean up region.
      	(lower_try_finally): Record outer_non_cleanup
      	for this_state.
      	(lower_catch): Likewise.
      	(lower_eh_filter): Likewise.
      	(lower_eh_must_not_throw): Likewise.
      	(lower_cleanup): Likewise.
      Martin Liska committed
    • tree-optimization/93094 pass down VECTORIZED_CALL to versioning · 9c4f0d31
      When versioning is run the IL is already mangled and finding
      a VECTORIZED_CALL IFN can fail.
      
      2020-01-20  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/93094
      	* tree-vectorizer.h (vect_loop_versioning): Adjust.
      	(vect_transform_loop): Likewise.
      	* tree-vectorizer.c (try_vectorize_loop_1): Pass down
      	loop_vectorized_call to vect_transform_loop.
      	* tree-vect-loop.c (vect_transform_loop): Pass down
      	loop_vectorized_call to vect_loop_versioning.
      	* tree-vect-loop-manip.c (vect_loop_versioning): Use
      	the earlier discovered loop_vectorized_call.
      
      	* gcc.dg/vect/pr93094.c: New testcase.
      Richard Biener committed
    • Clean up references to Subversion in documentation sources. · f4d83eba
      Clean up references to SVN in in the GCC docs, redirecting to Git
      documentation as appropriate.
      
      Where references to "the source code repository" rather than a
      specific VCS make sense, I have used them. You might, after
      all, change VCSes again someday.
      
      I have not modified either generated HTML files nor maintainer scripts.
      These changes should be complete with repect to the documentation tree.
      
      2020-01-19  Eric S. Raymond <esr@thyrsus.com>
      
      	gcc/
      	* doc/contribute.texi: Update for SVN -> Git transition.
      	* doc/install.texi: Likewise.
      
      	libstdc++-v3
      	* doc/xml/faq.xml: Update for SVN -> Git transition.
      	* doc/xml/manual/appendix_contributing.xml: Likewise.
      	* doc/xml/manual/status_cxx1998.xml: Likewise.
      	* doc/xml/manual/status_cxx2011.xml: Likewise.
      	* doc/xml/manual/status_cxx2014.xml: Likewise.
      	* doc/xml/manual/status_cxx2017.xml: Likewise.
      	* doc/xml/manual/status_cxx2020.xml: Likewise.
      	* doc/xml/manual/status_cxxtr1.xml: Likewise.
      	* doc/xml/manual/status_cxxtr24733.xml: Likewise.
      Eric S. Raymond committed
    • analyzer: ensure that all DejaGnu tests have unique names · 8863f61c
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/CVE-2005-1689-dedupe-issue.c: Ensure that all
      	test names are unique.
      	* gcc.dg/analyzer/attribute-nonnull.c: Likewise.
      	* gcc.dg/analyzer/conditionals-notrans.c: Likewise.
      	* gcc.dg/analyzer/data-model-1.c: Likewise.
      	* gcc.dg/analyzer/data-model-18.c: Likewise.
      	* gcc.dg/analyzer/data-model-8.c: Likewise.
      	* gcc.dg/analyzer/data-model-9.c: Likewise.
      	* gcc.dg/analyzer/file-1.c: Likewise.
      	* gcc.dg/analyzer/file-paths-1.c: Likewise.
      	* gcc.dg/analyzer/loop-2.c: Likewise.
      	* gcc.dg/analyzer/loop-2a.c: Likewise.
      	* gcc.dg/analyzer/loop-4.c: Likewise.
      	* gcc.dg/analyzer/loop.c: Likewise.
      	* gcc.dg/analyzer/malloc-1.c: Likewise.
      	* gcc.dg/analyzer/malloc-2.c: Likewise.
      	* gcc.dg/analyzer/malloc-ipa-10.c: Likewise.
      	* gcc.dg/analyzer/malloc-ipa-2.c: Likewise.
      	* gcc.dg/analyzer/malloc-macro-separate-events.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-1.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-2.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-3.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-4.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-5.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-7.c: Likewise.
      	* gcc.dg/analyzer/malloc-paths-9.c: Likewise.
      	* gcc.dg/analyzer/operations.c: Likewise.
      	* gcc.dg/analyzer/params.c: Likewise.
      	* gcc.dg/analyzer/pattern-test-1.c: Likewise.
      	* gcc.dg/analyzer/pattern-test-2.c: Likewise.
      	* gcc.dg/analyzer/sensitive-1.c: Likewise.
      	* gcc.dg/analyzer/switch.c: Likewise.
      	* gcc.dg/analyzer/taint-1.c: Likewise.
      	* gcc.dg/analyzer/unknown-fns.c: Likewise.
      David Malcolm committed
    • Daily bump. · bec23876
      GCC Administrator committed
  2. 19 Jan, 2020 8 commits
    • testsuite: effective_target_march_option: support checking for -march=* · 3684bbb0
      	* lib/target-supports.exp (effective_target_march_option): New.
      
      I see no (other) way to, depending on the absence of an option,
      add an option for a specific target.
      
      For gcc.dg/torture/pr26515.c and cris-elf, you get an error for
      supplying multiple (different) -march=... options (where that
      error is desirable), like testing cris-elf with
      RUNTESTFLAGS=--target_board=cris-sim/arch=v8, where otherwise
      -march=v10 and -march=v8 will both be given, and the test would
      fail.
      
      For historians, this was accidentally misordered and committed after
      the (first) patch using march_option.  Oops.
      Hans-Peter Nilsson committed
    • testsuite: Make use of effective-target march_option for cris · 0042bafd
      	* gcc.dg/torture/pr26515.c (cris*-*-*): Conditionalize
      	-march=v10 option on target ! march_option.
      	* gcc.target/cris/asm-v10.S, gcc.target/cris/inasm-v10.c,
      	gcc.target/cris/sync-1-v10.c: Similar.
      Hans-Peter Nilsson committed
    • PR c++/33799 - destroy return value, take 2. · bcfc2227
      This patch differs from the reverted patch for 33799 in that it adds the
      CLEANUP_STMT for the return value at the end of the function, and only if
      we've seen a cleanup that might throw, so it should not affect most C++11
      code.
      
      	* cp-tree.h (current_retval_sentinel): New macro.
      	(struct language_function): Add throwing_cleanup bitfield.
      	* decl.c (cxx_maybe_build_cleanup): Set it.
      	* except.c (maybe_set_retval_sentinel)
      	(maybe_splice_retval_cleanup): New functions.
      	* parser.c (cp_parser_compound_statement): Call
      	maybe_splice_retval_cleanup.
      	* typeck.c (check_return_expr): Call maybe_set_retval_sentinel.
      Jason Merrill committed
    • Simplify lambda parsing. · 303484a7
      Since we removed the special parsing for C++11 lambdas, it's just been an
      open-coded copy of cp_parser_function_body.  So let's call it instead.  This
      avoids the need to change this code in my revised 33799 patch.
      
      	* parser.c (cp_parser_lambda_body): Use cp_parser_function_body.
      Jason Merrill committed
    • Implement speculative call verifier · bf6fc129
      this patch implements verifier and fixes one bug where speculative calls
      produced by ipa-devirt ended up having num_speculative_call_targets = 0
      instead of 1.
      
      	* cgraph.c (cgraph_edge::make_speculative): Increase number of
      	speculative targets.
      	(verify_speculative_call): New function
      	(cgraph_node::verify_node): Use it.
      	* ipa-profile.c (ipa_profile): Fix formating; do not set number of
      	speculations.
      Jan Hubicka committed
    • Fix ICE in speculative_call_info · 118aa5e3
      this fixes two issues with the new multi-target speculation code which reproduce
      on Firefox.  I can now build firefox with FDO locally but on Mozilla build bots
      it still fails with ICE in speculative_call_info.
      
      One problem is that speuclative code compares call_stmt and lto_stmt_uid in
      a way that may get unwanted effect when these gets out of sync.  It does not
      make sense to have both non-zero so I added code clearing it and sanity check
      that it is kept this way.
      
      Other problem is cgraph_edge::make_direct not working well with multiple
      targets.  In this case it removed one speuclative target and the indirect call
      leaving other targets in the tree.
      
      This is fixed by iterating across all targets and removing all except the good
      one (if it exists).
      
      	PR lto/93318
      	* cgraph.c (cgraph_edge::resolve_speculation): Fix foramting.
      	(cgraph_edge::make_direct): Remove all indirect targets.
      	(cgraph_edge::redirect_call_stmt_to_callee): Use make_direct..
      	(cgraph_node::verify_node): Verify that only one call_stmt or
      	lto_stmt_uid is set.
      	* cgraphclones.c (cgraph_edge::clone): Set only one call_stmt or
      	lto_stmt_uid.
      	* lto-cgraph.c (lto_output_edge): Simplify streaming of stmt.
      	(lto_output_ref): Simplify streaming of stmt.
      	* lto-streamer-in.c (fixup_call_stmt_edges_1): Clear lto_stmt_uid.
      Jan Hubicka committed
    • Daily bump. · 2589beb1
      GCC Administrator committed
  3. 18 Jan, 2020 13 commits
    • c++: Fix coroutines.cc build for nvptx-none target · dba33cb7
      When building offloading cross-compiler from x86_64-linux to nvptx-none, the
      build fails with:
      ../../gcc/cp/coroutines.cc: In function 'tree_node* get_fn_local_identifier(tree, const char*)':
      ../../gcc/cp/coroutines.cc:2255:12: error: expected ';' before 'char'
       2255 |   sep = "$"
            |            ^
            |            ;
      ......
       2262 |   char *an;
            |   ~~~~
      
      2020-01-18  Jakub Jelinek  <jakub@redhat.com>
      
      	* coroutines.cc (get_fn_local_identifier): Fix NO_DOT_IN_LABEL
      	but non-NO_DOLLAR_IN_LABEL case build.
      Jakub Jelinek committed
    • libgcc: cris: config/cris/arit.c (DS): Apply attribute __fallthrough__. · 463f6499
      	* config/cris/arit.c (DS): Apply attribute fallthrough.
      
      Without this, there are, for each compilation of arit.c, 30ish
      occurrences of "this statement may fall through
      [-Wimplicit-fallthrough=]", for lines that look like
          case 32: DS; case 31: DS; case 30: DS; case 29: DS;
      Hans-Peter Nilsson committed
    • Fix compilation of crtstuff.c when DEFAULT_USE_CXA_ATEXIT is false · 84479e3a
      	PR libgcc/92988
      	* crtstuff.c (__do_global_dtors_aux): Only call __cxa_finalize if
      	DEFAULT_USE_CXA_ATEXIT is true.
      John David Anglin committed
    • AArch64: Fix unused variable warning breaking bootstrap. · 93bb79ab
      This marks the parameter &fi as unused so it doesn't
      cause a boostrap failure.
      
      committed under the obvious rule.
      
      gcc/ChangeLog:
      
      	* config/aarch64/aarch64-sve-builtins-base.cc (memory_vector_mode):
      	Mark parameter unused.
      Tamar Christina committed
    • testsuite: Fix dg-message syntax. · 955e4e3b
      2020-01-18  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c/92833
      	* c-c++-common/pr92833-4.c: Fix dg-message syntax.
      Jakub Jelinek committed
    • config.gcc <obsolete targets>: Add crisv32-*-* and cris-*-linux* · 8118184c
      I'm sorry to say that there's no incentive to maintain
      crisv32-*-* and cris-*-linux* configurations beyond nostalgia,
      (and I'm out of that for the moment).  Support in the Linux
      kernel for either applicable CRIS variant (CRIS v10 and CRIS
      v32) is gone since 2018.  Their related part of the cc0
      transition workload would be noticable.  Note that cris-elf
      remains, but crisv32-elf and the CRIS v32 multilib will be
      removed, at least for now.
      
      I'm not completely happy about the message (the next-next line
      after the context) "*** unless a maintainer comes forward"
      because it'd have to be at an infinitesimal maintenance cost to
      the cris-elf support.  Still, I'm not bothered enough to add
      another case construct or means for "planned obsolescence".
      Hans-Peter Nilsson committed
    • Reword a comment in varpool_node::ctor_useable_for_folding_p. · 5a715667
      	* varpool.c (ctor_useable_for_folding_p): Fix grammar.
      Gerald Pfeifer committed
    • [libiberty] Update demangler to handle co_await operator. · 7ebbff3a
      C++20 coroutines introduces a new operator with a mangling of 'aw'.
      This patch adds that to libiberty's demangler.
      
      libiberty/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* cp-demangle.c (cplus_demangle_operators): Add the co_await
      	operator.
      	* testsuite/demangle-expected: Test co_await operator mangling.
      Iain Sandoe committed
    • [C++ coroutines] Initial implementation. · 49789fd0
      This is the squashed version of the first 6 patches that were split to
      facilitate review.
      
      The changes to libiberty (7th patch) to support demangling the co_await
      operator stand alone and are applied separately.
      
      The patch series is an initial implementation of a coroutine feature,
      expected to be standardised in C++20.
      
      Standardisation status (and potential impact on this implementation)
      --------------------------------------------------------------------
      
      The facility was accepted into the working draft for C++20 by WG21 in
      February 2019.  During following WG21 meetings, design and national body
      comments have been reviewed, with no significant change resulting.
      
      The current GCC implementation is against n4835 [1].
      
      At this stage, the remaining potential for change comes from:
      
      * Areas of national body comments that were not resolved in the version we
        have worked to:
        (a) handling of the situation where aligned allocation is available.
        (b) handling of the situation where a user wants coroutines, but does not
            want exceptions (e.g. a GPU).
      
      * Agreed changes that have not yet been worded in a draft standard that we
        have worked to.
      
      It is not expected that the resolution to these can produce any major
      change at this phase of the standardisation process.  Such changes should be
      limited to the coroutine-specific code.
      
      ABI
      ---
      
      The various compiler developers 'vendors' have discussed a minimal ABI to
      allow one implementation to call coroutines compiled by another.
      
      This amounts to:
      
      1. The layout of a public portion of the coroutine frame.
      
       Coroutines need to preserve state across suspension points, the storage for
       this is called a "coroutine frame".
      
       The ABI mandates that pointers into the coroutine frame point to an area
       begining with two function pointers (to the resume and destroy functions
       described below); these are immediately followed by the "promise object"
       described in the standard.
      
       This is sufficient that the builtins can take a coroutine frame pointer and
       determine the address of the promise (or call the resume/destroy functions).
      
      2. A number of compiler builtins that the standard library might use.
      
        These are implemented by this patch series.
      
      3. This introduces a new operator 'co_await' the mangling for which is also
      agreed between vendors (and has an issue filed for that against the upstream
      c++abi).  Demangling for this is added to libiberty in a separate patch.
      
      The ABI has currently no target-specific content (a given psABI might elect
      to mandate alignment, but the common ABI does not do this).
      
      Standard Library impact
      -----------------------
      
      The current implementations require addition of only a single header to
      the standard library (no change to the runtime).  This header is part of
      the patch.
      
      GCC Implementation outline
      --------------------------
      
      The standard's design for coroutines does not decorate the definition of
      a coroutine in any way, so that a function is only known to be a coroutine
      when one of the keywords (co_await, co_yield, co_return) is encountered.
      
      This means that we cannot special-case such functions from the outset, but
      must process them differently when they are finalised - which we do from
      "finish_function ()".
      
      At a high level, this design of coroutine produces four pieces from the
      original user's function:
      
        1. A coroutine state frame (taking the logical place of the activation
           record for a regular function).  One item stored in that state is the
           index of the current suspend point.
        2. A "ramp" function
           This is what the user calls to construct the coroutine frame and start
           the coroutine execution.  This will return some object representing the
           coroutine's eventual return value (or means to continue it when it it
           suspended).
        3. A "resume" function.
           This is what gets called when a the coroutine is resumed when suspended.
        4. A "destroy" function.
           This is what gets called when the coroutine state should be destroyed
           and its memory released.
      
      The standard's coroutines involve cooperation of the user's authored function
      with a provided "promise" class, which includes mandatory methods for
      handling the state transitions and providing output values.  Most realistic
      coroutines will also have one or more 'awaiter' classes that implement the
      user's actions for each suspend point.  As we parse (or during template
      expansion) the types of the promise and awaiter classes become known, and can
      then be verified against the signatures expected by the standard.
      
      Once the function is parsed (and templates expanded) we are able to make the
      transformation into the four pieces noted above.
      
      The implementation here takes the approach of a series of AST transforms.
      The state machine suspend points are encoded in three internal functions
      (one of which represents an exit from scope without cleanups).  These three
      IFNs are lowered early in the middle end, such that the majority of GCC's
      optimisers can be run on the resulting output.
      
      As a design choice, we have carried out the outlining of the user's function
      in the front end, and taken advantage of the existing middle end's abilities
      to inline and DCE where that is profitable.
      
      Since the state machine is actually common to both resumer and destroyer
      functions, we make only a single function "actor" that contains both the
      resume and destroy paths.  The destroy function is represented by a small
      stub that sets a value to signal the use of the destroy path and calls the
      actor.  The idea is that optimisation of the state machine need only be done
      once - and then the resume and destroy paths can be identified allowing the
      middle end's inline and DCE machinery to optimise as profitable as noted
      above.
      
      The middle end components for this implementation are:
      
      A pass that:
       1. Lowers the coroutine builtins that allow the standard library header to
          interact with the coroutine frame (these fairly simple logical or
          numerical substitution of values, given a coroutine frame pointer).
       2. Lowers the IFN that represents the exit from state without cleanup.
          Essentially, this becomes a gimple goto.
       3. Sets the final size of the coroutine frame at this stage.
      
      A second pass (that requires the revised CFG that results from the lowering
      of the scope exit IFNs in the first).
      
       1. Lower the IFNs that represent the state machine paths for the resume and
          destroy cases.
      
      Patches squashed into this commit:
      
      [C++ coroutines 1] Common code and base definitions.
      
      This part of the patch series provides the gating flag, the keywords,
      cpp defines etc.
      
      [C++ coroutines 2] Define builtins and internal functions.
      
      This part of the patch series provides the builtin functions
      used by the standard library code and the internal functions
      used to implement lowering of the coroutine state machine.
      
      [C++ coroutines 3] Front end parsing and transforms.
      
      There are two parts to this.
      
      1. Parsing, template instantiation and diagnostics for the standard-
         mandated class entries.
      
        The user authors a function that becomes a coroutine (lazily) by
        making use of any of the co_await, co_yield or co_return keywords.
      
        Unlike a regular function, where the activation record is placed on the
        stack, and is destroyed on function exit, a coroutine has some state that
        persists between calls - the 'coroutine frame' (thus analogous to a stack
        frame).
      
        We transform the user's function into three pieces:
        1. A so-called ramp function, that establishes the coroutine frame and
           begins execution of the coroutine.
        2. An actor function that contains the state machine corresponding to the
           user's suspend/resume structure.
        3. A stub function that calls the actor function in 'destroy' mode.
      
        The actor function is executed:
         * from "resume point 0" by the ramp.
         * from resume point N ( > 0 ) for handle.resume() calls.
         * from the destroy stub for destroy point N for handle.destroy() calls.
      
        The C++ coroutine design described in the standard makes use of some helper
        methods that are authored in a so-called "promise" class provided by the
        user.
      
        At parse time (or post substitution) the type of the coroutine promise
        will be determined.  At that point, we can look up the required promise
        class methods and issue diagnostics if they are missing or incorrect.  To
        avoid repeating these actions at code-gen time, we make use of temporary
        'proxy' variables for the coroutine handle and the promise - which will
        eventually be instantiated in the coroutine frame.
      
        Each of the keywords will expand to a code sequence (although co_yield is
        just syntactic sugar for a co_await).
      
        We defer the analysis and transformatin until template expansion is
        complete so that we have complete types at that time.
      
      2. AST analysis and transformation which performs the code-gen for the
         outlined state machine.
      
         The entry point here is morph_fn_to_coro () which is called from
         finish_function () when we have completed any template expansion.
      
         This is preceded by helper functions that implement the phases below.
      
         The process proceeds in four phases.
      
         A Initial framing.
           The user's function body is wrapped in the initial and final suspend
           points and we begin building the coroutine frame.
           We build empty decls for the actor and destroyer functions at this
           time too.
           When exceptions are enabled, the user's function body will also be
           wrapped in a try-catch block with the catch invoking the promise
           class 'unhandled_exception' method.
      
         B Analysis.
           The user's function body is analysed to determine the suspend points,
           if any, and to capture local variables that might persist across such
           suspensions.  In most cases, it is not necessary to capture compiler
           temporaries, since the tree-lowering nests the suspensions correctly.
           However, in the case of a captured reference, there is a lifetime
           extension to the end of the full expression - which can mean across a
           suspend point in which case it must be promoted to a frame variable.
      
           At the conclusion of analysis, we have a conservative frame layout and
           maps of the local variables to their frame entry points.
      
         C Build the ramp function.
           Carry out the allocation for the coroutine frame (NOTE; the actual size
           computation is deferred until late in the middle end to allow for future
           optimisations that will be allowed to elide unused frame entries).
           We build the return object.
      
         D Build and expand the actor and destroyer function bodies.
           The destroyer is a trivial shim that sets a bit to indicate that the
           destroy dispatcher should be used and then calls into the actor.
      
           The actor function is the implementation of the user's state machine.
           The current suspend point is noted in an index.
           Each suspend point is encoded as a pair of internal functions, one in
           the relevant dispatcher, and one representing the suspend point.
      
           During this process, the user's local variables and the proxies for the
           self-handle and the promise class instanceare re-written to their
           coroutine frame equivalents.
      
           The complete bodies for the ramp, actor and destroy function are passed
           back to finish_function for folding and gimplification.
      
      [C++ coroutines 4] Middle end expanders and transforms.
      
      The first part of this is a pass that provides:
       * expansion of the library support builtins, these are simple boolean
         or numerical substitutions.
      
       * The functionality of implementing an exit from scope without cleanup
         is performed here by lowering an IFN to a gimple goto.
      
      This pass has to run for non-coroutine functions, since functions calling
      the builtins are not necessarily coroutines (i.e. they are implementing the
      library interfaces which may be called from anywhere).
      
      The second part is the expansion of the coroutine IFNs that describe the
      state machine connections to the dispatchers.  This only has to be run
      for functions that are coroutine components.  The work done by this pass
      is:
      
         In the front end we construct a single actor function that contains
         the coroutine state machine.
      
         The actor function has three entry conditions:
          1. from the ramp, resume point 0 - to initial-suspend.
          2. when resume () is executed (resume point N).
          3. from the destroy () shim when that is executed.
      
         The actor function begins with two dispatchers; one for resume and
         one for destroy (where the initial entry from the ramp is a special-
         case of resume point 0).
      
         Each suspend point and each dispatch entry is marked with an IFN such
         that we can connect the relevant dispatchers to their target labels.
      
         So, if we have:
      
         CO_YIELD (NUM, FINAL, RES_LAB, DEST_LAB, FRAME_PTR)
      
         This is await point NUM, and is the final await if FINAL is non-zero.
         The resume point is RES_LAB, and the destroy point is DEST_LAB.
      
         We expect to find a CO_ACTOR (NUM) in the resume dispatcher and a
         CO_ACTOR (NUM+1) in the destroy dispatcher.
      
         Initially, the intent of keeping the resume and destroy paths together
         is that the conditionals controlling them are identical, and thus there
         would be duplication of any optimisation of those paths if the split
         were earlier.
      
         Subsequent inlining of the actor (and DCE) is then able to extract the
         resume and destroy paths as separate functions if that is found
         profitable by the optimisers.
      
         Once we have remade the connections to their correct postions, we elide
         the labels that the front end inserted.
      
      [C++ coroutines 5] Standard library header.
      
      This provides the interfaces mandated by the standard and implements
      the interaction with the coroutine frame by means of inline use of
      builtins expanded at compile-time.  There should be a 1:1 correspondence
      with the standard sections which are cross-referenced.
      
      There is no runtime content.
      
      At this stage, we have the content in an inline namespace "__n4835" for
      the CD we worked to.
      
      [C++ coroutines 6] Testsuite.
      
      There are two categories of test:
      
      1. Checks for correctly formed source code and the error reporting.
      2. Checks for transformation and code-gen.
      
      The second set are run as 'torture' tests for the standard options
      set, including LTO.  These are also intentionally run with no options
      provided (from the coroutines.exp script).
      
      gcc/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* Makefile.in: Add coroutine-passes.o.
      	* builtin-types.def (BT_CONST_SIZE): New.
      	(BT_FN_BOOL_PTR): New.
      	(BT_FN_PTR_PTR_CONST_SIZE_BOOL): New.
      	* builtins.def (DEF_COROUTINE_BUILTIN): New.
      	* coroutine-builtins.def: New file.
      	* coroutine-passes.cc: New file.
      	* function.h (struct GTY function): Add a bit to indicate that the
      	function is a coroutine component.
      	* internal-fn.c (expand_CO_FRAME): New.
      	(expand_CO_YIELD): New.
      	(expand_CO_SUSPN): New.
      	(expand_CO_ACTOR): New.
      	* internal-fn.def (CO_ACTOR): New.
      	(CO_YIELD): New.
      	(CO_SUSPN): New.
      	(CO_FRAME): New.
      	* passes.def: Add pass_coroutine_lower_builtins,
      	pass_coroutine_early_expand_ifns.
      	* tree-pass.h (make_pass_coroutine_lower_builtins): New.
      	(make_pass_coroutine_early_expand_ifns): New.
      	* doc/invoke.texi: Document the fcoroutines command line
      	switch.
      
      gcc/c-family/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* c-common.c (co_await, co_yield, co_return): New.
      	* c-common.h (RID_CO_AWAIT, RID_CO_YIELD,
      	RID_CO_RETURN): New enumeration values.
      	(D_CXX_COROUTINES): Bit to identify coroutines are active.
      	(D_CXX_COROUTINES_FLAGS): Guard for coroutine keywords.
      	* c-cppbuiltin.c (__cpp_coroutines): New cpp define.
      	* c.opt (fcoroutines): New command-line switch.
      
      gcc/cp/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* Make-lang.in: Add coroutines.o.
      	* cp-tree.h (lang_decl-fn): coroutine_p, new bit.
      	(DECL_COROUTINE_P): New.
      	* lex.c (init_reswords): Enable keywords when the coroutine flag
      	is set,
      	* operators.def (co_await): New operator.
      	* call.c (add_builtin_candidates): Handle CO_AWAIT_EXPR.
      	(op_error): Likewise.
      	(build_new_op_1): Likewise.
      	(build_new_function_call): Validate coroutine builtin arguments.
      	* constexpr.c (potential_constant_expression_1): Handle
      	CO_AWAIT_EXPR, CO_YIELD_EXPR, CO_RETURN_EXPR.
      	* coroutines.cc: New file.
      	* cp-objcp-common.c (cp_common_init_ts): Add CO_AWAIT_EXPR,
      	CO_YIELD_EXPR, CO_RETRN_EXPR as TS expressions.
      	* cp-tree.def (CO_AWAIT_EXPR, CO_YIELD_EXPR, (CO_RETURN_EXPR): New.
      	* cp-tree.h (coro_validate_builtin_call): New.
      	* decl.c (emit_coro_helper): New.
      	(finish_function): Handle the case when a function is found to
      	be a coroutine, perform the outlining and emit the outlined
      	functions. Set a bit to signal that this is a coroutine component.
      	* parser.c (enum required_token): New enumeration RT_CO_YIELD.
      	(cp_parser_unary_expression): Handle co_await.
      	(cp_parser_assignment_expression): Handle co_yield.
      	(cp_parser_statement): Handle RID_CO_RETURN.
      	(cp_parser_jump_statement): Handle co_return.
      	(cp_parser_operator): Handle co_await operator.
      	(cp_parser_yield_expression): New.
      	(cp_parser_required_error): Handle RT_CO_YIELD.
      	* pt.c (tsubst_copy): Handle CO_AWAIT_EXPR.
      	(tsubst_expr): Handle CO_AWAIT_EXPR, CO_YIELD_EXPR and
      	CO_RETURN_EXPRs.
      	* tree.c (cp_walk_subtrees): Likewise.
      
      libstdc++-v3/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* include/Makefile.am: Add coroutine to the std set.
      	* include/Makefile.in: Regenerated.
      	* include/std/coroutine: New file.
      
      gcc/testsuite/ChangeLog:
      
      2020-01-18  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* g++.dg/coroutines/co-await-syntax-00-needs-expr.C: New test.
      	* g++.dg/coroutines/co-await-syntax-01-outside-fn.C: New test.
      	* g++.dg/coroutines/co-await-syntax-02-outside-fn.C: New test.
      	* g++.dg/coroutines/co-await-syntax-03-auto.C: New test.
      	* g++.dg/coroutines/co-await-syntax-04-ctor-dtor.C: New test.
      	* g++.dg/coroutines/co-await-syntax-05-constexpr.C: New test.
      	* g++.dg/coroutines/co-await-syntax-06-main.C: New test.
      	* g++.dg/coroutines/co-await-syntax-07-varargs.C: New test.
      	* g++.dg/coroutines/co-await-syntax-08-lambda-auto.C: New test.
      	* g++.dg/coroutines/co-return-syntax-01-outside-fn.C: New test.
      	* g++.dg/coroutines/co-return-syntax-02-outside-fn.C: New test.
      	* g++.dg/coroutines/co-return-syntax-03-auto.C: New test.
      	* g++.dg/coroutines/co-return-syntax-04-ctor-dtor.C: New test.
      	* g++.dg/coroutines/co-return-syntax-05-constexpr-fn.C: New test.
      	* g++.dg/coroutines/co-return-syntax-06-main.C: New test.
      	* g++.dg/coroutines/co-return-syntax-07-vararg.C: New test.
      	* g++.dg/coroutines/co-return-syntax-08-bad-return.C: New test.
      	* g++.dg/coroutines/co-return-syntax-09-lambda-auto.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-00-needs-expr.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-01-outside-fn.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-02-outside-fn.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-03-auto.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-04-ctor-dtor.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-05-constexpr.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-06-main.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-07-varargs.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-08-needs-expr.C: New test.
      	* g++.dg/coroutines/co-yield-syntax-09-lambda-auto.C: New test.
      	* g++.dg/coroutines/coro-builtins.C: New test.
      	* g++.dg/coroutines/coro-missing-gro.C: New test.
      	* g++.dg/coroutines/coro-missing-promise-yield.C: New test.
      	* g++.dg/coroutines/coro-missing-ret-value.C: New test.
      	* g++.dg/coroutines/coro-missing-ret-void.C: New test.
      	* g++.dg/coroutines/coro-missing-ueh-1.C: New test.
      	* g++.dg/coroutines/coro-missing-ueh-2.C: New test.
      	* g++.dg/coroutines/coro-missing-ueh-3.C: New test.
      	* g++.dg/coroutines/coro-missing-ueh.h: New test.
      	* g++.dg/coroutines/coro-pre-proc.C: New test.
      	* g++.dg/coroutines/coro.h: New file.
      	* g++.dg/coroutines/coro1-ret-int-yield-int.h: New file.
      	* g++.dg/coroutines/coroutines.exp: New file.
      	* g++.dg/coroutines/torture/alloc-00-gro-on-alloc-fail.C: New test.
      	* g++.dg/coroutines/torture/alloc-01-overload-newdel.C: New test.
      	* g++.dg/coroutines/torture/call-00-co-aw-arg.C: New test.
      	* g++.dg/coroutines/torture/call-01-multiple-co-aw.C: New test.
      	* g++.dg/coroutines/torture/call-02-temp-co-aw.C: New test.
      	* g++.dg/coroutines/torture/call-03-temp-ref-co-aw.C: New test.
      	* g++.dg/coroutines/torture/class-00-co-ret.C: New test.
      	* g++.dg/coroutines/torture/class-01-co-ret-parm.C: New test.
      	* g++.dg/coroutines/torture/class-02-templ-parm.C: New test.
      	* g++.dg/coroutines/torture/class-03-operator-templ-parm.C: New test.
      	* g++.dg/coroutines/torture/class-04-lambda-1.C: New test.
      	* g++.dg/coroutines/torture/class-05-lambda-capture-copy-local.C: New test.
      	* g++.dg/coroutines/torture/class-06-lambda-capture-ref.C: New test.
      	* g++.dg/coroutines/torture/co-await-00-trivial.C: New test.
      	* g++.dg/coroutines/torture/co-await-01-with-value.C: New test.
      	* g++.dg/coroutines/torture/co-await-02-xform.C: New test.
      	* g++.dg/coroutines/torture/co-await-03-rhs-op.C: New test.
      	* g++.dg/coroutines/torture/co-await-04-control-flow.C: New test.
      	* g++.dg/coroutines/torture/co-await-05-loop.C: New test.
      	* g++.dg/coroutines/torture/co-await-06-ovl.C: New test.
      	* g++.dg/coroutines/torture/co-await-07-tmpl.C: New test.
      	* g++.dg/coroutines/torture/co-await-08-cascade.C: New test.
      	* g++.dg/coroutines/torture/co-await-09-pair.C: New test.
      	* g++.dg/coroutines/torture/co-await-10-template-fn-arg.C: New test.
      	* g++.dg/coroutines/torture/co-await-11-forwarding.C: New test.
      	* g++.dg/coroutines/torture/co-await-12-operator-2.C: New test.
      	* g++.dg/coroutines/torture/co-await-13-return-ref.C: New test.
      	* g++.dg/coroutines/torture/co-ret-00-void-return-is-ready.C: New test.
      	* g++.dg/coroutines/torture/co-ret-01-void-return-is-suspend.C: New test.
      	* g++.dg/coroutines/torture/co-ret-03-different-GRO-type.C: New test.
      	* g++.dg/coroutines/torture/co-ret-04-GRO-nontriv.C: New test.
      	* g++.dg/coroutines/torture/co-ret-05-return-value.C: New test.
      	* g++.dg/coroutines/torture/co-ret-06-template-promise-val-1.C: New test.
      	* g++.dg/coroutines/torture/co-ret-07-void-cast-expr.C: New test.
      	* g++.dg/coroutines/torture/co-ret-08-template-cast-ret.C: New test.
      	* g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C: New test.
      	* g++.dg/coroutines/torture/co-ret-10-expression-evaluates-once.C: New test.
      	* g++.dg/coroutines/torture/co-ret-11-co-ret-co-await.C: New test.
      	* g++.dg/coroutines/torture/co-ret-12-co-ret-fun-co-await.C: New test.
      	* g++.dg/coroutines/torture/co-ret-13-template-2.C: New test.
      	* g++.dg/coroutines/torture/co-ret-14-template-3.C: New test.
      	* g++.dg/coroutines/torture/co-yield-00-triv.C: New test.
      	* g++.dg/coroutines/torture/co-yield-01-multi.C: New test.
      	* g++.dg/coroutines/torture/co-yield-02-loop.C: New test.
      	* g++.dg/coroutines/torture/co-yield-03-tmpl.C: New test.
      	* g++.dg/coroutines/torture/co-yield-04-complex-local-state.C: New test.
      	* g++.dg/coroutines/torture/co-yield-05-co-aw.C: New test.
      	* g++.dg/coroutines/torture/co-yield-06-fun-parm.C: New test.
      	* g++.dg/coroutines/torture/co-yield-07-template-fn-param.C: New test.
      	* g++.dg/coroutines/torture/co-yield-08-more-refs.C: New test.
      	* g++.dg/coroutines/torture/co-yield-09-more-templ-refs.C: New test.
      	* g++.dg/coroutines/torture/coro-torture.exp: New file.
      	* g++.dg/coroutines/torture/exceptions-test-0.C: New test.
      	* g++.dg/coroutines/torture/func-params-00.C: New test.
      	* g++.dg/coroutines/torture/func-params-01.C: New test.
      	* g++.dg/coroutines/torture/func-params-02.C: New test.
      	* g++.dg/coroutines/torture/func-params-03.C: New test.
      	* g++.dg/coroutines/torture/func-params-04.C: New test.
      	* g++.dg/coroutines/torture/func-params-05.C: New test.
      	* g++.dg/coroutines/torture/func-params-06.C: New test.
      	* g++.dg/coroutines/torture/lambda-00-co-ret.C: New test.
      	* g++.dg/coroutines/torture/lambda-01-co-ret-parm.C: New test.
      	* g++.dg/coroutines/torture/lambda-02-co-yield-values.C: New test.
      	* g++.dg/coroutines/torture/lambda-03-auto-parm-1.C: New test.
      	* g++.dg/coroutines/torture/lambda-04-templ-parm.C: New test.
      	* g++.dg/coroutines/torture/lambda-05-capture-copy-local.C: New test.
      	* g++.dg/coroutines/torture/lambda-06-multi-capture.C: New test.
      	* g++.dg/coroutines/torture/lambda-07-multi-yield.C: New test.
      	* g++.dg/coroutines/torture/lambda-08-co-ret-parm-ref.C: New test.
      	* g++.dg/coroutines/torture/local-var-0.C: New test.
      	* g++.dg/coroutines/torture/local-var-1.C: New test.
      	* g++.dg/coroutines/torture/local-var-2.C: New test.
      	* g++.dg/coroutines/torture/local-var-3.C: New test.
      	* g++.dg/coroutines/torture/local-var-4.C: New test.
      	* g++.dg/coroutines/torture/mid-suspend-destruction-0.C: New test.
      	* g++.dg/coroutines/torture/pr92933.C: New test.
      Iain Sandoe committed
    • arm: Remove yet another unused variable. · 472ef1d3
      Bootstrap found yet another unused variable:
      ../../gcc/config/arm/vfp.md:1651:17: warning: unused variable 'regname' [-Wunused-variable]
      
      2020-01-18  Jakub Jelinek  <jakub@redhat.com>
      
      	* config/arm/vfp.md (*clear_vfp_multiple): Remove unused variable.
      Jakub Jelinek committed
    • arm: fix rtl checking bootstrap (PR target/93312) · a22a86a1
      As reported in PR93312, the:
      > > > > > >         * config/arm/arm.c (clear_operation_p): New function.
      change broke RTL checking bootstrap.
      
      On the testcase from the PR (which is distilled from libgcc2.c, so I think
      we don't need to add it into testsuite) we ICE because SET_DEST (elt) is
      not a REG, but SUBREG.  The code uses REGNO on it, which is invalid, but
      only stores it into a variable, then performs REG_P (reg) check,
      determines it is not a REG and bails early.
      
      The following patch just moves the regno variable initialization after that
      check, it isn't used in between.  And, as a small optimization, because
      reg doesn't change, doesn't use REGNO (reg) a second time to set last_regno.
      
      2020-01-18  Jakub Jelinek  <jakub@redhat.com>
      
      	PR target/93312
      	* config/arm/arm.c (clear_operation_p): Don't use REGNO until
      	after checking the argument is a REG.  Don't use REGNO (reg)
      	again to set last_regno, reuse regno variable instead.
      Jakub Jelinek committed
    • PR93234 INQUIRE on pre-assigned files of ROUND and SIGN properties · e2947cfa
      	PR libfortran/93234
      	* io/unit.c (set_internal_unit): Set round and sign flags
      	correctly.
      
      	* gfortran.dg/inquire_pre.f90: New test.
      Jerry DeLisle committed
    • Daily bump. · 92030203
      GCC Administrator committed
  4. 17 Jan, 2020 4 commits
    • analyzer: prevent ICE on isnan (PR 93290) · 07c86323
      PR analyzer/93290 reports an ICE on calls to isnan().
      The root cause is that an UNORDERED_EXPR is passed
      to region_model::eval_condition_without_cm, and there's
      a stray gcc_unreachable () in the case where we're comparing
      an svalue against itself.
      
      I attempted a more involved patch that properly handled NaN in general
      but it seems I've baked the assumption of reflexivity too deeply into
      the constraint_manager code.
      
      For now, this patch avoids the ICE and documents the limitation.
      
      gcc/analyzer/ChangeLog:
      	PR analyzer/93290
      	* region-model.cc (region_model::eval_condition_without_cm): Avoid
      	gcc_unreachable for unexpected operations for the case where
      	we're comparing an svalue against itself.
      
      gcc/ChangeLog
      	* doc/analyzer.texi (Limitations): Add note about NaN.
      
      gcc/testsuite/ChangeLog:
      	PR analyzer/93290
      	* gcc.dg/analyzer/pr93290.c: New test.
      David Malcolm committed
    • PR90374 Zero width format specifiers. · 82033483
      	PR libfortran/90374
      	* io/format.c (parse_format_list): Zero width not allowed with
      	FMT_D.
      	* io/write_float.def (build_float_string): Include range of
      	higher exponent values that require wider width.
      Jerry DeLisle committed
    • Add testcase of PR c++/92542, already fixed. · 7e451387
      	PR c++/92542
      	* g++.dg/pr92542.C: New.
      Paolo Carlini committed
    • Add testcase of PR c++/92542, already fixed. · 4c9e5b02
      	PR c++/92542
      	* g++.dg/pr92542.C: New.
      Paolo Carlini committed