Commit Graph

192685 Commits

Author SHA1 Message Date
Marek Polacek
ccae4443c8 c++: wrong error with variadic concept [PR105268]
Here we issue a wrong error for the

  template<typename T = S<C_many<int>>> void g();

line in the testcase.  I surmise that's because we mistakenly parse
C_many<int> as a placeholder-type-specifier, and things go wrong from
there.  We are in a default argument so we should reject parsing C_many<int>
as a placeholder-type-specifier, which would mean creating a new parameter.
We want C_many<int> to be a concept-id instead.

It's interesting to see why the same problem didn't occur for C_one<int>.
In that case, cp_parser_placeholder_type_specifier -> finish_type_constraints
-> build_type_constraint -> build_concept_check -> build_standard_check ->
coerce_template_parms fails the parse here:

 8916   nargs = inner_args ? NUM_TMPL_ARGS (inner_args) : 0;
 8917   if ((nargs - variadic_args_p > nparms && !variadic_p)
 8918       || (nargs < nparms - variadic_p
 8919           && require_all_args
 8920           && !variadic_args_p
 8921           && (!use_default_args
 8922               || (TREE_VEC_ELT (parms, nargs) != error_mark_node
 8923                   && !TREE_PURPOSE (TREE_VEC_ELT (parms, nargs))))))
 8924     {
 8925     bad_nargs:
 ...
 8943       return error_mark_node;

because nargs is 2 (the targs are <WILDCARD_DECL, int>) while nparms is
1 (for the one 'typename' in the tparam list of C_one).  But for
C_many<int> variadic_p is true so we don't return error_mark_node but
<type_argument_pack>.

This patch does not issue any error for the !tentative case because
I didn't figure out how to trigger that.  So it adds an assert instead.

	PR c++/105268

gcc/cp/ChangeLog:

	* parser.cc (cp_parser_placeholder_type_specifier): Return
	error_mark_node when trying to build up a constrained parameter in
	a default argument.

gcc/testsuite/ChangeLog:

	* g++.dg/concepts/variadic6.C: New test.
2022-04-15 09:59:11 -04:00
Patrick Palka
a54137c880 libstdc++: Optimize integer std::from_chars
This applies the following optimizations to the integer std::from_chars
implementation:

  1. Use a lookup table for converting an alphanumeric digit to its
     base-36 value instead of using a range test (for 0-9) and switch
     (for a-z and A-Z).  The table is constructed using a C++14
     constexpr function which doesn't assume a particular character
     encoding or __CHAR_BIT__ value.  This new conversion function
     __from_chars_alnum_to_val is templated on whether we care
     only about the decimal digits, in which case we can perform the
     conversion with a single subtraction since the digit characters
     are guaranteed to be contiguous (unlike the letters).
  2. Generalize __from_chars_binary to handle all power-of-two bases.
     This function (now named __from_chars_pow2_base) is also templated
     on whether we care only about the decimal digits for the benefit of
     faster digit conversion for base 2, 4 and 8.
  3. In __from_chars_digit, use
       static_cast<unsigned char>(__c - '0') < __base
     instead of
       '0' <= __c && __c <= ('0' + (__base - 1)).
     as the digit recognition test (exhaustively verified that the two
     tests are equivalent).
  4. In __from_chars_alnum, use a nested loop to consume the rest of the
     digits in the overflow case (mirroring __from_chars_digit) so that
     the main loop doesn't have to maintain the overflow flag __valid.

At this point, __from_chars_digit is nearly identical to
__from_chars_alnum, so this patch merges the two functions by removing
the former and templatizing the latter according to whether we care only
about the decimal digits.  Finally,

  5. In __from_chars_alnum, maintain a lower bound on the number of
     unused bits in the result and use it to omit the overflow check
     when it's safe to do so.

In passing, this patch replaces the non-portable function ascii_to_hexit
used by __floating_from_chars_hex with the new conversion function.

Some runtime measurements for a simple 15-line benchmark that roundtrips
printing/parsing 200 million integers via std::to/from_chars (average of
5 runs):

  Base  Before  After (seconds, lower is better)
     2    9.37   9.37
     3   15.79  12.13
     8    4.15   3.67
    10    4.90   3.86
    11    6.84   5.03
    16    4.14   2.93
    32    3.85   2.39
    36    5.22   3.26

libstdc++-v3/ChangeLog:

	* include/std/charconv (__from_chars_alnum_to_val_table): Define.
	(__from_chars_alnum_to_val): Define.
	(__from_chars_binary): Rename to ...
	(__from_chars_pow2_base): ... this.  Generalize to handle any
	power-of-two base using __from_chars_alnum_to_val.
	(__from_chars_digit): Optimize digit recognition to a single
	test instead of two tests.  Use [[__unlikely___]] attribute.
	(__from_chars_alpha_to_num): Remove.
	(__from_chars_alnum): Use __from_chars_alnum_to_val.  Use a
	nested loop for the overflow case.  Maintain a lower bound
	on the number of available bits in the result and use it to
	omit the overflow check.
	(from_chars): Adjust appropriately.
	* src/c++17/floating_from_chars.cc (ascii_to_hexit): Remove.
	(__floating_from_chars_hex): Use __from_chars_alnum_to_val
	to recognize a hex digit instead.
2022-04-15 09:34:09 -04:00
Hongyu Wang
a335a94a1b i386: Correct target attribute for crc32 intrinsics
Complile _mm_crc32_u8/16/32/64 intrinsics with -mcrc32
would meet target specific option mismatch. Correct target pragma
to fix.

gcc/ChangeLog:

	* config/i386/smmintrin.h: Correct target pragma from sse4.1
	and sse4.2 to crc32 for crc32 intrinsics.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/crc32-6.c: Adjust dg-error message.
	* gcc.target/i386/crc32-7.c: New test.
2022-04-15 20:18:11 +08:00
Jason Merrill
e580f81d22 c++: unsigned int32_t enum promotion [PR102804]
There's been an extension for a long time to allow applying 'unsigned' to an
int typedef, but that was confusing the integer promotion code.  Fixed by
forgetting about the typedef in that case.

I'm going to make this an unconditional pedwarn in stage 1.

	PR c++/102804

gcc/cp/ChangeLog:

	* decl.cc (grokdeclarator): Drop typedef used with 'unsigned'.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/unsigned-typedef1.C: New test.
2022-04-14 21:55:08 -04:00
Jason Merrill
6364a39907 c++: using in diagnostics [PR102987]
The expression pretty-printing code crashed on a location wrapper with no
type, and didn't know what to do with a USING_DECL.

	PR c++/102987

gcc/cp/ChangeLog:

	* error.cc (dump_expr): Handle USING_DECL.
	[VIEW_CONVERT_EXPR]: Just look through location wrapper.

gcc/testsuite/ChangeLog:

	* g++.dg/diagnostic/using1.C: New test.
2022-04-14 21:00:14 -04:00
GCC Administrator
031bd52e48 Daily bump. 2022-04-15 00:16:48 +00:00
Joseph Myers
f5cd166ffd Update gcc de.po, fr.po, sv.po
* de.po, fr.po, sv.po: Update.
2022-04-14 22:59:20 +00:00
David Malcolm
a358e4b608 analyzer: fix escaping of pointer arithmetic [PR105264]
PR analyzer/105264 reports that the analyzer can fail to treat
(PTR + IDX) and PTR[IDX] as referring to the same memory under
some situations.

There are various ways in which this can happen when IDX is a
symbolic value, due to having several ways in which such memory
regions can be referred to symbolically.  I attempted to fix this by
being smarter when folding svalues and regions, but this fix
seems too fiddly to attempt in stage 4.

Instead, this less ambitious patch fixes a false positive from
-Wanalyzer-use-of-uninitialized-value by making the analyzer's escape
analysis smarter, so that it treats *PTR as escaping when
(PTR + OFFSET) is passed to an external function, and thus
it treats *PTR as possibly-initialized (the "passing &PTR[IDX]" case
was already working).

gcc/analyzer/ChangeLog:
	PR analyzer/105264
	* region-model-reachability.cc (reachable_regions::handle_parm):
	Use maybe_get_deref_base_region rather than just region_svalue, to
	handle pointer arithmetic also.
	* svalue.cc (svalue::maybe_get_deref_base_region): New.
	* svalue.h (svalue::maybe_get_deref_base_region): New decl.

gcc/testsuite/ChangeLog:
	PR analyzer/105264
	* gcc.dg/analyzer/torture/symbolic-10.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-14 18:42:34 -04:00
Ian Lance Taylor
af27d545dc runtime: use regset indexes for PPC register values
Using names depended on <asm/ptrace.h>, which glibc includes somewhere
but musl did not.  Change to just always use indexes.

Based on patch by Sören Tempel.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/400214
2022-04-14 15:14:57 -07:00
Jason Merrill
c5de3444c4 c++: constexpr trivial -fno-elide-ctors [PR104646]
The constexpr constructor checking code got confused by the expansion of a
trivial copy constructor; we don't need to do that checking for defaulted
ctors, anyway.

	PR c++/104646

gcc/cp/ChangeLog:

	* constexpr.cc (maybe_save_constexpr_fundef): Don't do extra
	checks for defaulted ctors.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/constexpr-fno-elide-ctors1.C: New test.
2022-04-14 17:09:57 -04:00
Iain Sandoe
82536fbb8a libgccjit: Fix a bootstrap break for some targets.
Some targets use 'long long unsigned int' for unsigned HW int, and this
leads to a Werror=format= fail for two print cases in jit-playback.cc
introduced in r12-8117-g30f7c83e9cfe (Add support for bitcasts [PR104071])

As discussed on IRC, casting to (long) seems entirely reasonable for the
values (since they are type sizes).

tested that this fixes bootstrap on x86_64-darwin19 and running check-jit.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>

gcc/jit/ChangeLog:

	* jit-playback.cc (new_bitcast): Cast values returned by tree_to_uhwi
	to 'long' to match the print format.
2022-04-14 20:15:55 +01:00
Jason Merrill
74b2e20222 c++: lambda and the current instantiation [PR82980]
When a captured variable is type-dependent, we've expressed the type of the
capture field and proxy with a decltype variant.  But if the type is "the
current instantiation", we need to be able to see that so that we can do
lookup inside it just like we could with the captured variable itself.

I also tried looking through lambda capture in
cp_parser_postfix_dot_deref_expression, but this way seems cleaner.  I plan
to treat more types as deducible in stage 1.

I considered also using this in do_auto_deduction, but think that would be
wrong: [temp.dep.expr] says an id-expression is type-dependent if it is
"associated by name lookup with a variable declared with a type that
contains a placeholder type where the initializer is type-dependent".  That
doesn't clearly exclude deducing a dependent type from the initializer, but
it seems like a barrier, and other implementations agree.

	PR c++/82980

gcc/cp/ChangeLog:

	* lambda.cc (type_deducible_expression_p): New.
	(lambda_capture_field_type): Check it.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/lambda/lambda-current-inst1.C: New test.
2022-04-14 14:51:49 -04:00
Indu Bhagat
d634c5d7c7 Refactor and update CTF testcases [PR105089]
This commit splits the ctf-array-2.c into ctf-array-5.c and
ctf-variables.c with the following responsibilities:

[1] ctf-array-2.c: Test CTF generation for unsized arrays.
[2] ctf-array-5.c: Test CTF generation for unsized but initialized array.
[3] ctf-variables-3.c: Test CTF generation for extern variable with defining
decl.

Earlier all three tests above were being done in ctf-array-2.c.  The
checks around [3] were very loose in the original version of ctf-array-2.c
in that the testcase was only checking that the types are as expected.  The
compiler was emitting two CTF variable records as follows:

 Variables:
  _CTF_NEWSTR ->  5: const const char [0] (size 0x0) -> 4: const char [0] (size 0x0)
  _CTF_NEWSTR ->  8: const const char [8] (size 0x8) -> 7: const char [8] (size 0x8)

This is incorrect behaviour as it creates ambiguity.  The testcase
ctf-variables-3.c now has added checks that only one CTF variable record
is expected.

2022-04-14  Indu Bhagat  <indu.bhagat@oracle.com>

gcc/testsuite/ChangeLog:

	PR debug/105089
	* gcc.dg/debug/ctf/ctf-array-2.c: Refactor testcase.  Move some
	checks ...
	* gcc.dg/debug/ctf/ctf-array-5.c: ... to here.
	* gcc.dg/debug/ctf/ctf-variables-3.c: ... and here.  Add
	additional checks for one CTF variable and one CTF object info
	record.
2022-04-14 10:04:16 -07:00
Indu Bhagat
d0b00e74bf CTF for extern variable fix [PR105089]
The CTF format cannot differentiate between a non-defining extern
variable declaration vs. a defining variable declaration (unlike DWARF).
So, the correct behaviour wrt the compiler generating CTF for such
extern variables (i.e., when both the defining and non-defining decl
are present in the same CU) is to simply emit the CTF variable
correspoding to the defining declaration.

To carry out the above, following changes are introduced via the patch:

1. The CTF container (ctfc.h) now keeps track of the non-defining declarations
(by noting the DWARF attribute DW_AT_specification) in a new ctfc_ignore_vars
hashtable.  Such book-keeping is necessary because the CTF container should
not rely on the order of DWARF DIEs presented to it at generation time.

2. At the time of ctf_add_variable (), the DW_AT_specification DIE if present
is added in the ctfc_ignore_vars hashtable.  The CTF variable generation for
the defining declaration continues as normal.

3. If the ctf_add_variable () is asked to generate CTF variable for a DIE
present in the ctfc_ignore_vars, it skips generating CTF for it.

4. Recall that CTF variables are pre-processed before emission.  Till now, the
only pre-processing that was being done was to sort them in order of their
names.  Now an additional step is added:  If the CTF variable which
corresponds to the non-defining declaration is indeed present in the ctfc_vars
hashtable (because the corresponding DWARF DIE was encountered first by the
CTF generation engine), skip that CTF variable from output.

An important side effect of such a workflow above is that CTF for the C type
of the non-defining decl will remain in the CTF dictionary (and will be
emitted in the output section as well).  This type can be pruned by the
link-time de-duplicator as usual, if deemed unused.

2022-04-14  Indu Bhagat  <indu.bhagat@oracle.com>

gcc/ChangeLog:

	PR debug/105089
	* ctfc.cc (ctf_dvd_ignore_insert): New function.
	(ctf_dvd_ignore_lookup): Likewise.
	(ctf_add_variable): Keep track of non-defining decl DIEs.
	(new_ctf_container): Initialize the new hash-table.
	(ctfc_delete_container): Empty hash-table.
	* ctfc.h (struct ctf_container): Add new hash-table.
	(ctf_dvd_ignore_lookup): New declaration.
	(ctf_add_variable): Add additional argument.
	* ctfout.cc (ctf_dvd_preprocess_cb): Skip adding CTF variable
	record for non-defining decl for which a defining decl exists
	in the same TU.
	(ctf_preprocess): Defer updating the number of global objts
	until here.
	(output_ctf_header): Use ctfc_vars_list_count as some CTF
	variables may not make it to the final output.
	(output_ctf_vars): Likewise.
	* dwarf2ctf.cc (gen_ctf_variable): Skip generating CTF variable
	if this is known to be a non-defining decl DIE.
2022-04-14 10:03:52 -07:00
Indu Bhagat
613a6fca75 ctfc: get rid of the static variable in ctf_list_add_ctf_vars ()
2022-04-14  Indu Bhagat  <indu.bhagat@oracle.com>

gcc/ChangeLog:

	* ctfc.h (struct ctf_container): Introduce a new member.
	* ctfout.cc (ctf_list_add_ctf_vars): Use it instead of static
	variable.
2022-04-14 10:00:25 -07:00
Palmer Dabbelt
3fc22eedb0 libstdc++: Default to mutex-based atomics on RISC-V
The RISC-V port requires libatomic to be linked in order to resolve
various atomic functions, which results in builds that have
"--with-libstdcxx-lock-policy=auto" defaulting to mutex-based locks.
Changing this to direct atomics breaks the ABI, this forces the auto
detection mutex-based atomics on RISC-V in order to avoid a silent ABI
break for users.

See Bug 84568 for more discussion.  In the long run there may be a way
to get the higher-performance atomics without an ABI flag day, but
that's going to be a much more complicated operation.  We don't even
have support for the inline atomics yet, but given that some folks have
been discussing hacks to make these libatomic routines appear implicitly
it seems prudent to just turn off the automatic detection for RISC-V.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_LOCK_POLICY): Force auto to mutex
	for RISC-V.
	* configure: Regenerate.
