Patchwork [Ada] Improper node sharing in the expansion of T'range.

login
register
mail settings
Submitter Arnaud Charlet
Date Sept. 2, 2011, 7:20 a.m.
Message ID <20110902072001.GA30993@adacore.com>
Download mbox | patch
Permalink /patch/113045/
State New
Headers show

Comments

Arnaud Charlet - Sept. 2, 2011, 7:20 a.m.
when rewriting X'range (N) into X'First (N) ..  X'Last (N), the dimension
indicator N must not be shared, if present in the original range. Even though
it is a static constant, its source location may be modified when printing
expanded code under -gnatDL, and node sharing leads to a double modification,
which in large files might generate a source position  that does not correspond
to any source file.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.

Patch

Index: sem_attr.adb
===================================================================
--- sem_attr.adb	(revision 178414)
+++ sem_attr.adb	(working copy)
@@ -8871,6 +8871,7 @@ 
             declare
                LB   : Node_Id;
                HB   : Node_Id;
+               Dims : List_Id;
 
             begin
                if not Is_Entity_Name (P)
@@ -8879,19 +8880,31 @@ 
                   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
                --  does not freeze either.