aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2019-08-14 09:50:46 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-08-14 09:50:46 +0000
commit27de857e21ff577d5b478f3c98e4f3a8ca3b51b3 (patch)
treec163a22dde0f76585b0540f4e0a30a9c9d966784 /gcc
parentbc1f44ef8f87228591b7ecd74dac324812c0ff47 (diff)
downloadgcc-27de857e21ff577d5b478f3c98e4f3a8ca3b51b3.zip
gcc-27de857e21ff577d5b478f3c98e4f3a8ca3b51b3.tar.gz
gcc-27de857e21ff577d5b478f3c98e4f3a8ca3b51b3.tar.bz2
[Ada] Illegal selection of first object in a task type's body not detected
The compiler was improperly allowing selection of an object declared within a task body when the prefix was of the task type, specifically in the case where the object was the very first declared in the body (selections of later body declarations were being flagged). The flag Is_Private_Op was only set at the point of the first "private" declaration of the type in cases where the first declaration's name didn't match the selector. 2019-08-14 Gary Dismukes <dismukes@adacore.com> gcc/ada/ * sem_ch4.adb (Analyze_Selected_Component): In the case where the prefix is of a concurrent type, and the selected entity matching the selector is the first private declaration of the type (such as the first local variable in a task's body), set Is_Private_Op. gcc/testsuite/ * gnat.dg/task5.adb: New testcase. From-SVN: r274446
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/sem_ch4.adb10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/task5.adb26
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 937cecc..8ad1983 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,11 @@
+2019-08-14 Gary Dismukes <dismukes@adacore.com>
+
+ * sem_ch4.adb (Analyze_Selected_Component): In the case where
+ the prefix is of a concurrent type, and the selected entity
+ matching the selector is the first private declaration of the
+ type (such as the first local variable in a task's body), set
+ Is_Private_Op.
+
2019-08-14 Piotr Trojanek <trojanek@adacore.com>
* einfo.adb (Is_Generic_Actual_Subprogram): Replace repeated
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 6272578..16614ed 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -4994,7 +4994,15 @@ package body Sem_Ch4 is
if Comp = First_Private_Entity (Type_To_Use) then
if Etype (Sel) /= Any_Type then
- -- We have a candiate
+ -- If the first private entity's name matches, then treat
+ -- it as a private op: needed for the error check for
+ -- illegal selection of private entities further below.
+
+ if Chars (Comp) = Chars (Sel) then
+ Is_Private_Op := True;
+ end if;
+
+ -- We have a candidate, so exit the loop
exit;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1b42e8d..0c6852b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-08-14 Gary Dismukes <dismukes@adacore.com>
+
+ * gnat.dg/task5.adb: New testcase.
+
2019-08-14 Richard Biener <rguenther@suse.de>
PR testsuite/91419
diff --git a/gcc/testsuite/gnat.dg/task5.adb b/gcc/testsuite/gnat.dg/task5.adb
new file mode 100644
index 0000000..cc8ec63
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task5.adb
@@ -0,0 +1,26 @@
+procedure Task5 is
+
+ task type T is
+ entry E (V1, V2 : Integer);
+ end T;
+
+ T_Obj : T;
+
+ task body T is
+ V1 : Integer;
+ V2 : Integer;
+ V3 : Integer;
+ begin
+ accept E (V1, V2 : Integer) do
+ T.V1 := V1;
+ T.V2 := V2;
+
+ T_Obj.V1 := V1; -- { dg-error "invalid reference to private operation of some object of type \"T\"" }
+ T_Obj.V2 := V2; -- { dg-error "invalid reference to private operation of some object of type \"T\"" }
+ T_Obj.V3 := V3; -- { dg-error "invalid reference to private operation of some object of type \"T\"" }
+ end E;
+ end T;
+
+begin
+ null;
+end Task5;