Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ clang/lib/Sema/SemaOverload.cpp @@ -9867,6 +9867,16 @@ S.IdentifyCUDAPreference(Caller, Cand2.Function); } + if (S.getLangOpts().OpenCL) { + if (const auto *CD1 = dyn_cast_or_null(Cand1.Function)) { + if (const auto *CD2 = dyn_cast_or_null(Cand2.Function)) { + return Qualifiers::isAddressSpaceSupersetOf( + CD2->getMethodQualifiers().getAddressSpace(), + CD1->getMethodQualifiers().getAddressSpace()); + } + } + } + return false; } Index: clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp =================================================================== --- clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp +++ clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp @@ -11,8 +11,7 @@ int x; // Local variables are handled in local_addrspace_init.clcpp - // FIXME: __private and __generic constructors clash for __private variable - // X() /*__generic*/ = default; + X() /*__generic*/ = default; X() __private : x(0) {} X() __global : x(0) {} constexpr X() __constant : x(0) {} @@ -30,7 +29,7 @@ // CHECK: @_ZZ1kE3cx2 = internal addrspace(2) constant %struct.X { i32 1 } kernel void k() { - // Check that the constructor for px is executed + // Check that the constructor for px calls the __private constructor // CHECK: %px = alloca %struct.X // CHECK-NEXT: call spir_func void @_ZN1XC1Ev(%struct.X* {{.*}}%px) __private X px;