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