1. 23 May, 2018 13 commits
    • [Ada] Minor reformatting · 53b30c73
      2018-05-23  Piotr Trojanek  <trojanek@adacore.com>
      
      gcc/ada/
      
      	* einfo.ads: Minor reformatting.
      
      From-SVN: r260577
      Piotr Trojanek committed
    • [Ada] Compiler fails to reject illegal store of anonymous_access_to_subprogram · 728fedc2
      GNAT properly rejects an attempt to assign an access_to_subprogram formal
      to a local variable, according to accessibiiity rules. This patch forces the
      same behavior on the use of such a formal in an object declaration.
      
      Compiling store_anon.adb must yield:
      
        store_anon.adb:7:35: illegal attempt to store anonymous access to subprogram
        store_anon.adb:7:35: value has deeper accessibility than any master
         (RM 3.10.2 (13))
       store_anon.adb:7:35: use named access type for "P" instead of access parameter
      
      ----
      package Store_Anon is
         procedure Store (P : not null access procedure);
      
         procedure Invoke;
      end Store_Anon;
      ----
      package body Store_Anon is
         type P_Ptr is access procedure;
      
         Stored : P_Ptr;
      
         procedure Store (P : not null access procedure) is
            Illegal : constant P_Ptr := P;
         begin -- Store
            Stored := Illegal;
         end Store;
      
         procedure Invoke is
            -- Empty
         begin -- Invoke
            Stored.all;
         end Invoke;
      end Store_Anon;
      
      2018-05-23  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_ch3.adb (Analyze_Object_Declaration): If expression is an
      	anonymous_access_to_ subprogram formal, apply a conversion to force an
      	accsssibility check that will fail statically, enforcing 3.10.2 (13).
      
      From-SVN: r260576
      Ed Schonberg committed
    • [Ada] Turn off length expansion in CodePeer mode · 87843c83
      2018-05-23  Daniel Mercier  <mercier@adacore.com>
      
      gcc/ada/
      
      	* gnat1drv.adb: Turn off length expansion in CodePeer mode.
      
      From-SVN: r260575
      Daniel Mercier committed
    • [Ada] Build-in-place aggregates and Address clauses · 32677654
      This patch fixes a bug in which if a limited volatile variable with
      an Address aspect is initialized with a build-in-place aggregate
      containing build-in-place function calls, the compiler can crash.
      
      2018-05-23  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* freeze.adb: (Check_Address_Clause): Deal with build-in-place
      	aggregates in addition to build-in-place calls.
      
      gcc/testsuite/
      
      	* gnat.dg/addr10.adb: New testcase.
      
      From-SVN: r260574
      Bob Duff committed
    • [Ada] Minor reformatting · 95872381
      2018-05-23  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* einfo.ads: Minor reformatting.
      	* sem_ch3.adb: Likewise.
      	* sinfo.ads: Likewise.
      
      From-SVN: r260573
      Bob Duff committed
    • [Ada] Initialize_Scalars optimization causes spurious runtime check failure · 40016fa7
      This patch suppresses the optimization of scalar arrays when pragma
      Initialize_Scalars is in effect if the component type is subject to
      predicates. Since the scalar array is initialized with invalid values,
      these values may violate the predicate or a validity check within the
      predicate.
      
      ------------
      -- Source --
      ------------
      
      --  gnat.adc
      
      pragma Initialize_Scalars;
      
      --  types.ads
      
      with System; use System;
      
      package Types is
         type Byte is mod System.Storage_Unit;
      
         subtype Inter_Byte is Byte;
      
         function Always_OK (B : Inter_Byte) return Boolean is (True);
         function Is_OK     (B : Inter_Byte) return Boolean is (Always_OK (B));
      
         subtype Final_Byte is Byte with Predicate => Is_OK (Final_Byte);
      
         type Bytes is array (1 .. 5) of Final_Byte;
      
         Obj : Bytes;
      end Types;
      
      --  main.adb
      
      with Types; use Types;
      
      procedure Main is begin null; end Main;
      
      -----------------
      -- Compilation --
      -----------------
      
      $ gnatmake -q -gnata -gnatVa main.adb
      $ ./main
      
      2018-05-23  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* exp_ch3.adb (Default_Initialize_Object): Do not optimize scalar array
      	initialization when the component type has predicates.
      	* exp_ch4.adb (Expand_N_Allocator): Do not optimize scalar array
      	allocation when the component type has predicates.
      
      From-SVN: r260572
      Hristian Kirtchev committed
    • [Ada] Minor reformatting · 3d581777
      2018-05-23  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* einfo.adb, exp_disp.adb, sem_ch3.adb, sem_ch6.adb, sem_prag.adb:
      	Minor reformatting.
      
      From-SVN: r260571
      Hristian Kirtchev committed
    • re PR middle-end/85874 (gcc points to wrong location when displaying warning for… · 72cfbeae
      re PR middle-end/85874 (gcc points to wrong location when displaying warning for strict overflow warning)
      
      2018-05-23  Richard Biener  <rguenther@suse.de>
      
      	PR middle-end/85874
      	* tree-data-ref.c (create_runtime_alias_checks): Defer
      	and ignore overflow warnings.
      
      	* gcc.dg/Wstrict-overflow-27.c: New testcase.
      
      From-SVN: r260569
      Richard Biener committed
    • re PR tree-optimization/85822 (Maybe wrong code in VRP since r249150) · ad4f3f5d
      PR tree-optimization/85822
      
      From-SVN: r260566
      Yury Gribov committed
    • tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via… · b72feab8
      tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via native_interpret_expr.
      
      2018-05-23  Richard Biener  <rguenther@suse.de>
      
      	* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary
      	memset constants via native_interpret_expr.
      
      	* gcc.dg/tree-ssa/ssa-fre-65.c: New testcase.
      
      From-SVN: r260565
      Richard Biener committed
    • PR c++/81420 - not extending temporary lifetime. · 3423a64d
      	* call.c (extend_ref_init_temps_1): Handle ARRAY_REF.
      	* class.c (build_base_path): Avoid redundant move of an rvalue.
      
      From-SVN: r260563
      Jason Merrill committed
    • PR c++/85866 - error with .* in default template arg. · 0d2e69cb
      	* pt.c (tsubst_copy_and_build): Handle partial instantiation.
      
      From-SVN: r260562
      Jason Merrill committed
    • Daily bump. · 72082018
      From-SVN: r260561
      GCC Administrator committed
  2. 22 May, 2018 27 commits
    • re PR fortran/85841 ([F2018] reject deleted features) · 872b6afd
      2018-05-22  Janus Weil  <janus@gcc.gnu.org>
      
      	PR fortran/85841
      	* gfortran.dg/pr30667.f: Add option "-std=legacy".
      
      From-SVN: r260555
      Janus Weil committed
    • PR middle-end/85359 - duplicate -Wstringop-overflow for a strcmp call with a nonstring pointer · 36537a1c
      gcc/ChangeLog:
      
      	PR middle-end/85359
      	* builtins.c (expand_builtin_strcpy): Call maybe_warn_nonstring_arg
      	only when expasion succeeds.
      	(expand_builtin_strcmp): Same.
      	(expand_builtin_strncmp): Same.
      
      gcc/testsuite/ChangeLog:
      
      	PR middle-end/85359
      	* gcc.dg/attr-nonstring.c: New test.
      
      From-SVN: r260550
      Martin Sebor committed
    • Don't mark IFUNC resolver as only called directly · aab778d3
      Since IFUNC resolver is called indirectly, don't mark IFUNC resolver as
      only called directly.  This patch adds ifunc_resolver to cgraph_node,
      sets ifunc_resolver for ifunc attribute and checks ifunc_resolver
      instead of looking up ifunc attribute.
      
      gcc/
      
      	PR target/85345
      	* cgraph.h (cgraph_node::create): Set ifunc_resolver for ifunc
      	attribute.
      	(cgraph_node::create_alias): Likewise.
      	(cgraph_node::get_availability): Check ifunc_resolver instead
      	of looking up ifunc attribute.
      	* cgraphunit.c (maybe_diag_incompatible_alias): Likewise.
      	* varasm.c (do_assemble_alias): Likewise.
      	(assemble_alias): Likewise.
      	(default_binds_local_p_3): Likewise.
      	* cgraph.h (cgraph_node): Add ifunc_resolver.
      	(cgraph_node::only_called_directly_or_aliased_p): Return false
      	for IFUNC resolver.
      	* lto-cgraph.c (input_node): Set ifunc_resolver for ifunc
      	attribute.
      	* symtab.c (symtab_node::verify_base): Verify that ifunc_resolver
      	is equivalent to lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)).
      	(symtab_node::binds_to_current_def_p): Check ifunc_resolver
      	instead of looking up ifunc attribute.
      
      gcc/testsuite/
      
      	PR target/85345
      	* gcc.target/i386/pr85345.c: New test.
      
      From-SVN: r260547
      H.J. Lu committed
    • [AArch64] Recognize a missed usage of a sbfiz instruction · 58c2ad42
      A customer reported the following missed opportunities to combine a couple
      instructions into a sbfiz.
      
      int sbfiz32 (int x)
      {
        return x << 29 >> 10;
      }
      
      long sbfiz64 (long x)
      {
        return x << 58 >> 20;
      }
      
      This gets converted to the following pattern:
      
      (set (reg:SI 98)
          (ashift:SI (sign_extend:SI (reg:HI 0 x0 [ xD.3334 ]))
              (const_int 6 [0x6])))
      
      Currently, gcc generates the following:
      
      sbfiz32:
        lsl x0, x0, 29
        asr x0, x0, 10
        ret
      
      sbfiz64:
        lsl x0, x0, 58
        asr x0, x0, 20
        ret
      
      It could generate this instead:
      
      sbfiz32:
        sbfiz   w0, w0, 19, 3
        ret
      
      sbfiz64::
        sbfiz   x0, x0, 38, 6
        ret
      
      The unsigned versions already generate ubfiz for the same code, so the lack of
      a sbfiz pattern may have been an oversight.
      
      This particular sbfiz pattern shows up in both CPU2006 (~ 80 hits) and
      CPU2017 (~ 280 hits). It's not a lot, but seems beneficial in any case. No
      significant performance differences, probably due to the small number of
      occurrences or cases outside hot areas.
      
      gcc/ChangeLog:
      
      2018-05-22  Luis Machado  <luis.machado@linaro.org>
      
      	gcc/
      	* config/aarch64/aarch64.md (*ashift<mode>_extv_bfiz): New pattern.
      
      gcc/testsuite/ChangeLog:
      
      2018-05-22  Luis Machado  <luis.machado@linaro.org>
      
      	gcc/testsuite/
      	* gcc.target/aarch64/lsl_asr_sbfiz.c: New test.
      
      From-SVN: r260546
      Luis Machado committed
    • re PR fortran/85841 ([F2018] reject deleted features) · 927a0091
      2018-05-22  Janus Weil  <janus@gcc.gnu.org>
      
      	PR fortran/85841
      	* gfortran.dg/gomp/appendix-a/a.6.1.f90: Replace dg-options by
      	dg-additional-options.
      	* gfortran.dg/graphite/block-2.f: Ditto.
      	* gfortran.dg/graphite/id-19.f: Ditto.
      	* gfortran.dg/vect/Ofast-pr50414.f90: Ditto.
      	* gfortran.dg/vect/cost-model-pr34445a.f: Ditto.
      	* gfortran.dg/vect/pr52580.f: Ditto.
      
      From-SVN: r260544
      Janus Weil committed
    • Fix typo in a comment. · 39c71bc3
      From-SVN: r260543
      Martin Sebor committed
    • PR c/85623 - strncmp() warns about attribute 'nonstring' incorrectly in -Wstringop-overflow · d677a8b6
      gcc/ChangeLog:
      
      	PR c/85623
      	* calls.c (maybe_warn_nonstring_arg): Use string length to set
      	or ajust the presumed bound on an operation to avoid unnecessary
      	warnings.
      
      gcc/testsuite/ChangeLog:
      
      	PR c/85623
      	* c-c++-common/attr-nonstring-3.c: Adjust.
      	* c-c++-common/attr-nonstring-4.c: Adjust.
      	* c-c++-common/attr-nonstring-6.c: New test.
      
      From-SVN: r260541
      Martin Sebor committed
    • [AArch64, patch] Refactor of aarch64-ldpstp · 9b56ec11
      This patch removes a lot of duplicated code in aarch64-ldpstp.md.
      
      The patterns that did not previously generate a base register now
      do not check for aarch64_mem_pair_operand in the pattern. This has
      been extracted to a check in aarch64_operands_ok_for_ldpstp.
      
      All patterns in the file used to have explicit switching code to
      swap loads and stores that were in the wrong order.
      
      This has been extracted into aarch64_operands_ok_for_ldpstp
      as a final operation after all the checks have been performed. 
      
      2018-05-22  Jackson Woodruff  <jackson.woodruff@arm.com>
                  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
      
      	* config/aarch64/aarch64-ldpstp.md: Replace uses of
      	aarch64_mem_pair_operand with memory_operand and delete operand swapping
      	code.
      	* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
      	Add check for legitimate_address.
      	(aarch64_gen_adjusted_ldpstp): Swap operands where appropriate.
      	(aarch64_swap_ldrstr_operands): New.
      	* config/aarch64/aarch64-protos.h (aarch64_swap_ldrstr_operands):
      	Define prototype.
      
      Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
      
      From-SVN: r260539
      Jackson Woodruff committed
    • [AArch64] Merge stores of D-register values with different modes · dfe1da23
      This patch merges loads and stores from D-registers that are of different modes.
      
      Code like this:
      
          typedef int __attribute__((vector_size(8))) vec;
          struct pair
          {
            vec v;
            double d;
          }
      
      Now generates a store pair instruction:
      
          void
          assign (struct pair *p, vec v)
          {
            p->v = v;
            p->d = 1.0;
          }
      
      Whereas previously it generated two `str` instructions.
      
      This patch also merges storing of double zero values with
      long integer values:
      
          struct pair
          {
            long long l;
            double d;
          }
      
          void
          foo (struct pair *p)
          {
            p->l = 10;
            p->d = 0.0;
          }
      
      Now generates a single store pair instruction rather than two `str` instructions.
      
      The patch basically generalises the mode iterators on the patterns in aarch64.md
      and the peepholes in aarch64-ldpstp.md to take all combinations of pairs of modes
      so, while it may be a large-ish patch, it does fairly mechanical stuff.
      
      2018-05-22  Jackson Woodruff  <jackson.woodruff@arm.com>
                  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
      
      	* config/aarch64/aarch64.md: New patterns to generate stp
      	and ldp.
      	(store_pair_sw, store_pair_dw): New patterns to generate stp for
      	single words and double words.
      	(load_pair_sw, load_pair_dw): Likewise.
      	(store_pair_sf, store_pair_df, store_pair_si, store_pair_di):
      	Delete.
      	(load_pair_sf, load_pair_df, load_pair_si, load_pair_di):
      	Delete.
      	* config/aarch64/aarch64-ldpstp.md: Modify peephole
      	for different mode ldpstp and add peephole for merged zero stores.
      	Likewise for loads.
      	* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
      	Add size check.
      	(aarch64_gen_store_pair): Rename calls to match new patterns.
      	(aarch64_gen_load_pair): Rename calls to match new patterns.
      	* config/aarch64/aarch64-simd.md (load_pair<mode>): Rename to...
      	(load_pair<DREG:mode><DREG2:mode>): ... This.
      	(store_pair<mode>): Rename to...
      	(vec_store_pair<DREG:mode><DREG2:mode>): ... This.
      	* config/aarch64/iterators.md (DREG, DREG2, DX2, SX, SX2, DSX):
      	New mode iterators.
      	(V_INT_EQUIV): Handle SImode.
      	* config/aarch64/predicates.md (aarch64_reg_zero_or_fp_zero):
      	New predicate.
      
      	* gcc.target/aarch64/ldp_stp_6.c: New.
      	* gcc.target/aarch64/ldp_stp_7.c: New.
      	* gcc.target/aarch64/ldp_stp_8.c: New.
      
      Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
      
      From-SVN: r260538
      Jackson Woodruff committed
    • PR tree-optimization/85826 - ICE in gimple-ssa-warn-restruct on · 9f855c10
      PR tree-optimization/85826 - ICE in gimple-ssa-warn-restruct on
         a variable-length struct
      
      gcc/ChangeLog:
      
      	PR tree-optimization/85826
      	* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Avoid
      	assuming that a DECL necesarily has a constant size.
      
      gcc/testsuite/ChangeLog:
      
      	PR tree-optimization/85826
      	* gcc.dg/Wrestrict-17.c: New test.
      
      From-SVN: r260537
      Martin Sebor committed
    • pr85862.c: Rename to... · f141b40a
      2018-05-22  Richard Sandiford  <richard.sandiford@linaro.org>
      
      gcc/testsuite/
      	* gcc.dg/torture/pr85862.c: Rename to...
      	* gcc.dg/torture/pr85852.c: ...this.
      
      From-SVN: r260536
      Richard Sandiford committed
    • [Ada] Missing warning for unreferenced formals in expression functions · 3f89eb7f
      This patch fixes an issue whereby the compiler failed to properly warn against
      unreferenced formal parameters when analyzing expression functions.
      
      2018-05-22  Justin Squirek  <squirek@adacore.com>
      
      gcc/ada/
      
      	* sem_ch6.adb (Analyze_Expression_Function): Propagate flags from the
      	original function spec into the generated function spec due to
      	expansion of expression functions during analysis.
      	(Analyze_Subprogram_Body_Helper): Modify check on formal parameter
      	references from the body to the subprogram spec in the case of
      	expression functions because of inconsistances related to having a
      	generated body.
      	* libgnarl/s-osinte__android.ads: Flag parameters as unused.
      	* libgnarl/s-osinte__lynxos178e.ads: Likewise.
      	* libgnarl/s-osinte__qnx.adb: Likewise.
      	* libgnarl/s-osinte__qnx.ads: Likewise.
      
      gcc/testsuite/
      
      	* gnat.dg/warn14.adb: New testcase.
      
      From-SVN: r260535
      Justin Squirek committed
    • [Ada] Don't define HAVE_ADJUST_CONTEXT_FOR_RAISE on VxWorks7 for AArch64 · 143a4acd
      2018-05-22  Doug Rupp  <rupp@adacore.com>
      
      gcc/ada/
      
      	* init.c (HAVE_ADJUST_CONTEXT_FOR_RAISE): Don't define on VxWorks7 for
      	AArch64.
      
      From-SVN: r260534
      Doug Rupp committed
    • [Ada] Fix Reraise_Occurrence of Foreign_Exception · f6904af0
      In a sequence like
      
      (d)            (c)                 (b)              (a)
      c++ raises <-- Ada calls c++,  <-- c++ call Ada <-- Ada calls
      exception      others handler      and handles      c++
                     gets foreign        c++ exception
                     exception and
                     re-raises
      
      the original exception raised on the C++ world at (d) couldn't be caught
      as a regular c++ exception at (b) when the re-raise performed at (c) is
      done with an explicit call to Ada.Exceptions.Reraise_Occurrence.
      
      Indeed, the latter just re-crafted a new Ada-ish occurence and the
      nature and contents of the original exception object were lost.
      
      This patch fixes this by refining Reraise_Occurrence to be more careful
      with exceptions in the course of a propagation, just resuming propagation
      of the original object.
      
      From the set of soures below, compilation and execution with:
      
        g++ -c bd.cc && gnatmake -f -g a.adb -largs bd.o --LINK=g++ && ./a
      
      is expected to output:
      
      foreign exception caught, reraising ...
      b() caught x = 5
      
      ----
      
      // bd.cc
      
      extern "C" {
        extern void c();
      
        void b ();
        void d ();
      }
      
      void b ()
      {
        try {
          c();
        } catch (int x) {
          printf ("b() caught x = %d\n", x);
        }
      }
      
      void d ()
      {
        throw (5);
      }
      
      -- a.adb
      
      with C;
      procedure A is
         procedure B;
         pragma Import (Cpp, B);
      begin
         B;
      end;
      
      -- c.ads
      
      procedure C;
      pragma Export (C, C, "c");
      
      -- c.adb
      
      with Ada.Exceptions; use Ada.Exceptions;
      with System.Standard_Library;
      with Ada.Unchecked_Conversion;
      
      with Ada.Text_IO; use Ada.Text_IO;
      
      procedure C is
         package SSL renames System.Standard_Library;
         use type SSL.Exception_Data_Ptr;
      
         function To_Exception_Data_Ptr is new
           Ada.Unchecked_Conversion (Exception_Id, SSL.Exception_Data_Ptr);
      
         procedure D;
         pragma Import (Cpp, D);
      
         Foreign_Exception : aliased SSL.Exception_Data;
         pragma Import
           (Ada, Foreign_Exception, "system__exceptions__foreign_exception");
      begin
         D;
      exception
         when E : others =>
            if To_Exception_Data_Ptr (Exception_Identity (E))
              = Foreign_Exception'Unchecked_access
            then
               Put_Line ("foreign exception caught, reraising ...");
               Reraise_Occurrence (E);
            end if;
      end;
      
      2018-05-22  Olivier Hainque  <hainque@adacore.com>
      
      gcc/ada/
      
      	* libgnat/a-except.adb (Exception_Propagation.Propagate_Exception):
      	Expect an Exception_Occurence object, not an Access.
      	(Complete_And_Propagate_Occurrence): Adjust accordingly.
      	(Raise_From_Signal_Handler): Likewise.
      	(Reraise_Occurrence_No_Defer): If we have a Machine_Occurrence
      	available in the provided occurrence object, just re-propagate the
      	latter as a bare "raise;" would do.
      	* libgnat/a-exexpr.adb (Propagate_Exception): Adjust to spec change.
      	* libgnat/a-exstat.adb (String_To_EO): Initialize X.Machine_Occurrence
      	to null, to mark that the occurrence we're crafting from the stream
      	contents is not being propagated (yet).
      
      From-SVN: r260533
      Olivier Hainque committed
    • [Ada] Crash on partial initialization of controlled component · 02db8169
      This patch modifies the late expansion of record aggregates to ensure that the
      generated code which handles a controlled component initialized by a function
      call is inserted in line with the rest of the initialization code, rather than
      before the record aggregate. This way the function call has proper access to
      the discriminants of the object being created.
      
      2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* exp_aggr.adb (Initialize_Ctrl_Record_Component): Insert the generated
      	code for a transient component in line with the rest of the
      	initialization code, rather than before the aggregate. This ensures
      	that the component has proper visibility of the discriminants.
      
      gcc/testsuite/
      
      	* gnat.dg/controlled8.adb: New testcase.
      
      From-SVN: r260532
      Hristian Kirtchev committed
    • [Ada] Fix retrieval of number of CPUs on QNX · 9820b389
      Although the sysconf SC_NPROCESSORS_ONLN is also defined by the API, the
      only documented way to retrieve the number of CPUs is by using the syspage.
      
      This also better organise the QNX-specific macros in adaint.c
      
      2018-05-22  Jerome Lambourg  <lambourg@adacore.com>
      
      gcc/ada/
      
      	* adaint.c: Reorganize QNX-specific macros, use syspage to retreive the
      	number of CPUs.
      
      From-SVN: r260531
      Jerome Lambourg committed
    • [Ada] Fix the signal trampoline on QNX · 817659c5
      The trampoline now properly restores the link register as well as the stack
      pointer. As a minor optimisation, now only callee-saved registers are
      restored: the scratch registers don't need that.
      
      2018-05-22  Jerome Lambourg  <lambourg@adacore.com>
      
      gcc/ada/
      
      	* sigtramp-qnx.c: Properly restore link register in signal trampoline.
      
      From-SVN: r260530
      Jerome Lambourg committed
    • [Ada] In-place initialization for Initialize_Scalars · 529749b9
      This patch optimizes the initialization and allocation of scalar array objects
      when pragma Initialize_Scalars is in effect. The patch also extends the syntax
      and semantics of pragma Initialize_Scalars to allow for the specification of
      invalid values pertaining to families of scalar types. The new syntax is as
      follows:
      
         pragma Initialize_Scalars
           [ ( TYPE_VALUE_PAIR {, TYPE_VALUE_PAIR} ) ];
      
         TYPE_VALUE_PAIR ::=
           SCALAR_TYPE => static_EXPRESSION
      
         SCALAR_TYPE :=
           Short_Float
         | Float
         | Long_Float
         | Long_Long_Flat
         | Signed_8
         | Signed_16
         | Signed_32
         | Signed_64
         | Unsigned_8
         | Unsigned_16
         | Unsigned_32
         | Unsigned_64
      
      Depending on the value specified by pragma Initialize_Scalars, the backend may
      optimize the creation of the scalar array object into a fast memset.
      
      ------------
      -- Source --
      ------------
      
      --  gnat.adc
      
      pragma Initialize_Scalars
        (Short_Float     => 0.0,
         Float           => 0.0,
         Long_Float      => 0.0,
         Long_Long_Float => 0.0,
         Signed_8        => 0,
         Signed_16       => 0,
         Signed_32       => 0,
         Signed_64       => 0,
         Unsigned_8      => 0,
         Unsigned_16     => 0,
         Unsigned_32     => 0,
         Unsigned_64     => 0);
      
      --  types.ads
      
      with System;
      
      package Types is
         Max : constant := 10_000;
         subtype Big is Integer range 1 .. Max;
      
         type Byte is range 0 .. 255;
         for Byte'Size use System.Storage_Unit;
      
         type Byte_Arr_1 is array (1 .. Max) of Byte;
         type Byte_Arr_2 is array (Big) of Byte;
         type Byte_Arr_3 is array (Integer range <>) of Byte;
         type Byte_Arr_4 is array (Integer range <>,
                                   Integer range <>) of Byte;
         type Constr_Arr_1 is array (1 .. Max) of Integer;
         type Constr_Arr_2 is array (Big) of Integer;
         type Constr_Arr_3 is array (1 .. Max, 1 .. Max) of Integer;
         type Constr_Arr_4 is array (Big, Big) of Integer;
      
         type Unconstr_Arr_1 is array (Integer range <>) of Integer;
         type Unconstr_Arr_2 is array (Integer range <>,
                                       Integer range <>) of Integer;
      
         subtype Subt_Arr_1 is Unconstr_Arr_1 (1 .. Max);
         subtype Subt_Arr_2 is Unconstr_Arr_1 (Big);
         subtype Subt_Arr_3 is Unconstr_Arr_2 (1 .. Max, 1 .. Max);
         subtype Subt_Arr_4 is Unconstr_Arr_2 (Big, Big);
      
         subtype Subt_Str_1 is String (1 .. Max);
         subtype Subt_Str_2 is String (Big);
      
         type Byte_Arr_1_Ptr     is access Byte_Arr_1;
         type Byte_Arr_2_Ptr     is access Byte_Arr_2;
         type Byte_Arr_3_Ptr     is access Byte_Arr_3;
         type Byte_Arr_4_Ptr     is access Byte_Arr_4;
         type Constr_Arr_1_Ptr   is access Constr_Arr_1;
         type Constr_Arr_2_Ptr   is access Constr_Arr_2;
         type Constr_Arr_3_Ptr   is access Constr_Arr_3;
         type Constr_Arr_4_Ptr   is access Constr_Arr_4;
         type Unconstr_Arr_1_Ptr is access Unconstr_Arr_1;
         type Unconstr_Arr_2_Ptr is access Unconstr_Arr_2;
         type Subt_Arr_1_Ptr     is access Subt_Arr_1;
         type Subt_Arr_2_Ptr     is access Subt_Arr_2;
         type Subt_Arr_3_Ptr     is access Subt_Arr_3;
         type Subt_Arr_4_Ptr     is access Subt_Arr_4;
         type Str_Ptr            is access String;
         type Subt_Str_1_Ptr     is access Subt_Str_1;
         type Subt_Str_2_Ptr     is access Subt_Str_2;
      end Types;
      
      --  main.adb
      
      with Types; use Types;
      
      procedure Main is
         Byte_Arr_1_Obj     : Byte_Arr_1;
         Byte_Arr_2_Obj     : Byte_Arr_2;
         Byte_Arr_3_Obj     : Byte_Arr_3 (1 .. Max);
         Byte_Arr_4_Obj     : Byte_Arr_3 (Big);
         Byte_Arr_5_Obj     : Byte_Arr_4 (1 .. Max, 1 .. Max);
         Byte_Arr_6_Obj     : Byte_Arr_4 (Big, Big);
         Constr_Arr_1_Obj   : Constr_Arr_1;
         Constr_Arr_2_Obj   : Constr_Arr_2;
         Constr_Arr_3_Obj   : Constr_Arr_3;
         Constr_Arr_4_Obj   : Constr_Arr_4;
         Unconstr_Arr_1_Obj : Unconstr_Arr_1 (1 .. Max);
         Unconstr_Arr_2_Obj : Unconstr_Arr_1 (Big);
         Unconstr_Arr_3_Obj : Unconstr_Arr_2 (1 .. Max, 1 .. Max);
         Unconstr_Arr_4_Obj : Unconstr_Arr_2 (Big, Big);
         Subt_Arr_1_Obj     : Subt_Arr_1;
         Subt_Arr_2_Obj     : Subt_Arr_2;
         Subt_Arr_3_Obj     : Subt_Arr_3;
         Subt_Arr_4_Obj     : Subt_Arr_4;
         Str_1_Obj          : String (1 .. Max);
         Str_2_Obj          : String (Big);
         Subt_Str_1_Obj     : Subt_Str_1;
         Subt_Str_2_Obj     : Subt_Str_2;
      
         Byte_Arr_1_Ptr_Obj     : Byte_Arr_1_Ptr     := new Byte_Arr_1;
         Byte_Arr_2_Ptr_Obj     : Byte_Arr_2_Ptr     := new Byte_Arr_2;
         Byte_Arr_3_Ptr_Obj     : Byte_Arr_3_Ptr     := new Byte_Arr_3 (1 .. Max);
         Byte_Arr_4_Ptr_Obj     : Byte_Arr_3_Ptr     := new Byte_Arr_3 (Big);
         Byte_Arr_5_Ptr_Obj     : Byte_Arr_4_Ptr     :=
                                    new Byte_Arr_4 (1 .. Max, 1 .. Max);
         Byte_Arr_6_Ptr_Obj     : Byte_Arr_4_Ptr     := new Byte_Arr_4 (Big, Big);
         Constr_Arr_1_Ptr_Obj   : Constr_Arr_1_Ptr   := new Constr_Arr_1;
         Constr_Arr_2_Ptr_Obj   : Constr_Arr_2_Ptr   := new Constr_Arr_2;
         Constr_Arr_3_Ptr_Obj   : Constr_Arr_3_Ptr   := new Constr_Arr_3;
         Constr_Arr_4_Ptr_Obj   : Constr_Arr_4_Ptr   := new Constr_Arr_4;
         Unconstr_Arr_1_Ptr_Obj : Unconstr_Arr_1_Ptr :=
                                    new Unconstr_Arr_1 (1 .. Max);
         Unconstr_Arr_2_Ptr_Obj : Unconstr_Arr_1_Ptr := new Unconstr_Arr_1 (Big);
         Unconstr_Arr_3_Ptr_Obj : Unconstr_Arr_2_Ptr :=
                                    new Unconstr_Arr_2 (1 .. Max, 1 .. Max);
         Unconstr_Arr_4_Ptr_Obj : Unconstr_Arr_2_Ptr :=
                                    new Unconstr_Arr_2 (Big, Big);
         Subt_Arr_1_Ptr_Obj     : Subt_Arr_1_Ptr     := new Subt_Arr_1;
         Subt_Arr_2_Ptr_Obj     : Subt_Arr_2_Ptr     := new Subt_Arr_2;
         Subt_Arr_3_Ptr_Obj     : Subt_Arr_3_Ptr     := new Subt_Arr_3;
         Subt_Arr_4_Ptr_Obj     : Subt_Arr_4_Ptr     := new Subt_Arr_4;
         Str_Ptr_1_Obj          : Str_Ptr            := new String (1 .. Max);
         Str_Ptr_2_Obj          : Str_Ptr            := new String (Big);
         Subt_Str_1_Ptr_Obj     : Subt_Str_1_Ptr     := new Subt_Str_1;
         Subt_Str_2_Ptr_Obj     : Subt_Str_2_Ptr     := new Subt_Str_2;
      begin null; end Main;
      
      ----------------------------
      -- Compilation and output --
      ----------------------------
      
      $ gcc -c -S -gnatDG -gnatws main.adb
      $ grep -c "others => types__TbyteB!(0));" main.adb.dg
      $ grep -c "others => integer!(0));" main.adb.dg
      $ grep -c "others => character!(0));" main.adb.dg
      $ grep -c "others => types__TbyteB!(0));" main.adb.dg
      $ grep -c "memset" main.s
      8
      12
      8
      8
      44
      
      2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): Strip away any
      	conversions before extracting the value of the expression.
      	* exp_ch3.adb (Default_Initialize_Object): Optimize the default
      	initialization of an array of scalars.
      	(Get_Simple_Init_Val): Add processing for array types. Remove the
      	processing of strings because this case is already handled by the array
      	case.
      	(Needs_Simple_Initialization): Moved to Sem_Util.
      	(Simple_Init_Array_Type): New routine.
      	(Simple_Init_Initialize_Scalars_Type): Reimplemented to use the new
      	facilities from Sem_Util.
      	(Simple_Initialization_OK): New routine.
      	* exp_ch3.ads (Needs_Simple_Initialization): Moved to Sem_Util.
      	* exp_ch4.adb (Expand_N_Allocator): Optimize the default allocation of
      	an array of scalars.
      	* sem_prag.adb (Analyze_Float_Value): New routine.
      	(Analyze_Integer_Value): New routine.
      	(Analyze_Pragma): Reimplement the analysis of pragma Initialize_Scalars
      	to handled the extended form of the pragma.
      	(Analyze_Type_Value_Pair): New routine.
      	* sem_util.adb: Add invalid value-related data structures.
      	(Examine_Array_Bounds): New routine.
      	(Has_Static_Array_Bounds): Reimplemented.
      	(Has_Static_Non_Empty_Array_Bounds): New routine.
      	(Invalid_Scalar_Value): New routine.
      	(Needs_Simple_Initialization): Moved from Exp_Ch3.
      	(Set_Invalid_Scalar_Value): New routines.
      	* sem_util.ads (Has_Static_Non_Empty_Array_Bounds): New routine.
      	(Invalid_Scalar_Value): New routine.
      	(Needs_Simple_Initialization): Moved from Exp_Ch3.
      	(Set_Invalid_Scalar_Value): New routines.
      	* snames.ads-tmpl: Add names for the salar type families used by pragma
      	Initialize_Scalars.
      
      From-SVN: r260529
      Hristian Kirtchev committed
    • [Ada] Disable name generation for External_Tag and Expanded_Name · b00baef5
      In order to avoid exposing internal names of tagged types in the
      binary code generated by the compiler this enhancement facilitates
      initializes the External_Tag of a tagged type with an empty string
      when pragma No_Tagged_Streams is applicable to the tagged type, and
      facilitates initializes its Expanded_Name with an empty string when
      pragma Discard_Names is applicable to the tagged type.
      
      This enhancement can be verified by means of the following small
      test:
      
      package Library_Level_Test is
         type Typ_01 is tagged null record;    --  Case 1: No pragmas
      
         type Typ_02 is tagged null record;    --  Case 2: Discard_Names
         pragma Discard_Names (Typ_02);
      
         pragma No_Tagged_Streams;
         type Typ_03 is tagged null record;    --  Case 3: No_Tagged_Streams
      
         type Typ_04 is tagged null record;    --  Case 4: Both pragmas
         pragma Discard_Names (Typ_04);
      end;
      
      Commands:
        gcc -c -gnatD library_level_test.ads
        grep "\.TYP_" library_level_test.ads.dg
      
      Output:
           "LIBRARY_LEVEL_TEST.TYP_01["00"]";
           "LIBRARY_LEVEL_TEST.TYP_02["00"]";
           "LIBRARY_LEVEL_TEST.TYP_03["00"]";
      
      2018-05-22  Javier Miranda  <miranda@adacore.com>
      
      gcc/ada/
      
      	* exp_disp.adb (Make_DT): Initialize the External_Tag with an empty
      	string when pragma No_Tagged_Streams is applicable to the tagged type,
      	and initialize the Expanded_Name with an empty string when pragma
      	Discard_Names is applicable to the tagged type.
      
      From-SVN: r260528
      Javier Miranda committed
    • [Ada] Better error message on illegal 'Access on formal subprogram · 90fa8613
      This patch improves on the error message for an attempt to apply 'Access
      to a formal subprogram. It also applies the check to a renaming of a formal
      subprogram.
      
      Compiling p.adb must yield:
      
      p.adb:15:18: not subtype conformant with declaration at line 2
      p.adb:15:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
      p.adb:16:18: not subtype conformant with declaration at line 2
      p.adb:16:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
      
      ----
      package body P is
        procedure Non_Generic (P : access procedure (I : Integer)) is
        begin
          P.all (5);
        end Non_Generic;
      
        procedure G is
          procedure Local (I : Integer) is
          begin
            Action (I);
          end;
          procedure Local_Action (I : Integer) renames Action;
        begin
          Non_Generic (Local'access);
          Non_Generic (Local_Action'access);
          Non_Generic (Action'access);
          -- p.adb:15:18: not subtype conformant with declaration at line 2
          -- p.adb:15:18: formal subprograms not allowed
        end G;
      end P;
      ----
      package P is
        generic
          with procedure Action (I : Integer);
        procedure G;
      end P;
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_ch6.adb (Check_Conformance): Add RM reference for rule that a
      	formal subprogram is never subtype conformqnt, and thus cannot be the
      	prefix of 'Access.  Reject as well the attribute when applied to a
      	renaming of a formal subprogram.
      
      From-SVN: r260527
      Ed Schonberg committed
    • [Ada] In-place initialization for Initialize_Scalars · 3b26fe82
      This patch cleans up the implementation of routine Get_Simple_Init_Val. It also
      eliminates potentially large and unnecessary tree replications in the context
      of object default initialization.
      
      No change in behavior, no test needed.
      
      2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* exp_ch3.adb (Build_Array_Init_Proc): Update the call to
      	Needs_Simple_Initialization.
      	(Build_Init_Statements): Update the call to Get_Simple_Init_Val.
      	(Check_Subtype_Bounds): Renamed to Extract_Subtype_Bounds. Update the
      	profile and comment on usage.
      	(Default_Initialize_Object): Do not use New_Copy_Tree to set the proper
      	Sloc of a value obtained from aspect Default_Value because this could
      	potentially replicate large trees. The proper Sloc is now set in
      	Get_Simple_Init_Val.
      	(Get_Simple_Init_Val): Reorganized by breaking the various cases into
      	separate routines. Eliminate the use of global variables.
      	(Init_Component): Update the call to Get_Simple_Init_Val.
      	(Needs_Simple_Initialization): Update the parameter profile and all
      	uses of T.
      	(Simple_Init_Defaulted_Type): Copy the value of aspect Default_Value
      	and set the proper Sloc.
      	* exp_ch3.ads (Get_Simple_Init_Val): Update the parameter profile and
      	comment on usage.
      	(Needs_Simple_Initialization): Update the parameter profile.
      
      From-SVN: r260526
      Hristian Kirtchev committed
    • [Ada] Fix compiler abort on invalid discriminant constraint · 59ec5d9b
      This patch fixes a compiler abort on a discriminant constraint when the
      constraint is a subtype indication.
      
      2018-05-22  Patrick Bernardi  <bernardi@adacore.com>
      
      gcc/ada/
      
      	* sem_ch3.adb (Build_Discriminant_Constraints): Raise an error if the
      	user tries to use a subtype indication as a discriminant constraint.
      
      gcc/testsuite/
      
      	* gnat.dg/discr50.adb: New testcase.
      
      From-SVN: r260525
      Patrick Bernardi committed
    • [Ada] Ada2020: Reduction expressions · 801b4022
      This patch dismantles the prototype implementation of the first proposal
      for Reduction expressions, one of the important potentially parallel
      constructs for Ada2020. The ARG is going in a different direction with
      a simpler syntax.
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* exp_ch4.ads, exp_ch4.adb, exp_util.adb, expander.adb: Remove mention
      	of N_Reduction_Expression and N_Reduction_Expression_Parameter.
      	* par-ch4.adb: Remove parsing routines for reduction expressions.
      	* sem.adb, sinfo.ads, sinfo.adb, sem_ch4.ads, sem_ch4.adb, sem_res.adb,
      	sem_spark.adb, sprint.adb: Remove analysis routines for reduction
      	expressions.
      
      From-SVN: r260524
      Ed Schonberg committed
    • [Ada] Do not emit error in Relaxed_RM_Semantics mode · 208ebca9
      2018-05-22  Arnaud Charlet  <charlet@adacore.com>
      
      gcc/ada/
      
      	* sem_ch8.adb (Check_Frozen_Renaming): Do not emit error in
      	Relaxed_RM_Semantics mode.
      
      From-SVN: r260523
      Arnaud Charlet committed
    • [Ada] Take into account N_Generic_Package_Renaming_Declaration · b4914af8
      2018-05-22  Arnaud Charlet  <charlet@adacore.com>
      
      gcc/ada/
      
      	* comperr.adb (Delete_SCIL_Files): Take into account
      	N_Generic_Package_Renaming_Declaration.
      
      From-SVN: r260522
      Arnaud Charlet committed
    • [Ada] Crash with private types and renamed discriminants · fbb53995
      This patch fixes a compiler abort on an object declaration whose type
      is a private type with discriminants, and whose full view is a derived
      type that renames some discriminant of its parent.
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_ch3.adb (Search_Derivation_Levels): Whenever a parent type is
      	private, use the full view if available, because it may include renamed
      	discriminants whose values are stored in the corresponding
      	Stored_Constraint.
      
      gcc/testsuite/
      
      	* gnat.dg/discr49.adb, gnat.dg/discr49_rec1.adb,
      	gnat.dg/discr49_rec1.ads, gnat.dg/discr49_rec2.adb,
      	gnat.dg/discr49_rec2.ads: New testcase.
      
      From-SVN: r260521
      Ed Schonberg committed
    • [Ada] Spurious visibility error in a nested instance with formal package · 651822ae
      This patch fixes a spurious visibility error with a nested instance of a
      generic unit with a formal package, when the actual for it is a formal
      package PA of an enclosing generic, and there are subsequent uses of the
      formals of PA in that generic unit.
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* einfo.ads, einfo.adb: New attribute Hidden_In_Formal_Instance,
      	defined on packages that are actuals for formal packages, in order to
      	set/reset the visibility of the formals of a formal package with given
      	actuals, when there are subsequent uses of those formals in the
      	enclosing generic, as required by RN 12.7 (10).
      	* atree.ads, atree.adb: Add operations for Elist30.
      	* atree.h: Add Elist30.
      	* sem_ch12.adb (Analyze_Formal_Package_Instantiation): Collect formals
      	that are not defaulted and are thus not visible within the current
      	instance.
      	(Check_Formal_Packages): Reset visibility of formals of a formal
      	package that are not defaulted, on exit from current instance.
      
      gcc/testsuite/
      
      	* gnat.dg/gen_formal_pkg.adb, gnat.dg/gen_formal_pkg_a.ads,
      	gnat.dg/gen_formal_pkg_b.ads, gnat.dg/gen_formal_pkg_w.ads: New
      	testcase.
      
      From-SVN: r260520
      Ed Schonberg committed