diff --git a/contrib/fortran-to-opencl/translate.py b/contrib/fortran-to-opencl/translate.py
index 00397bc153de52c4cf3e772516417ca809a2a83f..4c3486f4d52c135aacd2a915c90089fd71e8acb2 100644
--- a/contrib/fortran-to-opencl/translate.py
+++ b/contrib/fortran-to-opencl/translate.py
@@ -43,6 +43,15 @@ class TranslationError(RuntimeError):
     pass
 
 
+def complex_type_name(dtype):
+    if dtype == np.complex64:
+        return "cfloat"
+    if dtype == np.complex128:
+        return "cdouble"
+    else:
+        raise RuntimeError
+
+
 # {{{ AST components
 
 def dtype_to_ctype(dtype):
@@ -329,14 +338,6 @@ class ComplexCCodeMapper(CCodeMapperBase):
         CCodeMapperBase.__init__(self)
         self.infer_type = infer_type
 
-    def complex_type_name(self, dtype):
-        if dtype == np.complex64:
-            return "cfloat"
-        if dtype == np.complex128:
-            return "cdouble"
-        else:
-            raise RuntimeError
-
     def map_sum(self, expr, enclosing_prec):
         tgt_dtype = self.infer_type(expr)
         is_complex = tgt_dtype.kind == 'c'
@@ -344,7 +345,7 @@ class ComplexCCodeMapper(CCodeMapperBase):
         if not is_complex:
             return CCodeMapperBase.map_sum(self, expr, enclosing_prec)
         else:
-            tgt_name = self.complex_type_name(tgt_dtype)
+            tgt_name = complex_type_name(tgt_dtype)
 
             reals = [child for child in expr.children
                     if 'c' != self.infer_type(child).kind]
@@ -380,7 +381,7 @@ class ComplexCCodeMapper(CCodeMapperBase):
         if not is_complex:
             return CCodeMapperBase.map_product(self, expr, enclosing_prec)
         else:
-            tgt_name = self.complex_type_name(tgt_dtype)
+            tgt_name = complex_type_name(tgt_dtype)
 
             reals = [child for child in expr.children
                     if 'c' != self.infer_type(child).kind]
@@ -419,17 +420,17 @@ class ComplexCCodeMapper(CCodeMapperBase):
             return CCodeMapperBase.map_quotient(self, expr, enclosing_prec)
         elif n_complex and not d_complex:
             return "%s_divider(%s, %s)" % (
-                    self.complex_type_name(tgt_dtype),
+                    complex_type_name(tgt_dtype),
                     self.rec(expr.numerator, PREC_NONE),
                     self.rec(expr.denominator, PREC_NONE))
         elif not n_complex and d_complex:
             return "%s_rdivide(%s, %s)" % (
-                    self.complex_type_name(tgt_dtype),
+                    complex_type_name(tgt_dtype),
                     self.rec(expr.numerator, PREC_NONE),
                     self.rec(expr.denominator, PREC_NONE))
         else:
             return "%s_divide(%s, %s)" % (
-                    self.complex_type_name(tgt_dtype),
+                    complex_type_name(tgt_dtype),
                     self.rec(expr.numerator, PREC_NONE),
                     self.rec(expr.denominator, PREC_NONE))
 
@@ -456,12 +457,12 @@ class ComplexCCodeMapper(CCodeMapperBase):
 
                 if b_complex and not e_complex:
                     return "%s_powr(%s, %s)" % (
-                            self.complex_type_name(tgt_dtype),
+                            complex_type_name(tgt_dtype),
                             self.rec(expr.base, PREC_NONE),
                             self.rec(expr.exponent, PREC_NONE))
                 else:
                     return "%s_pow(%s, %s)" % (
-                            self.complex_type_name(tgt_dtype),
+                            complex_type_name(tgt_dtype),
                             self.rec(expr.base, PREC_NONE),
                             self.rec(expr.exponent, PREC_NONE))
 
@@ -518,7 +519,7 @@ class CCodeMapper(ComplexCCodeMapper):
                 name = "real"
 
             name = "%s_%s" % (
-                    self.complex_type_name(tgt_dtype),
+                    complex_type_name(tgt_dtype),
                     name)
 
         elif name in ["aimag", "real", "imag"] and tgt_dtype.kind == "f":
