Skip to content

Commit e7d5e2c

Browse files
Merge pull request #10119 from adrian-prantl/145225544
[lldb] Avoid crashing when trying reconstruct types with errors
2 parents 82c52e6 + ea373e6 commit e7d5e2c

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,10 @@ void *TypeSystemSwiftTypeRef::ReconstructType(opaque_compiler_type_t type,
22922292
if (m_dangerous_types.count(key))
22932293
return nullptr;
22942294

2295+
// This can crash SwiftASTContext.
2296+
if (ContainsError(type))
2297+
return nullptr;
2298+
22952299
auto swift_ast_context = GetSwiftASTContext(GetSymbolContext(exe_ctx));
22962300
if (!swift_ast_context || swift_ast_context->HasFatalErrors())
22972301
return nullptr;
@@ -2895,11 +2899,25 @@ bool TypeSystemSwiftTypeRef::IsExpressionEvaluatorDefined(
28952899
const auto *mangled_name = AsMangledName(type);
28962900
Demangler dem;
28972901
NodePointer node = GetDemangledType(dem, mangled_name);
2898-
return swift_demangle::FindIf(node, [](NodePointer node) -> NodePointer {
2902+
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
28992903
if (node->getKind() == Node::Kind::Module &&
29002904
node->getText().starts_with("__lldb_expr"))
2901-
return node;
2902-
return nullptr;
2905+
return true;
2906+
return false;
2907+
});
2908+
}
2909+
2910+
bool TypeSystemSwiftTypeRef::ContainsError(
2911+
lldb::opaque_compiler_type_t type) {
2912+
using namespace swift::Demangle;
2913+
const auto *mangled_name = AsMangledName(type);
2914+
Demangler dem;
2915+
NodePointer node = GetDemangledType(dem, mangled_name);
2916+
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
2917+
// This node is an in-band error, not a Swift.Error type, which is a protocol.
2918+
if (node->getKind() == Node::Kind::ErrorType)
2919+
return true;
2920+
return false;
29032921
});
29042922
}
29052923

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,9 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
441441
swift::Mangle::ManglingFlavor
442442
GetManglingFlavor(ExecutionContext *exe_ctx = nullptr);
443443

444+
/// Returns true if this type contains an error node anywhere.
445+
bool ContainsError(lldb::opaque_compiler_type_t type);
446+
444447
protected:
445448
/// Determine whether the fallback is enabled via setting.
446449
bool UseSwiftASTContextFallback(const char *func_name,

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,3 +1013,15 @@ TEST_F(TestTypeSystemSwiftTypeRef, GenericSignature) {
10131013
ASSERT_FALSE(maybe_signature.has_value());
10141014
}
10151015
}
1016+
1017+
TEST_F(TestTypeSystemSwiftTypeRef, Error) {
1018+
using namespace swift::Demangle;
1019+
Demangler dem;
1020+
NodeBuilder b(dem);
1021+
{
1022+
NodePointer n = b.GlobalType(b.Node(Node::Kind::ErrorType, "Fatal Error"));
1023+
CompilerType t = GetCompilerType(b.Mangle(n));
1024+
lldb::opaque_compiler_type_t opaque = t.GetOpaqueQualType();
1025+
ASSERT_TRUE(m_swift_ts->ContainsError(opaque));
1026+
}
1027+
}

0 commit comments

Comments
 (0)