10
10
//
11
11
// ===----------------------------------------------------------------------===//
12
12
13
+ #include " DeserializationErrors.h"
13
14
#include " swift/Serialization/ModuleFile.h"
14
15
#include " swift/Serialization/ModuleFormat.h"
15
16
#include " swift/AST/ASTContext.h"
@@ -96,161 +97,6 @@ namespace {
96
97
}
97
98
};
98
99
99
- class XRefTracePath {
100
- class PathPiece {
101
- public:
102
- enum class Kind {
103
- Value,
104
- Type,
105
- Operator,
106
- OperatorFilter,
107
- Accessor,
108
- Extension,
109
- GenericParam,
110
- Unknown
111
- };
112
-
113
- private:
114
- Kind kind;
115
- void *data;
116
-
117
- template <typename T>
118
- T getDataAs () const {
119
- return llvm::PointerLikeTypeTraits<T>::getFromVoidPointer (data);
120
- }
121
-
122
- public:
123
- template <typename T>
124
- PathPiece (Kind K, T value)
125
- : kind(K),
126
- data (llvm::PointerLikeTypeTraits<T>::getAsVoidPointer(value)) {}
127
-
128
- void print (raw_ostream &os) const {
129
- switch (kind) {
130
- case Kind::Value:
131
- os << getDataAs<Identifier>();
132
- break ;
133
- case Kind::Type:
134
- os << " with type " << getDataAs<Type>();
135
- break ;
136
- case Kind::Extension:
137
- if (getDataAs<ModuleDecl *>())
138
- os << " in an extension in module '" << getDataAs<ModuleDecl *>()->getName ()
139
- << " '" ;
140
- else
141
- os << " in an extension in any module" ;
142
- break ;
143
- case Kind::Operator:
144
- os << " operator " << getDataAs<Identifier>();
145
- break ;
146
- case Kind::OperatorFilter:
147
- switch (getDataAs<uintptr_t >()) {
148
- case Infix:
149
- os << " (infix)" ;
150
- break ;
151
- case Prefix:
152
- os << " (prefix)" ;
153
- break ;
154
- case Postfix:
155
- os << " (postfix)" ;
156
- break ;
157
- default :
158
- os << " (unknown operator filter)" ;
159
- break ;
160
- }
161
- break ;
162
- case Kind::Accessor:
163
- switch (getDataAs<uintptr_t >()) {
164
- case Getter:
165
- os << " (getter)" ;
166
- break ;
167
- case Setter:
168
- os << " (setter)" ;
169
- break ;
170
- case MaterializeForSet:
171
- os << " (materializeForSet)" ;
172
- break ;
173
- case Addressor:
174
- os << " (addressor)" ;
175
- break ;
176
- case MutableAddressor:
177
- os << " (mutableAddressor)" ;
178
- break ;
179
- case WillSet:
180
- os << " (willSet)" ;
181
- break ;
182
- case DidSet:
183
- os << " (didSet)" ;
184
- break ;
185
- default :
186
- os << " (unknown accessor kind)" ;
187
- break ;
188
- }
189
- break ;
190
- case Kind::GenericParam:
191
- os << " generic param #" << getDataAs<uintptr_t >();
192
- break ;
193
- case Kind::Unknown:
194
- os << " unknown xref kind " << getDataAs<uintptr_t >();
195
- break ;
196
- }
197
- }
198
- };
199
-
200
- ModuleDecl &baseM;
201
- SmallVector<PathPiece, 8 > path;
202
-
203
- public:
204
- explicit XRefTracePath (ModuleDecl &M) : baseM(M) {}
205
-
206
- void addValue (Identifier name) {
207
- path.push_back ({ PathPiece::Kind::Value, name });
208
- }
209
-
210
- void addType (Type ty) {
211
- path.push_back ({ PathPiece::Kind::Type, ty });
212
- }
213
-
214
- void addOperator (Identifier name) {
215
- path.push_back ({ PathPiece::Kind::Operator, name });
216
- }
217
-
218
- void addOperatorFilter (uint8_t fixity) {
219
- path.push_back ({ PathPiece::Kind::OperatorFilter,
220
- static_cast <uintptr_t >(fixity) });
221
- }
222
-
223
- void addAccessor (uint8_t kind) {
224
- path.push_back ({ PathPiece::Kind::Accessor,
225
- static_cast <uintptr_t >(kind) });
226
- }
227
-
228
- void addExtension (ModuleDecl *M) {
229
- path.push_back ({ PathPiece::Kind::Extension, M });
230
- }
231
-
232
- void addGenericParam (uintptr_t index) {
233
- path.push_back ({ PathPiece::Kind::GenericParam, index });
234
- }
235
-
236
- void addUnknown (uintptr_t kind) {
237
- path.push_back ({ PathPiece::Kind::Unknown, kind });
238
- }
239
-
240
- void removeLast () {
241
- path.pop_back ();
242
- }
243
-
244
- void print (raw_ostream &os, StringRef leading = " " ) const {
245
- os << " Cross-reference to module '" << baseM.getName () << " '\n " ;
246
- for (auto &piece : path) {
247
- os << leading << " ... " ;
248
- piece.print (os);
249
- os << " \n " ;
250
- }
251
- }
252
- };
253
-
254
100
class PrettyXRefTrace :
255
101
public llvm::PrettyStackTraceEntry,
256
102
public XRefTracePath {
@@ -273,67 +119,15 @@ namespace {
273
119
os << Action << " \' " << getNameOfModule (MF) << " '\n " ;
274
120
}
275
121
};
276
-
277
- class XRefError : public llvm ::ErrorInfo<XRefError> {
278
- friend ErrorInfo;
279
- static const char ID;
280
-
281
- XRefTracePath path;
282
- const char *message;
283
- public:
284
- template <size_t N>
285
- XRefError (const char (&message)[N], XRefTracePath path)
286
- : path(path), message(message) {}
287
-
288
- void log (raw_ostream &OS) const override {
289
- OS << message << " \n " ;
290
- path.print (OS);
291
- }
292
-
293
- std::error_code convertToErrorCode () const override {
294
- // This is a deprecated part of llvm::Error, so we just return a very
295
- // generic value.
296
- return {EINVAL, std::generic_category ()};
297
- }
298
- };
299
- const char XRefError::ID = ' \0 ' ;
300
-
301
- class OverrideError : public llvm ::ErrorInfo<OverrideError> {
302
- public:
303
- enum Kind {
304
- Normal,
305
- DesignatedInitializer
306
- };
307
-
308
- private:
309
- friend ErrorInfo;
310
- static const char ID;
311
-
312
- DeclName name;
313
- Kind kind;
314
-
315
- public:
316
-
317
- explicit OverrideError (DeclName name, Kind kind = Normal)
318
- : name(name), kind(kind) {}
319
-
320
- void log (raw_ostream &OS) const override {
321
- OS << " could not find '" << name << " ' in parent class" ;
322
- }
323
-
324
- Kind getKind () const {
325
- return kind;
326
- }
327
-
328
- std::error_code convertToErrorCode () const override {
329
- // This is a deprecated part of llvm::Error, so we just return a very
330
- // generic value.
331
- return {EINVAL, std::generic_category ()};
332
- }
333
- };
334
- const char OverrideError::ID = ' \0 ' ;
335
122
} // end anonymous namespace
336
123
124
+ const char DeclDeserializationError::ID = ' \0 ' ;
125
+ void DeclDeserializationError::anchor () {}
126
+ const char XRefError::ID = ' \0 ' ;
127
+ void XRefError::anchor () {}
128
+ const char OverrideError::ID = ' \0 ' ;
129
+ void OverrideError::anchor () {}
130
+
337
131
338
132
// / Skips a single record in the bitstream.
339
133
// /
@@ -2721,11 +2515,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2721
2515
2722
2516
auto overridden = getDeclChecked (overriddenID);
2723
2517
if (!overridden) {
2724
- llvm::handleAllErrors (overridden.takeError (),
2725
- [](const XRefError &) { /* expected */ },
2726
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2727
- fatal (std::move (unhandled));
2728
- });
2518
+ llvm::consumeError (overridden.takeError ());
2729
2519
auto kind = OverrideError::Normal;
2730
2520
if (initKind == CtorInitializerKind::Designated)
2731
2521
kind = OverrideError::DesignatedInitializer;
@@ -2822,11 +2612,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2822
2612
2823
2613
Expected<Decl *> overridden = getDeclChecked (overriddenID);
2824
2614
if (!overridden) {
2825
- llvm::handleAllErrors (overridden.takeError (),
2826
- [](const XRefError &) { /* expected */ },
2827
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2828
- fatal (std::move (unhandled));
2829
- });
2615
+ llvm::consumeError (overridden.takeError ());
2830
2616
return llvm::make_error<OverrideError>(name);
2831
2617
}
2832
2618
@@ -2949,11 +2735,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2949
2735
2950
2736
Expected<Decl *> overridden = getDeclChecked (overriddenID);
2951
2737
if (!overridden) {
2952
- llvm::handleAllErrors (overridden.takeError (),
2953
- [](const XRefError &) { /* expected */ },
2954
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2955
- fatal (std::move (unhandled));
2956
- });
2738
+ llvm::consumeError (overridden.takeError ());
2957
2739
return llvm::make_error<OverrideError>(name);
2958
2740
}
2959
2741
@@ -3074,12 +2856,8 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3074
2856
for (unsigned i = 0 ; i != numPatterns; ++i) {
3075
2857
auto pattern = readPattern (dc);
3076
2858
if (!pattern) {
3077
- // Silently drop the pattern if it had an override-related problem.
3078
- llvm::handleAllErrors (pattern.takeError (),
3079
- [](const OverrideError &) { /* expected */ },
3080
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
3081
- fatal (std::move (unhandled));
3082
- });
2859
+ // Silently drop the pattern...
2860
+ llvm::consumeError (pattern.takeError ());
3083
2861
// ...but continue to read any further patterns we're expecting.
3084
2862
continue ;
3085
2863
}
@@ -3486,11 +3264,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3486
3264
3487
3265
Expected<Decl *> overridden = getDeclChecked (overriddenID);
3488
3266
if (!overridden) {
3489
- llvm::handleAllErrors (overridden.takeError (),
3490
- [](const XRefError &) { /* expected */ },
3491
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
3492
- fatal (std::move (unhandled));
3493
- });
3267
+ llvm::consumeError (overridden.takeError ());
3494
3268
return llvm::make_error<OverrideError>(name);
3495
3269
}
3496
3270
@@ -4467,20 +4241,18 @@ void ModuleFile::loadAllMembers(Decl *container, uint64_t contextData) {
4467
4241
if (!getContext ().LangOpts .EnableDeserializationRecovery )
4468
4242
fatal (next.takeError ());
4469
4243
4470
- // Drop the member if it had an override-related problem.
4471
- auto handleMissingOverrideBase = [container](const OverrideError &error) {
4472
- if (error.getKind () != OverrideError::DesignatedInitializer)
4473
- return ;
4474
- auto *containingClass = dyn_cast<ClassDecl>(container);
4475
- if (!containingClass)
4476
- return ;
4477
- containingClass->setHasMissingDesignatedInitializers ();
4478
- };
4479
- llvm::handleAllErrors (next.takeError (),
4480
- handleMissingOverrideBase,
4481
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
4482
- fatal (std::move (unhandled));
4483
- });
4244
+ // Drop the member if it had a problem.
4245
+ if (auto *containingClass = dyn_cast<ClassDecl>(container)) {
4246
+ auto handleMissingDesignatedInit =
4247
+ [containingClass](const DeclDeserializationError &error) {
4248
+ if (error.getKind () != OverrideError::DesignatedInitializer)
4249
+ return ;
4250
+ containingClass->setHasMissingDesignatedInitializers ();
4251
+ };
4252
+ llvm::handleAllErrors (next.takeError (), handleMissingDesignatedInit);
4253
+ } else {
4254
+ llvm::consumeError (next.takeError ());
4255
+ }
4484
4256
continue ;
4485
4257
}
4486
4258
assert (next.get () && " unchecked error deserializing next member" );
0 commit comments