fix a bunch of warnings (actual issues) reported by Frank
diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h
index 8a49dca..be64acc 100644
--- a/Eigen/src/Core/arch/SSE/PacketMath.h
+++ b/Eigen/src/Core/arch/SSE/PacketMath.h
@@ -37,6 +37,10 @@
 template<> struct ei_unpacket_traits<__m128d> { typedef double type; enum {size=2}; };
 template<> struct ei_unpacket_traits<__m128i> { typedef int    type; enum {size=4}; };
 
+template<> EIGEN_STRONG_INLINE __m128  ei_pset1<float>(const float&  from) { return _mm_set1_ps(from); }
+template<> EIGEN_STRONG_INLINE __m128d ei_pset1<double>(const double& from) { return _mm_set1_pd(from); }
+template<> EIGEN_STRONG_INLINE __m128i ei_pset1<int>(const int&    from) { return _mm_set1_epi32(from); }
+
 template<> EIGEN_STRONG_INLINE __m128  ei_padd<__m128>(const __m128&  a, const __m128&  b) { return _mm_add_ps(a,b); }
 template<> EIGEN_STRONG_INLINE __m128d ei_padd<__m128d>(const __m128d& a, const __m128d& b) { return _mm_add_pd(a,b); }
 template<> EIGEN_STRONG_INLINE __m128i ei_padd<__m128i>(const __m128i& a, const __m128i& b) { return _mm_add_epi32(a,b); }
@@ -63,7 +67,7 @@
 template<> EIGEN_STRONG_INLINE __m128d ei_pdiv<__m128d>(const __m128d& a, const __m128d& b) { return _mm_div_pd(a,b); }
 template<> EIGEN_STRONG_INLINE __m128i ei_pdiv<__m128i>(const __m128i& /*a*/, const __m128i& /*b*/)
 { ei_assert(false && "packet integer division are not supported by SSE");
-  __m128i dummy;
+  __m128i dummy = ei_pset1<int>(0);
   return dummy;
 }
 
@@ -102,10 +106,6 @@
 template<> EIGEN_STRONG_INLINE __m128d ei_ploadu<double>(const double*  from) { return _mm_loadu_pd(from); }
 template<> EIGEN_STRONG_INLINE __m128i ei_ploadu<int>(const int* from) { return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from)); }
 
-template<> EIGEN_STRONG_INLINE __m128  ei_pset1<float>(const float&  from) { return _mm_set1_ps(from); }
-template<> EIGEN_STRONG_INLINE __m128d ei_pset1<double>(const double& from) { return _mm_set1_pd(from); }
-template<> EIGEN_STRONG_INLINE __m128i ei_pset1<int>(const int&    from) { return _mm_set1_epi32(from); }
-
 template<> EIGEN_STRONG_INLINE void ei_pstore<float>(float*  to, const __m128&  from) { _mm_store_ps(to, from); }
 template<> EIGEN_STRONG_INLINE void ei_pstore<double>(double* to, const __m128d& from) { _mm_store_pd(to, from); }
 template<> EIGEN_STRONG_INLINE void ei_pstore<int>(int*    to, const __m128i& from) { _mm_store_si128(reinterpret_cast<__m128i*>(to), from); }
diff --git a/test/lu.cpp b/test/lu.cpp
index fdc10e2..6147419 100644
--- a/test/lu.cpp
+++ b/test/lu.cpp
@@ -28,9 +28,10 @@
 template<typename Derived>
 void doSomeRankPreservingOperations(Eigen::MatrixBase<Derived>& m)
 {
+  typedef typename Derived::RealScalar RealScalar;
   for(int a = 0; a < 3*(m.rows()+m.cols()); a++)
   {
-    double d = Eigen::ei_random<double>(-1,1);
+    RealScalar d = Eigen::ei_random<RealScalar>(-1,1);
     int i = Eigen::ei_random<int>(0,m.rows()-1); // i is a random row number
     int j;
     do {
diff --git a/test/meta.cpp b/test/meta.cpp
index 864d806..e77e46b 100644
--- a/test/meta.cpp
+++ b/test/meta.cpp
@@ -45,9 +45,7 @@
 
   VERIFY(( ei_is_same_type<float*,ei_unconst<const float*>::type >::ret));
   VERIFY(( ei_is_same_type<float&,ei_unconst<const float&>::type >::ret));
-  VERIFY(( ei_is_same_type<float&,ei_unconst<const FloatRef>::type >::ret));
   VERIFY(( ei_is_same_type<float&,ei_unconst<ConstFloatRef>::type >::ret));
-  VERIFY(( ei_is_same_type<float&,ei_unconst<const ConstFloatRef>::type >::ret));
   
   VERIFY(( ei_is_same_type<float&,ei_unconst<float&>::type >::ret));
   VERIFY(( ei_is_same_type<float,ei_unref<float&>::type >::ret));
diff --git a/test/nomalloc.cpp b/test/nomalloc.cpp
index 82119e9..5497ca3 100644
--- a/test/nomalloc.cpp
+++ b/test/nomalloc.cpp
@@ -24,7 +24,9 @@
 // Eigen. If not, see <http://www.gnu.org/licenses/>.
 
 // this hack is needed to make this file compiles with -pedantic (gcc)
+#ifdef __GNUC__
 #define throw(X)
+#endif
 // discard stack allocation as that too bypasses malloc
 #define EIGEN_STACK_ALLOCATION_LIMIT 0
 // any heap allocation will raise an assert
diff --git a/test/sum.cpp b/test/sum.cpp
index c136518..fe707e9 100644
--- a/test/sum.cpp
+++ b/test/sum.cpp
@@ -34,7 +34,7 @@
   MatrixType m1 = MatrixType::Random(rows, cols);
 
   VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1));
-  VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(rows*cols));
+  VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy
   Scalar x = Scalar(0);
   for(int i = 0; i < rows; i++) for(int j = 0; j < cols; j++) x += m1(i,j);
   VERIFY_IS_APPROX(m1.sum(), x);