@@ -6041,7 +6041,6 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
6041
6041
SafeUseOfCxxDeclDescriptor desc) const {
6042
6042
const clang::Decl *decl = desc.decl ;
6043
6043
const clang::CXXRecordDecl *recordDecl = nullptr ;
6044
- bool isCxxMethod = false ;
6045
6044
bool cxxMethodIsSafe = true ;
6046
6045
6047
6046
if (auto method = dyn_cast<clang::CXXMethodDecl>(decl)) {
@@ -6071,7 +6070,6 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
6071
6070
}
6072
6071
}
6073
6072
6074
- isCxxMethod = true ;
6075
6073
recordDecl = method->getParent ();
6076
6074
} else if (auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(decl)) {
6077
6075
recordDecl = cxxRecordDecl;
@@ -6090,19 +6088,10 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
6090
6088
if (semanticsKind == CxxRecordSemanticsKind::Reference)
6091
6089
return true ;
6092
6090
6093
- // Cannot return projections.
6094
- if (semanticsKind == CxxRecordSemanticsKind::Trivial ||
6095
- semanticsKind == CxxRecordSemanticsKind::Owned)
6096
- return cxxMethodIsSafe;
6097
6091
6098
- if (semanticsKind == CxxRecordSemanticsKind::ExplicitlyUnsafe)
6099
- return cxxMethodIsSafe;
6100
-
6101
- assert (semanticsKind == CxxRecordSemanticsKind::UnsafePointerMember);
6102
- // We can't dis-allow *all* APIs that potentially return unsafe projections
6103
- // because this would break ObjC interop. So only do this when it's a known
6104
- // C++ API (maybe this could warn in a specific compiler mode, though).
6105
- return !isCxxMethod;
6092
+ // All other record semantics kinds are some varient of an "owned" type, so
6093
+ // dis-allow potential projections.
6094
+ return cxxMethodIsSafe;
6106
6095
}
6107
6096
6108
6097
void swift::simple_display (llvm::raw_ostream &out,
0 commit comments