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