swift
fe5b0097 - [cxx-interop] Ban ObjCBool from being substituted into C++ templates

Commit
1 year ago
[cxx-interop] Ban ObjCBool from being substituted into C++ templates This fixes a compiler crash when calling a templated C++ function with a parameter of type `ObjCBool` from Swift. The compiler now emits an error for this. Previously the following would happen: 1. Swift starts to emit SILGen for a call expression `takeTAsConstRef(ObjCBool(true))`. 2. `takeTAsConstRef` is a templated C++ function, so Swift asks Clang to instantiate a `takeTAsConstRef` with a built-in Obj-C boolean type. 3. Swift gets an instantiated function template back that looks like this: `void takeTAsConstRef(_Bool t) { ... }`. 4. Swift's ClangImporter begins to import that instantiated function. 5. Since the parameter type is not spelled as `BOOL`, the parameter is not imported as `ObjCBool`. Instead, it's imported as regular Swift `Bool`. 6. Swift realizes that the types don't match (`ObjCBool` vs `Bool`), tries to apply any of the known implicit conversions, fails to do so, crashes. rdar://130424969
Author
Committer
Parents
Loading