Commit Graph

184381 Commits

Author SHA1 Message Date
Martin Liska 2b2f687fb0 branch_changer.py: document more behavior.
maintainer-scripts/ChangeLog:

	* branch_changer.py: Document more how the script behaves.
2021-04-09 13:19:15 +02:00
Martin Liska a7ce23cec4 branch_changer: fix usage of Version class.
maintainer-scripts/ChangeLog:

	* branch_changer.py: Fix usage of Version class.
2021-04-09 11:35:09 +02:00
Martin Liska 34bf325000 branch_changer.py: use new versioning scheme.
maintainer-scripts/ChangeLog:

	* branch_changer.py: Use new version scheme in --help output.
2021-04-09 10:43:53 +02:00
Tobias Burnus d31f485ded Fortran: Fix fndecl with -fcoarray=lib [PR99817]
gcc/fortran/ChangeLog:

	PR fortran/99817
	* trans-types.c (gfc_get_function_type): Also generate hidden
	coarray argument for character arguments.

gcc/testsuite/ChangeLog:

	PR fortran/99817
	* gfortran.dg/coarray/dummy_2.f90: New test.
2021-04-09 10:41:39 +02:00
Jakub Jelinek 8cc863ca8f libgomp: Silence false positive -Wmaybe-uninitialized warning [PR99984]
pthread_setspecific second argument is const void *, so that one can
call it even with pointers to const, but the function only stores the
pointer and does nothing else, so the new assumption of -Wmaybe-uninitialized
that functions taking such pointers will read from what those pointers
will point to is wrong.  Maybe it would be useful to have some whitelist
of functions that surely don't do that.

Anyway, in this case it is easy to workaround the warning by moving the
pthread_setspecific call after the initialization without slowing anything
down.

2021-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR libgomp/99984
	* team.c (gomp_thread_start): Call pthread_setspecific for
	!(defined HAVE_TLS || defined USE_EMUTLS) only after local_thr
	has been initialized to avoid false positive warning.
2021-04-09 10:18:47 +02:00
GCC Administrator 019a922063 Daily bump. 2021-04-09 00:16:56 +00:00
Jonathan Wakely 96292c3e34 libstdc++: Remove spurious line break in doxygen comment
libstdc++-v3/ChangeLog:

	* include/bits/basic_string.h: Tweak doxygen comment.
2021-04-09 00:17:32 +01:00
David Edelsohn 5f7c2d20b5 aix: revert TLS common change
GCC uses TLS common for both public common / BSS and local common / BSS.
This patch reverts to use .comm directive to allocate TLS
common / BSS.  This also changes the priority of section selection
to use BSS before data section.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_xcoff_select_section): Select
	TLS BSS before TLS data.
	* config/rs6000/xcoff.h (ASM_OUTPUT_TLS_COMMON): Use .comm.

gcc/testsuite/ChangeLog:

	* g++.dg/gomp/tls-5.C: Expect tbss failure on AIX.
2021-04-08 17:40:23 -04:00
Patrick Palka b5242b2845 libstdc++: Fix split_view::_OuterIter::operator++ [LWG 3505]
libstdc++-v3/ChangeLog:

	* include/std/ranges (__detail::find): Define.
	(split_view::_OuterIter::operator++): Apply proposed resolution
	of LWG 3505.
	* testsuite/std/ranges/adaptors/split.cc (test10): New test.
2021-04-08 16:45:27 -04:00
Patrick Palka c1ce418af2 libstdc++: Simplify copy-pasted algorithms in <ranges>
The <ranges> header currently copies some simple algorithms from
<bits/ranges_algo.h>, which was originally done in order to avoid a
circular dependency with the header.  This is no longer an issue since
the latter header now includes <bits/ranges_util.h> instead of all of
<ranges>.

This means we could now just include <bits/ranges_algo.h> and remove the
copied algorithms, but that'd increase the size of <ranges> by ~10%.
And we can't use the corresponding STL-style algorithms here because
they assume input iterators are copyable.  So this patch instead
simplifies these copied algorithms, removing their constraints and
unused parameters, and keeps them around.  In a subsequent patch we're
going to copy (a simplified version of) ranges::find into <ranges> as
well.

libstdc++-v3/ChangeLog:

	* include/std/ranges (__detail::find_if): Simplify.
	(__detail::find_if_not): Likewise.
	(__detail::min): Remove.
	(__detail::mismatch): Simplify.
	(take_view::size): Use std::min instead of __detail::min.
2021-04-08 16:45:25 -04:00
Patrick Palka c7fe68f365 libstdc++: Fix elements_view::operator* and operator[] [LWG 3502]
While we're modifying elements_view, this also implements the one-line
resolution of LWG 3492.

libstdc++-v3/ChangeLog:

	* include/std/ranges (__detail::__returnable_element): New
	concept.
	(elements_view): Use this concept in its constraints.  Add
	missing private access specifier.
	(elements_view::_S_get_element): Define as per LWG 3502.
	(elements_view::operator*, elements_view::operator[]): Use
	_S_get_element.
	(elements_view::operator++): Remove unnecessary constraint
	as per LWG 3492.
	* testsuite/std/ranges/adaptors/elements.cc (test05): New test.
2021-04-08 16:45:22 -04:00
Jonathan Wakely be8d5f99f5 libstdc++: Improve error reporting if PDF generation fails
If pdflatex runs out of memory the build fails with no hint what's
wrong. This adds another grep command to the makefile so that an
out-of-memory error will result in more information being shown.

As suggested in https://bugzilla.redhat.com/show_bug.cgi?id=1841056
using lualatex can be used as a workaround.

libstdc++-v3/ChangeLog:

	* doc/Makefile.am (stamp-pdf-doxygen): Also grep for
	out-of-memory error in log file.
	* doc/Makefile.in: Regenerate.
2021-04-08 21:42:59 +01:00
Jonathan Wakely e41e356633 libstdc++: Regenerate configure script
This seems to be a missing piece of r11-6492.

libstdc++-v3/ChangeLog:

	* configure: Regenerate.
2021-04-08 21:42:59 +01:00
Jonathan Wakely 014b6dbcaa libstdc++: Fix more doxygen markup for group close commands
Similar to r11-8009 but for /* @} */ comments this time, which should
be /** @} */ for Doxygen to recognize them.

libstdc++-v3/ChangeLog:

	* include/bits/random.h: Fix doxygen group commands.
	* include/bits/regex_constants.h: Likewise.
	* include/tr1/random.h: Likewise.
