aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2023-12-20strub: sparc: omit frame in strub_leave [PR112917]Alexandre Oliva2-0/+6
If we allow __strub_leave to allocate a frame on sparc, it will overlap with a lot of the stack range we're supposed to scrub, because of the large fixed-size outgoing args and register save area. Unfortunately, setting up the PIC register seems to prevent the frame pointer from being omitted. Since the strub runtime doesn't issue calls or use global variables, at least on sparc, disabling PIC to compile strub.c seems to do the right thing. for libgcc/ChangeLog PR middle-end/112917 * config.host (sparc, sparc64): Enable... * config/sparc/t-sparc: ... this new fragment.
2023-12-20-finline-stringops: allow expansion into edges [PR113002]Alexandre Oliva2-1/+20
Builtin expanders for memset and memcpy may involve conditionals and loops, but their sequences may be end up emitted in edges. Alas, commit_one_edge_insertion rejects sequences that end with a jump, a requirement that makes sense for insertions after expand, but not so much during expand. During expand, jumps may appear in the middle of the insert sequence as much as in the end, and it's only after committing edge insertions out of PHI nodes that we go through the entire function splitting blocks where needed, so relax the assert in commit_one_edge_insertion so that jumps are accepted during expand even at the end of the sequence. for gcc/ChangeLog PR rtl-optimization/113002 * cfgrtl.cc (commit_one_edge_insertion): Tolerate jumps in the inserted sequence during expand. for gcc/testsuite/ChangeLog PR rtl-optimization/113002 * gcc.dg/vect/pr113002.c: New.
2023-12-20untyped calls: use wrapper class type for implicit plus_oneAlexandre Oliva1-12/+20
Instead of get and set macros to apply a delta, use a single macro that resorts to a temporary wrapper class to apply it. for gcc/ChangeLog * builtins.cc (delta_type): New template class. (set_apply_args_size, get_apply_args_size): Replace with... (saved_apply_args_size): ... this. (set_apply_result_size, get_apply_result_size): Replace with... (saved_apply_result_size): ... this. (apply_args_size, apply_result_size): Adjust.
2023-12-19[committed] Stop forcing unsigned bitfields on mcoreJeff Law1-3/+0
The GCC manual has a whole section on signedness of bitfields with the ultimate conclusion that the property really isn't an ABI issue, but instead a C dialect issue (agreed). Furthermore it concludes that all targets should behave the same by default. So it was a mistake for the mcore port to force bitfields to be unsigned and that never should have been included. This patch rectifies that problem. I should have remembered this -- I went down this path once in the 90s. I don't recall which port anymore, but once Joseph mentioned this policy bits and pieces did start to come back to me. Restoring the proper default happens to also fix 170 tests in the GCC testsuite, some of which would go into infinite loops when bitfields were treated as signed values (pr88621 for example). Essentially the testing time cuts in half, which was actually the point of digging into pr88621 to begin with. gcc/ * config/mcore/mcore.h (CC1_SPEC): Do not set -funsigned-bitfields.
2023-12-20-finline-stringops: copy timeout factor from memcmp-1.c testAlexandre Oliva2-0/+2
I added some -finline-stringops tests that included memcmp-1.c, but carried over the timeout factor onto only one such test. Jeff Law kindly pointed that out (thanks!), so here's the fix. for gcc/testsuite/ChangeLog * gcc.dg/torture/inline-mem-cmp-1.c: Copy timeout factor from mem-cmp-1.c. * gcc.dg/torture/inline-mem-cpy-1.c: Likewise.
2023-12-20i386: Allow 64 bit mask register for -mno-evex512Haochen Jiang7-68/+59
gcc/ChangeLog: * config/i386/avx512bwintrin.h: Allow 64 bit mask intrin usage for -mno-evex512. * config/i386/i386-builtin.def: Remove OPTION_MASK_ISA2_EVEX512 for 64 bit mask builtins. * config/i386/i386.cc (ix86_hard_regno_mode_ok): Allow 64 bit mask register for -mno-evex512. * config/i386/i386.md (SWI1248_AVX512BWDQ_64): Remove TARGET_EVEX512. (*zero_extendsidi2): Change isa attribute to avx512bw. (kmov_isa): Ditto. (*anddi_1): Ditto. (*andn<mode>_1): Remove TARGET_EVEX512. (*one_cmplsi2_1_zext): Change isa attribute to avx512bw. (*ashl<mode>3_1): Ditto. (*lshr<mode>3_1): Ditto. * config/i386/sse.md (SWI1248_AVX512BWDQ): Remove TARGET_EVEX512. (SWI1248_AVX512BW): Ditto. (SWI1248_AVX512BWDQ2): Ditto. (*knotsi_1_zext): Ditto. (kunpckdi): Ditto. (SWI24_MASK): Removed. (vec_pack_trunc_<mode>): Change iterator from SWI24_MASK to SWI24. (vec_unpacks_lo_di): Remove TARGET_EVEX512. (SWI48x_MASK): Removed. (vec_unpacks_hi_<mode>): Change iterator from SWI48x_MASK to SWI48x. gcc/testsuite/ChangeLog: * gcc.target/i386/avx10_1-6.c: Remove check for errors. * gcc.target/i386/noevex512-2.c: Diito.
2023-12-19tree-object-size: Always set computed bit for bdos [PR113012]Siddhesh Poyarekar2-5/+29
It is always safe to set the computed bit for dynamic object sizes at the end of collect_object_sizes_for because even in case of a dependency loop encountered in nested calls, we have an SSA temporary to actually finish the object size expression. The reexamine pass for dynamic object sizes is only for propagation of unknowns and gimplification of the size expressions, not for loop resolution as in the case of static object sizes. gcc/ChangeLog: PR tree-optimization/113012 * tree-object-size.cc (compute_builtin_object_size): Expand comment for dynamic object sizes. (collect_object_sizes_for): Always set COMPUTED bitmap for dynamic object sizes. gcc/testsuite/ChangeLog: PR tree-optimization/113012 * gcc.dg/ubsan/pr113012.c: New test case. Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
2023-12-20Daily bump.GCC Administrator9-1/+1094
2023-12-19strub: use opt_for_fn during ipaAlexandre Oliva1-3/+5
Instead of global optimization levels and flags, check per-function ones. for gcc/ChangeLog * ipa-strub.cc (gsi_insert_finally_seq_after_call): Likewise. (pass_ipa_strub::adjust_at_calls_call): Likewise.
2023-12-19strub: avoid lto inliningAlexandre Oliva1-2/+6
The strub builtins are not suited for cross-unit inlining, they should only be inlined by the builtin expanders, if at all. While testing on sparc64, it occurred to me that, if libgcc was built with LTO enabled, lto1 might inline them, and that would likely break things. So, make sure they're clearly marked as not inlinable. for libgcc/ChangeLog * strub.c (ATTRIBUTE_NOINLINE): New. (ATTRIBUTE_STRUB_CALLABLE): Add it. (__strub_dummy_force_no_leaf): Drop it.
2023-12-19hardened: use LD_PIE_SPEC only if definedAlexandre Oliva1-1/+1
sol2.h may define LINK_PIE_SPEC and leave LD_PIE_SPEC undefined, but gcc.cc will only provide a LD_PIE_SPEC definition if LINK_PIE_SPEC is not defined, and thenit uses LD_PIE_SPEC guarded by #ifdef HAVE_LD_PIE only. Add LD_PIE_SPEC to the guard. gcc/ChangeLog * gcc.cc (process_command): Use LD_PIE_SPEC only if defined.
2023-12-19sccopy: remove unused data member [PR113069]Marek Polacek1-1/+0
PR tree-optimization/113069 gcc/ChangeLog: * gimple-ssa-sccopy.cc (scc_discovery): Remove unused member.
2023-12-19c++: local class memfn synth from uneval context [PR113063]Patrick Palka2-10/+15
Here we first use and therefore synthesize the local class operator<=> from an unevaluated context, which inadvertently affects synthesization by preventing functions used within the definition (such as the copy constructor of std::strong_ordering) from getting marked as odr-used. This patch fixes this by using maybe_push_to_top_level in synthesize_method which ensures cp_unevaluated_operand gets cleared even in the function-local case. PR c++/113063 gcc/cp/ChangeLog: * method.cc (synthesize_method): Use maybe_push_to_top_level and maybe_pop_from_top_level. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/spaceship-synth16.C: New test.
2023-12-19c++: missing state restoration in maybe_pop_from_top_levelPatrick Palka2-7/+38
In the function-local case of maybe_pop_from_top_level, we need to restore the global flags that maybe_push_to_top_level cleared. gcc/cp/ChangeLog: * name-lookup.cc (struct local_state_t): Define. (local_state_stack): Define. (maybe_push_to_top_level): Use them. (maybe_pop_from_top_level): Likewise. * pt.cc (instantiate_decl): Remove dead code for saving/restoring cp_unevaluated_operand and c_inhibit_evaluation_warnings.
2023-12-20c++: Check null pointer deref when calling memfn in constexpr [PR102420]Nathaniel Shead2-0/+24
Calling a non-static member function on a null pointer is undefined behaviour (see [expr.ref] p8) and should error in constant evaluation, even if the 'this' pointer is never actually accessed within that function. One catch is that currently, the function pointer conversion operator for lambdas passes a null pointer as the 'this' pointer to the underlying 'operator()', so for now we ignore such calls. PR c++/102420 gcc/cp/ChangeLog: * constexpr.cc (cxx_bind_parameters_in_call): Check for calling non-static member functions with a null pointer. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-memfn2.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2023-12-19libgfortran: avoid duplicate libraries in specFrancois-Xavier Coudert1-1/+1
The linking of libgcc is already present in %(liborig), so the current situation duplicates libraries. This was not an issue until macOS's new linker started giving warnings for such cases. libgfortran/ChangeLog: PR libfortran/110651 * libgfortran.spec.in: Remove duplicate libraries.
2023-12-19OpenMP: Permit additional selector propertiesSandra Loosemore3-6/+12
This patch adds "hpe" to the known properties for the "vendor" selector, and support for "acquire" and "release" for "atomic_default_mem_order". gcc/ChangeLog * omp-general.cc (vendor_properties): Add "hpe". (atomic_default_mem_order_properties): Add "acquire" and "release". (omp_context_selector_matches): Handle "acquire" and "release". gcc/testsuite/ChangeLog * c-c++-common/gomp/declare-variant-2.c: Don't expect error on "acquire" and "release". * gfortran.dg/gomp/declare-variant-2a.f90: Likewise.
2023-12-19OpenMP: Use enumerators for names of trait-sets and traitsSandra Loosemore17-719/+920
This patch introduces enumerators to represent trait-set names and trait names, which makes it easier to use tables to control other behavior and for switch statements to dispatch on the tags. The tags are stored in the same place in the TREE_LIST structure (OMP_TSS_ID or OMP_TS_ID) and are encoded there as integer constants. gcc/ChangeLog * omp-selectors.h: New file. * omp-general.h: Include omp-selectors.h. (OMP_TSS_CODE, OMP_TSS_NAME): New. (OMP_TS_CODE, OMP_TS_NAME): New. (make_trait_set_selector, make_trait_selector): Adjust declarations. (omp_construct_traits_to_codes): Likewise. (omp_context_selector_set_compare): Likewise. (omp_get_context_selector): Likewise. (omp_get_context_selector_list): New. * omp-general.cc (omp_construct_traits_to_codes): Pass length in as argument instead of returning it. Make it table-driven. (omp_tss_map): New. (kind_properties, vendor_properties, extension_properties): New. (atomic_default_mem_order_properties): New. (omp_ts_map): New. (omp_check_context_selector): Simplify lookup and dispatch logic. (omp_mark_declare_variant): Ignore variants with unknown construct selectors. Adjust for new representation. (make_trait_set_selector, make_trait_selector): Adjust for new representations. (omp_context_selector_matches): Simplify dispatch logic. Avoid fixed-sized buffers and adjust call to omp_construct_traits_to_codes. (omp_context_selector_props_compare): Adjust for new representations and simplify dispatch logic. (omp_context_selector_set_compare): Likewise. (omp_context_selector_compare): Likewise. (omp_get_context_selector): Adjust for new representations, and split out... (omp_get_context_selector_list): New function. (omp_lookup_tss_code): New. (omp_lookup_ts_code): New. (omp_context_compute_score): Adjust for new representations. Avoid fixed-sized buffers and magic numbers. Adjust call to omp_construct_traits_to_codes. * gimplify.cc (omp_construct_selector_matches): Avoid use of fixed-size buffer. Adjust call to omp_construct_traits_to_codes. gcc/c/ChangeLog * c-parser.cc (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (c_parser_omp_context_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. Adjust error messages for extraneous/incorrect score. (c_parser_omp_context_selector_specification): Likewise. (c_finish_omp_declare_variant): Adjust for new representations. gcc/cp/ChangeLog * decl.cc (omp_declare_variant_finalize_one): Adjust for new representations. * parser.cc (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (cp_parser_omp_context_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. Adjust error messages for extraneous/incorrect score. (cp_parser_omp_context_selector_specification): Likewise. * pt.cc (tsubst_attribute): Adjust for new representations. gcc/fortran/ChangeLog * gfortran.h: Include omp-selectors.h. (enum gfc_omp_trait_property_kind): Delete, and replace all references with equivalent omp_tp_type enumerators. (struct gfc_omp_trait_property): Update for omp_tp_type. (struct gfc_omp_selector): Replace string name with new enumerator. (struct gfc_omp_set_selector): Likewise. * openmp.cc (gfc_free_omp_trait_property_list): Update for omp_tp_type. (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (gfc_ignore_trait_property_extension): New. (gfc_ignore_trait_property_extension_list): New. (gfc_match_omp_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. (gfc_match_omp_context_selector): Adjust for new representations. Adjust error messages for extraneous/incorrect score. (gfc_match_omp_context_selector_specification): Likewise. * trans-openmp.cc (gfc_trans_omp_declare_variant): Adjust for new representations. gcc/testsuite/ * c-c++-common/gomp/declare-variant-1.c: Expect warning on unknown selectors. * c-c++-common/gomp/declare-variant-2.c: Likewise. Also adjust messages for score errors. * c-c++-common/gomp/declare-variant-no-score.c: New. * gfortran.dg/gomp/declare-variant-1.f90: Expect warning on unknown selectors. * gfortran.dg/gomp/declare-variant-2.f90: Likewise. Also adjust messages for score errors. * gfortran.dg/gomp/declare-variant-no-score.f90: New.
2023-12-19OpenMP: Unify representation of name-list properties.Sandra Loosemore6-43/+61
Previously, name-list properties specified as identifiers were stored in the TREE_PURPOSE/OMP_TP_NAME slot, while those specified as strings were stored in the TREE_VALUE/OMP_TP_VALUE slot. This patch puts both representations in OMP_TP_VALUE with a magic cookie in OMP_TP_NAME. gcc/ChangeLog * omp-general.h (OMP_TP_NAMELIST_NODE): New. * omp-general.cc (omp_context_name_list_prop): Move earlier in the file, and adjust for new representation. (omp_check_context_selector): Adjust this too. (omp_context_selector_props_compare): Likewise. gcc/c/ChangeLog * c-parser.cc (c_parser_omp_context_selector): Adjust for new namelist property representation. gcc/cp/ChangeLog * parser.cc (cp_parser_omp_context_selector): Adjust for new namelist property representation. * pt.cc (tsubst_attribute): Likewise. gcc/fortran/ChangeLog * trans-openmp.cc (gfc_trans_omp_declare_varaint): Adjust for new namelist property representation.
2023-12-19OpenMP: Introduce accessor macros and constructors for context selectors.Sandra Loosemore7-214/+297
This patch hides the underlying nested TREE_LIST structure of context selectors behind accessor macros that have more meaningful names than the generic TREE_PURPOSE/TREE_VALUE accessors. There is a slight change to the representation in that the score expression in trait-selectors has a distinguished tag and is separated from the ordinary properties, although internally it is still represented as the first item in the TREE_VALUE of the selector. This patch also renames some local variables with slightly more descriptive names so it is easier to track whether something is a selector-set, selector, or property. gcc/ChangeLog * omp-general.h (OMP_TS_SCORE_NODE): New. (OMP_TSS_ID, OMP_TSS_TRAIT_SELECTORS): New. (OMP_TS_ID, OMP_TS_SCORE, OMP_TS_PROPERTIES): New. (OMP_TP_NAME, OMP_TP_VALUE): New. (make_trait_set_selector): Declare. (make_trait_selector): Declare. (make_trait_property): Declare. (omp_constructor_traits_to_codes): Rename to omp_construct_traits_to_codes. * omp-general.cc (omp_constructor_traits_to_codes): Rename to omp_construct_traits_to_codes. Use new accessors. (omp_check_context_selector): Use new accessors. (make_trait_set_selector): New. (make_trait_selector): New. (make_trait_property): New. (omp_context_name_list_prop): Use new accessors. (omp_context_selector_matches): Use new accessors. (omp_context_selector_props_compare): Use new accessors. (omp_context_selector_set_compare): Use new accessors. (omp_get_context_selector): Use new accessors. (omp_context_compute_score): Use new accessors. * gimplify.cc (omp_construct_selector_matches): Adjust for renaming of omp_constructor_traits_to_codes. gcc/c/ChangeLog * c-parser.cc (c_parser_omp_context_selector): Use new constructors. gcc/cp/ChangeLog * parser.cc (cp_parser_omp_context_selector): Use new constructors. * pt.cc: Include omp-general.h. (tsubst_attribute): Use new context selector accessors and constructors. gcc/fortran/ChangeLog * trans-openmp.cc (gfc_trans_omp_declare_variant): Use new constructors.
2023-12-19btf: change encoding of forward-declared enums [PR111735]David Faust2-11/+53
The BTF specification does not formally define a representation for forward-declared enum types such as: enum Foo; Forward-declarations for struct and union types are represented by BTF_KIND_FWD, which has a 1-bit flag distinguishing the two. The de-facto standard format used by other tools like clang and pahole is to represent forward-declared enums as BTF_KIND_ENUM with vlen=0, i.e. as a regular enum type with no enumerators. This patch changes GCC to adopt that format, and makes a couple of minor cleanups in btf_asm_type (). gcc/ PR debug/111735 * btfout.cc (btf_fwd_to_enum_p): New. (btf_asm_type_ref): Special case references to enum forwards. (btf_asm_type): Special case enum forwards. Rename btf_size_type to btf_size, and change chained ifs switching on btf_kind into else ifs. gcc/testsuite/ PR debug/111735 * gcc.dg/debug/btf/btf-forward-2.c: New test.
2023-12-19c++: partial ordering and dep alias tmpl specs [PR90679]Patrick Palka5-10/+88
During partial ordering, we want to look through dependent alias template specializations within template arguments and otherwise treat them as opaque in other contexts (see e.g. r7-7116-g0c942f3edab108 and r11-7011-g6e0a231a4aa240). To that end template_args_equal was given a partial_order flag that controls this behavior. This flag does the right thing when a dependent alias template specialization appears as template argument of the partial specialization, e.g. in template<class T, class...> using first_t = T; template<class T> struct traits; template<class T> struct traits<first_t<T, T&>> { }; // #1 template<class T> struct traits<first_t<const T, T&>> { }; // #2 we correctly consider #2 to be more specialized than #1. But if the alias specialization appears as a nested template argument of another class template specialization, e.g. in template<class T> struct traits<A<first_t<T, T&>>> { }; // #1 template<class T> struct traits<A<first_t<const T, T&>>> { }; // #2 then we incorrectly consider #1 and #2 to be unordered. This is because 1. we don't propagate the flag to recursive template_args_equal calls 2. we don't use structural equality for class template specializations written in terms of dependent alias template specializations This patch fixes the first issue by turning the partial_order flag into a global. This patch fixes the second issue by making us propagate structural equality appropriately when building a class template specialization. In passing this patch also improves hashing of specializations that use structural equality. PR c++/90679 gcc/cp/ChangeLog: * cp-tree.h (comp_template_args): Remove partial_order parameter. (template_args_equal): Likewise. * pt.cc (comparing_for_partial_ordering): New global flag. (iterative_hash_template_arg) <case tcc_type>: Hash the template and arguments for specializations that use structural equality. (template_args_equal): Remove partial order parameter and use comparing_for_partial_ordering instead. (comp_template_args): Likewise. (comp_template_args_porder): Set comparing_for_partial_ordering instead. Make static. (any_template_arguments_need_structural_equality_p): Return true for an argument that's a dependent alias template specialization or a class template specialization that itself needs structural equality. * tree.cc (cp_tree_equal) <case TREE_VEC>: Adjust call to comp_template_args. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-75a.C: New test. * g++.dg/cpp0x/alias-decl-75b.C: New test.
2023-12-19c++: refine dependent_alias_template_spec_p [PR90679]Patrick Palka3-32/+103
For a (complex) alias template-id, dependent_alias_template_spec_p returns true if any template argument of the template-id is dependent. This predicate indicates that substitution into the template-id may behave differently with respect to SFINAE than substitution into the expanded alias, and so the alias is in a way non-transparent. For example, 'first_t<T, T&>' in template<class T, class...> using first_t = T; template<class T> first_t<T, T&> f(); is such an alias template-id since first_t doesn't use its second template parameter and so the substitution into the expanded alias would discard the SFINAE effects of the corresponding (dependent) argument 'T&'. But this predicate is overly conservative since what really matters for sake of SFINAE equivalence is whether a template argument corresponding to an _unused_ template parameter is dependent. So the predicate should return false for e.g. 'first_t<T&, int>'. This patch refines the predicate appropriately. We need to be able to efficiently determine which template parameters of a complex alias template are unused, so to that end we add a new out parameter to complex_alias_template_p and cache its result in an on-the-side hash_map that replaces the existing TEMPLATE_DECL_COMPLEX_ALIAS_P flag. PR c++/90679 gcc/cp/ChangeLog: * cp-tree.h (TEMPLATE_DECL_COMPLEX_ALIAS_P): Remove. (most_general_template): Constify parameter. * pt.cc (push_template_decl): Adjust after removing TEMPLATE_DECL_COMPLEX_ALIAS_P. (complex_alias_tmpl_info): New hash_map. (uses_all_template_parms_data::seen): Change type to tree* from bool*. (complex_alias_template_r): Adjust accordingly. (complex_alias_template_p): Add 'seen_out' out parameter. Call most_general_template and check PRIMARY_TEMPLATE_P. Use complex_alias_tmpl_info to cache the result and set '*seen_out' accordigly. (dependent_alias_template_spec_p): Add !processing_template_decl early exit test. Consider dependence of only template arguments corresponding to seen template parameters as per gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-76.C: New test.
2023-12-19testsuite: adjust call to abort in excess-precision-12Marc Poulhiès1-2/+2
On non-hosted targets, cstdlib may not be sufficient to have abort defined, but it should be for std::abort. gcc/testsuite/ChangeLog: * g++.target/i386/excess-precision-12.C: call std::abort instead of abort.
2023-12-19ada: Add makefile targets for building/installing html docMarc Poulhiès1-4/+31
Add the ada.html and ada.install-html targets so that we can build the html with `make html`. gcc/ada/ * gcc-interface/Make-lang.in (ada.html, ada.install-html): Add.
2023-12-19ada: Fix internal error on call with parameter of predicated subtypeEric Botcazou2-10/+8
The problem is that the predicated subtype does not inherit all the required attributes of a string subtype with a static predicate. gcc/ada/ * sem_ch3.adb (Analyze_Subtype_Declaration): Remove a short-circuit for subtypes without aspects when it comes to predicates. * sem_util.adb (Inherit_Predicate_Flags): Deal with private subtypes whose full view is an Itype.
2023-12-19ada: Check all interfaces for valid iterator typeViljar Indus1-13/+90
gcc/ada/ * sem_ch13.adb (Valid_Default_Iterator): Check all interfaces for valid iterator type. Also improve error reporting.
2023-12-19ada: Missing error on positional container aggregates for types with Add_NamedGary Dismukes1-3/+17
The compiler fails to reject a container aggregate written using positional notation when the container type specifies an Add_Named operation in its Aggregate aspect. Container aggregates for such types must be written using named associations. The compiler ignores the positional associations and produces an empty aggregate object. An error check is added to catch such illegal container aggregates. gcc/ada/ * sem_aggr.adb (Resolve_Container_Aggregate): In the Add_Named case, issue an error if the container aggregate is written as a positional aggregate, since such an aggregate must have named associations.
2023-12-19ada: Remove GNATcheck violationsSheri Bernstein1-10/+8
Remove GNATcheck violations by refactoring code and also using pragma Annotate to exempt them. gcc/ada/ * libgnat/a-comlin.adb (Argument_Count): Rewrite code so there is only one return, to remove Improper_Returns violation. (Command_Name): Add pragma to exempt Improper_Returns violation.
2023-12-19ada: Rework comment in Expand_Ctrl_Function_CallEric Botcazou1-1/+6
This expands on the reason for properly guarding the transformation. gcc/ada/ * exp_ch6.adb (Expand_Ctrl_Function_Call): Rework last comment.
2023-12-19ada: Compiler hangs on container aggregate with function call as key expressionGary Dismukes1-2/+2
The compiler hangs (or may crash, if assertions are enabled) when compiling an iterated association of a container aggregate that has a key expression given by a function call. The resolution of the call leads to a blowup in Build_Call_Marker, because the temporary copy of the expression that's analyzed has an Empty parent, causing insertion of the call marker to fail. The fix for this is to preanalyze, rather than analyze, the copy of the key expression (Build_Call_Marker will return without creating a call marker in the case of preanalysis). gcc/ada/ * sem_aggr.adb (Resolve_Iterated_Association): Call Preanalyze_And_Resolve instead of Analyze_And_Resolve on a key expression of an iterated association.
2023-12-19ada: Fix style and typos in commentsPiotr Trojanek3-4/+4
Code cleanup. gcc/ada/ * exp_ch9.adb, sem_ch10.adb, sem_util.adb: Fix comments.
2023-12-19ada: Remove unreferenced utility routine Get_Logical_Line_Number_ImgPiotr Trojanek2-18/+0
Routine Get_Logical_Line_Number_Img was introduced for splitting of Pre/Post contracts, but subsequent patch for that feature removed its only use. It was then used by GNATprove, but that use is now removed as well. gcc/ada/ * sinput.adb, sinput.ads (Get_Logical_Line_Number_Img): Remove.
2023-12-19ada: gnatbind: Do not generate Ada.Command_Line references when not usedPatrick Bernardi1-13/+42
It was previously assumed that configurable runtimes could not return exit statuses, however this assumption no longer holds. Instead, only import the required symbols from Ada.Command_Line's support packages if Ada.Command_Line is in the closure of the partition when a configurable runtime is used. gcc/ada/ * bindgen.adb (Command_Line_Used): New object. (Gen_Main): Only generate references to symbols used by Ada.Command_Line if the package is used by the partition. (Gen_Output_File_Ada): Ditto. (Resolve_Binder_Options): Check if Ada.Command_Line is in the closure of the partition.
2023-12-19ada: Optimize performance and remove dynamic frame requirement.Vasiliy Fofanov1-7/+10
gcc/ada/ * libgnat/i-cstrin.adb (Value): Optimize.
2023-12-19ada: Ignore unconstrained components as inputs for DependsPiotr Trojanek1-36/+2
The current wording of SPARK RM 6.1.5(5) about the inputs for the Depends contract doesn't mention "a record with at least one unconstrained component". gcc/ada/ * sem_prag.adb (Is_Unconstrained_Or_Tagged_Item): Update comment and body.
2023-12-19ada: Rename Is_Constr_Subt_For_UN_Aliased flagEric Botcazou9-57/+55
The flag is set on the constructed subtype of an object with unconstrained nominal subtype that is aliased and is used by the code generator to adjust the layout of the object. But it is actually only used for array subtypes, where it determines whether the object is allocated with its bounds, and this usage could be extended to other cases than the original case. gcc/ada/ * einfo.ads (Is_Constr_Subt_For_UN_Aliased): Rename into... (Is_Constr_Array_Subt_With_Bounds): ...this. * exp_ch3.adb (Expand_N_Object_Declaration): Adjust to above renaming and remove now redundant test. * sem_ch3.adb (Analyze_Object_Declaration): Likewise, but set Is_Constr_Array_Subt_With_Bounds only on arrays. * gen_il-fields.ads (Opt_Field_Enum): Apply same renaming. * gen_il-gen-gen_entities.adb (Entity_Kind): Likewise. * gen_il-internals.adb (Image): Remove specific processing for Is_Constr_Subt_For_UN_Aliased. * treepr.adb (Image): Likewise. * gcc-interface/decl.cc (gnat_to_gnu_entity): Adjust to renaming and remove now redundant tests. * gcc-interface/trans.cc (Identifier_to_gnu): Likewise. (Call_to_gnu): Likewise.
2023-12-19ada: Remove No_Dynamic_Priorities from Restricted_TaskingJohannes Kliemann1-1/+0
Some of our restricted runtimes support dynamic priorities. The binder needs to generate code for a restricted runtime even if the restriction No_Dynamic_Priorities is not in place. gcc/ada/ * libgnat/s-rident.ads: Remove No_Dynamic_Priorities from Restricted_Tasking.
2023-12-19ada: Adapt Ada.Command_Line to work on configurable runtimesPatrick Bernardi3-54/+28
The behaviour of the binder when handling command line arguments and exit codes is simplified so that references to the corresponding runtime symbols are always generated when the runtime is configured with command line argument and exit code support. This allows Ada.Command_Line to work with all runtimes, which was not the case previously. As a result of this change, configurable runtimes that do not include Ada.Command_Line and it support files, but are configured with Command_Line_Args and/or Exit_Status_Supported set to True will need to provide the symbols required by the binder, as these symbols will no longer be defined in the binder generated file. argv.c includes a small change to exclude adaint.h when compiling for a light runtime, since this header is not required. gcc/ada/ * argv.c: Do not include adaint.h if LIGHT_RUNTIME is defined. * bindgen.adb (Gen_Main): Simplify command line argument and exit handling by requiring the runtime to always provide the required symbols if command line argument and exit code is enabled. * targparm.ads: Update comments to reflect changes to gnatbind.
2023-12-19ada: Fix crash on concurrent type aggregateRonan Desplanques2-5/+18
Before this patch, the compiler would fail to examine the corresponding record types of concurrent types when building aggregate components. This patch fixes this, and adds a precondition and additional documentation on the subprogram that triggered the crash, as it never makes sense to call it with a concurrent type. gcc/ada/ * exp_aggr.adb (Initialize_Component): Use corresponding record types of concurrent types. * exp_util.ads (Make_Tag_Assignment_From_Type): Add precondition and extend documentation. Co-authored-by: Javier Miranda <miranda@adacore.com>
2023-12-19ada: Further cleanup in finalization machineryEric Botcazou8-211/+158
This removes the setting of the Is_Ignored_Transient flag on the temporaries needing finalization created by Expand_Ctrl_Function_Call when invoked from within the dependent expressions of conditional expressions. This flag tells the general finalization machinery to disregard the object. But temporaries needing finalization present in action lists of dependent expressions are picked up by Process_Transients_In_Expression, which deals with their finalization and sets the Is_Finalized_Transient flag on them. Now this latter flag has exactly the same effect as Is_Ignored_Transient as far as the general finalization machinery is concerned, so setting the flag is unnecessary. In the end, the flag can be decoupled entirely from transient objects and renamed into Is_Ignored_For_Finalization. This also moves around the declaration of a local variable and turns a library-level procedure into a nested procedure. gcc/ada/ * einfo.ads (Is_Ignored_Transient): Rename into... (Is_Ignored_For_Finalization): ...this. * gen_il-fields.ads (Opt_Field_Enum): Adjust to above renaming. * gen_il-gen-gen_entities.adb (Object_Kind): Likewise. * exp_aggr.adb (Expand_Array_Aggregate): Likewise. * exp_ch7.adb (Build_Finalizer.Process_Declarations): Likewise. * exp_util.adb (Requires_Cleanup_Actions): Likewise. * exp_ch4.adb (Expand_N_If_Expression): Move down declaration of variable Optimize_Return_Stmt. (Process_Transient_In_Expression): Turn procedure into a child of... (Process_Transients_In_Expression): ...this procedure. * exp_ch6.adb (Expand_Ctrl_Function_Call): Remove obsolete setting of Is_Ignored_Transient flag on the temporary if within a dependent expression of a conditional expression.
2023-12-19ada: Fix SPARK expansion of container aggregatesYannick Moy2-8/+155
GNATprove supports container aggregates, except for indexed aggregates. It needs all expressions to have suitable target types and Do_Range_Check flags, which are added by the special expansion for GNATprove. There is no impact on code generation. gcc/ada/ * exp_spark.adb (Expand_SPARK_N_Aggregate): New procedure for the special expansion. (Expand_SPARK): Call the new expansion procedure. * sem_util.adb (Is_Container_Aggregate): Implement missing test.
2023-12-19ada: Add missing guard to previous changeEric Botcazou1-1/+3
Ancestor_Type is overloaded with Aggregate_Bounds on N_Aggregate nodes so its access needs to be guarded in Copy_Generic_Node. gcc/ada/ * sem_ch12.adb (Copy_Generic_Node): Add guard for Ancestor_Type.
2023-12-19ada: Fix spurious visibility error on parent's component in instanceEric Botcazou6-35/+107
This occurs for an aggregate of a derived tagged type in the body of the instance, because the full view of the parent type, which was visible in the generic construct (otherwise the aggregate would have been illegal), is not restored in the body of the instance. Copy_Generic_Node already contains code to restore the full view in this case, but it works only if the derived tagged type is itself global to the generic construct, and not if the derived tagged type is local but the parent type global, as is the case here. gcc/ada/ * gen_il-fields.ads (Aggregate_Bounds): Rename to Aggregate_Bounds_Or_Ancestor_Type. * gen_il-gen-gen_nodes.adb (Aggregate_Bounds): Likewise. * sem_aggr.adb (Resolve_Record_Aggregate): Remove obsolete bypass. * sem_ch12.adb (Check_Generic_Actuals): Add decoration. (Copy_Generic_Node): For an extension aggregate, restore only the full view, if any. For a full aggregate, restore the full view as well as that of its Ancestor_Type, if any, and up to the root type. (Save_References_In_Aggregate): For a full aggregate of a local derived tagged type with a global ancestor, set Ancestor_Type to this ancestor. For a full aggregate of a global derived tagged type, set Ancestor_Type to the parent type. * sinfo-utils.ads (Aggregate_Bounds): New function renaming. (Ancestor_Type): Likewise. (Set_Aggregate_Bounds): New procedure renaming. (Set_Ancestor_Type): Likewise. * sinfo.ads (Ancestor_Type): Document new field.
2023-12-19ada: Plug small loophole in finalization machineryEric Botcazou1-0/+8
The path in Expand_N_If_Expression implementing the special optimization for an unidimensional array type and dependent expressions with static bounds fails to call Process_Transients_In_Expression on their list of actions. gcc/ada/ * exp_ch4.adb (Expand_N_If_Expression): Also add missing calls to Process_Transients_In_Expression on the code path implementing the special optimization for an unidimensional array type and dependent expressions with static bounds.
2023-12-19ada: Cope with Sem_Util.Enclosing_Declaration oddness.Steve Baird1-1/+11
Sem_Util.Enclosing_Declaration can return a non-empty result which is not a declaration; clients may need to compensate for the case where an N_Subprogram_Specification node is returned. One such client is the function Is_Actual_Subp_Of_Inst. gcc/ada/ * sem_ch8.adb (Is_Actual_Subp_Of_Inst): After calling Enclosing_Declaration, add a check for the case where one more Parent call is needed to get the enclosing declaration.
2023-12-19ada: Restore object constraint optimizationRonan Desplanques2-63/+5
This patch relaxes the requirement that discriminants values should be known at compile time for a particular optimization to be applied. That optimization is the one that treats an unconstrained object as constrained when the object is of a limited type, in order to reduce the size of the object. What makes it possible to relax this requirement is that the set of cases where the optimization is applied was narrowed in a previous patch. gcc/ada/ * sem_util.adb (Build_Default_Subtype_OK): Relax known-at-compile-time requirement. * sem_util.ads (Build_Default_Subtype_OK): Bring documentation comment up-to-date.
2023-12-19ada: Do not issue SPARK legality error if SPARK_Mode ignoredYannick Moy5-1275/+1308
When pragma Ignore_Pragma(SPARK_Mode) is used, do not issue error messages related to SPARK legality checking. This facilitates the instrumentation of code by GNATcoverage. gcc/ada/ * doc/gnat_rm/implementation_defined_pragmas.rst: Fix doc for pragma Ignore_Pragma, in the case where it follows another configuration pragma that it names, which causes the preceding pragma to be ignored after parsing. * errout.adb (Should_Ignore_Pragma_SPARK_Mode): New query. (SPARK_Msg_N): Do nothing if SPARK_Mode is ignored. (SPARK_Msg_NE): Same. * gnat-style.texi: Regenerate. * gnat_rm.texi: Regenerate. * gnat_ugn.texi: Regenerate.
2023-12-19ada: Cleanup SPARK legality checkingYannick Moy3-112/+10
Move one SPARK legality check from GNAT to GNATprove, and cleanup other uses of SPARK_Mode for legality checking. gcc/ada/ * sem_ch4.adb (Analyze_Selected_Component): Check correct mode variable for GNATprove. * sem_prag.adb (Refined_State): Call SPARK_Msg_NE which checks value of SPARK_Mode before issuing a message. * sem_res.adb (Resolve_Entity_Name): Remove legality check for SPARK RM 6.1.9(1), moved to GNATprove.
2023-12-19ada: Illegal instance of Generic_1.Generic_2 incorrectly acceptedSteve Baird1-11/+85
If G1 is a generic package and G1.G2 is a child unit (also a generic package) then it would be illegal if some third generic unit (declared outside of G1) takes a formal instance of G1.G2, as in "with package I2 is new G1.G2;". This construct was incorrectly accepted in some cases. gcc/ada/ * sem_ch12.adb (Check_Generic_Child_Unit): Introduce a new nested function Adjusted_Inst_Par_Ekind to cope with cases where either a- the visibility of a compiler-generated renaming is incorrect; or b- we are inside of a generic parent unit G1 that has a child unit G1.G2, so instantiation of G1.G2 is permitted.