From 56272abec68769b5638003ec3227a8097a60b321 Mon Sep 17 00:00:00 2001
From: Arnaud Charlet <charlet@gcc.gnu.org>
Date: Mon, 21 Nov 2011 12:40:32 +0100
Subject: [PATCH] [multiple changes]

2011-11-21  Pascal Obry  <obry@adacore.com>

	* s-taprop-linux.adb (Initialize_Lock): Do not allocate a cond
	attribute as not needed.

2011-11-21  Robert Dewar  <dewar@adacore.com>

	* sem_prag.adb: Minor reformatting.

2011-11-21  Pascal Obry  <obry@adacore.com>

	* gnat_rm.texi: Document restriction for stdcall convention on
	dispatching calls.

From-SVN: r181565
---
 gcc/ada/ChangeLog          | 14 ++++++++++++++
 gcc/ada/gnat_rm.texi       |  3 ++-
 gcc/ada/s-taprop-linux.adb |  8 ++------
 gcc/ada/sem_prag.adb       | 14 +++++++++++++-
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index c0efe1b00439..4ba28bdbdefe 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,17 @@
+2011-11-21  Pascal Obry  <obry@adacore.com>
+
+	* s-taprop-linux.adb (Initialize_Lock): Do not allocate a cond
+	attribute as not needed.
+
+2011-11-21  Robert Dewar  <dewar@adacore.com>
+
+	* sem_prag.adb: Minor reformatting.
+
+2011-11-21  Pascal Obry  <obry@adacore.com>
+
+	* gnat_rm.texi: Document restriction for stdcall convention on
+	dispatching calls.
+
 2011-11-21  Pascal Obry  <obry@adacore.com>
 
 	* sem_prag.adb (Process_Convention): A dispatching call cannot
diff --git a/gcc/ada/gnat_rm.texi b/gcc/ada/gnat_rm.texi
index 2d342c347bc7..00e0543e3d8d 100644
--- a/gcc/ada/gnat_rm.texi
+++ b/gcc/ada/gnat_rm.texi
@@ -9633,7 +9633,8 @@ separate section on Intrinsic Subprograms.
 @item Stdcall
 Stdcall (used for Windows implementations only).  This convention correspond
 to the WINAPI (previously called Pascal convention) C/C++ convention under
-Windows.  A function with this convention cleans the stack before exit.
+Windows.  A routine with this convention cleans the stack before
+exit. This pragma cannot be applied to a dispatching call.
 @item DLL
 Synonym for Stdcall
 @item Win32
diff --git a/gcc/ada/s-taprop-linux.adb b/gcc/ada/s-taprop-linux.adb
index 70f2d1435451..6773aaa1a546 100644
--- a/gcc/ada/s-taprop-linux.adb
+++ b/gcc/ada/s-taprop-linux.adb
@@ -1069,8 +1069,7 @@ package body System.Task_Primitives.Operations is
    ----------------
 
    procedure Initialize (S : in out Suspension_Object) is
-      Cond_Attr : aliased pthread_condattr_t;
-      Result    : Interfaces.C.int;
+      Result : Interfaces.C.int;
 
    begin
       --  Initialize internal state (always to False (RM D.10(6)))
@@ -1090,10 +1089,7 @@ package body System.Task_Primitives.Operations is
 
       --  Initialize internal condition variable
 
-      Result := pthread_condattr_init (Cond_Attr'Access);
-      pragma Assert (Result = 0);
-
-      Result := pthread_cond_init (S.CV'Access, Cond_Attr'Access);
+      Result := pthread_cond_init (S.CV'Access, null);
 
       pragma Assert (Result = 0 or else Result = ENOMEM);
 
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 9ba21291b856..5211d88815d6 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -3524,13 +3524,25 @@ package body Sem_Prag is
               ("second argument of pragma% must be a subprogram", Arg2);
          end if;
 
-         --  For Stdcall, a subprogram, variable or subprogram type is required
+         --  Stdcall case
 
          if C = Convention_Stdcall
+
+            --  Subprogram is allowed, but not a generic subprogram, and not a
+            --  dispatching operation. A dispatching subprogram cannot be used
+            --  to interface to the Win32 API, so in fact this check does not
+            --  impose any effective restriction.
+
            and then
              ((not Is_Subprogram (E) and then not Is_Generic_Subprogram (E))
                 or else Is_Dispatching_Operation (E))
+
+            --  A variable is OK
+
            and then Ekind (E) /= E_Variable
+
+           --  An access to subprogram is also allowed
+
            and then not
              (Is_Access_Type (E)
                and then Ekind (Designated_Type (E)) = E_Subprogram_Type)
-- 
GitLab