Commit Graph

197022 Commits

Author SHA1 Message Date
Jonathan Wakely 7026d0455d libstdc++: Add test for chrono::utc_clock leap second offset
This test of leap second handling is taken from the C++20 standard.

libstdc++-v3/ChangeLog:

	* testsuite/std/time/clock/utc/1.cc: Check handling across leap
	second insertion.
2022-11-16 15:07:17 +00:00
Martin Liska f6d6fd05b3 libatomic: regenerate Makefile.in
libatomic/ChangeLog:

	* Makefile.in: Re-generate.
2022-11-16 15:13:41 +01:00
Patrick Palka ec59848074 libstdc++: Fix stream initialization with static library [PR107701]
When linking with a static library, the linker seems to discard a
constituent .o object (including its global initializers) if nothing
defined in the object is referenced by the program (unless e.g.
--whole-archive is used).  This behavior breaks iostream with static
libstdc++.a (on systems that support init priorities) because we define
the global initializer for the standard stream objects in a separate TU
(ios_init.cc) from the stream object definitions (globals_io.cc).

This patch fixes this by moving the stream initialization object into
the same TU that defines the stream objects, so that any use of the
streams prevents the linker from discarding this global initializer.

	PR libstdc++/107701

libstdc++-v3/ChangeLog:

	* include/std/iostream (__ioinit): Adjust comment.
	* src/c++98/globals_io.cc: Include "io_base_init.h" here
	instead of ...
	* src/c++98/ios_init.cc: ... here.
	* src/c++98/ios_base_init.h (__ioinit): More comments.
	* testsuite/17_intro/static.cc: dg-do run instead of just link.
2022-11-16 08:53:51 -05:00
Jakub Jelinek c5e8c6c193 c++: Alignment changes to layout compatibility/common initial sequence - DR2583
When trying to figure out what to do about alignment,
layout_compatible_type_p returns false if TYPE_ALIGN on
ENUMERAL_TYPE/CLASS_TYPE_P (but not scalar types?) differ, or if members
don't have the same positions.

What is in DR2583 doesn't say anything like that though, on the other side
it says that if the corresponding entities don't have the same alignment
requirements, they aren't part of the common initial sequence.

So, my understanding of this is we shouldn't check TYPE_ALIGN in
layout_compatible_type_p, but instead DECL_ALIGN in
next_common_initial_seqence.

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

	* typeck.cc (next_common_initial_sequence): Return false members have
	different DECL_ALIGN.
	(layout_compatible_type_p): Don't test TYPE_ALIGN of ENUMERAL_TYPE
	or CLASS_TYPE_P.

	* g++.dg/cpp2a/is-layout-compatible3.C: Expect enums with different
	alignas to be layout compatible, while classes with different
	alignas on members layout incompatible.
	* g++.dg/DRs/dr2583.C: New test.
2022-11-16 14:49:47 +01:00
Jakub Jelinek 0e2c5510e0 libstdc++: Fix up <complex> for extended floating point types [PR107649]
As filed by Jonathan in the PR, I've screwed up the requires syntax
in the extended floating point specialization:
-    requires(__complex_type<_Tp>::type)
+    requires requires { typename __complex_type<_Tp>::type; }
and doing this change resulted in lots of errors because __complex_whatever
overfloads from extended floating point types were declared after the
templates which used them.

The following patch fixes that.

Bootstrapped/regtested on x86_64-linux and i686-linux, additionally
I've tested that with _GLIBCXX_HAVE_FLOAT128_MATH not being defined
while __STDCPP_FLOAT128_T__ defined one can still use
std::complex<std::float128_t> for basic arithmetic etc., just one can't
expect std::sin etc. to work in that case (because we don't have any
implementation).

2022-11-16  Jakub Jelinek  <jakub@redhat.com>
	    Jonathan Wakely  <jwakely@redhat.com>

	PR libstdc++/107649
	* include/std/complex (__complex_abs, __complex_arg, __complex_cos,
	__complex_cosh, __complex_exp, __complex_log, __complex_sin,
	__complex_sinh, __complex_sqrt, __complex_tan, __complex_tanh,
	__complex_pow): Move __complex__ _Float{16,32,64,128} and
	__complex__ decltype(0.0bf16) overloads earlier in the file.
	(complex): Fix up requires on the partial specialization for extended
	float types.
	(__complex_acos, __complex_asin, __complex_atan, __complex_acosh,
	__complex_asinh, __complex_atanh): Move
	__complex__ _Float{16,32,64,128} and __complex__ decltype(0.0bf16)
	overloads earlier in the file.
2022-11-16 14:45:40 +01:00
Jakub Jelinek cf958f8f16 c++: Fix up calls to static operator() or operator[] [PR107624]
One thing that doesn't work properly is the same problem as I've filed
yesterday for static operator() - PR107624 - that side-effects of
the postfix-expression on which the call or subscript operator are
applied are thrown away, I assume we have to add them into COMPOUND_EXPR
somewhere after we find out that the we've chosen a static member function
operator.

On Mon, Nov 14, 2022 at 06:29:44PM -0500, Jason Merrill wrote:
> Indeed.  The code in build_new_method_call for this case has the comment
>
>               /* In an expression of the form `a->f()' where `f' turns
>                  out to be a static member function, `a' is
>                  none-the-less evaluated.  */

Had to tweak 3 spots for this.  Furthermore, found that if in non-pedantic
C++20 compilation static operator[] is accepted, we required that it has 2
arguments, I think it is better to require exactly one because that case
is the only one that will actually work in C++20 and older.

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

	PR c++/107624
	* call.cc (keep_unused_object_arg): New function.
	(build_op_call): Use it.
	(build_op_subscript): Likewise.
	(build_new_op): Similarly for ARRAY_REF.
	(build_new_method_call): Use it.
	* decl.cc (grok_op_properties): For C++20 and earlier, if operator[]
	is static member function, require exactly one parameter rather than
	exactly two parameters.

	* g++.dg/cpp23/static-operator-call4.C: New test.
	* g++.dg/cpp23/subscript10.C: New test.
	* g++.dg/cpp23/subscript11.C: New test.
2022-11-16 14:44:45 +01:00
Alexander Monakov 85966f0d20 doc: fix description of -mrelax-cmpxchg-loop [PR 107676]
gcc/ChangeLog:

	PR target/107676
	* doc/invoke.texi (-mrelax-cmpxchg-loop): Reword description.
2022-11-16 16:41:39 +03:00
Alexander Monakov d4cc7a8c4a i386: correct x87&SSE multiplication modeling in znver.md
All multiplication instructions are fully pipelined, except AVX256
instructions on Zen 1, which issue over two cycles on a 128-bit unit.
Correct the model accordingly to reduce combinatorial explosion in
automaton tables.

Top znver table sizes in insn-automata.o:

Before:

30056 r znver1_fp_min_issue_delay
120224 r znver1_fp_transitions

After:

6720 r znver1_fp_min_issue_delay
53760 r znver1_fp_transitions

