fix pexp_complex_test
diff --git a/test/packetmath.cpp b/test/packetmath.cpp
index c5e4897..e6f4a67 100644
--- a/test/packetmath.cpp
+++ b/test/packetmath.cpp
@@ -1332,6 +1332,52 @@
   VERIFY(test::areApprox(ref, pval, PacketSize) && "conj_helper pmadd");
 }
 
+template <typename Scalar, typename Packet, bool HasExp = internal::packet_traits<Scalar>::HasExp>
+struct exp_complex_test_impl {
+  typedef typename Scalar::value_type RealScalar;
+  static void run(Scalar* data1, Scalar* data2, Scalar* ref, Index size) {
+    const int PacketSize = internal::unpacket_traits<Packet>::size;
+
+    for (int i = 0; i < size; ++i) {
+      data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>());
+    }
+    CHECK_CWISE1_N(std::exp, internal::pexp, size);
+
+    // Test misc. corner cases.
+    const RealScalar zero = RealScalar(0);
+    const RealScalar one = RealScalar(1);
+    const RealScalar inf = std::numeric_limits<RealScalar>::infinity();
+    const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN();
+    for (RealScalar x : {zero, one, inf}) {
+      for (RealScalar y : {zero, one, inf}) {
+        data1[0] = Scalar(x, y);
+        data1[1] = Scalar(-x, y);
+        data1[2] = Scalar(x, -y);
+        data1[3] = Scalar(-x, -y);
+        CHECK_CWISE1_N(std::exp, internal::pexp, 4);
+      }
+    }
+    for (RealScalar x : {zero, one, inf}) {
+      data1[0] = Scalar(x, nan);
+      data1[1] = Scalar(-x, nan);
+      data1[2] = Scalar(nan, x);
+      data1[3] = Scalar(nan, -x);
+      CHECK_CWISE1_N(std::exp, internal::pexp, 4);
+    }
+  }
+};
+
+template <typename Scalar, typename Packet>
+struct exp_complex_test_impl<Scalar, Packet, false> {
+  typedef typename Scalar::value_type RealScalar;
+  static void run(Scalar*, Scalar*, Scalar*, Index){};
+};
+
+template <typename Scalar, typename Packet>
+void exp_complex_test(Scalar* data1, Scalar* data2, Scalar* ref, Index size) {
+  exp_complex_test_impl<Scalar, Packet>::run(data1, data2, ref, size);
+}
+
 template <typename Scalar, typename Packet>
 void packetmath_complex() {
   typedef internal::packet_traits<Scalar> PacketTraits;
@@ -1447,35 +1493,7 @@
     data1[3] = Scalar(nan, -inf);
     CHECK_CWISE1_IM1ULP_N(std::log, internal::plog, 4);
   }
-
-  if (PacketTraits::HasExp) {
-    for (int i = 0; i < size; ++i) {
-      data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>());
-    }
-    CHECK_CWISE1_N(std::exp, internal::pexp, size);
-
-    // Test misc. corner cases.
-    const RealScalar zero = RealScalar(0);
-    const RealScalar one = RealScalar(1);
-    const RealScalar inf = std::numeric_limits<RealScalar>::infinity();
-    const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN();
-    for (RealScalar x : {zero, one, inf}) {
-      for (RealScalar y : {zero, one, inf}) {
-        data1[0] = Scalar(x, y);
-        data1[1] = Scalar(-x, y);
-        data1[2] = Scalar(x, -y);
-        data1[3] = Scalar(-x, -y);
-        CHECK_CWISE1_N(std::exp, internal::pexp, 4);
-      }
-    }
-    for (RealScalar x : {zero, one, inf}) {
-      data1[0] = Scalar(x, nan);
-      data1[1] = Scalar(-x, nan);
-      data1[2] = Scalar(nan, x);
-      data1[3] = Scalar(nan, -x);
-      CHECK_CWISE1_N(std::exp, internal::pexp, 4);
-    }
-  }
+  exp_complex_test<Scalar, Packet>(data1, data2, ref, size);
 }
 
 template <typename Scalar, typename Packet>