2022-04-14 17:31:15 +01:00
Jonathan Wakely
832fcbbc73 libstdc++: Fix incorrect IS number in doc comment
libstdc++-v3/ChangeLog:

	* doc/xml/manual/intro.xml: Fix comment.
2022-04-14 17:31:15 +01:00
David Malcolm
b209a34926 analyzer: fix ICE comparing VECTOR_CSTs [PR105252]
gcc/analyzer/ChangeLog:
	PR analyzer/105252
	* svalue.cc (cmp_cst): When comparing VECTOR_CSTs, compare the
	types of the encoded elements before calling cmp_cst on them.

gcc/testsuite/ChangeLog:
	PR analyzer/105252
	* gcc.dg/analyzer/pr105252.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-14 08:50:17 -04:00
Jakub Jelinek
ba2f60499d simplify-rtx: Don't assume shift count has the same mode as the shift [PR105247]
The following testcase ICEs on ia64.  It is UB at runtime, but we shouldn't
ICE on it...
The problem is that on ia64, the shift count (last operand of ASHIFT etc.)
is promoted to DImode (using zero-extension), while most other targets
use much narrower modes (say QImode).  If we try to simplify a shift
and the shift count is CONST_INT or other VOIDmode integer constant
which isn't properly sign extended for the first operand's mode
(in the testcase the shift count is 0xfffffff8U and it is a SImode shift),
then we ICE during wide_int wop1 = pop1; in the first hunk, INTVAL == 0xfffffff8U
is not valid for SImode.  I think in theory we could run into this even
on other targets, say if they use SImode or HImode shift counts for e.g.
QImode shifts.  I hope word size is the upper bound of what a reasonable
target should use, using e.g. multiple registers for the shift count is
insane, so the following patch if op1 has VOIDmode and int_mode
is narrower than word uses word_mode for extraction of the value.