2021-04-08 21:42:58 +01:00
Patrick Palka 123b3e03c9 c++: Don't substitute into constraints on lambdas [PR99874]
We currently substitute through a lambda's constraints whenever we
regenerate it via tsubst_lambda_expr.  This is the wrong approach
because it can lead to hard errors due to constraints being evaluated
out of order (as in the testcase concepts-lambda17.C below), and because
it doesn't mesh well with the recently added REQUIRES_EXPR_EXTRA_ARGS
mechanism for delaying substitution into requires-expressions, which is
the cause of this PR.

But in order to avoid substituting through a lambda's constraints during
regeneration, we need to be able to get at all in-scope template
parameters and corresponding template arguments during constraint
checking of a lambda's op().  And this information is not easily
available when we need it, it seems.

To that end, the approach that this patch takes is to add two new fields
to LAMBDA_EXPR (and remove one): LAMBDA_EXPR_REGENERATED_FROM
(replacing LAMBDA_EXPR_INSTANTIATED), and LAMBDA_EXPR_REGENERATING_TARGS.
The former allows us to obtain the complete set of template parameters
that are in-scope for a lambda's op(), and the latter gives us all outer
template arguments that were used to regenerate the lambda (analogous to
the TI_TEMPLATE and TI_ARGS of a TEMPLATE_INFO, respectively).

LAMBDA_EXPR_REGENERATING_TARGS is not strictly necessary -- in an
earlier prototype, I walked LAMBDA_EXPR_EXTRA_SCOPE to build up this set
of outer template arguments on demand, but it seems cleaner to do it this
way.  (We'd need to walk LAMBDA_EXPR_EXTRA_SCOPE and not DECL/TYPE_CONTEXT
because the latter skips over variable template scopes.)

This patch also renames the predicate instantiated_lambda_fn_p to
regenerated_lambda_fn_p, for sake of consistency with the rest of the
patch which uses "regenerated" instead of "instantiated".

gcc/cp/ChangeLog:

	PR c++/99874
	* constraint.cc (get_normalized_constraints_from_decl): Handle
	regenerated lambdas.
	(satisfy_declaration_constraints): Likewise.  Check for
	dependent args later.
	* cp-tree.h (LAMBDA_EXPR_INSTANTIATED): Replace with ...
	(LAMBDA_EXPR_REGENERATED_FROM): ... this.
	(LAMBDA_EXPR_REGENERATING_TARGS): New.
	(tree_lambda_expr::regenerated_from): New data member.
	(tree_lambda_expr::regenerating_targs): New data member.
	(add_to_template_args): Declare.
	(regenerated_lambda_fn_p): Likewise.
	(most_general_lambda): Likewise.
	* lambda.c (build_lambda_expr): Set LAMBDA_EXPR_REGENERATED_FROM
	and LAMBDA_EXPR_REGENERATING_TARGS.
	* pt.c (add_to_template_args): No longer static.
	(tsubst_function_decl): Unconditionally propagate constraints on
	the substituted function decl.
	(instantiated_lambda_fn_p): Rename to ...
	(regenerated_lambda_fn_p): ... this.  Check
	LAMBDA_EXPR_REGENERATED_FROM instead of
	LAMBDA_EXPR_INSTANTIATED.
	(most_general_lambda): Define.
	(enclosing_instantiation_of): Adjust after renaming
	instantiated_lambda_fn_p.
	(tsubst_lambda_expr): Don't set LAMBDA_EXPR_INSTANTIATED.  Set
	LAMBDA_EXPR_REGENERATED_FROM and LAMBDA_EXPR_REGENERATING_TARGS.
	Don't substitute or set constraints on the regenerated lambda.

gcc/testsuite/ChangeLog:

	PR c++/99874
	* g++.dg/cpp2a/concepts-lambda16.C: New test.
	* g++.dg/cpp2a/concepts-lambda17.C: New test.
2021-04-08 13:07:43 -04:00
Patrick Palka 05708d6eef c++: constrained CTAD for nested class template [PR97679]
In the testcase below, we're crashing during constraint checking of the
implicitly generated deduction guides for the nested class template A::B
because we never substitute the outer template arguments (for A) into
the constraint, neither ahead of time nor as part of satisfaction.

Ideally we'd like to avoid substituting into a constraint ahead of
time, but the "flattening" vector 'tsubst_args' is constructed under the
assumption that all outer template arguments are already substituted in,
and eliminating this assumption to yield a flattening vector that
includes outer (generic) template arguments suitable for substituting
into the constraint would be tricky and error-prone.  So this patch
takes the approximate approach of substituting the outer arguments into
the constraint ahead of time, so that the subsequent substitution of
'tsubst_args' is coherent and so later satisfaction just works.

gcc/cp/ChangeLog:

	PR c++/97679
	* pt.c (build_deduction_guide): Document OUTER_ARGS.  Substitute
	them into the propagated constraints.

gcc/testsuite/ChangeLog:

	PR c++/97679
	* g++.dg/cpp2a/concepts-ctad3.C: New test.
2021-04-08 13:07:37 -04:00
Jakub Jelinek 0567998287 c-family: Fix various comment typos in c-warn.c
When looking into PR99420, I have noticed several comment typos.

2021-04-08  Jakub Jelinek  <jakub@redhat.com>

	* c-warn.c (do_warn_double_promotion): Fix comment typo,
	occured -> occurred.
	(check_alignment_of_packed_member): Fix a comment typo,
	memeber -> member.
	(warn_parm_ptrarray_mismatch): Fix comment typos, os -> of
	and onless -> unless.
	(warn_parm_array_mismatch): Fix comment typos, declaratation
	-> declaration and woud -> would.  Fix up comment indentation.
2021-04-08 19:05:08 +02:00
Jonathan Wakely 1cbba49e34 libstdc++: Simplify noexcept-specifiers for move constructors
This puts the logic for the noexcept-specifier in one place, and then
reuses it elsewhere. This means checking whether the move constructor
can throw doesn't need to do overload resolution and then check whether
some other constructor can throw, we just get the answer directly.

libstdc++-v3/ChangeLog:

	* include/bits/hashtable.h (_Hashtable::_S_nothrow_move()):
	New function to determine noexcept-specifier for move
	constructors.
	(_Hashtable): Use _S_nothrow_move() on move constructors.
	* testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc:
	Correct static assertion message.
	* testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc:
	Likewise.
	* testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc:
	Likewise.
	* testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc:
	Likewise.
