From 54b358df4c76cbf2f0553360aca63292c421af98 Mon Sep 17 00:00:00 2001 From: charlet Date: Fri, 10 Jul 2009 09:09:59 +0000 Subject: [PATCH] 2009-07-10 Ed Schonberg * sem_prag.adb (Analyze pragma, case Task_Name): Analyze argument of pragma, to capture global references if the context is generic. * exp_ch2.adb (Expand_Discriminant): If a task type discriminant appears within the initialization procedure for the corresponding record, replace it with the proper discriminal. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149459 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/exp_ch2.adb | 13 ++++++++++++- gcc/ada/sem_prag.adb | 6 ++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_ch2.adb b/gcc/ada/exp_ch2.adb index 2963ae8..47b1748 100644 --- a/gcc/ada/exp_ch2.adb +++ b/gcc/ada/exp_ch2.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2008, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2009, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -308,6 +308,17 @@ package body Exp_Ch2 is and then In_Entry then Set_Entity (N, CR_Discriminant (Entity (N))); + + -- Finally, if the entity is the discriminant of the original + -- type declaration, and we are within the initialization + -- procedure for a task, the designated entity is the + -- discriminal of the task body. This can happen when the + -- argument of pragma Task_Name mentions a discriminant, + -- because the pragma is analyzed in the task declaration + -- but is expanded in the call to Create_Task in the init_proc. + + elsif Within_Init_Proc then + Set_Entity (N, Discriminal (CR_Discriminant (Entity (N)))); else Set_Entity (N, Discriminal (Entity (N))); end if; diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 885d1b8..a9ef7d1 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -11248,9 +11248,11 @@ package body Sem_Prag is Arg := Expression (Arg1); -- The expression is used in the call to Create_Task, and must be - -- expanded there, not in the context of the current spec. + -- expanded there, not in the context of the current spec. It must + -- however be analyzed to capture global references, in case it + -- appears in a generic context. - Preanalyze_And_Resolve (New_Copy_Tree (Arg), Standard_String); + Preanalyze_And_Resolve (Arg, Standard_String); if Nkind (P) /= N_Task_Definition then Pragma_Misplaced; -- 2.7.4