diff --git a/clang/include/clang/Lex/Pragma.h b/clang/include/clang/Lex/Pragma.h index 67eca618f6c4f..69ad168c8115f 100644 --- a/clang/include/clang/Lex/Pragma.h +++ b/clang/include/clang/Lex/Pragma.h @@ -96,7 +96,7 @@ class EmptyPragmaHandler : public PragmaHandler { class PragmaNamespace : public PragmaHandler { /// Handlers - This is a map of the handlers in this namespace with their name /// as key. - llvm::StringMap> Handlers; + llvm::StringMap> Handlers; public: explicit PragmaNamespace(StringRef Name) : PragmaHandler(Name) {} @@ -109,11 +109,11 @@ class PragmaNamespace : public PragmaHandler { bool IgnoreNull = true) const; /// AddPragma - Add a pragma to this namespace. - void AddPragma(PragmaHandler *Handler); + void AddPragma(std::shared_ptr Handler); /// RemovePragmaHandler - Remove the given handler from the /// namespace. - void RemovePragmaHandler(PragmaHandler *Handler); + void RemovePragmaHandler(StringRef Name); bool IsEmpty() const { return Handlers.empty(); } diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 3312d4ed1d798..168f46d0adf2f 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -1530,19 +1530,20 @@ class Preprocessor { /// /// If \p Namespace is non-null, then it is a token required to exist on the /// pragma line before the pragma string starts, e.g. "STDC" or "GCC". - void AddPragmaHandler(StringRef Namespace, PragmaHandler *Handler); - void AddPragmaHandler(PragmaHandler *Handler) { + void AddPragmaHandler(StringRef Namespace, + std::shared_ptr Handler); + void AddPragmaHandler(std::shared_ptr Handler) { AddPragmaHandler(StringRef(), Handler); } /// Remove the specific pragma handler from this preprocessor. /// /// If \p Namespace is non-null, then it should be the namespace that - /// \p Handler was added to. It is an error to remove a handler that + /// \p HandlerName was added to. It is an error to remove a handler that /// has not been registered. - void RemovePragmaHandler(StringRef Namespace, PragmaHandler *Handler); - void RemovePragmaHandler(PragmaHandler *Handler) { - RemovePragmaHandler(StringRef(), Handler); + void RemovePragmaHandler(StringRef Namespace, StringRef HandlerName); + void RemovePragmaHandler(StringRef HandlerName) { + RemovePragmaHandler(StringRef(), HandlerName); } /// Install empty handlers for all pragmas (making them ignored). diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index d3838a4cc8418..032b0f7cc4669 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -173,54 +173,57 @@ class Parser : public CodeCompletionHandler { // used as type traits. llvm::SmallDenseMap RevertibleTypeTraits; - std::unique_ptr AlignHandler; - std::unique_ptr GCCVisibilityHandler; - std::unique_ptr OptionsHandler; - std::unique_ptr PackHandler; - std::unique_ptr MSStructHandler; - std::unique_ptr UnusedHandler; - std::unique_ptr WeakHandler; - std::unique_ptr RedefineExtnameHandler; - std::unique_ptr FPContractHandler; - std::unique_ptr OpenCLExtensionHandler; - std::unique_ptr OpenMPHandler; - std::unique_ptr OpenACCHandler; - std::unique_ptr PCSectionHandler; - std::unique_ptr MSCommentHandler; - std::unique_ptr MSDetectMismatchHandler; - std::unique_ptr FPEvalMethodHandler; - std::unique_ptr FloatControlHandler; - std::unique_ptr MSPointersToMembers; - std::unique_ptr MSVtorDisp; - std::unique_ptr MSInitSeg; - std::unique_ptr MSDataSeg; - std::unique_ptr MSBSSSeg; - std::unique_ptr MSConstSeg; - std::unique_ptr MSCodeSeg; - std::unique_ptr MSSection; - std::unique_ptr MSStrictGuardStackCheck; - std::unique_ptr MSRuntimeChecks; - std::unique_ptr MSIntrinsic; - std::unique_ptr MSFunction; - std::unique_ptr MSOptimize; - std::unique_ptr MSFenvAccess; - std::unique_ptr MSAllocText; - std::unique_ptr CUDAForceHostDeviceHandler; - std::unique_ptr OptimizeHandler; - std::unique_ptr LoopHintHandler; - std::unique_ptr UnrollHintHandler; - std::unique_ptr NoUnrollHintHandler; - std::unique_ptr UnrollAndJamHintHandler; - std::unique_ptr NoUnrollAndJamHintHandler; - std::unique_ptr FPHandler; - std::unique_ptr STDCFenvAccessHandler; - std::unique_ptr STDCFenvRoundHandler; - std::unique_ptr STDCCXLIMITHandler; - std::unique_ptr STDCUnknownHandler; - std::unique_ptr AttributePragmaHandler; - std::unique_ptr MaxTokensHerePragmaHandler; - std::unique_ptr MaxTokensTotalPragmaHandler; - std::unique_ptr RISCVPragmaHandler; + /// Factory object for creating ParsedAttr objects. + AttributeFactory AttrFactory; + + std::shared_ptr AlignHandler; + std::shared_ptr GCCVisibilityHandler; + std::shared_ptr OptionsHandler; + std::shared_ptr PackHandler; + std::shared_ptr MSStructHandler; + std::shared_ptr UnusedHandler; + std::shared_ptr WeakHandler; + std::shared_ptr RedefineExtnameHandler; + std::shared_ptr FPContractHandler; + std::shared_ptr OpenCLExtensionHandler; + std::shared_ptr OpenMPHandler; + std::shared_ptr OpenACCHandler; + std::shared_ptr PCSectionHandler; + std::shared_ptr MSCommentHandler; + std::shared_ptr MSDetectMismatchHandler; + std::shared_ptr FPEvalMethodHandler; + std::shared_ptr FloatControlHandler; + std::shared_ptr MSPointersToMembers; + std::shared_ptr MSVtorDisp; + std::shared_ptr MSInitSeg; + std::shared_ptr MSDataSeg; + std::shared_ptr MSBSSSeg; + std::shared_ptr MSConstSeg; + std::shared_ptr MSCodeSeg; + std::shared_ptr MSSection; + std::shared_ptr MSStrictGuardStackCheck; + std::shared_ptr MSRuntimeChecks; + std::shared_ptr MSIntrinsic; + std::shared_ptr MSFunction; + std::shared_ptr MSOptimize; + std::shared_ptr MSFenvAccess; + std::shared_ptr MSAllocText; + std::shared_ptr CUDAForceHostDeviceHandler; + std::shared_ptr OptimizeHandler; + std::shared_ptr LoopHintHandler; + std::shared_ptr UnrollHintHandler; + std::shared_ptr NoUnrollHintHandler; + std::shared_ptr UnrollAndJamHintHandler; + std::shared_ptr NoUnrollAndJamHintHandler; + std::shared_ptr FPHandler; + std::shared_ptr STDCFenvAccessHandler; + std::shared_ptr STDCFenvRoundHandler; + std::shared_ptr STDCCXLIMITHandler; + std::shared_ptr STDCUnknownHandler; + std::shared_ptr AttributePragmaHandler; + std::shared_ptr MaxTokensHerePragmaHandler; + std::shared_ptr MaxTokensTotalPragmaHandler; + std::shared_ptr RISCVPragmaHandler; std::unique_ptr CommentSemaHandler; @@ -311,9 +314,6 @@ class Parser : public CodeCompletionHandler { unsigned getOriginalDepth() const { return Depth - AddedLevels; } }; - /// Factory object for creating ParsedAttr objects. - AttributeFactory AttrFactory; - /// Gathers and cleans up TemplateIdAnnotations when parsing of a /// top-level declaration is finished. SmallVector TemplateIds; diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp index 1005825441b3e..7686c7acffcde 100644 --- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp +++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp @@ -1095,32 +1095,32 @@ void clang::DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream *OS, // Expand macros in pragmas with -fms-extensions. The assumption is that // the majority of pragmas in such a file will be Microsoft pragmas. // Remember the handlers we will add so that we can remove them later. - std::unique_ptr MicrosoftExtHandler( + std::shared_ptr MicrosoftExtHandler( new UnknownPragmaHandler( "#pragma", Callbacks, /*RequireTokenExpansion=*/PP.getLangOpts().MicrosoftExt)); - std::unique_ptr GCCHandler(new UnknownPragmaHandler( + std::shared_ptr GCCHandler(new UnknownPragmaHandler( "#pragma GCC", Callbacks, /*RequireTokenExpansion=*/PP.getLangOpts().MicrosoftExt)); - std::unique_ptr ClangHandler(new UnknownPragmaHandler( + std::shared_ptr ClangHandler(new UnknownPragmaHandler( "#pragma clang", Callbacks, /*RequireTokenExpansion=*/PP.getLangOpts().MicrosoftExt)); - PP.AddPragmaHandler(MicrosoftExtHandler.get()); - PP.AddPragmaHandler("GCC", GCCHandler.get()); - PP.AddPragmaHandler("clang", ClangHandler.get()); + PP.AddPragmaHandler(MicrosoftExtHandler); + PP.AddPragmaHandler("GCC", GCCHandler); + PP.AddPragmaHandler("clang", ClangHandler); // The tokens after pragma omp need to be expanded. // // OpenMP [2.1, Directive format] // Preprocessing tokens following the #pragma omp are subject to macro // replacement. - std::unique_ptr OpenMPHandler( + std::shared_ptr OpenMPHandler( new UnknownPragmaHandler("#pragma omp", Callbacks, /*RequireTokenExpansion=*/true)); - PP.AddPragmaHandler("omp", OpenMPHandler.get()); + PP.AddPragmaHandler("omp", OpenMPHandler); PP.addPPCallbacks(std::unique_ptr(Callbacks)); @@ -1153,8 +1153,8 @@ void clang::DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream *OS, // Remove the handlers we just added to leave the preprocessor in a sane state // so that it can be reused (for example by a clang::Parser instance). - PP.RemovePragmaHandler(MicrosoftExtHandler.get()); - PP.RemovePragmaHandler("GCC", GCCHandler.get()); - PP.RemovePragmaHandler("clang", ClangHandler.get()); - PP.RemovePragmaHandler("omp", OpenMPHandler.get()); + PP.RemovePragmaHandler(MicrosoftExtHandler->getName()); + PP.RemovePragmaHandler("GCC", GCCHandler->getName()); + PP.RemovePragmaHandler("clang", ClangHandler->getName()); + PP.RemovePragmaHandler("omp", OpenMPHandler->getName()); } diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index e339ca8422278..8b385d8a9668b 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -85,18 +85,15 @@ PragmaHandler *PragmaNamespace::FindHandler(StringRef Name, return nullptr; } -void PragmaNamespace::AddPragma(PragmaHandler *Handler) { +void PragmaNamespace::AddPragma(std::shared_ptr Handler) { assert(!Handlers.count(Handler->getName()) && "A handler with this name is already registered in this namespace"); - Handlers[Handler->getName()].reset(Handler); + Handlers[Handler->getName()] = Handler; } -void PragmaNamespace::RemovePragmaHandler(PragmaHandler *Handler) { - auto I = Handlers.find(Handler->getName()); - assert(I != Handlers.end() && - "Handler not registered in this namespace"); - // Release ownership back to the caller. - I->getValue().release(); +void PragmaNamespace::RemovePragmaHandler(StringRef Name) { + auto I = Handlers.find(Name); + assert(I != Handlers.end() && "Handler not registered in this namespace"); Handlers.erase(I); } @@ -909,7 +906,7 @@ void Preprocessor::HandlePragmaHdrstop(Token &Tok) { /// If 'Namespace' is non-null, then it is a token required to exist on the /// pragma line before the pragma string starts, e.g. "STDC" or "GCC". void Preprocessor::AddPragmaHandler(StringRef Namespace, - PragmaHandler *Handler) { + std::shared_ptr Handler) { PragmaNamespace *InsertNS = PragmaHandlers.get(); // If this is specified to be in a namespace, step down into it. @@ -925,7 +922,7 @@ void Preprocessor::AddPragmaHandler(StringRef Namespace, // Otherwise, this namespace doesn't exist yet, create and insert the // handler for it. InsertNS = new PragmaNamespace(Namespace); - PragmaHandlers->AddPragma(InsertNS); + PragmaHandlers->AddPragma(std::shared_ptr(InsertNS)); } } @@ -940,7 +937,7 @@ void Preprocessor::AddPragmaHandler(StringRef Namespace, /// namespace that \arg Handler was added to. It is an error to remove /// a handler that has not been registered. void Preprocessor::RemovePragmaHandler(StringRef Namespace, - PragmaHandler *Handler) { + StringRef HandlerName) { PragmaNamespace *NS = PragmaHandlers.get(); // If this is specified to be in a namespace, step down into it. @@ -952,13 +949,11 @@ void Preprocessor::RemovePragmaHandler(StringRef Namespace, assert(NS && "Invalid namespace, registered as a regular pragma handler!"); } - NS->RemovePragmaHandler(Handler); + NS->RemovePragmaHandler(HandlerName); // If this is a non-default namespace and it is now empty, remove it. - if (NS != PragmaHandlers.get() && NS->IsEmpty()) { - PragmaHandlers->RemovePragmaHandler(NS); - delete NS; - } + if (NS != PragmaHandlers.get() && NS->IsEmpty()) + PragmaHandlers->RemovePragmaHandler(NS->getName()); } bool Preprocessor::LexOnOffSwitch(tok::OnOffSwitch &Result) { @@ -2127,73 +2122,76 @@ struct PragmaFinalHandler : public PragmaHandler { /// RegisterBuiltinPragmas - Install the standard preprocessor pragmas: /// \#pragma GCC poison/system_header/dependency and \#pragma once. void Preprocessor::RegisterBuiltinPragmas() { - AddPragmaHandler(new PragmaOnceHandler()); - AddPragmaHandler(new PragmaMarkHandler()); - AddPragmaHandler(new PragmaPushMacroHandler()); - AddPragmaHandler(new PragmaPopMacroHandler()); - AddPragmaHandler(new PragmaMessageHandler(PPCallbacks::PMK_Message)); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler( + std::make_shared(PPCallbacks::PMK_Message)); // #pragma GCC ... - AddPragmaHandler("GCC", new PragmaPoisonHandler()); - AddPragmaHandler("GCC", new PragmaSystemHeaderHandler()); - AddPragmaHandler("GCC", new PragmaDependencyHandler()); - AddPragmaHandler("GCC", new PragmaDiagnosticHandler("GCC")); - AddPragmaHandler("GCC", new PragmaMessageHandler(PPCallbacks::PMK_Warning, - "GCC")); - AddPragmaHandler("GCC", new PragmaMessageHandler(PPCallbacks::PMK_Error, - "GCC")); + AddPragmaHandler("GCC", std::make_shared()); + AddPragmaHandler("GCC", std::make_shared()); + AddPragmaHandler("GCC", std::make_shared()); + AddPragmaHandler("GCC", std::make_shared("GCC")); + AddPragmaHandler("GCC", std::make_shared( + PPCallbacks::PMK_Warning, "GCC")); + AddPragmaHandler("GCC", std::make_shared( + PPCallbacks::PMK_Error, "GCC")); // #pragma clang ... - AddPragmaHandler("clang", new PragmaPoisonHandler()); - AddPragmaHandler("clang", new PragmaSystemHeaderHandler()); - AddPragmaHandler("clang", new PragmaDebugHandler()); - AddPragmaHandler("clang", new PragmaDependencyHandler()); - AddPragmaHandler("clang", new PragmaDiagnosticHandler("clang")); - AddPragmaHandler("clang", new PragmaARCCFCodeAuditedHandler()); - AddPragmaHandler("clang", new PragmaAssumeNonNullHandler()); - AddPragmaHandler("clang", new PragmaDeprecatedHandler()); - AddPragmaHandler("clang", new PragmaRestrictExpansionHandler()); - AddPragmaHandler("clang", new PragmaFinalHandler()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared("clang")); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); // #pragma clang module ... - auto *ModuleHandler = new PragmaNamespace("module"); + std::shared_ptr ModuleHandler = + std::make_shared("module"); AddPragmaHandler("clang", ModuleHandler); - ModuleHandler->AddPragma(new PragmaModuleImportHandler()); - ModuleHandler->AddPragma(new PragmaModuleBeginHandler()); - ModuleHandler->AddPragma(new PragmaModuleEndHandler()); - ModuleHandler->AddPragma(new PragmaModuleBuildHandler()); - ModuleHandler->AddPragma(new PragmaModuleLoadHandler()); + ModuleHandler->AddPragma(std::make_shared()); + ModuleHandler->AddPragma(std::make_shared()); + ModuleHandler->AddPragma(std::make_shared()); + ModuleHandler->AddPragma(std::make_shared()); + ModuleHandler->AddPragma(std::make_shared()); // Safe Buffers pragmas - AddPragmaHandler("clang", new PragmaUnsafeBufferUsageHandler); + AddPragmaHandler("clang", std::make_shared()); // Add region pragmas. - AddPragmaHandler(new PragmaRegionHandler("region")); - AddPragmaHandler(new PragmaRegionHandler("endregion")); + AddPragmaHandler(std::make_shared("region")); + AddPragmaHandler(std::make_shared("endregion")); // MS extensions. if (LangOpts.MicrosoftExt) { - AddPragmaHandler(new PragmaWarningHandler()); - AddPragmaHandler(new PragmaExecCharsetHandler()); - AddPragmaHandler(new PragmaIncludeAliasHandler()); - AddPragmaHandler(new PragmaHdrstopHandler()); - AddPragmaHandler(new PragmaSystemHeaderHandler()); - AddPragmaHandler(new PragmaManagedHandler("managed")); - AddPragmaHandler(new PragmaManagedHandler("unmanaged")); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared()); + AddPragmaHandler(std::make_shared("managed")); + AddPragmaHandler(std::make_shared("unmanaged")); } // Pragmas added by plugins for (const PragmaHandlerRegistry::entry &handler : PragmaHandlerRegistry::entries()) { - AddPragmaHandler(handler.instantiate().release()); + AddPragmaHandler( + std::shared_ptr(handler.instantiate().release())); } } /// Ignore all pragmas, useful for modes such as -Eonly which would otherwise /// warn about those pragmas being unknown. void Preprocessor::IgnorePragmas() { - AddPragmaHandler(new EmptyPragmaHandler()); + AddPragmaHandler(std::make_shared()); // Also ignore all pragmas in all namespaces created // in Preprocessor::RegisterBuiltinPragmas(). - AddPragmaHandler("GCC", new EmptyPragmaHandler()); - AddPragmaHandler("clang", new EmptyPragmaHandler()); + AddPragmaHandler("GCC", std::make_shared()); + AddPragmaHandler("clang", std::make_shared()); } diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 21ebff1e50559..b2f695ff65d37 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -418,289 +418,242 @@ void markAsReinjectedForRelexing(llvm::MutableArrayRef Toks) { } // end namespace void Parser::initializePragmaHandlers() { - AlignHandler = std::make_unique(); - PP.AddPragmaHandler(AlignHandler.get()); + AlignHandler = std::make_shared(); + PP.AddPragmaHandler(AlignHandler); - GCCVisibilityHandler = std::make_unique(); - PP.AddPragmaHandler("GCC", GCCVisibilityHandler.get()); + GCCVisibilityHandler = std::make_shared(); + PP.AddPragmaHandler("GCC", GCCVisibilityHandler); - OptionsHandler = std::make_unique(); - PP.AddPragmaHandler(OptionsHandler.get()); + OptionsHandler = std::make_shared(); + PP.AddPragmaHandler(OptionsHandler); - PackHandler = std::make_unique(); - PP.AddPragmaHandler(PackHandler.get()); + PackHandler = std::make_shared(); + PP.AddPragmaHandler(PackHandler); - MSStructHandler = std::make_unique(); - PP.AddPragmaHandler(MSStructHandler.get()); + MSStructHandler = std::make_shared(); + PP.AddPragmaHandler(MSStructHandler); - UnusedHandler = std::make_unique(); - PP.AddPragmaHandler(UnusedHandler.get()); + UnusedHandler = std::make_shared(); + PP.AddPragmaHandler(UnusedHandler); - WeakHandler = std::make_unique(); - PP.AddPragmaHandler(WeakHandler.get()); + WeakHandler = std::make_shared(); + PP.AddPragmaHandler(WeakHandler); - RedefineExtnameHandler = std::make_unique(); - PP.AddPragmaHandler(RedefineExtnameHandler.get()); + RedefineExtnameHandler = std::make_shared(); + PP.AddPragmaHandler(RedefineExtnameHandler); - FPContractHandler = std::make_unique(); - PP.AddPragmaHandler("STDC", FPContractHandler.get()); + FPContractHandler = std::make_shared(); + PP.AddPragmaHandler("STDC", FPContractHandler); - STDCFenvAccessHandler = std::make_unique(); - PP.AddPragmaHandler("STDC", STDCFenvAccessHandler.get()); + STDCFenvAccessHandler = std::make_shared(); + PP.AddPragmaHandler("STDC", STDCFenvAccessHandler); - STDCFenvRoundHandler = std::make_unique(); - PP.AddPragmaHandler("STDC", STDCFenvRoundHandler.get()); + STDCFenvRoundHandler = std::make_shared(); + PP.AddPragmaHandler("STDC", STDCFenvRoundHandler); - STDCCXLIMITHandler = std::make_unique(); - PP.AddPragmaHandler("STDC", STDCCXLIMITHandler.get()); + STDCCXLIMITHandler = std::make_shared(); + PP.AddPragmaHandler("STDC", STDCCXLIMITHandler); - STDCUnknownHandler = std::make_unique(); - PP.AddPragmaHandler("STDC", STDCUnknownHandler.get()); + STDCUnknownHandler = std::make_shared(); + PP.AddPragmaHandler("STDC", STDCUnknownHandler); - PCSectionHandler = std::make_unique(Actions); - PP.AddPragmaHandler("clang", PCSectionHandler.get()); + PCSectionHandler = std::make_shared(Actions); + PP.AddPragmaHandler("clang", PCSectionHandler); if (getLangOpts().OpenCL) { - OpenCLExtensionHandler = std::make_unique(); - PP.AddPragmaHandler("OPENCL", OpenCLExtensionHandler.get()); + OpenCLExtensionHandler = std::make_shared(); + PP.AddPragmaHandler("OPENCL", OpenCLExtensionHandler); - PP.AddPragmaHandler("OPENCL", FPContractHandler.get()); + PP.AddPragmaHandler("OPENCL", FPContractHandler); } if (getLangOpts().OpenMP) - OpenMPHandler = std::make_unique(); + OpenMPHandler = std::make_shared(); else - OpenMPHandler = std::make_unique(); - PP.AddPragmaHandler(OpenMPHandler.get()); + OpenMPHandler = std::make_shared(); + PP.AddPragmaHandler(OpenMPHandler); if (getLangOpts().OpenACC) - OpenACCHandler = std::make_unique(); + OpenACCHandler = std::make_shared(); else - OpenACCHandler = std::make_unique(); - PP.AddPragmaHandler(OpenACCHandler.get()); + OpenACCHandler = std::make_shared(); + PP.AddPragmaHandler(OpenACCHandler); if (getLangOpts().MicrosoftExt || getTargetInfo().getTriple().isOSBinFormatELF()) { - MSCommentHandler = std::make_unique(Actions); - PP.AddPragmaHandler(MSCommentHandler.get()); + MSCommentHandler = std::make_shared(Actions); + PP.AddPragmaHandler(MSCommentHandler); } - FloatControlHandler = std::make_unique(Actions); - PP.AddPragmaHandler(FloatControlHandler.get()); + FloatControlHandler = std::make_shared(Actions); + PP.AddPragmaHandler(FloatControlHandler); if (getLangOpts().MicrosoftExt) { MSDetectMismatchHandler = - std::make_unique(Actions); - PP.AddPragmaHandler(MSDetectMismatchHandler.get()); - MSPointersToMembers = std::make_unique(); - PP.AddPragmaHandler(MSPointersToMembers.get()); - MSVtorDisp = std::make_unique(); - PP.AddPragmaHandler(MSVtorDisp.get()); - MSInitSeg = std::make_unique("init_seg"); - PP.AddPragmaHandler(MSInitSeg.get()); - MSDataSeg = std::make_unique("data_seg"); - PP.AddPragmaHandler(MSDataSeg.get()); - MSBSSSeg = std::make_unique("bss_seg"); - PP.AddPragmaHandler(MSBSSSeg.get()); - MSConstSeg = std::make_unique("const_seg"); - PP.AddPragmaHandler(MSConstSeg.get()); - MSCodeSeg = std::make_unique("code_seg"); - PP.AddPragmaHandler(MSCodeSeg.get()); - MSSection = std::make_unique("section"); - PP.AddPragmaHandler(MSSection.get()); + std::make_shared(Actions); + PP.AddPragmaHandler(MSDetectMismatchHandler); + MSPointersToMembers = std::make_shared(); + PP.AddPragmaHandler(MSPointersToMembers); + MSVtorDisp = std::make_shared(); + PP.AddPragmaHandler(MSVtorDisp); + MSInitSeg = std::make_shared("init_seg"); + PP.AddPragmaHandler(MSInitSeg); + MSDataSeg = std::make_shared("data_seg"); + PP.AddPragmaHandler(MSDataSeg); + MSBSSSeg = std::make_shared("bss_seg"); + PP.AddPragmaHandler(MSBSSSeg); + MSConstSeg = std::make_shared("const_seg"); + PP.AddPragmaHandler(MSConstSeg); + MSCodeSeg = std::make_shared("code_seg"); + PP.AddPragmaHandler(MSCodeSeg); + MSSection = std::make_shared("section"); + PP.AddPragmaHandler(MSSection); MSStrictGuardStackCheck = - std::make_unique("strict_gs_check"); - PP.AddPragmaHandler(MSStrictGuardStackCheck.get()); - MSFunction = std::make_unique("function"); - PP.AddPragmaHandler(MSFunction.get()); - MSAllocText = std::make_unique("alloc_text"); - PP.AddPragmaHandler(MSAllocText.get()); - MSOptimize = std::make_unique("optimize"); - PP.AddPragmaHandler(MSOptimize.get()); - MSRuntimeChecks = std::make_unique(); - PP.AddPragmaHandler(MSRuntimeChecks.get()); - MSIntrinsic = std::make_unique(); - PP.AddPragmaHandler(MSIntrinsic.get()); - MSFenvAccess = std::make_unique(); - PP.AddPragmaHandler(MSFenvAccess.get()); + std::make_shared("strict_gs_check"); + PP.AddPragmaHandler(MSStrictGuardStackCheck); + MSFunction = std::make_shared("function"); + PP.AddPragmaHandler(MSFunction); + MSAllocText = std::make_shared("alloc_text"); + PP.AddPragmaHandler(MSAllocText); + MSOptimize = std::make_shared("optimize"); + PP.AddPragmaHandler(MSOptimize); + MSRuntimeChecks = std::make_shared(); + PP.AddPragmaHandler(MSRuntimeChecks); + MSIntrinsic = std::make_shared(); + PP.AddPragmaHandler(MSIntrinsic); + MSFenvAccess = std::make_shared(); + PP.AddPragmaHandler(MSFenvAccess); } if (getLangOpts().CUDA) { CUDAForceHostDeviceHandler = - std::make_unique(Actions); - PP.AddPragmaHandler("clang", CUDAForceHostDeviceHandler.get()); + std::make_shared(Actions); + PP.AddPragmaHandler("clang", CUDAForceHostDeviceHandler); } - OptimizeHandler = std::make_unique(Actions); - PP.AddPragmaHandler("clang", OptimizeHandler.get()); + OptimizeHandler = std::make_shared(Actions); + PP.AddPragmaHandler("clang", OptimizeHandler); - LoopHintHandler = std::make_unique(); - PP.AddPragmaHandler("clang", LoopHintHandler.get()); + LoopHintHandler = std::make_shared(); + PP.AddPragmaHandler("clang", LoopHintHandler); - UnrollHintHandler = std::make_unique("unroll"); - PP.AddPragmaHandler(UnrollHintHandler.get()); - PP.AddPragmaHandler("GCC", UnrollHintHandler.get()); + UnrollHintHandler = std::make_shared("unroll"); + PP.AddPragmaHandler(UnrollHintHandler); + PP.AddPragmaHandler("GCC", UnrollHintHandler); - NoUnrollHintHandler = std::make_unique("nounroll"); - PP.AddPragmaHandler(NoUnrollHintHandler.get()); - PP.AddPragmaHandler("GCC", NoUnrollHintHandler.get()); + NoUnrollHintHandler = std::make_shared("nounroll"); + PP.AddPragmaHandler(NoUnrollHintHandler); + PP.AddPragmaHandler("GCC", NoUnrollHintHandler); UnrollAndJamHintHandler = - std::make_unique("unroll_and_jam"); - PP.AddPragmaHandler(UnrollAndJamHintHandler.get()); + std::make_shared("unroll_and_jam"); + PP.AddPragmaHandler(UnrollAndJamHintHandler); NoUnrollAndJamHintHandler = - std::make_unique("nounroll_and_jam"); - PP.AddPragmaHandler(NoUnrollAndJamHintHandler.get()); + std::make_shared("nounroll_and_jam"); + PP.AddPragmaHandler(NoUnrollAndJamHintHandler); - FPHandler = std::make_unique(); - PP.AddPragmaHandler("clang", FPHandler.get()); + FPHandler = std::make_shared(); + PP.AddPragmaHandler("clang", FPHandler); AttributePragmaHandler = - std::make_unique(AttrFactory); - PP.AddPragmaHandler("clang", AttributePragmaHandler.get()); + std::make_shared(AttrFactory); + PP.AddPragmaHandler("clang", AttributePragmaHandler); - MaxTokensHerePragmaHandler = std::make_unique(); - PP.AddPragmaHandler("clang", MaxTokensHerePragmaHandler.get()); + MaxTokensHerePragmaHandler = std::make_shared(); + PP.AddPragmaHandler("clang", MaxTokensHerePragmaHandler); - MaxTokensTotalPragmaHandler = std::make_unique(); - PP.AddPragmaHandler("clang", MaxTokensTotalPragmaHandler.get()); + MaxTokensTotalPragmaHandler = std::make_shared(); + PP.AddPragmaHandler("clang", MaxTokensTotalPragmaHandler); if (getTargetInfo().getTriple().isRISCV()) { - RISCVPragmaHandler = std::make_unique(Actions); - PP.AddPragmaHandler("clang", RISCVPragmaHandler.get()); + RISCVPragmaHandler = std::make_shared(Actions); + PP.AddPragmaHandler("clang", RISCVPragmaHandler); } } void Parser::resetPragmaHandlers() { // Remove the pragma handlers we installed. - PP.RemovePragmaHandler(AlignHandler.get()); - AlignHandler.reset(); - PP.RemovePragmaHandler("GCC", GCCVisibilityHandler.get()); - GCCVisibilityHandler.reset(); - PP.RemovePragmaHandler(OptionsHandler.get()); - OptionsHandler.reset(); - PP.RemovePragmaHandler(PackHandler.get()); - PackHandler.reset(); - PP.RemovePragmaHandler(MSStructHandler.get()); - MSStructHandler.reset(); - PP.RemovePragmaHandler(UnusedHandler.get()); - UnusedHandler.reset(); - PP.RemovePragmaHandler(WeakHandler.get()); - WeakHandler.reset(); - PP.RemovePragmaHandler(RedefineExtnameHandler.get()); - RedefineExtnameHandler.reset(); + PP.RemovePragmaHandler(AlignHandler->getName()); + PP.RemovePragmaHandler("GCC", GCCVisibilityHandler->getName()); + PP.RemovePragmaHandler(OptionsHandler->getName()); + PP.RemovePragmaHandler(PackHandler->getName()); + PP.RemovePragmaHandler(MSStructHandler->getName()); + PP.RemovePragmaHandler(UnusedHandler->getName()); + PP.RemovePragmaHandler(WeakHandler->getName()); + PP.RemovePragmaHandler(RedefineExtnameHandler->getName()); if (getLangOpts().OpenCL) { - PP.RemovePragmaHandler("OPENCL", OpenCLExtensionHandler.get()); - OpenCLExtensionHandler.reset(); - PP.RemovePragmaHandler("OPENCL", FPContractHandler.get()); + PP.RemovePragmaHandler("OPENCL", OpenCLExtensionHandler->getName()); + PP.RemovePragmaHandler("OPENCL", FPContractHandler->getName()); } - PP.RemovePragmaHandler(OpenMPHandler.get()); - OpenMPHandler.reset(); + PP.RemovePragmaHandler(OpenMPHandler->getName()); - PP.RemovePragmaHandler(OpenACCHandler.get()); - OpenACCHandler.reset(); + PP.RemovePragmaHandler(OpenACCHandler->getName()); if (getLangOpts().MicrosoftExt || getTargetInfo().getTriple().isOSBinFormatELF()) { - PP.RemovePragmaHandler(MSCommentHandler.get()); - MSCommentHandler.reset(); + PP.RemovePragmaHandler(MSCommentHandler->getName()); } - PP.RemovePragmaHandler("clang", PCSectionHandler.get()); - PCSectionHandler.reset(); + PP.RemovePragmaHandler("clang", PCSectionHandler->getName()); - PP.RemovePragmaHandler(FloatControlHandler.get()); - FloatControlHandler.reset(); + PP.RemovePragmaHandler(FloatControlHandler->getName()); if (getLangOpts().MicrosoftExt) { - PP.RemovePragmaHandler(MSDetectMismatchHandler.get()); - MSDetectMismatchHandler.reset(); - PP.RemovePragmaHandler(MSPointersToMembers.get()); - MSPointersToMembers.reset(); - PP.RemovePragmaHandler(MSVtorDisp.get()); - MSVtorDisp.reset(); - PP.RemovePragmaHandler(MSInitSeg.get()); - MSInitSeg.reset(); - PP.RemovePragmaHandler(MSDataSeg.get()); - MSDataSeg.reset(); - PP.RemovePragmaHandler(MSBSSSeg.get()); - MSBSSSeg.reset(); - PP.RemovePragmaHandler(MSConstSeg.get()); - MSConstSeg.reset(); - PP.RemovePragmaHandler(MSCodeSeg.get()); - MSCodeSeg.reset(); - PP.RemovePragmaHandler(MSSection.get()); - MSSection.reset(); - PP.RemovePragmaHandler(MSStrictGuardStackCheck.get()); - MSStrictGuardStackCheck.reset(); - PP.RemovePragmaHandler(MSFunction.get()); - MSFunction.reset(); - PP.RemovePragmaHandler(MSAllocText.get()); - MSAllocText.reset(); - PP.RemovePragmaHandler(MSRuntimeChecks.get()); - MSRuntimeChecks.reset(); - PP.RemovePragmaHandler(MSIntrinsic.get()); - MSIntrinsic.reset(); - PP.RemovePragmaHandler(MSOptimize.get()); - MSOptimize.reset(); - PP.RemovePragmaHandler(MSFenvAccess.get()); - MSFenvAccess.reset(); + PP.RemovePragmaHandler(MSDetectMismatchHandler->getName()); + PP.RemovePragmaHandler(MSPointersToMembers->getName()); + PP.RemovePragmaHandler(MSVtorDisp->getName()); + PP.RemovePragmaHandler(MSInitSeg->getName()); + PP.RemovePragmaHandler(MSDataSeg->getName()); + PP.RemovePragmaHandler(MSBSSSeg->getName()); + PP.RemovePragmaHandler(MSConstSeg->getName()); + PP.RemovePragmaHandler(MSCodeSeg->getName()); + PP.RemovePragmaHandler(MSSection->getName()); + PP.RemovePragmaHandler(MSStrictGuardStackCheck->getName()); + PP.RemovePragmaHandler(MSFunction->getName()); + PP.RemovePragmaHandler(MSAllocText->getName()); + PP.RemovePragmaHandler(MSRuntimeChecks->getName()); + PP.RemovePragmaHandler(MSIntrinsic->getName()); + PP.RemovePragmaHandler(MSOptimize->getName()); + PP.RemovePragmaHandler(MSFenvAccess->getName()); } if (getLangOpts().CUDA) { - PP.RemovePragmaHandler("clang", CUDAForceHostDeviceHandler.get()); - CUDAForceHostDeviceHandler.reset(); + PP.RemovePragmaHandler("clang", CUDAForceHostDeviceHandler->getName()); } - PP.RemovePragmaHandler("STDC", FPContractHandler.get()); - FPContractHandler.reset(); + PP.RemovePragmaHandler("STDC", FPContractHandler->getName()); - PP.RemovePragmaHandler("STDC", STDCFenvAccessHandler.get()); - STDCFenvAccessHandler.reset(); + PP.RemovePragmaHandler("STDC", STDCFenvAccessHandler->getName()); - PP.RemovePragmaHandler("STDC", STDCFenvRoundHandler.get()); - STDCFenvRoundHandler.reset(); + PP.RemovePragmaHandler("STDC", STDCFenvRoundHandler->getName()); - PP.RemovePragmaHandler("STDC", STDCCXLIMITHandler.get()); - STDCCXLIMITHandler.reset(); + PP.RemovePragmaHandler("STDC", STDCCXLIMITHandler->getName()); - PP.RemovePragmaHandler("STDC", STDCUnknownHandler.get()); - STDCUnknownHandler.reset(); + PP.RemovePragmaHandler("STDC", STDCUnknownHandler->getName()); - PP.RemovePragmaHandler("clang", OptimizeHandler.get()); - OptimizeHandler.reset(); + PP.RemovePragmaHandler("clang", OptimizeHandler->getName()); - PP.RemovePragmaHandler("clang", LoopHintHandler.get()); - LoopHintHandler.reset(); + PP.RemovePragmaHandler("clang", LoopHintHandler->getName()); - PP.RemovePragmaHandler(UnrollHintHandler.get()); - PP.RemovePragmaHandler("GCC", UnrollHintHandler.get()); - UnrollHintHandler.reset(); + PP.RemovePragmaHandler(UnrollHintHandler->getName()); + PP.RemovePragmaHandler("GCC", UnrollHintHandler->getName()); - PP.RemovePragmaHandler(NoUnrollHintHandler.get()); - PP.RemovePragmaHandler("GCC", NoUnrollHintHandler.get()); - NoUnrollHintHandler.reset(); + PP.RemovePragmaHandler(NoUnrollHintHandler->getName()); + PP.RemovePragmaHandler("GCC", NoUnrollHintHandler->getName()); - PP.RemovePragmaHandler(UnrollAndJamHintHandler.get()); - UnrollAndJamHintHandler.reset(); + PP.RemovePragmaHandler(UnrollAndJamHintHandler->getName()); - PP.RemovePragmaHandler(NoUnrollAndJamHintHandler.get()); - NoUnrollAndJamHintHandler.reset(); + PP.RemovePragmaHandler(NoUnrollAndJamHintHandler->getName()); - PP.RemovePragmaHandler("clang", FPHandler.get()); - FPHandler.reset(); + PP.RemovePragmaHandler("clang", FPHandler->getName()); - PP.RemovePragmaHandler("clang", AttributePragmaHandler.get()); - AttributePragmaHandler.reset(); + PP.RemovePragmaHandler("clang", AttributePragmaHandler->getName()); - PP.RemovePragmaHandler("clang", MaxTokensHerePragmaHandler.get()); - MaxTokensHerePragmaHandler.reset(); + PP.RemovePragmaHandler("clang", MaxTokensHerePragmaHandler->getName()); - PP.RemovePragmaHandler("clang", MaxTokensTotalPragmaHandler.get()); - MaxTokensTotalPragmaHandler.reset(); + PP.RemovePragmaHandler("clang", MaxTokensTotalPragmaHandler->getName()); if (getTargetInfo().getTriple().isRISCV()) { - PP.RemovePragmaHandler("clang", RISCVPragmaHandler.get()); - RISCVPragmaHandler.reset(); + PP.RemovePragmaHandler("clang", RISCVPragmaHandler->getName()); } }