[Ada] Cleanup code for flagging object references in interfering contexts
authorPiotr Trojanek <trojanek@adacore.com>
Fri, 29 Jan 2021 10:45:36 +0000 (11:45 +0100)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 7 May 2021 09:29:02 +0000 (05:29 -0400)
gcc/ada/

* sem_res.adb (Flag_Object): Replace chained IF with a CASE;
remove repeated calls to Entity; do not traverse into
N_Identifier and N_Expanded_Name, because only need to examine
their Entity field anyway.

gcc/ada/sem_res.adb

index d2819e4..fc89a31 100644 (file)
@@ -3748,24 +3748,30 @@ package body Sem_Res is
             Id : Entity_Id;
 
          begin
-            --  Do not consider nested function calls because they have already
-            --  been processed during their own resolution.
+            case Nkind (N) is
+               --  Do not consider nested function calls because they have
+               --  already been processed during their own resolution.
 
-            if Nkind (N) = N_Function_Call then
-               return Skip;
+               when N_Function_Call =>
+                  return Skip;
 
-            elsif Is_Entity_Name (N) and then Present (Entity (N)) then
-               Id := Entity (N);
+               when N_Identifier | N_Expanded_Name =>
+                  Id := Entity (N);
+
+                  if Present (Id)
+                    and then Is_Object (Id)
+                    and then Is_Effectively_Volatile_For_Reading (Id)
+                  then
+                     Error_Msg_N
+                       ("volatile object cannot appear in this context"
+                        & " (SPARK RM 7.1.3(10))", N);
+                  end if;
 
-               if Is_Object (Id)
-                 and then Is_Effectively_Volatile_For_Reading (Id)
-               then
-                  Error_Msg_N
-                    ("volatile object cannot appear in this context (SPARK "
-                     & "RM 7.1.3(10))", N);
                   return Skip;
-               end if;
-            end if;
+
+               when others =>
+                  null;
+            end case;
 
             return OK;
          end Flag_Object;