Author: ed
Date: Thu Jan  5 12:05:48 2012
New Revision: 229590
URL: http://svn.freebsd.org/changeset/base/229590

Log:
  Make _Complex_I a proper float _Complex when using GCC 4.2.
  
  It turns out our GCC has quite an interesting bug:
  
        typeof(1.0fi) != float _Complex
        typeof((float _Complex)1.0fi) != float _Complex
        typeof((float _Complex)1.0i) == float _Complex
  
  In other words: if casting to an equal size, GCC seems to take a
  shortcut. By casting down from a double to a float, GCC doesn't take
  this shortcut, yielding the proper type.
  
  To prevent foot-shooting, add a _Static_assert() to guarantee that
  _Complex_I is always a float _Complex. I'm not going to MFC this part of
  the diff.
  
  MFC after:    2 weeks

Modified:
  head/include/complex.h

Modified: head/include/complex.h
==============================================================================
--- head/include/complex.h      Thu Jan  5 11:45:22 2012        (r229589)
+++ head/include/complex.h      Thu Jan  5 12:05:48 2012        (r229590)
@@ -29,11 +29,15 @@
 #ifndef _COMPLEX_H
 #define        _COMPLEX_H
 
+#include <sys/cdefs.h>
+
 #ifdef __GNUC__
 #if __STDC_VERSION__ < 199901
 #define        _Complex        __complex__
 #endif
-#define        _Complex_I      1.0fi
+#define        _Complex_I      ((float _Complex)1.0i)
+_Static_assert(__generic(_Complex_I, float _Complex, 1, 0),
+    "_Complex_I must be of type float _Complex");
 #endif
 
 #define        complex         _Complex
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to