<p dir="ltr">FYI, this broke my Windows ASan bot.<br>
Unfortunately I'm on the go now so can't provide you with details.<br>
You can talk to Reid if you need them.</p>
<div class="gmail_quote">07 марта 2014 г. 16:58 пользователь "Aaron Ballman" <<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>> написал:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: aaronballman<br>
Date: Fri Mar  7 06:50:00 2014<br>
New Revision: 203236<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=203236&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=203236&view=rev</a><br>
Log:<br>
[C++11] Replacing iterators attr_begin() and attr_end() with iterator_range attrs(). Updating all of the usages of the iterators with range-based for loops.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h<br>
    cfe/trunk/include/clang/AST/DeclBase.h<br>
    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h<br>
    cfe/trunk/lib/AST/ASTDumper.cpp<br>
    cfe/trunk/lib/AST/Decl.cpp<br>
    cfe/trunk/lib/AST/DeclBase.cpp<br>
    cfe/trunk/lib/Sema/SemaCodeComplete.cpp<br>
    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
    cfe/trunk/lib/Sema/SemaObjCProperty.cpp<br>
    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
    cfe/trunk/tools/libclang/CIndex.cpp<br>
    cfe/trunk/tools/libclang/IndexingContext.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original)<br>
+++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Fri Mar  7 06:50:00 2014<br>
@@ -598,8 +598,8 @@ bool DataRecursiveASTVisitor<Derived>::T<br>
   }<br>
<br>
   // Visit any attributes attached to this declaration.<br>
-  for (Decl::attr_iterator I=D->attr_begin(), E=D->attr_end(); I != E; ++I) {<br>
-    if (!getDerived().TraverseAttr(*I))<br>
+  for (auto I : D->attrs()) {<br>
+    if (!getDerived().TraverseAttr(I))<br>
       return false;<br>
   }<br>
   return true;<br>
<br>
Modified: cfe/trunk/include/clang/AST/DeclBase.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/DeclBase.h (original)<br>
+++ cfe/trunk/include/clang/AST/DeclBase.h Fri Mar  7 06:50:00 2014<br>
@@ -18,6 +18,7 @@<br>
 #include "clang/AST/DeclarationName.h"<br>
 #include "clang/Basic/Linkage.h"<br>
 #include "clang/Basic/Specifiers.h"<br>
+#include "llvm/ADT/iterator_range.h"<br>
 #include "llvm/ADT/PointerUnion.h"<br>
 #include "llvm/ADT/iterator_range.h"<br>
 #include "llvm/Support/Compiler.h"<br>
@@ -447,14 +448,23 @@ public:<br>
   }<br>
<br>
   typedef AttrVec::const_iterator attr_iterator;<br>
+  typedef llvm::iterator_range<attr_iterator> attr_range;<br>
+<br>
+  attr_range attrs() const {<br>
+    // FIXME: Do not rely on iterators having comparable singular values.<br>
+    //        Note that this should error out if they do not.<br>
+    if (!hasAttrs())<br>
+      return attr_range();<br>
+<br>
+    auto const &A = getAttrs();<br>
+    return attr_range(A.begin(), A.end());<br>
+  }<br>
<br>
-  // FIXME: Do not rely on iterators having comparable singular values.<br>
-  //        Note that this should error out if they do not.<br>
   attr_iterator attr_begin() const {<br>
-    return hasAttrs() ? getAttrs().begin() : 0;<br>
+    return attrs().begin();<br>
   }<br>
   attr_iterator attr_end() const {<br>
-    return hasAttrs() ? getAttrs().end() : 0;<br>
+    return attrs().end();<br>
   }<br>
<br>
   template <typename T><br>
<br>
Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)<br>
+++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Fri Mar  7 06:50:00 2014<br>
@@ -669,8 +669,8 @@ bool RecursiveASTVisitor<Derived>::Trave<br>
   }<br>
<br>
   // Visit any attributes attached to this declaration.<br>