2022-04-14  Jakub Jelinek  <jakub@redhat.com>

	PR target/105247
	* simplify-rtx.cc (simplify_const_binary_operation): For shifts
	or rotates by VOIDmode constant integer shift count use word_mode
	for the operand if int_mode is narrower than word.

	* gcc.c-torture/compile/pr105247.c: New test.
2022-04-14 13:47:34 +02:00
Robin Dapp
122a65e86b testsuite/s390: Silence warning in pr80725.c
This test case checks that we do not ICE but FAILs because of
-Wint-to-pointer-cast.  Silence this warning.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/pr80725.c: Add -Wno-int-to-pointer-cast.
2022-04-14 13:23:18 +02:00
Robin Dapp
db4ce4a3d7 s390: Add scheduler description for z16.
This patch adds the scheduler description for the z16 machine.

gcc/ChangeLog:

	* config/s390/s390.cc (s390_get_sched_attrmask): Add z16.
	(s390_get_unit_mask): Likewise.
	(s390_is_fpd): Likewise.
	(s390_is_fxd): Likewise.
	* config/s390/s390.h (s390_tune_attr): Set max tune level to z16.
	* config/s390/s390.md (z900,z990,z9_109,z9_ec,z10,z196,zEC12,z13,z14,z15):
	Add z16.
	(z900,z990,z9_109,z9_ec,z10,z196,zEC12,z13,z14,z15,z16):
	Likewise.
	* config/s390/3931.md: New file.