2021-04-08 17:49:59 +01:00
Richard Sandiford 59d09f9fe4 testsuite: Update scan-lto-assembler
scan-lto-assembler was looking for the old dump names instead of
the new ones.  There are only two uses of this:

    gcc.target/nios2/custom-fp-lto.c
    gcc.target/aarch64/pr70044.c

Both of them use single source files, so I think they both want
the same behaviour.

gcc/testsuite/
	* lib/scanasm.exp (scan-lto-assembler): Update expected name
	of dump file.
2021-04-08 17:39:12 +01:00
Richard Sandiford 09ef422fad testsuite: Add -mbig-endian stdint.h requirement
Some AArch64 tests force -mbig-endian and indirectly include stdint.h.
However, not all OSes support both endiannesses, leading to:

FAIL: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c   -O0  (test for excess errors)
UNRESOLVED: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c   -O1   check-function-bodies test_vget_high_bf16
UNRESOLVED: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c   -O1   check-function-bodies test_vget_low_bf16

etc.  This patch adds an (admittedly special-purpose) target
selector for this.

gcc/
	* doc/sourcebuild.texi (stdint_types_mbig_endian): Document.

gcc/testsuite/
	* lib/target-supports.exp
	(check_effective_target_stdint_types_mbig_endian): New proc.
	* gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c: Require
	stdint_types_mbig_endian.
	* gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c: Likewise.
	* gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c: Likewise.
2021-04-08 17:39:11 +01:00
Richard Sandiford 5240c5ca2e match.pd: Fix sve/vcond_3.c
The sve/vcond_3.c tests had started to fail after PR97690/99305,
because we were generating:

  a = VEC_COND_EXPR <cond, { 0, ... }, { 1, ... }>;
  b = a << 15;

instead of:

  a = VEC_COND_EXPR <cond, { 0, ... }, { 1<<15, ... }>;

We already have a match.pd rule to handle this kind of thing,
but it didn't handle shifts.

gcc/
	* match.pd: Extend vec_cond folds to handle shifts.
2021-04-08 17:39:11 +01:00
Jason Merrill 9f74f9cf47 c++: improve reference binding diagnostic [PR91849]
Here we were complaining about binding the lvalue reference to the rvalue
result of converting from float to int, but didn't mention that conversion.
Talk about the type of the initializer instead.

gcc/cp/ChangeLog:

	PR c++/91849
	* call.c (convert_like_internal): Improve reference diagnostic.

gcc/testsuite/ChangeLog:

	PR c++/91849
	* g++.dg/conversion/pr66211.C: Adjust diagnostic.
	* g++.dg/conversion/ref7.C: New test.
