Hans, I recommend merging this revision into the release. It fixes an infinite loop in Scope::dump()
Richard On Wed, Jan 17, 2018 at 8:28 PM, Richard Trieu via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: rtrieu > Date: Wed Jan 17 20:28:56 2018 > New Revision: 322813 > > URL: http://llvm.org/viewvc/llvm-project?rev=322813&view=rev > Log: > Fix Scope::dump() > > The dump function for Scope only has 20 out of the 24 flags. Since it > looped > until no flags were left, having an unknown flag lead to an infinite loop. > That loop has been changed to a single pass for each flag, plus an assert > to > alert if new flags are added. > > Modified: > cfe/trunk/lib/Sema/Scope.cpp > > Modified: cfe/trunk/lib/Sema/Scope.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Scope > .cpp?rev=322813&r1=322812&r2=322813&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Sema/Scope.cpp (original) > +++ cfe/trunk/lib/Sema/Scope.cpp Wed Jan 17 20:28:56 2018 > @@ -143,72 +143,43 @@ void Scope::dumpImpl(raw_ostream &OS) co > if (HasFlags) > OS << "Flags: "; > > - while (Flags) { > - if (Flags & FnScope) { > - OS << "FnScope"; > - Flags &= ~FnScope; > - } else if (Flags & BreakScope) { > - OS << "BreakScope"; > - Flags &= ~BreakScope; > - } else if (Flags & ContinueScope) { > - OS << "ContinueScope"; > - Flags &= ~ContinueScope; > - } else if (Flags & DeclScope) { > - OS << "DeclScope"; > - Flags &= ~DeclScope; > - } else if (Flags & ControlScope) { > - OS << "ControlScope"; > - Flags &= ~ControlScope; > - } else if (Flags & ClassScope) { > - OS << "ClassScope"; > - Flags &= ~ClassScope; > - } else if (Flags & BlockScope) { > - OS << "BlockScope"; > - Flags &= ~BlockScope; > - } else if (Flags & TemplateParamScope) { > - OS << "TemplateParamScope"; > - Flags &= ~TemplateParamScope; > - } else if (Flags & FunctionPrototypeScope) { > - OS << "FunctionPrototypeScope"; > - Flags &= ~FunctionPrototypeScope; > - } else if (Flags & FunctionDeclarationScope) { > - OS << "FunctionDeclarationScope"; > - Flags &= ~FunctionDeclarationScope; > - } else if (Flags & AtCatchScope) { > - OS << "AtCatchScope"; > - Flags &= ~AtCatchScope; > - } else if (Flags & ObjCMethodScope) { > - OS << "ObjCMethodScope"; > - Flags &= ~ObjCMethodScope; > - } else if (Flags & SwitchScope) { > - OS << "SwitchScope"; > - Flags &= ~SwitchScope; > - } else if (Flags & TryScope) { > - OS << "TryScope"; > - Flags &= ~TryScope; > - } else if (Flags & FnTryCatchScope) { > - OS << "FnTryCatchScope"; > - Flags &= ~FnTryCatchScope; > - } else if (Flags & SEHTryScope) { > - OS << "SEHTryScope"; > - Flags &= ~SEHTryScope; > - } else if (Flags & SEHExceptScope) { > - OS << "SEHExceptScope"; > - Flags &= ~SEHExceptScope; > - } else if (Flags & OpenMPDirectiveScope) { > - OS << "OpenMPDirectiveScope"; > - Flags &= ~OpenMPDirectiveScope; > - } else if (Flags & OpenMPLoopDirectiveScope) { > - OS << "OpenMPLoopDirectiveScope"; > - Flags &= ~OpenMPLoopDirectiveScope; > - } else if (Flags & OpenMPSimdDirectiveScope) { > - OS << "OpenMPSimdDirectiveScope"; > - Flags &= ~OpenMPSimdDirectiveScope; > - } > + std::pair<unsigned, const char *> FlagInfo[] = { > + {FnScope, "FnScope"}, > + {BreakScope, "BreakScope"}, > + {ContinueScope, "ContinueScope"}, > + {DeclScope, "DeclScope"}, > + {ControlScope, "ControlScope"}, > + {ClassScope, "ClassScope"}, > + {BlockScope, "BlockScope"}, > + {TemplateParamScope, "TemplateParamScope"}, > + {FunctionPrototypeScope, "FunctionPrototypeScope"}, > + {FunctionDeclarationScope, "FunctionDeclarationScope"}, > + {AtCatchScope, "AtCatchScope"}, > + {ObjCMethodScope, "ObjCMethodScope"}, > + {SwitchScope, "SwitchScope"}, > + {TryScope, "TryScope"}, > + {FnTryCatchScope, "FnTryCatchScope"}, > + {OpenMPDirectiveScope, "OpenMPDirectiveScope"}, > + {OpenMPLoopDirectiveScope, "OpenMPLoopDirectiveScope"}, > + {OpenMPSimdDirectiveScope, "OpenMPSimdDirectiveScope"}, > + {EnumScope, "EnumScope"}, > + {SEHTryScope, "SEHTryScope"}, > + {SEHExceptScope, "SEHExceptScope"}, > + {SEHFilterScope, "SEHFilterScope"}, > + {CompoundStmtScope, "CompoundStmtScope"}, > + {ClassInheritanceScope, "ClassInheritanceScope"}}; > > - if (Flags) > - OS << " | "; > + for (auto Info : FlagInfo) { > + if (Flags & Info.first) { > + OS << Info.second; > + Flags &= ~Info.first; > + if (Flags) > + OS << " | "; > + } > } > + > + assert(Flags == 0 && "Unknown scope flags"); > + > if (HasFlags) > OS << '\n'; > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits