forked from OSchip/llvm-project
Refactor to make MacroState ownership and lifetime clearer.
llvm-svn: 236032
This commit is contained in:
parent
2fbc4e5c49
commit
1e1728536a
|
@ -408,11 +408,20 @@ class Preprocessor : public RefCountedBase<Preprocessor> {
|
|||
public:
|
||||
MacroState() : MacroState(nullptr) {}
|
||||
MacroState(MacroDirective *MD) : State(MD) {}
|
||||
void destroy() {
|
||||
MacroState(MacroState &&O) LLVM_NOEXCEPT : State(O.State) {
|
||||
O.State = (MacroDirective *)nullptr;
|
||||
}
|
||||
MacroState &operator=(MacroState &&O) LLVM_NOEXCEPT {
|
||||
auto S = O.State;
|
||||
O.State = (MacroDirective *)nullptr;
|
||||
State = S;
|
||||
return *this;
|
||||
}
|
||||
~MacroState() {
|
||||
if (auto *Info = State.dyn_cast<ModuleMacroInfo*>())
|
||||
Info->~ModuleMacroInfo();
|
||||
State = (MacroDirective*)nullptr;
|
||||
}
|
||||
|
||||
MacroDirective *getLatest() const {
|
||||
if (auto *Info = State.dyn_cast<ModuleMacroInfo*>())
|
||||
return Info->MD;
|
||||
|
|
|
@ -638,6 +638,8 @@ void Preprocessor::LeaveSubmodule() {
|
|||
bool ExplicitlyPublic = false;
|
||||
for (auto *MD = Macro.second.getLatest(); MD != SavedInfo.Latest;
|
||||
MD = MD->getPrevious()) {
|
||||
assert(MD && "broken macro directive chain");
|
||||
|
||||
// Skip macros defined in other submodules we #included along the way.
|
||||
Module *Mod = getModuleContainingLocation(MD->getLocation());
|
||||
if (Mod != Info.M)
|
||||
|
@ -673,7 +675,8 @@ void Preprocessor::LeaveSubmodule() {
|
|||
Info.M->NameVisibility = Module::MacrosVisible;
|
||||
Info.M->MacroVisibilityLoc = Info.ImportLoc;
|
||||
++MacroVisibilityGeneration;
|
||||
// FIXME: Also mark any exported macros as visible, and check for conflicts.
|
||||
// FIXME: Also mark any exported modules as visible, and check for
|
||||
// conflicts.
|
||||
}
|
||||
|
||||
BuildingSubmoduleStack.pop_back();
|
||||
|
|
|
@ -142,9 +142,6 @@ Preprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
|
|||
Preprocessor::~Preprocessor() {
|
||||
assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
|
||||
|
||||
for (auto &Macro : Macros)
|
||||
Macro.second.destroy();
|
||||
|
||||
IncludeMacroStack.clear();
|
||||
|
||||
// Destroy any macro definitions.
|
||||
|
|
Loading…
Reference in New Issue