diff --git a/clang/include/clang/AST/AttrIterator.h b/clang/include/clang/AST/AttrIterator.h index 66571e1cf0b8ec..7e2bb0381d4c8f 100644 --- a/clang/include/clang/AST/AttrIterator.h +++ b/clang/include/clang/AST/AttrIterator.h @@ -14,11 +14,13 @@ #define LLVM_CLANG_AST_ATTRITERATOR_H #include "clang/Basic/LLVM.h" +#include "llvm/ADT/ADL.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Casting.h" #include #include #include +#include namespace clang { @@ -113,13 +115,13 @@ inline bool hasSpecificAttr(const Container& container) { specific_attr_end(container); } template -inline SpecificAttr *getSpecificAttr(const Container& container) { - specific_attr_iterator i = - specific_attr_begin(container); - if (i != specific_attr_end(container)) - return *i; - else - return nullptr; +inline auto *getSpecificAttr(const Container &container) { + using ValueTy = llvm::detail::ValueOfRange; + using ValuePointeeTy = std::remove_pointer_t; + using IterTy = std::conditional_t, + const SpecificAttr, SpecificAttr>; + auto It = specific_attr_begin(container); + return It != specific_attr_end(container) ? *It : nullptr; } } // namespace clang diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp index cdff7e50c4ee71..448571221ef81b 100644 --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -811,7 +811,7 @@ void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx, // Identify loop attribute 'code_align' from Attrs. // For attribute code_align: // n - 'llvm.loop.align i32 n' metadata will be emitted. - if (const auto *CodeAlign = getSpecificAttr(Attrs)) { + if (const auto *CodeAlign = getSpecificAttr(Attrs)) { const auto *CE = cast(CodeAlign->getAlignment()); llvm::APSInt ArgVal = CE->getResultAsAPSInt(); setCodeAlign(ArgVal.getSExtValue());