diff --git a/pyopencl/scan.py b/pyopencl/scan.py
index 5ad6903ff5670c24dc740aed6640632e8f84623f..efd2a1ae648c1eb70ca0ba1ec3daa1c2548fa8be 100644
--- a/pyopencl/scan.py
+++ b/pyopencl/scan.py
@@ -312,7 +312,7 @@ void ${name_prefix}_scan_intervals(
                     }
                     else
                     %endif
-                        sum = SCAN_EXPR(tmp, sum);
+                        sum = SCAN_EXPR(sum, tmp);
 
                     ldata[k][LID_0] = sum;
                 }
diff --git a/test/test_array.py b/test/test_array.py
index 7198ff3809be2853e500d16789f893e4bd0cbebf..44bdeb31da5d3b6b0bd853fa8babb817988d0ed2 100644
--- a/test/test_array.py
+++ b/test/test_array.py
@@ -908,6 +908,28 @@ def test_unique(ctx_factory):
 
         assert (a_unique_dev.get()[:count_unique_dev] == a_unique_host).all()
 
+@pytools.test.mark_test.opencl
+def test_index_preservation(ctx_factory):
+    context = ctx_factory()
+    queue = cl.CommandQueue(context)
+
+    for n in scan_test_counts:
+
+        from pyopencl.scan import GenericScanKernel
+        knl = GenericScanKernel(
+                context, np.int32,
+                arguments="__global int *out",
+                input_expr="i",
+                scan_expr="b", neutral="0",
+                output_statement="""
+                    out[i] = item;
+                    """)
+
+        out = cl_array.empty(queue, n, dtype=np.int32)
+        knl(out)
+
+        assert (out.get() == np.arange(n)).all()
+
 @pytools.test.mark_test.opencl
 def test_segmented_scan(ctx_factory):
     context = ctx_factory()