195428 Commits

Author SHA1 Message Date
Jiufu Guo
34ea461fdb rs6000: fix misleading new patterns of splitters
As a comment in
https://gcc.gnu.org/pipermail/gcc-patches/2022-August/599556.html

Those splitters call rs6000_emit_set_const directly, and the replacements
are never used.  Using (pc) would be less misleading.

gcc/ChangeLog:

	* config/rs6000/rs6000.md: (constant splitters): Use "(pc)" as the
	replacements.
2022-09-07 13:21:56 +08:00
Ian Lance Taylor
c0852b51b7 runtime: ignore __morestack function in runtime.Callers
We were ignoring all functions starting with "__morestack_", but not
the function "__morestack" itself.  Without this change, some tests
such as recover.go started failing recently, though I'm not sure
exactly what changed.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/427935
2022-09-06 18:39:50 -07:00
Kewen Lin
7a43e52a48 rs6000/test: Fix empty TU in some cases of effective targets [PR106345]
As the failure of test case gcc.target/powerpc/pr92398.p9-.c in
PR106345 shows, some test sources for some powerpc effective
targets use empty translation unit wrongly.  The test sources
could go with options like "-ansi -pedantic-errors", then those
effective target checkings will fail unexpectedly with the
error messages like:

  error: ISO C forbids an empty translation unit [-Wpedantic]

This patch is to fix empty TUs with one dummy function definition
accordingly.

	PR testsuite/106345

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp (check_effective_target_powerpc_sqrt): Add
	a function definition to avoid pedwarn about empty translation unit.
	(check_effective_target_has_arch_pwr5): Likewise.
	(check_effective_target_has_arch_pwr6): Likewise.
	(check_effective_target_has_arch_pwr7): Likewise.
	(check_effective_target_has_arch_pwr8): Likewise.
	(check_effective_target_has_arch_pwr9): Likewise.
	(check_effective_target_has_arch_pwr10): Likewise.
	(check_effective_target_has_arch_ppc64): Likewise.
	(check_effective_target_ppc_float128): Likewise.
	(check_effective_target_ppc_float128_insns): Likewise.
	(check_effective_target_powerpc_vsx): Likewise.
2022-09-06 20:37:57 -05:00
liuhongt
c13223b790 Extend vectorizer to handle nonlinear induction for neg, mul/lshift/rshift with a constant.
For neg, the patch create a vec_init as [ a, -a, a, -a, ...  ] and no
vec_step is needed to update vectorized iv since vf is always multiple
of 2(negative * negative is positive).

For shift, the patch create a vec_init as [ a, a >> c, a >> 2*c, ..]
as vec_step as [ c * nunits, c * nunits, c * nunits, ... ], vectorized iv is
updated as vec_def = vec_init >>/<< vec_step.

For mul, the patch create a vec_init as [ a, a * c, a * pow(c, 2), ..]
as vec_step as [ pow(c,nunits), pow(c,nunits),...] iv is updated as vec_def =
vec_init * vec_step.

The patch handles nonlinear iv for
1. Integer type only, floating point is not handled.
2. No slp_node.
3. iv_loop should be same as vector loop, not nested loop.
4. No UD is created, for mul, use unsigned mult to avoid UD, for
   shift, shift count should be less than type precision.

gcc/ChangeLog:

	PR tree-optimization/103144
	* tree-vect-loop.cc (vect_is_nonlinear_iv_evolution): New function.
	(vect_analyze_scalar_cycles_1): Detect nonlinear iv by upper function.
	(vect_create_nonlinear_iv_init): New function.
	(vect_peel_nonlinear_iv_init): Ditto.
	(vect_create_nonlinear_iv_step): Ditto
	(vect_create_nonlinear_iv_vec_step): Ditto
	(vect_update_nonlinear_iv): Ditto
	(vectorizable_nonlinear_induction): Ditto.
	(vectorizable_induction): Call
	vectorizable_nonlinear_induction when induction_type is not
	vect_step_op_add.
	* tree-vect-loop-manip.cc (vect_update_ivs_after_vectorizer):
	Update nonlinear iv for epilogue loop.
	* tree-vectorizer.h (enum vect_induction_op_type): New enum.
	(STMT_VINFO_LOOP_PHI_EVOLUTION_TYPE): New Macro.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr103144-mul-1.c: New test.
	* gcc.target/i386/pr103144-mul-2.c: New test.
	* gcc.target/i386/pr103144-neg-1.c: New test.
	* gcc.target/i386/pr103144-neg-2.c: New test.
	* gcc.target/i386/pr103144-shift-1.c: New test.
	* gcc.target/i386/pr103144-shift-2.c: New test.
2022-09-07 08:38:18 +08:00
GCC Administrator
25aeb92221 Daily bump. 2022-09-07 00:17:51 +00:00
Jason Merrill
0a2fba3697 c++: C++23 operator[] allows default arguments
This usage was intended to be allowed by P2128, but it didn't make it into
the final wording.  Fixed by CWG 2507.

	DR2507

gcc/cp/ChangeLog:

	* decl.cc (grok_op_properties): Return sooner for C++23 op[].

gcc/testsuite/ChangeLog:

	* g++.dg/cpp23/subscript8.C: New test.
2022-09-06 16:20:41 -04:00
Richard Biener
0a4a2667dc tree-optimization/106754 - fix compute_control_dep_chain defect
The following handles the situation of a loop exit along the
control path to the PHI def or from there to the use in a different
way, aoviding premature abort of the walks as noticed in the two
cases where the exit is outermost (gcc.dg/uninit-pred-11.c) or
wrapped in a condition that is on the path (gcc.dg/uninit-pred-12.c).
Instead of handling such exits during recursion we now pick them
up in the parent when walking post-dominators.  That requires an
additional post-dominator walk at the outermost level which is
facilitated by splitting out the walk to a helper function and
the existing wrapper added earlier.

