diff --git a/docs/rh-log.txt b/docs/rh-log.txt
index ebf9cb625..c4e79f266 100644
--- a/docs/rh-log.txt
+++ b/docs/rh-log.txt
@@ -1,4 +1,6 @@
 July 31, 2009
+- gdtoa now performs all type aliasing through unions. -Wall has been added
+  to the GCC flags for the library to help verify this.
 - Changed A_SpawnFly to do nothing if reactiontime is 0. Reactiontime was
   originally a counter, so if it started at 0, A_SpawnFly would effectively 
   never spawn anything. Fixes Dehacked patches that use A_SpawnSound to
diff --git a/gdtoa/CMakeLists.txt b/gdtoa/CMakeLists.txt
index 39f199714..9ef4b9c3e 100644
--- a/gdtoa/CMakeLists.txt
+++ b/gdtoa/CMakeLists.txt
@@ -8,6 +8,10 @@ if( MSVC )
 	set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4554 /wd4102" )
 endif( MSVC )
 
+if( CMAKE_COMPILER_IS_GNUCXX )
+	set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
+endif( CMAKE_COMPILER_IS_GNUCXX )
+
 include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
 add_definitions( -DINFNAN_CHECK -DMULTIPLE_THREADS )
 
diff --git a/gdtoa/dtoa.c b/gdtoa/dtoa.c
index b7a0fa57d..4fc6633b7 100644
--- a/gdtoa/dtoa.c
+++ b/gdtoa/dtoa.c
@@ -80,7 +80,7 @@ dtoa
 	(d, mode, ndigits, decpt, sign, rve)
 	double d; int mode, ndigits, *decpt, *sign; char **rve;
 #else
-	(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+	(double _d, int mode, int ndigits, int *decpt, int *sign, char **rve)
 #endif
 {
  /*	Arguments ndigits, decpt, sign are similar to those
@@ -126,7 +126,8 @@ dtoa
 	ULong x;
 #endif
 	Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-	double d2, ds, eps;
+	U d, d2, eps;
+	double ds;
 	char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
 	int rounding;
@@ -142,6 +143,7 @@ dtoa
 		}
 #endif
 
+	dval(d) = _d;
 	if (word0(d) & Sign_bit) {
 		/* set sign for everything, including 0's and NaNs */
 		*sign = 1;
diff --git a/gdtoa/gdtoa.c b/gdtoa/gdtoa.c
index bff00bd3e..7e8d2b2bf 100644
--- a/gdtoa/gdtoa.c
+++ b/gdtoa/gdtoa.c
@@ -158,7 +158,8 @@ gdtoa
 	int rdir, s2, s5, spec_case, try_quick;
 	Long L;
 	Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S;
-	double d, d2, ds, eps;
+	double d2, ds;
+	U d, eps;
 	char *s, *s0;
 
 #ifndef MULTIPLE_THREADS
diff --git a/gdtoa/gdtoaimp.h b/gdtoa/gdtoaimp.h
index 69ae8765f..023d97062 100644
--- a/gdtoa/gdtoaimp.h
+++ b/gdtoa/gdtoaimp.h
@@ -160,11 +160,6 @@ THIS SOFTWARE.
  * #define NO_STRING_H to use private versions of memcpy.
  *	On some K&R systems, it may also be necessary to
  *	#define DECLARE_SIZE_T in this case.
- * #define YES_ALIAS to permit aliasing certain double values with
- *	arrays of ULongs.  This leads to slightly better code with
- *	some compilers and was always used prior to 19990916, but it
- *	is not strictly legal and can cause trouble with aggressively
- *	optimizing compilers (e.g., gcc 2.95.1 under -O2).
  * #define USE_LOCALE to use the current locale's decimal_point value.
  */
 
@@ -289,25 +284,14 @@ extern "C" {
 
 typedef union { double d; ULong L[2]; } U;
 
-#ifdef YES_ALIAS
-#define dval(x) x
 #ifdef IEEE_8087
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
+#define word0(x) x.L[1]
+#define word1(x) x.L[0]
 #else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
+#define word0(x) x.L[0]
+#define word1(x) x.L[1]
 #endif
-#else /* !YES_ALIAS */
-#ifdef IEEE_8087
-#define word0(x) ((U*)&x)->L[1]
-#define word1(x) ((U*)&x)->L[0]
-#else
-#define word0(x) ((U*)&x)->L[0]
-#define word1(x) ((U*)&x)->L[1]
-#endif
-#define dval(x) ((U*)&x)->d
-#endif /* YES_ALIAS */
+#define dval(x)  x.d
 
 /* The following definition of Storeinc is appropriate for MIPS processors.
  * An alternative that might be better on some machines is
diff --git a/gdtoa/misc.c b/gdtoa/misc.c
index 7c7815c36..51f8f52fe 100644
--- a/gdtoa/misc.c
+++ b/gdtoa/misc.c
@@ -617,7 +617,7 @@ b2d
 {
 	ULong *xa, *xa0, w, y, z;
 	int k;
-	double d;
+	U d;
 #ifdef VAX
 	ULong d0, d1;
 #else
@@ -681,7 +681,7 @@ d2b
 #ifdef KR_headers
 	(d, e, bits) double d; int *e, *bits;
 #else
-	(double d, int *e, int *bits)
+	(double _d, int *e, int *bits)
 #endif
 {
 	Bigint *b;
@@ -690,15 +690,20 @@ d2b
 #endif
 	int de, k;
 	ULong *x, y, z;
+	U d;
 #ifdef VAX
 	ULong d0, d1;
-	d0 = word0(d) >> 16 | word0(d) << 16;
-	d1 = word1(d) >> 16 | word1(d) << 16;
 #else
 #define d0 word0(d)
 #define d1 word1(d)
 #endif
 
+	dval(d) = _d;
+#ifdef VAX
+	d0 = word0(d) >> 16 | word0(d) << 16;
+	d1 = word1(d) >> 16 | word1(d) << 16;
+#endif
+
 #ifdef Pack_32
 	b = Balloc(1);
 #else
diff --git a/gdtoa/smisc.c b/gdtoa/smisc.c
index 163011e0a..858024c9e 100644
--- a/gdtoa/smisc.c
+++ b/gdtoa/smisc.c
@@ -77,7 +77,7 @@ ratio
 	(Bigint *a, Bigint *b)
 #endif
 {
-	double da, db;
+	U da, db;
 	int k, ka, kb;
 
 	dval(da) = b2d(a, &ka);
diff --git a/gdtoa/strtod.c b/gdtoa/strtod.c
index ae253739f..1f01921a4 100644
--- a/gdtoa/strtod.c
+++ b/gdtoa/strtod.c
@@ -74,7 +74,8 @@ strtod
 	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
 		 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
 	CONST char *s, *s0, *s1;
-	double aadj, aadj1, adj, rv, rv0;
+	double aadj, adj;
+	U rv, rv0, aadj1;
 	Long L;
 	ULong y, z;
 	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -802,14 +803,14 @@ strtod
 			}
 		if ((aadj = ratio(delta, bs)) <= 2.) {
 			if (dsign)
-				aadj = aadj1 = 1.;
+				aadj = dval(aadj1) = 1.;
 			else if (word1(rv) || word0(rv) & Bndry_mask) {
 #ifndef Sudden_Underflow
 				if (word1(rv) == Tiny1 && !word0(rv))
 					goto undfl;
 #endif
 				aadj = 1.;
-				aadj1 = -1.;
+				dval(aadj1) = -1.;
 				}
 			else {
 				/* special case -- power of FLT_RADIX to be */
@@ -819,12 +820,12 @@ strtod
 					aadj = 1./FLT_RADIX;
 				else
 					aadj *= 0.5;
-				aadj1 = -aadj;
+				dval(aadj1) = -aadj;
 				}
 			}
 		else {
 			aadj *= 0.5;
-			aadj1 = dsign ? aadj : -aadj;
+			dval(aadj1) = dsign ? aadj : -aadj;
 #ifdef Check_FLT_ROUNDS
 			switch(Rounding) {
 				case 2: /* towards +infinity */
@@ -836,7 +837,7 @@ strtod
 				}
 #else
 			if (Flt_Rounds == 0)
-				aadj1 += 0.5;
+				dval(aadj1) += 0.5;
 #endif /*Check_FLT_ROUNDS*/
 			}
 		y = word0(rv) & Exp_mask;
@@ -846,7 +847,7 @@ strtod
 		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
 			dval(rv0) = dval(rv);
 			word0(rv) -= P*Exp_msk1;
-			adj = aadj1 * ulp(dval(rv));
+			adj = dval(aadj1) * ulp(dval(rv));
 			dval(rv) += adj;
 			if ((word0(rv) & Exp_mask) >=
 					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
@@ -866,11 +867,11 @@ strtod
 					if ((z = (ULong)aadj) <= 0)
 						z = 1;
 					aadj = z;
-					aadj1 = dsign ? aadj : -aadj;
+					dval(aadj1) = dsign ? aadj : -aadj;
 					}
 				word0(aadj1) += (2*P+1)*Exp_msk1 - y;
 				}
