Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision c821184900f17ef522a28aef06369f66ec1d6e4c)
+++ uspace/lib/c/generic/async.c	(revision 86bbca413cd4472a041d8633c827dff484ee576a)
@@ -2123,7 +2123,11 @@
 
 static int async_connect_me_to_internal(int phone, sysarg_t arg1, sysarg_t arg2,
-    sysarg_t arg3, sysarg_t arg4)
+    sysarg_t arg3, sysarg_t arg4, int *out_phone)
 {
 	ipc_call_t result;
+	
+	// XXX: Workaround for GCC's inability to infer association between
+	// rc == EOK and *out_phone being assigned.
+	*out_phone = -1;
 	
 	amsg_t *msg = amsg_create();
@@ -2143,5 +2147,6 @@
 		return rc;
 	
-	return (int) IPC_GET_ARG5(result);
+	*out_phone = (int) IPC_GET_ARG5(result);
+	return EOK;
 }
 
@@ -2173,8 +2178,9 @@
 	}
 	
-	int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3,
-	    0);
-	if (phone < 0) {
-		errno = phone;
+	int phone;
+	int rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3,
+	    0, &phone);
+	if (rc != EOK) {
+		errno = rc;
 		free(sess);
 		return NULL;
@@ -2225,8 +2231,9 @@
 	}
 	
-	int phone = async_connect_me_to_internal(exch->phone, iface, arg2,
-	    arg3, 0);
-	if (phone < 0) {
-		errno = phone;
+	int phone;
+	int rc = async_connect_me_to_internal(exch->phone, iface, arg2,
+	    arg3, 0, &phone);
+	if (rc != EOK) {
+		errno = rc;
 		free(sess);
 		return NULL;
@@ -2295,9 +2302,10 @@
 	}
 	
-	int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3,
-	    IPC_FLAG_BLOCKING);
-	
-	if (phone < 0) {
-		errno = phone;
+	int phone;
+	int rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3,
+	    IPC_FLAG_BLOCKING, &phone);
+	
+	if (rc != EOK) {
+		errno = rc;
 		free(sess);
 		return NULL;
@@ -2348,8 +2356,9 @@
 	}
 	
-	int phone = async_connect_me_to_internal(exch->phone, iface, arg2,
-	    arg3, IPC_FLAG_BLOCKING);
-	if (phone < 0) {
-		errno = phone;
+	int phone;
+	int rc = async_connect_me_to_internal(exch->phone, iface, arg2,
+	    arg3, IPC_FLAG_BLOCKING, &phone);
+	if (rc != EOK) {
+		errno = rc;
 		free(sess);
 		return NULL;
@@ -2502,4 +2511,5 @@
 		} else if (mgmt == EXCHANGE_PARALLEL) {
 			int phone;
+			int rc;
 			
 		retry:
@@ -2507,7 +2517,7 @@
 			 * Make a one-time attempt to connect a new data phone.
 			 */
-			phone = async_connect_me_to_internal(sess->phone, sess->arg1,
-			    sess->arg2, sess->arg3, 0);
-			if (phone >= 0) {
+			rc = async_connect_me_to_internal(sess->phone, sess->arg1,
+			    sess->arg2, sess->arg3, 0, &phone);
+			if (rc == EOK) {
 				exch = (async_exch_t *) malloc(sizeof(async_exch_t));
 				if (exch != NULL) {