The patch also removes the bogus early exit from
uninit_analysis::init_use_preds, fixing a simplified version
of the PR106155 testcase.

	PR tree-optimization/106754
	* gimple-predicate-analysis.cc (compute_control_dep_chain_pdom):
	New function, split out from compute_control_dep_chain.  Handle
	loop-exit like conditions here by pushing to the control vector.
	(compute_control_dep_chain): Adjust and streamline dumping.
	In the wrapper perform a post-dominator walk as well.
	(uninit_analysis::init_use_preds): Remove premature early exit.

	* gcc.dg/uninit-pred-12.c: New testcase.
	* gcc.dg/uninit-pr106155-1.c: Likewise.
2022-09-06 14:55:51 +02:00
Max Filippov
9e0c269672 xtensa: gcc: add static PIE support
gcc/
	* config/xtensa/linux.h (LINK_SPEC): Add static-pie.
2022-09-06 05:13:31 -07:00
Aldy Hernandez
f5dc9da0a9 Handle > INF and < INF correctly in range-op-float.cc
The gfortran.dg/minlocval*.f90 tests are generating conditionals past
the infinities.  For example:

	if (x <= +Inf)
	  foo (x);
	else
	  bar (x);

It seems to me that the only possible value for x on the false side is
either NAN or undefined (for !HONOR_NANS).

gcc/ChangeLog:

	* range-op-float.cc (build_le): Handle NANs and going past infinity.
	(build_lt): Same.
	(build_ge): Same.
	(build_gt): Same.
	(foperator_lt::op1_range): Avoid adjustments to range if build_*
	returned false.
	(foperator_lt::op2_range): Same.
	(foperator_le::op1_range): Same.
	(foperator_le::op2_range): Same.
	(foperator_gt::op1_range): Same.
	(foperator_gt::op2_range): Same.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/vrp-float-inf-1.c: New test.
2022-09-06 13:48:05 +02:00
Richard Biener
12f0783111 Fix use predicate computation for uninit analysis
In uninit analysis we try to prove that a use is always properly guarded
so it is never reached when the used value is not initialized.  This
fails to be conservative when during the computation of the use
predicate components of the || .. || .. chain are dropped so we have
to detect this case and fall back to the conservative computation.

	* gimple-predicate-analysis.cc (compute_control_dep_chain):
	Add output flag to indicate whether we possibly have dropped
	any chains.  Return whether the info is complete from the
	wrapping overload.
	(uninit_analysis::init_use_preds): Adjust accordingly, with
	a workaround for PR106754.
	(uninit_analysis::init_from_phi_def): Properly guard the
	case where we complete an empty chain.
2022-09-06 13:41:18 +02:00
Philipp Fent
190c644c06 libstdc++: Fix pretty printer tests of tuple indexes
Signed-off-by: Philipp Fent <fent@in.tum.de>

libstdc++-v3/ChangeLog:

	* testsuite/libstdc++-prettyprinters/48362.cc: Fix expected
	tuple indices.
	* testsuite/libstdc++-prettyprinters/cxx11.cc: Likewise.
2022-09-06 12:12:00 +01:00
Jan-Benedict Glaw
26ea6ca1fc Document unused function argument
This patch fixes a small warning about the unused outer_rtx argument in the
msp430 backend.

2022-09-06  Jan-Benedict Glaw  <jbglaw@lug-owl.de>

gcc/ChangeLog:
	* config/msp430/msp430.cc (msp430_single_op_cost): Document unused argument.
2022-09-06 13:05:21 +02:00
Prathamesh Kulkarni
e55674b86a tree-ssa-forwprop.cc: Adjust res_type when operands have differing vector lengths.
gcc/
	* tree-ssa-forwprop.cc (simplify_permutation): Set res_type to a vector
	type with same element type as arg0, and length as op2.
2022-09-06 15:18:22 +05:30
Richard Biener
1a4e1425f8 tree-optimization/106844 - fix ICE in init_use_preds
The following fixes an oversight in the last change to
compute_control_dep_chain where we have to return whether we found
a chain.

	PR tree-optimization/106844
	* gimple-predicate-analysis.cc (compute_control_dep_chain):
	Return whether we found a chain.

	* gcc.dg/pr106844.c: New testcase.
2022-09-06 10:55:31 +02:00
Richard Biener
e33e61d417 tree-optimization/106841 - gather and hybrid SLP
Hybrid SLP detection currently fails to consider a not direct
offset operand of a scatter/gather operation.  The following fixes
this.

	PR tree-optimization/106841
	* tree-vect-slp.cc (vect_detect_hybrid_slp): Also process
	scatter/gather offset.

	* g++.dg/vect/pr106841.cc: New testcase.
2022-09-06 10:55:31 +02:00
Tobias Burnus
d6582c662c Fix Fortran/openmp: Partial OpenMP 5.2 doacross
This removed a checking snippet which accidentally was left in in commit
r13-2446-g938cda536019cd6a1bc0dd2346381185b420bbf8 ; this caused
fails in gfortran.dg/gomp/doacross-5.f90 (added in that very commit).
Note that a similar but refined check is now done in the middle end.
(The ME version additionally checks whether doacross is present.)

gcc/fortran/
	* openmp.cc (resolve_omp_clauses): Remove ordered/linear
	check as it is handled now in the middle end.
2022-09-06 10:02:13 +02:00
Jakub Jelinek
0bd514107d openmp: Be consistent on parsing offsets between normal sink vector and omp_cur_iteration - 1
For normal sink vectors, we just check that the token is CPP_NUMBER and with
INTEGER_CST value, while for omp_cur_iteration I was additionally requiring
integer_type_node type (so only 1, 001, 0x0001 but not 1L or 1ULL etc.).
I think we need to clarify what we actually should allow in the standard, until
then it is better to be consistent.

2022-09-06  Jakub Jelinek  <jakub@redhat.com>

