[PATCH] D102850: [C++4OpenCL] Fix overloading resolution of addrspace constructors
Ole Strohm via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 11 03:14:06 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb102e6880ab0: [OpenCL] Fix overloading resolution of addrspace constructors (authored by olestrohm).
Changed prior to commit:
https://reviews.llvm.org/D102850?vs=351165&id=351388#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D102850/new/
https://reviews.llvm.org/D102850
Files:
clang/lib/Sema/SemaOverload.cpp
clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp
clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp
Index: clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp
===================================================================
--- clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp
+++ clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp
@@ -1,14 +1,24 @@
-// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only
+// RUN: %clang_cc1 %s -pedantic -ast-dump -verify | FileCheck %s
__constant int g1; // expected-error {{variable in constant address space must be initialized}}
__constant int g2 = 0;
struct X {
int x;
+//CHECK: CXXConstructorDecl
+//CHECK-NOT: used
+//CHECK-SAME: X 'void (){{.*}} __generic'
+ X() /*__generic*/ : x(0) {}
+//CHECK: CXXConstructorDecl {{.*}} used X 'void (){{.*}} __private'
+ X() __private : x(0) {}
+//CHECK: CXXConstructorDecl {{.*}} used X 'void (){{.*}} __global'
+ X() __global : x(0) {}
constexpr X() __constant : x(0) {}
constexpr X(int x) __constant : x(x) {}
};
+__global X gx;
+
//expected-note at +2{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const __generic Y' for 1st argument}}
//expected-note at +1{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to '__generic Y' for 1st argument}}
struct Y {
@@ -20,6 +30,7 @@
__constant X cx1;
__constant X cx2(1);
__local X lx;
+ __private X x;
__private Y py;
__constant Y cy1; // expected-error{{variable in constant address space must be initialized}}
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*/ : x(0) {}
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;
Index: clang/lib/Sema/SemaOverload.cpp
===================================================================
--- clang/lib/Sema/SemaOverload.cpp
+++ clang/lib/Sema/SemaOverload.cpp
@@ -9867,6 +9867,23 @@
S.IdentifyCUDAPreference(Caller, Cand2.Function);
}
+ // General member function overloading is handled above, so this only handles
+ // constructors with address spaces.
+ // This only handles address spaces since C++ has no other
+ // qualifier that can be used with constructors.
+ const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.Function);
+ const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.Function);
+ if (CD1 && CD2) {
+ LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
+ LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
+ if (AS1 != AS2) {
+ if (Qualifiers::isAddressSpaceSupersetOf(AS2, AS1))
+ return true;
+ if (Qualifiers::isAddressSpaceSupersetOf(AS2, AS1))
+ return false;
+ }
+ }
+
return false;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102850.351388.patch
Type: text/x-patch
Size: 3469 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210611/11b43a89/attachment.bin>
More information about the cfe-commits
mailing list