-  for (Decl::attr_iterator I=D->attr_begin(), E=D->attr_end(); I != E; ++I) {<br>
-    if (!getDerived().TraverseAttr(*I))<br>
+  for (auto I : D->attrs()) {<br>
+    if (!getDerived().TraverseAttr(I))<br>
       return false;<br>
   }<br>
   return true;<br>
<br>
Modified: cfe/trunk/lib/AST/ASTDumper.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/ASTDumper.cpp (original)<br>
+++ cfe/trunk/lib/AST/ASTDumper.cpp Fri Mar  7 06:50:00 2014<br>
@@ -762,7 +762,7 @@ void ASTDumper::dumpDecl(const Decl *D)<br>
     if (ND->isHidden())<br>
       OS << " hidden";<br>
<br>
-  bool HasAttrs = D->attr_begin() != D->attr_end();<br>
+  bool HasAttrs = D->hasAttrs();<br>
   const FullComment *Comment =<br>
       D->getASTContext().getLocalCommentForDeclUncached(D);<br>
   // Decls within functions are visited by the body<br>
<br>
Modified: cfe/trunk/lib/AST/Decl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/Decl.cpp (original)<br>
+++ cfe/trunk/lib/AST/Decl.cpp Fri Mar  7 06:50:00 2014<br>
@@ -3501,8 +3501,8 @@ LabelDecl *LabelDecl::CreateDeserialized<br>
 void ValueDecl::anchor() { }<br>
<br>
 bool ValueDecl::isWeak() const {<br>
-  for (attr_iterator I = attr_begin(), E = attr_end(); I != E; ++I)<br>
-    if (isa<WeakAttr>(*I) || isa<WeakRefAttr>(*I))<br>
+  for (auto I : attrs())<br>
+    if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I))<br>
       return true;<br>
<br>
   return isWeakImported();<br>
<br>
Modified: cfe/trunk/lib/AST/DeclBase.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/DeclBase.cpp (original)<br>
+++ cfe/trunk/lib/AST/DeclBase.cpp Fri Mar  7 06:50:00 2014<br>
@@ -408,8 +408,8 @@ AvailabilityResult Decl::getAvailability<br>
   AvailabilityResult Result = AR_Available;<br>
   std::string ResultMessage;<br>