gcc/c/
	* c-parser.cc (c_parser_omp_clause_doacross_sink): Don't verify val
	in omp_cur_iteration - 1 has integer_type_node type.
gcc/cp/
	* parser.cc (cp_parser_omp_clause_doacross_sink): Don't verify val
	in omp_cur_iteration - 1 has integer_type_node type.
gcc/testsuite/
	* c-c++-common/gomp/doacross-6.c (corge): Don't expect an error here.
	Add a few further tests.
2022-09-06 09:28:06 +02:00
Jakub Jelinek
1bf8b7adc2 openmp: Fix ICE when splitting invalid depend(source)/depend(sink:vec)
As we now create OMP_CLAUSE_DOACROSS rather than OMP_CLAUSE_DEPEND when
depend is used with source/sink modifiers, c_omp_split_clauses can see
OMP_CLAUSE_DOACROSS clause too before we diagnose it as erroneous.

The following patch treats it like OMP_CLAUSE_DEPEND during
the splitting but adds an assertion.

2022-09-06  Jakub Jelinek  <jakub@redhat.com>

	PR c/106836
	* c-omp.cc (c_omp_split_clauses): Handle OMP_CLAUSE_DOACROSS.

	* c-c++-common/gomp/pr106836.c: New test.
2022-09-06 09:23:40 +02:00
Jan-Benedict Glaw
bc1bc808d8 No actual regclasses for bpf
Building for for bpf-unknown-none target, recent GCCs will issue an unused
variable warning as the REGNO_REG_CLASS macro doesn't actually use its
argument. Reference the argument as (void) to silence the warning.

.../gcc/configure --prefix=... --enable-werror-always --enable-languages=all --disable-gcov --disable-shared --disable-threads --target=bpf-unknown-none --without-headers
[...]
make V=1 all-gcc
[...]

/usr/lib/gcc-snapshot/bin/g++  -fno-PIE -c   -g -O2   -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE   -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror -fno-common  -DHAVE_CONFIG_H -I. -I. -I../../gcc/gcc -I../../gcc/gcc/. -I../../gcc/gcc/../include -I../../gcc/gcc/../libcpp/include -I../../gcc/gcc/../libcody  -I../../gcc/gcc/../libdecnumber -I../../gcc/gcc/../libdecnumber/dpd -I../libdecnumber -I../../gcc/gcc/../libbacktrace   -o regcprop.o -MT regcprop.o -MMD -MP -MF ./.deps/regcprop.TPo ../../gcc/gcc/regcprop.cc
../../gcc/gcc/regcprop.cc: In function 'bool copyprop_hardreg_forward_1(basic_block, value_data*)':
../../gcc/gcc/regcprop.cc:794:24: error: unused variable 'regno' [-Werror=unused-variable]
  794 |           unsigned int regno = REGNO (SET_SRC (set));
      |                        ^~~~~
cc1plus: all warnings being treated as errors
make[1]: *** [Makefile:1146: regcprop.o] Error 1
make[1]: Leaving directory '/var/lib/laminar/run/gcc-bpf-unknown-none/1/toolchain-build/gcc'
make: *** [Makefile:4565: all-gcc] Error 2

gcc/
	* config/bpf/bpf.h (REGNO_REG_CLASS): Reference arguments as (void).
2022-09-06 09:20:37 +02:00
Jakub Jelinek
3f585bdaa7 openmp: Introduce gimple_omp_ordered_standalone_p
On Sat, Sep 03, 2022 at 10:07:27AM +0200, Jakub Jelinek via Gcc-patches wrote:
> Incrementally, I'd like to change the way we differentiate between
> stand-alone and block-associated ordered constructs, because the current
> way of looking for presence of doacross clause doesn't work well if those
> clauses are removed because they had been invalid (wrong syntax or
> unknown variables in it etc.)

The following, so far only lightly tested, patch implements that.

2022-09-06  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* gimple.h (enum gf_mask): Add GF_OMP_ORDERED_STANDALONE enumerator.
	(gimple_omp_subcode):  Use GIMPLE_OMP_ORDERED instead of
	GIMPLE_OMP_TEAMS as upper bound.
	(gimple_omp_ordered_standalone_p, gimple_omp_ordered_standalone): New
	inline functions.
	* gimplify.cc (find_standalone_omp_ordered): Look for OMP_ORDERED with
	NULL OMP_ORDERED_BODY rather than with OMP_DOACROSS clause.
	(gimplify_expr): Call gimple_omp_ordered_standalone for OMP_ORDERED
	with NULL OMP_ORDERED_BODY.
	* omp-low.cc (check_omp_nesting_restrictions): Use
	gimple_omp_ordered_standalone_p test instead of
	omp_find_clause (..., OMP_CLAUSE_DOACROSS).
	(lower_omp_ordered): Likewise.
	* omp-expand.cc (expand_omp, build_omp_regions_1,
	omp_make_gimple_edges): Likewise.
gcc/cp/
	* pt.cc (tsubst_expr) <case OMP_ORDERED>: If OMP_BODY was NULL, keep
	it NULL after instantiation too.
gcc/testsuite/
	* c-c++-common/gomp/sink-3.c: Don't expect a superfluous error during
	error recovery.
	* c-c++-common/gomp/doacross-6.c (foo): Add further tests.
2022-09-06 09:19:24 +02:00
Eric Botcazou
fc52efeb9c [Ada] Mark artificial formal parameters in the debug info
gcc/ada/

	* gcc-interface/decl.cc (gnat_to_gnu_param): Set DECL_ARTIFICIAL.
2022-09-06 09:14:24 +02:00
Eric Botcazou
0b66f882f7 [Ada] Fix problematic line debug info attached to call to finalizer
The End_Label is not defined for body nodes so a small tweak is needed.

