diff --git a/src/c_wrapper/platform.cpp b/src/c_wrapper/platform.cpp
index f0f5b5aadc61525fbaee1f0825bf9eae9205f11e..20e36bcfd6995a4c825861437140ea39ca7d8d42 100644
--- a/src/c_wrapper/platform.cpp
+++ b/src/c_wrapper/platform.cpp
@@ -2,6 +2,9 @@
 #include "device.h"
 #include "clhelper.h"
 
+#include <stdlib.h>
+#include <regex>
+
 namespace pyopencl {
 
 template class clobj<cl_platform_id>;
@@ -28,6 +31,33 @@ platform::get_info(cl_uint param_name) const
     }
 }
 
+static const std::regex ver_regex("^OpenCL ([0-9]+)\\.([0-9]+).*");
+
+void
+get_platform_version(cl_platform_id plat, int *major, int *minor)
+{
+    char s_buff[128];
+    size_t size;
+    pyopencl_buf<char> d_buff(0);
+    char *name = s_buff;
+    pyopencl_call_guarded(clGetPlatformInfo, plat, CL_PLATFORM_VERSION,
+                          0, nullptr, buf_arg(size));
+    if (size > sizeof(s_buff)) {
+        d_buff.resize(size);
+        name = d_buff.get();
+    }
+    pyopencl_call_guarded(clGetPlatformInfo, plat, CL_PLATFORM_VERSION,
+                          size_arg(name, size), buf_arg(size));
+    std::cmatch ver_match;
+    if (!std::regex_match(name, ver_match, ver_regex)) {
+        throw clerror("get_platform_version", CL_INVALID_VALUE,
+                      "platform returned non-conformant "
+                      "platform version string");
+    }
+    *major = atoi(name + ver_match.position(1));
+    *minor = atoi(name + ver_match.position(2));
+}
+
 }
 
 // c wrapper
diff --git a/src/c_wrapper/platform.h b/src/c_wrapper/platform.h
index 4ef0ce8909877ee088fef4a4cf23a35c3bae8d17..1c47123af51ad25cc3011053c0b34ac79d4d8f3c 100644
--- a/src/c_wrapper/platform.h
+++ b/src/c_wrapper/platform.h
@@ -23,6 +23,8 @@ public:
 
 extern template void print_clobj<platform>(std::ostream&, const platform*);
 
+void get_platform_version(cl_platform_id plat, int *major, int *minor);
+
 // }}}
 
 }