Fix G_STMT_START / G_STMT_END on Solaris. (#321972, Andrew Paprocki)
authorMatthias Clasen <mclasen@redhat.com>
Wed, 30 Nov 2005 04:54:57 +0000 (04:54 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 30 Nov 2005 04:54:57 +0000 (04:54 +0000)
2005-11-28  Matthias Clasen  <mclasen@redhat.com>

        Fix G_STMT_START / G_STMT_END on Solaris.  (#321972,
        Andrew Paprocki)

        * configure.in: Check whether do { } while (0) works.

        * glib/gmacros.h: Use do { } while (0) for G_STMT_START /
        G_STMT_END if it works.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
configure.in
glib/gmacros.h

index 45dec332556ef30bcfcc7b7015faa3e8cc58e192..ddd46ce1946f1a0a82dfda3376319ebe62944393 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2005-11-28  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix G_STMT_START / G_STMT_END on Solaris.  (#321972,
+       Andrew Paprocki)
+       
+       * configure.in: Check whether do { } while (0) works.
+
+       * glib/gmacros.h: Use do { } while (0) for G_STMT_START / 
+       G_STMT_END if it works.
+       
 2005-11-28  Matthias Clasen  <mclasen@redhat.com>
 
        * glib/gthread.c (g_static_rw_lock_wait, g_static_rw_lock_signal): 
index 45dec332556ef30bcfcc7b7015faa3e8cc58e192..ddd46ce1946f1a0a82dfda3376319ebe62944393 100644 (file)
@@ -1,3 +1,13 @@
+2005-11-28  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix G_STMT_START / G_STMT_END on Solaris.  (#321972,
+       Andrew Paprocki)
+       
+       * configure.in: Check whether do { } while (0) works.
+
+       * glib/gmacros.h: Use do { } while (0) for G_STMT_START / 
+       G_STMT_END if it works.
+       
 2005-11-28  Matthias Clasen  <mclasen@redhat.com>
 
        * glib/gthread.c (g_static_rw_lock_wait, g_static_rw_lock_signal): 
index 45dec332556ef30bcfcc7b7015faa3e8cc58e192..ddd46ce1946f1a0a82dfda3376319ebe62944393 100644 (file)
@@ -1,3 +1,13 @@
+2005-11-28  Matthias Clasen  <mclasen@redhat.com>
+
+       Fix G_STMT_START / G_STMT_END on Solaris.  (#321972,
+       Andrew Paprocki)
+       
+       * configure.in: Check whether do { } while (0) works.
+
+       * glib/gmacros.h: Use do { } while (0) for G_STMT_START / 
+       G_STMT_END if it works.
+       
 2005-11-28  Matthias Clasen  <mclasen@redhat.com>
 
        * glib/gthread.c (g_static_rw_lock_wait, g_static_rw_lock_signal): 
index 1fc4ea516343c3317be98f9324b0fb4ca37872cb..eb4497adcc4a171a436c5c8d26726082a090137f 100644 (file)
@@ -700,6 +700,21 @@ main (void) {
 }],[g_can_inline=yes],[g_can_inline=no])
 AC_MSG_RESULT($g_can_inline)
 
+dnl *** check for working do while(0) macros ***
+AC_CACHE_CHECK([for working do while(0) macros], g_support_dowhile_macros, [
+       AC_TRY_COMPILE([],[
+       #define STMT_START do
+       #define STMT_END while(0)
+       #define STMT_TEST STMT_START { i = 0; } STMT_END
+       int main(void) { int i = 1; STMT_TEST; return i; }],
+       [g_support_dowhile_macros=yes],
+       [g_support_dowhile_macros=no],
+       [g_support_dowhile_macros=yes])
+])
+if test x$g_support_dowhile_macros = xyes; then
+  AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros])
+fi
+
 # check for flavours of varargs macros
 AC_MSG_CHECKING(for ISO C99 varargs macros in C)
 AC_TRY_COMPILE([],[
index 84e8e10e3893d358540e144b03943236bc3f49b6..21aa46d76fe94d6fe44845eab8ba282045c851c7 100644 (file)
  *  can be used as a single statement, as in
  *  if (x) G_STMT_START { ... } G_STMT_END; else ...
  *
- *  For gcc we will wrap the statements within `({' and `})' braces.
- *  For SunOS they will be wrapped within `if (1)' and `else (void) 0',
- *  and otherwise within `do' and `while (0)'.
+ *  When GCC is compiling C code in non-ANSI mode, it will use the
+ *  compiler __extension__ to wrap the statements wihin `({' and '})' braces.
+ *  When compiling on platforms where configure has defined
+ *  HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'.
+ *  For any other platforms (SunOS4 is known to have this issue), wrap the
+ *  statements with `if (1)' and `else (void) 0'.
  */
 #if !(defined (G_STMT_START) && defined (G_STMT_END))
-#  if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
-#    define G_STMT_START       (void) __extension__ (
-#    define G_STMT_END         )
-#  else
-#    if (defined (sun) || defined (__sun__))
-#      define G_STMT_START     if (1)
-#      define G_STMT_END       else (void)0
-#    else
-#      define G_STMT_START     do
-#      define G_STMT_END       while (0)
-#    endif
-#  endif
+# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
+#  define G_STMT_START (void) __extension__ (
+#  define G_STMT_END )
+# else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
+#  if defined (HAVE_DOWHILE_MACROS)
+#   define G_STMT_START do
+#   define G_STMT_END while (0)
+#  else /* !HAVE_DOWHILE_MACROS */
+#   define G_STMT_START if (1)
+#   define G_STMT_END else (void) 0
+#  endif /* !HAVE_DOWHILE_MACROS */
+# endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
 #endif
 
 /* Allow the app programmer to select whether or not return values