2021-04-08 12:02:27 -04:00
Maciej W. Rozycki 94279aacd0 VAX: Fix comment for `*bit<mode>' pattern's peephole
The comment for a peephole provided for the `*bit<mode>' pattern to be
produced in comparison elimination from a sequence involving a bitwise
complement operation of one input operand followed by a bitwise AND
operation between a bitwise complement of said intermediate result and
the other input operand (which corresponds to a sequence of MCOM and BIC
machine instructions) incorrectly refers to the first operation as MNEG
(which is the machine instruction for arithmetic negation) rather than
MCOM as it is supposed to.  Fix it.

	gcc/
	* config/vax/vax.md: Fix comment for `*bit<mode>' pattern's
	peephole.
2021-04-08 16:55:49 +01:00
Jakub Jelinek 559d2f1e0e c++: Don't cache constexpr functions which are passed pointers to heap or static vars being constructed [PR99859]
When cxx_bind_parameters_in_call is called e.g. on a method on an automatic
variable, we evaluate the argument and because ADDR_EXPR of an automatic
decl is not TREE_CONSTANT, we set *non_constant_args and don't cache it.
But when it is called on an object located on the heap (allocated using
C++20 constexpr new) where we represent it as TREE_STATIC artificial
var, or when it is called on a static var that is currently being
constructed, such ADDR_EXPRs are TREE_CONSTANT and we happily cache
such calls, but they can in those cases have side-effects in the heap
or static var objects and so caching them means such side-effects will
happen only once and not as many times as that method or function is called.
Furthermore, as Patrick mentioned in the PR, the argument doesn't need to be
just ADDR_EXPR of the heap or static var or its components, but it could be
a CONSTRUCTOR that has the ADDR_EXPR embedded anywhere.
And the incorrectly cached function doesn't need to modify the pointed vars
or their components, but some caller could be changing them in between the
call that was cached and the call that used the cached result.

The following patch fixes it by setting *non_constant_args also when
the argument contains somewhere such an ADDR_EXPR, either of a heap
artificial var or component thereof, or of a static var currently being
constructed (where for that it uses the same check as
cxx_eval_store_expression, ctx->global->values.get (...); addresses of
other static variables would be rejected by cxx_eval_store_expression
and therefore it is ok to cache such calls).

2021-04-08  Jakub Jelinek  <jakub@redhat.com>

	PR c++/99859
	* constexpr.c (addr_of_non_const_var): New function.
	(cxx_bind_parameters_in_call): Set *non_constant_args to true
	even if cp_walk_tree on arg with addr_of_non_const_var callback
	returns true.

	* g++.dg/cpp1y/constexpr-99859-1.C: New test.
	* g++.dg/cpp1y/constexpr-99859-2.C: New test.
	* g++.dg/cpp2a/constexpr-new18.C: New test.
	* g++.dg/cpp2a/constexpr-new19.C: New test.
2021-04-08 17:19:12 +02:00
Patrick Palka ca4641a3b5 libstdc++: Address remaining to_chars/long_double.cc FAILs [PR98384]
This works around the remaining reported execution FAILs of this test on
AIX, Solaris and Darwin.  Eventually we should rewrite this test to be
less fragile, but there's not enough time to do that for GCC 11.

libstdc++-v3/ChangeLog:

	PR libstdc++/98384
	* testsuite/20_util/to_chars/long_double.cc: Don't run the test
	on targets without a large long double.  XFAIL the execution on
	targets with a non-conforming printf.
2021-04-08 11:10:58 -04:00
Martin Sebor d6cc745cb8 PR middle-end/99883 - A couple of minor misspellings
gcc/c-family/ChangeLog:

	PR middle-end/99883
	* c.opt (Wmismatched-new-delete): Correct spelling.

gcc/lto/ChangeLog:

	PR middle-end/99883
	* lto-lang.c (lto_post_options): Correct spelling.
2021-04-08 09:08:39 -06:00
Patrick Palka a25321ca06 libstdc++: Reimplement range adaptors [PR99433]
This rewrites our range adaptor implementation for more comprehensible
error messages, improved SFINAE behavior and conformance to P2281.

The diagnostic improvements mostly come from using appropriately named
functors instead of lambdas in the generic implementation of partial
application and composition of range adaptors, and in the definition of
each of the standard range adaptors.  This makes their pretty printed
types much shorter and more self-descriptive.

The improved SFINAE behavior comes from constraining the range adaptors'
member functions appropriately.  This improvement fixes PR99433, and is
also necessary in order to implement the wording changes of P2281.

Finally, P2281 clarified that partial application and composition of
range adaptors behaves like a perfect forwarding call wrapper.  This
patch implements this, except that we don't bother adding overloads for
forwarding captured state entities as non-const lvalues, since it seems
sufficient to handle the const lvalue and non-const rvalue cases for now,
given the current set of standard range adaptors.  But such overloads
can be easily added if they turn out to be needed.

libstdc++-v3/ChangeLog:

	PR libstdc++/99433
	* include/std/ranges (__adaptor::__maybe_refwrap): Remove.
	(__adaptor::__adaptor_invocable): New concept.
	(__adaptor::__adaptor_partial_app_viable): New concept.
	(__adaptor::_RangeAdaptorClosure): Rewrite, turning it into a
	non-template base class.
	(__adaptor::_RangeAdaptor): Rewrite, turning it into a CRTP base
	class template.
	(__adaptor::_Partial): New class template that represents
	partial application of a range adaptor non-closure.
	(__adaptor::__pipe_invocable): New concept.
	(__adaptor::_Pipe): New class template.
	(__detail::__can_ref_view): New concept.
	(__detail::__can_subrange): New concept.
	(all): Replace the lambda here with ...
	(_All): ... this functor.  Add appropriate constraints.
	(__detail::__can_filter_view): New concept.
	(filter, _Filter): As in all/_All.
	(__detail::__can_transform): New concept.
	(transform, _Transform): As in all/_All.
	(__detail::__can_take_view): New concept.
	(take, _Take): As in all/_All.
	(__detail::__can_take_while_view): New concept.
	(take_while, _TakeWhile): As in all/_All.
	(__detail::__can_drop_view): New concept.
	(drop, _Drop): As in all/_All.
	(__detail::__can_drop_while_view): New concept.
	(drop_while, _DropWhile): As in all/_All.
	(__detail::__can_join_view): New concept.
	(join, _Join): As in all/_All.
	(__detail::__can_split_view): New concept.
	(split, _Split): As in all/_All.  Rename template parameter
	_Fp to _Pattern.
	(__detail::__already_common): New concept.
	(__detail::__can_common_view): New concept.
	(common, _Common): As in all/_All.
	(__detail::__can_reverse_view): New concept.
	(reverse, _Reverse): As in all/_All.
	(__detail::__can_elements_view): New concept.
	(elements, _Elements): As in all/_All.
	(keys, values): Adjust.
	* testsuite/std/ranges/adaptors/99433.cc: New test.
	* testsuite/std/ranges/adaptors/all.cc: No longer expect that
	adding empty range adaptor closure objects to a pipeline doesn't
	increase the size of the pipeline.
	(test05): New test.
	* testsuite/std/ranges/adaptors/common.cc (test03): New test.
	* testsuite/std/ranges/adaptors/drop.cc (test09): New test.
	* testsuite/std/ranges/adaptors/drop_while.cc (test04): New test.
	* testsuite/std/ranges/adaptors/elements.cc (test04): New test.
	* testsuite/std/ranges/adaptors/filter.cc (test06): New test.
	* testsuite/std/ranges/adaptors/join.cc (test09): New test.
	* testsuite/std/ranges/adaptors/p2281.cc: New test.
	* testsuite/std/ranges/adaptors/reverse.cc (test07): New test.
	* testsuite/std/ranges/adaptors/split.cc (test01, test04):
	Adjust.
	(test09): New test.
	* testsuite/std/ranges/adaptors/split_neg.cc (test01): Adjust
	expected error message.
	(test02): Likewise.  Extend test.
	* testsuite/std/ranges/adaptors/take.cc (test06): New test.
	* testsuite/std/ranges/adaptors/take_while.cc (test05): New test.
	* testsuite/std/ranges/adaptors/transform.cc (test07, test08):
	New test.
2021-04-08 10:40:19 -04:00
Richard Sandiford 860c5caf8c testsuite: Fix gcc.dg/vect/pr99102.c
pr99102.c needs to override the default options to exercise the original
problem, but that means that it also needs to respecify the dump flags.

gcc/testsuite/
	* gcc.dg/vect/pr99102.c: Add -fdump-tree-vect-details.
2021-04-08 15:00:05 +01:00
Richard Sandiford cc6c157200 testsuite: Update error messages in sve/acle/general-c
The “previous definition of 'x'” notes now include the type
of the original definition before “was here”.  There's not really
any need to hard-code that much of the message in the ACLE tests,
so this patch just removes the “was here” from the match string.

gcc/testsuite/

	* gcc.target/aarch64/sve/acle/general-c/func_redef_1.c: Remove
	"was here" from error message.
	* gcc.target/aarch64/sve/acle/general-c/func_redef_2.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/func_redef_3.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/func_redef_6.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_1.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_2.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_3.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_4.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_5.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_6.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_8.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_9.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_10.c: Likewise.
	* gcc.target/aarch64/sve/acle/general-c/type_redef_13.c: Likewise.
2021-04-08 15:00:05 +01:00
Richard Sandiford a45fe62102 testsuite: Fix Advanced SIMD failures for SVE
This patch just adds some missing +nosve directives to Advanced
SIMD vectorisation tests.

gcc/testsuite/
	* gcc.target/aarch64/asimd-mull-elem.c: Add +nosve.
	* gcc.target/aarch64/pr98772.c: Likewise.
	* gcc.target/aarch64/simd/vect_su_add_sub.c: Likewise.
2021-04-08 15:00:04 +01:00
Richard Sandiford d3f78917e1 testsuite: Fix sve/mul_2.c failures
Some sve/mul_2.c tests were failing because we'd (reasonably)
decided to use shifts and adds instead of MULs for some simple
negative constants.  We'd already needed to avoid that when
picking positive constants, so this patch does the same thing
for the negative ones.

gcc/testsuite/
	* gcc.target/aarch64/sve/mul_2.c: Adjust negative constants to avoid
	conversion to shifts and adds.
2021-04-08 15:00:03 +01:00
Jonathan Wakely acbbb82ea3 maintainer-scripts: Disable multilib when generating libstdc++ docs
This allows the docs to be generated on hosts without the necessary
files present for multilib support.

maintainer-scripts/ChangeLog:

	* generate_libstdcxx_web_docs: Add --disable-multilib to
	configure command.
2021-04-08 14:51:03 +01:00
Jonathan Wakely 2c1557ac7b libstdc++: Fix Doxygen warning about ambiguous file name
libstdc++-v3/ChangeLog:

	* include/std/string_view: Adjust Doxygen @file comment.
2021-04-08 14:51:03 +01:00
David Malcolm 3a66c289a3 analyzer: fix leak false +ves due to maybe-clobbered regions [PR99042,PR99774]
Prior to this patch, program_state::detect_leaks worked by finding all
live svalues in the old state and in the new state, and calling
on_svalue_leak for each svalue that has changed from being live to
not being live.

PR analyzer/99042 and PR analyzer/99774 both describe false leak
diagnostics from -fanalyzer (a false FILE * leak in git, and a false
malloc leak in qemu, respectively).

In both cases the root cause of the false leak diagnostic relates to
svalues no longer being explicitly bound in the store due to regions
being conservatively clobbered, due to an unknown function being
called, or due to a write through a pointer that could alias the
region, respectively.

We have a transition from an svalue being explicitly live to not
being explicitly live - but only because the store is being
conservative, clobbering the binding.  The leak detection is looking
for transitions from "definitely live" to "not definitely live",
when it should be looking for transitions from "definitely live"
to "definitely not live".

This patch introduces a new class to temporarily capture information
about svalues that were explicitly live, but for which a region bound
to them got clobbered for conservative reasons.  This new
"uncertainty_t" class is passed around to capture the data long enough
for use in program_state::detect_leaks, where it is used to only
complain about svalues that were definitely live and are now both
not definitely live *or* possibly-live i.e. definitely not-live.

The class also captures for which svalues we can't meaningfully track
sm-state anymore, and resets the svalues back to the "start" state.

Together, these changes fix the false leak reports.

gcc/analyzer/ChangeLog:
	PR analyzer/99042
	PR analyzer/99774
	* engine.cc
	(impl_region_model_context::impl_region_model_context): Add
	uncertainty param and use it to initialize m_uncertainty.
	(impl_region_model_context::get_uncertainty): New.
	(impl_sm_context::get_fndecl_for_call): Add NULL for new
	uncertainty param when constructing impl_region_model_context.
	(impl_sm_context::get_state): Likewise.
	(impl_sm_context::set_next_state): Likewise.
	(impl_sm_context::warn): Likewise.
	(exploded_node::on_stmt): Add uncertainty param
	and use it when constructing impl_region_model_context.
	(exploded_node::on_edge): Add uncertainty param and pass
	to on_edge call.
	(exploded_node::detect_leaks): Create uncertainty_t and pass to
	impl_region_model_context.
	(exploded_graph::get_or_create_node): Create uncertainty_t and
	pass to prune_for_point.
	(maybe_process_run_of_before_supernode_enodes): Create
	uncertainty_t and pass to impl_region_model_context.
	(exploded_graph::process_node): Create uncertainty_t instances and
	pass around as needed.
	* exploded-graph.h
	(impl_region_model_context::impl_region_model_context): Add
	uncertainty param.
	(impl_region_model_context::get_uncertainty): New decl.
	(impl_region_model_context::m_uncertainty): New field.
	(exploded_node::on_stmt): Add uncertainty param.
	(exploded_node::on_edge): Likewise.
	* program-state.cc (sm_state_map::on_liveness_change): Get
	uncertainty from context and use it to unset sm-state from
	svalues as appropriate.
	(program_state::on_edge): Add uncertainty param and use it when
	constructing impl_region_model_context.  Fix indentation.
	(program_state::prune_for_point): Add uncertainty param and use it
	when constructing impl_region_model_context.
	(program_state::detect_leaks): Get any uncertainty from ctxt and
	use it to get maybe-live svalues for dest_state, rather than
	definitely-live ones; use this when determining which svalues
	have leaked.
	(selftest::test_program_state_merging): Create uncertainty_t and
	pass to impl_region_model_context.
	* program-state.h (program_state::on_edge): Add uncertainty param.
	(program_state::prune_for_point): Likewise.
	* region-model-impl-calls.cc (call_details::get_uncertainty): New.
	(region_model::impl_call_memcpy): Pass uncertainty to
	mark_region_as_unknown call.
	(region_model::impl_call_memset): Likewise.
	(region_model::impl_call_strcpy): Likewise.
	* region-model-reachability.cc (reachable_regions::handle_sval):
	Also add sval to m_mutable_svals.
	* region-model.cc (region_model::on_assignment): Pass any
	uncertainty from ctxt to the store::set_value call.
	(region_model::handle_unrecognized_call): Get any uncertainty from
	ctxt and use it to record mutable svalues at the unknown call.
	(region_model::get_reachable_svalues): Add uncertainty param and
	use it to mark any maybe-bound svalues as being reachable.
	(region_model::set_value): Pass any uncertainty from ctxt to the
	store::set_value call.
	(region_model::mark_region_as_unknown): Add uncertainty param and
	pass it on to the store::mark_region_as_unknown call.
	(region_model::update_for_call_summary): Add uncertainty param and
	pass it on to the region_model::mark_region_as_unknown call.
	* region-model.h (call_details::get_uncertainty): New decl.
	(region_model::get_reachable_svalues): Add uncertainty param.
	(region_model::mark_region_as_unknown): Add uncertainty param.
	(region_model_context::get_uncertainty): New vfunc.
	(noop_region_model_context::get_uncertainty): New vfunc
	implementation.
	* store.cc (dump_svalue_set): New.
	(uncertainty_t::dump_to_pp): New.
	(uncertainty_t::dump): New.
	(binding_cluster::clobber_region): Pass NULL for uncertainty to
	remove_overlapping_bindings.
	(binding_cluster::mark_region_as_unknown): Add uncertainty param
	and pass it to remove_overlapping_bindings.
	(binding_cluster::remove_overlapping_bindings): Add uncertainty param.
	Use it to record any svalues that were in clobbered bindings.
	(store::set_value): Add uncertainty param.  Pass it to
	binding_cluster::mark_region_as_unknown when handling symbolic
	regions.
	(store::mark_region_as_unknown): Add uncertainty param and pass it
	to binding_cluster::mark_region_as_unknown.
	(store::remove_overlapping_bindings): Add uncertainty param and
	pass it to binding_cluster::remove_overlapping_bindings.
	* store.h (binding_cluster::mark_region_as_unknown): Add
	uncertainty param.
	(binding_cluster::remove_overlapping_bindings): Likewise.
	(store::set_value): Likewise.
	(store::mark_region_as_unknown): Likewise.

gcc/testsuite/ChangeLog:
	PR analyzer/99042
	PR analyzer/99774
	* gcc.dg/analyzer/pr99042.c: New test.
	* gcc.dg/analyzer/pr99774-1.c: New test.
	* gcc.dg/analyzer/pr99774-2.c: New test.
2021-04-08 09:46:03 -04:00
Iain Buclaw 8e84a14291 d: Update language attribute support, and implement gcc.attributes
D attribute support has been updated to have a baseline parity with the
LLVM D compiler's own `ldc.attributes'.

