Skip to content

Commit 0ef18ab

Browse files
authored
Merge pull request #74967 from swiftlang/egorzhdan/6.0-objcbool-template-param
🍒[cxx-interop] Ban ObjCBool from being substituted into C++ templates
2 parents 289241f + 288c238 commit 0ef18ab

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
@@ -896,6 +896,19 @@ ClangTypeConverter::getClangTemplateArguments(
896896
}
897897

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