@@ -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
0 commit comments