1. 23 May, 2018 7 commits
  2. 22 May, 2018 33 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
    • [Ada] Prohibit output dependency items on functions · 41ff70d9
      This patch modifies the analysis of pragma [Refined_]Depends to emit an error
      when the pragma is asspciated with a [generic] function, and one of its clauses
      contains a non-null, non-'Result output item.
      
      ------------
      -- Source --
      ------------
      
      --  pack.ads
      
      package Pack with SPARK_Mode is
         Obj_1 : Integer := 1;
         Obj_2 : Integer := 2;
      
         function Func_1 return Integer
           with Global => (In_Out => Obj_1);                               --  Error
      
         function Func_2 return Integer
           with Global => (Output => Obj_1);                               --  Error
      
         function Func_3 return Integer
           with Depends => (Func_3'Result => Obj_1,                        --  OK
                            Obj_1         => Obj_1);                       --  Error
      
         function Func_4 return Integer
           with Depends => (Func_4'Result => Obj_1,                        --  OK
                            null          => Obj_2);                       --  OK
      end Pack;
      
      ----------------------------
      -- Compilation and output --
      ----------------------------
      
      $ gcc -c pack.ads
      pack.ads:6:22: global mode "In_Out" is not applicable to functions
      pack.ads:9:22: global mode "Output" is not applicable to functions
      pack.ads:13:23: output item is not applicable to function
      
      2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Analyze_Input_Output): Emit an error when a non-null,
      	non-'Result output appears in the output list of a function.
      
      From-SVN: r260519
      Hristian Kirtchev committed
    • [Ada] Allow attribute 'Valid_Scalars on private types · f16cb8df
      This patch modifies the analysis and expansion of attribute 'Valid_Scalars. It
      is now possible to specify the attribute on a prefix of an untagged private
      type.
      
      ------------
      -- Source --
      ------------
      
      --  gnat.adc
      
      pragma Initialize_Scalars;
      
      --  pack1.ads
      
      package Pack1 is
         type Acc_1  is private;
         type Acc_2  is private;
         type Arr_1  is private;
         type Arr_2  is private;
         type Bool_1 is private;
         type Cmpx_1 is private;
         type Cmpx_2 is private;
         type Enum_1 is private;
         type Enum_2 is private;
         type Fix_1  is private;
         type Fix_2  is private;
         type Flt_1  is private;
         type Flt_2  is private;
         type Modl_1 is private;
         type Prot_1 is limited private;
         type Prot_2 is limited private;
         type Prot_3 (Discr : Boolean) is limited private;
         type Rec_1  is private;
         type Rec_2  is private;
         type Rec_3  is private;
         type Rec_4 (Discr : Boolean) is private;
         type Rec_5 (Discr_1 : Boolean; Discr_2 : Boolean) is private;
         type Sign_1 is private;
         type Tag_1  is tagged private;
         type Task_1 is limited private;
         type Task_2 (Discr : Boolean) is limited private;
      
         type Prec_Arr_1 is private;
         type Prec_Arr_2 is private;
         type Prec_Arr_3 is private;
         type Prec_Arr_4 is private;
         type Prec_Arr_5 is private;
      
         type Prec_Rec_1 is private;
         type Prec_Rec_2 (Discr : Boolean) is private;
         type Prec_Rec_3 (Discr_1 : Boolean; Discr_2 : Boolean) is private;
         type Prec_Rec_4 is private;
         type Prec_Rec_5 is private;
         type Prec_Rec_6 is private;
         type Prec_Rec_7 is private;
         type Prec_Rec_8 is private;
         type Prec_Rec_9 is private;
      
      private
         type Acc_1 is access Boolean;
         type Acc_2 is access procedure;
         type Arr_1  is array (1 .. 10) of Boolean;
         type Arr_2  is array (1 .. 3) of access Boolean;
         type Bool_1 is new Boolean;
         type Cmpx_1 is array (1 .. 5) of Rec_5 (True, True);
         type Cmpx_2 is record
            Comp_1 : Cmpx_1;
            Comp_2 : Rec_4 (True);
         end record;
         type Enum_1 is (One, Two, Three);
         type Enum_2 is ('f', 'o', 'u', 'r');
         type Fix_1  is delta 0.5 range 0.0 .. 10.0;
         type Fix_2  is delta 0.1 digits 15;
         type Flt_1  is digits 8;
         type Flt_2  is digits 10 range -1.0 .. 1.0;
         type Modl_1 is mod 8;
         protected type Prot_1 is
         end Prot_1;
         protected type Prot_2 is
         private
            Comp_1 : Boolean;
            Comp_2 : Boolean;
         end Prot_2;
         protected type Prot_3 (Discr : Boolean) is
         private
            Comp_1 : Boolean;
            Comp_2 : Rec_4 (Discr);
         end Prot_3;
         type Rec_1  is null record;
         type Rec_2  is record
            null;
         end record;
         type Rec_3  is record
            Comp_1 : Boolean;
            Comp_2 : Boolean;
         end record;
         type Rec_4 (Discr : Boolean) is record
            case Discr is
               when True =>
                  Comp_1 : Boolean;
                  Comp_2 : Boolean;
               when False =>
                  Comp_3 : access Boolean;
            end case;
         end record;
         type Rec_5 (Discr_1 : Boolean; Discr_2 : Boolean) is record
            Comp_1 : Boolean;
            Comp_2 : Boolean;
            case Discr_1 is
               when True =>
                  case Discr_2 is
                     when True =>
                        Comp_3 : Boolean;
                        Comp_4 : Boolean;
                     when False =>
                        null;
                  end case;
               when False =>
                  null;
            end case;
         end record;
         type Sign_1 is range 1 .. 10;
         type Tag_1 is tagged null record;
         task type Task_1;
         task type Task_2 (Discr : Boolean);
      
         type Prec_Arr_1 is array (1 .. 2) of Boolean;
         type Prec_Arr_2 is array (1 .. 2, 1 .. 2) of Boolean;
         type Prec_Arr_3 is array (1 .. 2) of Prec_Rec_1;
         type Prec_Arr_4 is array (1 .. 2) of Prec_Rec_2 (True);
         type Prec_Arr_5 is array (1 .. 2) of Prec_Rec_3 (True, True);
      
         type Prec_Rec_1 is record
            Comp_1 : Boolean;
         end record;
      
         type Prec_Rec_2 (Discr : Boolean) is record
            case Discr is
               when True =>
                  Comp_1 : Boolean;
               when others =>
                  Comp_2 : Boolean;
            end case;
         end record;
      
         type Prec_Rec_3 (Discr_1 : Boolean; Discr_2 : Boolean) is record
            case Discr_1 is
               when True =>
                  case Discr_2 is
                     when True =>
                        Comp_1 : Boolean;
                     when others =>
                        Comp_2 : Boolean;
                  end case;
               when False =>
                  case Discr_2 is
                     when True =>
                        Comp_3 : Boolean;
                     when others =>
                        Comp_4 : Boolean;
                  end case;
            end case;
         end record;
      
         type Prec_Rec_4 is record
            Comp : Prec_Arr_1;
         end record;
      
         type Prec_Rec_5 is record
            Comp : Prec_Arr_4;
         end record;
      
         type Prec_Rec_6 is record
            Comp : Prec_Arr_5;
         end record;
      
         type Prec_Rec_7 is record
            Comp : Prec_Rec_4;
         end record;
      
         type Prec_Rec_8 is record
            Comp : Prec_Rec_5;
         end record;
      
         type Prec_Rec_9 is record
            Comp : Prec_Rec_6;
         end record;
      end Pack1;
      
      --  pack1.adb
      
      package body Pack1 is
         protected body Prot_1 is end Prot_1;
         protected body Prot_2 is end Prot_2;
         protected body Prot_3 is end Prot_3;
      
         task body Task_1 is begin null; end Task_1;
         task body Task_2 is begin null; end Task_2;
      end Pack1;
      
      --  pack2.ads
      
      with Pack1; use Pack1;
      
      package Pack2 is
         type Acc_3  is private;
         type Acc_4  is private;
         type Arr_3  is private;
         type Arr_4  is private;
         type Bool_2 is private;
         type Cmpx_3 is private;
         type Cmpx_4 is private;
         type Enum_3 is private;
         type Enum_4 is private;
         type Fix_3  is private;
         type Fix_4  is private;
         type Flt_3  is private;
         type Flt_4  is private;
         type Modl_2 is private;
         type Prot_4 is limited private;
         type Prot_5 is limited private;
         type Prot_6 is limited private;
         type Rec_6  is private;
         type Rec_7  is private;
         type Rec_8  is private;
         type Rec_9  (Discr : Boolean) is private;
         type Rec_10 (Discr : Boolean) is private;
         type Sign_2 is private;
         type Task_3 is limited private;
      
      private
         type Acc_3  is new Acc_1;
         type Acc_4  is new Acc_2;
         type Arr_3  is new Arr_1;
         type Arr_4  is new Arr_2;
         type Bool_2 is new Bool_1;
         type Cmpx_3 is new Cmpx_1;
         type Cmpx_4 is new Cmpx_2;
         type Enum_3 is new Enum_1;
         type Enum_4 is new Enum_2;
         type Fix_3  is new Fix_1;
         type Fix_4  is new Fix_2;
         type Flt_3  is new Flt_1;
         type Flt_4  is new Flt_2;
         type Modl_2 is new Modl_1;
         type Prot_4 is new Prot_1;
         type Prot_5 is new Prot_2;
         type Prot_6 is new Prot_3 (True);
         type Rec_6  is new Rec_1;
         type Rec_7  is new Rec_2;
         type Rec_8  is new Rec_3;
         type Rec_9  (Discr : Boolean) is
           new Rec_4 (Discr => Discr);
         type Rec_10 (Discr : Boolean) is
           new Rec_5 (Discr_1 => Discr, Discr_2 => True);
         type Sign_2 is new Sign_1;
         type Task_3 is new Task_1;
      end Pack2;
      
      --  main.adb
      
      with Ada.Text_IO; use Ada.Text_IO;
      
      with Pack1; use Pack1;
      with Pack2; use Pack2;
      
      procedure Main is
         procedure Check
           (Actual : Boolean;
            Valid  : Boolean;
            Test   : String)
         is
         begin
            if Actual /= Valid then
               Put_Line ("ERROR " & Test);
               Put_Line ("  valid : " & Valid'Img);
               Put_Line ("  actual: " & Actual'Img);
            end if;
         end Check;
      
         Valid     : constant Boolean := True;
         Not_Valid : constant Boolean := not Valid;
      
         pragma Warnings (Off);
         Acc_1_Obj  : Acc_1;
         Acc_2_Obj  : Acc_2;
         Acc_3_Obj  : Acc_3;
         Acc_4_Obj  : Acc_4;
         Arr_1_Obj  : Arr_1;
         Arr_2_Obj  : Arr_2;
         Arr_3_Obj  : Arr_3;
         Arr_4_Obj  : Arr_4;
         Bool_1_Obj : Bool_1;
         Bool_2_Obj : Bool_2;
         Cmpx_1_Obj : Cmpx_1;
         Cmpx_2_Obj : Cmpx_2;
         Cmpx_3_Obj : Cmpx_3;
         Cmpx_4_Obj : Cmpx_4;
         Enum_1_Obj : Enum_1;
         Enum_2_Obj : Enum_2;
         Enum_3_Obj : Enum_3;
         Enum_4_Obj : Enum_4;
         Fix_1_Obj  : Fix_1;
         Fix_2_Obj  : Fix_2;
         Fix_3_Obj  : Fix_3;
         Fix_4_Obj  : Fix_4;
         Flt_1_Obj  : Flt_1;
         Flt_2_Obj  : Flt_2;
         Flt_3_Obj  : Flt_3;
         Flt_4_Obj  : Flt_4;
         Modl_1_Obj : Modl_1;
         Modl_2_Obj : Modl_2;
         Prot_1_Obj : Prot_1;
         Prot_2_Obj : Prot_2;
         Prot_3_Obj : Prot_3 (True);
         Prot_4_Obj : Prot_4;
         Prot_5_Obj : Prot_5;
         Rec_1_Obj  : Rec_1;
         Rec_2_Obj  : Rec_2;
         Rec_3_Obj  : Rec_3;
         Rec_4_Obj  : Rec_4 (True);
         Rec_5_Obj  : Rec_5 (True, True);
         Rec_6_Obj  : Rec_6;
         Rec_7_Obj  : Rec_7;
         Rec_8_Obj  : Rec_8;
         Rec_9_Obj  : Rec_9 (True);
         Sign_1_Obj : Sign_1;
         Sign_2_Obj : Sign_2;
         Tag_1_Obj  : Tag_1;
         Task_1_Obj : Task_1;
         Task_2_Obj : Task_2 (True);
         Task_3_Obj : Task_3;
      
         Prec_Arr_1_Obj : Prec_Arr_1;
         Prec_Arr_2_Obj : Prec_Arr_2;
         Prec_Arr_3_Obj : Prec_Arr_3;
         Prec_Arr_4_Obj : Prec_Arr_4;
         Prec_Arr_5_Obj : Prec_Arr_5;
      
         Prec_Rec_1_Obj : Prec_Rec_1;
         Prec_Rec_2_Obj : Prec_Rec_2 (True);
         Prec_Rec_3_Obj : Prec_Rec_3 (True, True);
         Prec_Rec_4_Obj : Prec_Rec_4;
         Prec_Rec_5_Obj : Prec_Rec_5;
         Prec_Rec_6_Obj : Prec_Rec_6;
         Prec_Rec_7_Obj : Prec_Rec_7;
         Prec_Rec_8_Obj : Prec_Rec_8;
         Prec_Rec_9_Obj : Prec_Rec_9;
         pragma Warnings (On);
      
      begin
         Check (Acc_1_Obj'Valid_Scalars,  Valid,     "Acc_1_Obj");
         Check (Acc_2_Obj'Valid_Scalars,  Valid,     "Acc_2_Obj");
         Check (Acc_3_Obj'Valid_Scalars,  Valid,     "Acc_3_Obj");
         Check (Acc_4_Obj'Valid_Scalars,  Valid,     "Acc_4_Obj");
         Check (Arr_1_Obj'Valid_Scalars,  Not_Valid, "Arr_1_Obj");
         Check (Arr_2_Obj'Valid_Scalars,  Valid,     "Arr_2_Obj");
         Check (Arr_3_Obj'Valid_Scalars,  Not_Valid, "Arr_3_Obj");
         Check (Arr_4_Obj'Valid_Scalars,  Valid,     "Arr_4_Obj");
         Check (Bool_1_Obj'Valid_Scalars, Not_Valid, "Bool_1_Obj");
         Check (Bool_2_Obj'Valid_Scalars, Not_Valid, "Bool_2_Obj");
         Check (Cmpx_1_Obj'Valid_Scalars, Not_Valid, "Cmpx_1_Obj");
         Check (Cmpx_2_Obj'Valid_Scalars, Not_Valid, "Cmpx_2_Obj");
         Check (Cmpx_3_Obj'Valid_Scalars, Not_Valid, "Cmpx_3_Obj");
         Check (Cmpx_4_Obj'Valid_Scalars, Not_Valid, "Cmpx_4_Obj");
         Check (Enum_1_Obj'Valid_Scalars, Not_Valid, "Enum_1_Obj");
         Check (Enum_2_Obj'Valid_Scalars, Not_Valid, "Enum_2_Obj");
         Check (Enum_3_Obj'Valid_Scalars, Not_Valid, "Enum_3_Obj");
         Check (Enum_4_Obj'Valid_Scalars, Not_Valid, "Enum_4_Obj");
         Check (Fix_1_Obj'Valid_Scalars,  Not_Valid, "Fix_1_Obj");
         Check (Fix_2_Obj'Valid_Scalars,  Not_Valid, "Fix_2_Obj");
         Check (Fix_3_Obj'Valid_Scalars,  Not_Valid, "Fix_3_Obj");
         Check (Fix_4_Obj'Valid_Scalars,  Not_Valid, "Fix_4_Obj");
         Check (Flt_1_Obj'Valid_Scalars,  Not_Valid, "Flt_1_Obj");
         Check (Flt_2_Obj'Valid_Scalars,  Not_Valid, "Flt_2_Obj");
         Check (Flt_3_Obj'Valid_Scalars,  Not_Valid, "Flt_3_Obj");
         Check (Flt_4_Obj'Valid_Scalars,  Not_Valid, "Flt_4_Obj");
         Check (Modl_1_Obj'Valid_Scalars, Not_Valid, "Modl_1_Obj");
         Check (Modl_2_Obj'Valid_Scalars, Not_Valid, "Modl_2_Obj");
         Check (Prot_1_Obj'Valid_Scalars, Valid,     "Prot_1_Obj");
         Check (Prot_2_Obj'Valid_Scalars, Not_Valid, "Prot_2_Obj");
         Check (Prot_3_Obj'Valid_Scalars, Not_Valid, "Prot_3_Obj");
         Check (Prot_4_Obj'Valid_Scalars, Valid,     "Prot_4_Obj");
         Check (Prot_5_Obj'Valid_Scalars, Not_Valid, "Prot_5_Obj");
         Check (Rec_1_Obj'Valid_Scalars,  Valid,     "Rec_1_Obj");
         Check (Rec_2_Obj'Valid_Scalars,  Valid,     "Rec_2_Obj");
         Check (Rec_3_Obj'Valid_Scalars,  Not_Valid, "Rec_3_Obj");
         Check (Rec_4_Obj'Valid_Scalars,  Not_Valid, "Rec_4_Obj");
         Check (Rec_5_Obj'Valid_Scalars,  Not_Valid, "Rec_5_Obj");
         Check (Rec_6_Obj'Valid_Scalars,  Valid,     "Rec_6_Obj");
         Check (Rec_7_Obj'Valid_Scalars,  Valid,     "Rec_7_Obj");
         Check (Rec_8_Obj'Valid_Scalars,  Not_Valid, "Rec_8_Obj");
         Check (Rec_9_Obj'Valid_Scalars,  Not_Valid, "Rec_9_Obj");
         Check (Sign_1_Obj'Valid_Scalars, Not_Valid, "Sign_1_Obj");
         Check (Sign_2_Obj'Valid_Scalars, Not_Valid, "Sign_2_Obj");
         Check (Tag_1_Obj'Valid_Scalars,  Valid,     "Tag_1_Obj");
         Check (Task_1_Obj'Valid_Scalars, Valid,     "Task_1_Obj");
         Check (Task_2_Obj'Valid_Scalars, Valid,     "Task_2_Obj");
         Check (Task_3_Obj'Valid_Scalars, Valid,     "Task_3_Obj");
      
         Check (Prec_Arr_1_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_1_Obj");
         Check (Prec_Arr_2_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_2_Obj");
         Check (Prec_Arr_3_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_3_Obj");
         Check (Prec_Arr_4_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_4_Obj");
         Check (Prec_Arr_5_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_5_Obj");
      
         Check (Prec_Rec_1_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_1_Obj");
         Check (Prec_Rec_2_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_2_Obj");
         Check (Prec_Rec_3_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_3_Obj");
         Check (Prec_Rec_4_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_4_Obj");
         Check (Prec_Rec_5_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_5_Obj");
         Check (Prec_Rec_6_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_6_Obj");
         Check (Prec_Rec_7_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_7_Obj");
         Check (Prec_Rec_8_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_8_Obj");
         Check (Prec_Rec_9_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_9_Obj");
      end Main;
      
      -----------------
      -- Compilation --
      -----------------
      
      $ gnatmake -q main.adb
      $ ./main
      
      2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>
      
      gcc/ada/
      
      	* exp_attr.adb (Build_Array_VS_Func): Reimplemented.
      	(Build_Record_VS_Func): Reimplemented.
      	(Expand_N_Attribute): Reimplement the handling of attribute
      	'Valid_Scalars.
      	* sem_attr.adb (Analyze_Attribute): Reimplement the handling of
      	attribute 'Valid_Scalars.
      	* sem_util.adb (Scalar_Part_Present): Reimplemented.
      	(Validated_View): New routine.
      	* sem_util.ads (Scalar_Part_Present): Update the parameter profile and
      	comment on usage.
      	(Validated_View): New routine.
      	* doc/gnat_rm/implementation_defined_attributes.rst: Update the
      	documentation of attribute 'Valid_Scalars.
      	* gnat_rm.texi: Regenerate.
      
      From-SVN: r260518
      Hristian Kirtchev committed
    • [Ada] Ignore pragma Elaborate_Body in spec of a SAL_Interface package · 6b3035ab
      2018-05-22  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* binde.adb: (Choose): Ignore a pragma Elaborate_Body that appears in
      	the spec of a SAL_Interface package.
      
      From-SVN: r260517
      Bob Duff committed
    • [Ada] Spurious visibility error on aspect in generic unit · 85c73d63
      This patch fixes a spurious visiblity error on an instantiation of a generic
      package that contains a type declaration with an aspect specification for
      an aspect that must be delayed (i.e. an aspect whose value may be specified
      at a later point).
      
      The package g.ads must compile quietly:
      
      ----
      with S;
      generic
      package G
      is
         type Buffer_Type is record
            Data       : Integer;
         end record;
      
         package Buffer is new S (Buffer_Type => Buffer_Type);
      end G;
      ----
      generic
         type Buffer_Type is private;
      package S
      is
         Page_Size : constant := 4096;
      
         type Reader_Type is limited record
            Data   : Buffer_Type;
         end record
           with
              Alignment => Page_Size; -- Using a constant does not work
      --      Alignment => 4096;      -- Using a number works
      
      -- for Reader_Type'Alignment use Page_Size; -- so does an attribute.
         pragma Compile_Time_Error (Reader_Type'Size /= 12345, "Ooops");
         -- Note: We set 'Alignment and check for 'Size.
      end S;
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* freeze.adb (Freeze_Entity): When analyzing delayed aspects of an
      	entity E within a generic unit, indicate that there are no remaining
      	delayed aspects after invoking Analyze_Aspects_At_Freeze_Point. The
      	entity E is not frozen yet but the aspects should not be reanalyzed at
      	the freeze point, which may be outside of the generic and may not have
      	the proper visibility.
      
      From-SVN: r260516
      Ed Schonberg committed
    • [Ada] Document new switches for gnatpp · 71483539
      2018-05-22  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* doc/gnat_ugn/gnat_utility_programs.rst: Add documentation for
      	the new --split-line-before-record, --indent-named-statements and
      	--no-align-modes gnatpp switches.
      
      From-SVN: r260515
      Bob Duff committed
    • [Ada] Crash on pragma Compile_Time_Warning with declared string constant · 531351e8
      This patch fixes a compiler abort on a pragma Compile_Time_Warning when its
      second argument is a reference to a constsant string (rather than a string
      literal or an expression that evaluates to a string literal).
      
      Compiling msain.adb must yield:
      
         main.adb:5:33: warning: Good
         main.adb:6:33: warning: VALLUE
         main.adb:7:33: warning: Test
      
      ----
      procedure Main is
         Value : constant String := "Test";
         Switch : constant Boolean := True;
      begin
         pragma Compile_Time_Warning (Switch, "Good");
         pragma Compile_Time_Warning (Switch, "VAL" & "LUE");
         pragma Compile_Time_Warning (Switch, value);
         null;
      end Main;
      
      2018-05-22  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Handle properly
      	a second argument that is a constant of a given string value.
      
      From-SVN: r260514
      Ed Schonberg committed