Skip to content

Commit d55851b

Browse files
committed
[clang] Generalize getSpecificAttr for const attributes
I'll upstream this commit separately to make getSpecificAttr work with const attributes.
1 parent 75e964a commit d55851b

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

clang/include/clang/AST/AttrIterator.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
#define LLVM_CLANG_AST_ATTRITERATOR_H
1515

1616
#include "clang/Basic/LLVM.h"
17+
#include "llvm/ADT/ADL.h"
1718
#include "llvm/ADT/SmallVector.h"
1819
#include "llvm/Support/Casting.h"
1920
#include <cassert>
2021
#include <cstddef>
2122
#include <iterator>
23+
#include <type_traits>
2224

2325
namespace clang {
2426

@@ -113,13 +115,13 @@ inline bool hasSpecificAttr(const Container& container) {
113115
specific_attr_end<SpecificAttr>(container);
114116
}
115117
template <typename SpecificAttr, typename Container>
116-
inline SpecificAttr *getSpecificAttr(const Container& container) {
117-
specific_attr_iterator<SpecificAttr, Container> i =
118-
specific_attr_begin<SpecificAttr>(container);
119-
if (i != specific_attr_end<SpecificAttr>(container))
120-
return *i;
121-
else
122-
return nullptr;
118+
inline auto *getSpecificAttr(const Container &container) {
119+
using ValueTy = llvm::detail::ValueOfRange<Container>;
120+
using ValuePointeeTy = std::remove_pointer_t<ValueTy>;
121+
using IterTy = std::conditional_t<std::is_const_v<ValuePointeeTy>,
122+
const SpecificAttr, SpecificAttr>;
123+
auto It = specific_attr_begin<IterTy>(container);
124+
return It != specific_attr_end<IterTy>(container) ? *It : nullptr;
123125
}
124126

125127
} // namespace clang

clang/lib/CodeGen/CGLoopInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx,
811811
// Identify loop attribute 'code_align' from Attrs.
812812
// For attribute code_align:
813813
// n - 'llvm.loop.align i32 n' metadata will be emitted.
814-
if (const auto *CodeAlign = getSpecificAttr<const CodeAlignAttr>(Attrs)) {
814+
if (const auto *CodeAlign = getSpecificAttr<CodeAlignAttr>(Attrs)) {
815815
const auto *CE = cast<ConstantExpr>(CodeAlign->getAlignment());
816816
llvm::APSInt ArgVal = CE->getResultAsAPSInt();
817817
setCodeAlign(ArgVal.getSExtValue());

0 commit comments

Comments
 (0)