1. 28 Mar, 2020 9 commits
    • Patch for PR94246 · 7d57570b
      Paul Thomas committed
    • [Fortran] Fix result-variable handling of MODULE PROCEDURE (PR94348) · 3fb7f2fb
      	PR fortran/94348
      	* decl.c (gfc_match_submod_proc): Add result var to the
      	proc's namespace.
      
      	PR fortran/94348
      	* gfortran.dg/module_procedure_3.f90: New.
      Tobias Burnus committed
    • c++: Diagnose when "requires" is used instead of "requires requires" [PR94306] · 7981c06a
      This adds support to detect and recover from the case where an opening brace
      immediately follows the start of a requires-clause.  So rather than emitting the
      error
      
        error: expected primary-expression before '{' token
      
      followed by a slew of irrevelant errors, we now assume the user had intended to
      write "requires requires {" and diagnose and recover accordingly.
      
      gcc/cp/ChangeLog:
      
      	PR c++/94306
      	* parser.c (cp_parser_requires_clause_opt): Diagnose and recover from
      	"requires {" when "requires requires {" was probably intended.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94306
      	* g++.dg/concepts/diagnostic8.C: New test.
      Patrick Palka committed
    • c++: requires-expression outside of a template is misevaluated [PR94252] · a7ea3d2c
      This PR shows that a REQUIRES_EXPR outside of a template can sometimes be
      misevaluated.  This happens because the evaluation routine tsubst_requires_expr
      (and diagnose_requires_expr) assumes the REQUIRES_EXPR's subtrees are templated
      trees and that therefore it's safe to call tsubst_expr on them.  But this
      assumption isn't valid when we've parsed a REQUIRES_EXPR outside of a template
      context.  In order to make this assumption valid here, this patch sets
      processing_template_decl to non-zero before parsing the body of a REQUIRES_EXPR
      so that its subtrees are indeed always templated trees.
      
      gcc/cp/ChangeLog:
      
      	PR c++/94252
      	* constraint.cc (tsubst_compound_requirement): Always suppress errors
      	from type_deducible_p and expression_convertible_p, as they're not
      	substitution errors.
      	(diagnose_atomic_constraint) <case INTEGER_CST>: Remove this case so
      	that we diagnose INTEGER_CST expressions of non-bool type via the
      	default case.
      	* cp-gimplify.c (cp_genericize_r) <case REQUIRES_EXPR>: New case.
      	* parser.c (cp_parser_requires_expression): Always parse the requirement
      	body as if we're processing a template, by temporarily incrementing
      	processing_template_decl.  Afterwards, if we're not actually in a
      	template context, perform semantic processing to diagnose any invalid
      	types and expressions.
      	* pt.c (tsubst_copy_and_build) <case REQUIRES_EXPR>: Remove dead code.
      	* semantics.c (finish_static_assert): Explain an assertion failure
      	when the condition is a REQUIRES_EXPR like we do when it is a concept
      	check.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94252
      	* g++.dg/concepts/diagnostic7.C: New test.
      	* g++.dg/concepts/pr94252.C: New test.
      	* g++.dg/cpp2a/concepts-requires18.C: Adjust to expect an additional
      	diagnostic.
      Patrick Palka committed
    • c++: Respect current_constraint_diagnosis_depth in diagnose_compound_requirement · cd68edf8
      The previous patch tries to avoid changing our current default diagnostics.  But
      for the sake of consistency we arguably should also respect
      current_constraint_diagnosis_depth in diagnose_compound_requirement() like we do
      in the other error-replaying diagnostic routines.  But doing so would be a
      change to our default diagnostics behavior, so the change has been split out
      into this separate patch for separate consideration.
      
      gcc/cp/ChangeLog:
      
      	* constraint.cc (diagnose_compound_requirement): When diagnosing a
      	compound requirement, maybe replay the satisfaction failure, subject to
      	the current diagnosis depth.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/concepts/diagnostic1.C: Pass -fconcepts-diagnostics-depth=2.
      	* g++.dg/concepts/diagnostic5.C: Adjust expected diagnostics.
      	* g++.dg/cpp2a/concepts-iconv1.C: Pass -fconcepts-diagnostics-depth=2.
      	* g++.dg/cpp2a/concepts-requires5.C: Likewise.
      Patrick Palka committed
    • c++: Replay errors during diagnosis of constraint satisfaction failures · 75defde9
      This patch adds a new flag -fconcepts-diagnostics-depth to the C++ frontend
      which controls how deeply we replay errors when diagnosing a constraint
      satisfaction failure.  The default is -fconcepts-diagnostics-depth=1 which
      diagnoses only the topmost constraint satisfaction failure and is consistent
      with our behavior before this patch.  By increasing this flag's value, the user
      can control how deeply they want the compiler to explain a constraint
      satisfaction error.
      
      For example, if the unsatisfied constraint is a disjunction, then the default
      behavior is to just say "no branch in the disjunction is satisfied", but with
      -fconcepts-diagnostics-depth=2 we will additionally replay and diagnose the
      error in each branch of the disjunction.  And if the unsatisfied constraint is a
      requires expression, then we will replay the error in the requires expression,
      etc.  This proceeds recursively until there is nothing more to replay or we
      exceeded the maximum depth specified by the flag.
      
      Implementation wise, this patch essentially just uncomments the existing
      commented-out code that performs the error-replaying, and along the way adds
      logic to keep track of and limit the current replay depth.  Besides that, there
      is a new routine collect_operands_of_disjunction which flattens a disjunction
      and collects all of its operands into a vector.
      
      The extra diagnostics enabled by this flag are at times longer than they need to
      be (e.g.  "the operand is_array_v<...> is unsatisfied because \n the expression
      is_array_v<...> [with ...] evaluated to false") and not immediately easy to
      follow (especially when there are nested disjunctions), but the transparency
      provided by these optional diagnostics seems to be pretty helpful in practice.
      
      gcc/c-family/ChangeLog:
      
      	* c.opt: Add -fconcepts-diagnostics-depth.
      
      gcc/cp/ChangeLog:
      
      	* constraint.cc (finish_constraint_binary_op): Set the location of EXPR
      	as well as its range, because build_x_binary_op doesn't always do so.
      	(current_constraint_diagnosis_depth): New.
      	(concepts_diagnostics_max_depth_exceeded_p): New.
      	(collect_operands_of_disjunction): New.
      	(satisfy_disjunction): When diagnosing a satisfaction failure, maybe
      	replay each branch of the disjunction, subject to the current diagnosis
      	depth.
      	(diagnose_valid_expression): When diagnosing a satisfaction failure,
      	maybe replay the substitution error, subject to the current diagnosis
      	recursion.
      	(diagnose_valid_type): Likewise.
      	(diagnose_nested_requiremnet): Likewise.
      	(diagnosing_failed_constraint::diagnosing_failed_constraint): Increment
      	current_constraint_diagnosis_depth when diagnosing.
      	(diagnosing_failed_constraint::~diagnosing_failed_constraint): Decrement
      	current_constraint_diagnosis_depth when diagnosing.
      	(diagnosing_failed_constraint::replay_errors_p): New static member
      	function.
      	(diagnose_constraints): Don't diagnose if concepts_diagnostics_max_depth
      	is 0.  Emit a one-off note to increase -fconcepts-diagnostics-depth if
      	the limit was exceeded.
      	* cp-tree.h (diagnosing_failed_constraint::replay_errors_p): Declare.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/concepts/diagnostic2.C: Expect "no operand" instead of
      	"neither operand".
      	* g++.dg/concepts/diagnostic5.C: New test.
      Patrick Palka committed
    • c: After issuing errors about array size, for error-recovery don't make the array VLA [PR93573] · c6a562de
      After we report various errors about array size, we set for error-recovery
      the size to be 1, but because size_int_const is false, it still means we
      pretend the array is a VLA, can emit a second diagnostics in that case etc.
      E.g.
      $ ./cc1.unpatched -quiet a.c
      a.c:1:5: error: size of array ‘f’ has non-integer type
          1 | int f[100.0];
            |     ^
      a.c:1:1: warning: variably modified ‘f’ at file scope
          1 | int f[100.0];
            | ^~~
      $ ./cc1 -quiet a.c
      a.c:1:5: error: size of array ‘f’ has non-integer type
          1 | int f[100.0];
            |     ^
      
      2020-03-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c/93573
      	* c-decl.c (grokdeclarator): After issuing errors, set size_int_const
      	to true after setting size to integer_one_node.
      
      	* gcc.dg/pr93573-1.c: New test.
      	* gcc.dg/pr93573-2.c: New test.
      Jakub Jelinek committed
    • reassoc: Fix -fcompare-debug bug in reassociate_bb [PR94329] · 679becf1
      The following testcase FAILs with -fcompare-debug, because reassociate_bb
      mishandles the case when the last stmt in a bb has zero uses.  In that case
      reassoc_remove_stmt (like gsi_remove) moves the iterator to the next stmt,
      i.e. gsi_end_p is true, which means the code sets the iterator back to
      gsi_last_bb.  The problem is that the for loop does gsi_prev on that before
      handling the next statement, which means the former penultimate stmt, now
      last one, is not processed by reassociate_bb.
      Now, with -g, if there is at least one debug stmt at the end of the bb,
      reassoc_remove_stmt moves the iterator to that following debug stmt and we
      just do gsi_prev and continue with the former penultimate non-debug stmt,
      now last non-debug stmt.
      
      The following patch fixes that by not doing the gsi_prev in this case; there
      are too many continue; cases, so I didn't want to copy over the gsi_prev to
      all of them, so this patch uses a bool for that instead.  The second
      gsi_end_p check isn't needed anymore, because when we don't do the
      undesirable gsi_prev after gsi = gsi_last_bb, the loop !gsi_end_p (gsi)
      condition will catch the removal of the very last stmt from a bb.
      
      2020-03-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR tree-optimization/94329
      	* tree-ssa-reassoc.c (reassociate_bb): When calling reassoc_remove_stmt
      	on the last stmt in a bb, make sure gsi_prev isn't done immediately
      	after gsi_last_bb.
      
      	* gfortran.dg/pr94329.f90: New test.
      Jakub Jelinek committed
    • Daily bump. · c2781192
      GCC Administrator committed
  2. 27 Mar, 2020 31 commits
    • libstdc++: Define __cpp_lib_ranges macro for C++20 · b8a28a06
      Define the feature test macro now that ranges support is complete.
      
      This also changes the preprocessor checks for the __cpp_concepts macro
      so that library components depending on concepts are only enabled when
      C++20 concepts are supported, and not just for the Concepts TS (which
      uses different syntax in places).
      
      	* include/bits/range_cmp.h (__cpp_lib_ranges): Define.
      	* include/bits/stl_iterator.h: Check value of __cpp_concepts so that
      	C++20 concepts are required.
      	* include/bits/stl_iterator_base_types.h: Likewise.
      	* include/std/concepts: Likewise.
      	* include/std/version: Likewise.
      	* testsuite/std/ranges/headers/ranges/synopsis.cc: Check feature test
      	macro.
      Jonathan Wakely committed
    • libstdc++: Add remaining C++20 changes to iterator adaptors · 81a8d137
      This adds the missing parts of P0896R4 to reverse_iterator and
      move_iterator, so that they meet the C++20 requirements. This should be
      the last piece of P0896R4, meaning ranges support is now complete.
      
      The PR 94354 bug with reverse_iterator's comparisons is fixed for C++20
      only, but that change should be extended to C++11, C++14 and C++17 modes
      in stage 1.
      
      	* include/bits/stl_iterator.h (reverse_iterator::iterator_concept)
      	(reverse_iterator::iterator_category): Define for C++20.
      	(reverse_iterator): Define comparison operators correctly for C++20.
      	(__normal_iterator): Add constraints to comparison operators for C++20.
      	(move_iterator::operator++(int)) [__cpp_lib_concepts]: Define new
      	overload for input iterators.
      	(move_iterator): Add constraints to comparison operators for C++20.
      	Define operator<=> for C++20.
      	* testsuite/24_iterators/move_iterator/input_iterator.cc: New test.
      	* testsuite/24_iterators/move_iterator/move_only.cc: New test.
      	* testsuite/24_iterators/move_iterator/rel_ops_c++20.cc: New test.
      	* testsuite/24_iterators/reverse_iterator/rel_ops_c++20.cc: New test.
      Jonathan Wakely committed
    • libstdc++: Implement C++20 changes to insert iterators · ae6076b5
      std::insert_iterator and std::inserter need to be adjusted for C++20, so
      that they use ranges::iterator_t. That alias template requires
      ranges::begin to be defined. Rather than moving the whole of
      ranges::begin (and related details like ranges::enable_borrowed_range)
      into <iterator>, this defines a new, simpler version of ranges::begin
      that is sufficient for ranges::iterator_t to be defined. This works
      because ranges::iterator_t uses an lvalue reference type, so the logic
      in ranges::begin for non-lvalue ranges (i.e. borrowed ranges) isn't
      needed.
      
      This also adds the missing constexpr specifiers to the other insert
      iterators.
      
      	* include/bits/iterator_concepts.h (__detail::__decay_copy)
      	(__detail::__member_begin, __detail::__adl_begin): Move here from
      	<bits/range_access.h>.
      	(__detail::__ranges_begin, __detail::__range_iter_t): Define.
      	* bits/range_access.h (__cust_access::__decay_copy)
      	(__cust_access::__member_begin, __cust_access::__adl_begin): Move to
      	<bits/iterator_concepts.h>.
      	(ranges::iterator_t): Use __detail::__range_iter_t.
      	* include/bits/stl_iterator.h (back_insert_iterator): Simplify
      	conditional compilation. Add _GLIBCXX20_CONSTEXPR to all members.
      	(front_insert_iterator): Likewise.
      	(insert_iterator): Implement changes from P0896R4 for C++20.
      	* testsuite/24_iterators/back_insert_iterator/constexpr.cc: New test.
      	* testsuite/24_iterators/front_insert_iterator/constexpr.cc: New test.
      	* testsuite/24_iterators/headers/iterator/synopsis_c++17.cc: Adjust
      	for inclusion in synopsis_c++20.cc which expects different signatures
      	for some function templates.
      	* testsuite/24_iterators/insert_iterator/constexpr.cc: New test.
      Jonathan Wakely committed
    • libstdc++: Move definition earlier in file · 0302a2de
      This moves __is_array_convertible so it's not between
      __is_nothrow_convertible and its helper, since it isn't related to
      those.
      
      	* include/std/type_traits (__is_array_convertible): Move definition
      	to immediately after is_convertible.
      Jonathan Wakely committed
    • Update gcc de.po. · 491009b6
      Joseph Myers committed
    • [RS6000] PR94145, make PLT loads volatile · 19e5389d
      The PLT is volatile.  On PowerPC it is a bss style section which the
      dynamic loader initialises to point at resolver stubs (called glink on
      PowerPC64) to support lazy resolution of function addresses.  The
      first call to a given function goes via the dynamic loader symbol
      resolver, which updates the PLT entry for that function and calls the
      function.  The second call, if there is one and we don't have a
      multi-threaded race, will use the updated PLT entry and thus avoid
      the relatively slow symbol resolver path.
      
      Calls via the PLT are like calls via a function pointer, except that
      no initialised function pointer is volatile like the PLT.  All
      initialised function pointers are resolved at program startup to point
      at the function or are left as NULL.  There is no support for lazy
      resolution of any user visible function pointer.
      
      So why does any of this matter to gcc?  Well, normally the PLT call
      mechanism happens entirely behind gcc's back, but since we implemented
      inline PLT calls (effectively putting the PLT code stub that loads the
      PLT entry inline and making that code sequence scheduled), the load of
      the PLT entry is visible to gcc.  That load then is subject to gcc
      optimization, for example in
      
      /* -S -mcpu=future -mpcrel -mlongcall -O2.  */
      int foo (int);
      void bar (void)
      {
        while (foo(0))
          foo (99);
      }
      
      we see the PLT load for foo being hoisted out of the loop and stashed
      in a call-saved register.  If that happens to be the first call to
      foo, then the stashed value is that for the resolver stub, and every
      call to foo in the loop will then go via the slow resolver path.  Not
      a good idea.  Also, if foo turns out to be a local function and the
      linker replaces the PLT calls with direct calls to foo then gcc has
      just wasted a call-saved register.
      
      This patch teaches gcc that the PLT loads are volatile.  The change
      doesn't affect other loads of function pointers and thus has no effect
      on normal indirect function calls.  Note that because the
      "optimization" this patch prevents can only occur over function calls,
      the only place gcc can stash PLT loads is in call-saved registers or
      in other memory.  I'm reasonably confident that this change will be
      neutral or positive for the "ld -z now" case where the PLT is not
      volatile, in code where there is any register pressure.  Even if gcc
      could be taught to recognise cases where the PLT is resolved, you'd
      need to discount use of registers to cache PLT loads by some factor
      involving the chance that those calls would be converted to direct
      calls.
      
      	PR target/94145
      	* config/rs6000/rs6000.c (rs6000_longcall_ref): Use unspec_volatile
      	for PLT16_LO and PLT_PCREL.
      	* config/rs6000/rs6000.md (UNSPEC_PLT16_LO, UNSPEC_PLT_PCREL): Remove.
      	(UNSPECV_PLT16_LO, UNSPECV_PLT_PCREL): Define.
      	(pltseq_plt16_lo_, pltseq_plt_pcrel): Use unspec_volatile.
      Alan Modra committed
    • c++: Handle COMPOUND_EXPRs in ocp_convert [PR94339] · 54de5afb
      With the PR94346 fix in, we can revert the attr-copy-2.C workaround.
      
      2020-03-27  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/94339
      	* g++.dg/ext/attr-copy-2.C: Revert the last changes.
      Jakub Jelinek committed
    • PR c++/94346 - [9/10 Regression] ICE due to handle_copy_attribute since r9-3982 · 52f24a9e
      gcc/c-family/ChangeLog:
      
      	PR c++/94346
      	* c-attribs.c (handle_copy_attribute): Avoid passing expressions
      	to decl_attributes.  Make handling of different kinds of entities
      	more robust.
      
      gcc/c-c++-common/ChangeLog:
      
      	PR c++/94346
      	* c-c++-common/attr-copy.c: New test.
      Martin Sebor committed
    • [pr84733] Fix ICE popping local scope · c7fc15f5
      	PR c++/84733
      	* name-lookup.c (do_pushdecl): Look through cleanp levels.
      Nathan Sidwell committed
    • PR c++/94098 - ICE on attribute access redeclaration · ccacf77b
      gcc/c-family/ChangeLog:
      
      	PR c++/94098
      	* c-attribs.c (handle_access_attribute): Avoid setting TYPE_ATTRIBUTES
      	here.
      
      gcc/ChangeLog:
      
      	PR c++/94098
      	* calls.c (init_attr_rdwr_indices): Iterate over all access attributes.
      
      gcc/testsuite/ChangeLog:
      
      	PR c++/94098
      	* g++.dg/ext/attr-access-2.C: New test.
      Martin Sebor committed
    • amdgcn: refactor mode iterators · 03876953
      The iterative addition of 8 and 16 bit vectors has left the mode iterators in a
      bit of a mess.  Also, the original names were rather verbose leading to
      formatting difficulties.
      
      This patch renames all the vector modes such that they are shorter and tidier.
      It does not change the output machine description at all.
      
      2020-03-27  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/
      	* config/gcn/gcn-valu.md:
      	(VEC_SUBDWORD_MODE): Rename to V_QIHI throughout.
      	(VEC_1REG_MODE): Delete.
      	(VEC_1REG_ALT): Delete.
      	(VEC_ALL1REG_MODE): Rename to V_1REG throughout.
      	(VEC_1REG_INT_MODE): Delete.
      	(VEC_ALL1REG_INT_MODE): Rename to V_INT_1REG throughout.
      	(VEC_ALL1REG_INT_ALT): Rename to V_INT_1REG_ALT throughout.
      	(VEC_2REG_MODE): Rename to V_2REG throughout.
      	(VEC_REG_MODE): Rename to V_noHI throughout.
      	(VEC_ALLREG_MODE): Rename to V_ALL throughout.
      	(VEC_ALLREG_ALT):  Rename to V_ALL_ALT throughout.
      	(VEC_ALLREG_INT_MODE): Rename to V_INT throughout.
      	(VEC_INT_MODE): Delete.
      	(VEC_FP_MODE): Rename to V_FP throughout and move to top.
      	(VEC_FP_1REG_MODE): Rename to V_FP_1REG throughout and move to top.
      	(FP_MODE): Delete and replace with FP throughout.
      	(FP_1REG_MODE): Delete and replace with FP_1REG throughout.
      	(VCMP_MODE): Rename to V_noQI throughout and move to top.
      	(VCMP_MODE_INT): Rename to V_INT_noQI throughout and move to top.
      	* config/gcn/gcn.md (FP): New mode iterator.
      	(FP_1REG): New mode iterator.
      Andrew Stubbs committed
    • c++: avoid -Wredundant-tags on a first declaration in use [PR 93824] · 04dd734b
      -Wredundant-tags doesn't consider type declarations that are also
      the first uses of the type, such as in 'void f (struct S);' and
      issues false positives for those.  According to the reported that's
      making it harder to use the warning to clean up LibreOffice.
      
      The attached patch extends -Wredundant-tags to avoid these false
      positives by relying on the same class_decl_loc_t::class2loc mapping
      as -Wmismatched-tags.  The patch also improves the detection
      of both issues in template declarations.
      
      gcc/cp/ChangeLog
      2020-03-27  Martin Sebor  <msebor@redhat.com>
      
      	PR c++/94078
      	PR c++/93824
      	PR c++/93810
      	* cp-tree.h (most_specialized_partial_spec): Declare.
      	* parser.c (cp_parser_elaborated_type_specifier): Distinguish alias
      	from declarations.
      	(specialization_of): New function.
      	(cp_parser_check_class_key): Move code...
      	(class_decl_loc_t::add): ...to here.  Add parameters.  Avoid issuing
      	-Wredundant-tags on first-time declarations in other declarators.
      	Correct handling of template specializations.
      	(class_decl_loc_t::diag_mismatched_tags): Also expect to be called
      	when -Wredundant-tags is enabled.  Use primary template or partial
      	specialization as the guide for uses of implicit instantiations.
      	* pt.c (most_specialized_partial_spec): Declare extern.
      
      gcc/testsuite/ChangeLog
      2020-03-27  Martin Sebor  <msebor@redhat.com>
      
      	PR c++/94078
      	PR c++/93824
      	PR c++/93810
      	* g++.dg/warn/Wmismatched-tags-3.C: New test.
      	* g++.dg/warn/Wmismatched-tags-4.C: New test.
      	* g++.dg/warn/Wmismatched-tags-5.C: New test.
      	* g++.dg/warn/Wmismatched-tags-6.C: New test.
      	* g++.dg/warn/Wredundant-tags-3.C: Remove xfails.
      	* g++.dg/warn/Wredundant-tags-6.C: New test.
      	* g++.dg/warn/Wredundant-tags-7.C: New test.
      Martin Sebor committed
    • c++: Fix ICE after ambiguous inline namespace reopen [PR94257] · 9dba6013
      Following DR2061, 'namespace F', looks for 'F's inside inline namespaces.
      That can result in ambiguous lookups that we failed to diagnose early enough,
      leading us to push a new namespace and ICE later.  Diagnose the ambiguity
      earlier, and then pick one.
      
      	PR c++/94257
      	* name-lookup.c (push_namespace): Triage ambiguous lookups that
      	contain namespaces.
      Nathan Sidwell committed
    • analyzer: fix malloc pointer NULL-ness · 6969ac30
      Fixes to exploded_path::feasible_p exposed a pre-existing bug
      with pointer NULL-ness for pointers to symbolic_region.
      
      symbolic_region has an "m_possibly_null" flag which if set means
      that a region_svalue pointing to that region is treated as possibly
      NULL.  Adding a constraint of "!= NULL" on an edge records that
      the pointer is non-NULL, but doesn't affect other pointers (e.g.
      if the first if a void *, but the other pointers are cast to other
      pointer types).  This showed up in the tests
      gcc.dg/analyzer/data-model-5b.c and -5c.c, which malloc a buffer
      and test for NULL, but then cast that to a struct * and later test
      that struct *: a path for the first test being non-NULL and the
      second being NULL was erroneously found to be feasible.
      
      This patch clears the m_possibly_null flag when a "!= NULL" constraint
      is added, fixing that erroneous path (but not yet fixing the false
      positive in the above tests, which seems to go on to hit a different
      issue).  It also adds the field to dumps.
      
      gcc/analyzer/ChangeLog:
      	* program-state.cc (selftest::test_program_state_dumping): Update
      	expected dump to include symbolic_region's possibly_null field.
      	* region-model.cc (symbolic_region::print_fields): New vfunc
      	implementation.
      	(region_model::add_constraint): Clear m_possibly_null from
      	symbolic_regions now known to be non-NULL.
      	(selftest::test_malloc_constraints): New selftest.
      	(selftest::analyzer_region_model_cc_tests): Call it.
      	* region-model.h (region::dyn_cast_symbolic_region): Add non-const
      	overload.
      	(symbolic_region::dyn_cast_symbolic_region): Implement it.
      	(symbolic_region::print_fields): New vfunc override decl.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/data-model-5b.c: Add xfail for new false
      	positive leak.
      	* gcc.dg/analyzer/data-model-5c.c: Likewise.
      	* gcc.dg/analyzer/malloc-5.c: New test.
      David Malcolm committed
    • analyzer: add new supergraph visualization · 42c63313
      This patch extends -fdump-analyzer-supergraph so that rather than just
      dumping a DUMP_BASE_NAME.supergraph.dot at the start of analysis, it
      also dumps a DUMP_BASE_NAME.supergraph-eg.dot at the end.
      
      The new dump file contains a concise dump of the exploded_graph,
      organized with respect to the supergraph and its statements.  The
      exploded nodes are colorized to show sm-state, but no other state
      is shown.  Per exploded_node saved_diagnostics are also shown,
      along with feasibility of the paths to reach them.
      
      I've been finding this a useful way of tracking down issues in
      exploded_graphs that are sufficiently large that the output of
      -fdump-analyzer-exploded-graph becomes unwieldy.
      
      The patch extends feasiblity-testing so that if the exploded_path
      for a saved_diagnostic is found to be infeasible, the reason is
      saved and written into the saved_diagnostic, so it can be shown in the
      dump.  I've found this very useful when tracking down feasibility
      issues.
      
      I'm keeping the initial dump file as it's useful when tracking down
      ICEs within the analyzer (which would stop the second dump file being
      written).
      
      gcc/analyzer/ChangeLog:
      	* analyzer.h (class feasibility_problem): New forward decl.
      	* diagnostic-manager.cc (saved_diagnostic::saved_diagnostic):
      	Initialize new fields m_status, m_epath_length, and m_problem.
      	(saved_diagnostic::~saved_diagnostic): Delete m_problem.
      	(dedupe_candidate::dedupe_candidate): Convert "sd" param from a
      	const ref to a mutable ptr.
      	(dedupe_winners::add): Convert "sd" param from a const ref to a
      	mutable ptr.  Record the length of the exploded_path.  Record the
      	feasibility/infeasibility of sd into sd, capturing a
      	feasibility_problem when feasible_p fails, and storing it in sd.
      	(diagnostic_manager::emit_saved_diagnostics): Update for pass by
      	ptr rather than by const ref.
      	* diagnostic-manager.h (class saved_diagnostic): Add new enum
      	status.  Add fields m_status, m_epath_length and m_problem.
      	(saved_diagnostic::set_feasible): New member function.
      	(saved_diagnostic::set_infeasible): New member function.
      	(saved_diagnostic::get_feasibility_problem): New accessor.
      	(saved_diagnostic::get_status): New accessor.
      	(saved_diagnostic::set_epath_length): New member function.
      	(saved_diagnostic::get_epath_length): New accessor.
      	* engine.cc: Include "gimple-pretty-print.h".
      	(exploded_path::feasible_p): Add OUT param and, if non-NULL, write
      	a new feasibility_problem to it on failure.
      	(viz_callgraph_node::dump_dot): Convert begin_tr calls to
      	begin_trtd.  Convert end_tr calls to end_tdtr.
      	(class exploded_graph_annotator): New subclass of dot_annotator.
      	(impl_run_checkers): Add a second -fdump-analyzer-supergraph dump
      	after the analysis runs, using exploded_graph_annotator. dumping
      	to DUMP_BASE_NAME.supergraph-eg.dot.
      	* exploded-graph.h (exploded_node::get_dot_fillcolor): Make
      	public.
      	(exploded_path::feasible_p): Add OUT param.
      	(class feasibility_problem): New class.
      	* state-purge.cc (state_purge_annotator::add_node_annotations):
      	Return a bool, add a "within_table" param.
      	(print_vec_of_names): Convert begin_tr calls to begin_trtd.
      	Convert end_tr calls to end_tdtr.
      	(state_purge_annotator::add_stmt_annotations): Add "within_row"
      	param.
      	* state-purge.h ((state_purge_annotator::add_node_annotations):
      	Return a bool, add a "within_table" param.
      	(state_purge_annotator::add_stmt_annotations): Add "within_row"
      	param.
      	* supergraph.cc (supernode::dump_dot): Call add_node_annotations
      	twice: as before, passing false for "within_table", then again
      	with true when within the TABLE element.  Convert some begin_tr
      	calls to begin_trtd, and some end_tr calls to end_tdtr.
      	Repeat each add_stmt_annotations call, distinguishing between
      	calls that add TRs and those that add TDs to an existing TR.
      	Add a call to add_after_node_annotations.
      	* supergraph.h (dot_annotator::add_node_annotations): Add a
      	"within_table" param.
      	(dot_annotator::add_stmt_annotations): Add a "within_row" param.
      	(dot_annotator::add_after_node_annotations): New vfunc.
      
      gcc/ChangeLog:
      	* doc/invoke.texi (-fdump-analyzer-supergraph): Document that this
      	now emits two .dot files.
      	* graphviz.cc (graphviz_out::begin_tr): Only emit a TR, not a TD.
      	(graphviz_out::end_tr): Only close a TR, not a TD.
      	(graphviz_out::begin_td): New.
      	(graphviz_out::end_td): New.
      	(graphviz_out::begin_trtd): New, replacing the old implementation
      	of graphviz_out::begin_tr.
      	(graphviz_out::end_tdtr): New, replacing the old implementation
      	of graphviz_out::end_tr.
      	* graphviz.h (graphviz_out::begin_td): New decl.
      	(graphviz_out::end_td): New decl.
      	(graphviz_out::begin_trtd): New decl.
      	(graphviz_out::end_tdtr): New decl.
      
      gcc/testsuite/ChangeLog:
      	* gcc.dg/analyzer/dot-output.c: Check that
      	dot-output.c.supergraph-eg.dot is valid.
      David Malcolm committed
    • analyzer: improvements to diagnostic-manager.cc logging · 8f023575
      gcc/analyzer/ChangeLog:
      	* diagnostic-manager.cc (dedupe_winners::add): Show the
      	exploded_node index in the log messages.
      	(diagnostic_manager::emit_saved_diagnostics): Log a summary of
      	m_saved_diagnostics at entry.
      David Malcolm committed
    • analyzer: tweaks to superedge::dump · 4d661bb7
      gcc/analyzer/ChangeLog:
      	* supergraph.cc (superedge::dump): Add space before description;
      	move newline to non-pretty_printer overload.
      David Malcolm committed
    • debug/94273 - avoid creating type DIEs for DINFO_LEVEL_TERSE · 45cfaf99
      This avoids completing types for DINFO_LEVEL_TERSE by using
      the should_emit_struct_debug machinery.
      
      2020-03-27  Richard Biener  <rguenther@suse.de>
      
      	PR debug/94273
      	* dwarf2out.c (should_emit_struct_debug): Return false for
      	DINFO_LEVEL_TERSE.
      
      	* g++.dg/debug/pr94273.C: New testcase.
      Richard Biener committed
    • tree-optimization/94352 - fix uninitialized use of curr_order · 917e21e8
      This fixes a (harmless) use of a not re-initialized curr_order.
      
      2020-03-27  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/94352
      	* tree-ssa-propagate.c (ssa_prop_init): Move seeding of the
      	worklist ...
      	(ssa_propagation_engine::ssa_propagate): ... here after
      	initializing curr_order.
      Richard Biener committed
    • [Fortran] Fix ICE with deferred-rank arrays (PR93957) · 62ede14d
      	PR fortran/93957
      	* trans-array.c (gfc_alloc_allocatable_for_assignment): Accept
      	nonallocatable, nonpointer deferred-rank arrays.
      
      	PR fortran/93957
      	* gfortran.dg/assumed_rank_19.f90: New.
      Tobias Burnus committed
    • Fix PR90332 by extending half size vector mode · 8d689cf4
      As PR90332 shows, the current scalar epilogue peeling for gaps
      elimination requires expected vec_init optab with two half size
      vector mode.  On Power, we don't support vector mode like V8QI,
      so can't support optab like vec_initv16qiv8qi.  But we want to
      leverage existing scalar mode like DI to init the desirable
      vector mode.  This patch is to extend the existing support for
      Power, as evaluated on Power9 we can see expected 1.9% speed up
      on SPEC2017 525.x264_r.
      
      As Richi suggested, add one function vector_vector_composition_type
      to refactor existing related codes and also make use of it further.
      
      Bootstrapped/regtested on powerpc64le-linux-gnu (LE) P8 and P9,
      as well as x86_64-redhat-linux.
      
      gcc/ChangeLog
      
      2020-03-27  Kewen Lin  <linkw@gcc.gnu.org>
      
          PR tree-optimization/90332
          * tree-vect-stmts.c (vector_vector_composition_type): New function.
          (get_group_load_store_type): Adjust to call vector_vector_composition_type,
          extend it to construct with scalar types.
          (vectorizable_load): Likewise.
      Kewen Lin committed
    • Fortran] Reject invalid association target (PR93363) · a76ff304
      	PR fortran/93363
      	* resolve.c (resolve_assoc_var): Reject association to DT and
      	function name.
      
      	PR fortran/93363
      	* gfortran.dg/associate_51.f90: Fix test case.
      	* gfortran.dg/associate_53.f90: New.
      Tobias Burnus committed
    • c++: Avoid calls in non-evaluated contexts affect whether function can or can't throw [PR94326] · 2eea00c5
      The following testcase FAILs -fcompare-debug, because if we emit a
      -Wreturn-local-addr warning, we tsubst decltype in order to print the
      warning and as that function could throw, set_flags_from_callee during that
      sets cp_function_chain->can_throw and later on we don't set TREE_NOTHROW
      on foo.  While with -w or -Wno-return-local-addr, tsubst isn't called during
      the warning_at, cp_function_chain->can_throw is kept clear and TREE_NOTHROW
      is set on foo.
      It isn't just a matter of the warning though, in
      int foo ();
      int bar () { return sizeof (foo ()); }
      int baz () { return sizeof (int); }
      I don't really see why we should mark only baz as TREE_NOTHROW and not bar
      too, when neither can really throw.
      
      2020-03-27  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/94326
      	* call.c (set_flags_from_callee): Don't update
      	cp_function_chain->can_throw or current_function_returns_abnormally
      	if cp_unevaluated_operand.
      
      	* g++.dg/other/pr94326.C: New test.
      Jakub Jelinek committed
    • c++: Handle COMPOUND_EXPRs in ocp_convert [PR94339] · 72809d6f
      My recent change to get_narrower/warnings_for_convert_and_check broke
      the following testcase, warnings_for_convert_and_check is upset that
      expr is a COMPOUND_EXPR with INTEGER_CST at the rightmost operand, while
      result is a COMPOUND_EXPR with a NOP_EXPR of INTEGER_CST at the rightmost
      operand, it expects such conversions to be simplified.
      
      The easiest fix seems to be to handle COMPOUND_EXPRs in ocp_convert too,
      by converting the rightmost operand and recreating COMPOUND_EXPR(s) if that
      changed.
      
      The attr-copy-2.C change is a workaround for PR94346, where we now ICE on
      the testcase, while previously we'd ICE only if it contained a comma
      expression at the outer level rather than cast of a COMPOUND_EXPR to
      something.  I'll defer that to Martin.
      
      2020-03-27  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/94339
      	* cvt.c (ocp_convert): Handle COMPOUND_EXPR by recursion on the second
      	operand and creating a new COMPOUND_EXPR if anything changed.
      
      	* g++.dg/other/pr94339.C: New test.
      	* g++.dg/ext/attr-copy-2.C: Comment out failing tests due to PR94346.
      Jakub Jelinek committed
    • modulo-sched: fix bootstrap compare-debug issue · 06d5d63d
      This patch removes all debug insns from DDG analysis.  It fixes bootstrap
      comparison failure on powerpc64le when running with -fmodulo-sched enabled.
      
      	* ddg.c (create_ddg_dep_from_intra_loop_link): Remove assertions.
      	(create_ddg_dep_no_link): Likewise.
      	(add_cross_iteration_register_deps): Move debug instruction check.
      	Other minor refactoring.
      	(add_intra_loop_mem_dep): Do not check for debug instructions.
      	(add_inter_loop_mem_dep): Likewise.
      	(build_intra_loop_deps): Likewise.
      	(create_ddg): Do not include debug insns into the graph.
      	* ddg.h (struct ddg): Remove num_debug field.
      	* modulo-sched.c (doloop_register_get): Adjust condition.
      	(res_MII): Remove DDG num_debug field usage.
      	(sms_schedule_by_order): Use assertion against debug insns.
      	(ps_has_conflicts): Drop debug insn check.
      
      testsuite:
      
          	* gcc.c-torture/execute/pr70127-debug-sms.c: New test.
          	* gcc.dg/torture/pr87197-debug-sms.c: New test.
      Roman Zhuykov committed
    • c++: template keyword accepted before destructor names [PR94336] · 71d69548
      This came up on the C++ core list recently.  We don't diagnose the case
      when 'template' is followed by a destructor name which is not permitted
      by [temp.names]/5.
      
      	PR c++/94336 - template keyword accepted before destructor names.
      	* parser.c (cp_parser_unqualified_id): Give an error when 'template'
      	is followed by a destructor name.
      
      	* g++.dg/template/template-keyword2.C: New test.
      Marek Polacek committed
    • c++: Remove redundant calls to type_dependent_expression_p · 54f58e94
      This simplifies conditions that test both value_dependent_expression_p and
      type_dependent_expression_p, since the former predicate now subsumes the latter.
      
      gcc/cp/ChangeLog:
      
      	* decl.c (compute_array_index_type_loc): Remove redundant
      	type_dependent_expression_p check that is subsumed by
      	value_dependent_expression_p.
      	* decl2.c (is_late_template_attribute): Likewise.
      	* pt.c (uses_template_parms): Likewise.
      	(dependent_template_arg_p): Likewise.
      Patrick Palka committed
    • coroutines, testsuite: Fix symmetric-transfer-00-basic.C on Linux. · 65937db8
      In order for the test output to work we need to include
      cstdio.
      
      2020-03-27  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* g++.dg/coroutines/torture/symmetric-transfer-00-basic.C:
      	Add <cstdio>.
      Iain Sandoe committed
    • Daily bump. · f9c38702
      GCC Administrator committed