From a6ae518ff7855e89b8b1e578e2124fd0a79f3f84 Mon Sep 17 00:00:00 2001 From: Robert Dewar Date: Fri, 24 Jan 2014 14:03:19 +0000 Subject: [PATCH] sem_util.adb, [...]: Correct false positive warnings. 2014-01-24 Robert Dewar * sem_util.adb, lib-xref.adb: Correct false positive warnings. From-SVN: r207031 --- gcc/ada/ChangeLog | 4 ++++ gcc/ada/lib-xref.adb | 30 +++++++++++++++++++----------- gcc/ada/sem_util.adb | 7 ++++++- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a21fe7cdd2b..cabedee249a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2014-01-24 Robert Dewar + + * sem_util.adb, lib-xref.adb: Correct false positive warnings. + 2014-01-24 Vincent Celier * projects.texi: Document that aggregate projects are only diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb index a01bbab6a31..67739211abc 100644 --- a/gcc/ada/lib-xref.adb +++ b/gcc/ada/lib-xref.adb @@ -432,6 +432,7 @@ package body Lib.Xref is -- ??? There are several routines here and there that perform a similar -- (but subtly different) computation, which should be factored: + -- Sem_Util.Is_LHS -- Sem_Util.May_Be_Lvalue -- Sem_Util.Known_To_Be_Assigned -- Exp_Ch2.Expand_Entry_Parameter.In_Assignment_Context @@ -473,20 +474,27 @@ package body Lib.Xref is -- ??? case of a slice assignment? - -- ??? Note that in some cases this is called too early - -- (see comments in Sem_Ch8.Find_Direct_Name), at a point where - -- the tree is not fully typed yet. In that case we may lack - -- an Etype for N, and we must disable the check for an implicit - -- dereference. If the dereference is on an LHS, this causes a - -- false positive. - elsif (K = N_Selected_Component or else K = N_Indexed_Component) and then Prefix (P) = N - and then not (Present (Etype (N)) - and then - Is_Access_Type (Etype (N))) then - N := P; + -- Check for access type. First a kludge, In some cases this is + -- called too early (see comments in Sem_Ch8.Find_Direct_Name), + -- at a point where the tree is not fully typed yet. In that + -- case we may lack an Etype for N, and we can't check the + -- Etype. For now, we always return False in such a case, + -- but this is clearly not right in all cases ??? + + if No (Etype (N)) then + return False; + + elsif Is_Access_Type (Etype (N)) then + return False; + + -- Access type case dealt with, keep going + + else + N := P; + end if; -- All other cases, definitely not on left side diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index b5bb307e8e5..422e4621129 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -9882,7 +9882,12 @@ package body Sem_Util is -- a reference as a modification. It is not clear if there are any -- other bad consequences. ??? - if Present (Etype (N)) and then Is_Access_Type (Etype (N)) then + if No (Etype (N)) then + return False; + + -- We have an Etype set, so we can check it + + elsif Is_Access_Type (Etype (N)) then return False; -- OK, not access type case, so just test whole expression -- 2.30.2