r322813 - Fix Scope::dump()
Richard Trieu via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 19 15:23:00 PST 2018
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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180119/f0d3d09e/attachment.html>
More information about the cfe-commits
mailing list