diff --git a/src/wrap_cl.hpp b/src/wrap_cl.hpp
index b4d168314493a05815bbe90f76bd350d25f1e60b..9111fd12919bf271221898685d799388c2aeac70 100644
--- a/src/wrap_cl.hpp
+++ b/src/wrap_cl.hpp
@@ -445,8 +445,22 @@ namespace pyopencl
 
     void get(PyObject *obj, int flags)
     {
+#ifdef PYPY_VERSION
+      // work around https://bitbucket.org/pypy/pypy/issues/2873
+      if (flags & PyBUF_ANY_CONTIGUOUS)
+      {
+        int flags_wo_cont = flags & ~PyBUF_ANY_CONTIGUOUS;
+        if (PyObject_GetBuffer(obj, &m_buf, flags_wo_cont | PyBUF_C_CONTIGUOUS))
+        {
+          PyErr_Clear();
+          if (PyObject_GetBuffer(obj, &m_buf, flags_wo_cont | PyBUF_F_CONTIGUOUS))
+            throw py::error_already_set();
+        }
+      }
+#else
       if (PyObject_GetBuffer(obj, &m_buf, flags))
         throw py::error_already_set();
+#endif
 
       m_initialized = true;
     }