1. 24 Feb, 2020 24 commits
    • analyzer: disable the "taint" checker by default · b3d788a2
      PR analyzer/93032 tracks a false negative where we fail to report
      FILE * leaks within zlib/contrib/minizip/mztools.c.
      
      The underlying issue is a combinatorial explosion of states within the
      exploded graph.  In particular, the state of the "taint" checker is
      exploding, leading to the analyzer bailing out.
      
      I have a patch kit under construction that fixes the state explosion
      issue enough for the "file" checker to report the leaks, but doing so
      requires disabling the "taint" checker.  Given that the latter is more
      of a proof-of-concept, this patch disables it by default, to stop it
      breaking the other checkers.
      
      gcc/analyzer/ChangeLog:
      	PR analyzer/93032
      	* sm.cc (make_checkers): Require the "taint" checker to be
      	explicitly enabled.
      
      gcc/ChangeLog:
      	PR analyzer/93032
      	* doc/invoke.texi (-Wnanalyzer-tainted-array-index): Note that
      	-fanalyzer-checker=taint is also required.
      	(-fanalyzer-checker=): Note that providing this option enables the
      	given checker, and doing so may be required for checkers that are
      	disabled by default.
      
      gcc/testsuite/ChangeLog:
      	PR analyzer/93032
      	* gcc.dg/analyzer/pr93382.c: Add "-fanalyzer-checker=taint".
      	* gcc.dg/analyzer/taint-1.c: Likewise.
      David Malcolm committed
    • analyzer: fix ICE with OFFSET_TYPE [PR 93899] · 3a25f345
      PR analyzer/93899 reports an ICE within make_region_for_type when
      handling a param of type OFFSET_TYPE within
      exploded_graph::add_function_entry.
      
      This patch fixes the ICE by further generalizing the "give up on this
      tree code" logic from
        r10-6667-gf76a88eb
           for PR analyzer/93388 and
        r10-6695-g2e623393
           for PR analyzer/93778
      by replacing the gcc_unreachable in make_region_for_type with a return
      of NULL, and handling this in add_region_for_type by notifying the ctxt.
      
      Doing so means that numerous places that create regions now need to have
      a context passed to them, so most of the patch is churn involved in
      passing a context around to where it's needed.
      
      gcc/analyzer/ChangeLog:
      	PR analyzer/93899
      	* engine.cc
      	(impl_region_model_context::impl_region_model_context): Add logger
      	param.
      	* engine.cc (exploded_graph::add_function_entry): Create an
      	impl_region_model_context and pass it to the push_frame call.
      	Bail if the resulting state is invalid.
      	(exploded_graph::build_initial_worklist): Likewise.
      	(exploded_graph::build_initial_worklist): Handle the case where
      	add_function_entry fails.
      	* exploded-graph.h
      	(impl_region_model_context::impl_region_model_context): Add logger
      	param.
      	* region-model.cc (map_region::get_or_create): Add ctxt param and
      	pass it to add_region_for_type.
      	(map_region::can_merge_p): Pass NULL as a ctxt to call to
      	get_or_create.
      	(array_region::get_element): Pass ctxt to call to get_or_create.
      	(array_region::get_or_create): Add ctxt param and pass it to
      	add_region_for_type.
      	(root_region::push_frame): Pass ctxt to get_or_create calls.
      	(region_model::get_lvalue_1): Likewise.
      	(region_model::make_region_for_unexpected_tree_code): Assert that
      	ctxt is non-NULL.
      	(region_model::get_rvalue_1): Pass ctxt to get_svalue_for_fndecl
      	and get_svalue_for_label calls.
      	(region_model::get_svalue_for_fndecl): Add ctxt param and pass it
      	to get_region_for_fndecl.
      	(region_model::get_region_for_fndecl): Add ctxt param and pass it
      	to get_or_create.
      	(region_model::get_svalue_for_label): Add ctxt param and pass it
      	to get_region_for_label.
      	(region_model::get_region_for_label): Add ctxt param and pass it
      	to get_region_for_fndecl and get_or_create.
      	(region_model::get_field_region): Add ctxt param and pass it to
      	get_or_create_view and get_or_create.
      	(make_region_for_type): Replace gcc_unreachable with return NULL.
      	(region_model::add_region_for_type): Add ctxt param.  Handle a
      	return of NULL from make_region_for_type by calling
      	make_region_for_unexpected_tree_code.
      	(region_model::get_or_create_mem_ref): Pass ctxt to calls to
      	get_or_create_view.
      	(region_model::get_or_create_view): Add ctxt param and pass it to
      	add_region_for_type.
      	(selftest::test_state_merging): Pass ctxt to get_or_create_view.
      	* region-model.h (region_model::get_or_create): Add ctxt param.
      	(region_model::add_region_for_type): Likewise.
      	(region_model::get_svalue_for_fndecl): Likewise.
      	(region_model::get_svalue_for_label): Likewise.
      	(region_model::get_region_for_fndecl): Likewise.
      	(region_model::get_region_for_label): Likewise.
      	(region_model::get_field_region): Likewise.
      	(region_model::get_or_create_view): Likewise.
      
      gcc/testsuite/ChangeLog:
      	PR analyzer/93899
      	* g++.dg/analyzer/pr93899.C: New test.
      David Malcolm committed
    • internal/poll: add hurd build tag · a4dbb9b2
      Patch from Svante Signell.
      
      Fixes GCC PR go/93900
      
      Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220592
      Ian Lance Taylor committed
    • Remove a hunk duplicated during a merge. · fb77bf1c
      gcc/cp/ChangeLog:
      	* parser.c (cp_parser_check_class_key): Remove a duplicate hunk
      	of code.
      Martin Sebor committed
    • PR c++/93804 - exempt extern C headers from -Wredundant-tags · b73547e4
      gcc/cp/ChangeLog:
      
      	PR c++/93804
      	* parser.c (cp_parser_check_class_key): Avoid issuing -Wredundant-tags
      	in shared C/C++ code in headers.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/93804
      	* g++.dg/warn/Wredundant-tags-4.C: New test.
      	* g++.dg/warn/Wredundant-tags-5.C: New test.
      	* g++.dg/warn/Wredundant-tags-5.h: New test.
      Martin Sebor committed
    • analyzer: eliminate irrelevant control-flow edges from paths · 004f2c07
      Paths emitted by the analyzer can be quite verbose at the default of
      -fanalyzer-verbosity=2.
      
      Consider the double-free in this example:
      
        #include <stdlib.h>
      
        int foo ();
        int bar ();
      
        void test (int a, int b, int c)
        {
          void *p = malloc (1024);
          while (a)
            foo ();
          if (b)
            foo ();
          else
            bar ();
          if (c)
            free (p);
          free (p);
        }
      
      Previously, the analyzer would emit a checker_path containing all
      control-flow information on the exploded_path leading to the
      double-free:
      
        test.c: In function 'test':
        test.c:17:3: warning: double-'free' of 'p' [CWE-415] [-Wanalyzer-double-free]
           17 |   free (p);
              |   ^~~~~~~~
          'test': events 1-9
            |
            |    8 |   void *p = malloc (1024);
            |      |             ^~~~~~~~~~~~~
            |      |             |
            |      |             (1) allocated here
            |    9 |   while (a)
            |      |         ~
            |      |         |
            |      |         (2) following 'false' branch (when 'a == 0')...
            |   10 |     foo ();
            |   11 |   if (b)
            |      |      ~
            |      |      |
            |      |      (3) ...to here
            |      |      (4) following 'false' branch (when 'b == 0')...
            |......
            |   14 |     bar ();
            |      |     ~~~~~~
            |      |     |
            |      |     (5) ...to here
            |   15 |   if (c)
            |      |      ~
            |      |      |
            |      |      (6) following 'true' branch (when 'c != 0')...
            |   16 |     free (p);
            |      |     ~~~~~~~~
            |      |     |
            |      |     (7) ...to here
            |      |     (8) first 'free' here
            |   17 |   free (p);
            |      |   ~~~~~~~~
            |      |   |
            |      |   (9) second 'free' here; first 'free' was at (8)
            |
      
      despite the fact that only the "if (c)" is relevant to triggering the
      double-free.
      
      This patch implements pruning of control flow events at
      -fanalyzer-verbosity=2, based on reachability information within the
      exploded_graph.
      The diagnostic_manager pre-computes reachability information about
      which exploded_nodes can reach the exploded_node of the diagnostic,
      and uses this to prune irrelvent control flow edges.
      
      The patch also adds a -fanalyzer-verbosity=3 to preserve these edges,
      so that the "show me everything" debugging level becomes
      -fanalyzer-verbosity=4.
      
      With these changes, the "while (a)" and "if (b)" edges are pruned from
      the above example, leading to:
      
        test.c: In function 'test':
        test.c:17:3: warning: double-'free' of 'p' [CWE-415] [-Wanalyzer-double-free]
           17 |   free (p);
              |   ^~~~~~~~
          'test': events 1-5
            |
            |    8 |   void *p = malloc (1024);
            |      |             ^~~~~~~~~~~~~
            |      |             |
            |      |             (1) allocated here
            |......
            |   15 |   if (c)
            |      |      ~
            |      |      |
            |      |      (2) following 'true' branch (when 'c != 0')...
            |   16 |     free (p);
            |      |     ~~~~~~~~
            |      |     |
            |      |     (3) ...to here
            |      |     (4) first 'free' here
            |   17 |   free (p);
            |      |   ~~~~~~~~
            |      |   |
            |      |   (5) second 'free' here; first 'free' was at (4)
            |
      
      The above example is gcc.dg/analyzer/edges-2.c.
      
      gcc/analyzer/ChangeLog:
      	* checker-path.cc (superedge_event::should_filter_p): Update
      	filter for empty descriptions to cover verbosity level 3 as well
      	as 2.
      	* diagnostic-manager.cc: Include "analyzer/reachability.h".
      	(class path_builder): New class.
      	(diagnostic_manager::emit_saved_diagnostic): Create a path_builder
      	and pass it to build_emission_path, rather passing eg; similarly
      	for add_events_for_eedge and ext_state.
      	(diagnostic_manager::build_emission_path): Replace "eg" param
      	with a path_builder, pass it to add_events_for_eedge.
      	(diagnostic_manager::add_events_for_eedge): Replace ext_state
      	param with path_builder; pass it to add_events_for_superedge.
      	(diagnostic_manager::significant_edge_p): New.
      	(diagnostic_manager::add_events_for_superedge): Add path_builder
      	param.  Reject insignificant edges at verbosity levels below 3.
      	(diagnostic_manager::prune_for_sm_diagnostic): Update highest
      	verbosity level to 4.
      	* diagnostic-manager.h (class path_builder): New forward decl.
      	(diagnostic_manager::build_emission_path): Replace "eg" param
      	with a path_builder.
      	(diagnostic_manager::add_events_for_eedge): Replace ext_state
      	param with path_builder.
      	(diagnostic_manager::significant_edge_p): New.
      	(diagnostic_manager::add_events_for_superedge): Add path_builder
      	param.
      	* reachability.h: New file.
      
      gcc/ChangeLog:
      	* doc/invoke.texi (-fanalyzer-verbosity=): "2" only shows
      	significant control flow events; add a "3" which shows all
      	control flow events; the old "3" becomes "4".
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/analyzer-verbosity-2a.c: New test.
      	* gcc.dg/analyzer/analyzer-verbosity-3.c: New test, based on
      	analyzer-verbosity-2.c
      	* gcc.dg/analyzer/analyzer-verbosity-3a.c: New test.
      	* gcc.dg/analyzer/edges-1.c: New test.
      	* gcc.dg/analyzer/edges-2.c: New test.
      	* gcc.dg/analyzer/file-paths-1.c: Add -fanalyzer-verbosity=3.
      David Malcolm committed
    • c++: Fix ICE with -Wmismatched-tags [PR93869] · cae5ff60
      This is a crash in cp_parser_check_class_key:
        tree type_decl = TYPE_MAIN_DECL (type);
        tree name = DECL_NAME (type_decl); // HERE
      because TYPE_MAIN_DECL of type was null as it's not a class type.
      Instead of checking CLASS_TYPE_P we should simply check class_key
      a bit earlier (in this case it was typename_type).
      
      2020-02-24  Marek Polacek  <polacek@redhat.com>
      
      	PR c++/93869 - ICE with -Wmismatched-tags.
      	* parser.c (cp_parser_check_class_key): Check class_key earlier.
      
      	* g++.dg/warn/Wmismatched-tags-2.C: New test.
      Marek Polacek committed
    • ortran: ICE using SHAPE with FINDLOC PR93835 · 27bf39a8
      The expression representing the array returned by SHAPE does not
      have its shape defined. An ICE occurs when FINDLOC attempts to
      use the shape of the array.  Add shape to expression before returning
      from SHAPE.
      
      Whitespace issues identified by Steven G. Kargl  <kargl@gcc.gnu.org>
      have also been fixed.
      
      gcc/fortran/ChangeLog
      
      	PR fortran/93835
      	* simplify.c (simplify_findloc_nodim) : Fix whitespace issues.
      	(gfc_simplify_shape) : Create and initialise one shape value
      	for the result expression. Set shape value with the rank of
      	the source array.
      
      gcc/testsuite/ChangeLog
      
      	PR fortran/93835
      	* gfortran.dg/pr77351.f90 : Check for one error instead of two.
      	* gfortran.dg/pr93835.f08 : New test.
      Mark Eggleston committed
    • c++: Fix ICE with ill-formed array list-initialization [PR93712] · b07c0855
      My P0388R4 patch changed build_array_conv to create an identity
      conversion at the start of the conversion chain and now we crash
      in convert_like_real:
      
       7457     case ck_identity:
       7458       if (BRACE_ENCLOSED_INITIALIZER_P (expr))
       7459         {
       7460           int nelts = CONSTRUCTOR_NELTS (expr);
       7461           if (nelts == 0)
       7462             expr = build_value_init (totype, complain);
       7463           else if (nelts == 1)
       7464             expr = CONSTRUCTOR_ELT (expr, 0)->value;
       7465           else
       7466             gcc_unreachable ();  // HERE
       7467         }
      
      in a test like this
      
        int f (int const (&)[2])
        { return f({1, "M"}); }
      
      Instead of creating a ck_identity at the start of the conversion chain,
      so that conv_get_original_expr can be used with a ck_aggr, let's set
      u.expr for a ck_aggr, and adjust next_conversion not to try to see
      what's next in the chain if it gets a ck_aggr.
      
      2020-02-24  Marek Polacek  <polacek@redhat.com>
      
      	PR c++/93712 - ICE with ill-formed array list-initialization.
      	* call.c (next_conversion): Return NULL for ck_aggr.
      	(build_aggr_conv): Set u.expr instead of u.next.
      	(build_array_conv): Likewise.
      	(build_complex_conv): Likewise.
      	(conv_get_original_expr): Handle ck_aggr.
      
      	* g++.dg/cpp0x/initlist-array11.C: New test.
      Marek Polacek committed
    • libstdc++: Add missing bits of P0896R4 pertaining to [back|front]_insert_iterator · 85c143d0
      This adds some missing pieces of the Ranges TS that make back_insert_iterator and
      front_insert_iterator conform to the new output_iterator requirements.
      
      It also fixes a bug in ranges::__copy_or_move and
      ranges::__copy_or_move_backward in which we were inspecting the iter_value_t of
      the output iterator, but output iterators such as back_insert_iterator and
      front_insert_iterator whose value_type = void do not have an iter_value_t
      according to [readable.traits] p4.  The entire __use_memmove condition should
      probably be rewritten, but the simplest fix for now is to inspect the
      iterator_traits of the output iterator instead.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/93884
      	* include/bits/ranges_algobase.h (__copy_or_move,
      	__copy_or_move_backward): Don't inspect the iter_value_t of the output
      	iterator, instead inspect its iterator_traits directly.
      	* include/bits/stl_iterator.h (back_insert_iterator::container):
      	Conditionally initialize.
      	(back_insert_iterator::difference_type): Conditionally define.
      	(back_insert_iterator::back_insert_iterator): Conditionally define this
      	default constructor.
      	(front_insert_iterator::container): Conditionally initialize.
      	(front_insert_iterator::difference_type): Conditionally define.
      	(front_insert_iterator::front_insert_iterator): Conditionally define
      	this default constructor.
      	* 24_iterators/back_insert_iterator/pr93884.cc: New test.
      	* 24_iterators/front_insert_iterator/pr93884.cc: New test.
      Patrick Palka committed
    • libstdc++: P0769R2 Add shift to <algorithm> · c5eab4ed
      This patch adds std::shift_left and std::shift_right as per P0769R2.  Alhough
      these are STL-style algos, this patch places them in <bits/ranges_algo.h>
      because they make use of some functions in the ranges namespace that are more
      easily reachable from <bits/ranges_algo.h> than from <bits/stl_algo.h>, namely
      ranges::next.  In order to place these algos in <bits/stl_algo.h>, we would need
      to include <bits/range_access.h> from <bits/stl_algo.h> which would undesirably
      increase the size of <bits/stl_algo.h>.
      
      libstdc++-v3/ChangeLog:
      
      	P0769R2 Add shift to <algorithm>
      	* include/bits/ranges_algo.h (shift_left, shift_right): New.
      	* testsuite/25_algorithms/shift_left/1.cc: New test.
      	* testsuite/25_algorithms/shift_right/1.cc: New test.
      Patrick Palka committed
    • internal/syscall/unix: add hurd build tag · 027a3f1c
      Patch from Svante Signell.
      
      Fixes GCC PR go/93900
      
      Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220589
      Ian Lance Taylor committed
    • fortran: ICE in gfc_conv_constant_to_tree PR93604 · c77b6f95
      Using a BOZ constant in a structure constructor in a data statement
      resulted in an ICE. Output a "BOZ literal constant cannot appear in
      a structure constructor" error message instead.
      
      Original patch provided by Steven G. Kargl  <kargl@gcc.gnu.org>.
      
      Test case added later.
      
      gcc/fortran/ChangeLog
      
      	PR fortran/93604
      	* decl.c (gfc_match_data) : Check whether the data expression
      	is a derived type and is a constructor. If a BOZ constant
      	is encountered in the constructor output an error and return
      	MATCH_ERROR.
      
      gcc/testsuite/ChangeLog
      
      	PR fortran/93604
      	* gfortran.dg/pr93604.f90 : New test.
      Mark Eggleston committed
    • c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions · fb6a8b23
      The following patch implements my understanding of P1937R2, though I wonder
      if https://eel.is/c++draft/expr.const#14.example-1 shouldn't have been
      also either removed or adjusted by the P1937R2 paper.
      
      2020-02-24  Jakub Jelinek  <jakub@redhat.com>
      
      	P1937R2 - Fixing inconsistencies between const{expr,eval} functions
      	* call.c (build_over_call): Don't evaluate immediate functions in
      	unevaluated operands.
      
      	* g++.dg/ext/consteval1.C: Change dg-{message,error} into dg-bogus.
      	* g++.dg/cpp2a/consteval6.C: Likewise.
      	* g++.dg/cpp2a/consteval3.C: Change dg-error for unevaluated operands
      	into dg-bogus.
      Jakub Jelinek committed
    • libstdc++: Fix noexcept-specifier for istream_iterator · 8566286e
      Somehow I missed that the _M_value member can throw on construction.
      
      	* include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)):
      	Make noexcept-specifier conditional.
      	* testsuite/24_iterators/istream_iterator/cons/sentinel.cc: Check
      	noexcept-specifier.
      Jonathan Wakely committed
    • c++: Fix C++20 variadic lambda init-capture grammar. · 32b8f5df
      The grammar for variadic init-capture was fixed at the Prague C++ meeting
      where we finalized C++20.
      
      gcc/cp/ChangeLog
      2020-02-24  Jason Merrill  <jason@redhat.com>
      
      	P0780R2: Resolve lambda init-capture pack grammar.
      	* parser.c (cp_parser_lambda_introducer): Expect &...x=y rather than
      	...&x=y.
      Jason Merrill committed
    • libstdc++: Add default_sentinel support to stream iterators · 120e8734
      Missing pieces of P0896R4 "The One Ranges Proposal" for C++20.
      
      	* include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)):
      	Add constructor.
      	(operator==(istream_iterator, default_sentinel_t)): Add operator.
      	(ostream_iterator::difference_type): Define to ptrdiff_t for C++20.
      	* include/bits/streambuf_iterator.h
      	(istreambuf_iterator(default_sentinel_t)): Add constructor.
      	(operator==(istreambuf_iterator, default_sentinel_t)): Add operator.
      	* testsuite/24_iterators/istream_iterator/cons/sentinel.cc:
      	New test.
      	* testsuite/24_iterators/istream_iterator/sentinel.cc: New test.
      	* testsuite/24_iterators/istreambuf_iterator/cons/sentinel.cc:
      	New test.
      	* testsuite/24_iterators/istreambuf_iterator/sentinel.cc: New test.
      Jonathan Wakely committed
    • PR78353: Fix testcases · e03069be
      Skip the test if arm7a is not supported at link time. This is the case
      if the toolchain targets an M-profile CPU by default and does not have
      A-profile multilib: the link step fails because it tries to mix
      M-profile startup files with A-profile testcase.
      
      2020-02-24  Christophe Lyon  <christophe.lyon@linaro.org>
      
      	PR lto/78353
      	* gcc.target/arm/pr78353-1.c: Add arm_arch_v7a_multilib effective
      	target.
      	* gcc.target/arm/pr78353-2.c: Likewise.
      Christophe Lyon committed
    • libstdc++: enable_view has false positives (LWG 3326) · 3841739c
      	* include/std/ranges (__deep_const_range, __enable_view_impl): Remove.
      	(ranges::enable_view): Simplify (LWG 3326).
      	* include/bits/range_access.h (ranges::enable_view): Declare.
      	* include/bits/regex.h (__enable_view_impl): Remove partial
      	specialization.
      	* include/bits/stl_multiset.h (__enable_view_impl): Likewise.
      	* include/bits/stl_set.h (__enable_view_impl): Likewise.
      	* include/bits/unordered_set.h (__enable_view_impl): Likewise.
      	* include/debug/multiset.h (__enable_view_impl): Likewise.
      	* include/debug/set.h (__enable_view_impl): Likewise.
      	* include/debug/unordered_set (__enable_view_impl): Likewise.
      	* include/experimental/string_view (ranges::enable_view): Define
      	partial specialization.
      	* include/std/span (ranges::enable_view): Likewise.
      	* include/std/string_view (ranges::enable_view): Likewise.
      	* testsuite/std/ranges/view.cc: Check satisfaction of updated concept.
      Jonathan Wakely committed
    • sccvn: Handle bitfields in push_partial_def [PR93582] · 7f5617b0
      The following patch adds support for bitfields to push_partial_def.
      Previously pd.offset and pd.size were counted in bytes and maxsizei
      in bits, now everything is counted in bits.
      
      Not really sure how much of the further code can be outlined and moved, e.g.
      the full def and partial def code doesn't have pretty much anything in
      common (the partial defs case basically have some load bit range and a set
      of store bit ranges that at least partially overlap and we need to handle
      all the different cases, like negative pd.offset or non-negative, little vs.
      bit endian, size so small that we need to preserve original bits on both
      sides of the byte, size that fits or is too large.
      Perhaps the storing of some value into a middle of existing buffer (i.e.
      what push_partial_def now does in the loop) could, but the candidate for
      sharing would be most likely store-merging rather than the other spots in
      sccvn, and I think it is better not to touch store-merging at this stage.
      
      Yes, I've thought about trying to do everything in place, but the code is
      quite hard to understand and get right already now and if we tried to do the
      optimize on the fly, it would need more special cases and would for gcov
      coverage need more testcases to cover it.  Most of the time the sizes will
      be small.  Furthermore, for bitfields native_encode_expr stores actually
      number of bytes in the mode and not say actual bitsize rounded up to bytes,
      so it wouldn't be just a matter of saving/restoring bytes at the start and
      end, but we might need even 7 further bytes e.g. for __int128 bitfields.
      Perhaps we could have just a fast path for the case where everything is byte
      aligned and (for integral types the mode bitsize is equal to the size too)?
      
      2020-02-24  Jakub Jelinek  <jakub@redhat.com>
      
      	PR tree-optimization/93582
      	* tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Consider
      	pd.offset and pd.size to be counted in bits rather than bytes, add
      	support for maxsizei that is not a multiple of BITS_PER_UNIT and
      	handle bitfield stores and loads.
      	(vn_reference_lookup_3): Don't call ranges_known_overlap_p with
      	uncomparable quantities - bytes vs. bits.  Allow push_partial_def
      	on offsets/sizes that aren't multiple of BITS_PER_UNIT and adjust
      	pd.offset/pd.size to be counted in bits rather than bytes.
      	Formatting fix.  Rename shadowed len variable to buflen.
      
      	* gcc.dg/tree-ssa/pr93582-4.c: New test.
      	* gcc.dg/tree-ssa/pr93582-5.c: New test.
      	* gcc.dg/tree-ssa/pr93582-6.c: New test.
      	* gcc.dg/tree-ssa/pr93582-7.c: New test.
      	* gcc.dg/tree-ssa/pr93582-8.c: New test.
      Jakub Jelinek committed
    • OpenACC tile clause – apply exit/cycle checks (PR 93552) · 2bd8c3ff
              PR fortran/93552
              * match.c (match_exit_cycle): With OpenACC, check the kernels loop
              directive and tile clause as well.
      
              PR fortran/93552
              * gfortran.dg/goacc/tile-4.f90: New.
      Tobias Burnus committed
    • PR47785: Add support for handling Xassembler/Wa options with LTO. · f1a681a1
      2020-02-24  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
      	    Kugan Vivekandarajah  <kugan.vivekanandarajah@linaro.org>
      
      	PR driver/47785
      	* gcc.c (putenv_COLLECT_AS_OPTIONS): New function.
      	(driver::main): Call putenv_COLLECT_AS_OPTIONS.
      	* opts-common.c (parse_options_from_collect_gcc_options): New function.
      	(prepend_xassembler_to_collect_as_options): Likewise.
      	* opts.h (parse_options_from_collect_gcc_options): Declare prototype.
      	(prepend_xassembler_to_collect_as_options): Likewise.
      	* lto-opts.c (lto_write_options): Stream assembler options
      	in COLLECT_AS_OPTIONS.
      	* lto-wrapper.c (xassembler_options_error): New static variable.
      	(get_options_from_collect_gcc_options): Move parsing options code to
      	parse_options_from_collect_gcc_options and call it.
      	(merge_and_complain): Validate -Xassembler options.
      	(append_compiler_options): Handle OPT_Xassembler.
      	(run_gcc): Append command line -Xassembler options to
      	collect_gcc_options.
      	* doc/invoke.texi: Add documentation about using Xassembler
      	options with LTO.
      
      testsuite/
      	* gcc.target/arm/pr78353-1.c: New test.
      	* gcc.target/arm/pr78353-2.c: Likewise.
      Prathamesh Kulkarni committed
    • RISC-V: Adjust floating point code gen for LTGT compare · 9069e948
       - Using gcc.dg/torture/pr91323.c as testcase, so no new testcase
         introduced.
      
       - We use 3 eq compare for LTGT compare before, in order to prevent exception
         flags setting when any input is NaN.
      
       - According latest GCC document LTGT and discussion on pr91323
         LTGT should signals on NaNs, like GE/GT/LE/LT.
      
       - So we expand (LTGT a b) to ((LT a b) | (GT a b)) for fit the document.
      
       - Tested rv64gc/rv32gc bare-metal/linux on qemu and
         rv64gc on HiFive unleashed board with linux.
      
      ChangeLog
      
      gcc/
      
      Kito Cheng  <kito.cheng@sifive.com>
      
      	* config/riscv/riscv.c (riscv_emit_float_compare): Change the code gen
      	for LTGT.
      	(riscv_rtx_costs): Update cost model for LTGT.
      Kito Cheng committed
    • Daily bump. · c7bfe1aa
      GCC Administrator committed
  2. 23 Feb, 2020 5 commits
  3. 22 Feb, 2020 4 commits
  4. 21 Feb, 2020 7 commits
    • Fix handling of floating-point homogeneous aggregates. · 01af7e0a
      	2020-02-21  John David Anglin  <danglin@gcc.gnu.org>
      
      	* gcc/config/pa/pa.c (pa_function_value): Fix check for word and
      	double-word size when handling aggregate return values.
      	* gcc/config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Fix to indicate
      	that homogeneous SFmode and DFmode aggregates are passed and returned
      	in general registers.
      John David Anglin committed
    • i18n: Fix translation of --help [PR93759] · 8d1780b5
      The first two hunks make sure we actually translate what has been marked
      for translation, i.e. the cl_options[...].help strings, rather than those
      strings ammended in various ways, like:
      _("%s  Same as %s."), help, ...
      or
      "%s  %s", help, _(use_diagnosed_msg)
      
      The exgettext changes attempt to make sure that the cl_options[...].help
      strings are marked as no-c-format, because otherwise if they happen
      to contain a % character, such as the 90% substring, they will be marked
      as c-format, which they aren't.
      
      2020-02-21  Jakub Jelinek  <jakub@redhat.com>
      
      	PR translation/93759
      	* opts.c (print_filtered_help): Translate help before appending
      	messages to it rather than after that.
      
      	* exgettext: For *.opt help texts, use __opt_help_text("...")
      	rather than _("...") in the $emsg file and pass options that
      	say that this implies no-c-format.
      Jakub Jelinek committed
    • lra: Stop registers being incorrectly marked live v2 [PR92989] · d11676de
      This PR is about a case in which the clobbers at the start of
      an EH receiver can lead to registers becoming unnecessarily
      live in predecessor blocks.  My first attempt at fixing this
      made sure that we update the bb liveness info based on the
      real live set:
      
        http://gcc.gnu.org/g:e648e57efca6ce6d751ef8c2038608817b514fb4
      
      But it turns out that the clobbered registers were also added to
      the "gen" set of LRA's private liveness problem, where "gen" in
      this context means "generates a requirement for a live value".
      So the clobbered registers could still end up live via that
      mechanism instead.
      
      This patch therefore reverts the patch above and takes the other
      approach floated in the original patch description: model the full
      clobber by making the registers live and then dead again.
      
      There's no specific need to revert the original patch, since the
      code should no longer be sensitive to the order of the bb liveness
      update and the modelling of the clobber.  But given that there's
      no specific need to keep the original patch either, it seemed better
      to restore the code to the more well-tested order.
      
      Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
      
      Richard
      
      2020-02-19  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	PR rtl-optimization/PR92989
      	* lra-lives.c (process_bb_lives): Restore the original order
      	of the bb liveness update.  Call make_hard_regno_dead for each
      	register clobbered at the start of an EH receiver.
      Richard Sandiford committed
    • Do not propagate self-dependent value (PR ipa/93763) (ChangeLog) · 25f0909a
                  PR ipa/93763
                  * ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
                  self-recursively generated.
      Jeff Law committed
    • Do not propagate self-dependent value (PR ipa/93763) · 47772af1
              PR ipa/93763
              * ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
              self-recursively generated.
      Feng Xue committed
    • Darwin: Fix wrong quoting on an error string (PR93860). · 147add96
      The quotes should surround all of the literal content from the pragma
      that has incorrect usage.
      
      2020-02-21  Iain Sandoe  <iain@sandoe.co.uk>
      
      PR target/93860
      * config/darwin-c.c (pop_field_alignment): Adjust quoting of
      error string.
      Iain Sandoe committed
    • PR c++/93753 - ICE on a flexible array followed by a member in an anonymous… · dbfba41e
      PR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct with an initializer
      
      gcc/cp/ChangeLog:
      
      	PR gcov-profile/93753
      	* class.c (check_flexarrays): Tighten up a test for potential members
      	of anonymous structs or unions.
      
      gcc/testsuite/ChangeLog:
      
      	PR gcov-profile/93753
      	* g++.dg/ext/flexary36.C: New test.
      	* g++.dg/lto/pr93166_0.C: Make struct with flexarray valid.
      Martin Sebor committed