@@ -43,45 +43,56 @@ Type& LLDBParser::enumerateType(lldb::SBType& type) {
43
43
44
44
DepthGuard guard (depth_);
45
45
46
- Type *t = nullptr ;
47
- switch (auto kind = type.GetTypeClass ()) {
48
- case lldb::eTypeClassClass:
49
- case lldb::eTypeClassStruct:
50
- case lldb::eTypeClassUnion:
51
- t = &enumerateClass (type);
52
- break ;
53
- case lldb::eTypeClassEnumeration:
54
- t = &enumerateEnum (type);
55
- break ;
56
- case lldb::eTypeClassTypedef:
57
- t = &enumerateTypedef (type);
58
- break ;
59
- case lldb::eTypeClassPointer:
60
- case lldb::eTypeClassReference:
61
- t = &enumeratePointer (type);
62
- break ;
63
- case lldb::eTypeClassBuiltin:
64
- t = &enumeratePrimitive (type);
65
- break ;
66
- case lldb::eTypeClassArray:
67
- t = &enumerateArray (type);
68
- break ;
69
- case lldb::eTypeClassInvalid:
70
- case lldb::eTypeClassBlockPointer:
71
- case lldb::eTypeClassComplexFloat:
72
- case lldb::eTypeClassComplexInteger:
73
- case lldb::eTypeClassFunction:
74
- case lldb::eTypeClassMemberPointer:
75
- case lldb::eTypeClassObjCObject:
76
- case lldb::eTypeClassObjCInterface:
77
- case lldb::eTypeClassObjCObjectPointer:
78
- case lldb::eTypeClassVector:
79
- case lldb::eTypeClassOther:
80
- case lldb::eTypeClassAny:
81
- throw LLDBParserError{" Unhandled type class: " + std::to_string (kind)};
46
+ bool isTypeIncomplete = !type.IsTypeComplete ();
47
+
48
+ std::optional<std::reference_wrapper<Type>> t;
49
+ try {
50
+ switch (auto kind = type.GetTypeClass ()) {
51
+ case lldb::eTypeClassClass:
52
+ case lldb::eTypeClassStruct:
53
+ case lldb::eTypeClassUnion:
54
+ t = enumerateClass (type);
55
+ break ;
56
+ case lldb::eTypeClassEnumeration:
57
+ t = enumerateEnum (type);
58
+ break ;
59
+ case lldb::eTypeClassTypedef:
60
+ t = enumerateTypedef (type);
61
+ break ;
62
+ case lldb::eTypeClassPointer:
63
+ case lldb::eTypeClassReference:
64
+ t = enumeratePointer (type);
65
+ break ;
66
+ case lldb::eTypeClassBuiltin:
67
+ t = enumeratePrimitive (type);
68
+ break ;
69
+ case lldb::eTypeClassArray:
70
+ t = enumerateArray (type);
71
+ break ;
72
+ case lldb::eTypeClassInvalid:
73
+ case lldb::eTypeClassBlockPointer:
74
+ case lldb::eTypeClassComplexFloat:
75
+ case lldb::eTypeClassComplexInteger:
76
+ case lldb::eTypeClassFunction:
77
+ case lldb::eTypeClassMemberPointer:
78
+ case lldb::eTypeClassObjCObject:
79
+ case lldb::eTypeClassObjCInterface:
80
+ case lldb::eTypeClassObjCObjectPointer:
81
+ case lldb::eTypeClassVector:
82
+ case lldb::eTypeClassOther:
83
+ case lldb::eTypeClassAny:
84
+ throw LLDBParserError{" Unhandled type class: " + std::to_string (kind)};
85
+ }
86
+ } catch (const LLDBParserError& e) {
87
+ if (!isTypeIncomplete)
88
+ throw ;
89
+ }
90
+
91
+ if (isTypeIncomplete) {
92
+ return makeType<Incomplete>(type, *t);
82
93
}
83
94
84
- return *t ;
95
+ return t. value () ;
85
96
}
86
97
87
98
Class& LLDBParser::enumerateClass (lldb::SBType& type) {
0 commit comments