aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/DeclBase.h9
-rw-r--r--lib/AST/DeclBase.cpp6
2 files changed, 9 insertions, 6 deletions
diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h
index 86d96a5b1c..abf5404882 100644
--- a/include/clang/AST/DeclBase.h
+++ b/include/clang/AST/DeclBase.h
@@ -180,7 +180,10 @@ public:
bool hasAttrs() const { return HasAttrs; }
void addAttr(Attr *attr);
- const Attr *getAttrs() const;
+ const Attr *getAttrs() const {
+ if (!HasAttrs) return 0; // common case, no attributes.
+ return getAttrsImpl(); // Uncommon case, out of line hash lookup.
+ }
void swapAttrs(Decl *D);
void invalidateAttrs();
@@ -188,7 +191,6 @@ public:
for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())
if (const T *V = dyn_cast<T>(attr))
return V;
-
return 0;
}
@@ -326,6 +328,9 @@ protected:
// FIXME: This will eventually be a pure virtual function.
assert (false && "Not implemented.");
}
+private:
+ const Attr *getAttrsImpl() const;
+
};
/// PrettyStackTraceDecl - If a crash occurs, indicate that it happened when
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 1e7ef549b4..812c362acd 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -171,10 +171,8 @@ void Decl::invalidateAttrs() {
}
}
-const Attr *Decl::getAttrs() const {
- if (!HasAttrs)
- return 0;
-
+const Attr *Decl::getAttrsImpl() const {
+ assert(HasAttrs && "getAttrs() should verify this!");
return (*DeclAttrs)[this];
}