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