gcc/ChangeLog:

	PR target/87832
	* config/i386/znver.md: (znver1_fp_op_mul): Correct cycles in
	the reservation.
	(znver1_fp_op_mul_load): Ditto.
	(znver1_mmx_mul): Ditto.
	(znver1_mmx_load): Ditto.
	(znver1_ssemul_ss_ps): Ditto.
	(znver1_ssemul_ss_ps_load): Ditto.
	(znver1_ssemul_avx256_ps): Ditto.
	(znver1_ssemul_avx256_ps_load): Ditto.
	(znver1_ssemul_sd_pd): Ditto.
	(znver1_ssemul_sd_pd_load): Ditto.
	(znver2_ssemul_sd_pd): Ditto.
	(znver2_ssemul_sd_pd_load): Ditto.
	(znver1_ssemul_avx256_pd): Ditto.
	(znver1_ssemul_avx256_pd_load): Ditto.
	(znver1_sseimul): Ditto.
	(znver1_sseimul_avx256): Ditto.
	(znver1_sseimul_load): Ditto.
	(znver1_sseimul_avx256_load): Ditto.
	(znver1_sseimul_di): Ditto.
	(znver1_sseimul_load_di): Ditto.
2022-11-16 16:41:39 +03:00
Alexander Monakov dd744f06c9 i386: correct x87&SSE division modeling in znver.md
Correct modeling of division instructions in the SIMD/FP domain for
AMD Zen architectures and avoid combinatorial explosion of automaton
tables by modeling the separate floating-point division unit and
correcting reservations to reflect reciprocal throughput of the
corresponding instructions, similar to earlier commit
5cee5f9400 ("i386: correct integer division modeling in znver.md").

Division is partially pipelined and some instructions have fractional
throughput (e.g. Zen 3 can issue divss and divsd each 3.5 and 4.5
cycles on average, respectively). Considering these CPUs implement
out-of-order execution, the model doesn't need to be exact to the last
cycle, so simplify it by using 4/5 cycles for SF/DF modes, and not
modeling the fact that FP3 pipe is occupied for one cycle.

Top znver table sizes in insn-automata.o:

Before:

428108 r znver1_fp_min_issue_delay
856216 r znver1_fp_transitions

After:

30056 r znver1_fp_min_issue_delay
120224 r znver1_fp_transitions

gcc/ChangeLog:

	PR target/87832
	* config/i386/znver.md (znver1_fdiv): New automaton.
	(znver1-fdiv): New unit.
	(znver1_fp_op_div): Correct unit and cycles in the reservation.
	(znver1_fp_op_div_load): Ditto.
	(znver1_fp_op_idiv_load): Ditto.
	(znver2_fp_op_idiv_load): Ditto.
	(znver1_ssediv_ss_ps): Ditto.
	(znver1_ssediv_ss_ps_load): Ditto.
	(znver1_ssediv_sd_pd): Ditto.
	(znver1_ssediv_sd_pd_load): Ditto.
	(znver1_ssediv_avx256_ps): Ditto.
	(znver1_ssediv_avx256_ps_load): Ditto.
	(znver1_ssediv_avx256_pd): Ditto.
	(znver1_ssediv_avx256_pd_load): Ditto.
2022-11-16 16:41:39 +03:00
Jonathan Wakely 3c54805d03 libstdc++: Fix std::any pretty printer
The recent changes to FilteringTypePrinter affect the result of
gdb.lookup_type('std::string') in StdExpAnyPrinter, causing it to always
return the std::__cxx11::basic_string specialization. This then causes a
gdb.error exception when trying to lookup the std::any manager type for
a specliaization using that string, but that manager was never
instantiated in the program. This causes FAILs when running the tests
with -D_GLIBCXX_USE_CXX11_ABI=0:

FAIL: libstdc++-prettyprinters/libfundts.cc print as
FAIL: libstdc++-prettyprinters/libfundts.cc print as

The ugly solution used in this patch is to repeat the lookup for every
type that std::string could be a typedef for, and hope it only works for
one of them.

libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py (StdExpAnyPrinter): Make
	expansion of std::string in manager name more robust.
2022-11-16 13:37:38 +00:00
Jonathan Wakely 9228162202 libstdc++: Improve comments on pretty printer code
libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py (is_specialization_of): Fix
	incorrect terminology in docstring and describe arguments.
	(FilteringTypePrinter): Add default argument for new parameter,
	enhance docstring.
2022-11-16 13:37:37 +00:00
Tobias Burnus 6f83861cc1 gcn: Add __builtin_gcn_kernarg_ptr
Add __builtin_gcn_kernarg_ptr to avoid using hard-coded register values
and permit future ABI changes while keeping the API.

gcc/ChangeLog:

	* config/gcn/gcn-builtins.def (KERNARG_PTR): Add.
	* config/gcn/gcn.cc (gcn_init_builtin_types): Change siptr_type_node,
	sfptr_type_node and voidptr_type_node from FLAT to ADDR_SPACE_DEFAULT.
	(gcn_expand_builtin_1): Handle GCN_BUILTIN_KERNARG_PTR.
	(gcn_oacc_dim_size): Return in ADDR_SPACE_FLAT.

libgomp/ChangeLog:

	* config/gcn/team.c (gomp_gcn_enter_kernel): Use
	__builtin_gcn_kernarg_ptr instead of asm ("s8").

Co-Authored-By: Andrew Stubbs <ams@codesourcery.com>
2022-11-16 14:25:28 +01:00
David Malcolm 21501ec751 analyzer: use known_function to simplify region_model::on_call_{pre,post}
Replace lots of repeated checks against strings with a hash_map lookup.
Add some missing type-checking for handling known functions (e.g. checks
for pointer types).

gcc/analyzer/ChangeLog:
	* analyzer.h (known_function::matches_call_types_p): New vfunc.
	(known_function::impl_call_pre): Provide base implementation.
	(known_function::impl_call_post): New vfunc.
	(register_known_functions): New.
	* engine.cc (impl_run_checkers): Call register_known_functions.
	* region-model-impl-calls.cc (region_model::impl_call_accept):
	Convert to...
	(class known_function_accept): ...this.
	(region_model::impl_call_bind): Convert to...
	(class known_function_bind): ...this.
	(region_model::impl_call_connect): Convert to...
	(class known_function_connect): ...this.
	(region_model::impl_call_listen): Convert to...
	(class known_function_listen): ...this.
	(region_model::impl_call_socket): Convert to...
	(class known_function_socket): ...this.
	(register_known_functions): New.
	* region-model.cc (region_model::on_call_pre): Remove special
	case for "bind" in favor of the known_function-handling dispatch.
	Add call to known_function::matches_call_types_p to latter.
	(region_model::on_call_post): Remove special cases for "accept",
	"bind", "connect", "listen", and "socket" in favor of dispatch
	to known_function::impl_call_post.
	* region-model.h (region_model::impl_call_accept): Delete decl.
	(region_model::impl_call_bind): Delete decl.
	(region_model::impl_call_connect): Delete decl.
	(region_model::impl_call_listen): Delete decl.
	(region_model::impl_call_socket): Delete decl.
	* sm-fd.cc: Update comments.

gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/analyzer_kernel_plugin.c
	(copy_across_boundary_fn::matches_call_types_p): New.
	* gcc.dg/plugin/analyzer_known_fns_plugin.c
	(known_function_returns_42::matches_call_types_p): New.
	(known_function_attempt_to_copy::matches_call_types_p): New.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-11-16 08:23:02 -05:00