-			adj = aadj1 * ulp(dval(rv));
+			adj = dval(aadj1) * ulp(dval(rv));
 			dval(rv) += adj;
 #else
 #ifdef Sudden_Underflow
diff --git a/gdtoa/strtodg.c b/gdtoa/strtodg.c
index 68c7533d1..2d154148d 100644
--- a/gdtoa/strtodg.c
+++ b/gdtoa/strtodg.c
@@ -294,10 +294,13 @@ rvOK
 #ifdef KR_headers
 mantbits(d) double d;
 #else
-mantbits(double d)
+mantbits(double _d)
 #endif
 {
 	ULong L;
+	U d;
+
+	dval(d) = _d;
 #ifdef VAX
 	L = word1(d) << 16 | word1(d) >> 16;
 	if (L)
@@ -328,7 +331,8 @@ strtodg
 	int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign;
 	int sudden_underflow;
 	CONST char *s, *s0, *s1;
-	double adj, adj0, rv, tol;
+	double adj0, tol;
+	U adj, rv;
 	Long L;
 	ULong y, z;
 	Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0;
diff --git a/gdtoa/ulp.c b/gdtoa/ulp.c
index 7810a5c8e..27639d19e 100644
--- a/gdtoa/ulp.c
+++ b/gdtoa/ulp.c
@@ -36,12 +36,13 @@ ulp
 #ifdef KR_headers
 	(x) double x;
 #else
-	(double x)
+	(double _x)
 #endif
 {
 	Long L;
-	double a;
+	U x, a;
 
+	dval(x) = _x;
 	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Sudden_Underflow
 	if (L > 0) {
@@ -66,5 +67,5 @@ ulp
 			}
 		}
 #endif
-	return a;
+	return dval(a);
 	}