Here is my attempt to generalize the earlier work on method overloading with address spaces https://reviews.llvm.org/D55850 to work in C++ mode (not just OpenCL!).
This implementation doesn't apply yet to templated addr spaces because I would need to perform modifications on the extended function info. Also a couple of smaller corner cases are not handled. However, if the general direction is right, the rest can be build on top of this patch.