sem_attr.adb: (Analyze_Attribute, case 'Range): when expanding X'range (N) into X...
authorEd Schonberg <schonberg@adacore.com>
Fri, 2 Sep 2011 07:19:46 +0000 (07:19 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 2 Sep 2011 07:19:46 +0000 (09:19 +0200)
2011-09-02  Ed Schonberg  <schonberg@adacore.com>

* sem_attr.adb: (Analyze_Attribute, case 'Range): when expanding
X'range (N) into X'First (N) ..  X'Last (N), do not share the
dimension indicator N, if present. Even though it is a static
constant, its source location may be modified when printing
expanded code under -gnatDL, and node sharing will lead to chaos
in Sprint on large files, by generating a sloc value that does
not correspond to any source file.

From-SVN: r178437

gcc/ada/ChangeLog
gcc/ada/sem_attr.adb

index 8f63086a214952cba8389cde94c07e1c28ddce7c..885cbad07ce9057805ada410017d5b9130a6bab0 100644 (file)
@@ -1,3 +1,13 @@
+2011-09-02  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_attr.adb: (Analyze_Attribute, case 'Range): when expanding
+       X'range (N) into X'First (N) ..  X'Last (N), do not share the
+       dimension indicator N, if present. Even though it is a static
+       constant, its source location may be modified when printing
+       expanded code under -gnatDL, and node sharing will lead to chaos
+       in Sprint on large files, by generating a sloc value that does
+       not correspond to any source file.
+
 2011-09-02  Bob Duff  <duff@adacore.com>
 
        * einfo.adb: (Has_Xref_Entry): Do not call
index b3546c6e6d00259cafcbb1b51f0470fe8dc04b7a..69963e44501771b95ed724699a0d8b7a200f80b4 100644 (file)
@@ -8871,6 +8871,7 @@ package body Sem_Attr is
             declare
                LB   : Node_Id;
                HB   : Node_Id;
+               Dims : List_Id;
 
             begin
                if not Is_Entity_Name (P)
@@ -8879,18 +8880,30 @@ package body Sem_Attr is
                   Resolve (P);
                end if;
 
+               Dims := Expressions (N);
+
                HB :=
                  Make_Attribute_Reference (Loc,
                    Prefix         =>
                      Duplicate_Subexpr (P, Name_Req => True),
                    Attribute_Name => Name_Last,
-                   Expressions    => Expressions (N));
+                   Expressions    => Dims);
 
                LB :=
                  Make_Attribute_Reference (Loc,
-                   Prefix         => P,
+                   Prefix          => P,
                    Attribute_Name => Name_First,
-                   Expressions    => Expressions (N));
+                   Expressions => (Dims));
+
+               --  Do not share the dimension indicator, if present. Even
+               --  though it is a static constant, its source location
+               --  may be modified when printing expanded code and node
+               --  sharing will lead to chaos in Sprint.
+
+               if Present (Dims) then
+                  Set_Expressions (LB,
+                    New_List (New_Copy_Tree (First (Dims))));
+               end if;
 
                --  If the original was marked as Must_Not_Freeze (see code
                --  in Sem_Ch3.Make_Index), then make sure the rewriting