Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Jan 2012 12:05:48 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r229590 - head/include
Message-ID:  <201201051205.q05C5mOG034365@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201051205.q05C5mOG034365>