2022-04-14 13:23:18 +02:00
Jonathan Wakely
41a72a744a libstdc++: Add new headers to <bits/stdc++.h> PCH
libstdc++-v3/ChangeLog:

	* include/precompiled/stdc++.h: Include <stacktrace> and
	<stdatomic.h> for C++23.
2022-04-14 11:02:43 +01:00
Jonathan Wakely
d2f8208e9a libstdc++: Fix missing and incorrect feature test macros [PR105269]
libstdc++-v3/ChangeLog:

	PR libstdc++/105269
	* include/bits/stl_vector.h (__cpp_lib_constexpr_vector):
	Define.
	* include/c_compatibility/stdatomic.h (__cpp_lib_stdatomic_h):
	Define.
	* include/std/optional (__cpp_lib_optional): Define new value
	for C++23.
	(__cpp_lib_monadic_optional): Remove.
	* include/std/version (__cpp_lib_constexpr_vector): Define.
	(__cpp_lib_stdatomic_h): Define.
	(__cpp_lib_optional): Define new value for C++23.
	(__cpp_lib_monadic_optional): Remove.
	* testsuite/20_util/optional/monadic/and_then.cc: Adjust.
	* testsuite/20_util/optional/requirements.cc: Adjust for C++23.
	* testsuite/20_util/optional/version.cc: Likewise.
	* testsuite/23_containers/vector/cons/constexpr.cc: Check
	feature test macro.
	* testsuite/29_atomics/headers/stdatomic.h/c_compat.cc:
	Likewise.
	* testsuite/20_util/optional/monadic/version.cc: Removed.
	* testsuite/23_containers/vector/requirements/version.cc: New test.
	* testsuite/29_atomics/headers/stdatomic.h/version.cc: New test.
