Skip to content

Commit 7282c64

Browse files
committed
Turn off templated operators aside from subscript
1 parent 6a40690 commit 7282c64

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,17 @@ namespace {
25772577
if (!dc)
25782578
return nullptr;
25792579

2580+
bool isOperator = decl->getDeclName().getNameKind() ==
2581+
clang::DeclarationName::CXXOperatorName;
2582+
bool isNonSubscriptOperator =
2583+
isOperator && (decl->getDeclName().getCXXOverloadedOperator() !=
2584+
clang::OO_Subscript);
2585+
2586+
// For now, we don't support non-subscript operators which are templated
2587+
if (isNonSubscriptOperator && decl->isTemplated()) {
2588+
return nullptr;
2589+
}
2590+
25802591
auto aliasedDecl =
25812592
Impl.importDecl(decl->getAliasedNamespace(), getActiveSwiftVersion());
25822593
if (!aliasedDecl)

test/Interop/Cxx/operators/Inputs/member-inline.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,24 @@ template<class T> struct TemplatedArrayByVal {
186186
T ts[];
187187
T operator[](int i) { return ts[i]; }
188188
};
189+
189190
typedef TemplatedArrayByVal<double> TemplatedDoubleArrayByVal;
190191

191-
struct TemplatedSubscriptArrayByVal {
192+
template <class T>
193+
struct TemplatedByVal {
194+
T val;
195+
TemplatedByVal<T> operator+(TemplatedByVal other) {
196+
return TemplatedByVal{.val = val + other.val};
197+
}
198+
};
199+
200+
struct TemplatedOperatorArrayByVal {
192201
int *ptr;
193202
template<class T> T operator[](T i) { return ptr[i]; }
203+
template <class T>
204+
T *operator+(T i) {
205+
return ptr + i;
206+
}
194207
};
195208

196209
struct NonTrivial {

test/Interop/Cxx/operators/member-inline-module-interface.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,14 @@
133133
// CHECK: }
134134
// CHECK: typealias TemplatedDoubleArrayByVal = __CxxTemplateInst19TemplatedArrayByValIdE
135135

136+
// CHECK: struct TemplatedByVal<T> {
137+
// CHECK-NEXT: }
136138

137-
// CHECK: struct TemplatedSubscriptArrayByVal {
139+
// CHECK: struct TemplatedOperatorArrayByVal {
138140
// CHECK: subscript(i: T) -> T { mutating get }
139141
// CHECK: @available(*, unavailable, message: "use subscript")
140142
// CHECK: mutating func __operatorSubscriptConst<T>(_ i: T) -> T
143+
// CHECK-NOT: mutating func __operatorPlus<T>(_ i: T) -> UnsafeMutablePointer<T>
141144
// CHECK: }
142145

143146
// CHECK: struct NonTrivialArrayByVal {

0 commit comments

Comments
 (0)