DeclFriend.cpp revision 245431
1205219Srdivacky//===--- DeclFriend.cpp - C++ Friend Declaration AST Node Implementation --===// 2205219Srdivacky// 3205219Srdivacky// The LLVM Compiler Infrastructure 4205219Srdivacky// 5205219Srdivacky// This file is distributed under the University of Illinois Open Source 6205219Srdivacky// License. See LICENSE.TXT for details. 7205219Srdivacky// 8205219Srdivacky//===----------------------------------------------------------------------===// 9205219Srdivacky// 10205219Srdivacky// This file implements the AST classes related to C++ friend 11205219Srdivacky// declarations. 12205219Srdivacky// 13205219Srdivacky//===----------------------------------------------------------------------===// 14205219Srdivacky 15245431Sdim#include "clang/AST/ASTContext.h" 16205219Srdivacky#include "clang/AST/DeclFriend.h" 17205219Srdivacky#include "clang/AST/DeclTemplate.h" 18205219Srdivackyusing namespace clang; 19205219Srdivacky 20235633Sdimvoid FriendDecl::anchor() { } 21235633Sdim 22245431SdimFriendDecl *FriendDecl::getNextFriendSlowCase() { 23245431Sdim return cast_or_null<FriendDecl>( 24245431Sdim NextFriend.get(getASTContext().getExternalSource())); 25245431Sdim} 26245431Sdim 27205219SrdivackyFriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC, 28205219Srdivacky SourceLocation L, 29205219Srdivacky FriendUnion Friend, 30205219Srdivacky SourceLocation FriendL) { 31205219Srdivacky#ifndef NDEBUG 32205219Srdivacky if (Friend.is<NamedDecl*>()) { 33205219Srdivacky NamedDecl *D = Friend.get<NamedDecl*>(); 34205219Srdivacky assert(isa<FunctionDecl>(D) || 35205219Srdivacky isa<CXXRecordDecl>(D) || 36205219Srdivacky isa<FunctionTemplateDecl>(D) || 37205219Srdivacky isa<ClassTemplateDecl>(D)); 38205219Srdivacky 39205219Srdivacky // As a temporary hack, we permit template instantiation to point 40205219Srdivacky // to the original declaration when instantiating members. 41205219Srdivacky assert(D->getFriendObjectKind() || 42205219Srdivacky (cast<CXXRecordDecl>(DC)->getTemplateSpecializationKind())); 43205219Srdivacky } 44205219Srdivacky#endif 45205219Srdivacky 46205219Srdivacky FriendDecl *FD = new (C) FriendDecl(DC, L, Friend, FriendL); 47205219Srdivacky cast<CXXRecordDecl>(DC)->pushFriendDecl(FD); 48205219Srdivacky return FD; 49205219Srdivacky} 50210299Sed 51235633SdimFriendDecl *FriendDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 52235633Sdim void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendDecl)); 53235633Sdim return new (Mem) FriendDecl(EmptyShell()); 54210299Sed} 55