1. 12 Aug, 2019 21 commits
    • [Ada] Minor cleanups in exception handling · 2d56744e
      No change in behavior, so no test.
      
      2019-08-12  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* libgnat/a-except.ads: Update obsolete comment, still making
      	clear that this is a variant.  Add explicit default for Id
      	component of Exception_Occurrence, because that value is used.
      	Define Null_Occurrence less redundantly.
      	* libgnat/a-einuoc.adb: Minor simplification of code.
      
      From-SVN: r274296
      Bob Duff committed
    • [Ada] Implement Ada.Directories.Hierarchical_File_Names · 5076fb18
      This patch corrects certain behaviors within Ada.Directories to better
      conform to conformance tests and implements the package
      Ada.Directories.Hierarchical_File_Names outlined in AI05-0049-1.
      
      Only partial test sources are included.
      
      ------------
      -- Source --
      ------------
      
      --  main.ads
      
      with Ada.Directories.Hierarchical_File_Names;
      use Ada.Directories.Hierarchical_File_Names;
      
      with Ada.Exceptions; use Ada.Exceptions;
      with Ada.Text_IO;    use Ada.Text_IO;
      
      procedure Main is
         FULL_PATH_A : constant String := "/export/work/user/bug";
         FULL_PATH_B : constant String := "/export/work/user";
      
         RELATIVE_PATH_A : constant String := "export/work/user/bug/";
         RELATIVE_PATH_B : constant String := "export/work/user/bug";
      
         SIMPLE_PATH_A : constant String := "bug/";
         SIMPLE_PATH_B : constant String := "bug";
      
         ROOT_PATH : constant String := "/";
      
         CURRENT_DIR : constant String := ".";
         PARENT_DIR  : constant String := "..";
      
         RELATIVE_WITH_CURRENT : constant String := RELATIVE_PATH_A & ".";
         RELATIVE_WITH_PARENT  : constant String := RELATIVE_PATH_A & "..";
      begin
         Put_Line ("Simple_Name");
         Put_Line (Is_Simple_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Simple_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Simple_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Simple_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Simple_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Simple_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Simple_Name (ROOT_PATH)'Image);
         Put_Line (Is_Simple_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Simple_Name (PARENT_DIR)'Image);
         Put_Line (Is_Simple_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Simple_Name (RELATIVE_WITH_PARENT)'Image);
         Put_Line (Simple_Name (FULL_PATH_A));
         Put_Line (Simple_Name (FULL_PATH_B));
         Put_Line (Simple_Name (RELATIVE_PATH_A));
         Put_Line (Simple_Name (RELATIVE_PATH_B));
         Put_Line (Simple_Name (SIMPLE_PATH_A));
         Put_Line (Simple_Name (SIMPLE_PATH_B));
         Put_Line (Simple_Name (ROOT_PATH));
         Put_Line (Simple_Name (CURRENT_DIR));
         Put_Line (Simple_Name (PARENT_DIR));
         Put_Line (Simple_Name (RELATIVE_WITH_CURRENT));
         Put_Line (Simple_Name (RELATIVE_WITH_PARENT));
      
         Put_Line ("Root_Directory_Name");
         Put_Line (Is_Root_Directory_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Root_Directory_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Root_Directory_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Root_Directory_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Root_Directory_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Root_Directory_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Root_Directory_Name (ROOT_PATH)'Image);
         Put_Line (Is_Root_Directory_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Root_Directory_Name (PARENT_DIR)'Image);
         Put_Line (Is_Root_Directory_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Root_Directory_Name (RELATIVE_WITH_PARENT)'Image);
      
         Put_Line ("Is_Parent_Directory_Name");
         Put_Line (Is_Parent_Directory_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Parent_Directory_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Parent_Directory_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Parent_Directory_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Parent_Directory_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Parent_Directory_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Parent_Directory_Name (ROOT_PATH)'Image);
         Put_Line (Is_Parent_Directory_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Parent_Directory_Name (PARENT_DIR)'Image);
         Put_Line (Is_Parent_Directory_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Parent_Directory_Name (RELATIVE_WITH_PARENT)'Image);
      
         Put_Line ("Is_Current_Directory_Name");
         Put_Line (Is_Current_Directory_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Current_Directory_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Current_Directory_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Current_Directory_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Current_Directory_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Current_Directory_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Current_Directory_Name (ROOT_PATH)'Image);
         Put_Line (Is_Current_Directory_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Current_Directory_Name (PARENT_DIR)'Image);
         Put_Line (Is_Current_Directory_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Current_Directory_Name (RELATIVE_WITH_PARENT)'Image);
      
         Put_Line ("Is_Full_Name");
         Put_Line (Is_Full_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Full_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Full_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Full_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Full_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Full_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Full_Name (ROOT_PATH)'Image);
         Put_Line (Is_Full_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Full_Name (PARENT_DIR)'Image);
         Put_Line (Is_Full_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Full_Name (RELATIVE_WITH_PARENT)'Image);
      
         Put_Line ("Relative_Name");
         Put_Line (Is_Relative_Name (FULL_PATH_A)'Image);
         Put_Line (Is_Relative_Name (FULL_PATH_B)'Image);
         Put_Line (Is_Relative_Name (RELATIVE_PATH_A)'Image);
         Put_Line (Is_Relative_Name (RELATIVE_PATH_B)'Image);
         Put_Line (Is_Relative_Name (SIMPLE_PATH_A)'Image);
         Put_Line (Is_Relative_Name (SIMPLE_PATH_B)'Image);
         Put_Line (Is_Relative_Name (ROOT_PATH)'Image);
         Put_Line (Is_Relative_Name (CURRENT_DIR)'Image);
         Put_Line (Is_Relative_Name (PARENT_DIR)'Image);
         Put_Line (Is_Relative_Name (RELATIVE_WITH_CURRENT)'Image);
         Put_Line (Is_Relative_Name (RELATIVE_WITH_PARENT)'Image);
         Put_Line (Relative_Name (FULL_PATH_A));
         Put_Line (Relative_Name (FULL_PATH_B));
         Put_Line (Relative_Name (RELATIVE_PATH_A));
         Put_Line (Relative_Name (RELATIVE_PATH_B));
         begin
            Put_Line (Relative_Name (SIMPLE_PATH_A));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Relative_Name (SIMPLE_PATH_B));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Relative_Name (ROOT_PATH));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Relative_Name (CURRENT_DIR));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Relative_Name (PARENT_DIR));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         Put_Line (Relative_Name (RELATIVE_WITH_CURRENT));
         Put_Line (Relative_Name (RELATIVE_WITH_PARENT));
      
         Put_Line ("Containing_Directory");
         Put_Line (Containing_Directory (FULL_PATH_A));
         Put_Line (Containing_Directory (FULL_PATH_B));
         Put_Line (Containing_Directory (RELATIVE_PATH_A));
         Put_Line (Containing_Directory (RELATIVE_PATH_B));
         Put_Line (Containing_Directory (SIMPLE_PATH_A));
         Put_Line (Containing_Directory (SIMPLE_PATH_B));
         begin
            Put_Line (Containing_Directory (ROOT_PATH));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Containing_Directory (CURRENT_DIR));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         begin
            Put_Line (Containing_Directory (PARENT_DIR));
         exception
            when E: others =>
               Put_Line (Exception_Information (E));
         end;
         Put_Line (Containing_Directory (RELATIVE_WITH_CURRENT));
         Put_Line (Containing_Directory (RELATIVE_WITH_PARENT));
      
         Put_Line ("Initial_Directory");
         Put_Line (Initial_Directory (FULL_PATH_A));
         Put_Line (Initial_Directory (FULL_PATH_B));
         Put_Line (Initial_Directory (RELATIVE_PATH_A));
         Put_Line (Initial_Directory (RELATIVE_PATH_B));
         Put_Line (Initial_Directory (SIMPLE_PATH_A));
         Put_Line (Initial_Directory (SIMPLE_PATH_B));
         Put_Line (Initial_Directory (ROOT_PATH));
         Put_Line (Initial_Directory (CURRENT_DIR));
         Put_Line (Initial_Directory (PARENT_DIR));
         Put_Line (Initial_Directory (RELATIVE_WITH_CURRENT));
         Put_Line (Initial_Directory (RELATIVE_WITH_PARENT));
      end;
      
      -----------------
      -- Compilation --
      -----------------
      
      $ gnatmake -q main.adb
      Simple_Name
      FALSE
      FALSE
      FALSE
      FALSE
      TRUE
      TRUE
      FALSE
      TRUE
      TRUE
      FALSE
      FALSE
      bug
      user
      bug
      bug
      bug
      bug
      /
      .
      ..
      .
      ..
      Root_Directory_Name
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      TRUE
      FALSE
      FALSE
      FALSE
      FALSE
      Is_Parent_Directory_Name
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      TRUE
      FALSE
      FALSE
      Is_Current_Directory_Name
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      FALSE
      TRUE
      FALSE
      FALSE
      FALSE
      Is_Full_Name
      TRUE
      TRUE
      FALSE
      FALSE
      FALSE
      FALSE
      TRUE
      FALSE
      FALSE
      FALSE
      FALSE
      Relative_Name
      FALSE
      FALSE
      TRUE
      TRUE
      TRUE
      TRUE
      FALSE
      TRUE
      TRUE
      TRUE
      TRUE
      export/work/user/bug
      export/work/user
      work/user/bug/
      work/user/bug
      raised ADA.IO_EXCEPTIONS.NAME_ERROR : relative path name "bug/" is
      composed of a single part
      
      raised ADA.IO_EXCEPTIONS.NAME_ERROR : relative path name "bug" is
      composed of a single part
      
      raised ADA.IO_EXCEPTIONS.NAME_ERROR : relative path name "/" is
      composed of a single part
      
      raised ADA.IO_EXCEPTIONS.NAME_ERROR : relative path name "." is
      composed of a single part
      
      raised ADA.IO_EXCEPTIONS.NAME_ERROR : relative path name ".." is
      composed of a single part
      
      work/user/bug/.
      work/user/bug/..
      Containing_Directory
      /export/work/user
      /export/work
      export/work/user/bug
      export/work/user
      bug
      .
      raised ADA.IO_EXCEPTIONS.USE_ERROR : directory "/" has no containing directory
      
      raised ADA.IO_EXCEPTIONS.USE_ERROR : directory "." has no containing directory
      
      raised ADA.IO_EXCEPTIONS.USE_ERROR : directory ".." has no containing directory
      
      export/work/user/bug
      export/work/user/bug
      Initial_Directory
      /
      /
      export
      export
      bug
      bug
      /
      .
      ..
      export
      export
      
      2019-08-12  Justin Squirek  <squirek@adacore.com>
      
      gcc/ada/
      
      	* libgnat/a-dhfina.adb, libgnat/a-dhfina.ads (Is_Simple_Name,
      	Is_Root_Directory, Is_Parent_Directory,
      	Is_Current_Directory_Name, Is_Relative_Name, Initial_Directory,
      	Relative_Name, Compose): Add implementation and documentation.
      	* libgnat/a-direct.adb (Containing_Directory): Modify routine to
      	use routines from Ada.Directories.Hierarchical_File_Names and
      	remove incorrect special case for parent directories.
      	(Fetch_Next_Entry): Add check for current directory and parent
      	directory and ignore them under certain circumstances.
      	(Simple_Nmae): Add check for null result from
      	Simple_Name_Internal and raise Name_Error.
      	(Simple_Name_Internal): Add explicit check for root directories,
      	sanitize trailing directory separators, and modify behavior so
      	that current and parent directories are considered valid
      	results.
      	* Makefile.rtl: Add entry to GNATRTL_NONTASKING_OBJS.
      
      From-SVN: r274295
      Justin Squirek committed
    • [Ada] Improve error message for Object_Size clause on dynamic array · 62f0fa21
      This makes the compiler issue the same error:
      
          size clause not allowed for variable length type
      
      for an Object_Size clause on a variable-sized type as for a Size clause,
      for example on the following procedure:
      
      procedure P (X, Y : Integer) is
         subtype Sub is String (X .. Y) with Object_Size => 64;
      begin
         null;
      end;
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* freeze.adb (Freeze_Entity): Give the same error for an
      	Object_Size clause on a variable-sized type as for a Size
      	clause.
      
      From-SVN: r274294
      Eric Botcazou committed
    • [Ada] Suppress_Initialization not respected for private subtypes · 651c9c1e
      The compiler fails to suppress initialization on a variable of a subtype
      of a private type (such as System.Address) even though the subtype has
      aspect Suppress_Initialization. This can lead to errors on object
      declarations specified with Thread_Local_Storage when Initialize_Scalars
      is applied (as well as leading to default initialization when it
      shouldn't).
      
      2019-08-12  Gary Dismukes  <dismukes@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Analyze_Pragma, Pragma_Suppress_Initialization):
      	For private types, set the Suppress_Initialization flag on the
      	Full_View of the entity rather than the entity's base type.
      
      gcc/testsuite/
      
      	* gnat.dg/suppress_initialization2.adb,
      	gnat.dg/suppress_initialization2.ads: New testcase.
      
      From-SVN: r274293
      Gary Dismukes committed
    • [Ada] New aspect/pragma No_Caching for analysis of volatile data · 9dfc6c55
      A new aspect/pragma can be attached to volatile variables to indicate
      that such a variable is not used for interactions with the external
      world, but only that accesses to that variable should not be optimized
      by the compiler. This is in particular useful for guarding against fault
      injection. SPARK Reference manual has been updated to allow this use of
      volatile data, see section 7.1.2, so that GNATprove can analyze such
      variables as not volatile.
      
      2019-08-12  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* aspects.adb, aspects.ads (Aspect_No_Caching): New aspect.
      	* contracts.adb, contracts.ads (Add_Contract_Item): Add handling
      	of No_Caching.
      	(Analyze_Object_Contract): Add handling of No_Caching.
      	* einfo.adb, einfo.ads
      	(Get_Pragma): Add handling of No_Caching.
      	* doc/gnat_rm/implementation_defined_aspects.rst,
      	doc/gnat_rm/implementation_defined_pragmas.rst: Document new
      	aspect/pragma.
      	* gnat_rm.texi: Regenerate.
      	* par-prag.adb (Prag): New pragma Pragma_No_Caching.
      	* sem_ch13.adb (Analyze_Aspect_Specifications,
      	Check_Aspect_At_Freeze_Point): Add handling of No_Caching.
      	* sem_prag.adb (Analyze_Pragma): Deal with pragma No_Caching.
      	* sem_prag.ads (Analyze_External_Property_In_Decl_Part): Now
      	applies to No_Caching.
      	* sem_util.adb, sem_util.ads (Is_Effectively_Volatile): Add
      	handling of No_Caching.
      	(No_Caching_Enabled): New query function.
      	* snames.ads-tmpl: New names for pragma.
      
      gcc/testsuite/
      
      	* gnat.dg/no_caching.adb, gnat.dg/no_caching.ads: New testcase.
      
      From-SVN: r274292
      Yannick Moy committed
    • [Ada] Adapt new extended traversal of AST to have optional part · 1debd630
      The new extended traversal of the AST for GNATprove use now optionally
      traverses the ranges under Itypes, based on a formal parameter.
      
      There is no impact on compilation.
      
      2019-08-12  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_util.adb, sem_util.ads (Traverse_More_Func,
      	Traverse_More_Proc): Add formal parameter for Itypes traversal.
      
      From-SVN: r274291
      Yannick Moy committed
    • [Ada] More precise handling of Size/Object_Size in GNATprove · d39f6b24
      GNATprove does a partial expansion which did not allow getting the
      most precise value for attributes Size/Object_Size. Now fixed.
      
      There is no impact on compilation.
      
      2019-08-12  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* exp_attr.adb, exp_attr.ads (Expand_Size_Attribute): New
      	procedure to share part of the attribute expansion with
      	GNATprove mode.
      	(Expand_N_Attribute_Reference): Extract part of the
      	Size/Object_Size expansion in the new procedure
      	Expand_Size_Attribute.
      	* exp_spark.adb (Expand_SPARK_N_Attribute_Reference): Expand
      	Size/Object_Size attributes using the new procedure
      	Expand_Size_Attribute.
      
      From-SVN: r274290
      Yannick Moy committed
    • [Ada] SPARK: disable expansion of Enum_Rep · 08c8696d
      Disable expansion of Enum_Rep into a type conversion as it is incorrect
      in SPARK.
      
      2019-08-12  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* exp_spark.adb (Expand_SPARK_N_Attribute_Reference): Only
      	expand Enum_Rep attribute when its parameter is a literal.
      
      From-SVN: r274289
      Yannick Moy committed
    • [Ada] Inconsistent compile time Constraint_Error warning · 33defa7c
      This patch corrects several bugs within the compiler which led to
      inconsistent handling of compile time Constraint_Errors. Notibly,
      subtype out of range checks which are only out of range of the subtype
      must be warnings while out of range checks where the value is out of
      range of the base type must be an error. Also, type conversions and
      qualified expressions on literals constitute errors on any out of range
      value. The compiler needed many of these cases clarified.
      
      ------------
      -- Source --
      ------------
      
      --  main.ads
      
      with System;
      package Main is
      
         type T_Enum is (Enum_1, Enum_2, Unknown)
           with Default_Value => Unknown;
      
         subtype T_Valid_Enum is T_Enum range Enum_1 .. Enum_2;
      
         Value : T_Valid_Enum; --  WARNING
      
         generic
            type T_Element is (<>);
            Init : T_Element;
         package Generic_Test is
            Value : T_Element := Init;
         end;
      
         package titi is new Generic_Test (T_Valid_Enum, Unknown); --  WARNING
      
         type My_Float is digits System.Max_Base_Digits;
      
         My_Float_Last : constant := My_Float'Last;
         Out_Of_Range  : constant := My_Float_Last + 1.0;
      
         Flt1 : My_Float := Out_Of_Range; --  ERROR
      
         A : Positive := Positive (16#9999_9999_9999#); --  ERROR
         B : Positive := 16#9999_9999_9999#;            --  ERROR
         C : Positive := 0;                             --  WARNING
         D : Positive := Positive (0);                  --  ERROR
         E : Positive := Positive'(16#9999_9999_9999#); --  ERROR
         F : Positive := Positive'(0);                  --  ERROR
      end;
      
      -----------------
      -- Compilation --
      -----------------
      
      $ gnatmake -q -gnatw_a main.adb
      main.ads:9:12: warning: value not in range of type "T_Valid_Enum" defined at
      line 7
      main.ads:9:12: warning: "Constraint_Error" will be raised at run time
      main.ads:18:52: warning: value not in range of type "T_Element" defined at
      line 12, instance at line 18
      main.ads:18:52: warning: "Constraint_Error" will be raised at run time
      main.ads:25:23: value not in range of type "My_Float" defined at line 20
      main.ads:25:23: static expression fails Constraint_Check
      main.ads:27:19: value not in range of type "Standard.Positive"
      main.ads:27:19: static expression fails Constraint_Check
      main.ads:28:19: value not in range of type "Standard.Positive"
      main.ads:28:19: static expression fails Constraint_Check
      main.ads:29:19: warning: value not in range of type "Standard.Positive"
      main.ads:29:19: warning: "Constraint_Error" will be raised at run time
      main.ads:30:19: value not in range of type "Standard.Positive"
      main.ads:30:19: static expression fails Constraint_Check
      main.ads:31:27: value not in range of type "Standard.Positive"
      main.ads:31:27: static expression fails Constraint_Check
      main.ads:32:27: value not in range of type "Standard.Positive"
      main.ads:32:27: static expression fails Constraint_Check
      gnatmake: "main.ads" compilation error
      
      2019-08-12  Justin Squirek  <squirek@adacore.com>
      
      gcc/ada/
      
      	* sem_eval.adb (Check_Non_Static_Context): Add a condition to
      	determine if a range violation constitues a warning or an error.
      	(Out_Of_Range): Add a condition to determine if a range
      	violation constitues a warning or an error.
      
      From-SVN: r274288
      Justin Squirek committed
    • [Ada] Eliminate redundant range checks on conversions · 4e896dad
      This gets rid of redundant range checks generated in 5 out of the 9
      cases of scalar conversions, i.e. (integer, fixed-point, floating-point)
      converted to (integer, fixed-point, floating-point).
      
      The problem is that the Real_Range_Check routine rewrites the conversion
      node into a conversion to the base type so, when its parent node is
      analyzed, a new conversion to the subtype may be introduced, depending
      on the context, giving rise to a second range check against the subtype
      bounds.
      
      This change makes Real_Range_Check rewrite the expression of the
      conversion node instead of the node, so that the type of the node is
      preserved and no new conversion is introduced.  As a matter of fact,
      this is exactly what happens in the float-to-float case which goes to
      the Generate_Range_Check circuit instead and does not suffer from the
      duplication of range checks.
      
      For the following procedure, the compiler must now generate exactly one
      range check per nested function:
      
      procedure P is
      
        type I1 is new Integer range -100 .. 100;
      
        type I2 is new Integer range -200 .. 200;
      
        type D1 is delta 0.5 range -100.0 .. 100.0;
      
        type D2 is delta 0.5 range -200.0 .. 200.0;
      
        type F1 is new Long_Float range -100.0 .. 100.0;
      
        type F2 is new Long_Float range -200.0 .. 200.0;
      
        function Conv (A : I2) return I1 is
        begin
          return I1 (A);
        end;
      
        function Conv (A : D2) return I1 is
        begin
          return I1 (A);
        end;
      
        function Conv (A : F2) return I1 is
        begin
          return I1 (A);
        end;
      
        function Conv (A : I2) return D1 is
        begin
          return D1 (A);
        end;
      
        function Conv (A : D2) return D1 is
        begin
          return D1 (A);
        end;
      
        function Conv (A : F2) return D1 is
        begin
          return D1 (A);
        end;
      
        function Conv (A : I2) return F1 is
        begin
          return F1 (A);
        end;
      
        function Conv (A : D2) return F1 is
        begin
          return F1 (A);
        end;
      
        function Conv (A : F2) return F1 is
        begin
          return F1 (A);
        end;
      
      begin
        null;
      end;
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_ch4.adb (Real_Range_Check): Do not rewrite the conversion
      	node but its expression instead, after having fetched its
      	current value.  Clear the Do_Range_Check flag on entry.  Return
      	early for a rewritten float-to-float conversion.  Remove
      	redundant local variable.  Suppress all checks when inserting
      	the temporary and do not reanalyze the node.
      
      From-SVN: r274287
      Eric Botcazou committed
    • [Ada] Sprint: minor comment tweak · 5aa76fe1
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sprint.ads: Minor comment tweak.
      
      From-SVN: r274286
      Eric Botcazou committed
    • [Ada] Fix leak of Do_Range_Check flag in -gnatVa mode · 1361a4fb
      This fixes a small glitch in Insert_Valid_Check, which needs to
      propagate the Do_Range_Check flag onto the rewritten expression, but
      uses its Original_Node as the source of the copy.  Now Original_Node
      does not necessarily point to the node that was just rewritten, but to
      the ultimately original node, which is not the same node if the
      expression was rewritten multiple times.  The end result is that a
      stalled Do_Range_Check flag can be wrongly resintated and leak to the
      code generator.
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* checks.adb (Insert_Valid_Check): Do not retrieve the
      	Do_Range_Check flag from the Original_Node but from the
      	Validated_Object.  Remove useless bypass for floating-point
      	types.
      
      gcc/testsuite/
      
      	* gnat.dg/range_check7.adb: New testcase.
      
      From-SVN: r274285
      Eric Botcazou committed
    • [Ada] Extended traversal subprograms for GNATprove · 935b02ae
      GNATprove needs traversal subprograms that do not simply traverse
      syntactic nodes like Atree.Traverse_Func and Atree.Traverse_Proc, but
      also traverse semantic nodes which are logically children of the nodes.
      Now available through Sem_Util.Traverse_More_Func and
      Sem_Util.Traverse_More_Proc.
      
      There is no impact on compilation.
      
      2019-08-12  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_util.adb, sem_util.ads (Traverse_More_Func,
      	Traverse_More_Proc): New traversal subprograms.
      
      From-SVN: r274284
      Yannick Moy committed
    • [Ada] VxWorks: call s-tpopsp.Self only when needed · 96a8b705
      2019-08-12  Jerome Lambourg  <lambourg@adacore.com>
      
      gcc/ada/
      
      	* libgnarl/s-taprop__vxworks.adb (Abort_Handler): Only call
      	s-tpopsp.Self when actually needed.
      
      From-SVN: r274283
      Jerome Lambourg committed
    • [Ada] Plug small loophole in Discrete_Range_Check · 43eb2bb6
      This routine would not return if range checks are suppressed.
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* exp_ch4.adb (Discrete_Range_Check): Return if checks are
      	suppressed.
      
      From-SVN: r274282
      Eric Botcazou committed
    • [Ada] Add special bypass for obsolete code pattern · 4d7d2736
      This change prevents the analysis phase of the front-end from setting
      the Do_Range_Check flag in the very peculiar case of the source of a
      conversion whose result is passed by reference to a "valued procedure",
      because the expansion phase would not be able to generate the check.
      
      This pattern appears in the ancient DEC Starlet package and it doesn't
      seem to be useful at this point to change the expander to deal with it,
      so instead the analysis phase is adjusted.  Morever the compiler already
      issues a warning in this case so this is probably good enough.
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_res.adb: Add with & use clause for Sem_Mech and
      	alphabetize.
      	(Resolve_Actuals): Do not apply a scalar range check for the
      	source of a conversion whose result is passed by reference to a
      	valued procedure.
      
      From-SVN: r274281
      Eric Botcazou committed
    • [Ada] Fix missing range check for In/Out parameter with -gnatVa · 13931a38
      This plugs another small loophole in the front-end which fails to
      generate a range check for a scalar In/Out parameter when -gnatVa is
      specified.  This also fixes a few more leaks of the Do_Range_Check flag
      on actual parameters, both in regular and -gnatVa modes, as well as a
      leak specific to expression function in -gnatp mode.
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* checks.adb (Insert_Valid_Check): Reset the Do_Range_Check flag
      	on the validated object.
      	* exp_ch6.adb (Add_Call_By_Copy_Code): Reset the Do_Range_Check
      	flag on the actual here, as well as on the Expression if the
      	actual is a N_Type_Conversion node.
      	(Add_Validation_Call_By_Copy_Code): Generate the incoming range
      	check if needed and reset the Do_Range_Check flag on the
      	Expression if the actual is a N_Type_Conversion node.
      	(Expand_Actuals): Do not reset the Do_Range_Check flag here.
      	Generate the incoming range check for In parameters here instead
      	of...
      	(Expand_Call_Helper): ...here.  Remove redudant condition.
      	* sem_res.adb (Resolve_Actuals): Use local variable A_Typ and
      	remove obsolete comments.
      	(Resolve_Type_Conversion): Do not force the Do_Range_Check flag
      	on the operand if range checks are suppressed.
      
      gcc/testsuite/
      
      	* gnat.dg/range_check6.adb: New testcase.
      
      From-SVN: r274280
      Eric Botcazou committed
    • [Ada] Fix incorrect Do_Range_Check on type conversion · 68c8d72a
      This gets rid of another leak of the Do_Range_Check flag to the back-end
      which is specific to expression functions.  No functional changes.
      
      2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* checks.adb (Activate_Range_Check): Remove redundant argument.
      	(Generate_Range_Check): Likewise.
      	(Apply_Float_Conversion_Check): Reset the Do_Range_Check flag on
      	entry and remove redundant condition.
      
      From-SVN: r274279
      Eric Botcazou committed
    • Fix Ada comparison failure on SPARC · 52c9b7fa
      	* ipa-predicate.c (add_condition): Restore inverted test.
      
      From-SVN: r274277
      Rainer Orth committed
    • Move is_valid_fd to filedescriptor.c file. · 8f88e7f6
      2019-08-12  Martin Liska  <mliska@suse.cz>
      
      	* Makefile.in: Add filedescriptor.c.
      	* filedescriptor.c: New file.
      	* lrealpath.c (is_valid_fd): Remove.
      
      From-SVN: r274273
      Martin Liska committed
    • Daily bump. · 90fb7fae
      From-SVN: r274272
      GCC Administrator committed
  2. 11 Aug, 2019 4 commits
    • PR fortran/91413 Generate warning when making array static · 54320207
      When moving a local variable from the stack to static storage, the
      procedure is no longer safe to be called recursively or concurrently
      from multiple threads.  Thus generate a warning when this is done.
      Also double the default limit for switching from stack to static.
      
      Regtested on x86_64-pc-linux-gnu.
      
      gcc/fortran/ChangeLog:
      
      2019-08-11  Janne Blomqvist  <jb@gcc.gnu.org>
      
      	PR fortran/91413
      	* invoke.texi (-fmax-stack-var-size): Document increased default.
      	* options.c (gfc_post_options): Increase default stack var size to
      	65536 bytes.
      	* trans-decl.c (gfc_finish_var_decl): Generate warning when local
      	array moved to static storage.
      
      From-SVN: r274264
      Janne Blomqvist committed
    • d: Fix ICE: gimplification failed (gimplify.c at 13436) · 4c9dbb96
      The expression that caused the ICE
      
      	++(a += 1.0);
      
      The D front-end rewrites and applies implicit type conversions so the
      expression gets simplified as
      
      	(int)((double) a += 1.0) += 1
      
      The codegen pass would subsequently generate the following invalid code
      
      	(int)(double) a = (int)((double) a + 1.0) + 1
      
      The LHS expression `(int)(double) a', represented as a FIX_TRUNC_EXPR
      being what trips as it is not a valid lvalue for assignment.
      
      While LHS casts are stripped away, convert_expr adds a double cast
      because it converts the expression to its original type before
      converting it to its target type.  There is no valid reason why this is
      done, so it has been removed.
      
      gcc/d/ChangeLog:
      
      	PR d/90601
      	* d-convert.cc (convert_expr): Don't convert an expression to its
      	original front-end type before converting to its target type.
      
      gcc/testsuite/ChangeLog:
      
      	PR d/90601
      	* gdc.dg/pr90601.d: New test.
      
      From-SVN: r274263
      Iain Buclaw committed
    • Correct a single misfire in previous ChangeLog cleanup. · 05ba17fd
      From-SVN: r274262
      Hans-Peter Nilsson committed
    • Daily bump. · b2f8f7bc
      From-SVN: r274261
      GCC Administrator committed
  3. 10 Aug, 2019 7 commits
    • decl.c (match_old_style_init): Use a clearer error message. · 878f88b7
      2019-08-10  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	* decl.c (match_old_style_init): Use a clearer error message.
      	* expr.c (gfc_check_assign): Update BOZ checking to provide a stricter
      	adherence to the Fortran standard.  Use gfc_invalid_boz () to
      	relax errors into warnings.
      	* gfortran.h (gfc_isym_id): Add new ids GFC_ISYM_DFLOAT,
      	GFC_ISYM_FLOAT, GFC_ISYM_REALPART, and GFC_ISYM_SNGL
      	* intrinsic.c (add_functions): Use new ids to split REAL generic into
      	REAL, FLOAT, DFLOAT, SNGL, and REALPART generics.
      	(gfc_intrinsic_func_interface): Allow new intrinsics in an
      	initialization expression
      	* resolve.c (resolve_operator): Deal with BOZ as operands.
              Use gfc_invalid_boz to allow for errors or warnings via the
      	-fallow-invalid-boz option.  A BOZ cannot be an operand to an
      	unary operator.  Both operands of a binary operator cannot be BOZ.
              For binary operators, convert a BOZ operand into the type and
      	kind of the other operand for REAL or INTEGER operand.
      	* trans-intrinsic.c: Use new ids to cause conversions to happen.
      
      2019-08-10  Steven G. Kargl  <kargl@gcc.gnu.org>
      
      	* gfortran.dg/boz_8.f90: Adjust error messages.
      	* gfortran.dg/nan_4.f90: Ditto.
      	* gfortran.dg/boz_1.f90: Add -fallow-invalid-boz to dg-options,
      	and test for warnings.
      	* gfortran.dg/boz_3.f90: Ditto.
      	* gfortran.dg/boz_4.f90: Ditto.
      	* gfortran.dg/dec_structure_6.f90: Ditto.
      	* gfortran.dg/ibits.f90: Ditto.
      
      From-SVN: r274257
      Steven G. Kargl committed
    • d: Fix internal compiler error: in add_expr, at tree.c:7794 · 884efbd5
      gcc/d/ChangeLog:
      
      	PR d/91238
      	* d-codegen.cc (build_address): If taking the address of a CALL_EXPR,
      	wrap it in a TARGET_EXPR.
      
      gcc/testsuite/ChangeLog:
      
      	PR d/91238
      	* gdc.dg/pr91238.d: New test.
      
      From-SVN: r274253
      Iain Buclaw committed
    • tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_DEVICE_TYPE. · 77eb117f
      	* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_DEVICE_TYPE.
      	(enum omp_clause_device_type_kind): New enum.
      	(struct tree_omp_clause): Add subcode.device_type_kind.
      	* tree.h (OMP_CLAUSE_DEVICE_TYPE_KIND): Define.
      	* tree.c (omp_clause_num_ops, omp_clause_code_name): Add entries
      	for device_type clause.
      	(walk_tree_1): Handle OMP_CLAUSE_DEVICE_TYPE.
      	* tree-pretty-print.c (dump_omp_clause): Likewise.
      c-family/
      	* c-pragma.h (enum pragma_omp_clause): Add
      	PRAGMA_OMP_CLAUSE_DEVICE_TYPE.
      c/
      	* c-parser.c (c_parser_omp_clause_name): Parse device_type.
      	(c_parser_omp_clause_device_type): New function.
      	(c_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_DEVICE_TYPE.
      	(OMP_DECLARE_TARGET_CLAUSE_MASK): Add PRAGMA_OMP_CLAUSE_DEVICE_TYPE.
      	(c_parser_omp_declare_target): Handle device_type clauses.  Remove
      	diagnostics for declare target with clauses nested in clause-less
      	declare target declaration-definition-seq.
      	* c-typeck.c (c_finish_omp_clauses): Handle OMP_CLAUSE_DEVICE_TYPE.
      cp/
      	* parser.c (cp_parser_omp_clause_name): Parse device_type.
      	(cp_parser_omp_clause_device_type): New function.
      	(cp_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_DEVICE_TYPE.
      	(OMP_DECLARE_TARGET_CLAUSE_MASK): Add PRAGMA_OMP_CLAUSE_DEVICE_TYPE.
      	(cp_parser_omp_declare_target): Handle device_type clauses.  Remove
      	diagnostics for declare target with clauses nested in clause-less
      	declare target declaration-definition-seq.
      	* semantics.c (finish_omp_clauses): Handle OMP_CLAUSE_DEVICE_TYPE.
      testsuite/
      	* c-c++-common/gomp/declare-target-2.c: Don't expect error for
      	declare target with clauses in between declare target without clauses
      	and end declare target.
      	* c-c++-common/gomp/declare-target-4.c: New test.
      
      From-SVN: r274252
      Jakub Jelinek committed
    • re PR target/91408 (ICE in extract_insn, at recog.c:2310 since r273981) · 5b7ed762
      	PR target/91408
      	* config/i386/mmx.md (usadv8qi): Use register_operand instead of
      	vector_operand.
      
      	* gcc.target/i386/pr91408.c: New test.
      
      From-SVN: r274251
      Jakub Jelinek committed
    • Assorted ChangeLog cleanups. · ab20d992
      From-SVN: r274250
      Jakub Jelinek committed
    • Fix ODR violation in d/runtime.cc · 74039253
      gcc/d/ChangeLog:
      
      	PR d/90893
      	* runtime.cc (enum libcall_type): Rename to...
      	(enum d_libcall_type): ...this.
      	(get_libcall_type): Use d_libcall_type.
      	(build_libcall_decl): Likewise.
      
      From-SVN: r274249
      Iain Buclaw committed
    • Daily bump. · 8fa64062
      From-SVN: r274248
      GCC Administrator committed
  4. 09 Aug, 2019 8 commits
    • * zh_TW.po: Update. · c94fe79e
      From-SVN: r274243
      Joseph Myers committed
    • * uk.po: Update. · 34237338
      From-SVN: r274241
      Joseph Myers committed
    • reload1.c (finish_spills): Do not check ira_conflicts_p when handling spilled pseudos. · 394ae89b
      	* reload1.c (finish_spills): Do not check ira_conflicts_p when
      	handling spilled pseudos.
      
      From-SVN: r274240
      Vladimir Makarov committed
    • rs6000: vec-rotate-*.c fixes · ef4ddda8
      This fixes two minor problems with the new testcases.  The first is
      that almost all other tests, including all vec* tests, for powerpc use
      names with dashes, not underscores.  The more important one is the the
      vec-rotate-1.c and vec-rotate-3.c tests need the -maltivec flag.
      
      
      gcc/testsuite/
      	* gcc.target/powerpc/vec_rotate-1.c: Rename to ...
      	* gcc.target/powerpc/vec-rotate-1.c: ... this.  Add -maltivec option.
      	* gcc.target/powerpc/vec_rotate-2.c: Rename to ...
      	* gcc.target/powerpc/vec-rotate-2.c: ... this.
      	* gcc.target/powerpc/vec_rotate-3.c: Rename to ...
      	* gcc.target/powerpc/vec-rotate-3.c: ... this.  Add -maltivec option.
      	* gcc.target/powerpc/vec_rotate-4.c: Rename to ...
      	* gcc.target/powerpc/vec-rotate-4.c: ... this.
      
      From-SVN: r274239
      Segher Boessenkool committed
    • [aarch64] PR target/91386 Use copy_rtx to avoid modifying original insns in peep2 pattern · f6af9c21
      PR target/91386 is a situation where a peephole2 pattern substitution
      is discarded late because the selected instructions contain
      frame-related notes that we cannot redistribute (because the pattern
      has more than one insn in the output).  Unfortunately, the original
      insns were being modified during the generation, so after the undo we
      are left with corrupt RTL.
      
      We avoid this by ensuring that the modifications are always made on a
      copy, so that the original insns are never changed.
      
      	PR target/91386
      	* config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Use copy_rtx
      	to preserve the contents of the original insns.
      
      From-SVN: r274238
      Richard Earnshaw committed
    • [arm] Recognize thumb2 16-bit variants of the add and compare instructions · d092f6fc
      The addsi3_compare_op[12] patterns currently only have constraints to
      pick the 32-bit variants of the instructions.  Although the assembler
      may sometimes opportunistically match a 16-bit t2 instruction, there's
      no real control over that within the compiler.  Consequently we might
      emit a 32-bit adds instruction with a 16-bit subs instruction would
      serve equally well.  We do, of course still have to be careful about
      the small number of boundary cases by controlling the order quite
      carefully.
      
      This patch adds the constraints and templates to match the t2 16-bit
      variants of these instructions.  Now, for example, we can generate
      
          subs r0, r0, #1 // 16-bit instruction
      
      instead of 
      
          adds r0, r0, #1 // 32-bit instruction.
      
      	*confit/arm/arm.md (addsi3_compare_op1): Add 16-bit thumb-2 variants.
      	(addsi3_compare_op2): Likewise.
      
      From-SVN: r274237
      Richard Earnshaw committed
    • [PATCH][GCC][AARCH64] Add effective-target check to b key execution tests · 9c4cb861
      gcc/testsuite
      2019-08-09  Sam Tebbs<sam.tebbs@arm.com>
      
      	* lib/target-supports.exp
      	(check_effective_target_arm_v8_4a_bkey_directive): New proc.
      	* g++.target/aarch64/return_address_sign_b_exception.C,
      	return_address_sign_ab_exception.C: Add dg-require-effective-target
      	checks.
      
      From-SVN: r274236
      Sam Tebbs committed
    • Strengthen alias_ptr_types_compatible_p in LTO mode. · 33e8e0ee
      2019-08-09  Martin Liska  <mliska@suse.cz>
      
      	* alias.c (alias_ptr_types_compatible_p): Strengten
      	type comparison in LTO mode.
      
      From-SVN: r274235
      Martin Liska committed