2022-04-14 11:02:37 +01:00
Jason Merrill
8369b4e4c6 c++: alignment of local typedef in template [PR65211]
Because common_handle_aligned_attribute only applies the alignment to the
TREE_TYPE of a typedef, not the DECL_ORIGINAL_TYPE, we need to copy it
explicitly in tsubst.

	PR c++/65211

gcc/cp/ChangeLog:

	* pt.cc (tsubst_decl) [TYPE_DECL]: Copy TYPE_ALIGN.

gcc/testsuite/ChangeLog:

	* g++.target/i386/vec-tmpl1.C: New test.
2022-04-13 21:56:43 -04:00
Jason Merrill
1824da6066 c++: local fn and generic lambda [PR97219]
When instantiating the op() for a generic lambda, we can no longer do name
lookup inside function scopes enclosing the lambda, so we need to remember
the lookup result from processing the definition of the lambda.  So the code
in finish_call_expr to throw away the lookup result and instead look it up
again at instantiation time needs to be adjusted.  The approach I take is to
only discard the result if the local extern comes from dependent scope; once
the enclosing function template is instantiated and we're regenerating the
lambda, then we can remember the result of lookup.  We also need any default
arguments to be instantiated at that point.

	PR c++/97219

gcc/cp/ChangeLog:

	* name-lookup.cc (dependent_local_decl_p): New.
	* cp-tree.h (dependent_local_decl_p): Declare.
	* semantics.cc (finish_call_expr): Use it.
	* pt.cc (tsubst_arg_types): Also substitute default args
	for local externs.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1y/lambda-generic-local-fn1.C: New test.
2022-04-13 20:24:36 -04:00
Jason Merrill
d4e00ccef6 c++: template conversion op [PR101698]
Asking for conversion to a dependent type also makes a BASELINK dependent.

	PR c++/101698

gcc/cp/ChangeLog:

	* pt.cc (tsubst_baselink): Also check dependent optype.

gcc/testsuite/ChangeLog:

	* g++.dg/template/conv19.C: New test.
2022-04-13 20:24:01 -04:00
Jason Merrill
ad8161e6d7 c++: NRV and ref-extended temps [PR101442]
This issue goes back to r83221, where the cleanup for extended ref temps
changed from being unconditional to being tied to the declaration they
formed part of the initializer for.

The named return value optimization changes the cleanup for the NRV variable
to only run on the EH path; we don't want that change to affect temporary
cleanups.  The perform_member_init change isn't necessary (there 'decl' is a
COMPONENT_REF), it's just for consistency.

	PR c++/101442

gcc/cp/ChangeLog:

	* decl.cc (cp_finish_decl): Don't pass decl to push_cleanup.
	* init.cc (perform_member_init): Likewise.
	* semantics.cc (push_cleanup): Adjust comment.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/initlist-nrv1.C: New test.
2022-04-13 20:22:57 -04:00
Jason Merrill
019d6d4149 c++: add test [PR105265]
This was fixed by r12-1165, but good to have a test that doesn't need
-fno-elide-constructors.

	PR c++/105265
	PR c++/100838

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/initlist-new6.C: New test.
2022-04-13 20:22:18 -04:00
GCC Administrator
247bbed1b8 Daily bump. 2022-04-14 00:16:40 +00:00
Ian Lance Taylor
33ba46663c go.test: update issue10441.go to current upstream version
This test only needs to be compiled, not linked.
2022-04-13 14:41:50 -07:00
Richard Sandiford
f2ebf2d98e aarch64: Make sure the UF divides the VF [PR105254]
In this PR, we were trying to set the unroll factor to a value higher
than the minimum VF (or more specifically, to a value that doesn't
divide the VF).  I guess there are two approaches to this: let the
target pick any value it likes and make target-independent code pare
it back to something that makes sense, or require targets to supply
sensible values from the outset.  This patch goes for the latter
approach.

