diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2004-12-08 12:26:46 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2004-12-08 12:26:46 +0100 |
commit | 2717634daab64ed32a49b329f61cf0064f80f046 (patch) | |
tree | 80a2c09a38886e46b64411da23e90656c1713647 /gcc/ada | |
parent | e913f03badb889da71c50a230b357aac6561ea01 (diff) | |
download | gcc-2717634daab64ed32a49b329f61cf0064f80f046.zip gcc-2717634daab64ed32a49b329f61cf0064f80f046.tar.gz gcc-2717634daab64ed32a49b329f61cf0064f80f046.tar.bz2 |
exp_ch4.adb (Expand_N_Indexed_Component): For an indexed component with an implicit dereference as its prefix...
* exp_ch4.adb (Expand_N_Indexed_Component): For an indexed component
with an implicit dereference as its prefix, use
Insert_Explicit_Dereference instead of merely rewriting the prefix into
an explicit dereference. This ensures that a reference to the original
prefix is generated, if appropriate.
* sem_util.adb (Insert_Explicit_Dereference): When an implicit
dereference is rewritten to an explicit one, generate a reference to
the entity denoted by its prefix using the original prefix node, so
the dereference can be properly recorded as a read of the denoted
access value, if appropriate.
* sem_warn.adb (Output_Unreferenced_Messages): Do not abstain from
emitting 'assigned but never read' warning on a variable on the basis
that it has an access type.
(Check_References): Emit unreferenced warning when the scope is a
subprogram body.
From-SVN: r91881
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/exp_ch4.adb | 12 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 18 | ||||
-rw-r--r-- | gcc/ada/sem_warn.adb | 20 |
3 files changed, 28 insertions, 22 deletions
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index be053b5..67fc5e8 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -1780,7 +1780,7 @@ package body Exp_Ch4 is -- end loop; -- end if; - -- ... + -- . . . -- if Sn'Length /= 0 then -- P := Sn'First; @@ -2914,7 +2914,7 @@ package body Exp_Ch4 is -- Cnn := else-expr -- end if; - -- and replace the conditional expression by a reference to Cnn. + -- and replace the conditional expression by a reference to Cnn if Present (Then_Actions (N)) or else Present (Else_Actions (N)) then Cnn := Make_Defining_Identifier (Loc, New_Internal_Name ('C')); @@ -3273,9 +3273,7 @@ package body Exp_Ch4 is -- was necessary, but it cleans up the code to do it all the time. if Is_Access_Type (T) then - Rewrite (P, - Make_Explicit_Dereference (Sloc (N), - Prefix => Relocate_Node (P))); + Insert_Explicit_Dereference (P); Analyze_And_Resolve (P, Designated_Type (T)); end if; @@ -3921,7 +3919,7 @@ package body Exp_Ch4 is -- Obj1 : Enclosing_UU_Type; -- Obj2 : Enclosing_UU_Type (1); - -- . . . Obj1 = Obj2 . . . + -- [. . .] Obj1 = Obj2 [. . .] -- Generated code: @@ -6735,7 +6733,7 @@ package body Exp_Ch4 is -- ityp (x) - -- with the Float_Truncate flag set. This is clearly more efficient. + -- with the Float_Truncate flag set. This is clearly more efficient if Nkind (Operand) = N_Attribute_Reference and then Attribute_Name (Operand) = Name_Truncation diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 22066fe..cc0cc6fd 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -2631,7 +2631,7 @@ package body Sem_Util is begin Get_Unit_Name_String (Unit_Name_Id); - -- Remove seven last character (" (spec)" or " (body)"). + -- Remove seven last character (" (spec)" or " (body)") Name_Len := Name_Len - 7; pragma Assert (Name_Buffer (Name_Len + 1) = ' '); @@ -3136,6 +3136,7 @@ package body Sem_Util is procedure Insert_Explicit_Dereference (N : Node_Id) is New_Prefix : constant Node_Id := Relocate_Node (N); + Ent : Entity_Id := Empty; I : Interp_Index; It : Interp; T : Entity_Id; @@ -3166,6 +3167,21 @@ package body Sem_Util is end loop; End_Interp_List; + + else + -- Prefix is unambiguous: mark the original prefix (which might + -- Come_From_Source) as a reference, since the new (relocated) one + -- won't be taken into account. + + if Is_Entity_Name (New_Prefix) then + Ent := Entity (New_Prefix); + elsif Nkind (New_Prefix) = N_Selected_Component then + Ent := Entity (Selector_Name (New_Prefix)); + end if; + + if Present (Ent) then + Generate_Reference (Ent, New_Prefix); + end if; end if; end Insert_Explicit_Dereference; diff --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb index ba4c957..3710606 100644 --- a/gcc/ada/sem_warn.adb +++ b/gcc/ada/sem_warn.adb @@ -563,6 +563,7 @@ package body Sem_Warn is (Ekind (E) = E_Function or else Ekind (E) = E_Package_Body or else Ekind (E) = E_Procedure + or else Ekind (E) = E_Subprogram_Body or else Ekind (E) = E_Block))) -- Exclude instantiations, since there is no reason why @@ -670,7 +671,7 @@ package body Sem_Warn is Unreferenced_Entities.Increment_Last; Unreferenced_Entities.Table (Unreferenced_Entities.Last) := E1; - -- Force warning on entity. + -- Force warning on entity Set_Referenced (E1, False); end if; @@ -994,7 +995,7 @@ package body Sem_Warn is Un : constant Node_Id := Sinfo.Unit (Cnode); function Check_Use_Clause (N : Node_Id) return Traverse_Result; - -- If N is a use_clause for Pack, emit warning. + -- If N is a use_clause for Pack, emit warning procedure Check_Use_Clauses is new Traverse_Proc (Check_Use_Clause); @@ -1484,22 +1485,13 @@ package body Sem_Warn is if Warn_On_Modified_Unread and then not Is_Imported (E) - -- Suppress the message for aliased, renamed - -- and access variables since there may be - -- other entities that read the memory location. + -- Suppress the message for aliased or renamed + -- variables, since there may be other entities + -- read the same memory location. and then not Is_Aliased (E) and then No (Renamed_Object (E)) - and then not (Is_Access_Type (Etype (E)) - or else - -- Case of private access type, must examine the - -- full view due to visibility issues. - - (Is_Private_Type (Etype (E)) - and then - Is_Access_Type - (Full_View (Etype (E))))) then Error_Msg_N ("variable & is assigned but never read?", E); |