Use range-based for to iterate over fields in record layout, NFCI (#122029)
Move the common case of FieldDecl::getFieldIndex() inline to mitigate
the cost of removing the extra `FieldNo` induction variable.
Also rename isNoUniqueAddress parameter to isNonVirtualBaseType, which
appears to be more accurate. I think the current name is just a
consequence of autocomplete gone wrong.
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index 67ee0bb..16fc98a 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -3115,8 +3115,20 @@
/// Returns the index of this field within its record,
/// as appropriate for passing to ASTRecordLayout::getFieldOffset.
- unsigned getFieldIndex() const;
+ unsigned getFieldIndex() const {
+ const FieldDecl *Canonical = getCanonicalDecl();
+ if (Canonical->CachedFieldIndex == 0) {
+ Canonical->setCachedFieldIndex();
+ assert(Canonical->CachedFieldIndex != 0);
+ }
+ return Canonical->CachedFieldIndex - 1;
+ }
+private:
+ /// Set CachedFieldIndex to the index of this field plus one.
+ void setCachedFieldIndex() const;
+
+public:
/// Determines whether this field is mutable (C++ only).
bool isMutable() const { return Mutable; }