svn commit: r229590 - head/include

Ed Schouten ed at FreeBSD.org
Thu Jan 5 12:05:49 UTC 2012


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


More information about the svn-src-head mailing list