David Malcolm 3685aed8ef analyzer: split out checker-path.cc into a new checker-event.cc
gcc/ChangeLog:
	* Makefile.in (ANALYZER_OBJS): Add analyzer/checker-event.o.

gcc/analyzer/ChangeLog:
	* checker-event.cc: New file, split out from...
	* checker-path.cc: ...this file.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-11-16 08:21:17 -05:00
Max Filippov 99c9cbcc3b gcc: m68k: fix PR target/107645
gcc/
	PR target/107645
	* config/m68k/predicates.md (symbolic_operand): Return false
	when UNSPEC is under the CONST node.
2022-11-16 04:35:37 -08:00
Christoph Müllner f58e6d42fc doc: invoke: pru/riscv: Fix option list formatting
This patch fixes a wrong placed closing bracket in the RISC-V option
list and an unneeded @gol in the PRU option list in invoke.texi.

gcc/ChangeLog:

	* doc/invoke.texi: Fix PRU/RISC-V option list formatting.
2022-11-16 10:32:00 +01:00
Jakub Jelinek 1360290596 c++: Implement CWG 2654 - Un-deprecation of compound volatile assignments
The following patch implements CWG 2654.

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

	* typeck.cc (cp_build_modify_expr): Implement CWG 2654
	- Un-deprecation of compound volatile assignments.  Remove
	-Wvolatile warning about compound volatile assignments.

	* g++.dg/cpp2a/volatile1.C (fn2, fn3, racoon): Adjust expected
	diagnostics.
	* g++.dg/cpp2a/volatile3.C (fn2, fn3, racoon): Likewise.
	* g++.dg/cpp2a/volatile5.C (f): Likewise.
	* g++.dg/ext/vector25.C (foo): Don't expect a warning.
	* g++.dg/cpp1y/new1.C (test_unused): Likewise.
2022-11-16 10:23:22 +01:00
Tobias Burnus d59858f6ee nvptx/mkoffload.cc: Fix "$nohost" check
If lhd_set_decl_assembler_name is invoked - in particular if
!TREE_PUBLIC (decl) && !DECL_FILE_SCOPE_P (decl) - the '.nohost' suffix
might change to '.nohost.2'. This happens for the existing reverse offload
testcases via cgraph_node::analyze and is a side effect of
r13-3455-g178ac530fe67e4f2fc439cc4ce89bc19d571ca31 for some reason.

The solution is to not only check for a tailing '$nohost' but also for
'$nohost$' in nvptx/mkoffload.cc.

gcc/ChangeLog:

	* config/nvptx/mkoffload.cc (process): Recognize '$nohost$...'
	besides tailing '$nohost' as being for reverse offload.
