[cfe-dev] Template parameters of friend declarations.

John McCall rjmccall at apple.com
Sun Jan 27 13:16:20 PST 2013


On Jan 26, 2013, at 9:03 AM, Enea Zaffanella <zaffanella at cs.unipr.it> wrote:

> On 01/25/2013 10:57 PM, John McCall wrote:
>> On Jan 25, 2013, at 9:44 AM, Enea Zaffanella <zaffanella at cs.unipr.it> wrote:
> [...]
>>> Please find attached a patch for review, including
>>> (de-)serialization and pretty printing of the new info attached to
>>> friend type declarations. On a second though, we kept the
>>> PointerUnion3 approach, which seems to be simpler (at least, to my
>>> eyes) when it comes to deserializing the declaration node.
>> 
>> Please do use post-storage.  You can look at how the template
>> parameter packs deserialize themselves for an example of how to get
>> the information for how much extra space to allocate;  it's really
>> quite straightforward.
>> 
>> John.
>> 
> 
> Here is the revised patch for review.
> (Also fixes method getSourceRange).

+  // The number of "outer" template parameter lists in non-templatic
+  // (currently unsupported) friend type declarations, such as
+  //     template <class T> friend class A<T>::B;
+  unsigned NumTPLists;

Please make 'UnsupportedFriend' an unsigned : 1 bitfield and
pack this into the remaining 31 bits.

+  // The tail-allocated friend type template parameter lists (if any).
+  TemplateParameterList **getTPLists() const {
+    return reinterpret_cast<TemplateParameterList**>
+      (const_cast<FriendDecl*>(this) + 1);
+  }
+

Please just make two overloads.  One should be const and return
a TemplateParameterList * const *.  The other should be non-const
and return a TemplateParameterList **.

   FriendDecl(DeclContext *DC, SourceLocation L, FriendUnion Friend,
-             SourceLocation FriendL)
+             SourceLocation FriendL, unsigned FriendTypeNumTPLists,
+             TemplateParameterList **FriendTypeTPLists)

This should be an ArrayRef<TemplateParameterList*>.  Just leave in
the EmptyShell constructor but make it take a count.

+  /// If this friend declaration doesn't name a type, return the inner
+  /// declaration.
+  NamedDecl *getFriendDecl() const {
+    return Friend.dyn_cast<NamedDecl*>();
+  }
+

You seem to have spuriously re-ordered the methods here.

 void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) {
+  // Record the number of friend type template parameter lists here
+  // so as to simplify memory allocation during serialization.

Quibble:  during *deserialization*.  Serialization is what this code is doing.

Approved with those changes.

John.



More information about the cfe-dev mailing list