aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/ghost.adb
diff options
context:
space:
mode:
authorHristian Kirtchev <kirtchev@adacore.com>2018-01-11 08:55:57 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-01-11 08:55:57 +0000
commita85dbeec8d84e07ee549fca50dc118234f16d3f1 (patch)
treee95e75f094acff6244b15f024b594ea1975b96c1 /gcc/ada/ghost.adb
parent5efc1c00c88b7758d628ce8e2d1e6d54d5996216 (diff)
downloadgcc-a85dbeec8d84e07ee549fca50dc118234f16d3f1.zip
gcc-a85dbeec8d84e07ee549fca50dc118234f16d3f1.tar.gz
gcc-a85dbeec8d84e07ee549fca50dc118234f16d3f1.tar.bz2
[Ada] Prohibit concurrent types in Ghost regions
This patch ensures that single concurrent type declarations are marked as Ghost when they appear within a Ghost region. In addition, the patch verifies that no concurrent type is declared within a Ghost region and issues an error. ------------ -- Source -- ------------ -- types.ads package Types with Ghost is protected Prot_Obj is -- Error end Prot_Obj; protected type Prot_Typ is -- Error end Prot_Typ; task Task_Obj; -- Error task type Task_Typ; -- Error end Types; ---------------------------- -- Compilation and output -- ---------------------------- $ gcc -c types.ads types.ads:2:14: ghost type "Prot_Obj" cannot be concurrent types.ads:5:19: ghost type "Prot_Typ" cannot be concurrent types.ads:8:09: ghost type "Task_Obj" cannot be concurrent types.ads:10:14: ghost type "Task_Typ" cannot be concurrent 2018-01-11 Hristian Kirtchev <kirtchev@adacore.com> gcc/ada/ * freeze.adb (Freeze_Entity): Ensure that a Ghost type is not concurrent, nor effectively volatile. * ghost.adb (Check_Ghost_Type): New routine. * ghost.ads (Check_Ghost_Type): New routine. * sem_util.adb (Is_Declaration): Reimplemented. The routine can now consider specific subsets of declarations. (Is_Declaration_Other_Than_Renaming): Removed. Its functionality is replicated by Is_Declaration. * sem_util.ads (Is_Declaration): New parameter profile. Update the comment on usage. (Is_Declaration_Other_Than_Renaming): Removed. From-SVN: r256521
Diffstat (limited to 'gcc/ada/ghost.adb')
-rw-r--r--gcc/ada/ghost.adb36
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb
index 6dad9c2..5997724 100644
--- a/gcc/ada/ghost.adb
+++ b/gcc/ada/ghost.adb
@@ -806,6 +806,42 @@ package body Ghost is
end if;
end Check_Ghost_Refinement;
+ ----------------------
+ -- Check_Ghost_Type --
+ ----------------------
+
+ procedure Check_Ghost_Type (Typ : Entity_Id) is
+ Conc_Typ : Entity_Id;
+ Full_Typ : Entity_Id;
+
+ begin
+ if Is_Ghost_Entity (Typ) then
+ Conc_Typ := Empty;
+ Full_Typ := Typ;
+
+ if Is_Single_Concurrent_Type (Typ) then
+ Conc_Typ := Anonymous_Object (Typ);
+ Full_Typ := Conc_Typ;
+
+ elsif Is_Concurrent_Type (Typ) then
+ Conc_Typ := Typ;
+ end if;
+
+ -- A Ghost type cannot be concurrent (SPARK RM 6.9(19)). Verify this
+ -- legality rule first to give a finer-grained diagnostic.
+
+ if Present (Conc_Typ) then
+ Error_Msg_N ("ghost type & cannot be concurrent", Conc_Typ);
+ end if;
+
+ -- A Ghost type cannot be effectively volatile (SPARK RM 6.9(7))
+
+ if Is_Effectively_Volatile (Full_Typ) then
+ Error_Msg_N ("ghost type & cannot be volatile", Full_Typ);
+ end if;
+ end if;
+ end Check_Ghost_Type;
+
------------------
-- Ghost_Entity --
------------------