2022-11-16 08:58:44 +01:00
Jakub Jelinek 7f01402286 c++: Allow attributes on concepts - DR 2428
The following patch adds parsing of attributes to concept definition,
allows deprecated attribute to be specified (as CONCEPT_DECL now needs
to be checked in c-family/c-attribs.cc, I had to move its declaration
from cp/*.def to c-family/*.def) and checks TREE_DEPRECATED in
build_standard_check (not sure if that is the right spot, or whether
it shouldn't be checked also for variable and function concepts and
how to write testcase coverage for that).

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

gcc/c-family/
	* c-common.def (CONCEPT_DECL): New tree, moved here from
	cp-tree.def.
	* c-common.cc (c_common_init_ts): Handle CONCEPT_DECL.
	* c-attribs.cc (handle_deprecated_attribute): Allow deprecated
	attribute on CONCEPT_DECL.
gcc/cp/
	* cp-tree.def (CONCEPT_DECL): Move to c-common.def.
	* cp-objcp-common.cc (cp_common_init_ts): Don't handle CONCEPT_DECL
	here.
	* cp-tree.h (finish_concept_definition): Add ATTRS parameter.
	* parser.cc (cp_parser_concept_definition): Parse attributes in
	between identifier and =.  Adjust finish_concept_definition
	caller.
	* pt.cc (finish_concept_definition): Add ATTRS parameter.  Call
	cplus_decl_attributes.
	* constraint.cc (build_standard_check): If CONCEPT_DECL is
	TREE_DEPRECATED, emit -Wdeprecated-declaration warnings.
gcc/testsuite/
	* g++.dg/cpp2a/concepts-dr2428.C: New test.
2022-11-16 07:37:05 +01:00
Jakub Jelinek 7c6cd9c05e ragen-op-float: Fix up float_binary_op_range_finish [PR107668]
The following testcase ICEs, because when !HONOR_NANS but
HONOR_SIGNED_ZEROS, if we see
lhs = op1 * op2;
and know that lhs is [-0.0, 0.0] and op2 is [0.0, 0.0], the
division of these two yields UNDEFINED and clear_nan () on it
fails an assert.  With HONOR_NANS it would actually result in
a known NAN, but when NANs aren't honored, we clear the NAN bits.
Now, for the above case we actually don't know anything about
the op1 range (except that it isn't a NAN/INF because of
!HONOR_NANS !HONOR_INFINITIES), so I think the best is just
to return VARYING for the case we get UNDEFINED as well.

If we want, the op[12]_range methods perhaps can handle the
corner cases earlier separately, say for
lhs [0.0, 0.0] and op2 [0.0, 0.0] when HONOR_SIGNED_ZEROS this
would be just [0.0, MAX].

2022-11-16  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/107668
	* range-op-float.cc (float_binary_op_range_finish): Set VARYING
	also when r is UNDEFINED.

	* gcc.dg/ubsan/pr107668.c: New test.
2022-11-16 07:30:07 +01:00
François Dumont 2b7f0378b9 libstdc++: Fix gdb FilteringTypePrinter
Once we found a matching FilteringTypePrinter instance we look for the associated
typedef and check that the returned Python Type is equal to the Type to recognize.
But gdb Python Type includes properties to distinguish a typedef from the actual
type. So use gdb.types.get_basic_type to check if we are indeed on the same type.

Additionnaly enhance FilteringTypePrinter matching mecanism by introducing targ1 that,
if not None, will be used as the 1st template parameter.

libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py (FilteringTypePrinter): Rename 'match' field
	'template'. Add self.targ1 to specify the first template parameter of the instantiation
	to match.
	(add_one_type_printer): Add targ1 optional parameter, default to None.
	Use gdb.types.get_basic_type to compare the type to recognize and the type
	returned from the typedef lookup.
	(register_type_printers): Adapt calls to add_one_type_printers.
2022-11-16 06:53:31 +01:00
Kewen Lin 63e1b2e767 rtl: Try to remove EH edges after {pro,epi}logue generation [PR90259]
After prologue and epilogue generation, the judgement on whether
one memory access onto stack frame may trap or not could change,
since we get more exact stack information by now.

As PR90259 shows, some memory access becomes impossible to trap
any more after prologue and epilogue generation, it can make
subsequent optimization be able to remove it if safe, but it
results in unexpected control flow status due to REG_EH_REGION
note missing.

This patch proposes to try to remove EH edges with function
purge_all_dead_edges after prologue and epilogue generation,
it simplifies CFG as early as we can and don't need any fixup
in downstream passes.

CFG simplification result with PR90259's case as example:

*before*

   18: %1:TF=call [`__gcc_qdiv'] argc:0
      REG_EH_REGION 0x2
   77: NOTE_INSN_BASIC_BLOCK 3
   19: NOTE_INSN_DELETED
   20: NOTE_INSN_DELETED
  110: [%31:SI+0x20]=%1:DF
      REG_EH_REGION 0x2
  116: NOTE_INSN_BASIC_BLOCK 4
  111: [%31:SI+0x28]=%2:DF
      REG_EH_REGION 0x2
   22: NOTE_INSN_BASIC_BLOCK 5
  108: %0:DF=[%31:SI+0x20]
      REG_EH_REGION 0x2
  117: NOTE_INSN_BASIC_BLOCK 6
  109: %1:DF=[%31:SI+0x28]
      REG_EH_REGION 0x2
   79: NOTE_INSN_BASIC_BLOCK 7
   26: [%31:SI+0x18]=%0:DF
  104: pc=L69
  105: barrier

*after*

   18: %1:TF=call [`__gcc_qdiv'] argc:0
      REG_EH_REGION 0x2
   77: NOTE_INSN_BASIC_BLOCK 3
   19: NOTE_INSN_DELETED
   20: NOTE_INSN_DELETED
  110: [%31:SI+0x20]=%1:DF
  111: [%31:SI+0x28]=%2:DF
  108: %0:DF=[%31:SI+0x20]
  109: %1:DF=[%31:SI+0x28]
   26: [%31:SI+0x18]=%0:DF
  104: pc=L69
  105: barrier

	PR rtl-optimization/90259

gcc/ChangeLog:

	* function.cc (rest_of_handle_thread_prologue_and_epilogue): Add
	parameter fun, and call function purge_all_dead_edges.
	(pass_thread_prologue_and_epilogue::execute): Name unamed parameter
	as fun, and use it for rest_of_handle_thread_prologue_and_epilogue.

gcc/testsuite/ChangeLog:

	* g++.target/powerpc/pr90259.C: New.
2022-11-15 20:26:07 -06:00
GCC Administrator cdc34229c1 Daily bump. 2022-11-16 00:17:09 +00:00
Marek Polacek ed1797ddf8 c++: Disable -Wignored-qualifiers for template args [PR107492]
It seems wrong to issue a -Wignored-qualifiers warning for code like:

  static_assert(!is_same_v<void(*)(), const void(*)()>);

because there the qualifier matters.  Likewise in template
specialization:

  template<typename T> struct S { };
  template<> struct S<void(*)()> { };
  template<> struct S<const void(*)()> { }; // OK, not a redefinition

And likewise in other type-id contexts such as trailing-return-type:

  auto g() -> const void (*)();

This patch limits the warning to the function declaration context only.

	PR c++/107492

gcc/cp/ChangeLog:

	* decl.cc (grokdeclarator): Only emit a -Wignored-qualifiers warning
	when funcdecl_p.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wignored-qualifiers3.C: New test.
2022-11-15 17:44:13 -05:00
Philipp Tomsich c717a92dd8 RISC-V: Zihintpause: add __builtin_riscv_pause
The Zihintpause extension uses an opcode from the 'fence' opcode range
to add a true hint instruction (i.e. if it is not supported on any
given platform, the 'fence' that is encoded will not enforce any
specific ordering on memory accesses) for entering a low-power state
(e.g. in an idle thread).  We expose this new instruction through a
machine-dependent builtin to allow generating it without a requirement
for any inline assembly.

Given that the encoding of 'pause' is valid (as a 'fence' encoding)
even for processors that do not (yet) support Zihintpause, we make
this builtin available without any further TARGET_* constraints.

gcc/ChangeLog:

	* config/riscv/riscv-builtins.cc (struct riscv_builtin_description):
	add the pause machine-dependent builtin with no result and no
	arguments; mark it as always present (pause is a true hint
	that encodes into a fence-insn, if not supported with the new
	pause semantics).
	* config/riscv/riscv-ftypes.def: Add type for void -> void.
	* config/riscv/riscv.md (riscv_pause): Add risc_pause and
	UNSPECV_PAUSE
	* doc/extend.texi: Document __builtin_riscv_pause.
	* optabs.cc (maybe_gen_insn): Allow nops == 0 (void -> void).

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/builtin_pause.c: New test.
2022-11-15 23:11:31 +01:00
David Faust 6052482f84 bpf: avoid possible use of uninitialized variable
Fix a maybe-uninitialized warning introduced in commit:
068baae186 bpf: add preserve_field_info builtin

gcc/

	* config/bpf/bpf.cc (bpf_expand_builtin): Avoid use of uninitialized
	variable in error case.
2022-11-15 11:01:36 -08:00
David Malcolm 86a9000686 analyzer: add warnings relating to sockets [PR106140]
This patch generalizes the analyzer's file descriptor state machine
so that it tracks the states of sockets.

It adds two new warnings relating to misuses of socket APIs:
* -Wanalyzer-fd-phase-mismatch (e.g. calling 'accept' on a socket
before calling 'listen' on it)
* -Wanalyzer-fd-type-mismatch (e.g. using a stream socket operation
on a datagram socket)

gcc/analyzer/ChangeLog:
	PR analyzer/106140
	* analyzer-language.cc (on_finish_translation_unit): Stash named
	constants "SOCK_STREAM" and "SOCK_DGRAM".
	* analyzer.opt (Wanalyzer-fd-phase-mismatch): New.
	(Wanalyzer-fd-type-mismatch): New.
	* engine.cc (impl_region_model_context::get_state_map_by_name):
	Add "out_sm_context" param.  Allow out_sm_idx to be NULL.
	* exploded-graph.h
	(impl_region_model_context::get_state_map_by_name):
	Add "out_sm_context" param.
	* region-model-impl-calls.cc (region_model::impl_call_accept): New.
	(region_model::impl_call_bind): New.
	(region_model::impl_call_connect): New.
	(region_model::impl_call_listen): New.
	(region_model::impl_call_socket): New.
	* region-model.cc (region_model::on_call_pre): Special-case
	"bind".
	(region_model::on_call_post): Special-case "accept", "bind",
	"connect", "listen", and "socket".
	* region-model.h (region_model::impl_call_accept): New decl.
	(region_model::impl_call_bind): New decl.
	(region_model::impl_call_connect): New decl.
	(region_model::impl_call_listen): New decl.
	(region_model::impl_call_socket): New decl.
	(region_model::on_socket): New decl.
	(region_model::on_bind): New decl.
	(region_model::on_listen): New decl.
	(region_model::on_accept): New decl.
	(region_model::on_connect): New decl.
	(region_model::add_constraint): Make public.
	(region_model::check_for_poison): Make public.
	(region_model_context::get_state_map_by_name): Add out_sm_context param.
	(region_model_context::get_fd_map): Likewise.
	(region_model_context::get_malloc_map): Likewise.
	(region_model_context::get_taint_map): Likewise.
	(noop_region_model_context::get_state_map_by_name): Likewise.
	(region_model_context_decorator::get_state_map_by_name): Likewise.
	* sm-fd.cc: Include "analyzer/supergraph.h" and
	"analyzer/analyzer-language.h".
	(enum expected_phase): New enum.
	(fd_state_machine::m_new_datagram_socket): New.
	(fd_state_machine::m_new_stream_socket): New.
	(fd_state_machine::m_new_unknown_socket): New.
	(fd_state_machine::m_bound_datagram_socket): New.
	(fd_state_machine::m_bound_stream_socket): New.
	(fd_state_machine::m_bound_unknown_socket): New.
	(fd_state_machine::m_listening_stream_socket): New.
	(fd_state_machine::m_m_connected_stream_socket): New.
	(fd_state_machine::m_SOCK_STREAM): New.
	(fd_state_machine::m_SOCK_DGRAM): New.
	(fd_diagnostic::describe_state_change): Handle socket states.
	(fd_diagnostic::get_meaning_for_state_change): Likewise.
	(class fd_phase_mismatch): New.
	(enum expected_type): New enum.
	(class fd_type_mismatch): New.
	(fd_state_machine::fd_state_machine): Initialize new states and
	stashed named constants.
	(fd_state_machine::is_socket_fd_p): New.
	(fd_state_machine::is_datagram_socket_fd_p): New.
	(fd_state_machine::is_stream_socket_fd_p): New.
	(fd_state_machine::on_close): Handle the socket states.
	(fd_state_machine::check_for_open_fd): Complain about fncalls on
	sockets in the wrong phase.  Support socket FDs.
	(add_constraint_ge_zero): New.
	(fd_state_machine::get_state_for_socket_type): New.
	(fd_state_machine::on_socket): New.
	(fd_state_machine::check_for_socket_fd): New.
	(fd_state_machine::check_for_new_socket_fd): New.
	(fd_state_machine::on_bind): New.
	(fd_state_machine::on_listen): New.
	(fd_state_machine::on_accept): New.
	(fd_state_machine::on_connect): New.
	(fd_state_machine::can_purge_p): Don't purge socket values.
	(get_fd_state): New.
	(region_model::mark_as_valid_fd): Use get_fd_state.
	(region_model::on_socket): New.
	(region_model::on_bind): New.
	(region_model::on_listen): New.
	(region_model::on_accept): New.
	(region_model::on_connect): New.
	* sm-fd.dot: Update to reflect sm-fd.cc changes.

gcc/ChangeLog:
	PR analyzer/106140
	* doc/invoke.texi (Static Analyzer Options): Add
	-Wanalyzer-fd-phase-mismatch and -Wanalyzer-fd-type-mismatch.  Add
	"socket", "bind", "listen", "accept", and "connect" to the list of
	functions known to the analyzer.

gcc/testsuite/ChangeLog:
	PR analyzer/106140
	* gcc.dg/analyzer/fd-accept.c: New test.
	* gcc.dg/analyzer/fd-bind.c: New test.
	* gcc.dg/analyzer/fd-connect.c: New test.
	* gcc.dg/analyzer/fd-datagram-socket.c: New test.
	* gcc.dg/analyzer/fd-glibc-byte-stream-connection-server.c: New test.
	* gcc.dg/analyzer/fd-glibc-byte-stream-socket.c: New test.
	* gcc.dg/analyzer/fd-glibc-datagram-client.c: New test.
	* gcc.dg/analyzer/fd-glibc-datagram-socket.c: New test.
	* gcc.dg/analyzer/fd-glibc-make_named_socket.h: New test.
	* gcc.dg/analyzer/fd-listen.c: New test.
	* gcc.dg/analyzer/fd-manpage-getaddrinfo-client.c: New test.
	* gcc.dg/analyzer/fd-mappage-getaddrinfo-server.c: New test.
	* gcc.dg/analyzer/fd-socket-meaning.c: New test.
	* gcc.dg/analyzer/fd-socket-misuse.c: New test.
	* gcc.dg/analyzer/fd-stream-socket-active-open.c: New test.
	* gcc.dg/analyzer/fd-stream-socket-passive-open.c: New test.
	* gcc.dg/analyzer/fd-stream-socket.c: New test.
	* gcc.dg/analyzer/fd-symbolic-socket.c: New test.
	* gcc.dg/analyzer/pr104369-1.c: Add -Wno-analyzer-too-complex and
	-Wno-analyzer-fd-leak to options.
	* gcc.dg/analyzer/pr104369-2.c: Add -Wno-analyzer-fd-leak to
	options.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-11-15 13:53:42 -05:00
David Malcolm d8aba860b3 c, analyzer: support named constants in analyzer [PR106302]
The analyzer's file-descriptor state machine tracks the access mode of
opened files, so that it can emit -Wanalyzer-fd-access-mode-mismatch.

To do this, its symbolic execution needs to "know" the values of the
constants "O_RDONLY", "O_WRONLY", and "O_ACCMODE".  Currently
analyzer/sm-fd.cc simply uses these values directly from the build-time
header files, but these are the values on the host, not those from the
target, which could be different (PR analyzer/106302).

In an earlier discussion of this issue:
  https://gcc.gnu.org/pipermail/gcc/2022-June/238954.html
we talked about adding a target hook for this.

However, I've also been experimenting with extending the fd state
machine to track sockets (PR analyzer/106140).  For this, it's useful to
"know" the values of the constants "SOCK_STREAM" and "SOCK_DGRAM".
Unfortunately, these seem to have many arbitrary differences from target
to target.

For example: Linux/glibc general has SOCK_STREAM == 1, SOCK_DGRAM == 2,
as does AIX, but annoyingly, e.g. Linux on MIPS has them the other way
around.

It seems to me that as the analyzer grows more ambitious modeling of the
behavior of APIs (perhaps via plugins) it's more likely that the
analyzer will need to know the values of named constants, which might
not even exist on the host.

For example, at LPC it was suggested to me that -fanalyzer could check
rules about memory management inside the Linux kernel (probably via a
plugin), but doing so involves a bunch of GFP_* flags (see PR 107472).

So rather than trying to capture all this knowledge in a target hook,
this patch attempts to get at named constant values from the user's
source code.

The patch adds an interface for frontends to call into the analyzer as
the translation unit finishes.  The analyzer can then call back into the
frontend to ask about the values of the named constants it cares about
whilst the frontend's data structures are still around.

The patch implements this for the C frontend, which looks up the names
by looking for named CONST_DECLs (which handles enum values).  Failing
that, it attempts to look up the values of macros but only the simplest
cases are supported (a non-traditional macro with a single CPP_NUMBER
token).  It does this by building a buffer containing the macro
definition and rerunning a lexer on it.

The analyzer gracefully handles the cases where named values aren't
found (such as anything more complicated than described above).

The patch ports the analyzer to use this mechanism for "O_RDONLY",
"O_WRONLY", and "O_ACCMODE".  I have successfully tested my socket patch
to also use this for "SOCK_STREAM" and "SOCK_DGRAM", so the technique
seems to work.

gcc/ChangeLog:
	PR analyzer/106302
	* Makefile.in (ANALYZER_OBJS): Add analyzer/analyzer-language.o.
	(GTFILES): Add analyzer/analyzer-language.cc.
	* doc/analyzer.texi: Document __analyzer_dump_named_constant.

gcc/analyzer/ChangeLog:
	PR analyzer/106302
	* analyzer-language.cc: New file.
	* analyzer-language.h: New file.
	* analyzer.h (get_stashed_constant_by_name): New decl.
	(log_stashed_constants): New decl.
	* engine.cc (impl_run_checkers): Call log_stashed_constants.
	* region-model-impl-calls.cc
	(region_model::impl_call_analyzer_dump_named_constant): New.
	* region-model.cc (region_model::on_stmt_pre): Handle
	__analyzer_dump_named_constant.
	* region-model.h
	(region_model::impl_call_analyzer_dump_named_constant): New decl.
	* sm-fd.cc (fd_state_machine::m_O_ACCMODE): New.
	(fd_state_machine::m_O_RDONLY): New.
	(fd_state_machine::m_O_WRONLY): New.
	(fd_state_machine::fd_state_machine): Initialize the new fields.
	(fd_state_machine::get_access_mode_from_flag): Use the new fields,
	rather than using the host values.

gcc/c/ChangeLog:
	PR analyzer/106302
	* c-parser.cc: Include "analyzer/analyzer-language.h" and "toplev.h".
	(class ana::c_translation_unit): New.
	(c_parser_translation_unit): Call ana::on_finish_translation_unit.

gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/analyzer-decls.h
	(__analyzer_dump_named_constant): New decl.
	* gcc.dg/analyzer/fd-4.c (void): Likewise.
	(O_ACCMODE): Define.
	* gcc.dg/analyzer/fd-access-mode-enum.c: New test, based on .
	* gcc.dg/analyzer/fd-5.c: ...this.  Rename to...
	* gcc.dg/analyzer/fd-access-mode-macros.c: ...this.
	(O_ACCMODE): Define.
	* gcc.dg/analyzer/fd-access-mode-target-headers.c: New test, also
	based on fd-5.c.
	(test_sm_fd_constants): New.
	* gcc.dg/analyzer/fd-dup-1.c (O_ACCMODE): Define.
	* gcc.dg/analyzer/named-constants-via-enum.c: New test.
	* gcc.dg/analyzer/named-constants-via-enum-and-macro.c: New test.
	* gcc.dg/analyzer/named-constants-via-macros-2.c: New test.
	* gcc.dg/analyzer/named-constants-via-macros.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-11-15 13:53:42 -05:00
Nathan Sidwell 46c3d9c8e8 demangler: Templated lambda demangling
Templated lambdas have a template-head, which is part of their
signature.  GCC ABI 18 mangles that into the lambda name.  This adds
support to the demangler.  We have to introduce artificial template
parameter names, as we need to refer to them from later components of
the lambda signature. We use $T:n, $N:n and $TT:n for type, non-type
and template parameters.  Non-type parameter names are not shown in
the strictly correct location -- for instance 'int (&NT) ()' would be
shown as 'int (&) $N:n'.  That's unfortunate, but an orthogonal issue.
The 'is_lambda_arg' field is now repurposed as indicating the number
of explicit template parameters (1-based).

	include/
	* demangle.h (enum demangle_component_type): Add
	DEMANGLE_COMPONENT_TEMPLATE_HEAD,
	DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM,
	DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM,
	DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM,
	DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM.
	libiberty/
	* cp-demangle.c (struct d_print_info): Rename is_lambda_arg to
	lambda_tpl_parms.  Augment semantics.
	(d_make_comp): Add checks for new components.
	(d_template_parm, d_template_head): New.
	(d_lambda): Add templated lambda support.
	(d_print_init): Adjust.
	(d_print_lambda_parm_name): New.
	(d_print_comp_inner): Support templated lambdas,
	* testsuite/demangle-expected: Add testcases.
2022-11-15 13:34:56 -05:00
Lewis Hyatt ee08aa9ab4 diagnostics: Remove null-termination requirement for json::string
json::string currently handles null-terminated data and so can't work with
data that may contain embedded null bytes or that is not null-terminated.
Supporting such data will make json::string more robust in some contexts, such
as SARIF output, which uses it to output user source code that may contain
embedded null bytes.

gcc/ChangeLog:

	* json.h (class string): Add M_LEN member to store the length of
	the data.  Add constructor taking an explicit length.
	* json.cc (string::string):  Implement the new constructor.
	(string::print): Support printing strings that are not
	null-terminated.  Escape embdedded null bytes on output.
	(test_writing_strings): Test the new null-byte-related features of
	json::string.
2022-11-15 10:50:23 -05:00
Lewis Hyatt 15d315553f diagnostics: Use an inline function rather than hardcoding <built-in> string
The string "<built-in>" is hard-coded in several places throughout the
diagnostics code, and in some of those places, it is used incorrectly with
respect to internationalization. (Comparing a translated string to an
untranslated string.) The error is not currently observable in any output GCC
actually produces, hence no testcase added here, but it's worth fixing, and
also, I am shortly going to add a new such string and want to avoid hardcoding
that one in similar places.

gcc/c-family/ChangeLog:

	* c-opts.cc (c_finish_options): Use special_fname_builtin () rather
	than a hard-coded string.

gcc/ChangeLog:

	* diagnostic.cc (diagnostic_get_location_text): Use
	special_fname_builtin () rather than a hardcoded string (which was
	also incorrectly left untranslated previously.)
	* input.cc (special_fname_builtin): New function.
	(expand_location_1): Use special_fname_builtin () rather than a
	hard-coded string.
	(test_builtins): Likewise.
	* input.h (special_fname_builtin): Declare.

gcc/fortran/ChangeLog:

	* cpp.cc (gfc_cpp_init): Use special_fname_builtin () rather than a
	hardcoded string (which was also incorrectly left untranslated
	previously.)
	* error.cc (gfc_diagnostic_build_locus_prefix): Likewise.
	* f95-lang.cc (gfc_init): Likewise.
2022-11-15 10:50:23 -05:00
Lewis Hyatt 6238cc20f0 diagnostics: Fix macro tracking for ad-hoc locations
The result of linemap_resolve_location() can be an ad-hoc location, if that is
what was stored in a relevant macro map.  maybe_unwind_expanded_macro_loc()
did not previously handle this case, causing it to print the wrong tracking
information for an example such as the new testcase macro-trace-1.c.  Fix that
by checking for ad-hoc locations where needed.

gcc/ChangeLog:

	* tree-diagnostic.cc (maybe_unwind_expanded_macro_loc): Handle ad-hoc
	location in return value of linemap_resolve_location().

gcc/testsuite/ChangeLog:

	* c-c++-common/cpp/macro-trace-1.c: New test.
2022-11-15 10:50:23 -05:00
Martin Liska 3037f11fb8 libsanitizer: update LOCAL_PATCHES
libsanitizer/ChangeLog:

	* LOCAL_PATCHES: Update local patches.
2022-11-15 16:45:21 +01:00
Martin Liska f5468467ce asan: update expected format based on ASAN
gcc/testsuite/ChangeLog:

	* c-c++-common/asan/global-overflow-1.c: Update
	expected format.
	* c-c++-common/asan/heap-overflow-1.c: Likewise.
	* c-c++-common/asan/strlen-overflow-1.c: Likewise.
	* c-c++-common/asan/strncpy-overflow-1.c: Likewise.
	* c-c++-common/hwasan/heap-overflow.c: Likewise.
	* g++.dg/asan/asan_mem_test.cc: Likewise.
	* g++.dg/asan/asan_oob_test.cc: Likewise.
	* g++.dg/asan/asan_str_test.cc: Likewise.
	* g++.dg/asan/asan_test.cc: Likewise.
	* g++.dg/asan/large-func-test-1.C: Likewise.
2022-11-15 16:45:00 +01:00
Martin Liska 0c7a928859 libsanitizer: Apply local patches 2022-11-15 16:44:59 +01:00
Martin Liska 5f3fa2655c libsanitizer: merge from upstream ae59131d3ef311fb4b1e50627c6457be00e60dc9 2022-11-15 16:44:55 +01:00
Wilco Dijkstra d1288d8509 libatomic: Add support for LSE and LSE2
Add support for AArch64 LSE and LSE2 to libatomic.  Disable outline atomics,
and use LSE ifuncs for 1-8 byte atomics and LSE2 ifuncs for 16-byte atomics.
On Neoverse V1, 16-byte atomics are ~4x faster due to avoiding locks.

Note this is safe since we swap all 16-byte atomics using the same ifunc,
so they either use locks or LSE2 atomics, but never a mix. This also improves
ABI compatibility with LLVM: its inlined 16-byte atomics are compatible with
the new libatomic if LSE2 is supported.

libatomic/
	* Makefile.in: Regenerated with automake 1.15.1.
	* Makefile.am: Add atomic_16.S for AArch64.
	* configure.tgt: Disable outline atomics in AArch64 build.
	* config/linux/aarch64/atomic_16.S: New file - implementation of
	ifuncs for 16-byte atomics.
	* config/linux/aarch64/host-config.h: Enable ifuncs, use LSE
	(HWCAP_ATOMICS) for 1-8-byte atomics and LSE2 (HWCAP_USCAT) for
	16-byte atomics.
2022-11-15 15:08:33 +00:00
Patrick Palka 5925f0ec54 c++: remove i_c_e_p parm from tsubst_copy_and_build
It seems the only and original purpose of tsubst_copy_and_build's
integral_constant_expression_p boolean parameter (added in r116276, which
predates the constexpr machinery) is to diagnose certain constructs that
aren't allowed to appear in a C++98 integral constant expression
context, specifically casts to a non-integral type (diagnosed from the
*_CAST_EXPR case of tsubst_copy_and_build) or dependent names that
resolve to a non-constant decl (diagnosed from the IDENTIFIER_NODE case
of tsubst_copy_and_build).  The parameter has no effect outside of C++98
AFAICT.

But diagnosing such constructs should arguably be the job of the constexpr
machinery (e.g. is_constant_expression) after substitution, and doing it
during substitution by way of an additional parameter complicates the
API of this workhorse function for what amounts to a couple of archaic
C++98 restrictions.  And it seems is_constant_expression already does a
good job of diagnosing the aforementioned two constructs in C++98 mode,
at least as far as our testsuite is concerned.

So this patch removes this parameter from tsubst_copy_and_build,
tsubst_expr and tsubst_copy_and_build_call_args.  The only interesting
changes are to potential_constant_expression_1 and the IDENTIFIER_NODE
and *_CAST_EXPR cases of tsubst_copy_and_build; the rest are mechanical
adjustments to the functions' signatures and their call sites.

gcc/cp/ChangeLog:

	* constexpr.cc (potential_constant_expression_1)
	<case *_CAST_EXPR>: Use
	cast_valid_in_integral_constant_expression_p instead of
	open coding it.
	* constraint.cc (tsubst_valid_expression_requirement): Adjust
	calls to tsubst_copy_and_build and tsubst_expr.
	(tsubst_constraint): Likewise.
	(satisfy_atom): Likewise.
	(diagnose_trait_expr): Likewise.
	* cp-tree.h (tsubst_copy_and_build): Remove i_c_e_p parameter.
	(tsubst_expr): Likewise.
	* init.cc (get_nsdmi): Adjust calls to tsubst_copy_and_build
	and tsubst_expr.
	* pt.cc (expand_integer_pack): Likewise.
	(instantiate_non_dependent_expr_internal): Likewise.
	(tsubst_friend_function): Likewise.
	(tsubst_attribute): Likewise.
	(instantiate_class_template): Likewise.
	(tsubst_template_arg): Likewise.
	(gen_elem_of_pack_expansion_instantiation): Likewise.
	(tsubst_fold_expr_init): Likewise.
	(tsubst_pack_expansion): Likewise.
	(tsubst_default_argument): Likewise.
	(tsubst_function_decl): Likewise.
	(tsubst_decl): Likewise.
	(tsubst_arg_types): Likewise.
	(tsubst_exception_specification): Likewise.
	(tsubst): Likewise.
	(tsubst_init): Likewise.
	(tsubst_copy): Likewise.
	(tsubst_omp_clause_decl): Likewise.
	(tsubst_omp_clauses): Likewise.
	(tsubst_copy_asm_operands): Likewise.
	(tsubst_omp_for_iterator): Likewise.
	(tsubst_expr): Likewise.  Remove i_c_e_p parameter.
	(tsubst_omp_udr): Likewise.
	(tsubst_non_call_postfix_expression): Likewise.  Remove i_c_e_p parameter.
	(tsubst_lambda_expr): Likewise.
	(tsubst_copy_and_build_call_args): Likewise.
	(tsubst_copy_and_build): Likewise.  Remove i_c_e_p parameter.
	<case IDENTIFIER_NODE>: Adjust call to finish_id_expression
	following removal of i_c_e_p.
	<case *_CAST_EXPR>: Remove C++98-specific cast validity check
	guarded by i_c_e_p.
	(maybe_instantiate_noexcept): Adjust calls to
	tsubst_copy_and_build and tsubst_expr.
	(instantiate_body): Likewise.
	(instantiate_decl): Likewise.
	(tsubst_initializer_list): Likewise.
	(tsubst_enum): Likewise.

gcc/objcp/ChangeLog:

	* objcp-lang.cc (objcp_tsubst_copy_and_build): Adjust calls to
	tsubst_copy_and_build and tsubst_expr.

gcc/testsuite/ChangeLog:

	* g++.dg/template/crash55.C: Don't expect additional
	C++98-specific diagnostics.
	* g++.dg/template/ref3.C: Remove C++98-specific xfail.
2022-11-15 09:32:21 -05:00
Patrick Palka c52c322627 c++: remove function_p parm from tsubst_copy_and_build
The function_p parameter of tsubst_copy_and_build (added in r69316) is
inspected only in its IDENTIFIER_NODE case, where it controls whether we
diagnose unqualified name lookup failure for the given identifier.  But
I think ever since r173965, we never substitute an IDENTIFIER_NODE with
function_p=true for which the lookup can possibly fail, and therefore
the flag is effectively unneeded.

Before that commit, we would incorrectly repeat unqualified lookup for
an ADL-enabled CALL_EXPR at instantiation time, which naturally could
fail and thus motivated the flag.  Afterwards, we no longer substitute
an IDENTIFIER_NODE callee when koenig_p is true, so the flag isn't needed
for its original purpose.  What about when koenig_p=false?  Apparently
we still may have an IDENTIFIER_NODE callee in this case, namely when
unqualified name lookup found a dependent local function declaration,
but repeating that lookup can't fail (ditto for USING_DECL callees).

So this patch removes this effectively unneeded parameter from
tsubst_copy_and_build.  It also updates an outdated comment in the
CALL_EXPR case about when we may see an IDENTIFIER_NODE callee with
koenig_p=false.

gcc/cp/ChangeLog:

	* cp-lang.cc (objcp_tsubst_copy_and_build): Remove
	function_p parameter.
	* cp-objcp-common.h (objcp_tsubst_copy_and_build):
	Likewise.
	* cp-tree.h (tsubst_copy_and_build): Likewise.
	* init.cc (get_nsdmi): Adjust calls to tsubst_copy_and_build.
	* pt.cc (expand_integer_pack): Likewise.
	(instantiate_non_dependent_expr_internal): Likewise.
	(tsubst_function_decl): Likewise.
	(tsubst_arg_types): Likewise.
	(tsubst_exception_specification): Likewise.
	(tsubst): Likewise.
	(tsubst_copy_asm_operands): Likewise.
	(tsubst_expr): Likewise.
	(tsubst_non_call_postfix_expression): Likewise.
	(tsubst_lambda_expr): Likewise.
	(tsubst_copy_and_build_call_args): Likewise.
	(tsubst_copy_and_build): Remove function_p parameter
	and adjust function comment.  Adjust recursive calls.
	<case CALL_EXPR>: Update outdated comment about when
	we can see an IDENTIFIER_NODE callee with koenig_p=false.
	(maybe_instantiate_noexcept): Adjust calls to
	tsubst_copy_and_build.

gcc/objcp/ChangeLog:

	* objcp-lang.cc (objcp_tsubst_copy_and_build): Remove
	function_p parameter.
2022-11-15 09:31:54 -05:00
Jonathan Wakely c68c468e0e libstdc++: Fix std::format test for strict -std=c++20 mode
Adjust a test to avoid using std::make_unsigned_t<__int128>. That's
ill-formed in strict modes because std::is_integral_v<__int128> is
false.

libstdc++-v3/ChangeLog:

	* testsuite/std/format/functions/format.cc: Do not use
	std::make_unsigned_t<__int128>.
2022-11-15 14:24:57 +00:00
Jonathan Wakely a5d4f38fbe libstc++: std::formattable concept should not be defined for C++20
This concept was added by a C++23 proposal, so don't define it for
C++20.

Split the format/formatter/formatter.cc test into two parts, one that
tests the C++20 requirements and one that tests the C++23 concept.

libstdc++-v3/ChangeLog:

	* include/std/format (formattable): Only define for C++23/
	* testsuite/std/format/formatter.cc: Moved to...
	* testsuite/std/format/formatter/requirements.cc: ...here.
	* testsuite/std/format/formatter/concept.cc: New test.
	* testsuite/std/format/functions/format.cc: Replace use of
	std::formattable in C++20.
2022-11-15 14:01:39 +00:00
Jonathan Wakely ce86d9678b libstdc++: Fix detection of std::format support for __float128 [PR107693]
std::format gives linker errors on targets that define __float128 but
do not support using it with std::to_chars. This improves the handling
of 128-bit flaoting-point types so they are disabled if unsupportable.

libstdc++-v3/ChangeLog:

	PR libstdc++/107693
	* include/std/format (_GLIBCXX_FORMAT_F128): Define to 2 when
	basic_format_arg needs to use its _M_f128 member.
	(__extended_floating_point, __floating_point): Replace with ...
	(__formattable_floating_point): New concept.
	* testsuite/std/format/functions/format.cc: Check whether
	__float128 is supported. Also test _Float128.
2022-11-15 14:01:39 +00:00
Martin Liska 3895318beb libsanitizer: use git clone --depth 1
Using depth == 1 it makes the cloning much faster.

libsanitizer/ChangeLog:

	* merge.sh: Use git clone --depth 1.
2022-11-15 14:18:27 +01:00
Martin Liska fe26b040ce Revert "docs: Fix expected diagnostics URL [PR107599]"
This reverts commit f94c2eff6b.
2022-11-15 13:51:25 +01:00
Jonathan Wakely d34dea05f8 libstdc++: Document use of Markdown for Doxygen comments
libstdc++-v3/ChangeLog:

	* doc/xml/manual/documentation_hacking.xml: Document use of
	Markdown for Doxygen comments. Tweak formatting.
	* doc/html/manual/documentation_hacking.html: Regenerate.
2022-11-15 11:35:52 +00:00
Jonathan Wakely f5f2686b2c doc: Format region pragmas as separate items
This seems consistent with how other paired pragmas are documented in
texinfo, e.g. push_options and pop_options.

gcc/ChangeLog:

	* doc/cpp.texi (Pragmas): Use @item and @itemx for region
	pragmas.
2022-11-15 11:35:52 +00:00
Maciej W. Rozycki dd320623ac ira: Remove duplicate memset' over full_costs' from `assign_hard_reg'
Remove duplicate clearing of `full_costs' made in `assign_hard_reg',
which has been there since the beginning, i.e. commit 058e97ecf3
("IRA has been merged into trunk"),
<https://gcc.gnu.org/ml/gcc-patches/2008-08/msg01932.html>.

	gcc/
	* ira-color.cc (assign_hard_reg): Remove duplicate `memset' over
	`full_costs'.
2022-11-15 11:23:02 +00:00
Andre Vieira 28f636a0b0 aarch64: Add support for widening LDAPR instructions
gcc/ChangeLog:

	* config/aarch64/atomics.md
	(*aarch64_atomic_load<ALLX:mode>_rcpc_zext): New pattern.
	(*aarch64_atomic_load<ALLX:mode>_rcpc_sext): New pattern.

gcc/testsuite/ChangeLog:
	* gcc.target/aarch64/ldapr-ext.c: New test.
2022-11-15 09:50:46 +00:00
Andre Vieira 0431e8ae5b aarch64: Enable the use of LDAPR for load-acquire semantics
This patch enables the use of LDAPR for load-acquire semantics.

2022-11-15  Andre Vieira  <andre.simoesdiasvieira@arm.com>
	    Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

gcc/ChangeLog:

	* config/aarch64/aarch64.h (AARCH64_ISA_RCPC): New Macro.
	(TARGET_RCPC): New Macro.
	* config/aarch64/atomics.md (atomic_load<mode>): Change into an expand.
	(aarch64_atomic_load<mode>_rcpc): New define_insn for ldapr.
	(aarch64_atomic_load<mode>): Rename of old define_insn for ldar.
	* config/aarch64/iterators.md (UNSPEC_LDAP): New unspec enum value.
	* doc/invoke.texi (rcpc): Ammend documentation to mention the effects
	on code generation.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/ldapr.c: New test.
2022-11-15 09:50:39 +00:00
Martin Liska 9a4129f5c5 gcc-changelog: revert temporary rule relaxation
contrib/ChangeLog:

	* gcc-changelog/git_commit.py: Revert temporary rule
	relaxation.
2022-11-15 09:34:50 +01:00