From fec15edbe5f8f676f5d3f9ac6667031ae9aef13c Mon Sep 17 00:00:00 2001 From: codegallivant Date: Fri, 13 Mar 2026 04:42:46 +0530 Subject: [PATCH] add DiagnosticsEngineRAII --- lib/CppInterOp/Compatibility.h | 20 ++++++++++++++++++++ lib/CppInterOp/CppInterOp.cpp | 9 ++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/CppInterOp/Compatibility.h b/lib/CppInterOp/Compatibility.h index c63d631a0..af7ada224 100644 --- a/lib/CppInterOp/Compatibility.h +++ b/lib/CppInterOp/Compatibility.h @@ -430,6 +430,7 @@ class SynthesizingCodeRAII { SynthesizingCodeRAII(Interpreter* i) : m_Interpreter(i) {} // ~SynthesizingCodeRAII() {} // TODO: implement }; + } // namespace compat #endif // CPPINTEROP_USE_REPL @@ -466,6 +467,25 @@ inline void InstantiateClassTemplateSpecialization( /*PrimaryHasMatchedPackOnParmToNonPackOnArg=*/false); #endif } + +class DiagnosticsEngineRAII { +private: + clang::DiagnosticsEngine& diags; + +public: + bool reset_condition; // additional condition to reset diagnostics + + DiagnosticsEngineRAII(clang::DiagnosticsEngine& d, bool c = true) + : diags(d), reset_condition(c) {} + ~DiagnosticsEngineRAII() { + if (diags.hasErrorOccurred() && reset_condition) { + // instantiation failed, need to reset DiagnosticsEngine + diags.Reset(/*soft=*/true); + diags.getClient()->clear(); + } + } +}; + } // namespace compat #endif // CPPINTEROP_COMPATIBILITY_H diff --git a/lib/CppInterOp/CppInterOp.cpp b/lib/CppInterOp/CppInterOp.cpp index c9cd8b166..5b0b6f561 100644 --- a/lib/CppInterOp/CppInterOp.cpp +++ b/lib/CppInterOp/CppInterOp.cpp @@ -312,13 +312,8 @@ static void InstantiateFunctionDefinition(Decl* D) { getSema().InstantiateFunctionDefinition(SourceLocation(), FD, /*Recursive=*/true, /*DefinitionRequired=*/true); - // FIXME: this can go into a RAII object - clang::DiagnosticsEngine& Diags = getSema().getDiagnostics(); - if (!FD->isDefined() && Diags.hasErrorOccurred()) { - // instantiation failed, need to reset DiagnosticsEngine - Diags.Reset(/*soft=*/true); - Diags.getClient()->clear(); - } + compat::DiagnosticsEngineRAII diagsRAII(getSema().getDiagnostics(), + !FD->isDefined()); } }