[GCC>=2.6] (__WAIT_STATUS): Define this with typedef as a union with the
authorroland <roland>
Fri, 19 Aug 1994 21:55:15 +0000 (21:55 +0000)
committerroland <roland>
Fri, 19 Aug 1994 21:55:15 +0000 (21:55 +0000)
new (GCC 2.6.1) `transparent_union' attribute.

posix/sys/wait.h

index af13482..979aa08 100644 (file)
@@ -46,19 +46,22 @@ __BEGIN_DECLS
 #define        __WAIT_INT(status)      (*(int *) &(status))
 #endif
 
-/* This is the type of the argument to `wait'.  With GCC 2.4 and later, the
-   funky union causes redeclarations with either `int *' or `union wait *'
-   to be allowed without complaint.  (__GNUC_MINOR__ is in fact only
-   defined in later versions, after 2.5.0; and versions prior to 2.6 have a
-   bug that produces bad code on some machines when using the union.)
-   __WAIT_STATUS_DEFN is the type used in the actual function definitions. */
+/* This is the type of the argument to `wait'.  With GCC 2.6.1 and later,
+   the funky union causes redeclarations with either `int *' or `union wait
+   *' to be allowed without complaint.  __WAIT_STATUS_DEFN is the type used
+   in the actual function definitions. */
 
 #if    (!defined (__GNUC__) || __GNUC__ < 2 || \
         (__GNUC__ == 2 && __GNUC_MINOR__ < 6))
 #define        __WAIT_STATUS           __ptr_t
 #define        __WAIT_STATUS_DEFN      __ptr_t
 #else
-#define        __WAIT_STATUS           union { union wait *__uptr; int *__iptr; }
+/* This works in GCC 2.6.1 and later.  */
+typedef union
+  {
+    union wait *__uptr;
+    int *__iptr;
+  } __attribute__ ((transparent_union)) __WAIT_STATUS;
 #define        __WAIT_STATUS_DEFN      int *
 #endif