r322813 - Fix Scope::dump()

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 19 15:53:23 PST 2018


Sounds like a good idea to me.

On 19 Jan 2018 15:23, "Richard Trieu via cfe-commits" <
cfe-commits at lists.llvm.org> wrote:

> 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
>>
>
>
> _______________________________________________
> 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/4756f7b6/attachment-0001.html>


More information about the cfe-commits mailing list