diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 16 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 32 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 8 |
4 files changed, 39 insertions, 27 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 97952a04f23..8c393c525eb 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -221,8 +221,6 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) { ArgToStringFn = DummyArgToStringFn; ArgToStringCookie = 0; - - InPostDiagnosticHook = false; } Diagnostic::~Diagnostic() { @@ -411,15 +409,7 @@ void Diagnostic::ProcessDiag() { Client->HandleDiagnostic(DiagLevel, Info); if (Client->IncludeInDiagnosticCounts()) ++NumDiagnostics; - // Invoke any post-diagnostic hooks. - unsigned LastDiag = CurDiagID; CurDiagID = ~0U; - - InPostDiagnosticHook = true; - for (unsigned Hook = 0; Hook < NumPostDiagnosticHooks; ++Hook) - PostDiagnosticHooks[Hook].Hook(LastDiag, - PostDiagnosticHooks[Hook].Cookie); - InPostDiagnosticHook = false; } diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 992d3ecbee2..9662c43bb3e 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -295,3 +295,19 @@ NamedDecl *Sema::getCurFunctionOrMethodDecl() { return 0; } +Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { + this->Emit(); + + // If this is not a note, and we're in a template instantiation + // that is different from the last template instantiation where + // we emitted an error, print a template instantiation + // backtrace. + if (!SemaRef.Diags.isBuiltinNote(DiagID) && + !SemaRef.ActiveTemplateInstantiations.empty() && + SemaRef.ActiveTemplateInstantiations.back() + != SemaRef.LastTemplateInstantiationErrorContext) { + SemaRef.PrintInstantiationStack(); + SemaRef.LastTemplateInstantiationErrorContext + = SemaRef.ActiveTemplateInstantiations.back(); + } +} diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 2e019c9b7f9..76c3b05aab5 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -241,15 +241,30 @@ public: Diagnostic &getDiagnostics() const { return Diags; } SourceManager &getSourceManager() const { return SourceMgr; } - /// The primitive diagnostic helpers. - DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) { + /// \brief Helper class that creates diagnostics with optional + /// template instantiation stacks. + /// + /// This class provides a wrapper around the basic DiagnosticBuilder + /// class that emits diagnostics. SemaDiagnosticBuilder is + /// responsible for emitting the diagnostic (as DiagnosticBuilder + /// does) and, if the diagnostic comes from inside a template + /// instantiation, printing the template instantiation stack as + /// well. + class SemaDiagnosticBuilder : public DiagnosticBuilder { + Sema &SemaRef; + unsigned DiagID; + + public: + SemaDiagnosticBuilder(DiagnosticBuilder &DB, Sema &SemaRef, unsigned DiagID) + : DiagnosticBuilder(DB), SemaRef(SemaRef), DiagID(DiagID) { } + + ~SemaDiagnosticBuilder(); + }; + + /// \brief Emit a diagnostic. + SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) { DiagnosticBuilder DB = Diags.Report(FullSourceLoc(Loc, SourceMgr), DiagID); - if (!Diags.isBuiltinNote(DiagID) && - !ActiveTemplateInstantiations.empty() && - ActiveTemplateInstantiations.back() - != LastTemplateInstantiationErrorContext) - DB << PostDiagnosticHook(PrintInstantiationStackHook, this); - return DB; + return SemaDiagnosticBuilder(DB, *this, DiagID); } virtual void DeleteExpr(ExprTy *E); @@ -1858,7 +1873,6 @@ public: operator=(const InstantiatingTemplate&); // not implemented }; - static void PrintInstantiationStackHook(unsigned DiagID, void *Cookie); void PrintInstantiationStack(); QualType InstantiateType(QualType T, const TemplateArgument *TemplateArgs, diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 10f9926b3e7..e856e91ffcc 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -93,14 +93,6 @@ bool Sema::InstantiatingTemplate::CheckInstantiationDepth( return true; } -/// \brief Post-diagnostic hook for printing the instantiation stack. -void Sema::PrintInstantiationStackHook(unsigned, void *Cookie) { - Sema &SemaRef = *static_cast<Sema*>(Cookie); - SemaRef.PrintInstantiationStack(); - SemaRef.LastTemplateInstantiationErrorContext - = SemaRef.ActiveTemplateInstantiations.back(); -} - /// \brief Prints the current instantiation stack through a series of /// notes. void Sema::PrintInstantiationStack() { |