Skip to content

Commit 6607ae9

Browse files
committed
Revert "[cxx-interop] Check template argument safety in ClangDeclExplicitSafety"
This reverts commit d2632d2.
1 parent a13c95d commit 6607ae9

File tree

3 files changed

+35
-39
lines changed

3 files changed

+35
-39
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8881,29 +8881,6 @@ ClangDeclExplicitSafety::evaluate(Evaluator &evaluator,
88818881
ClangTypeEscapability({recordDecl->getTypeForDecl(), nullptr}),
88828882
CxxEscapability::Unknown) != CxxEscapability::Unknown)
88838883
return ExplicitSafety::Safe;
8884-
8885-
// A template class is unsafe if any of its type arguments are unsafe.
8886-
// Note that this does not rely on the record being defined.
8887-
if (const auto *ctsd =
8888-
dyn_cast<clang::ClassTemplateSpecializationDecl>(recordDecl)) {
8889-
for (auto arg : ctsd->getTemplateArgs().asArray()) {
8890-
switch (arg.getKind()) {
8891-
case clang::TemplateArgument::Type:
8892-
if (hasUnsafeType(evaluator, arg.getAsType()))
8893-
return ExplicitSafety::Unsafe;
8894-
break;
8895-
case clang::TemplateArgument::Pack:
8896-
for (auto pkArg : arg.getPackAsArray()) {
8897-
if (pkArg.getKind() == clang::TemplateArgument::Type &&
8898-
hasUnsafeType(evaluator, pkArg.getAsType()))
8899-
return ExplicitSafety::Unsafe;
8900-
}
8901-
break;
8902-
default:
8903-
continue;
8904-
}
8905-
}
8906-
}
89078884

89088885
// If we don't have a definition, leave it unspecified.
89098886
recordDecl = recordDecl->getDefinition();
@@ -8917,7 +8894,7 @@ ClangDeclExplicitSafety::evaluate(Evaluator &evaluator,
89178894
return ExplicitSafety::Unsafe;
89188895
}
89198896
}
8920-
8897+
89218898
// Check the fields.
89228899
for (auto field : recordDecl->fields()) {
89238900
if (hasUnsafeType(evaluator, field->getType()))

lib/ClangImporter/ImportDecl.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2302,6 +2302,40 @@ namespace {
23022302
}
23032303
}
23042304

2305+
if (const auto *ctsd =
2306+
dyn_cast<clang::ClassTemplateSpecializationDecl>(decl)) {
2307+
for (auto arg : ctsd->getTemplateArgs().asArray()) {
2308+
auto done = false;
2309+
auto checkUnsafe = [&](clang::TemplateArgument tyArg) {
2310+
if (tyArg.getKind() != clang::TemplateArgument::Type)
2311+
return;
2312+
2313+
auto safety =
2314+
evaluateOrDefault(Impl.SwiftContext.evaluator,
2315+
ClangTypeExplicitSafety({tyArg.getAsType()}),
2316+
ExplicitSafety::Unspecified);
2317+
2318+
if (safety == ExplicitSafety::Unsafe) {
2319+
result->addAttribute(new (Impl.SwiftContext)
2320+
UnsafeAttr(/*implicit=*/true));
2321+
done = true;
2322+
}
2323+
};
2324+
2325+
if (arg.getKind() == clang::TemplateArgument::Pack) {
2326+
for (auto pkArg : arg.getPackAsArray()) {
2327+
checkUnsafe(pkArg);
2328+
if (done)
2329+
break;
2330+
}
2331+
} else {
2332+
checkUnsafe(arg);
2333+
}
2334+
if (done)
2335+
break;
2336+
}
2337+
}
2338+
23052339
bool isNonEscapable = false;
23062340
if (evaluateOrDefault(
23072341
Impl.SwiftContext.evaluator,

test/Interop/Cxx/class/safe-interop-mode.swift

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,6 @@ using TTakePtr = TTake<int *>;
9494
using TTakeSafeTuple = TTake<SafeTuple>;
9595
using TTakeUnsafeTuple = TTake<UnsafeTuple>;
9696

97-
// An escapability or explicit safety annotation means a type is considered safe
98-
// even if it would otherwise be considered unsafe.
99-
template <typename> struct SWIFT_ESCAPABLE TEscape {};
100-
template <typename> struct __attribute__((swift_attr("safe"))) TSafe { void *ptr; };
101-
102-
using TEscapePtr = TEscape<int *>;
103-
using TEscapeUnsafeTuple = TEscape<UnsafeTuple>;
104-
using TSafePtr = TSafe<int *>;
105-
using TSafeTuple = TSafe<UnsafeTuple>;
106-
10797
struct HoldsShared {
10898
SharedObject* obj;
10999

@@ -223,8 +213,3 @@ func useTTakeUnsafeTuple(x: TTakeUnsafeTuple) {
223213
// expected-warning@+1{{expression uses unsafe constructs but is not marked with 'unsafe'}}
224214
_ = x // expected-note{{reference to parameter 'x' involves unsafe type}}
225215
}
226-
227-
func useTEscapePtr(x: TEscapePtr) { _ = x }
228-
func useTEscapeUnsafeTuple(x: TEscapeUnsafeTuple) { _ = x }
229-
func useTSafePtr(x: TSafePtr) { _ = x }
230-
func useTSafeTuple(x: TSafeTuple) { _ = x }

0 commit comments

Comments
 (0)