From ed32b82e77377f2905fd1a2b74bff4b06d108ef2 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Fri, 2 Sep 2011 07:19:46 +0000 Subject: sem_attr.adb: (Analyze_Attribute, case 'Range): when expanding X'range (N) into X'First (N) .. 2011-09-02 Ed Schonberg * 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 | 10 ++++++++++ gcc/ada/sem_attr.adb | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 8f63086..885cbad 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,13 @@ +2011-09-02 Ed Schonberg + + * 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 * einfo.adb: (Has_Xref_Entry): Do not call diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index b3546c6..69963e4 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -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 -- cgit v1.1