Skip to content

Commit 25290bd

Browse files
committed
[AST] Add PrettyStackTrace entries for lazy resolution of witnesses.
This is an area where we have existing bugs and would benefit from better backtraces.
1 parent e013226 commit 25290bd

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

lib/AST/ProtocolConformance.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "swift/AST/TypeWalker.h"
2727
#include "llvm/ADT/MapVector.h"
2828
#include "llvm/ADT/TinyPtrVector.h"
29+
#include "llvm/Support/PrettyStackTrace.h"
2930
#include "llvm/Support/SaveAndRestore.h"
3031

3132
using namespace swift;
@@ -358,6 +359,27 @@ void NormalProtocolConformance::setLazyLoader(LazyMemberLoader *resolver,
358359
ResolverContextData = contextData;
359360
}
360361

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+
361383
bool NormalProtocolConformance::hasTypeWitness(AssociatedTypeDecl *assocType,
362384
LazyResolver *resolver) const {
363385
if (Resolver)
@@ -367,6 +389,7 @@ bool NormalProtocolConformance::hasTypeWitness(AssociatedTypeDecl *assocType,
367389
return true;
368390
}
369391
if (resolver) {
392+
PrettyStackTraceRequirement trace("resolving", this, assocType);
370393
resolver->resolveTypeWitness(this, assocType);
371394
if (TypeWitnesses.find(assocType) != TypeWitnesses.end()) {
372395
return true;
@@ -383,6 +406,7 @@ NormalProtocolConformance::getTypeWitnessAndDecl(AssociatedTypeDecl *assocType,
383406

384407
auto known = TypeWitnesses.find(assocType);
385408
if (known == TypeWitnesses.end()) {
409+
PrettyStackTraceRequirement trace("resolving", this, assocType);
386410
assert(resolver && "Unable to resolve type witness");
387411
resolver->resolveTypeWitness(this, assocType);
388412
known = TypeWitnesses.find(assocType);

0 commit comments

Comments
 (0)