gcc/
	PR tree-optimization/105254
	* config/aarch64/aarch64.cc
	(aarch64_vector_costs::determine_suggested_unroll_factor): Take a
	loop_vec_info as argument.  Restrict the unroll factor to values
	that divide the VF.
	(aarch64_vector_costs::finish_cost): Update call accordingly.

gcc/testsuite/
	PR tree-optimization/105254
	* g++.dg/vect/pr105254.cc: New test.
2022-04-13 17:53:54 +01:00
Tobias Burnus
469fad0161 OpenMP/Fortran: Fix EXIT in loop diagnostic [PR105242]
gcc/fortran/ChangeLog:

	PR fortran/105242
	* match.cc (match_exit_cycle): Handle missing OMP LOOP, DO and SIMD
	directives in the EXIT/CYCLE diagnostic.

gcc/testsuite/ChangeLog:

	PR fortran/105242
	* gfortran.dg/gomp/loop-exit.f90: New test.
2022-04-13 18:40:52 +02:00
Jason Merrill
ec03862f80 c++: empty base constexpr -fno-elide-ctors [PR105245]
The patch for 100111 extended our handling of empty base elision to the case
where the derived class has no other fields, but we still need to make sure
that there's some initializer for the derived object.

	PR c++/105245
	PR c++/100111

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_eval_store_expression): Build a CONSTRUCTOR
	as needed in empty base handling.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1y/constexpr-empty2.C: Add -fno-elide-constructors.