gcc/ada/

	* gcc-interface/trans.cc (At_End_Proc_to_gnu): Use the End_Label of
	the child Handled_Statement_Sequence for body nodes.
	(set_end_locus_from_node): Minor tweaks.
2022-09-06 09:14:23 +02:00
Eric Botcazou
ef12e74ce7 [Ada] Fix internal error on double renaming of private constant
The first renaming uses the type of the full view of the constant but not
the second, which introduces problematic view conversions downstream.

gcc/ada/

	* gcc-interface/trans.cc (Full_View_Of_Private_Constant): New
	function returning the Full_View of a private constant, after
	looking through a chain of renamings, if any.
	(Identifier_to_gnu): Call it on the entity.  Small cleanup.
2022-09-06 09:14:23 +02:00
Eric Botcazou
e2909e105d [Ada] Fix missing name for access type in generic instantiation
Pointer types aren't named types in C so we need to take extra care in Ada
to make sure that the name of access types is preserved.

gcc/ada/

	* gcc-interface/utils.cc (gnat_pushdecl): Preserve named
	TYPE_DECLs consistently for all kind of pointer types.
2022-09-06 09:14:23 +02:00
Eric Botcazou
a80e058397 [Ada] Extend No_Dependence restriction to code generation (continued)
gcc/ada/

	* gcc-interface/trans.cc (gnat_to_gnu) <N_Op_Divide>: Report a
	violation of No_Dependence on System.GCC if the result type is
	larger than a word.
	<N_Op_Shift>: Likewise.
	<N_Op_Mod>: Likewise.
	<N_Op_Rem>: Likewise.
	(convert_with_check): Report a violation of No_Dependence on
	System.GCC for a conversion between an integer type larger than
	a word and a floating-point type.
2022-09-06 09:14:23 +02:00
Steve Baird
5e34c91420 [Ada] Disable lock free protected implementation if target lacks support
Do not select a lock free implementation if Targparm.Support_Atomic_Primitives
is False (which indicates that the target cannot support it).

gcc/ada/

	* sem_ch9.adb
	(Allows_Lock_Free_Implementation): Return False if
	Support_Atomic_Primitives is False.
