Skip to content

Commit b6844f5

Browse files
authored
Merge pull request #74790 from swiftlang/egorzhdan/objcbool-template-param
[cxx-interop] Ban ObjCBool from being substituted into C++ templates
2 parents 3ee8272 + fe5b009 commit b6844f5

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

lib/AST/ClangTypeConverter.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,19 @@ ClangTypeConverter::getClangTemplateArguments(
897897
}
898898

899899
auto replacement = genericArgs[templateParam->getIndex()];
900+
901+
// Ban ObjCBool type from being substituted into C++ templates.
902+
if (auto nominal = replacement->getAs<NominalType>()) {
903+
if (auto nominalDecl = nominal->getDecl()) {
904+
if (nominalDecl->getName().is("ObjCBool") &&
905+
nominalDecl->getModuleContext()->getName() ==
906+
nominalDecl->getASTContext().Id_ObjectiveC) {
907+
failedTypes.push_back(replacement);
908+
continue;
909+
}
910+
}
911+
}
912+
900913
auto qualType = convert(replacement);
901914
if (qualType.isNull()) {
902915
failedTypes.push_back(replacement);

test/Interop/Cxx/templates/Inputs/function-templates.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ template <class T> struct Dep { using TT = T; };
7171

7272
template <class T> void useDependentType(typename Dep<T>::TT) {}
7373

74+
template <class T> void takesValue(T value) { }
75+
7476
template <class T> void lvalueReference(T &ref) { ref = 42; }
7577
template <class T> void lvalueReferenceZero(T &ref) { ref = 0; }
7678

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: not %target-swift-frontend -typecheck %s -I %S/Inputs -enable-experimental-cxx-interop 2>&1 | %FileCheck %s
2+
3+
// REQUIRES: objc_interop
4+
5+
import FunctionTemplates
6+
import ObjectiveC
7+
8+
// Verify that ObjCBool type is banned from C++ template parameters.
9+
10+
takesValue(ObjCBool(true))
11+
// CHECK: error: could not generate C++ types from the generic Swift types provided; the following Swift type(s) provided to 'takesValue' could not be converted: ObjCBool
12+
constLvalueReference(ObjCBool(true))
13+
// CHECK: error: could not generate C++ types from the generic Swift types provided; the following Swift type(s) provided to 'constLvalueReference' could not be converted: ObjCBool

0 commit comments

Comments
 (0)