123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- //===--- DeclFriend.cpp - C++ Friend Declaration AST Node Implementation --===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file implements the AST classes related to C++ friend
- // declarations.
- //
- //===----------------------------------------------------------------------===//
- #include "clang/AST/ASTContext.h"
- #include "clang/AST/DeclFriend.h"
- #include "clang/AST/DeclTemplate.h"
- using namespace clang;
- void FriendDecl::anchor() { }
- FriendDecl *FriendDecl::getNextFriendSlowCase() {
- return cast_or_null<FriendDecl>(
- NextFriend.get(getASTContext().getExternalSource()));
- }
- FriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC,
- SourceLocation L,
- FriendUnion Friend,
- SourceLocation FriendL,
- ArrayRef<TemplateParameterList*> FriendTypeTPLists) {
- #ifndef NDEBUG
- if (Friend.is<NamedDecl*>()) {
- NamedDecl *D = Friend.get<NamedDecl*>();
- assert(isa<FunctionDecl>(D) ||
- isa<CXXRecordDecl>(D) ||
- isa<FunctionTemplateDecl>(D) ||
- isa<ClassTemplateDecl>(D));
- // As a temporary hack, we permit template instantiation to point
- // 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
- std::size_t Extra = FriendTypeTPLists.size() * sizeof(TemplateParameterList*);
- FriendDecl *FD = new (C, DC, Extra) FriendDecl(DC, L, Friend, FriendL,
- FriendTypeTPLists);
- cast<CXXRecordDecl>(DC)->pushFriendDecl(FD);
- return FD;
- }
- FriendDecl *FriendDecl::CreateDeserialized(ASTContext &C, unsigned ID,
- unsigned FriendTypeNumTPLists) {
- std::size_t Extra = FriendTypeNumTPLists * sizeof(TemplateParameterList*);
- return new (C, ID, Extra) FriendDecl(EmptyShell(), FriendTypeNumTPLists);
- }
- FriendDecl *CXXRecordDecl::getFirstFriend() const {
- ExternalASTSource *Source = getParentASTContext().getExternalSource();
- Decl *First = data().FirstFriend.get(Source);
- return First ? cast<FriendDecl>(First) : nullptr;
- }
|