AttributeList *getNext() const { return Next; }
void setNext(AttributeList *N) { Next = N; }
-
- void addAttributeList(AttributeList *alist) {
- assert((alist != 0) && "addAttributeList(): alist is null");
- AttributeList *next = this, *prev;
- do {
- prev = next;
- next = next->getNext();
- } while (next);
- prev->setNext(alist);
- }
/// getNumArgs - Return the number of actual arguments to this attribute.
unsigned getNumArgs() const { return NumArgs; }
}
};
+/// addAttributeLists - Add two AttributeLists together
+/// The right-hand list is appended to the left-hand list, if any
+/// A pointer to the joined list is returned.
+/// Note: the lists are not left unmodified.
+inline AttributeList* addAttributeLists (AttributeList *Left,
+ AttributeList *Right) {
+ if (!Left)
+ return Right;
+
+ AttributeList *next = Left, *prev;
+ do {
+ prev = next;
+ next = next->getNext();
+ } while (next);
+ prev->setNext(Right);
+ return Left;
+}
+
} // end namespace clang
#endif
/// int __attribute__((may_alias)) __attribute__((aligned(16))) var;
///
void AddAttributes(AttributeList *alist) {
- if (!alist)
- return; // we parsed __attribute__(()) or had a syntax error
-
- if (AttrList)
- alist->addAttributeList(AttrList);
- AttrList = alist;
+ AttrList = addAttributeLists(AttrList, alist);
}
void SetAttributes(AttributeList *AL) { AttrList = AL; }
const AttributeList *getAttributes() const { return AttrList; }
///
/// Also extends the range of the declarator.
void AddAttributes(AttributeList *alist, SourceLocation LastLoc) {
- if (!alist)
- return; // we parsed __attribute__(()) or had a syntax error
-
- if (AttrList)
- alist->addAttributeList(AttrList);
- AttrList = alist;
+ AttrList = addAttributeLists(AttrList, alist);
if (!LastLoc.isInvalid())
SetRangeEnd(LastLoc);