Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 6 May 2004 18:58:29 +0000 (18:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 6 May 2004 18:58:29 +0000 (18:58 +0000)
2004-05-06  Ulrich Drepper  <drepper@redhat.com>

* math/tgmath.h (__TGMATH_UNARY_REAL_IMAG_RET_REAL):Define.
(cimag): Use it.
(creal): Likewise.
* math/Makefile (tests): Add bug-tgmath1.
* math/bug-tgmath1.c: New file.

ChangeLog
math/Makefile
math/bug-tgmath1.c [new file with mode: 0644]
math/tgmath.h

index 04f4aad..ab752fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-05-06  Ulrich Drepper  <drepper@redhat.com>
+
+       * math/tgmath.h (__TGMATH_UNARY_REAL_IMAG_RET_REAL):Define.
+       (cimag): Use it.
+       (creal): Likewise.
+       * math/Makefile (tests): Add bug-tgmath1.
+       * math/bug-tgmath1.c: New file.
+
 2004-05-05  Jakub Jelinek  <jakub@redhat.com>
 
        * sysdeps/alpha/atomicity.h: Remove.
index 6a9134b..c4501b8 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -89,7 +89,7 @@ distribute += $(filter-out $(generated),$(long-m-yes:=.c) $(long-c-yes:=.c))
 # Rules for the test suite.
 tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
        test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
-       bug-nextafter bug-nexttoward
+       bug-nextafter bug-nexttoward bug-tgmath1
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl
diff --git a/math/bug-tgmath1.c b/math/bug-tgmath1.c
new file mode 100644 (file)
index 0000000..8a457fa
--- /dev/null
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <tgmath.h>
+
+
+int
+main (void)
+{
+  int retval = 0;
+
+#define TEST(expr, res) \
+  if (sizeof (expr) != res)                                                  \
+    {                                                                        \
+      printf ("sizeof(%s) == %zu, expected %zu\n", #expr,                    \
+             sizeof (expr), (size_t) (res));                                 \
+      retval = 1;                                                                    \
+    }
+
+  TEST (creal (1.0), sizeof (double));
+  TEST (creal (1.0 + 1.0i), sizeof (double));
+  TEST (creal (1.0l), sizeof (long double));
+  TEST (creal (1.0l + 1.0li), sizeof (long double));
+  TEST (creal (1.0f), sizeof (float));
+  TEST (creal (1.0f + 1.0fi), sizeof (float));
+
+  TEST (cimag (1.0), sizeof (double));
+  TEST (cimag (1.0 + 1.0i), sizeof (double));
+  TEST (cimag (1.0l), sizeof (long double));
+  TEST (cimag (1.0l + 1.0li), sizeof (long double));
+  TEST (cimag (1.0f), sizeof (float));
+  TEST (cimag (1.0f + 1.0fi), sizeof (float));
+
+  return retval;
+}
index 168b262..0202e10 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 
 /* XXX This definition has to be changed as soon as the compiler understands
    the imaginary keyword.  */
+# define __TGMATH_UNARY_REAL_IMAG_RET_REAL(Val, Fct, Cfct) \
+     (__extension__ ({ __tgmath_real_type (Val) __tgmres;                    \
+                      if (sizeof (__real__ (Val)) > sizeof (double)          \
+                          && __builtin_classify_type (__real__ (Val)) == 8)  \
+                        {                                                    \
+                          if (sizeof (__real__ (Val)) == sizeof (Val))       \
+                            __tgmres = __tgml(Fct) (Val);                    \
+                          else                                               \
+                            __tgmres = __tgml(Cfct) (Val);                   \
+                        }                                                    \
+                      else if (sizeof (__real__ (Val)) == sizeof (double)    \
+                               || __builtin_classify_type (__real__ (Val))   \
+                                  != 8)                                      \
+                        {                                                    \
+                          if (sizeof (__real__ (Val)) == sizeof (Val))       \
+                            __tgmres = Fct (Val);                            \
+                          else                                               \
+                            __tgmres = Cfct (Val);                           \
+                        }                                                    \
+                      else                                                   \
+                        {                                                    \
+                          if (sizeof (__real__ (Val)) == sizeof (Val))       \
+                            __tgmres = Fct##f (Val);                         \
+                          else                                               \
+                            __tgmres = Cfct##f (Val);                        \
+                        }                                                    \
+                      __real__ __tgmres; }))
+
+/* XXX This definition has to be changed as soon as the compiler understands
+   the imaginary keyword.  */
 # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
      (__extension__ ({ __tgmath_real_type ((Val1) + (Val2)) __tgmres;        \
                       if ((sizeof (__real__ (Val1)) > sizeof (double)        \
 /* Decomposing complex values.  */
 
 /* Imaginary part of Z.  */
-#define cimag(Val) __TGMATH_UNARY_REAL_IMAG (Val, cimag, cimag)
+#define cimag(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, cimag, cimag)
 
 /* Real part of Z.  */
-#define creal(Val) __TGMATH_UNARY_REAL_IMAG (Val, creal, creal)
+#define creal(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, creal, creal)
 
 #endif /* tgmath.h */