]> granicus.if.org Git - clang/commitdiff
a few cleanups to StatementCreatesScope: unnest the whole thing,
authorChris Lattner <sabre@nondot.org>
Sun, 12 Apr 2009 20:09:42 +0000 (20:09 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 12 Apr 2009 20:09:42 +0000 (20:09 +0000)
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

lib/Sema/SemaDecl.cpp

index 278d8ecd9015002f0c37be03ee1598f1de9a3987..72611ef08b03f90b24210d3394fe359383f60694 100644 (file)
@@ -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<DeclStmt>(S)) {
-    for (DeclStmt::decl_iterator i = DS->decl_begin();
-         i != DS->decl_end(); ++i) {
-      if (VarDecl* D = dyn_cast<VarDecl>(*i)) {
-        result |= D->getType()->isVariablyModifiedType();
-        result |= !!D->getAttr<CleanupAttr>();
-      } else if (TypedefDecl* D = dyn_cast<TypedefDecl>(*i)) {
-        result |= D->getUnderlyingType()->isVariablyModifiedType();
-      }
+  DeclStmt *DS = dyn_cast<DeclStmt>(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<VarDecl>(*I)) {
+      if (D->getType()->isVariablyModifiedType() ||
+          D->hasAttr<CleanupAttr>())
+        return true;
+    } else if (TypedefDecl *D = dyn_cast<TypedefDecl>(*I)) {
+      if (D->getUnderlyingType()->isVariablyModifiedType())
+        return true;
     }
   }
-
-  return result;
+  
+  return false;
 }
 
+
 void Sema::RecursiveCalcLabelScopes(llvm::DenseMap<Stmt*, void*>& LabelScopeMap,
                                     llvm::DenseMap<void*, Stmt*>& PopScopeMap,
                                     std::vector<void*>& ScopeStack,