2022-09-06 09:14:23 +02:00
Steve Baird
71747dda9d [Ada] Enable lock free protected implementation by default
In the past, the Lock_Free aspect of a protected type (including an
anonymous type) defaulted to False. In the case where an explicit
"Lock_Free => True" aspect specification would be legal, the aspect now
defaults to True (which means that a lock-free implementation is used to
implement the type's protected operations); this is like the previous
behavior of the compiler with the -gnatd9 switch specified. Support for
the Lock_Free attribute (which should not be confused with the Lock_Free
aspect) is removed.

gcc/ada/

	* debug.adb: Remove comment regarding the -gnatd9 switch.
	* doc/gnat_rm/implementation_defined_attributes.rst: Remove all
	mention of the Lock_Free attribute.
	* gnat_rm.texi, gnat_ugn.texi: Regenerate.
	* exp_attr.adb, sem_attr.adb: Remove all mention of the former
	Attribute_Lock_Free enumeration element of the Attribute_Id type.
	* sem_ch9.adb
	(Allows_Lock_Free_Implementation): Remove the Debug_Flag_9 test.
	Return False in the case of a protected function whose result type
	requires use of the secondary stack.
	(Satisfies_Lock_Free_Requirements): This functions checks for
	certain constructs and returns False if one is found. In the case
	of a protected function, there is no need to check to see if the
	protected object is being modified. So it is ok to omit *some*
	checks in the case of a protected function. But other checks which
	are required (e.g., the test for a reference to a variable that is
	not part of the protected object) were being incorrectly omitted.
	This could result in accepting "Lock_Free => True" aspect
	specifications that should be rejected.
	* snames.adb-tmpl: Name_Lock_Free no longer requires special
	treatment in Get_Pragma_Id or Is_Pragma_Name (because it is no
	longer an attribute name).
	* snames.ads-tmpl: Move the declaration of Name_Lock_Free to
	reflect the fact that it is no longer the name of an attribute.
	Delete Attribute_Lock_Free from the Attribute_Id enumeration type.
2022-09-06 09:14:23 +02:00
Steve Baird
fc737a6c20 [Ada] Restore missing Aggregate aspect for Ada.Containers.Ordered_Sets.Set
Ada RM A.18.9 includes a specification of the Aggregate aspect for the type
Ada.Containers.Ordered_Sets. That aspect specification was deliberately
commented out in a-coorse.ads at one time, but that workaround is no longer
needed.

gcc/ada/

	* libgnat/a-coorse.ads: Restore Aggregate aspect specification for
	type Set.
2022-09-06 09:14:23 +02:00
Marc Poulhiès
e60709b782 [Ada] Fix formal parameters list for secondary stack allocation procedure
The introduction of the Alignment parameter for the secondary stack
allocator in previous change was missing the corresponding change in the
Build_Allocate_Deallocate_Proc when creating the formal parameters list.

gcc/ada/

	* exp_util.adb (Build_Allocate_Deallocate_Proc): Add
	Alignment_Param in the formal list for calls to SS_Allocate.
2022-09-06 09:14:23 +02:00
Piotr Trojanek
8a99a8e6bc [Ada] Retain Has_Private_View flag for actuals of inlined subprograms
When instantiating a body to inline (either because frontend inlining is
enabled with switch -gnatN or because of inlining-for-proof in GNATprove
mode) we rewrite occurrences of formal parameters into the corresponding
actual parameters. Then we switch type views, so that if the formal had
a full view in the body to inline then the corresponding actual will
have a full view in the particular inlined body.

However, when rewriting occurrences of the formal parameter we were
losing information about whether the formal had a private view.

gcc/ada/

	* inline.adb (Process_Formals): Preserve Has_Private_View flag while
	rewriting formal into actual parameters.
2022-09-06 09:14:22 +02:00
Javier Miranda
51abc0cc86 [Ada] Enforce matching of extra formals
This patch enforces matching of extra formals in overridden subprograms,
subprogram renamings, and subprograms to which attributes 'Access,
'Unchecked_Access, or 'Unrestricted_Access is applied (for these access
cases the subprogram is checked against its corresponding subprogram
type).

gcc/ada/

	* debug.adb
	(Debug_Flag_Underscore_X): Switch added temporarily to allow
	disabling extra formal checks.

	* exp_attr.adb
	(Expand_N_Attribute_Reference [access types]): Add extra formals
	to the subprogram referenced in the prefix of 'Unchecked_Access,
	'Unrestricted_Access or 'Access; required to check that its extra
	formals match the extra formals of the corresponding subprogram
	type.

	* exp_ch3.adb
	(Stream_Operation_OK): Declaration moved to the public part of the
	package.
	(Validate_Tagged_Type_Extra_Formals): New subprogram.
	(Expand_Freeze_Record_Type): Improve the code that takes care of
	adding the extra formals of dispatching primitives; extended to
	add also the extra formals to renamings of dispatching primitives.

	* exp_ch3.ads
	(Stream_Operation_OK): Declaration moved from the package body.

	* exp_ch6.adb
	(Has_BIP_Extra_Formal): Subprogram declaration moved to the public
	part of the package. In addition, a parameter has been added to
	disable an assertion that requires its use with frozen entities.
	(Expand_Call_Helper): Enforce assertion checking extra formals on
	thunks.
	(Is_Build_In_Place_Function): Return False for entities with
	foreign convention.
	(Make_Build_In_Place_Call_In_Object_Declaration): Occurrences of
	Is_Return_Object replaced by the local variable
	Is_OK_Return_Object that evaluates to False for scopes with
	foreign convention.
	(Might_Have_Tasks): Fix check of class-wide limited record types.
	(Needs_BIP_Task_Actuals): Remove assertion to allow calling this
	function in more contexts; in addition it returns False for
	functions returning objects with foreign convention.
	(Needs_BIP_Finalization_Master): Likewise.
	(Needs_BIP_Alloc_Form): Likewise.

	* exp_ch6.ads
	(Stream_Operation_OK): Declaration moved from the package body. In
	addition, a parameter has been added to disable assertion that
	requires its use with frozen entities.

	* freeze.adb
	(Check_Itype): Add extra formals to anonymous access subprogram
	itypes.
	(Freeze_Expression): Improve code that disables the addition of
	extra formals to functions with foreign convention.
	(Check_Extra_Formals): Moved to package Sem_Ch6 as
	Extra_Formals_OK.
	(Freeze_Subprogram): Add extra formals to non-dispatching
	subprograms.

	* sem_ch3.adb
	(Access_Subprogram_Declaration): Defer the addition of extra
	formals to the freezing point so that we know the convention.
	(Check_Anonymous_Access_Component): Likewise.
	(Derive_Subprogram): Fix documentation.

	* sem_ch6.adb
	(Check_Anonymous_Return): Fix check of access to class-wide
	limited record types.
	(Check_Untagged_Equality): Placed in alphabetical order.
	(Extra_Formals_OK): Subprogram moved from freeze.adb.
	(Extra_Formals_Match_OK): New subprogram.
	(Has_BIP_Formals): New subprogram.
	(Has_Extra_Formals): New subprograms.
	(Needs_Accessibility_Check_Extra): New subprogram.
	(Needs_Constrained_Extra): New subprogram.
	(Parent_Subprogram): New subprogram.
	(Add_Extra_Formal): Minor code cleanup.
	(Create_Extra_Formals): Enforce matching extra formals on
	overridden and aliased entities.
	(Has_Reliable_Extra_Formals): New subprogram.

	* sem_ch6.ads
	(Extra_Formals_OK): Subprogram moved from freeze.adb.
	(Extra_Formals_Match_OK): New subprogram.

	* sem_eval.adb
	(Compile_Time_Known_Value): Improve predicate to avoid assertion
	failure; found working on this ticket; this change does not affect
	the behavior of the compiler because this subprogram has an
	exception handler that returns False when the assertion fails.

	* sem_util.adb
	(Needs_Result_Accessibility_Level): Do not return False for
	dispatching operations compiled with Ada_Version < 2012 since they
	they may be overridden by primitives compiled with Ada_Version >=
	Ada_2012.
2022-09-06 09:14:22 +02:00
Arnaud Charlet
63499dbd7d [Ada] Disable if expression optimization for LLVM
gcc/ada/

	* exp_ch4.adb (Expand_N_If_Expression): Disable optimization
	for LLVM.
2022-09-06 09:14:22 +02:00
Javier Miranda
1c245f7273 [Ada] Report error in non-legal class-wide conditions
gcc/ada/

	* sem_prag.adb
	(Analyze_Pre_Post_Condition_In_Decl_Part): Improve check to report
	an error in non-legal class-wide conditions.
2022-09-06 09:14:22 +02:00
Steve Baird
c889b2e8ac [Ada] Slice length computation bug in Generic_Bounded_Length generics
In some cases involving null slices, the Slice subprograms (both the
  function and the procedure) in each of the three Generic_Bounded_Length
  generic packages (for String, Wide_String, and Wide_Wide_String)
  could raise Constraint_Error in cases where this is incorrect.

gcc/ada/

	* libgnat/a-strsup.adb, libgnat/a-stwisu.adb, libgnat/a-stzsup.adb
	(Super_Slice function and procedure): fix slice length computation.
2022-09-06 09:14:22 +02:00
Steve Baird
2aef469570 [Ada] Improve documentation of validation checking control switches
Correct incorrect text and clarify unclear text that has been identified
in the "Validity Checking" section of the GNAT UG.

gcc/ada/

	* doc/gnat_ugn/building_executable_programs_with_gnat.rst:
	Improve -gnatVa, -gnatVc, -gnatVd, -gnatVe, -gnatVf, -gnatVo,
	-gnatVp, -gnatVr, and -gnatVs switch descriptions.
	* gnat_ugn.texi: Regenerate.
2022-09-06 09:14:22 +02:00
Justin Squirek
c66e69f337 [Ada] Handle new At_End expansion during unnesting
This patch modifies the marking of nested subprograms requiring static links,
so that the changes made to "At end" procedures get handled properly.

gcc/ada/

	* exp_unst.adb
	(Visit_Node): Add N_Block_Statement to the enclosing construct
	case since they can now have "At end" procedures. Also, recognize
	calls from "At end" procedures when recording subprograms.
2022-09-06 09:14:22 +02:00
Piotr Trojanek
d644c51967 [Ada] Fix comment about mapping of parameters and inlining static funcs
Fix glitch in a cross-reference in comment.

gcc/ada/

	* inline.adb (Replace_Formal): Fix name of the referenced routine.
2022-09-06 09:14:22 +02:00
Piotr Trojanek
ff6b2a3e70 [Ada] Cleanup unnecessary shadowing in expansion of attribute Old
Code cleanup; semantics is unaffected.

gcc/ada/

	* exp_attr.adb (Expand_N_Attribute_Reference [Attribute_Old]):
	Remove unnecessary local constant that was shadowing another
	constant with the same initial value.
2022-09-06 09:14:21 +02:00
Julien Bortolussi
eae9f5d257 [Ada] Fix a bug in the contract of formal ordered sets
There are 2 main issues in the postcondition of the function Replace
of the formal ordered sets, in the sub package Generic_Keys. One is
related to the fact that when the element is changed, the key is
also changed. The second one is due to the fact that the arrival of
the new element might modify the ordering of the set and thus
the Positions might be modified.
As a consequence, the postcondition might be false and thus fail
at runtime.

gcc/ada/

	* libgnat/a-cforse.ads (Replace): Fix the postcondition.
2022-09-06 09:14:21 +02:00
Steve Baird
c56c7d3aeb [Ada] Cope with scalar subtypes that have a non-scalar basetype.
In some cases, the compiler builds a subtype entity Typ such that
Is_Scalar (Typ) is True and Is_Scalar (Base_Type (Typ)) is False.
This comes up in some cases involving a subtype of a private type,
where the full view of the private type is a scalar type. In such a
situation, it may also be the case that Is_Enumeration_Type (Typ) is True
and Is_Enumeration_Type (Base_Type (Typ)) is False. Some code incorrectly
assumed that if a subtype is known to be a scalar (respectively, enumeration)
type, then the same must be true of the base type of that subtype. Fix that
code to handle the case where that assumption does not hold.

gcc/ada/

	* exp_attr.adb
	(Attribute_Valid): Ensure that PBtyp is initialized to a value for
	which Is_Scalar_Type is True.
	* checks.adb
	(Determine_Range): Call Implemention_Base_Type instead of
	Base_Type in order to ensure that result is suitable for passing
	to Enum_Pos_To_Rep.
2022-09-06 09:14:21 +02:00
Bob Duff
6d16658d7d [Ada] Place "at end" on body nodes
This patch fixes a bug where finalization code might refer to variables
outside their lifetime. The previous version moved declarations into the
Handled_Statement_Sequence (HSS), so that the "at end" handler of the
HSS could handle exceptions raised by those declarations. The
First_Real_Statement field was used to find the first statement after
the moved declarations. In addition, if the HSS already had exception
handlers, it was wrapped in another layer of block_statement. This
doesn't work if there are variable-sized objects allocated on the
(primary) stack, because the stack will be popped before the "at end" is
invoked.

In the new version, we allow "at end" on nodes such as
N_Subprogram_Body, in addition to HSS. We modify gigi so that such an
"at end" applies to the whole body (declarations and HSS) by extending
support for At_End_Proc mechanism to N_Block_Statement and N_*_Body
nodes. This also removes the support for First_Real_Statement. In
particular, an exception raised by the declarations will trigger the "at
end". We no longer move declarations into the HSS, we no longer have a
First_Real_Statement field, and we no longer do the wrapping mentioned
above.

This change requires various other changes, in cases where we depended
on the First_Real_Statement and the moving/wrapping mentioned above.

gcc/ada/

	* gen_il-fields.ads
	(First_Real_Statement): Remove this field.
	* gen_il-gen-gen_nodes.adb: Remove the First_Real_Statement field.
	Add the At_End_Proc field to nodes that have both Declarations and
	HSS.
	* sinfo.ads
	(At_End_Proc): Document new semantics.
	(First_Real_Statement): Remove comment.
	* exp_ch11.adb
	(Expand_N_Handled_Sequence_Of_Statements): Remove
	First_Real_Statement.
	* exp_ch7.adb
	(Build_Cleanup_Statements): Remove "Historical note"; it doesn't
	seem useful, and we have revision history.
	(Create_Finalizer): Insert the finalizer later, typically in the
	statement list, in some cases.
	(Build_Finalizer_Call): Attach the "at end" handler to the parent
	of the HSS node in most cases, so it applies to declarations.
	(Expand_Cleanup_Actions): Remove Wrap_HSS_In_Block and the call to
	it. Remove the code that moves declarations. Remove some redundant
	code.
	* exp_ch9.adb
	(Build_Protected_Entry): Copy the At_End_Proc.
	(Build_Protected_Subprogram_Body): Reverse the sense of Exc_Safe,
	to avoid double negatives. Remove "Historical note" as in
	exp_ch7.adb.
	(Build_Unprotected_Subprogram_Body): Copy the At_End_Proc from the
	protected version.
	(Expand_N_Conditional_Entry_Call): Use First (Statements(...))
	instead of First_Real_Statement(...).
	(Expand_N_Task_Body): Put the Abort_Undefer call at the beginning
	of the declarations, rather than in the HSS. Use First
	(Statements(...)) instead of First_Real_Statement(...). Copy the
	At_End_Proc.
	* inline.adb
	(Has_Initialized_Type): Return False if the declaration does not
	come from source.
	* libgnarl/s-tpoben.ads
	(Lock_Entries, Lock_Entries_With_Status): Document when these
	things raise Program_Error. It's not clear that
	Lock_Entries_With_Status ought to be raising exceptions, but at
	least it's documented now.
	* sem.ads: Minor comment fixes.
	* sem_ch6.adb
	(Analyze_Subprogram_Body_Helper): Use First (Statements(...))
	instead of First_Real_Statement(...).
	(Analyze_Null_Procedure): Minor comment fix.
	* sem_util.adb
	(Might_Raise): Return True for N_Raise_Expression. Adjust the part
	about exceptions generated by the back end to match the reality of
	what the back end generates.
	(Update_First_Real_Statement): Remove.
	* sem_util.ads: Remove First_Real_Statement from comment.
	* sinfo-utils.ads
	(First_Real_Statement): New function that always returns Empty.
	This should be removed once gnat-llvm and codepeer have been
	updated to not refer to First_Real_Statement.
	* sprint.adb
	(Sprint_At_End_Proc): Deal with printing At_End_Proc.
	* sem_prag.adb: Minor comment fixes.
	* gcc-interface/trans.cc (At_End_Proc_to_gnu): New function.
	(Subprogram_Body_to_gnu): Call it to handle an At_End_Proc.
	(Handled_Sequence_Of_Statements_to_gnu): Likewise. Remove the
	support for First_Real_Statement and clean up the rest.
	(Exception_Handler_to_gnu): Do not push binding levels.
	(Compilation_Unit_to_gnu): Adjust call to process_decls.
	(gnat_to_gnu) <N_Package_Specification>: Likewise. <N_Entry_Body>:
	Likewise. <N_Freeze_Entity>: Likewise. <N_Block_Statement>:
	Likewise and call At_End_Proc_to_gnu to handle an At_End_Proc.
	<N_Package_Body>: Likewise.
	(process_decls): Remove GNAT_END_LIST parameter and adjust
	recursive calls.

Co-authored-by: Eric Botcazou <ebotcazou@adacore.com>
2022-09-06 09:14:21 +02:00
Steve Baird
aed54a141a [Ada] Document change to legality checks for Inox case statements
INOX (which is enabled via -gnatX) supports composite case-statement selectors.
As a temporary measure, simplify the coverage-related compile-time checks
for such case statements via two changes: an others choice is always
required for such a case statement, and no legality checks relating to
overlapping of case choices are performed.

gcc/ada/

	* doc/gnat_rm/implementation_defined_pragmas.rst: Document new
	temporary rule that a "when others =>" case choice must be given
	when casing on a composite selector.
	* gnat_rm.texi: Regenerate.
2022-09-06 09:14:21 +02:00
Steve Baird
1dbaf0d99c [Ada] Temporarily simplify legality checks for Inox case statements
INOX (which is enabled via -gnatX) supports composite case-statement selectors.
As a temporary measure, simplify the coverage-related compile-time checks
for such case statements via two changes: an others choice is always
required for such a case statement, and no legality checks relating to
overlapping of case choices are performed.

gcc/ada/

	* sem_case.adb: Define a new Boolean constant,
	Simplified_Composite_Coverage_Rules, initialized to True. Setting
	this constant to True has two effects: 1- Representative value
	sets are not fully initialized - this is done to avoid capacity
	problems, as well as for performance. 2- In
	Check_Case_Pattern_Choices, the only legality check performed is a
	check that a "when others =>" choice is present.
2022-09-06 09:14:21 +02:00
Piotr Trojanek
96c20bf1e9 [Ada] Tune message for illegal aspect Relaxed_Initialization
Error message about illegal aspect Relaxed_Initialization was lacking a
whitespace character.

gcc/ada/

	* sem_ch13.adb (Analyze_Aspect_Relaxed_Initialization): Fix error
	template.
2022-09-06 09:14:21 +02:00
Steve Baird
ed7bc348b3 [Ada] Bad Valid_Scalars result if signed int component type signed has partial view.
For an object X of a composite type, the attribute X'Valid_Scalars should
return False if and only if there exists at least one invalid scalar
subcomponent of X. The validity test for a scalar part may include a
range test. In some cases involving a private type that is implemented as
a signed integer type, this range test was incorrectly implemented using
unsigned comparisons. For an enclosing object X, this could result in
X'Valid_Scalars yielding the wrong Boolean result. Such an incorrect
result would almost always be False, although an incorrect True result is
theoretically possible (this would require that both bounds of the
component subtype are negative and that the invalid component has a positive
value).

gcc/ada/

	* exp_attr.adb
	(Make_Range_Test): In determining which subtype's First and Last
	attributes are to be queried as part of a range test, call
	Validated_View in order to get a scalar (as opposed to private)
	subtype.
	(Attribute_Valid): In determining whether to perform a signed or
	unsigned comparison for a range test, call Validated_View in order
	to get a scalar (as opposed to private) type. Also correct a typo
	which, by itself, is the source of the problem reported for this
	ticket.
2022-09-06 09:14:21 +02:00
Steve Baird
152f968e86 [Ada] ICE handling discriminant-dependent index constraint for access component
The compiler would fail with an internal error in some cases involving
a discriminated record type that provides a discriminant-dependent index
constraint for the subtype of a component of an access-to-array type when a
dereference of that component of some object is mentioned in a pre- or
postcondition expression.

gcc/ada/

	* sem_ch4.adb
	(Analyze_Selected_Component): Define new Boolean-valued function,
	Constraint_Has_Unprefixed_Discriminant_Reference, which takes a
	subtype that is subject to a discriminant-dependent constraint and
	returns True if any of the constraint values are unprefixed
	discriminant names. Usually, the Etype of a selected component
	node is set to Etype of the component. However, in the case of an
	access-to-array component for which this predicate returns True,
	we instead use the base type of the Etype of the component.
	Normally such problematic discriminant references are addressed by
	calling Build_Actual_Subtype_Of_Component, but that doesn't work
	if Full_Analyze is False.
2022-09-06 09:14:20 +02:00
Piotr Trojanek
ec95a21b52 [Ada] Add formal verification dependencies to libgnat
Spec units for verification of the GNAT standard library with GNATprove
must be listed as part of the libgnat package, as otherwise libadalang
will complain about missing dependencies.

gcc/ada/

	* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Include
	System.Value_U_Spec and System.Value_I_Spec units.
2022-09-06 09:14:20 +02:00
Eric Botcazou
e9bac0faa1 [Ada] Correctly round Value attribute for floating point in more cases
This provides correct rounding in the IEEE 754 sense for the Value attribute
of floating-point types in more cases, by switching from tables of powers of
10 to tables of powers of 5 for precomputed values, thus making it possible
to use a single divide for denormals and normalized numbers just above them.

Although this significantly increases the size of the tables, object files
for them are still quite small (1, 2 and 4 KB respectively on x86-64).

gcc/ada/

	* libgnat/s-powflt.ads (Powfive): New constant array.
	* libgnat/s-powlfl.ads (Powfive): Likewise.
	(Powfive_100): New constant.
	(Powfive_200): Likewise.
	(Powfive_300): Likewise.
	* libgnat/s-powllf.ads (Powfive): New constant array.
	(Powfive_100): New constant.
	(Powfive_200): Likewise.
	(Powfive_300): Likewise.
	* libgnat/s-valflt.ads (Impl): Replace Powten with Powfive and pass
	Null_Address for the address of large constants.
	* libgnat/s-vallfl.ads (Impl): Replace Powten with Powfive and pass
	the address of large constants.
	* libgnat/s-valllf.ads (Impl): Likewise.
	* libgnat/s-valrea.ads (System.Val_Real): Replace Powten_Address
	with Powfive_Address and add Powfive_{1,2,3}00_Address parameters.
	* libgnat/s-valrea.adb (Is_Large_Type): New boolean constant.
	(Is_Very_Large_Type): Likewise.
	(Maxexp32): Change value of 10 to that of 5.
	(Maxexp64): Likewise.
	(Maxexp80): Likewise.
	(Integer_to_Real): Use a combination of tables of powers of 5 and
	scaling if the base is 10.
	(Large_Powten): Rename into...
	(Large_Powfive): ...this.  Add support for large constants.
	(Large_Powfive): New overloaded function for very large exponents.
2022-09-06 09:14:20 +02:00
Piotr Trojanek
8b9bbdc362 [Ada] Improve detection of illegal Iterable aspects
Handling of aspect Iterable was lacking guards against illegal code, so
the compiler either crashed or emitted cryptic errors while expanding
loops that rely on this aspect.

gcc/ada/

	* doc/gnat_rm/implementation_defined_aspects.rst
	(Aspect Iterable): Include Last and Previous primitives in
	syntactic and semantic description.
	* exp_attr.adb
	(Expand_N_Attribute_Reference): Don't expect attributes like
	Iterable that can only appear in attribute definition clauses.
	* sem_ch13.adb
	(Analyze_Attribute_Definition_Clause): Prevent crash on
	non-aggregate Iterable attribute; improve basic diagnosis of
	attribute values.
	(Resolve_Iterable_Operation): Improve checks for illegal
	primitives in aspect Iterable, e.g. with wrong number of formal
	parameters.
	(Validate_Iterable_Aspect): Prevent crashes on syntactically
	illegal aspect expression.
	* sem_util.adb
	(Get_Cursor_Type): Fix style.
	* gnat_ugn.texi, gnat_rm.texi: Regenerate.
2022-09-06 09:14:20 +02:00
Eric Botcazou
d6b1513437 [Ada] Correctly round Value attribute for floating point in more cases
This provides correct rounding in the IEEE 754 sense for the Value attribute
of floating-point types in more cases, by bumping the number of significant
bits used in the initial integer mantissa obtained from parsing.

gcc/ada/

	* libgnat/s-valuer.ads (System.Value_R): Add Parts formal parameter
	as well as Data_Index, Scale_Array and Value_Array types.
	(Scan_Raw_Real): Change type of Scale and return type.
	(Value_Raw_Real): Likewise.
	* libgnat/s-valuer.adb (Round_Extra): Reorder parameters and adjust
	recursive call.
	(Scan_Decimal_Digits): Reorder parameters, add N parameter and deal
	with multi-part scale and value.
	(Scan_Integral_Digits): Likewise.
	(Scan_Raw_Real): Change type of Scale and return type and deal with
	multi-part scale and value.
	(Value_Raw_Real): Change type of Scale and return type and tidy up.
	* libgnat/s-valued.adb (Impl): Pass 1 as Parts actual parameter.
	(Scan_Decimal): Adjust to type changes.
	(Value_Decimal): Likewise.
	* libgnat/s-valuef.adb (Impl): Pass 1 as Parts actual parameter.
	(Scan_Fixed): Adjust to type changes.
	(Value_Fixed): Likewise.
	* libgnat/s-valrea.adb (Need_Extra): Delete.
	(Precision_Limit): Always use the precision of the mantissa.
	(Impl): Pass 2 as Parts actual parameter.
	(Exact_Log2): New expression function.
	(Integer_to_Real): Change type of Scale and Val and deal with a
	2-part integer mantissa.
	(Scan_Real): Adjust to type changes.
	(Value_Real): Likewise.
2022-09-06 09:14:20 +02:00