From: Chris Lattner Date: Sun, 12 Apr 2009 20:09:42 +0000 (+0000) Subject: a few cleanups to StatementCreatesScope: unnest the whole thing, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bfc861e703895cc6d1ec2403dfebf68b90ae0992;p=clang a few cleanups to StatementCreatesScope: unnest the whole thing, exit at the first decl found that creates a scope, don't evaluate decl_end() every iteration. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68908 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 278d8ecd90..72611ef08b 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2865,22 +2865,25 @@ Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclPtrTy D) { } static bool StatementCreatesScope(Stmt* S) { - bool result = false; - if (DeclStmt* DS = dyn_cast(S)) { - for (DeclStmt::decl_iterator i = DS->decl_begin(); - i != DS->decl_end(); ++i) { - if (VarDecl* D = dyn_cast(*i)) { - result |= D->getType()->isVariablyModifiedType(); - result |= !!D->getAttr(); - } else if (TypedefDecl* D = dyn_cast(*i)) { - result |= D->getUnderlyingType()->isVariablyModifiedType(); - } + DeclStmt *DS = dyn_cast(S); + if (DS == 0) return false; + + for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end(); + I != E; ++I) { + if (VarDecl *D = dyn_cast(*I)) { + if (D->getType()->isVariablyModifiedType() || + D->hasAttr()) + return true; + } else if (TypedefDecl *D = dyn_cast(*I)) { + if (D->getUnderlyingType()->isVariablyModifiedType()) + return true; } } - - return result; + + return false; } + void Sema::RecursiveCalcLabelScopes(llvm::DenseMap& LabelScopeMap, llvm::DenseMap& PopScopeMap, std::vector& ScopeStack,