diff options
author | Bob Duff <duff@adacore.com> | 2022-06-24 14:25:48 -0400 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-07-12 12:24:12 +0000 |
commit | e124352c0ada83486926f110c8b28a0a431c98b4 (patch) | |
tree | 39b9113a69497e0d183cb28e60625ccb37ccfec8 /gcc | |
parent | 6a64ee3903166dcb1a7803fbf49c31d0f89875a8 (diff) | |
download | gcc-e124352c0ada83486926f110c8b28a0a431c98b4.zip gcc-e124352c0ada83486926f110c8b28a0a431c98b4.tar.gz gcc-e124352c0ada83486926f110c8b28a0a431c98b4.tar.bz2 |
[Ada] Refine heuristics for unreachable-code warnings
This patch refines the heuristics for when we warn about unreachable
code, to avoid common false alarms.
gcc/ada/
* sem_ch5.adb (Check_Unreachable_Code): Refine heuristics.
* sem_util.ads, sem_util.adb (Is_Static_Constant_Name): Remove
this; instead we have a new function Is_Simple_Case in
Sem_Ch5.Check_Unreachable_Code.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch5.adb | 28 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 12 | ||||
-rw-r--r-- | gcc/ada/sem_util.ads | 3 |
3 files changed, 26 insertions, 17 deletions
diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index b2a3661..e1b5722 100644 --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -4393,6 +4393,31 @@ package body Sem_Ch5 is ---------------------------- procedure Check_Unreachable_Code (N : Node_Id) is + + function Is_Simple_Case (N : Node_Id) return Boolean; + -- N is the condition of an if statement. True if N is simple enough + -- that we should not set Unblocked_Exit_Count in the special case + -- below. + + -------------------- + -- Is_Simple_Case -- + -------------------- + + function Is_Simple_Case (N : Node_Id) return Boolean is + begin + return + Is_Trivial_Boolean (N) + or else + (Comes_From_Source (N) + and then Is_Static_Expression (N) + and then Nkind (N) in N_Identifier | N_Expanded_Name + and then Ekind (Entity (N)) = E_Constant) + or else + (not In_Instance + and then Nkind (Original_Node (N)) = N_Op_Not + and then Is_Simple_Case (Right_Opnd (Original_Node (N)))); + end Is_Simple_Case; + Error_Node : Node_Id; Nxt : Node_Id; P : Node_Id; @@ -4574,8 +4599,7 @@ package body Sem_Ch5 is and then No (Else_Statements (P)) and then Is_OK_Static_Expression (Condition (P)) and then Is_True (Expr_Value (Condition (P))) - and then not Is_Trivial_Boolean (Condition (P)) - and then not Is_Static_Constant_Name (Condition (P)) + and then not Is_Simple_Case (Condition (P)) then pragma Assert (Unblocked_Exit_Count = 2); Unblocked_Exit_Count := 0; diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index cfbf010..0e65cbf 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -21532,18 +21532,6 @@ package body Sem_Util is and then Entity (N) in Standard_True | Standard_False; end Is_Trivial_Boolean; - ----------------------------- - -- Is_Static_Constant_Name -- - ----------------------------- - - function Is_Static_Constant_Name (N : Node_Id) return Boolean is - begin - return Comes_From_Source (N) - and then Is_Static_Expression (N) - and then Nkind (N) in N_Identifier | N_Expanded_Name - and then Ekind (Entity (N)) = E_Constant; - end Is_Static_Constant_Name; - -------------------------------------- -- Is_Unchecked_Conversion_Instance -- -------------------------------------- diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index e5b1118..64cf5d0 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -2485,9 +2485,6 @@ package Sem_Util is -- Determine whether source node N denotes "True" or "False". Note that -- this is not true for expressions that got folded to True or False. - function Is_Static_Constant_Name (N : Node_Id) return Boolean; - -- True if N is a name that statically denotes a static constant. - function Is_Unchecked_Conversion_Instance (Id : Entity_Id) return Boolean; -- Determine whether an arbitrary entity denotes an instance of function -- Ada.Unchecked_Conversion. |