@@ -528,14 +529,14 @@ class CCodeMapper(ComplexCCodeMapper):
                 name = "imag"
 
             name = "%s_%s" % (
-                    self.complex_type_name(arg_dtype),
+                    complex_type_name(arg_dtype),
                     name)
 
         elif 'c' == tgt_dtype.kind and name == "abs":
             arg_dtype, = arg_dtypes
 
             name = "%s_abs" % (
-                    self.complex_type_name(arg_dtype))
+                    complex_type_name(arg_dtype))
 
         return self.format("%s(%s)",
                 name,
@@ -563,7 +564,10 @@ class CCodeMapper(ComplexCCodeMapper):
         from pymbolic.mapper.stringifier import PREC_NONE
         if expr.dtype.kind == "c":
             r, i = expr.value
-            return "{ %s, %s }" % (self.rec(r, PREC_NONE), self.rec(i, PREC_NONE))
+            return "%s_new(%s, %s)" % (
+                    complex_type_name(expr.dtype),
+                    self.rec(r, PREC_NONE),
+                    self.rec(i, PREC_NONE))
         else:
             return expr.value
 
diff --git a/pyopencl/cl/pyopencl-bessel-j-complex.cl b/pyopencl/cl/pyopencl-bessel-j-complex.cl
index 0a5492aa6fc774d43c93ccf79f5597d6d79ddb7a..99592828adf23f5bcf12a6a18b2c2d14941f3c82 100644
--- a/pyopencl/cl/pyopencl-bessel-j-complex.cl
+++ b/pyopencl/cl/pyopencl-bessel-j-complex.cl
@@ -72,12 +72,12 @@ void bessel_j_complex(int v, cdouble_t z, cdouble_t *j_v, cdouble_t *j_vp1)
   {
     if (v == 0)
     {
-      *j_v = (cdouble_t)(1,0);
-      *j_vp1 = 0;
+      *j_v = cdouble_new(1, 0);
+      *j_vp1 = cdouble_new(0, 0);
     } else
     {
-      *j_v = 0;
-      *j_vp1 = 0;
+      *j_v = cdouble_new(0, 0);
+      *j_vp1 = cdouble_new(0, 0);
     }
     return;
   }
diff --git a/pyopencl/cl/pyopencl-hankel-complex.cl b/pyopencl/cl/pyopencl-hankel-complex.cl
index 0c5917a61cf9ce4bca4bdb2795e3e0d38d92ee5a..3115b8de42ae1ccaf608d89f4685365657123a98 100644
--- a/pyopencl/cl/pyopencl-hankel-complex.cl
+++ b/pyopencl/cl/pyopencl-hankel-complex.cl
@@ -76,7 +76,7 @@ void hankel_01_complex(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon)
   cdouble_t h1u;
   double half_;
   int ier;
-  cdouble_t ima = {0.0e0, 1.0e0};
+  cdouble_t ima = cdouble_new(0.0e0, 1.0e0);
   double pi = 0.31415926535897932e+01;
   cdouble_t ser2;
   cdouble_t ser3;
@@ -161,7 +161,7 @@ void hank103u(cdouble_t z, int *ier, cdouble_t *h0, cdouble_t *h1, int ifexpon)
   double com;
   double d;
   double done;
-  cdouble_t ima = {0.0e0, 1.0e0};
+  cdouble_t ima = cdouble_new(0.0e0, 1.0e0);
   int m;
   double thresh1;
   double thresh2;
@@ -252,10 +252,10 @@ void hank103a(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon)
 {
   cdouble_t cccexp;
   cdouble_t cdd;
-  cdouble_t cdumb = {0.70710678118654757e+00, (- 1) * 0.70710678118654746e+00};
+  cdouble_t cdumb = cdouble_new(0.70710678118654757e+00, (- 1) * 0.70710678118654746e+00);
   double done = 1.0e0;
   int i;
-  cdouble_t ima = {0.0e0, 1.0e0};
+  cdouble_t ima = cdouble_new(0.0e0, 1.0e0);
   int m;
 
 
@@ -313,7 +313,7 @@ void hank103l(cdouble_t z, cdouble_t *h0, cdouble_t *h1, int ifexpon)
   cdouble_t fj1;
   double gamma = 0.5772156649015328606e+00;
   int i;
-  cdouble_t ima = {0.0e0, 1.0e0};
+  cdouble_t ima = cdouble_new(0.0e0, 1.0e0);
   int m;
   double pi = 0.31415926535897932e+01;
 
@@ -373,7 +373,7 @@ void hank103r(cdouble_t z, int *ier, cdouble_t *h0, cdouble_t *h1, int ifexpon)
   cdouble_t cdd;
   double d;
   double done;
-  cdouble_t ima = {0.0e0, 1.0e0};
+  cdouble_t ima = cdouble_new(0.0e0, 1.0e0);
   int m;
   double thresh1;
   double thresh2;