@@ -5980,7 +5980,6 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
5980
5980
SafeUseOfCxxDeclDescriptor desc) const {
5981
5981
const clang::Decl *decl = desc.decl ;
5982
5982
const clang::CXXRecordDecl *recordDecl = nullptr ;
5983
- bool isCxxMethod = false ;
5984
5983
bool cxxMethodIsSafe = true ;
5985
5984
5986
5985
if (auto method = dyn_cast<clang::CXXMethodDecl>(decl)) {
@@ -6010,7 +6009,6 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
6010
6009
}
6011
6010
}
6012
6011
6013
- isCxxMethod = true ;
6014
6012
recordDecl = method->getParent ();
6015
6013
} else if (auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(decl)) {
6016
6014
recordDecl = cxxRecordDecl;
@@ -6029,19 +6027,10 @@ bool IsSafeUseOfCxxDecl::evaluate(Evaluator &evaluator,
6029
6027
if (semanticsKind == CxxRecordSemanticsKind::Reference)
6030
6028
return true ;
6031
6029
6032
- // Cannot return projections.
6033
- if (semanticsKind == CxxRecordSemanticsKind::Trivial ||
6034
- semanticsKind == CxxRecordSemanticsKind::Owned)
6035
- return cxxMethodIsSafe;
6036
6030
6037
- if (semanticsKind == CxxRecordSemanticsKind::ExplicitlyUnsafe)
6038
- return cxxMethodIsSafe;
6039
-
6040
- assert (semanticsKind == CxxRecordSemanticsKind::UnsafePointerMember);
6041
- // We can't dis-allow *all* APIs that potentially return unsafe projections
6042
- // because this would break ObjC interop. So only do this when it's a known
6043
- // C++ API (maybe this could warn in a specific compiler mode, though).
6044
- return !isCxxMethod;
6031
+ // All other record semantics kinds are some varient of an "owned" type, so
6032
+ // dis-allow potential projections.
6033
+ return cxxMethodIsSafe;
6045
6034
}
6046
6035
6047
6036
void swift::simple_display (llvm::raw_ostream &out,
0 commit comments