aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhjuvan Lacambre <lacambre@adacore.com>2020-10-28 11:03:16 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2020-11-27 04:15:44 -0500
commitbf85ff03b3e6a17da5bee164114721ea076e33ad (patch)
tree0d88cdf0ec89d00322763dd0af54b0cbe0a3e7ea
parent78287696dc5f788b28f8541c93809e002f722f81 (diff)
downloadgcc-bf85ff03b3e6a17da5bee164114721ea076e33ad.zip
gcc-bf85ff03b3e6a17da5bee164114721ea076e33ad.tar.gz
gcc-bf85ff03b3e6a17da5bee164114721ea076e33ad.tar.bz2
[Ada] Emit error messages for null/generic nonreturning procedures
gcc/ada/ * sem_prag.adb (Analyze_Pragma): declare new Check_No_Return function and call it.
-rw-r--r--gcc/ada/sem_prag.adb66
1 files changed, 62 insertions, 4 deletions
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 05ff511..bb89132 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -19670,7 +19670,59 @@ package body Sem_Prag is
-- pragma No_Return (procedure_LOCAL_NAME {, procedure_Local_Name});
- when Pragma_No_Return => No_Return : declare
+ when Pragma_No_Return => Prag_No_Return : declare
+
+ function Check_No_Return
+ (E : Entity_Id;
+ N : Node_Id) return Boolean;
+ -- Check rule 6.5.1 4/3 of the Ada Ref Manual. If the rule is
+ -- violated, emit an error message and return False, otherwise
+ -- return True.
+ -- 6.5.1 Nonreturning procedures:
+ -- 4/3 "Aspect No_Return shall not be specified for a null
+ -- procedure nor an instance of a generic unit."
+
+ ---------------------
+ -- Check_No_Return --
+ ---------------------
+
+ function Check_No_Return
+ (E : Entity_Id;
+ N : Node_Id) return Boolean
+ is
+ Ok : Boolean := True;
+ begin
+ if Ekind (E) = E_Procedure then
+
+ -- If E is a generic instance, marking it with No_Return is
+ -- forbidden, but having it inherit the No_Return of the
+ -- generic is allowed. We check if E is inheriting its
+ -- No_Return flag from the generic by checking if No_Return
+ -- is already set.
+
+ if Is_Generic_Instance (E) and then not No_Return (E) then
+ Error_Msg_NE
+ ("generic instance & is marked as No_Return", N, E);
+ Error_Msg_NE
+ ("\generic procedure & must be marked No_Return",
+ N,
+ Generic_Parent (Parent (E)));
+ Ok := False;
+
+ else
+ if Null_Present (Subprogram_Specification (E)) then
+ Error_Msg_NE
+ ("null procedure & cannot be marked No_Return",
+ N,
+ E);
+ Ok := False;
+ end if;
+ end if;
+ end if;
+
+ return Ok;
+ end Check_No_Return;
+
Arg : Node_Id;
E : Entity_Id;
Found : Boolean;
@@ -19742,7 +19794,9 @@ package body Sem_Prag is
end if;
end if;
- Set_No_Return (E);
+ if Check_No_Return (E, N) then
+ Set_No_Return (E);
+ end if;
-- A pragma that applies to a Ghost entity becomes Ghost
-- for the purposes of legality checks and removal of
@@ -19781,7 +19835,10 @@ package body Sem_Prag is
-- Set flag on any alias as well
- if Is_Overloadable (E) and then Present (Alias (E)) then
+ if Is_Overloadable (E)
+ and then Present (Alias (E))
+ and then Check_No_Return (Alias (E), N)
+ then
Set_No_Return (Alias (E));
end if;
@@ -19798,6 +19855,7 @@ package body Sem_Prag is
if not Found then
if Entity (Id) = Current_Scope
and then From_Aspect_Specification (N)
+ and then Check_No_Return (Entity (Id), N)
then
Set_No_Return (Entity (Id));
@@ -19812,7 +19870,7 @@ package body Sem_Prag is
Next (Arg);
end loop;
- end No_Return;
+ end Prag_No_Return;
-----------------
-- No_Run_Time --