diff --git a/flang/include/flang/Frontend/CompilerInstance.h b/flang/include/flang/Frontend/CompilerInstance.h index 4ad95c9df42d7..4234e13597cd7 100644 --- a/flang/include/flang/Frontend/CompilerInstance.h +++ b/flang/include/flang/Frontend/CompilerInstance.h @@ -347,7 +347,7 @@ class CompilerInstance { /// /// \return The new object on success, or null on failure. static clang::IntrusiveRefCntPtr - createDiagnostics(clang::DiagnosticOptions *opts, + createDiagnostics(clang::DiagnosticOptions &opts, clang::DiagnosticConsumer *client = nullptr, bool shouldOwnClient = true); void createDiagnostics(clang::DiagnosticConsumer *client = nullptr, diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h index d6ee1511cdb4b..06978029435b7 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -43,7 +43,7 @@ bool parseDiagnosticArgs(clang::DiagnosticOptions &opts, class CompilerInvocationBase { public: /// Options controlling the diagnostic engine. - llvm::IntrusiveRefCntPtr diagnosticOpts; + std::shared_ptr diagnosticOpts; /// Options for the preprocessor. std::shared_ptr preprocessorOpts; diff --git a/flang/include/flang/Frontend/TextDiagnosticPrinter.h b/flang/include/flang/Frontend/TextDiagnosticPrinter.h index 9c99a0c314351..4913713b6c365 100644 --- a/flang/include/flang/Frontend/TextDiagnosticPrinter.h +++ b/flang/include/flang/Frontend/TextDiagnosticPrinter.h @@ -37,13 +37,13 @@ class TextDiagnostic; class TextDiagnosticPrinter : public clang::DiagnosticConsumer { raw_ostream &os; - llvm::IntrusiveRefCntPtr diagOpts; + clang::DiagnosticOptions &diagOpts; /// A string to prefix to error messages. std::string prefix; public: - TextDiagnosticPrinter(raw_ostream &os, clang::DiagnosticOptions *diags); + TextDiagnosticPrinter(raw_ostream &os, clang::DiagnosticOptions &diags); ~TextDiagnosticPrinter() override; /// Set the diagnostic printer prefix string, which will be printed at the diff --git a/flang/lib/Frontend/CompilerInstance.cpp b/flang/lib/Frontend/CompilerInstance.cpp index cbd2c58eeeb47..2e0f91fb0521c 100644 --- a/flang/lib/Frontend/CompilerInstance.cpp +++ b/flang/lib/Frontend/CompilerInstance.cpp @@ -226,12 +226,11 @@ bool CompilerInstance::executeAction(FrontendAction &act) { void CompilerInstance::createDiagnostics(clang::DiagnosticConsumer *client, bool shouldOwnClient) { - diagnostics = - createDiagnostics(&getDiagnosticOpts(), client, shouldOwnClient); + diagnostics = createDiagnostics(getDiagnosticOpts(), client, shouldOwnClient); } clang::IntrusiveRefCntPtr -CompilerInstance::createDiagnostics(clang::DiagnosticOptions *opts, +CompilerInstance::createDiagnostics(clang::DiagnosticOptions &opts, clang::DiagnosticConsumer *client, bool shouldOwnClient) { clang::IntrusiveRefCntPtr diagID( diff --git a/flang/lib/Frontend/TextDiagnosticPrinter.cpp b/flang/lib/Frontend/TextDiagnosticPrinter.cpp index 65626827af3b3..911b78a109e2e 100644 --- a/flang/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/flang/lib/Frontend/TextDiagnosticPrinter.cpp @@ -27,7 +27,7 @@ using namespace Fortran::frontend; TextDiagnosticPrinter::TextDiagnosticPrinter(raw_ostream &diagOs, - clang::DiagnosticOptions *diags) + clang::DiagnosticOptions &diags) : os(diagOs), diagOpts(diags) {} TextDiagnosticPrinter::~TextDiagnosticPrinter() {} @@ -81,7 +81,7 @@ void TextDiagnosticPrinter::printLocForRemarks( llvm::sys::path::make_preferred(absPath); // Used for changing only the bold attribute - if (diagOpts->ShowColors) + if (diagOpts.ShowColors) os.changeColor(llvm::raw_ostream::SAVEDCOLOR, true); // Print path, file name, line and column @@ -113,11 +113,11 @@ void TextDiagnosticPrinter::HandleDiagnostic( printLocForRemarks(diagMessageStream, diagMsg); Fortran::frontend::TextDiagnostic::printDiagnosticLevel(os, level, - diagOpts->ShowColors); + diagOpts.ShowColors); Fortran::frontend::TextDiagnostic::printDiagnosticMessage( os, /*IsSupplemental=*/level == clang::DiagnosticsEngine::Note, diagMsg, - diagOpts->ShowColors); + diagOpts.ShowColors); os.flush(); } diff --git a/flang/tools/flang-driver/driver.cpp b/flang/tools/flang-driver/driver.cpp index ed52988feaa59..35cc2efc0ac01 100644 --- a/flang/tools/flang-driver/driver.cpp +++ b/flang/tools/flang-driver/driver.cpp @@ -43,9 +43,9 @@ std::string getExecutablePath(const char *argv0) { // This lets us create the DiagnosticsEngine with a properly-filled-out // DiagnosticOptions instance -static clang::DiagnosticOptions * +static std::unique_ptr createAndPopulateDiagOpts(llvm::ArrayRef argv) { - auto *diagOpts = new clang::DiagnosticOptions; + auto diagOpts = std::make_unique(); // Ignore missingArgCount and the return value of ParseDiagnosticArgs. // Any errors that would be diagnosed here will also be diagnosed later, @@ -114,17 +114,17 @@ int main(int argc, const char **argv) { // Not in the frontend mode - continue in the compiler driver mode. // Create DiagnosticsEngine for the compiler driver - llvm::IntrusiveRefCntPtr diagOpts = + std::unique_ptr diagOpts = createAndPopulateDiagOpts(args); llvm::IntrusiveRefCntPtr diagID( new clang::DiagnosticIDs()); Fortran::frontend::TextDiagnosticPrinter *diagClient = - new Fortran::frontend::TextDiagnosticPrinter(llvm::errs(), &*diagOpts); + new Fortran::frontend::TextDiagnosticPrinter(llvm::errs(), *diagOpts); diagClient->setPrefix( std::string(llvm::sys::path::stem(getExecutablePath(args[0])))); - clang::DiagnosticsEngine diags(diagID, &*diagOpts, diagClient); + clang::DiagnosticsEngine diags(diagID, *diagOpts, diagClient); // Prepare the driver clang::driver::Driver theDriver(driverPath, diff --git a/flang/tools/flang-driver/fc1_main.cpp b/flang/tools/flang-driver/fc1_main.cpp index 49535275d084d..f2cd513d0028c 100644 --- a/flang/tools/flang-driver/fc1_main.cpp +++ b/flang/tools/flang-driver/fc1_main.cpp @@ -67,9 +67,8 @@ int fc1_main(llvm::ArrayRef argv, const char *argv0) { // for parsing the arguments llvm::IntrusiveRefCntPtr diagID( new clang::DiagnosticIDs()); - llvm::IntrusiveRefCntPtr diagOpts = - new clang::DiagnosticOptions(); - clang::DiagnosticsEngine diags(diagID, &*diagOpts, diagsBuffer); + clang::DiagnosticOptions diagOpts; + clang::DiagnosticsEngine diags(diagID, diagOpts, diagsBuffer); bool success = CompilerInvocation::createFromArgs(flang->getInvocation(), argv, diags, argv0); diff --git a/flang/unittests/Frontend/CodeGenActionTest.cpp b/flang/unittests/Frontend/CodeGenActionTest.cpp index e9ff095973b97..6020abc463eda 100644 --- a/flang/unittests/Frontend/CodeGenActionTest.cpp +++ b/flang/unittests/Frontend/CodeGenActionTest.cpp @@ -86,8 +86,9 @@ class LLVMConversionFailureCodeGenAction : public CodeGenAction { TEST(CodeGenAction, GracefullyHandleLLVMConversionFailure) { std::string diagnosticOutput; llvm::raw_string_ostream diagnosticsOS(diagnosticOutput); + clang::DiagnosticOptions diagOpts; auto diagPrinter = std::make_unique( - diagnosticsOS, new clang::DiagnosticOptions()); + diagnosticsOS, diagOpts); CompilerInstance ci; ci.createDiagnostics(diagPrinter.get(), /*ShouldOwnClient=*/false); diff --git a/flang/unittests/Frontend/CompilerInstanceTest.cpp b/flang/unittests/Frontend/CompilerInstanceTest.cpp index 3fe2f063e996a..8621c14029c15 100644 --- a/flang/unittests/Frontend/CompilerInstanceTest.cpp +++ b/flang/unittests/Frontend/CompilerInstanceTest.cpp @@ -67,18 +67,19 @@ TEST(CompilerInstance, AllowDiagnosticLogWithUnownedDiagnosticConsumer) { // 1. Set-up a basic DiagnosticConsumer std::string diagnosticOutput; llvm::raw_string_ostream diagnosticsOS(diagnosticOutput); + clang::DiagnosticOptions diagPrinterOpts; auto diagPrinter = std::make_unique( - diagnosticsOS, new clang::DiagnosticOptions()); + diagnosticsOS, diagPrinterOpts); // 2. Create a CompilerInstance (to manage a DiagnosticEngine) CompilerInstance compInst; // 3. Set-up DiagnosticOptions - auto diagOpts = new clang::DiagnosticOptions(); + clang::DiagnosticOptions diagOpts; // Tell the diagnostics engine to emit the diagnostic log to STDERR. This // ensures that a chained diagnostic consumer is created so that the test can // exercise the unowned diagnostic consumer in a chained consumer. - diagOpts->DiagnosticLogFile = "-"; + diagOpts.DiagnosticLogFile = "-"; // 4. Create a DiagnosticEngine with an unowned consumer IntrusiveRefCntPtr diags =