[cfe-commits] [cfe-dev] [PATCH] Adding a specific_attribute_reverse_iterator

Alexandros Tzannes atzannes at illinois.edu
Wed Nov 14 14:55:08 PST 2012


Indeed, the reverse iterator is not intended as a solution to a problem, 
but as useful functionality in the absence of a solution (and because 
the solution is likely to take a long time to be implemented). Also, is 
there a disadvantage in having the reverse iterator functionality?

At the micro level, NULL is not a valid value for objects of type 
std::reverse_iterator<T>, so the compiler would not compile the code 
with RNull replaced by NULL.

Cheers!
Alex

On 11/14/2012 04:48 PM, Jordan Rose wrote:
> I hate to say it, but trying to solve the attributes-on-types problem 
> this way seems like a bad idea.
>
> int [[attr1]] * [[attr2, attr3]] var;
> int [[attr1, attr2]] * [[attr3]] var;
>
> We should be able to distinguish those, but we don't. And this won't 
> help us do that, and pretending that it does is not a good thing, IMHO.
>
> Jordan
>
> P.S. At the micro level, what's wrong with using NULL as the 
> reverse_iterator sentinel?
>
>
> On Nov 14, 2012, at 14:00 , Alexandros Tzannes <atzannes at illinois.edu 
> <mailto:atzannes at illinois.edu>> wrote:
>
>>  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]]
>>
>> <specific_attr_reverse_iterator.diff>_______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121114/ea096699/attachment.html>


More information about the cfe-commits mailing list