The handler that extracts GCC attributes from a list of UDAs has been
improved to take care of some mistakes that could have been warnings.
UDAs attached to field variables are also now processed for any GCC
attributes attached to them.

The following new attributes have been added to the D front-end:

 - @attribute("alloc_size")
 - @attribute("used")
 - @attribute("optimize")
 - @attribute("restrict")
 - @attribute("cold")
 - @attribute("noplt")
 - @attribute("target_clones")
 - @attribute("no_icf")
 - @attribute("noipa")
 - @attribute("symver")

With convenience aliases in a new `gcc.attributes' module to match
the same naming convention as `ldc.attributes':

 - @allocSize()
 - @assumeUsed
 - @fastmath
 - @naked
 - @restrict
 - @cold
 - @noplt
 - @optStrategy()
 - @polly
 - @section()
 - @target()
 - @weak

The old gcc.attribute module has been deprecated, along with the removal
of the following attribute handlers:

 - @attribute("alias"): Has been superseded by `pragma(mangle)'.
 - @attribute("forceinline"): Renamed to always_inline.

gcc/d/ChangeLog:

	* d-attribs.cc: Include fold-const.h and opts.h.
	(attr_noreturn_exclusions): Add alloc_size.
	(attr_const_pure_exclusions): Likewise.
	(attr_inline_exclusions): Add target_clones.
	(attr_noinline_exclusions): Rename forceinline to always_inline.
	(attr_target_exclusions): New array.
	(attr_target_clones_exclusions): New array.
	(attr_alloc_exclusions): New array.
	(attr_cold_hot_exclusions): New array.
	(d_langhook_common_attribute_table): Add new D attribute handlers.
	(build_attributes): Update to look for gcc.attributes.  Issue warning
	if not given a struct literal.  Handle void initialized arguments.
	(handle_always_inline_attribute): Remove function.
	(d_handle_noinline_attribute): Don't extract TYPE_LANG_FRONTEND.
	(d_handle_forceinline_attribute): Rename to...
	(d_handle_always_inline_attribute): ...this.  Remove special handling.
	(d_handle_flatten_attribute): Don't extract TYPE_LANG_FRONTEND.
	(d_handle_target_attribute): Likewise.  Warn about empty arguments.
	(d_handle_target_clones_attribute): New function.
	(optimize_args): New static variable.
	(parse_optimize_options): New function.
	(d_handle_optimize_attribute): New function.
	(d_handle_noclone_attribute): Don't extract TYPE_LANG_FRONTEND.
	(d_handle_alias_attribute): Remove function.
	(d_handle_noicf_attribute): New function.
	(d_handle_noipa_attribute): New function.
	(d_handle_section_attribute): Call the handle_generic_attribute target
	hook after performing target independent processing.
	(d_handle_symver_attribute): New function.
	(d_handle_noplt_attribute): New function.
	(positional_argument): New function.
	(d_handle_alloc_size_attribute): New function.
	(d_handle_cold_attribute): New function.
	(d_handle_restrict_attribute): New function.
	(d_handle_used_attribute): New function.
	* decl.cc (gcc_attribute_p): Update to look for gcc.attributes.
	(get_symbol_decl): Update decl source location of old prototypes to
	the new declaration being merged.
	* types.cc (layout_aggregate_members): Apply user defined attributes
	on fields.

libphobos/ChangeLog:

	* libdruntime/Makefile.am (DRUNTIME_DSOURCES): Add
	  gcc/attributes.d.
	* libdruntime/Makefile.in: Regenerate.
	* libdruntime/gcc/attribute.d: Deprecate module, publicly import
	gcc.attributes.
	* libdruntime/gcc/deh.d: Update imports.
	* libdruntime/gcc/attributes.d: New file.

gcc/testsuite/ChangeLog:

	* gdc.dg/gdc108.d: Update test.
	* gdc.dg/gdc142.d: Likewise.
	* gdc.dg/pr90136a.d: Likewise.
	* gdc.dg/pr90136b.d: Likewise.
	* gdc.dg/pr90136c.d: Likewise.
	* gdc.dg/pr95173.d: Likewise.
	* gdc.dg/attr_allocsize1.d: New test.
	* gdc.dg/attr_allocsize2.d: New test.
	* gdc.dg/attr_alwaysinline1.d: New test.
	* gdc.dg/attr_cold1.d: New test.
	* gdc.dg/attr_exclusions1.d: New test.
	* gdc.dg/attr_exclusions2.d: New test.
	* gdc.dg/attr_flatten1.d: New test.
	* gdc.dg/attr_module.d: New test.
	* gdc.dg/attr_noclone1.d: New test.
	* gdc.dg/attr_noicf1.d: New test.
	* gdc.dg/attr_noinline1.d: New test.
	* gdc.dg/attr_noipa1.d: New test.
	* gdc.dg/attr_noplt1.d: New test.
	* gdc.dg/attr_optimize1.d: New test.
	* gdc.dg/attr_optimize2.d: New test.
	* gdc.dg/attr_optimize3.d: New test.
	* gdc.dg/attr_optimize4.d: New test.
	* gdc.dg/attr_restrict1.d: New test.
	* gdc.dg/attr_section1.d: New test.
	* gdc.dg/attr_symver1.d: New test.
	* gdc.dg/attr_target1.d: New test.
	* gdc.dg/attr_targetclones1.d: New test.
	* gdc.dg/attr_used1.d: New test.
	* gdc.dg/attr_used2.d: New test.
	* gdc.dg/attr_weak1.d: New test.
	* gdc.dg/imports/attributes.d: New test.
2021-04-08 15:30:47 +02:00
Martin Liska 855ce47588 Fix wrong assert in branch_changer.py.
maintainer-scripts/ChangeLog:

	* branch_changer.py: Fix wrongly converted assert.
2021-04-08 15:20:04 +02:00
Martin Liska 9e07b0bfe8 Modernize branch_changer.py script.
maintainer-scripts/ChangeLog:

	* branch_changer.py: Modernize and fix flake8 issues.
	* setup.cfg: New file.
2021-04-08 14:45:01 +02:00
Jason Merrill ac24fa46e4 c++: improve specialization mismatch diagnostic [PR94529]
We were telling users they needed more template<> to specialize a member
template in a testcase with no member templates.  Only produce that message
if we actually see a member template, and also always print the candidates.

gcc/cp/ChangeLog:

	PR c++/94529
	* pt.c (determine_specialization): Improve diagnostic.

gcc/testsuite/ChangeLog:

	PR c++/94529
	* g++.dg/template/mem-spec2.C: New test.
2021-04-08 07:58:40 -04:00
Marek Polacek 2cd5333d16 c++: Fix ICE with unexpanded parameter pack [PR99844]
In explicit17.C, we weren't detecting an unexpanded parameter pack in
explicit(bool), so we crashed on a TEMPLATE_PARM_INDEX in constexpr.

I noticed the same is true for noexcept(), but only since my patch to
implement delayed parsing of noexcept.  Previously, we would detect the
unexpanded pack in push_template_decl but now the noexcept expression
has not yet been parsed, so we need to do it a bit later.

gcc/cp/ChangeLog:

	PR c++/99844
	* decl.c (build_explicit_specifier): Call
	check_for_bare_parameter_packs.
	* except.c (build_noexcept_spec): Likewise.

gcc/testsuite/ChangeLog:

	PR c++/99844
	* g++.dg/cpp2a/explicit16.C: Use c++20.
	* g++.dg/cpp0x/noexcept66.C: New test.
	* g++.dg/cpp2a/explicit17.C: New test.
2021-04-08 07:44:44 -04:00
Jonathan Wakely e34f88c955 libstdc++: Remove bogus ChangeLog entry 2021-04-08 12:18:01 +01:00
Jonathan Wakely 43ab1dc24a libstdc++: Make std::is_scoped_enum work with incomplete types
Tim Song pointed out that using __underlying_type is ill-formed for
incomplete enumeration types, and is_scoped_enum doesn't require a
complete type. This changes the trait to check for conversion to int
instead of to the underlying type.

In order to give the correct result when the trait is used in the
enumerator-list of an incomplete type the partial specialization for
enums has an additional check that fails for incomplete types. This
assumes that an incompelte enumeration type must be an unscoped
enumeration, and so the primary template (with a std::false_type base
characteristic) can be used. This isn't necessarily true, but it is not
currently possible to refer to a scoped enumeration type before its type
is complete (PR c++/89025).

It should be possible to use requires(remove_cv_t<_Tp> __t) in the
partial specialization's assignablility check, but that currently gives
an ICE (PR c++/99968) so there is an extra partial specialization of
is_scoped_enum<const _Tp> to handle const types.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_scoped_enum<T>): Constrain partial
	specialization to not match incomplete enum types. Use a
	requires-expression instead of instantiating is_convertible.
	(is_scoped_enum<const T>): Add as workaround for PR c++/99968.
	* testsuite/20_util/is_scoped_enum/value.cc: Check with
	incomplete types and opaque-enum-declarations.
2021-04-08 11:56:59 +01:00
Alex Coplan 67d56b2720 arm: Various MVE vec_duplicate fixes [PR99647]
This patch fixes various issues with vec_duplicate in the MVE patterns.
Currently there are two patterns named *mve_mov<mode>. The second of
these is really a vector duplicate rather than a move, so I've renamed
it accordingly.

As it stands, there are several issues with this pattern:
1. The MVE_types iterator has an entry for TImode, but
   vec_duplicate:TI is invalid.
2. The mode of the operand to vec_duplicate is SImode, but it should
   vary according to the vector mode iterator.
3. The second alternative of this pattern is bogus: it allows matching
   symbol_refs (the cause of the PR) and const_ints (which means that it
   matches (vec_duplicate (const_int ...)) which is non-canonical: such
   rtxes should be const_vectors instead and handled by the main vector
   move pattern).

This patch fixes all of these issues, and removes the redundant
*mve_vec_duplicate<mode> pattern.

gcc/ChangeLog:

	PR target/99647
	* config/arm/iterators.md (MVE_vecs): New.
	(V_elem): Also handle V2DF.
	* config/arm/mve.md (*mve_mov<mode>): Rename to ...
	(*mve_vdup<mode>): ... this. Remove second alternative since
	vec_duplicate of const_int is not canonical RTL, and we don't
	want to match symbol_refs.
	(*mve_vec_duplicate<mode>): Delete (pattern is redundant).

gcc/testsuite/ChangeLog:

	PR target/99647
	* gcc.c-torture/compile/pr99647.c: New test.
2021-04-08 09:36:57 +01:00
Xionghu Luo 0fb21ba799 Improve rtx insn vec output
print_rtl will dump the rtx_insn from current until LAST.  But it is only
useful to see the particular insn that called by print_rtx_insn_vec,
Let's call print_rtl_single to display that insn in the gcse and store-motion
pass dump.

2021-04-07  Xionghu Luo  <luoxhu@linux.ibm.com>

gcc/ChangeLog:

	* fold-const.c (fold_single_bit_test): Fix typo.
	* print-rtl.c (print_rtx_insn_vec): Call print_rtl_single
	instead.
2021-04-07 21:04:22 -05:00
GCC Administrator 299859c2a4 Daily bump. 2021-04-08 00:16:44 +00:00
Jason Merrill fb5ed6d8c9 c++: friend with redundant qualification [PR41723]
Different code paths were correctly choosing to look up D directly, since C
is the current instantiation, but here we decided to try to make it a
typename type, leading to confusion.  Fixed by using dependent_scope_p as we
do elsewhere.

gcc/cp/ChangeLog:

	PR c++/41723
	* parser.c (cp_parser_class_name): Check dependent_scope_p.

gcc/testsuite/ChangeLog:

	PR c++/41723
	* g++.dg/template/friend71.C: New test.
2021-04-07 17:01:52 -04:00
Jason Merrill b40d45cb19 c++: base template friend [PR52625]
Here we were mistakenly treating the injected-class-name as a partial
specialization.

gcc/cp/ChangeLog:

	PR c++/52625
	* pt.c (maybe_process_partial_specialization): Check
	DECL_SELF_REFERENCE_P.

gcc/testsuite/ChangeLog:

	PR c++/52625
	* g++.dg/template/friend70.C: New test.
2021-04-07 17:01:36 -04:00
Jason Merrill a528594cf9 c++: using overloaded with local decl [PR92918]
The problem here was that the lookup for 'impl' when parsing the template
only found the using-declaration, not the member function declaration.

This happened because when trying to add the member function declaration,
push_class_level_binding_1 saw that the current binding was a USING_DECL and
the new value is an overload, and decided to just return success.

That 'return true' dates back to r69921.  In
https://gcc.gnu.org/pipermail/gcc-patches/2003-July/110632.html Nathan
mentions that we only push dependent USING_DECLs, which is no longer the
case; now that we retain more USING_DECLs, handling this case like the other
overloaded function cases seems like the obvious solution.

gcc/cp/ChangeLog:

	PR c++/92918
	* name-lookup.c (push_class_level_binding_1): Do overload a new
	function with a previous using-declaration.

gcc/testsuite/ChangeLog:

	PR c++/92918
	* g++.dg/lookup/using66.C: New test.
2021-04-07 15:27:47 -04:00
Richard Sandiford 12029c04d0 testsuite: Fix many UNRESOLVEDs for gcc.dg/vect
It turns out that, on targets that use testglue, many gcc.dg/vect
scan-dump tests became UNRESOLVED after the change to the dump
file naming scheme.

The problem is that, when creating an executable, we normally name
the dump file after both the executable and the source file name.
However, as an exception, we name it after only the source file
name if:

(a) there is only one source file name and
(b) the source file and the executable have the same basename

Both (a) and (b) are normally true when building executables from
gcc.dg/vect.  But (a) is not true when linking against testglue.
The harness was therefore looking for a dump file based only on the
source file name while the compiler was producing a dump file that
contained both names.

We get around this for dg-additional-sources using:

	# This option restores naming of aux and dump output files
	# after input files when multiple input files are named,
	# instead of getting them combined with the output name.
	lappend options "additional_flags=-dumpbase \"\""

This patch does the same thing for executables that are linked
against testglue.  This removes over 2400 UNRESOLVEDs from an
armeb-eabi test run, but in so doing introduces FAILs for some
tests that were previously skipped.

gcc/testsuite/
	* lib/gcc.exp (gcc_target_compile): Add -dumpbase ""
	when building an executable with testglue.
2021-04-07 19:46:37 +01:00
Jonathan Wakely e06d3f5dd7 libstdc++: Fix filesystem::path construction from COW string [PR 99805]
Calling the non-const data() member on a COW string makes it "leaked",
possibly resulting in reallocating the string to ensure a unique owner.

The path::_M_split_cmpts() member parses its _M_pathname string using
string_view objects and then calls _M_pathname.data() to find the offset
of each string_view from the start of the string. However because
_M_pathname is non-const that will cause a COW string to reallocate if
it happens to be shared with another string object. This results in the
offsets calculated for each component being wrong (i.e. undefined)
because the string views no longer refer to substrings of the
_M_pathname member. The fix is to use the parse.offset(c) member which
gets the offset safely.

The bug only happens for the path(string_type&&) constructor and only
for COW strings. When constructed from an lvalue string the string's
contents are copied rather than just incrementing the refcount, so
there's no reallocation when calling the non-const data() member. The
testsuite changes check the lvalue case anyway, because we should
probably change the deep copying to just be a refcount increment (by
adding a path(const string_type&) constructor or an overload for
__effective_range(const string_type&), for COW strings only).

libstdc++-v3/ChangeLog:

	PR libstdc++/99805
	* src/c++17/fs_path.cc (path::_M_split_cmpts): Do not call
	non-const member on _M_pathname, to avoid copy-on-write.
	* testsuite/27_io/filesystem/path/decompose/parent_path.cc:
	Check construction from strings that might be shared.
2021-04-07 16:39:24 +01:00
Richard Sandiford 2f3d910461 vect: Restore variable-length SLP permutes [PR97513]
Many of the gcc.target/sve/slp-perm*.c tests started failing
after the introduction of separate SLP permute nodes.
This patch adds variable-length support using a similar
technique to vect_transform_slp_perm_load.

As there, the idea is to detect when every permute mask vector
is the same and can be generated using a regular stepped sequence.
We can easily handle those cases for variable-length, but still
need to restrict the general case to constant-length.

Again copying vect_transform_slp_perm_load, the idea is to distinguish
the two cases regardless of whether the length is variable or not,
partly to increase testing coverage and partly because it avoids
generating redundant trees.

Doing this means that we can also use SLP for the two-vector
permute in pr88834.c, which we couldn't before VEC_PERM_EXPR
nodes were introduced.  The patch therefore makes pr88834.c
check that we don't regress back to not using SLP and adds
pr88834_ld3.c to check for the original problem in the PR.

gcc/
	PR tree-optimization/97513
	* tree-vect-slp.c (vect_add_slp_permutation): New function,
	split out from...
	(vectorizable_slp_permutation): ...here.  Detect cases in which
	all VEC_PERM_EXPRs are guaranteed to have the same stepped
	permute vector and only generate one permute vector for that case.
	Extend that case to handle variable-length vectors.

gcc/testsuite/
	* gcc.target/aarch64/sve/pr88834.c: Expect the vectorizer to use SLP.
	* gcc.target/aarch64/sve/pr88834_ld3.c: New test.
2021-04-07 15:21:56 +01:00