2022-04-13 10:17:52 -04:00
Iain Buclaw
31350635bf d: Merge upstream dmd 4d1bfcf14, druntime 9ba9a6ae, phobos c0cc5e917.
D front-end changes:

    - Import dmd v2.099.1.
    - Added `@mustuse' attribute, implmenting DIP 1038.
    - Added `.tupleof` property for static arrays

D runtime changes:

    - Import druntime v2.099.1.

Phobos changes:

    - Import phobos v2.099.1.
    - Zlib bindings have been updated to 1.2.12.

gcc/d/ChangeLog:

	* Make-lang.in (D_FRONTEND_OBJS): Add d/common-bitfields.o,
	d/mustuse.o.
	* d-ctfloat.cc (CTFloat::isIdentical): Don't treat NaN values as
	identical.
	* dmd/MERGE: Merge upstream dmd 4d1bfcf14.
	* expr.cc (ExprVisitor::visit (VoidInitExp *)): New.

libphobos/ChangeLog:

	* libdruntime/MERGE: Merge upstream druntime 9ba9a6ae.
	* src/MERGE: Merge upstream phobos c0cc5e917.
2022-04-13 15:02:57 +01:00
Richard Biener
ca145c6306 tree-optimization/105263 - reassoc and DFP
reassoc has certain tricks which in the end depend on the ability
to undo them.  For DFP creating a -1. constant is easy but
re-identifying is appearantly not - real_minus_onep rejects those
outright for DFP.  So we have to disable (at least) this one trick.

2022-04-13  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/105263
	* tree-ssa-reassoc.cc (try_special_add_to_ops): Do not consume
	negates in multiplication chains with DFP.

	* gcc.dg/pr105263.c: New testcase.
2022-04-13 15:59:14 +02:00
Jakub Jelinek
29c46490de tree.cc: Use useless_type_conversion_p in tree_builtin_call_types_compatible_p while in gimple form [PR105253]
tree_builtin_call_types_compatible_p uses TYPE_MAIN_VARIANT comparisons
or tree_nop_conversion_p to ensure a builtin has correct GENERIC arguments.
Unfortunately this regressed when get_call_combined_fn is called during
GIMPLE optimizations.  E.g. when number_of_iterations_popcount is called,
it doesn't ensure TYPE_MAIN_VARIABLE compatible argument type, it picks
__builtin_popcount{,l,ll} based just on types' precision and doesn't
fold_convert the arg to the right type.  We are in GIMPLE, such conversions
are useless...
So, either we'd need to fix number_of_iterations_popcount to add casts
and inspect anything else that creates CALL_EXPRs late, or we can
in tree_builtin_call_types_compatible_p just use the GIMPLE type
comparisons (useless_type_conversion_p) when we are in GIMPLE form and
the TYPE_MAIN_VARIANT comparison or tree_nop_conversion_p test otherwise.

I think especially this late in stage4 the latter seems safer to me.

2022-04-13  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/105253
	* tree.cc (tree_builtin_call_types_compatible_p): If PROP_gimple,
	use useless_type_conversion_p checks instead of TYPE_MAIN_VARIANT
	comparisons or tree_nop_conversion_p checks.

	* gcc.target/i386/pr105253.c: New test.
2022-04-13 15:44:51 +02:00
Jakub Jelinek
13c32c1984 c++: Treat alignas align_expr and aligned attribute's operand as manifestly constant evaluation [PR105233]
The following testcase fails, because we only constant evaluate the
alignas argument as non-manifestly constant-evaluated and as
__builtin_is_constant_evaluated appears, we make it non-constant
(the reason is that we often try to evaluate some expression without
manifestly_const_eval perhaps even multiple times before actually
evaluating it with manifestly_const_eval (e.g. when folding for warnings
and in many other places), and we don't want __builtin_is_constant_evaluated
to evaluate to false in those cases, because we could get a different
result from when we actually evaluate it with manifestly_const_eval
set).
Now, for alignas the standard seems to be clear, it says the
argument is constant-expression, which means we should
manifestly-constant-eval it.
Attributes are a fuzzy area, they are extensions and various attributes
take e.g. identifiers, or string literals etc. as arguments.

Either we can just treat alignas as manifestly-const-eval, for that
we'd need some way how to differentiate between alignas and gnu::aligned
or aligned attribute.

Another possibility is what the patch below implements, treat
both alignas and gnu::aligned and aligned attribute's argument as
manifestly-const-eval and not do that for other attributes.

Another is to go through all attributes and figure out for which
such treatment is useful (e.g. those that expect INTEGER_CST as argument),
and either add a new column in the attribute table or have another table
in the C++ FE to find out which attribute needs that.

Another is do that for all the attribute arguments that are EXPR_P
and see what breaks (bet that it could be quite risky this late in
GCC 12 cycle and especially for backporting).

2022-04-13  Jakub Jelinek  <jakub@redhat.com>

	PR c++/105233
	* decl2.cc (cp_check_const_attributes): For aligned attribute
	pass manifestly_const_eval=true to fold_non_dependent_expr.

	* g++.dg/cpp2a/is-constant-evaluated13.C: New test.
2022-04-13 15:43:34 +02:00
Martin Jambor
dd61ee6fde
testsuite: Increase auto-inlining param in gcc.dg/ipa/remref-7.c (PR 105183)
A scan dump of testsuite gcc.dg/ipa/remref-7.c fails on a number of
platforms.  I investigated only i?86-*-* with -mno-sse but assume the
issue is the same on all of the affected platform.

Because function bar is not inlined there even though it is only
called once, the process that is being tested is simply not triggered.
This can be "fixed" by increasing parameter max-inline-insns-auto to
something high, I randomly picked 100.

I have only manually tested the change but hopefully that is enough.

gcc/testsuite/ChangeLog:

2022-04-08  Martin Jambor  <mjambor@suse.cz>

	PR testsuite/105183
	* gcc.dg/ipa/remref-7.c: Add --param max-inline-insns-auto=100 to options.
2022-04-13 15:09:29 +02:00
Marek Polacek
85ae54e18b c++: ambiguous call not diagnosed after DR2352 [PR97296]
DR 2352 changed the definitions of reference-related (so that it uses
"similar type" instead of "same type") and of reference-compatible (use
a standard conversion sequence).  That means that reference-related is
now more broad, which means that we will be binding more things directly.

The original patch for DR 2352 caused some problems, which were fixed in
r276251 by creating a "fake" ck_qual in direct_reference_binding, so
that in

  void f(int *); // #1
  void f(const int * const &); // #2
  int *x;
  int main()
  {
    f(x); // call #1
  }

we call #1.  The extra ck_qual in #2 causes compare_ics to select #1,
which is a better match for "int *" because then we don't have to do
a qualification conversion.

Let's turn to the problem in this PR.  We have

  void f(const int * const &); // #1
  void f(const int *); // #2
  int *x;
  int main()
  {
    f(x);
  }

We arrive in compare_ics to decide which one is better. The ICS for #1
looks like

    ck_ref_bind      <-    ck_qual         <-   ck_identity
  const int *const &     const int *const         int *

and the ICS for #2 is

    ck_qual     <-  ck_rvalue   <-  ck_identity
  const int *          int *           int *

We strip the reference and then comp_cv_qual_signature when comparing two
ck_quals sees that "const int *" is a proper subset of "const int *const"
and we return -1.  But that's wrong; presumably the top-level "const"
should be ignored and the call should be ambiguous.  This patch adjust
the type of the "fake" ck_qual so that this problem doesn't arise.

	PR c++/97296

gcc/cp/ChangeLog:

	* call.cc (direct_reference_binding): strip_top_quals when creating
	a ck_qual.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/ref-bind4.C: Add dg-error.
	* g++.dg/cpp0x/ref-bind8.C: New test.
2022-04-13 08:40:02 -04:00
Richard Biener
9645279722 middle-end/105259 - adjust gcc.target/i386/auto-init-4.c
This adjusts the FAILing testcase to only check for the pieces
that work.  The bug tracks improving pattern-init for long double.

2022-04-13  Richard Biener  <rguenther@suse.de>

	PR middle-end/105259
	* gcc.target/i386/auto-init-4.c: Adjust.
2022-04-13 10:43:55 +02:00
Hongyu Wang
522f25e90c i386: Fix infinite loop under -mrelax-cmpxchg-loop [PR 103069]
For -mrelax-cmpxchg-loop which relaxes atomic_fetch_<logic> loops,
there is a missing set to %eax when compare fails, which would result
in infinite loop in some benchmark. Add set to %eax to avoid it.

gcc/ChangeLog:

	PR target/103069
	* config/i386/i386-expand.cc (ix86_expand_cmpxchg_loop):
	  Add missing set to target_val at pause label.
2022-04-13 16:17:27 +08:00
Jakub Jelinek
41f8f8b8a4 attribs: Restrict decl_attributes DECL_FUNCTION_SPECIFIC_TARGET changes to targets that care about target attributes/pragmas [PR105234]
The following code is rejected e.g. on mips64el-linux (but I think many
other targets which don't support target attribute or pragma).
The problem is that the change to decl_attributes below is done
unconditionally and with just #pragma GCC push_options/pop_options pair
we have target_option_default_node NULL, but after popping options
target_option_current_node becomes non-NULL and this decl_attribute
spot fills in DECL_FUNCTION_SPECIFIC_TARGET of a subset of a functions.
Those appearing before push_options/pop_options will have it NULL and
as target_option_default_node is also NULL on those targets, the default
can_inline_p will refuse to inline any functions defined with NULL
DECL_FUNCTION_SPECIFIC_TARGET into any function with non-NULL
DECL_FUNCTION_SPECIFIC_TARGET (even when nothing in the options really
changed).

The following patch restricts that snippet to targets that care (initialize
target_option_default_node to non-NULL to the command line options early)
which include all targets that actually implement target attribute and/or
pragma.

2022-04-13  Jakub Jelinek  <jakub@redhat.com>

	PR target/105234
	* attribs.cc (decl_attributes): Don't set
	DECL_FUNCTION_SPECIFIC_TARGET if target_option_default_node is
	NULL.

	* gcc.c-torture/compile/pr105234.c: New test.
2022-04-13 10:12:56 +02:00
Richard Biener
4e892de677 tree-optimization/105250 - adjust fold_convertible_p PR105140 fix
The following reverts the original PR105140 fix and goes for instead
applying the additional fold_convert constraint for VECTOR_TYPE
conversions also to fold_convertible_p.  I did not try sanitizing
all of this at this point.

2022-04-13  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/105250
	* fold-const.cc (fold_convertible_p): Revert
	r12-7979-geaaf77dd85c333, instead check for size equality
	of the vector types involved.

	* gcc.dg/pr105250.c: New testcase.
2022-04-13 09:55:56 +02:00
Richard Biener
6e609e0010 Revert "tree-optimization/104912 - ensure cost model is checked first"
This reverts commit ac8340ee4d.
2022-04-13 09:55:13 +02:00
Richard Biener
ac8340ee4d tree-optimization/104912 - ensure cost model is checked first
The following makes sure that when we build the versioning condition
for vectorization including the cost model check, we check for the
cost model and branch over other versioning checks.  That is what
the cost modeling assumes, since the cost model check is the only
one accounted for in the scalar outside cost.  Currently we emit
all checks as straight-line code combined with bitwise ops which
can result in surprising ordering of checks in the final assembly.

Since loop_version accepts only a single versioning condition
the splitting is done after the fact.

The result is a 1.5% speedup of 416.gamess on x86_64 when compiling
with -Ofast and tuning for generic or skylake.  That's not enough
to recover from the slowdown when vectorizing but it now cuts off
the expensive alias versioning test.

2022-03-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/104912
	* tree-vect-loop-manip.cc (vect_loop_versioning): Split
	the cost model check to a separate BB to make sure it is
	checked first and not combined with other version checks.
2022-04-13 09:53:53 +02:00
Jakub Jelinek
ccb5e63837 scev: Fix a comment typo
When looking at the kernel __popcountdi2 issue, I've noticed a comment typo.

2022-04-13  Jakub Jelinek  <jakub@redhat.com>

	* tree-scalar-evolution.cc (expression_expensive_p): Fix a comment typo.
2022-04-13 09:47:45 +02:00
Jakub Jelinek
db14bb4c6b libgomp: Fix a documentation typo
This fixes a typo in the 5.0 feature support table.

2022-04-13  Jakub Jelinek  <jakub@redhat.com>

	* libgomp.texi: Fix a typo - mutexinouset -> mutexinoutset.
2022-04-13 09:46:53 +02:00
Alexandre Oliva
c1ff207af6 ppc: testsuite: skip pr60203 on no ldbl128
If neither 128-bit long double format is available, skip pr60203.c.


for  gcc/testsuite/ChangeLog

	* gcc.target/powerpc/pr60203.c: Skip on no 128-bit long double.
2022-04-12 22:41:46 -03:00
Alexandre Oliva
6b7cc72947 ppc: testsuite: PROMOTE_MODE fallout pr56605 [PR102146]
The test expects a compare of DImode values, but after the removal of
PROMOTE_MODE from rs6000/, we get SImode.  Adjust the expectations.


for  gcc/testsuite/ChangeLog

	PR target/102146
	* gcc.target/powerpc/pr56605.c: Accept SImode compare operand.
2022-04-12 22:41:45 -03:00
Xi Ruoyao
bb50967fa4
mips: testsuite: enforce -ffat-lto-objects for pr102024-4.c
The body of func is optimized away with -flto -fno-fat-lto-objects, so
the psABI inform is not emitted, causing a test failure.

gcc/testsuite/

	* gcc.target/mips/pr102024-4.c (dg-options): Add
	-ffat-lto-objects.
2022-04-13 09:28:05 +08:00