Author: Jun Zhang Date: 2022-04-16T11:31:40+08:00 New Revision: 7fde4e221300dbdefe9cdd70ff59f22f1dc9aee9
URL: https://github.com/llvm/llvm-project/commit/7fde4e221300dbdefe9cdd70ff59f22f1dc9aee9 DIFF: https://github.com/llvm/llvm-project/commit/7fde4e221300dbdefe9cdd70ff59f22f1dc9aee9.diff LOG: Add some helpers to better check Scope's kind. NFC Signed-off-by: Jun Zhang <j...@junz.org> Added: Modified: clang/include/clang/Sema/Scope.h clang/lib/Parse/ParseDecl.cpp clang/lib/Parse/ParseDeclCXX.cpp clang/lib/Parse/ParseStmt.cpp clang/lib/Parse/Parser.cpp clang/lib/Sema/IdentifierResolver.cpp clang/lib/Sema/SemaCodeComplete.cpp clang/lib/Sema/SemaCoroutine.cpp clang/lib/Sema/SemaExprMember.cpp clang/lib/Sema/SemaStmt.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Scope.h b/clang/include/clang/Sema/Scope.h index 5a2d51b63d909..3255bdc8648df 100644 --- a/clang/include/clang/Sema/Scope.h +++ b/clang/include/clang/Sema/Scope.h @@ -370,11 +370,15 @@ class Scope { } /// isFunctionScope() - Return true if this scope is a function scope. - bool isFunctionScope() const { return (getFlags() & Scope::FnScope); } + bool isFunctionScope() const { return getFlags() & Scope::FnScope; } /// isClassScope - Return true if this scope is a class/struct/union scope. - bool isClassScope() const { - return (getFlags() & Scope::ClassScope); + bool isClassScope() const { return getFlags() & Scope::ClassScope; } + + /// Determines whether this scope is between inheritance colon and the real + /// class/struct definition. + bool isClassInheritanceScope() const { + return getFlags() & Scope::ClassInheritanceScope; } /// isInCXXInlineMethodScope - Return true if this scope is a C++ inline @@ -432,6 +436,9 @@ class Scope { return getFlags() & Scope::AtCatchScope; } + /// isCatchScope - Return true if this scope is a C++ catch statement. + bool isCatchScope() const { return getFlags() & Scope::CatchScope; } + /// isSwitchScope - Return true if this scope is a switch scope. bool isSwitchScope() const { for (const Scope *S = this; S; S = S->getParent()) { @@ -475,9 +482,20 @@ class Scope { return P && P->isOpenMPLoopDirectiveScope(); } + /// Determine whether this scope is a while/do/for statement, which can have + /// continue statements embedded into it. + bool isContinueScope() const { + return getFlags() & ScopeFlags::ContinueScope; + } + /// Determine whether this scope is a C++ 'try' block. bool isTryScope() const { return getFlags() & Scope::TryScope; } + /// Determine whether this scope is a function-level C++ try or catch scope. + bool isFnTryCatchScope() const { + return getFlags() & ScopeFlags::FnTryCatchScope; + } + /// Determine whether this scope is a SEH '__try' block. bool isSEHTryScope() const { return getFlags() & Scope::SEHTryScope; } @@ -489,6 +507,10 @@ class Scope { return getFlags() & Scope::CompoundStmtScope; } + /// Determine whether this scope is a controlling scope in a + /// if/switch/while/for statement. + bool isControlScope() const { return getFlags() & Scope::ControlScope; } + /// Returns if rhs has a higher scope depth than this. /// /// The caller is responsible for calling this only if one of the two scopes diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index ca55fa9311867..233f09213be8c 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -4624,8 +4624,8 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, TypeResult BaseType; SourceRange BaseRange; - bool CanBeBitfield = (getCurScope()->getFlags() & Scope::ClassScope) && - ScopedEnumKWLoc.isInvalid() && Name; + bool CanBeBitfield = + getCurScope()->isClassScope() && ScopedEnumKWLoc.isInvalid() && Name; // Parse the fixed underlying type. if (Tok.is(tok::colon)) { @@ -5021,7 +5021,7 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) { // The next token must be valid after an enum definition. If not, a ';' // was probably forgotten. - bool CanBeBitfield = getCurScope()->getFlags() & Scope::ClassScope; + bool CanBeBitfield = getCurScope()->isClassScope(); if (!isValidAfterTypeSpecifier(CanBeBitfield)) { ExpectAndConsume(tok::semi, diag::err_expected_after, "enum"); // Push this token back into the preprocessor and change our current token @@ -6753,8 +6753,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, // this in C and not C++, where the decls will continue to live in the // surrounding context. SmallVector<NamedDecl *, 0> DeclsInPrototype; - if (getCurScope()->getFlags() & Scope::FunctionDeclarationScope && - !getLangOpts().CPlusPlus) { + if (getCurScope()->isFunctionDeclarationScope() && !getLangOpts().CPlusPlus) { for (Decl *D : getCurScope()->decls()) { NamedDecl *ND = dyn_cast<NamedDecl>(D); if (!ND || isa<ParmVarDecl>(ND)) diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 5d417f5aad1e8..9cf9f7cc4c371 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -3366,7 +3366,7 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, break; } - if ((S->getFlags() & Scope::FnScope)) + if (S->isFunctionScope()) // If we're in a function or function template then this is a local // class rather than a nested class. break; diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index d2c88ceb46203..ce5541a966d17 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -2105,7 +2105,7 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) { // Enter a break / continue scope, if we didn't already enter one while // parsing the second part. - if (!(getCurScope()->getFlags() & Scope::ContinueScope)) + if (!getCurScope()->isContinueScope()) getCurScope()->AddFlags(Scope::BreakScope | Scope::ContinueScope); // Parse the third part of the for statement. diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 2aaaa29af18f7..e72dd93755b48 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -2154,14 +2154,14 @@ SourceLocation Parser::handleUnexpectedCodeCompletionToken() { PrevTokLocation = Tok.getLocation(); for (Scope *S = getCurScope(); S; S = S->getParent()) { - if (S->getFlags() & Scope::FnScope) { + if (S->isFunctionScope()) { cutOffParsing(); Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_RecoveryInFunction); return PrevTokLocation; } - if (S->getFlags() & Scope::ClassScope) { + if (S->isClassScope()) { cutOffParsing(); Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Class); return PrevTokLocation; diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp index 9c5d78fb25d9c..9081714c893f5 100644 --- a/clang/lib/Sema/IdentifierResolver.cpp +++ b/clang/lib/Sema/IdentifierResolver.cpp @@ -123,13 +123,12 @@ bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S, assert(S->getParent() && "No TUScope?"); // If the current decl is in a lambda, we shouldn't consider this is a // redefinition as lambda has its own scope. - if (S->getParent()->getFlags() & Scope::ControlScope && - !S->isFunctionScope()) { + if (S->getParent()->isControlScope() && !S->isFunctionScope()) { S = S->getParent(); if (S->isDeclScope(D)) return true; } - if (S->getFlags() & Scope::FnTryCatchScope) + if (S->isFnTryCatchScope()) return S->getParent()->isDeclScope(D); } return false; diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index c1492ff8aa33c..30720c197d7e7 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -2122,8 +2122,7 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, Scope *S, if (CCC == Sema::PCC_Class) { AddTypedefResult(Results); - bool IsNotInheritanceScope = - !(S->getFlags() & Scope::ClassInheritanceScope); + bool IsNotInheritanceScope = !S->isClassInheritanceScope(); // public: Builder.AddTypedTextChunk("public"); if (IsNotInheritanceScope && Results.includeCodePatterns()) diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp index f60bc807e080b..44a7271910cf1 100644 --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -776,8 +776,8 @@ static bool isWithinCatchScope(Scope *S) { // }(); // } // } - while (S && !(S->getFlags() & Scope::FnScope)) { - if (S->getFlags() & Scope::CatchScope) + while (S && !S->isFunctionScope()) { + if (S->isCatchScope()) return true; S = S->getParent(); } diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index d5e7a2c8e2968..c9d9ef31f3eec 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -940,7 +940,7 @@ static bool IsInFnTryBlockHandler(const Scope *S) { // function scope. If a FnTryCatchScope is found, check whether the TryScope // flag is set. If it is not, it's a function-try-block handler. for (; S != S->getFnParent(); S = S->getParent()) { - if (S->getFlags() & Scope::FnTryCatchScope) + if (S->isFnTryCatchScope()) return (S->getFlags() & Scope::TryScope) != Scope::TryScope; } return false; diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 069ba43959de7..f7ed92d43f3be 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -3312,7 +3312,7 @@ Sema::ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope) { // C99 6.8.6.2p1: A break shall appear only in or as a loop body. return StmtError(Diag(ContinueLoc, diag::err_continue_not_in_loop)); } - if (S->getFlags() & Scope::ConditionVarScope) { + if (S->isConditionVarScope()) { // We cannot 'continue;' from within a statement expression in the // initializer of a condition variable because we would jump past the // initialization of that variable. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits