r174050 - Added outer template parameter lists to friend type AST nodes.
Timur Iskhodzhanov
timurrrr at google.com
Thu Jan 31 04:15:23 PST 2013
Hi!
My private bot has started failing since this change but the error
message looks somewhat unrelated.
Can you please take a look?
..\..\..\..\..\llvm\tools\clang\tools\libclang\Indexing.cpp(444):
error C2661: '`anonymous-namespace'::TUSkipBodyControl::TUSkipBodyControl'
: no overloaded function takes 3 arguments
[tools\clang\tools\libclang\libclang.vcxproj]
Done Building Project "tools\clang\tools\libclang\libclang.vcxproj"
(default targets) -- FAILED.
Thanks,
Timur
2013/1/31 Enea Zaffanella <zaffanella at cs.unipr.it>:
> Author: enea
> Date: Thu Jan 31 03:54:08 2013
> New Revision: 174050
>
> URL: http://llvm.org/viewvc/llvm-project?rev=174050&view=rev
> Log:
> Added outer template parameter lists to friend type AST nodes.
>
> Modified:
> cfe/trunk/include/clang/AST/DeclFriend.h
> cfe/trunk/lib/AST/DeclFriend.cpp
> cfe/trunk/lib/AST/DeclPrinter.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclFriend.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclFriend.h?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclFriend.h (original)
> +++ cfe/trunk/include/clang/AST/DeclFriend.h Thu Jan 31 03:54:08 2013
> @@ -54,22 +54,40 @@ private:
> /// True if this 'friend' declaration is unsupported. Eventually we
> /// will support every possible friend declaration, but for now we
> /// silently ignore some and set this flag to authorize all access.
> - bool UnsupportedFriend;
> + bool UnsupportedFriend : 1;
> +
> + // 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 : 31;
> +
> + // The tail-allocated friend type template parameter lists (if any).
> + TemplateParameterList* const *getTPLists() const {
> + return reinterpret_cast<TemplateParameterList* const *>(this + 1);
> + }
> + TemplateParameterList **getTPLists() {
> + return reinterpret_cast<TemplateParameterList**>(this + 1);
> + }
>
> friend class CXXRecordDecl::friend_iterator;
> friend class CXXRecordDecl;
>
> FriendDecl(DeclContext *DC, SourceLocation L, FriendUnion Friend,
> - SourceLocation FriendL)
> + SourceLocation FriendL,
> + ArrayRef<TemplateParameterList*> FriendTypeTPLists)
> : Decl(Decl::Friend, DC, L),
> Friend(Friend),
> NextFriend(),
> FriendLoc(FriendL),
> - UnsupportedFriend(false) {
> + UnsupportedFriend(false),
> + NumTPLists(FriendTypeTPLists.size()) {
> + for (unsigned i = 0; i < NumTPLists; ++i)
> + getTPLists()[i] = FriendTypeTPLists[i];
> }
>
> - explicit FriendDecl(EmptyShell Empty)
> - : Decl(Decl::Friend, Empty), NextFriend() { }
> + FriendDecl(EmptyShell Empty, unsigned NumFriendTypeTPLists)
> + : Decl(Decl::Friend, Empty), NextFriend(),
> + NumTPLists(NumFriendTypeTPLists) { }
>
> FriendDecl *getNextFriend() {
> if (!NextFriend.isOffset())
> @@ -81,8 +99,11 @@ private:
> public:
> static FriendDecl *Create(ASTContext &C, DeclContext *DC,
> SourceLocation L, FriendUnion Friend_,
> - SourceLocation FriendL);
> - static FriendDecl *CreateDeserialized(ASTContext &C, unsigned ID);
> + SourceLocation FriendL,
> + ArrayRef<TemplateParameterList*> FriendTypeTPLists
> + = ArrayRef<TemplateParameterList*>());
> + static FriendDecl *CreateDeserialized(ASTContext &C, unsigned ID,
> + unsigned FriendTypeNumTPLists);
>
> /// If this friend declaration names an (untemplated but possibly
> /// dependent) type, return the type; otherwise return null. This
> @@ -91,6 +112,13 @@ public:
> TypeSourceInfo *getFriendType() const {
> return Friend.dyn_cast<TypeSourceInfo*>();
> }
> + unsigned getFriendTypeNumTemplateParameterLists() const {
> + return NumTPLists;
> + }
> + TemplateParameterList *getFriendTypeTemplateParameterList(unsigned N) const {
> + assert(N < NumTPLists);
> + return getTPLists()[N];
> + }
>
> /// If this friend declaration doesn't name a type, return the inner
> /// declaration.
> @@ -114,8 +142,12 @@ public:
> }
> return SourceRange(getFriendLoc(), ND->getLocEnd());
> }
> - else if (TypeSourceInfo *TInfo = getFriendType())
> - return SourceRange(getFriendLoc(), TInfo->getTypeLoc().getEndLoc());
> + else if (TypeSourceInfo *TInfo = getFriendType()) {
> + SourceLocation StartL = (NumTPLists == 0)
> + ? getFriendLoc()
> + : getTPLists()[0]->getTemplateLoc();
> + return SourceRange(StartL, TInfo->getTypeLoc().getEndLoc());
> + }
> else
> return SourceRange(getFriendLoc(), getLocation());
> }
>
> Modified: cfe/trunk/lib/AST/DeclFriend.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclFriend.cpp?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclFriend.cpp (original)
> +++ cfe/trunk/lib/AST/DeclFriend.cpp Thu Jan 31 03:54:08 2013
> @@ -27,7 +27,8 @@ FriendDecl *FriendDecl::getNextFriendSlo
> FriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC,
> SourceLocation L,
> FriendUnion Friend,
> - SourceLocation FriendL) {
> + SourceLocation FriendL,
> + ArrayRef<TemplateParameterList*> FriendTypeTPLists) {
> #ifndef NDEBUG
> if (Friend.is<NamedDecl*>()) {
> NamedDecl *D = Friend.get<NamedDecl*>();
> @@ -40,15 +41,25 @@ FriendDecl *FriendDecl::Create(ASTContex
> // to the original declaration when instantiating members.
> assert(D->getFriendObjectKind() ||
> (cast<CXXRecordDecl>(DC)->getTemplateSpecializationKind()));
> + // These template parameters are for friend types only.
> + assert(FriendTypeTPLists.size() == 0);
> }
> #endif
>
> - FriendDecl *FD = new (C) FriendDecl(DC, L, Friend, FriendL);
> + std::size_t Size = sizeof(FriendDecl)
> + + FriendTypeTPLists.size() * sizeof(TemplateParameterList*);
> + void *Mem = C.Allocate(Size);
> + FriendDecl *FD = new (Mem) FriendDecl(DC, L, Friend, FriendL,
> + FriendTypeTPLists);
> cast<CXXRecordDecl>(DC)->pushFriendDecl(FD);
> return FD;
> }
>
> -FriendDecl *FriendDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
> - void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendDecl));
> - return new (Mem) FriendDecl(EmptyShell());
> +FriendDecl *FriendDecl::CreateDeserialized(ASTContext &C, unsigned ID,
> + unsigned FriendTypeNumTPLists) {
> + std::size_t Size = sizeof(FriendDecl)
> + + FriendTypeNumTPLists * sizeof(TemplateParameterList*);
> + void *Mem = AllocateDeserializedDecl(C, ID, Size);
> + return new (Mem) FriendDecl(EmptyShell(), FriendTypeNumTPLists);
> }
> +
>
> Modified: cfe/trunk/lib/AST/DeclPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/DeclPrinter.cpp Thu Jan 31 03:54:08 2013
> @@ -83,7 +83,7 @@ namespace {
> void VisitUsingShadowDecl(UsingShadowDecl *D);
>
> void PrintTemplateParameters(const TemplateParameterList *Params,
> - const TemplateArgumentList *Args);
> + const TemplateArgumentList *Args = 0);
> void prettyPrintAttributes(Decl *D);
> };
> }
> @@ -580,6 +580,9 @@ void DeclPrinter::VisitFunctionDecl(Func
>
> void DeclPrinter::VisitFriendDecl(FriendDecl *D) {
> if (TypeSourceInfo *TSI = D->getFriendType()) {
> + unsigned NumTPLists = D->getFriendTypeNumTemplateParameterLists();
> + for (unsigned i = 0; i < NumTPLists; ++i)
> + PrintTemplateParameters(D->getFriendTypeTemplateParameterList(i));
> Out << "friend ";
> Out << " " << TSI->getType().getAsString(Policy);
> }
> @@ -771,8 +774,8 @@ void DeclPrinter::VisitLinkageSpecDecl(L
> Visit(*D->decls_begin());
> }
>
> -void DeclPrinter::PrintTemplateParameters(
> - const TemplateParameterList *Params, const TemplateArgumentList *Args = 0) {
> +void DeclPrinter::PrintTemplateParameters(const TemplateParameterList *Params,
> + const TemplateArgumentList *Args) {
> assert(Params);
> assert(!Args || Params->size() == Args->size());
>
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Jan 31 03:54:08 2013
> @@ -10347,7 +10347,8 @@ FriendDecl *Sema::CheckFriendTypeDecl(So
> Decl *Sema::ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc,
> unsigned TagSpec, SourceLocation TagLoc,
> CXXScopeSpec &SS,
> - IdentifierInfo *Name, SourceLocation NameLoc,
> + IdentifierInfo *Name,
> + SourceLocation NameLoc,
> AttributeList *Attr,
> MultiTemplateParamsArg TempParamLists) {
> TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForTypeSpec(TagSpec);
> @@ -10431,7 +10432,7 @@ Decl *Sema::ActOnTemplatedFriendTag(Scop
> }
>
> FriendDecl *Friend = FriendDecl::Create(Context, CurContext, NameLoc,
> - TSI, FriendLoc);
> + TSI, FriendLoc, TempParamLists);
> Friend->setAccess(AS_public);
> CurContext->addDecl(Friend);
> return Friend;
> @@ -10453,7 +10454,7 @@ Decl *Sema::ActOnTemplatedFriendTag(Scop
> TL.setNameLoc(NameLoc);
>
> FriendDecl *Friend = FriendDecl::Create(Context, CurContext, NameLoc,
> - TSI, FriendLoc);
> + TSI, FriendLoc, TempParamLists);
> Friend->setAccess(AS_public);
> Friend->setUnsupportedFriend(true);
> CurContext->addDecl(Friend);
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Jan 31 03:54:08 2013
> @@ -1262,10 +1262,12 @@ void ASTDeclReader::VisitAccessSpecDecl(
>
> void ASTDeclReader::VisitFriendDecl(FriendDecl *D) {
> VisitDecl(D);
> - if (Record[Idx++])
> - D->Friend = GetTypeSourceInfo(Record, Idx);
> - else
> + if (Record[Idx++]) // hasFriendDecl
> D->Friend = ReadDeclAs<NamedDecl>(Record, Idx);
> + else
> + D->Friend = GetTypeSourceInfo(Record, Idx);
> + for (unsigned i = 0; i != D->NumTPLists; ++i)
> + D->getTPLists()[i] = Reader.ReadTemplateParameterList(F, Record, Idx);
> D->NextFriend = Record[Idx++];
> D->UnsupportedFriend = (Record[Idx++] != 0);
> D->FriendLoc = ReadSourceLocation(Record, Idx);
> @@ -2003,7 +2005,7 @@ Decl *ASTReader::ReadDeclRecord(DeclID I
> D = AccessSpecDecl::CreateDeserialized(Context, ID);
> break;
> case DECL_FRIEND:
> - D = FriendDecl::CreateDeserialized(Context, ID);
> + D = FriendDecl::CreateDeserialized(Context, ID, Record[Idx++]);
> break;
> case DECL_FRIEND_TEMPLATE:
> D = FriendTemplateDecl::CreateDeserialized(Context, ID);
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=174050&r1=174049&r2=174050&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Thu Jan 31 03:54:08 2013
> @@ -1017,12 +1017,19 @@ void ASTDeclWriter::VisitAccessSpecDecl(
> }
>
> void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) {
> + // Record the number of friend type template parameter lists here
> + // so as to simplify memory allocation during deserialization.
> + Record.push_back(D->NumTPLists);
> VisitDecl(D);
> - Record.push_back(D->Friend.is<TypeSourceInfo*>());
> - if (D->Friend.is<TypeSourceInfo*>())
> - Writer.AddTypeSourceInfo(D->Friend.get<TypeSourceInfo*>(), Record);
> + bool hasFriendDecl = D->Friend.is<NamedDecl*>();
> + Record.push_back(hasFriendDecl);
> + if (hasFriendDecl)
> + Writer.AddDeclRef(D->getFriendDecl(), Record);
> else
> - Writer.AddDeclRef(D->Friend.get<NamedDecl*>(), Record);
> + Writer.AddTypeSourceInfo(D->getFriendType(), Record);
> + for (unsigned i = 0; i < D->NumTPLists; ++i)
> + Writer.AddTemplateParameterList(D->getFriendTypeTemplateParameterList(i),
> + Record);
> Writer.AddDeclRef(D->getNextFriend(), Record);
> Record.push_back(D->UnsupportedFriend);
> Writer.AddSourceLocation(D->FriendLoc, Record);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
Timur Iskhodzhanov,
Google Russia
More information about the cfe-commits
mailing list