[cfe-dev] Fwd: [PATCH] Adding a specific_attribute_reverse_iterator

Alexandros Tzannes atzannes at illinois.edu
Wed Nov 14 14:00:35 PST 2012


  Hi all,
the current Clang implementation has a specific_attr_iterator<AttrType> 
that allows iterating over the  attributes of a certain type (all 
attributes are kept in a single llvm::SmallVector), but it lacks a 
reverse iterator. This patch adds this functionality.

Why is this useful/needed (in the short run).
-----------------------------------------------------------
The C++11 standard allows attributes to appertain to types and portions 
of the declarator, e.g.:
int[[attr1] *[[attr2] *[[attr3] var;

However, Clang is still collapsing those attributes on the declaration 
itself:
int **var [[attr1,attr2,attr3]].

According to C++11 when multiple attributes of the same kind appertain 
to the same "node", their order is irrelevant (note that these 
attributes may have different attribute parameters):

int var [[attrA("x"), attrA("y")]]
and
int var [[attrA("y"), attrA("x")]]

must mean the same thing.

However, until attributes are allowed to appertain to all the new 
locations described by C++11, it would be useful to use their order to 
"map" them onto the  different nodes they should appertain. The 
specific_attr_reverse_iterator provides some functionality towards that 
goal.

Implementation
----------------------
The implementation is a slightly modified version of the code of the 
corresponding forward iterator. A small difference is that the forward 
iterator returns a pointer to the underlying type *T, whereas the 
reverse one returns an object of type typedef 
std::reverse_iterator<iterator 
<http://llvm.org/docs/doxygen/html/classllvm_1_1SmallVectorTemplateCommon.html#a309d93eaafb8f5a8dfb7de2a231335ea>>. 
For that reason, Decl::attr_rbegin() and Decl::attr_rend() for 
attr_reverse_iterator check if the Decl has attributes, and if so, 
return the begin or the end; otherwise, they return a sentinel RNull, 
which is implemented as a static member of Decl.

Using the RNull sentinel is a bit awkward. Two alternatives are the 
following:
1. Make the user responsible of checking if a Decl has an attributes 
vector before trying to get a specific_attr_reverse_iterator. Trying to 
get such an iterator on a Decl without any attrs will generate an 
assertion failure. This approach gets rid of RNull, but requires users 
to treat fwd and reverse iterators differently.

2. Each time the user tries to get a reverse iterator on a Decl without 
attributes, create an empty attribute vector and return the beginning 
(or the end) of it. This approach also removes the awkward RNull, but 
may create many unneeded empty attribute vectors.

Please let me know if one of these alternatives is preferable.

Cheers!
Alex Tzannes

[[written during the Hacker Lab at last week's LLVM devellopers' meeting]]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20121114/c739ae23/attachment.html>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: specific_attr_reverse_iterator.diff
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20121114/c739ae23/attachment.ksh>


More information about the cfe-dev mailing list