26
26
#include " swift/AST/TypeWalker.h"
27
27
#include " llvm/ADT/MapVector.h"
28
28
#include " llvm/ADT/TinyPtrVector.h"
29
+ #include " llvm/Support/PrettyStackTrace.h"
29
30
#include " llvm/Support/SaveAndRestore.h"
30
31
31
32
using namespace swift ;
@@ -358,6 +359,27 @@ void NormalProtocolConformance::setLazyLoader(LazyMemberLoader *resolver,
358
359
ResolverContextData = contextData;
359
360
}
360
361
362
+ namespace {
363
+ class PrettyStackTraceRequirement : public llvm ::PrettyStackTraceEntry {
364
+ const char *Action;
365
+ const ProtocolConformance *Conformance;
366
+ ValueDecl *Requirement;
367
+ public:
368
+ PrettyStackTraceRequirement (const char *action,
369
+ const ProtocolConformance *conformance,
370
+ ValueDecl *requirement)
371
+ : Action(action), Conformance(conformance), Requirement(requirement) { }
372
+
373
+ virtual void print (llvm::raw_ostream &out) const {
374
+ out << " While " << Action << " requirement " ;
375
+ Requirement->dumpRef (out);
376
+ out << " in conformance " ;
377
+ Conformance->printName (out);
378
+ out << " \n " ;
379
+ }
380
+ };
381
+ }
382
+
361
383
bool NormalProtocolConformance::hasTypeWitness (AssociatedTypeDecl *assocType,
362
384
LazyResolver *resolver) const {
363
385
if (Resolver)
@@ -367,6 +389,7 @@ bool NormalProtocolConformance::hasTypeWitness(AssociatedTypeDecl *assocType,
367
389
return true ;
368
390
}
369
391
if (resolver) {
392
+ PrettyStackTraceRequirement trace (" resolving" , this , assocType);
370
393
resolver->resolveTypeWitness (this , assocType);
371
394
if (TypeWitnesses.find (assocType) != TypeWitnesses.end ()) {
372
395
return true ;
@@ -383,6 +406,7 @@ NormalProtocolConformance::getTypeWitnessAndDecl(AssociatedTypeDecl *assocType,
383
406
384
407
auto known = TypeWitnesses.find (assocType);
385
408
if (known == TypeWitnesses.end ()) {
409
+ PrettyStackTraceRequirement trace (" resolving" , this , assocType);
386
410
assert (resolver && " Unable to resolve type witness" );
387
411
resolver->resolveTypeWitness (this , assocType);
388
412
known = TypeWitnesses.find (assocType);
0 commit comments