Skip to content

Commit 07b8f0a

Browse files
authored
Merge pull request swiftlang#79434 from swiftlang/gaborh/escapibility-lookup
[SE-0458] Unify escapability inference for AST and Interop
2 parents 61e92ed + 4103416 commit 07b8f0a

File tree

5 files changed

+27
-28
lines changed

5 files changed

+27
-28
lines changed

include/swift/ClangImporter/ClangImporterRequests.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -417,10 +417,8 @@ class CxxRecordAsSwiftType
417417

418418
struct SafeUseOfCxxDeclDescriptor final {
419419
const clang::Decl *decl;
420-
ASTContext &ctx;
421420

422-
SafeUseOfCxxDeclDescriptor(const clang::Decl *decl, ASTContext &ctx)
423-
: decl(decl), ctx(ctx) {}
421+
SafeUseOfCxxDeclDescriptor(const clang::Decl *decl) : decl(decl) {}
424422

425423
friend llvm::hash_code hash_value(const SafeUseOfCxxDeclDescriptor &desc) {
426424
return llvm::hash_combine(desc.decl);
@@ -528,7 +526,7 @@ enum class CxxEscapability { Escapable, NonEscapable, Unknown };
528526

529527
struct EscapabilityLookupDescriptor final {
530528
const clang::Type *type;
531-
ClangImporter::Implementation &impl;
529+
ClangImporter::Implementation *impl;
532530
bool annotationOnly = true;
533531

534532
friend llvm::hash_code hash_value(const EscapabilityLookupDescriptor &desc) {

lib/AST/Decl.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1153,9 +1153,9 @@ ExplicitSafety Decl::getExplicitSafety() const {
11531153
// If this declaration is from C, ask the Clang importer.
11541154
if (auto clangDecl = getClangDecl()) {
11551155
ASTContext &ctx = getASTContext();
1156-
return evaluateOrDefault(
1157-
ctx.evaluator, ClangDeclExplicitSafety({clangDecl, ctx}),
1158-
ExplicitSafety::Unspecified);
1156+
return evaluateOrDefault(ctx.evaluator,
1157+
ClangDeclExplicitSafety({clangDecl}),
1158+
ExplicitSafety::Unspecified);
11591159
}
11601160

11611161
// Inference: Check the enclosing context.

lib/ClangImporter/ClangImporter.cpp

+17-15
Original file line numberDiff line numberDiff line change
@@ -5213,9 +5213,10 @@ ClangTypeEscapability::evaluate(Evaluator &evaluator,
52135213
} else
52145214
nonPackArgs.push_back(arg);
52155215
for (auto nonPackArg : nonPackArgs) {
5216-
if (nonPackArg.getKind() != clang::TemplateArgument::Type) {
5217-
desc.impl.diagnose(loc, diag::type_template_parameter_expected,
5218-
argToCheck.second);
5216+
if (nonPackArg.getKind() != clang::TemplateArgument::Type &&
5217+
desc.impl) {
5218+
desc.impl->diagnose(loc, diag::type_template_parameter_expected,
5219+
argToCheck.second);
52195220
return CxxEscapability::Unknown;
52205221
}
52215222

@@ -5236,8 +5237,9 @@ ClangTypeEscapability::evaluate(Evaluator &evaluator,
52365237
}
52375238
}
52385239

5239-
for (auto name : conditionalParams)
5240-
desc.impl.diagnose(loc, diag::unknown_template_parameter, name);
5240+
if (desc.impl)
5241+
for (auto name : conditionalParams)
5242+
desc.impl->diagnose(loc, diag::unknown_template_parameter, name);
52415243

52425244
return hadUnknown ? CxxEscapability::Unknown : CxxEscapability::Escapable;
52435245
}
@@ -8216,9 +8218,7 @@ CustomRefCountingOperationResult CustomRefCountingOperation::evaluate(
82168218
}
82178219

82188220
/// Check whether the given Clang type involves an unsafe type.
8219-
static bool hasUnsafeType(
8220-
Evaluator &evaluator, ASTContext &swiftContext, clang::QualType clangType
8221-
) {
8221+
static bool hasUnsafeType(Evaluator &evaluator, clang::QualType clangType) {
82228222
// Handle pointers.
82238223
auto pointeeType = clangType->getPointeeType();
82248224
if (!pointeeType.isNull()) {
@@ -8239,10 +8239,9 @@ static bool hasUnsafeType(
82398239

82408240
// Handle records recursively.
82418241
if (auto recordDecl = clangType->getAsTagDecl()) {
8242-
auto safety = evaluateOrDefault(
8243-
evaluator,
8244-
ClangDeclExplicitSafety({recordDecl, swiftContext}),
8245-
ExplicitSafety::Unspecified);
8242+
auto safety =
8243+
evaluateOrDefault(evaluator, ClangDeclExplicitSafety({recordDecl}),
8244+
ExplicitSafety::Unspecified);
82468245
switch (safety) {
82478246
case ExplicitSafety::Unsafe:
82488247
return true;
@@ -8285,7 +8284,10 @@ ExplicitSafety ClangDeclExplicitSafety::evaluate(
82858284

82868285
// Escapable and non-escapable annotations imply that the declaration is
82878286
// safe.
8288-
if (hasNonEscapableAttr(recordDecl) || hasEscapableAttr(recordDecl))
8287+
if (evaluateOrDefault(
8288+
evaluator,
8289+
ClangTypeEscapability({recordDecl->getTypeForDecl(), nullptr}),
8290+
CxxEscapability::Unknown) != CxxEscapability::Unknown)
82898291
return ExplicitSafety::Safe;
82908292

82918293
// If we don't have a definition, leave it unspecified.
@@ -8296,14 +8298,14 @@ ExplicitSafety ClangDeclExplicitSafety::evaluate(
82968298
// If this is a C++ class, check its bases.
82978299
if (auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(recordDecl)) {
82988300
for (auto base : cxxRecordDecl->bases()) {
8299-
if (hasUnsafeType(evaluator, desc.ctx, base.getType()))
8301+
if (hasUnsafeType(evaluator, base.getType()))
83008302
return ExplicitSafety::Unsafe;
83018303
}
83028304
}
83038305

83048306
// Check the fields.
83058307
for (auto field : recordDecl->fields()) {
8306-
if (hasUnsafeType(evaluator, desc.ctx, field->getType()))
8308+
if (hasUnsafeType(evaluator, field->getType()))
83078309
return ExplicitSafety::Unsafe;
83088310
}
83098311

lib/ClangImporter/ImportDecl.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -2244,7 +2244,7 @@ namespace {
22442244
bool isNonEscapable = false;
22452245
if (evaluateOrDefault(
22462246
Impl.SwiftContext.evaluator,
2247-
ClangTypeEscapability({decl->getTypeForDecl(), Impl}),
2247+
ClangTypeEscapability({decl->getTypeForDecl(), &Impl}),
22482248
CxxEscapability::Unknown) == CxxEscapability::NonEscapable) {
22492249
result->getAttrs().add(new (Impl.SwiftContext)
22502250
NonEscapableAttr(/*Implicit=*/true));
@@ -4116,7 +4116,7 @@ namespace {
41164116
evaluateOrDefault(
41174117
Impl.SwiftContext.evaluator,
41184118
ClangTypeEscapability(
4119-
{ctordecl->getParent()->getTypeForDecl(), Impl}),
4119+
{ctordecl->getParent()->getTypeForDecl(), &Impl}),
41204120
CxxEscapability::Unknown) == CxxEscapability::NonEscapable)
41214121
lifetimeDependencies.push_back(immortalLifetime);
41224122
}
@@ -8501,8 +8501,7 @@ static bool importAsUnsafe(ClangImporter::Implementation &impl,
85018501
return false;
85028502

85038503
if (isa<clang::CXXMethodDecl>(decl) &&
8504-
!evaluateOrDefault(context.evaluator, IsSafeUseOfCxxDecl({decl, context}),
8505-
{}))
8504+
!evaluateOrDefault(context.evaluator, IsSafeUseOfCxxDecl({decl}), {}))
85068505
return true;
85078506

85088507
if (isa<ClassDecl>(MappedDecl))
@@ -8518,7 +8517,7 @@ static bool importAsUnsafe(ClangImporter::Implementation &impl,
85188517
if (const auto *record = dyn_cast<clang::RecordDecl>(decl))
85198518
return evaluateOrDefault(
85208519
context.evaluator,
8521-
ClangTypeEscapability({record->getTypeForDecl(), impl, false}),
8520+
ClangTypeEscapability({record->getTypeForDecl(), &impl, false}),
85228521
CxxEscapability::Unknown) == CxxEscapability::Unknown;
85238522

85248523
return false;

lib/ClangImporter/ImportName.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,7 @@ static StringRef renameUnsafeMethod(ASTContext &ctx,
14941494
const clang::NamedDecl *decl,
14951495
StringRef name) {
14961496
if (isa<clang::CXXMethodDecl>(decl) &&
1497-
!evaluateOrDefault(ctx.evaluator, IsSafeUseOfCxxDecl({decl, ctx}), {})) {
1497+
!evaluateOrDefault(ctx.evaluator, IsSafeUseOfCxxDecl({decl}), {})) {
14981498
return ctx.getIdentifier(("__" + name + "Unsafe").str()).str();
14991499
}
15001500

0 commit comments

Comments
 (0)