<br>
-  for (attr_iterator A = attr_begin(), AEnd = attr_end(); A != AEnd; ++A) {<br>
-    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {<br>
+  for (auto A : attrs()) {<br>
+    if (auto Deprecated = dyn_cast<DeprecatedAttr>(A)) {<br>
       if (Result >= AR_Deprecated)<br>
         continue;<br>
<br>
@@ -420,13 +420,13 @@ AvailabilityResult Decl::getAvailability<br>
       continue;<br>
     }<br>
<br>
-    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {<br>
+    if (auto Unavailable = dyn_cast<UnavailableAttr>(A)) {<br>
       if (Message)<br>
         *Message = Unavailable->getMessage();<br>
       return AR_Unavailable;<br>
     }<br>
<br>
-    if (AvailabilityAttr *Availability = dyn_cast<AvailabilityAttr>(*A)) {<br>
+    if (auto Availability = dyn_cast<AvailabilityAttr>(A)) {<br>
       AvailabilityResult AR = CheckAvailability(getASTContext(), Availability,<br>
                                                 Message);<br>
<br>
@@ -482,11 +482,11 @@ bool Decl::isWeakImported() const {<br>
   if (!canBeWeakImported(IsDefinition))<br>
     return false;<br>
<br>
-  for (attr_iterator A = attr_begin(), AEnd = attr_end(); A != AEnd; ++A) {<br>
-    if (isa<WeakImportAttr>(*A))<br>
+  for (auto A : attrs()) {<br>
+    if (isa<WeakImportAttr>(A))<br>
       return true;<br>
<br>
-    if (AvailabilityAttr *Availability = dyn_cast<AvailabilityAttr>(*A)) {<br>
+    if (AvailabilityAttr *Availability = dyn_cast<AvailabilityAttr>(A)) {<br>
       if (CheckAvailability(getASTContext(), Availability, 0)<br>
                                                          == AR_NotYetIntroduced)<br>
         return true;<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Fri Mar  7 06:50:00 2014<br>
@@ -2638,12 +2638,11 @@ CodeCompletionResult::CreateCodeCompleti<br>
     return Result.TakeString();<br>
   }<br>
<br>
-  for (Decl::attr_iterator i = ND->attr_begin(); i != ND->attr_end(); ++i) {<br>
-    if (AnnotateAttr *Attr = dyn_cast_or_null<AnnotateAttr>(*i)) {<br>
-      Result.AddAnnotation(Result.getAllocator().CopyString(Attr->getAnnotation()));<br>
-    }<br>
-  }<br>
-<br>
+  for (auto i = ND->specific_attr_begin<AnnotateAttr>(),<br>
+            e = ND->specific_attr_end<AnnotateAttr>(); i != e; ++i)<br>
+    Result.AddAnnotation(<br>
+        Result.getAllocator().CopyString((*i)->getAnnotation()));<br>
+<br>
   AddResultTypeChunk(Ctx, Policy, ND, Result);<br>
<br>
   if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) {<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Mar  7 06:50:00 2014<br>
@@ -1791,16 +1791,16 @@ void Sema::MergeTypedefNameDecl(TypedefN<br>
 static bool DeclHasAttr(const Decl *D, const Attr *A) {<br>
   const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);<br>
   const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);<br>
-  for (Decl::attr_iterator i = D->attr_begin(), e = D->attr_end(); i != e; ++i)<br>
-    if ((*i)->getKind() == A->getKind()) {<br>
+  for (auto i : D->attrs())<br>
+    if (i->getKind() == A->getKind()) {<br>
       if (Ann) {<br>
-        if (Ann->getAnnotation() == cast<AnnotateAttr>(*i)->getAnnotation())<br>
+        if (Ann->getAnnotation() == cast<AnnotateAttr>(i)->getAnnotation())<br>
           return true;<br>
         continue;<br>
       }<br>
       // FIXME: Don't hardcode this check<br>
-      if (OA && isa<OwnershipAttr>(*i))<br>
-        return OA->getOwnKind() == cast<OwnershipAttr>(*i)->getOwnKind();<br>
+      if (OA && isa<OwnershipAttr>(i))<br>
+        return OA->getOwnKind() == cast<OwnershipAttr>(i)->getOwnKind();<br>
       return true;<br>
     }<br>
<br>
@@ -1997,12 +1997,9 @@ static const Decl *getDefinition(const D<br>
 }<br>
<br>
 static bool hasAttribute(const Decl *D, attr::Kind Kind) {<br>
-  for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end();<br>
-       I != E; ++I) {<br>
-    Attr *Attribute = *I;<br>
+  for (auto Attribute : D->attrs())<br>
     if (Attribute->getKind() == Kind)<br>
       return true;<br>
-  }<br>
   return false;<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Mar  7 06:50:00 2014<br>
@@ -12723,48 +12723,41 @@ bool Sema::checkThisInStaticMemberFuncti<br>
   FindCXXThisExpr Finder(*this);<br>
<br>
   // Check attributes.<br>
-  for (Decl::attr_iterator A = Method->attr_begin(), AEnd = Method->attr_end();<br>
-       A != AEnd; ++A) {<br>
+  for (auto A : Method->attrs()) {<br>
     // FIXME: This should be emitted by tblgen.<br>
     Expr *Arg = 0;<br>
     ArrayRef<Expr *> Args;<br>
-    if (GuardedByAttr *G = dyn_cast<GuardedByAttr>(*A))<br>
+    if (auto G = dyn_cast<GuardedByAttr>(A))<br>
       Arg = G->getArg();<br>
-    else if (PtGuardedByAttr *G = dyn_cast<PtGuardedByAttr>(*A))<br>
+    else if (auto G = dyn_cast<PtGuardedByAttr>(A))<br>
       Arg = G->getArg();<br>
-    else if (AcquiredAfterAttr *AA = dyn_cast<AcquiredAfterAttr>(*A))<br>
+    else if (auto AA = dyn_cast<AcquiredAfterAttr>(A))<br>
       Args = ArrayRef<Expr *>(AA->args_begin(), AA->args_size());<br>
-    else if (AcquiredBeforeAttr *AB = dyn_cast<AcquiredBeforeAttr>(*A))<br>
+    else if (auto AB = dyn_cast<AcquiredBeforeAttr>(A))<br>
       Args = ArrayRef<Expr *>(AB->args_begin(), AB->args_size());<br>
-    else if (ExclusiveLockFunctionAttr *ELF<br>
-               = dyn_cast<ExclusiveLockFunctionAttr>(*A))<br>
+    else if (auto ELF  = dyn_cast<ExclusiveLockFunctionAttr>(A))<br>
       Args = ArrayRef<Expr *>(ELF->args_begin(), ELF->args_size());<br>
-    else if (SharedLockFunctionAttr *SLF<br>
-               = dyn_cast<SharedLockFunctionAttr>(*A))<br>
+    else if (auto SLF  = dyn_cast<SharedLockFunctionAttr>(A))<br>
       Args = ArrayRef<Expr *>(SLF->args_begin(), SLF->args_size());<br>
-    else if (ExclusiveTrylockFunctionAttr *ETLF<br>
-               = dyn_cast<ExclusiveTrylockFunctionAttr>(*A)) {<br>
+    else if (auto ETLF = dyn_cast<ExclusiveTrylockFunctionAttr>(A)) {<br>
       Arg = ETLF->getSuccessValue();<br>
       Args = ArrayRef<Expr *>(ETLF->args_begin(), ETLF->args_size());<br>
-    } else if (SharedTrylockFunctionAttr *STLF<br>
-                 = dyn_cast<SharedTrylockFunctionAttr>(*A)) {<br>
+    } else if (auto STLF = dyn_cast<SharedTrylockFunctionAttr>(A)) {<br>
       Arg = STLF->getSuccessValue();<br>
       Args = ArrayRef<Expr *>(STLF->args_begin(), STLF->args_size());<br>
-    } else if (UnlockFunctionAttr *UF = dyn_cast<UnlockFunctionAttr>(*A))<br>
+    } else if (auto UF = dyn_cast<UnlockFunctionAttr>(A))<br>
       Args = ArrayRef<Expr *>(UF->args_begin(), UF->args_size());<br>
-    else if (LockReturnedAttr *LR = dyn_cast<LockReturnedAttr>(*A))<br>
+    else if (auto LR = dyn_cast<LockReturnedAttr>(A))<br>
       Arg = LR->getArg();<br>
-    else if (LocksExcludedAttr *LE = dyn_cast<LocksExcludedAttr>(*A))<br>
+    else if (auto LE = dyn_cast<LocksExcludedAttr>(A))<br>
       Args = ArrayRef<Expr *>(LE->args_begin(), LE->args_size());<br>
-    else if (RequiresCapabilityAttr *RC<br>
-               = dyn_cast<RequiresCapabilityAttr>(*A))<br>
+    else if (auto RC = dyn_cast<RequiresCapabilityAttr>(A))<br>
       Args = ArrayRef<Expr *>(RC->args_begin(), RC->args_size());<br>
-    else if (AcquireCapabilityAttr *AC = dyn_cast<AcquireCapabilityAttr>(*A))<br>
+    else if (auto AC = dyn_cast<AcquireCapabilityAttr>(A))<br>
       Args = ArrayRef<Expr *>(AC->args_begin(), AC->args_size());<br>
-    else if (TryAcquireCapabilityAttr *AC<br>
-             = dyn_cast<TryAcquireCapabilityAttr>(*A))<br>
-             Args = ArrayRef<Expr *>(AC->args_begin(), AC->args_size());<br>
-    else if (ReleaseCapabilityAttr *RC = dyn_cast<ReleaseCapabilityAttr>(*A))<br>
+    else if (auto AC = dyn_cast<TryAcquireCapabilityAttr>(A))<br>
+      Args = ArrayRef<Expr *>(AC->args_begin(), AC->args_size());<br>
+    else if (auto RC = dyn_cast<ReleaseCapabilityAttr>(A))<br>
       Args = ArrayRef<Expr *>(RC->args_begin(), RC->args_size());<br>
<br>
     if (Arg && !Finder.TraverseStmt(Arg))<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Fri Mar  7 06:50:00 2014<br>
@@ -1940,13 +1940,11 @@ void Sema::DiagnoseMissingDesignatedInit<br>
 static void AddPropertyAttrs(Sema &S, ObjCMethodDecl *PropertyMethod,<br>
                              ObjCPropertyDecl *Property) {<br>
   // Should we just clone all attributes over?<br>
-  for (Decl::attr_iterator A = Property->attr_begin(),<br>
-                        AEnd = Property->attr_end();<br>
-       A != AEnd; ++A) {<br>
-    if (isa<DeprecatedAttr>(*A) ||<br>
-        isa<UnavailableAttr>(*A) ||<br>
-        isa<AvailabilityAttr>(*A))<br>
-      PropertyMethod->addAttr((*A)->clone(S.Context));<br>
+  for (auto A : Property->attrs()) {<br>
+    if (isa<DeprecatedAttr>(A) ||<br>
+        isa<UnavailableAttr>(A) ||<br>
+        isa<AvailabilityAttr>(A))<br>
+      PropertyMethod->addAttr(A->clone(S.Context));<br>
   }<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Fri Mar  7 06:50:00 2014<br>
@@ -168,10 +168,7 @@ void Sema::InstantiateAttrs(const MultiL<br>
                             const Decl *Tmpl, Decl *New,<br>
                             LateInstantiatedAttrVec *LateAttrs,<br>
                             LocalInstantiationScope *OuterMostScope) {<br>
-  for (AttrVec::const_iterator i = Tmpl->attr_begin(), e = Tmpl->attr_end();<br>
-       i != e; ++i) {<br>
-    const Attr *TmplAttr = *i;<br>
-<br>
+  for (auto TmplAttr : Tmpl->attrs()) {<br>
     // FIXME: This should be generalized to more than just the AlignedAttr.<br>
     const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);<br>
     if (Aligned && Aligned->isAlignmentDependent()) {<br>
<br>
Modified: cfe/trunk/tools/libclang/CIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/tools/libclang/CIndex.cpp (original)<br>
+++ cfe/trunk/tools/libclang/CIndex.cpp Fri Mar  7 06:50:00 2014<br>
@@ -1675,9 +1675,8 @@ bool CursorVisitor::VisitCXXRecordDecl(C<br>
 }<br>
<br>
 bool CursorVisitor::VisitAttributes(Decl *D) {<br>
-  for (AttrVec::const_iterator i = D->attr_begin(), e = D->attr_end();<br>
-       i != e; ++i)<br>
-    if (Visit(MakeCXCursor(*i, D, TU)))<br>
+  for (auto I : D->attrs())<br>
+    if (Visit(MakeCXCursor(I, D, TU)))<br>
         return true;<br>
<br>
   return false;<br>
@@ -6041,9 +6040,8 @@ static int getCursorPlatformAvailability<br>
                                                 int availability_size) {<br>
   bool HadAvailAttr = false;<br>
   int N = 0;<br>
-  for (Decl::attr_iterator A = D->attr_begin(), AEnd = D->attr_end(); A != AEnd;<br>
-       ++A) {<br>
-    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {<br>
+  for (auto A : D->attrs()) {<br>
+    if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) {<br>
       HadAvailAttr = true;<br>
       if (always_deprecated)<br>
         *always_deprecated = 1;<br>
@@ -6052,7 +6050,7 @@ static int getCursorPlatformAvailability<br>
       continue;<br>
     }<br>
<br>
-    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {<br>
+    if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) {<br>
       HadAvailAttr = true;<br>
       if (always_unavailable)<br>
         *always_unavailable = 1;<br>
@@ -6062,7 +6060,7 @@ static int getCursorPlatformAvailability<br>
       continue;<br>
     }<br>
<br>
-    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(*A)) {<br>
+    if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) {<br>
       HadAvailAttr = true;<br>
       if (N < availability_size) {<br>
         availability[N].Platform<br>
<br>
Modified: cfe/trunk/tools/libclang/IndexingContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=203236&r1=203235&r2=203236&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=203236&r1=203235&r2=203236&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/tools/libclang/IndexingContext.cpp (original)<br>
+++ cfe/trunk/tools/libclang/IndexingContext.cpp Fri Mar  7 06:50:00 2014<br>
@@ -67,9 +67,7 @@ AttrListInfo::AttrListInfo(const Decl *D<br>
   if (!D->hasAttrs())<br>
     return;<br>
<br>
-  for (AttrVec::const_iterator AttrI = D->attr_begin(), AttrE = D->attr_end();<br>
-         AttrI != AttrE; ++AttrI) {<br>
-    const Attr *A = *AttrI;<br>
+  for (auto A : D->attrs()) {<br>
     CXCursor C = MakeCXCursor(A, D, IdxCtx.CXTU);<br>
     CXIdxLoc Loc =  IdxCtx.getIndexLoc(A->getLocation());<br>
     switch (C.kind) {<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>