diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/DeclCXX.h | 74 | ||||
| -rw-r--r-- | clang/include/clang/AST/DeclFriend.h | 95 | ||||
| -rw-r--r-- | clang/include/clang/AST/DeclVisitor.h | 1 | ||||
| -rw-r--r-- | clang/lib/AST/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | clang/lib/AST/DeclBase.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 22 | ||||
| -rw-r--r-- | clang/lib/AST/DeclFriend.cpp | 39 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 1 | 
9 files changed, 141 insertions, 96 deletions
diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index af00c8d7e8a..547747cdb71 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -7,7 +7,8 @@  //  //===----------------------------------------------------------------------===//  // -//  This file defines the C++ Decl subclasses. +//  This file defines the C++ Decl subclasses, other than those for +//  templates (in DeclTemplate.h) and friends (in DeclFriend.h).  //  //===----------------------------------------------------------------------===// @@ -1385,77 +1386,6 @@ public:    static bool classofKind(Kind K) { return K == CXXConversion; }  }; -/// FriendDecl - Represents the declaration of a friend entity, -/// which can be a function, a type, or a templated function or type. -//  For example: -/// -/// @code -/// template <typename T> class A { -///   friend int foo(T); -///   friend class B; -///   friend T; // only in C++0x -///   template <typename U> friend class C; -///   template <typename U> friend A& operator+=(A&, const U&) { ... } -/// }; -/// @endcode -/// -/// The semantic context of a friend decl is its declaring class. -class FriendDecl : public Decl { -public: -  typedef llvm::PointerUnion<NamedDecl*,Type*> FriendUnion; - -private: -  // The declaration that's a friend of this class. -  FriendUnion Friend; - -  // Location of the 'friend' specifier. -  SourceLocation FriendLoc; - -  // FIXME: Hack to keep track of whether this was a friend function -  // template specialization. -  bool WasSpecialization; - -  FriendDecl(DeclContext *DC, SourceLocation L, FriendUnion Friend, -             SourceLocation FriendL) -    : Decl(Decl::Friend, DC, L), -      Friend(Friend), -      FriendLoc(FriendL), -      WasSpecialization(false) { -  } - -public: -  static FriendDecl *Create(ASTContext &C, DeclContext *DC, -                            SourceLocation L, FriendUnion Friend_, -                            SourceLocation FriendL); - -  /// If this friend declaration names an (untemplated but -  /// possibly dependent) type, return the type;  otherwise -  /// return null.  This is used only for C++0x's unelaborated -  /// friend type declarations. -  Type *getFriendType() const { -    return Friend.dyn_cast<Type*>(); -  } - -  /// If this friend declaration doesn't name an unelaborated -  /// type, return the inner declaration. -  NamedDecl *getFriendDecl() const { -    return Friend.dyn_cast<NamedDecl*>(); -  } - -  /// Retrieves the location of the 'friend' keyword. -  SourceLocation getFriendLoc() const { -    return FriendLoc; -  } - -  bool wasSpecialization() const { return WasSpecialization; } -  void setSpecialization(bool WS) { WasSpecialization = WS; } - -  // Implement isa/cast/dyncast/etc. -  static bool classof(const Decl *D) { return classofKind(D->getKind()); } -  static bool classof(const FriendDecl *D) { return true; } -  static bool classofKind(Kind K) { return K == Decl::Friend; } -}; -  /// LinkageSpecDecl - This represents a linkage specification.  For example:  ///   extern "C" void foo();  /// diff --git a/clang/include/clang/AST/DeclFriend.h b/clang/include/clang/AST/DeclFriend.h new file mode 100644 index 00000000000..5b3f41db68b --- /dev/null +++ b/clang/include/clang/AST/DeclFriend.h @@ -0,0 +1,95 @@ +//===-- DeclFriend.h - Classes for C++ friend declarations -*- C++ -*------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the section of the AST representing C++ friend +// declarations. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_AST_DECLFRIEND_H +#define LLVM_CLANG_AST_DECLFRIEND_H + +#include "clang/AST/DeclCXX.h" + +namespace clang { + +/// FriendDecl - Represents the declaration of a friend entity, +/// which can be a function, a type, or a templated function or type. +//  For example: +/// +/// @code +/// template <typename T> class A { +///   friend int foo(T); +///   friend class B; +///   friend T; // only in C++0x +///   template <typename U> friend class C; +///   template <typename U> friend A& operator+=(A&, const U&) { ... } +/// }; +/// @endcode +/// +/// The semantic context of a friend decl is its declaring class. +class FriendDecl : public Decl { +public: +  typedef llvm::PointerUnion<NamedDecl*,Type*> FriendUnion; + +private: +  // The declaration that's a friend of this class. +  FriendUnion Friend; + +  // Location of the 'friend' specifier. +  SourceLocation FriendLoc; + +  // FIXME: Hack to keep track of whether this was a friend function +  // template specialization. +  bool WasSpecialization; + +  FriendDecl(DeclContext *DC, SourceLocation L, FriendUnion Friend, +             SourceLocation FriendL) +    : Decl(Decl::Friend, DC, L), +      Friend(Friend), +      FriendLoc(FriendL), +      WasSpecialization(false) { +  } + +public: +  static FriendDecl *Create(ASTContext &C, DeclContext *DC, +                            SourceLocation L, FriendUnion Friend_, +                            SourceLocation FriendL); + +  /// If this friend declaration names an (untemplated but +  /// possibly dependent) type, return the type;  otherwise +  /// return null.  This is used only for C++0x's unelaborated +  /// friend type declarations. +  Type *getFriendType() const { +    return Friend.dyn_cast<Type*>(); +  } + +  /// If this friend declaration doesn't name an unelaborated +  /// type, return the inner declaration. +  NamedDecl *getFriendDecl() const { +    return Friend.dyn_cast<NamedDecl*>(); +  } + +  /// Retrieves the location of the 'friend' keyword. +  SourceLocation getFriendLoc() const { +    return FriendLoc; +  } + +  bool wasSpecialization() const { return WasSpecialization; } +  void setSpecialization(bool WS) { WasSpecialization = WS; } + +  // Implement isa/cast/dyncast/etc. +  static bool classof(const Decl *D) { return classofKind(D->getKind()); } +  static bool classof(const FriendDecl *D) { return true; } +  static bool classofKind(Kind K) { return K == Decl::Friend; } +}; +   +} + +#endif diff --git a/clang/include/clang/AST/DeclVisitor.h b/clang/include/clang/AST/DeclVisitor.h index 9423c319c3e..140e5c0a2a9 100644 --- a/clang/include/clang/AST/DeclVisitor.h +++ b/clang/include/clang/AST/DeclVisitor.h @@ -16,6 +16,7 @@  #include "clang/AST/Decl.h"  #include "clang/AST/DeclObjC.h"  #include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclFriend.h"  #include "clang/AST/DeclTemplate.h"  namespace clang { diff --git a/clang/lib/AST/CMakeLists.txt b/clang/lib/AST/CMakeLists.txt index 2f1a6af77aa..3408a1e3cc7 100644 --- a/clang/lib/AST/CMakeLists.txt +++ b/clang/lib/AST/CMakeLists.txt @@ -11,6 +11,7 @@ add_clang_library(clangAST    Decl.cpp    DeclBase.cpp    DeclCXX.cpp +  DeclFriend.cpp    DeclGroup.cpp    DeclObjC.cpp    DeclPrinter.cpp diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index a9495343e88..1aac7cfd598 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -15,6 +15,7 @@  #include "clang/AST/Decl.h"  #include "clang/AST/DeclContextInternals.h"  #include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclFriend.h"  #include "clang/AST/DeclObjC.h"  #include "clang/AST/DeclTemplate.h"  #include "clang/AST/ExternalASTSource.h" diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 7f4ad34fb7f..72b7f49dff0 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -846,28 +846,6 @@ CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,    return new (C) CXXConversionDecl(RD, L, N, T, TInfo, isInline, isExplicit);  } -FriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC, -                               SourceLocation L, -                               FriendUnion Friend, -                               SourceLocation FriendL) { -#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())); -  } -#endif - -  return new (C) FriendDecl(DC, L, Friend, FriendL); -} -  LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,                                           DeclContext *DC,                                           SourceLocation L, diff --git a/clang/lib/AST/DeclFriend.cpp b/clang/lib/AST/DeclFriend.cpp new file mode 100644 index 00000000000..8c7cadfbf74 --- /dev/null +++ b/clang/lib/AST/DeclFriend.cpp @@ -0,0 +1,39 @@ +//===--- 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/DeclFriend.h" +#include "clang/AST/DeclTemplate.h" +using namespace clang; + +FriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC, +                               SourceLocation L, +                               FriendUnion Friend, +                               SourceLocation FriendL) { +#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())); +  } +#endif + +  return new (C) FriendDecl(DC, L, Friend, FriendL); +} diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index edf1bc51eb9..4693fa974ed 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -365,8 +365,7 @@ bool ResultBuilder::isInterestingDecl(NamedDecl *ND,    // Friend declarations and declarations introduced due to friends are never    // added as results. -  if (isa<FriendDecl>(ND) ||  -      (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend))) +  if (IDNS & (Decl::IDNS_OrdinaryFriend | Decl::IDNS_TagFriend))      return false;    // Class template (partial) specializations are never added as results. diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 7c4cab11836..79298acc229 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -15,6 +15,7 @@  #include "clang/AST/ASTContext.h"  #include "clang/AST/Expr.h"  #include "clang/AST/ExprCXX.h" +#include "clang/AST/DeclFriend.h"  #include "clang/AST/DeclTemplate.h"  #include "clang/Parse/DeclSpec.h"  #include "clang/Parse/Template.h"  | 

