1. 19 Sep, 2019 40 commits
    • PR middle-end/91631 - buffer overflow into an array member of a declared object not detected · 6889a3ac
      gcc/ChangeLog:
      
      	PR middle-end/91631
      	* builtins.c (component_size): Correct trailing array computation,
      	rename to component_ref_size and move...
      	(compute_objsize): Adjust.
      	* gimple-ssa-warn-restrict.c (builtin_memref::refsize): New member.
      	(builtin_access::strict): Do not consider mememmove.
      	(builtin_access::write_off): New function.
      	(builtin_memref::builtin_memref): Initialize refsize.
      	(builtin_memref::set_base_and_offset): Adjust refoff and compute
      	refsize.
      	(builtin_memref::offset_out_of_bounds): Use ooboff input values.
      	Handle refsize.
      	(builtin_access::builtin_access): Intialize dstoff to destination
      	refeence offset here instead of in maybe_diag_overlap.  Adjust
      	referencess even to unrelated objects.	Adjust sizrange of bounded
      	string functions to reflect bound.  For strcat, adjust destination
      	sizrange by that of source.
      	(builtin_access::strcat_overlap):  Adjust offsets and sizes
      	to reflect the increase in destination sizrange above.
      	(builtin_access::overlap): Do not set dstoff here but instead
      	in builtin_access::builtin_access.
      	(check_bounds_or_overlap): Use builtin_access::write_off.
      	(maybe_diag_access_bounds): Add argument.  Add informational notes.
      	(dump_builtin_memref, dump_builtin_access): New functions.
      	* tree.c (component_ref_size): ...to here.
      	* tree.h (component_ref_size): Declare.
      	* tree-ssa-strlen (handle_builtin_strcat): Include the terminating
      	nul in the size of the source string.
      
      gcc/testsuite/ChangeLog:
      
      	PR middle-end/91631
      	* /c-c++-common/Warray-bounds-3.c: Correct expected offsets.
      	* /c-c++-common/Warray-bounds-4.c: Same.
      	* gcc.dg/Warray-bounds-39.c: Remove xfails.
      	* gcc.dg/Warray-bounds-45.c: New test.
      	* gcc.dg/Warray-bounds-46.c: New test.
      
      From-SVN: r275981
      Martin Sebor committed
    • Support extended characters in C/C++ identifiers (PR c/67224) · 7d112d66
      libcpp/ChangeLog
      2019-09-19  Lewis Hyatt  <lhyatt@gmail.com>
      
      	PR c/67224
      	* charset.c (_cpp_valid_utf8): New function to help lex UTF-8 tokens.
      	* internal.h (_cpp_valid_utf8): Declare.
      	* lex.c (forms_identifier_p): Use it to recognize UTF-8 identifiers.
      	(_cpp_lex_direct): Handle UTF-8 in identifiers and CPP_OTHER tokens.
      	Do all work in "default" case to avoid slowing down typical code paths.
      	Also handle $ and UCN in the default case for consistency.
      
      gcc/Changelog
      2019-09-19  Lewis Hyatt  <lhyatt@gmail.com>
      
      	PR c/67224
      	* doc/cpp.texi: Document support for extended characters in
      	identifiers.
      	* doc/cppopts.texi: Likewise.
      
      gcc/testsuite/ChangeLog
      2019-09-19  Lewis Hyatt  <lhyatt@gmail.com>
      
      	PR c/67224
      	* c-c++-common/cpp/ucnid-2011-1-utf8.c: New test.
      	* g++.dg/cpp/ucnid-1-utf8.C: New test.
      	* g++.dg/cpp/ucnid-2-utf8.C: New test.
      	* g++.dg/cpp/ucnid-3-utf8.C: New test.
      	* g++.dg/cpp/ucnid-4-utf8.C: New test.
      	* g++.dg/other/ucnid-1-utf8.C: New test.
      	* gcc.dg/cpp/ucnid-1-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-10-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-11-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-12-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-13-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-14-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-15-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-2-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-3-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-4-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-6-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-7-utf8.c: New test.
      	* gcc.dg/cpp/ucnid-9-utf8.c: New test.
      	* gcc.dg/ucnid-1-utf8.c: New test.
      	* gcc.dg/ucnid-10-utf8.c: New test.
      	* gcc.dg/ucnid-11-utf8.c: New test.
      	* gcc.dg/ucnid-12-utf8.c: New test.
      	* gcc.dg/ucnid-13-utf8.c: New test.
      	* gcc.dg/ucnid-14-utf8.c: New test.
      	* gcc.dg/ucnid-15-utf8.c: New test.
      	* gcc.dg/ucnid-16-utf8.c: New test.
      	* gcc.dg/ucnid-2-utf8.c: New test.
      	* gcc.dg/ucnid-3-utf8.c: New test.
      	* gcc.dg/ucnid-4-utf8.c: New test.
      	* gcc.dg/ucnid-5-utf8.c: New test.
      	* gcc.dg/ucnid-6-utf8.c: New test.
      	* gcc.dg/ucnid-7-utf8.c: New test.
      	* gcc.dg/ucnid-8-utf8.c: New test.
      	* gcc.dg/ucnid-9-utf8.c: New test.
      
      From-SVN: r275979
      Lewis Hyatt committed
    • Handle [[likely]] on compound-statement. · e0710fcf
      I overlooked this case when adding [[likely]] handling to
      cp_parser_statement.
      
      	* parser.c (cp_parser_statement): Handle [[likely]] on
      	compound-statement.
      
      From-SVN: r275978
      Jason Merrill committed
    • [Darwin, PPC, testsuite] Fix pr89313.c fail. · a519efbe
      Darwin defines '__POWERPC__' rather than '__powerpc__' so check for
      the upper case version too in order to select the correct register
      name.
      
      gcc/testsuite:
      
      2019-09-19  Iain Sandoe  <iain@sandoe.co.uk>
      
      	* gcc.dg/pr89313.c: Test for __POWERPC__ in addition to
      	__powerpc__ in register name selection.
      
      From-SVN: r275977
      Iain Sandoe committed
    • Revert "Fix conversions for built-in operator overloading candidates." · e564cf98
      This reverts commit 948d5b831affef14a49f56804b01e3f1ba00cdb3.
      
      From-SVN: r275976
      Jason Merrill committed
    • tree-vect-loop.c (vect_is_slp_reduction): Remove. · b3c4d0dd
      2019-09-19  Richard Biener  <rguenther@suse.de>
      
      	* tree-vect-loop.c (vect_is_slp_reduction): Remove.
      	(check_reduction_path): New overload having the path as result.
      	(vect_is_simple_reduction): From the detected reduction
      	path build a SLP reduction chain if possible.
      
      From-SVN: r275972
      Richard Biener committed
    • re PR target/91814 (ICE in elimination_costs_in_insn, at reload1.c:3549 since r274926) · 54dc8577
      2019-09-19  Richard Biener  <rguenther@suse.de>
      
      	PR target/91814
      	* config/i386/i386-features.c (gen_gpr_to_xmm_move_src):
      	Force operand to a register if it isn't nonimmediate_operand.
      
      From-SVN: r275971
      Richard Biener committed
    • [ARM] Simplify logical DImode iterators · 40858b9d
      Further simplify the logical DImode expander using code iterator and
      obtab attributes.  This avoids adding unnecessary code_attr entries.
      
          gcc/
      	* config/arm/arm.md (<logical_op>di3): Use <optab> and <CODE>.
      	* config/arm/iterators.md (optab): Add and, ior, xor entries.
      	(logical_op): Remove code attribute.
      	(logical_OP): Likewise.
      
      From-SVN: r275970
      Wilco Dijkstra committed
    • Fix cast in sort_congruence_class_groups_by_decl_uid. · 9f576d30
      2019-09-19  Martin Liska  <mliska@suse.cz>
      
      	* ipa-icf.c (sort_congruence_class_groups_by_decl_uid):
      	Use proper casting.
      
      From-SVN: r275969
      Martin Liska committed
    • aarch64: Implement -moutline-atomics · 3950b229
      	* config/aarch64/aarch64.opt (-moutline-atomics): New.
      	* config/aarch64/aarch64.c (aarch64_atomic_ool_func): New.
      	(aarch64_ool_cas_names, aarch64_ool_swp_names): New.
      	(aarch64_ool_ldadd_names, aarch64_ool_ldset_names): New.
      	(aarch64_ool_ldclr_names, aarch64_ool_ldeor_names): New.
      	(aarch64_expand_compare_and_swap): Honor TARGET_OUTLINE_ATOMICS.
      	* config/aarch64/atomics.md (atomic_exchange<ALLI>): Likewise.
      	(atomic_<atomic_op><ALLI>): Likewise.
      	(atomic_fetch_<atomic_op><ALLI>): Likewise.
      	(atomic_<atomic_op>_fetch<ALLI>): Likewise.
      	* doc/invoke.texi: Document -moutline-atomics.
      testsuite/
      	* gcc.target/aarch64/atomic-op-acq_rel.c: Use -mno-outline-atomics.
      	* gcc.target/aarch64/atomic-comp-swap-release-acquire.c: Likewise.
      	* gcc.target/aarch64/atomic-op-acquire.c: Likewise.
      	* gcc.target/aarch64/atomic-op-char.c: Likewise.
      	* gcc.target/aarch64/atomic-op-consume.c: Likewise.
      	* gcc.target/aarch64/atomic-op-imm.c: Likewise.
      	* gcc.target/aarch64/atomic-op-int.c: Likewise.
      	* gcc.target/aarch64/atomic-op-long.c: Likewise.
      	* gcc.target/aarch64/atomic-op-relaxed.c: Likewise.
      	* gcc.target/aarch64/atomic-op-release.c: Likewise.
      	* gcc.target/aarch64/atomic-op-seq_cst.c: Likewise.
      	* gcc.target/aarch64/atomic-op-short.c: Likewise.
      	* gcc.target/aarch64/atomic_cmp_exchange_zero_reg_1.c: Likewise.
      	* gcc.target/aarch64/atomic_cmp_exchange_zero_strong_1.c: Likewise.
      	* gcc.target/aarch64/sync-comp-swap.c: Likewise.
      	* gcc.target/aarch64/sync-op-acquire.c: Likewise.
      	* gcc.target/aarch64/sync-op-full.c: Likewise.
      
      From-SVN: r275968
      Richard Henderson committed
    • aarch64: Add out-of-line functions for LSE atomics · 33befddc
      This is the libgcc part of the interface -- providing the functions.
      Rationale is provided at the top of libgcc/config/aarch64/lse.S.
      
      	* config/aarch64/lse-init.c: New file.
      	* config/aarch64/lse.S: New file.
      	* config/aarch64/t-lse: New file.
      	* config.host: Add t-lse to all aarch64 tuples.
      
      From-SVN: r275967
      Richard Henderson committed
    • aarch64: Tidy aarch64_split_compare_and_swap · b7e560de
      With aarch64_track_speculation, we had extra code to do exactly what the
      !strong_zero_p path already did.  The rest is reducing code duplication.
      
      	* config/aarch64/aarch64 (aarch64_split_compare_and_swap): Disable
      	strong_zero_p for aarch64_track_speculation; unify some code paths;
      	use aarch64_gen_compare_reg instead of open-coding.
      
      From-SVN: r275966
      Richard Henderson committed
    • aarch64: Implement TImode compare-and-swap · 4a2095eb
      This pattern will only be used with the __sync functions, because
      we do not yet have a bare TImode atomic load.
      
      	* config/aarch64/aarch64.c (aarch64_gen_compare_reg): Add support
      	for NE comparison of TImode values.
      	(aarch64_emit_load_exclusive): Add support for TImode.
      	(aarch64_emit_store_exclusive): Likewise.
      	(aarch64_split_compare_and_swap): Disable strong_zero_p for TImode.
      	* config/aarch64/atomics.md (@atomic_compare_and_swap<ALLI_TI>):
      	Change iterator from ALLI to ALLI_TI.
      	(@atomic_compare_and_swap<JUST_TI>): New.
      	(@atomic_compare_and_swap<JUST_TI>_lse): New.
      	(aarch64_load_exclusive_pair): New.
      	(aarch64_store_exclusive_pair): New.
      	* config/aarch64/iterators.md (JUST_TI): New.
      
      From-SVN: r275965
      Richard Henderson committed
    • aarch64: Extend %R for integer registers · e3f15286
      	* config/aarch64/aarch64.c (aarch64_print_operand): Allow integer
      	registers with %R.
      
      From-SVN: r275964
      Richard Henderson committed
    • Use post-dom info to update if/switch predicate · efe12656
      2019-09-19  Feng Xue  <fxue@os.amperecomputing.com>
      
              * ipa-fnsummary.c (set_cond_stmt_execution_predicate): Do not compute
              trivial predicate for condition branch.
              (set_switch_stmt_execution_predicate): Do not compute trivial predicate
              for switch case.
              (compute_bb_predicates): Update predicate based on post-dominating
              relationship.
              (analyze_function_body): Calculate post-dominating information.
      
      2019-09-19  Feng Xue  <fxue@os.amperecomputing.com>
      
              * gcc.dg/ipa/pr91089.c: Add a new function and pattern.
      
      From-SVN: r275963
      Feng Xue committed
    • Enforce correct COND_EXPR order for EXTRACT_LAST_REDUCTION · c449d3ae
      For conditional reductions, the "then" value needs to be the candidate
      value calculated by this iteration while the "else" value needs to be
      the result carried over from previous iterations.  If the COND_EXPR
      is the other way around, we need to swap it.
      
      2019-09-19  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* tree-vectorizer.h (vectorizable_condition): Take an int
      	reduction index instead of a boolean flag.
      	* tree-vect-stmts.c (vectorizable_condition): Likewise.
      	Swap the "then" and "else" values for EXTRACT_LAST_REDUCTION
      	reductions if the reduction accumulator is the "then" rather
      	than the "else" value.
      	(vect_analyze_stmt): Update call accordingly.
      	(vect_transform_stmt): Likewise.
      	* tree-vect-loop.c (vectorizable_reduction): Likewise,
      	asserting that the index is > 0.
      
      From-SVN: r275962
      Richard Sandiford committed
    • Speed up qsort in IPA ICF. · 37bc3aa0
      2019-09-19  Martin Liska  <mliska@suse.cz>
      
      	* ipa-icf.c (sort_sem_items_by_decl_uid): Simplify comparator.
      	(sort_congruence_classes_by_decl_uid): Likewise.
      	(sort_congruence_class_groups_by_decl_uid): Use std::pair for
      	easier sorting.
      	(sem_item_optimizer::merge_classes): Likewise.
      
      From-SVN: r275961
      Martin Liska committed
    • re PR tree-optimization/91812 (GCC ignores volatile modifier) · d9e736e7
      2019-09-19  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/91812
      	* tree-ssa-phiprop.c (propagate_with_phi): Do not replace
      	volatile loads.
      
      	* gcc.dg/torture/pr91812.c: New testcase.
      
      From-SVN: r275960
      Richard Biener committed
    • Rework constant subreg folds and handle more variable-length cases · f24f4c15
      This patch rewrites the way simplify_subreg handles constants.
      It uses similar native_encode/native_decode routines to the
      tree-level handling of VIEW_CONVERT_EXPR, meaning that we can
      move between rtx constants and the target memory image of them.
      
      The main point of this patch is to support subregs of constant-length
      vectors for VLA vectors, beyond the very simple cases that were already
      handled.  Many of the new tests failed before the patch for variable-
      length vectors.
      
      The boolean side is tested more by the upcoming SVE ACLE work.
      
      2019-09-19  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* defaults.h (TARGET_UNIT): New macro.
      	(target_unit): New type.
      	* rtl.h (native_encode_rtx, native_decode_rtx)
      	(native_decode_vector_rtx, subreg_size_lsb): Declare.
      	(subreg_lsb_1): Turn into an inline wrapper around subreg_size_lsb.
      	* rtlanal.c (subreg_lsb_1): Delete.
      	(subreg_size_lsb): New function.
      	* simplify-rtx.c: Include rtx-vector-builder.h
      	(simplify_immed_subreg): Delete.
      	(native_encode_rtx, native_decode_vector_rtx, native_decode_rtx)
      	(simplify_const_vector_byte_offset, simplify_const_vector_subreg): New
      	functions.
      	(simplify_subreg): Use them.
      	(test_vector_subregs_modes, test_vector_subregs_repeating)
      	(test_vector_subregs_fore_back, test_vector_subregs_stepped)
      	(test_vector_subregs): New functions.
      	(test_vector_ops): Call test_vector_subregs for integer vector
      	modes with at least 2 elements.
      
      From-SVN: r275959
      Richard Sandiford committed
    • [Ada] Emit DW_AT_GNU_bias with -fgnat-encodings=gdb · 4736041b
      Emit DW_AT_GNU_bias with -fgnat-encodings=gdb.  gdb implements this,
      but not the encoded variant.
      
      2019-09-19  Tom Tromey  <tromey@adacore.com>
      
      gcc/ada/
      
      	* gcc-interface/misc.c (gnat_get_type_bias): Return the bias
      	when -fgnat-encodings=gdb.
      
      gcc/testsuite/
      
      	* gnat.dg/bias1.adb: New testcase.
      
      From-SVN: r275958
      Tom Tromey committed
    • [Ada] Accept concatentation arguments to pragma Annotate · 0c27222c
      In cases where pragma Annotate accepts a string literal as an argument,
      we now also accept a concatenation of string literals.
      
      2019-09-19  Steve Baird  <baird@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Preferred_String_Type): A new function. Given an
      	expression, determines whether the preference rules defined for
      	the third-and-later arguments of pragma Annotate suffice to
      	determine the type of the expression. If so, then the preferred
      	type is returned; if not then Empty is returned. Handles
      	concatenations.
      	(Analyze_Pragma): Replace previous code, which dealt only with
      	string literals, with calls to the new Preferred_String_Type
      	function, which also handles concatenations.
      	* doc/gnat_rm/implementation_defined_pragmas.rst: Update
      	documentation for pragma Annotate.
      	* gnat_rm.texi: Regenerate.
      
      gcc/testsuite/
      
      	* gnat.dg/annotation1.adb: New testcase.
      
      From-SVN: r275957
      Steve Baird committed
    • [Ada] Get rid of useless temporary for slice in overaligned record type · c3a75a09
      This fixes a recent code quality regression for targets that do not
      require the strict alignment of memory accesses: the compiler would
      generate a useless temporary for a slice of an array component in an
      overaligned record type.
      
      Running these commands:
      
        gcc -c p.adb -gnatws -gnatD
        grep loop p.adb.dg
      
      On the following sources:
      
      procedure P (N : Positive) is
      
        type Rec1 is record
          I : Integer;
        end record;
      
        type Arr is array (Positive range <>) of Rec1;
      
        type Rec2 is record
          A : Arr (1 .. 128);
        end record;
        for Rec2'Alignment use 8;
      
        procedure Proc (A : Arr) is
        begin
          null;
        end;
      
        R : Rec2;
      
      begin
        Proc (R.A (1 .. N));
      end;
      
      Should execute silently.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_util.adb (Is_Possibly_Unaligned_Slice): Do not return true
      	on pure alignment considerations if the target does not require
      	the strict alignment of memory accesses.
      
      From-SVN: r275956
      Eric Botcazou committed
    • [Ada] Sem_Ch12: add a comment to indicate future work · 87cd385f
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_ch12.adb (Check_Private_View): Add a comment to indicate
      	future work.
      
      From-SVN: r275955
      Eric Botcazou committed
    • [Ada] Fix copy operation with private discriminated record type · bee475e2
      This prevents the object code from reading too many bytes from the
      source for a copy operation involving a private discriminated record
      type with default discriminants and generated for the assignment of an
      aggregate to a variable or the initialization of a constant.
      
      The front-end already knows that it needs to convert the operation
      involving the aggregate into individual assignments if the type of the
      aggregate has mutable components, but it would not do so if this type is
      private, which does not change anything for code generation.
      
      Running these commands:
      
        gnatmake -q p -g -fsanitize=address
        p
      
      On the following sources:
      
      with Q; use Q;
      
      procedure P is
      
         type Rec is record
            A : T;
         end record;
      
         C : constant Rec := Rec'(A => Default_T);
      
      begin
         null;
      end;
      
      package Q is
      
         type T is private;
      
         Default_T : constant T;
      
      private
      
         A : constant := 170;
         B : constant := 8192;
      
         type A_Index is range 1 .. A;
         type B_Index is range 1 .. B;
      
         type A_Array is array (A_Index) of Boolean;
         type B_Array is array (B_Index) of Boolean;
      
         type Data_Type is (A_Type, B_Type);
      
         type T (Discriminant : Data_Type := A_Type) is record
            case Discriminant is
               when A_Type =>
                  Field_A : A_Array;
               when B_Type =>
                  Field_B : B_Array;
            end case;
         end record;
      
         Default_T : constant T :=
           T'(Discriminant => A_Type, Field_A => (others => True));
      
      end Q;
      
      Should execute silently.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_aggr.adb (Has_Mutable_Components): Look at the underlying
      	type of components to find out whether they are mutable.
      
      From-SVN: r275954
      Eric Botcazou committed
    • [Ada] Fix bogus "too late" error with nested generics and inlining · d53301c9
      This prevents the compiler from issuing a bogus error about a constant
      whose full declaration appears too late, if it is declared in a nested
      generic package and instantiated in another nested instantiation, when
      the instantiations are done in a unit withed from the main unit and
      containing an inlined subprogram, and cross-unit inlining is enabled.
      
      It turns out that, under these very peculiar conditions, the compiler
      ends up instantiating the body of the generic package twice, which leads
      to various semantic errors, in particular for declarations of constants.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_ch12.adb (Instantiate_Package_Body): Check that the body
      	has not already been instantiated when the body of the parent
      	was being loaded.
      
      gcc/testsuite/
      
      	* gnat.dg/inline21.adb, gnat.dg/inline21_g.ads,
      	gnat.dg/inline21_h.adb, gnat.dg/inline21_h.ads,
      	gnat.dg/inline21_q.ads: New testcase.
      
      From-SVN: r275953
      Eric Botcazou committed
    • [Ada] Fix bogus visibility error with nested generics and inlining · 9e0746fc
      This prevents the compiler from issuing a bogus error about the
      visibility of an operator in an instantiation of a nested generic
      package which is itself used as an actual of an instantiation of another
      generic package, when the instantiations are done in a unit withed from
      the main unit and containing an inlined subprogram, and cross-unit
      inlining is enabled.
      
      In most cases, the compiler does not check the visibility of operators
      in an instantiation context because this has already been done when the
      generic package has been analyzed. However, there are exceptions like
      the actuals of an instantiation of a generic child unit which is done
      as a compilation unit and the In_Instance predicate has a special check
      for these cases.
      
      This check would incorrectly trigger here and needs to be tightened.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_util.adb (In_Instance): Test whether the current unit has
      	been analyzed instead of being on the scope stack to detect the
      	case of actuals of an instantiation of a generic child unit done
      	as a compilation unit.
      
      gcc/testsuite/
      
      	* gnat.dg/inline20.adb, gnat.dg/inline20_g.adb,
      	gnat.dg/inline20_g.ads, gnat.dg/inline20_h.ads,
      	gnat.dg/inline20_i.ads, gnat.dg/inline20_q-io.ads,
      	gnat.dg/inline20_q.ads, gnat.dg/inline20_r.ads: New testcase.
      
      From-SVN: r275952
      Eric Botcazou committed
    • [Ada] New routine GNAT.Sockets.Create_Socket_Pair · fd0d7b4e
      New routine to create 2 connected sockets. This routine is analog of the
      UNIX system call socketpair. On UNIX platforms it is implemented on the
      base of socketpair. On other platforms it is implemented by conecting
      network sockets over loopback interface.
      
      2019-09-19  Dmitriy Anisimkov  <anisimko@adacore.com>
      
      gcc/ada/
      
      	* libgnat/g-socket.ads, libgnat/g-socket.adb
      	(Create_Socket_Pair): New routine.
      	* libgnat/g-socthi.ads (OS_Has_Socketpair): Boolean constant.
      	(C_Socketpair): New imported routine.
      	* libgnat/g-socthi__mingw.ads, libgnat/g-socthi__vxworks.ads
      	(Default_Socket_Pair_Family): New constant.
      	(C_Socketpair): New routine.
      	* libgnat/g-socthi__mingw.adb, libgnat/g-socthi__vxworks.adb
      	(C_Socketpair): Is separated in anouther file.
      	* libgnat/g-sthcso.adb (C_Socketpair): Non UNIX implementation.
      	* libgnat/g-stsifd__sockets.adb: Reuse C_Socketpair.
      
      From-SVN: r275951
      Dmitriy Anisimkov committed
    • [Ada] Use declared type for deciding on SPARK pointer rules · 4fe56329
      A constant of pointer type is considered as mutable in SPARK, according
      to SPARK RM 3.10, but this should be based on the declared type of the
      constant instead of its underlying type.
      
      There is no impact on compilation hence no test.
      
      2019-09-19  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Analyze_Depends_In_Decl_Part): Simplify previous
      	test.
      
      From-SVN: r275950
      Yannick Moy committed
    • [Ada] Spurious visibility error in generic child unit · 46fa6b05
      2019-09-19  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_ch7.adb (Install_Parent_Private_Declarations): If a
      	generic child unit is instantiated within a sibling child unit,
      	the analysis of its private part requires that the private part
      	of the ancestor be available, as is done when the context
      	includes an instance of the ancestor.
      
      gcc/testsuite/
      
      	* gnat.dg/generic2-child.ads, gnat.dg/generic2-io_any.adb,
      	gnat.dg/generic2-io_any.ads, gnat.dg/generic2.ads: New testcase.
      
      From-SVN: r275949
      Ed Schonberg committed
    • [Ada] Disable inlining of traversal function in GNATprove · 231ef54b
      Traversal functions as defined in SPARK RM 3.10 should not be inlined
      for analysis in GNATprove, as this changes the ownership behavior.
      Disable the inlining performed in GNATprove on functions which could be
      interpreted as such.
      
      There is no impact on compilation and thus no test.
      
      2019-09-19  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* inline.adb (Can_Be_Inlined_In_GNATprove_Mode): Add special
      	case for traversal functions.
      
      From-SVN: r275948
      Yannick Moy committed
    • [Ada] Allow constants of access type in Global contracts · 09709b47
      Now that SPARK supports access types, global constants of access type
      may appear as outputs of a subprogram, with the meaning that the
      underlying memory can be modified (see SPARK RM 3.10).
      
      2019-09-19  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Analyze_Global_In_Decl_Part): Do not issue an
      	error when a constant of an access type is used as output in a
      	Global contract.
      	(Analyze_Depends_In_Decl_Part): Do not issue an error when a
      	constant of an access type is used as output in a Depends
      	contract.
      
      gcc/testsuite/
      
      	* gnat.dg/global2.adb, gnat.dg/global2.ads: New testcase.
      
      From-SVN: r275947
      Yannick Moy committed
    • [Ada] Exp_Attr: remove obsolete comment · 7005758c
      2019-09-19  Arnaud Charlet  <charlet@adacore.com>
      
      gcc/ada/
      
      	* exp_attr.adb: Remove obsolete comment.
      
      From-SVN: r275946
      Arnaud Charlet committed
    • [Ada] Fix run-time segfault with derived access-to-subprogram type · 46a500a5
      This fixes a segfault at run time for the call to a local subprogram
      through an access value if the type of this access value is derived
      from an initial access-to-subprogram type and the access value was
      originally obtained with the initial type.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_ch3.adb (Build_Derived_Access_Type): If this is an access-
      	to-subprogram type, copy Can_Use_Internal_Rep from the parent.
      
      gcc/testsuite/
      
      	* gnat.dg/access9.adb: New testcase.
      
      From-SVN: r275945
      Eric Botcazou committed
    • [Ada] Move SPARK borrow-checker to gnat2why codebase · f5766e3b
      Unit sem_spark was implementing the borrow-checker for the support of
      ownership pointers in SPARK. It has been moved to gnat2why codebase to
      facilitate its evolution and allow the more powerful flow analysis to
      provide its results for better analysis on pointers.
      
      2019-09-19  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* gcc-interface/Make-lang.in: Remove references to sem_spark.
      	* sem_spark.adb, sem_spark.ads: Remove unit.
      
      From-SVN: r275944
      Yannick Moy committed
    • [Ada] Implement Machine_Rounding attribute in line when possible · d8ec2787
      GNAT implements Machine_Rounding as an alias for Rounding but, whereas
      the implementation of the latter is in line when possible, that of the
      former is always out of line, which is not aligned with the intent of
      the Ada RM.
      
      This changes the compiler to using for Machine_Rounding the same in line
      implementation as Rounding when possible.
      
      Running these commands:
      
        gcc -c f.adb -gnatD
        grep system f.adb.dg
      
      On the following sources:
      
      function F (Val : Float) return Integer is
      begin
        return Integer (Float'Machine_Rounding (Val));
      end;
      
      Should execute silently.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_attr.adb (Is_Inline_Floating_Point_Attribute): Treat
      	Machine_Rounding as an alias for Rounding.
      	* sem_res.adb (Simplify_Type_Conversion): Likewise.
      
      From-SVN: r275943
      Eric Botcazou committed
    • [Ada] Suppress GNAT FE up-level reference transformation for GNAT-LLVM · 143df1f9
      In the case of GNAT-LLVM, the GNAT FE no longer does expansion of
      up-level references identified by the subprogram unnesting machinery
      into activation record references. This is now only done by the FE when
      generating C code. This expansion is already taken care of by the
      gnat-llvm middle phase, so there's no benefit to also doing it in the
      front end.
      
      2019-09-19  Gary Dismukes  <dismukes@adacore.com>
      
      gcc/ada/
      
      	* exp_unst.adb (Unnest_Subprogram): Bypass the transformation of
      	up-level references unless Opt.Generate_C_Code is enabled.
      
      From-SVN: r275942
      Gary Dismukes committed
    • [Ada] Streamline comparison for equality of 2-element arrays · 1dd3915b
      In the general case, the comparison for equality of array objects is
      implemented by a local function that contains, among other things, a
      loop running over the elements, comparing them one by one and exiting
      as soon as an element is not the same in the two array objects.
      
      For the specific case of constrained 2-element arrays, this is rather
      heavy and unnecessarily obfuscates the control flow of the program,
      so this change implements a simple conjunction of comparisons for it.
      
      Running these commands:
      
        gcc -c p.ads -O -gnatD
        grep loop p.ads.dg
      
      On the following sources:
      
      package P is
      
        type Rec is record
          Re : Float;
          Im : Float;
        end record;
      
        type Arr is array (1 .. 2) of Rec;
      
        function Equal (A, B : Arr) return Boolean is (A = B);
      
      end P;
      
      Should execute silently.
      
      2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_ch4.adb (Expand_Array_Equality): If optimization is
      	enabled, generate a simple conjunction of comparisons for the
      	specific case of constrained 1-dimensional 2-element arrays.
      	Fix formatting.
      
      From-SVN: r275941
      Eric Botcazou committed
    • [Ada] Remove duplicated routines for getting homonym number · c4f372c5
      Routines Homonym_Number and Get_Homonym_Number were exactly the same,
      except for minor style differences. Keep the one in Exp_Util; remove the
      one in Exp_Dbug. No test attached, because semantics is unaffected.
      
      2019-09-19  Piotr Trojanek  <trojanek@adacore.com>
      
      gcc/ada/
      
      	* exp_dbug.ads, exp_dbug.adb (Get_Homonym_Number): Remove.
      	(Append_Homonym_Number): Use Homonym_Number instead of
      	Get_Homonym_Number.
      	* exp_util.ads, exp_util.adb (Homonym_Number): Mirror style of
      	the removed Get_Homonym_Number routine, i.e. initialize local
      	objects at declaration and refine the type of result.
      	* sem_util.adb (Add_Homonym_Suffix): Use Homonym_Number instead
      	of Get_Homonym_Number.
      
      From-SVN: r275940
      Piotr Trojanek committed
    • [Ada] Crash on predicate in full view in a generic unit · 890cde53
      This patch fixes a compiler abort on a dynamic predicate applied to the
      full view of a type in a generic package declaration, when the
      expression for the predicate is a conditionql expression that contains
      references to components of the full view of the type.
      
      2019-09-19  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_ch13.adb (Check_Aspect_At_End_Of_Declarations): Simplify
      	handling of expressions in predicates when the context is a
      	generic unit.
      
      gcc/testsuite/
      
      	* gnat.dg/predicate14.adb, gnat.dg/predicate14.ads: New
      	testcase.
      
      From-SVN: r275939
      Ed Schonberg committed
    • [Ada] Memory leak with 'Range of a function call in a loop · f56add9c
      If a for loop starts with "for X in F (...)'Range loop", where F is a
      function returning an unconstrained array, then memory is leaked. This
      patch fixes that bug.
      
      Running these commands:
      
        gnatmake -q -f main.adb
        main
      
      On the following sources:
      
      with Text_IO; use Text_IO;
      package P is
      
         function Get_Objects return String;
      
      end P;
      
      package body P is
         function Get_Objects return String is
         begin
            return "xyzzy";
         end Get_Objects;
      
      end P;
      
      with Text_IO; use Text_IO;
      pragma Warnings (Off, "an internal GNAT unit");
      with System.Secondary_Stack;
      pragma Warnings (On, "an internal GNAT unit");
      with P; use P;
      
      procedure Main is
         Max_Iterations : constant Integer := 1_000;
      
         procedure Leak_Call is
         begin
            for Id in Get_Objects'Range loop
               null;
            end loop;
         end Leak_Call;
      
         procedure SS_Info is new System.Secondary_Stack.SS_Info
      (Text_IO.Put_Line);
      
      begin
         for Iteration in 1 .. Max_Iterations loop
            Leak_Call;
         end loop;
      
         SS_Info;
      
      end Main;
      
      Should produce the following output:
      
        Secondary Stack information:
          Total size              :  10240 bytes
          Current allocated space :  0 bytes
          Number of Chunks        :  1
          Default size of Chunks  :  10240
      
      2019-09-19  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* sem_attr.adb (Resolve_Attribute): Make sure the secondary
      	stack is properly managed in the case of a 'Range attribute in a
      	loop.
      
      From-SVN: r275938
      Bob Duff committed