DependentDiagnostic.h revision 0c01d18094100db92d38daa923c95661512db203
10c01d18094100db92d38daa923c95661512db203John McCall//===-- DependentDiagnostic.h - Dependently-generated diagnostics -*- C++ -*-=//
20c01d18094100db92d38daa923c95661512db203John McCall//
30c01d18094100db92d38daa923c95661512db203John McCall//                     The LLVM Compiler Infrastructure
40c01d18094100db92d38daa923c95661512db203John McCall//
50c01d18094100db92d38daa923c95661512db203John McCall// This file is distributed under the University of Illinois Open Source
60c01d18094100db92d38daa923c95661512db203John McCall// License. See LICENSE.TXT for details.
70c01d18094100db92d38daa923c95661512db203John McCall//
80c01d18094100db92d38daa923c95661512db203John McCall//===----------------------------------------------------------------------===//
90c01d18094100db92d38daa923c95661512db203John McCall//
100c01d18094100db92d38daa923c95661512db203John McCall//  This file defines interfaces for diagnostics which may or may
110c01d18094100db92d38daa923c95661512db203John McCall//  fire based on how a template is instantiated.
120c01d18094100db92d38daa923c95661512db203John McCall//
130c01d18094100db92d38daa923c95661512db203John McCall//  At the moment, the only consumer of this interface is access
140c01d18094100db92d38daa923c95661512db203John McCall//  control.
150c01d18094100db92d38daa923c95661512db203John McCall//
160c01d18094100db92d38daa923c95661512db203John McCall//===----------------------------------------------------------------------===//
170c01d18094100db92d38daa923c95661512db203John McCall
180c01d18094100db92d38daa923c95661512db203John McCall#ifndef LLVM_CLANG_AST_DEPENDENT_DIAGNOSTIC_H
190c01d18094100db92d38daa923c95661512db203John McCall#define LLVM_CLANG_AST_DEPENDENT_DIAGNOSTIC_H
200c01d18094100db92d38daa923c95661512db203John McCall
210c01d18094100db92d38daa923c95661512db203John McCall#include "clang/Basic/PartialDiagnostic.h"
220c01d18094100db92d38daa923c95661512db203John McCall#include "clang/Basic/SourceLocation.h"
230c01d18094100db92d38daa923c95661512db203John McCall#include "clang/AST/DeclBase.h"
240c01d18094100db92d38daa923c95661512db203John McCall#include "clang/AST/DeclContextInternals.h"
250c01d18094100db92d38daa923c95661512db203John McCall
260c01d18094100db92d38daa923c95661512db203John McCallnamespace clang {
270c01d18094100db92d38daa923c95661512db203John McCall
280c01d18094100db92d38daa923c95661512db203John McCallclass ASTContext;
290c01d18094100db92d38daa923c95661512db203John McCallclass CXXRecordDecl;
300c01d18094100db92d38daa923c95661512db203John McCallclass NamedDecl;
310c01d18094100db92d38daa923c95661512db203John McCall
320c01d18094100db92d38daa923c95661512db203John McCall/// A dependently-generated diagnostic.
330c01d18094100db92d38daa923c95661512db203John McCallclass DependentDiagnostic {
340c01d18094100db92d38daa923c95661512db203John McCallpublic:
350c01d18094100db92d38daa923c95661512db203John McCall  enum AccessNonce { Access = 0 };
360c01d18094100db92d38daa923c95661512db203John McCall
370c01d18094100db92d38daa923c95661512db203John McCall  static DependentDiagnostic *Create(ASTContext &Context,
380c01d18094100db92d38daa923c95661512db203John McCall                                     DeclContext *Parent,
390c01d18094100db92d38daa923c95661512db203John McCall                                     AccessNonce _,
400c01d18094100db92d38daa923c95661512db203John McCall                                     SourceLocation Loc,
410c01d18094100db92d38daa923c95661512db203John McCall                                     bool IsMemberAccess,
420c01d18094100db92d38daa923c95661512db203John McCall                                     AccessSpecifier AS,
430c01d18094100db92d38daa923c95661512db203John McCall                                     NamedDecl *TargetDecl,
440c01d18094100db92d38daa923c95661512db203John McCall                                     CXXRecordDecl *NamingClass,
450c01d18094100db92d38daa923c95661512db203John McCall                                     const PartialDiagnostic &PDiag) {
460c01d18094100db92d38daa923c95661512db203John McCall    DependentDiagnostic *DD = Create(Context, Parent, PDiag);
470c01d18094100db92d38daa923c95661512db203John McCall    DD->AccessData.Loc = Loc.getRawEncoding();
480c01d18094100db92d38daa923c95661512db203John McCall    DD->AccessData.IsMember = IsMemberAccess;
490c01d18094100db92d38daa923c95661512db203John McCall    DD->AccessData.Access = AS;
500c01d18094100db92d38daa923c95661512db203John McCall    DD->AccessData.TargetDecl = TargetDecl;
510c01d18094100db92d38daa923c95661512db203John McCall    DD->AccessData.NamingClass = NamingClass;
520c01d18094100db92d38daa923c95661512db203John McCall    return DD;
530c01d18094100db92d38daa923c95661512db203John McCall  }
540c01d18094100db92d38daa923c95661512db203John McCall
550c01d18094100db92d38daa923c95661512db203John McCall  unsigned getKind() const {
560c01d18094100db92d38daa923c95661512db203John McCall    return Access;
570c01d18094100db92d38daa923c95661512db203John McCall  }
580c01d18094100db92d38daa923c95661512db203John McCall
590c01d18094100db92d38daa923c95661512db203John McCall  bool isAccessToMember() const {
600c01d18094100db92d38daa923c95661512db203John McCall    assert(getKind() == Access);
610c01d18094100db92d38daa923c95661512db203John McCall    return AccessData.IsMember;
620c01d18094100db92d38daa923c95661512db203John McCall  }
630c01d18094100db92d38daa923c95661512db203John McCall
640c01d18094100db92d38daa923c95661512db203John McCall  AccessSpecifier getAccess() const {
650c01d18094100db92d38daa923c95661512db203John McCall    assert(getKind() == Access);
660c01d18094100db92d38daa923c95661512db203John McCall    return AccessSpecifier(AccessData.Access);
670c01d18094100db92d38daa923c95661512db203John McCall  }
680c01d18094100db92d38daa923c95661512db203John McCall
690c01d18094100db92d38daa923c95661512db203John McCall  SourceLocation getAccessLoc() const {
700c01d18094100db92d38daa923c95661512db203John McCall    assert(getKind() == Access);
710c01d18094100db92d38daa923c95661512db203John McCall    return SourceLocation::getFromRawEncoding(AccessData.Loc);
720c01d18094100db92d38daa923c95661512db203John McCall  }
730c01d18094100db92d38daa923c95661512db203John McCall
740c01d18094100db92d38daa923c95661512db203John McCall  NamedDecl *getAccessTarget() const {
750c01d18094100db92d38daa923c95661512db203John McCall    assert(getKind() == Access);
760c01d18094100db92d38daa923c95661512db203John McCall    return AccessData.TargetDecl;
770c01d18094100db92d38daa923c95661512db203John McCall  }
780c01d18094100db92d38daa923c95661512db203John McCall
790c01d18094100db92d38daa923c95661512db203John McCall  NamedDecl *getAccessNamingClass() const {
800c01d18094100db92d38daa923c95661512db203John McCall    assert(getKind() == Access);
810c01d18094100db92d38daa923c95661512db203John McCall    return AccessData.NamingClass;
820c01d18094100db92d38daa923c95661512db203John McCall  }
830c01d18094100db92d38daa923c95661512db203John McCall
840c01d18094100db92d38daa923c95661512db203John McCall  const PartialDiagnostic &getDiagnostic() const {
850c01d18094100db92d38daa923c95661512db203John McCall    return Diag;
860c01d18094100db92d38daa923c95661512db203John McCall  }
870c01d18094100db92d38daa923c95661512db203John McCall
880c01d18094100db92d38daa923c95661512db203John McCallprivate:
890c01d18094100db92d38daa923c95661512db203John McCall  DependentDiagnostic(const PartialDiagnostic &PDiag) : Diag(PDiag) {}
900c01d18094100db92d38daa923c95661512db203John McCall  static DependentDiagnostic *Create(ASTContext &Context,
910c01d18094100db92d38daa923c95661512db203John McCall                                     DeclContext *Parent,
920c01d18094100db92d38daa923c95661512db203John McCall                                     const PartialDiagnostic &PDiag);
930c01d18094100db92d38daa923c95661512db203John McCall
940c01d18094100db92d38daa923c95661512db203John McCall  friend class DependentStoredDeclsMap;
950c01d18094100db92d38daa923c95661512db203John McCall  friend class DeclContext::ddiag_iterator;
960c01d18094100db92d38daa923c95661512db203John McCall  DependentDiagnostic *NextDiagnostic;
970c01d18094100db92d38daa923c95661512db203John McCall
980c01d18094100db92d38daa923c95661512db203John McCall  PartialDiagnostic Diag;
990c01d18094100db92d38daa923c95661512db203John McCall
1000c01d18094100db92d38daa923c95661512db203John McCall  union {
1010c01d18094100db92d38daa923c95661512db203John McCall    struct {
1020c01d18094100db92d38daa923c95661512db203John McCall      unsigned Loc;
1030c01d18094100db92d38daa923c95661512db203John McCall      unsigned Access : 2;
1040c01d18094100db92d38daa923c95661512db203John McCall      unsigned IsMember : 1;
1050c01d18094100db92d38daa923c95661512db203John McCall      NamedDecl *TargetDecl;
1060c01d18094100db92d38daa923c95661512db203John McCall      CXXRecordDecl *NamingClass;
1070c01d18094100db92d38daa923c95661512db203John McCall    } AccessData;
1080c01d18094100db92d38daa923c95661512db203John McCall  };
1090c01d18094100db92d38daa923c95661512db203John McCall};
1100c01d18094100db92d38daa923c95661512db203John McCall
1110c01d18094100db92d38daa923c95661512db203John McCall///
1120c01d18094100db92d38daa923c95661512db203John McCall
1130c01d18094100db92d38daa923c95661512db203John McCall/// An iterator over the dependent diagnostics in a dependent context.
1140c01d18094100db92d38daa923c95661512db203John McCallclass DeclContext::ddiag_iterator {
1150c01d18094100db92d38daa923c95661512db203John McCallpublic:
1160c01d18094100db92d38daa923c95661512db203John McCall  ddiag_iterator() : Ptr(0) {}
1170c01d18094100db92d38daa923c95661512db203John McCall  explicit ddiag_iterator(DependentDiagnostic *Ptr) : Ptr(Ptr) {}
1180c01d18094100db92d38daa923c95661512db203John McCall
1190c01d18094100db92d38daa923c95661512db203John McCall  typedef DependentDiagnostic *value_type;
1200c01d18094100db92d38daa923c95661512db203John McCall  typedef DependentDiagnostic *reference;
1210c01d18094100db92d38daa923c95661512db203John McCall  typedef DependentDiagnostic *pointer;
1220c01d18094100db92d38daa923c95661512db203John McCall  typedef int difference_type;
1230c01d18094100db92d38daa923c95661512db203John McCall  typedef std::forward_iterator_tag iterator_category;
1240c01d18094100db92d38daa923c95661512db203John McCall
1250c01d18094100db92d38daa923c95661512db203John McCall  reference operator*() const { return Ptr; }
1260c01d18094100db92d38daa923c95661512db203John McCall
1270c01d18094100db92d38daa923c95661512db203John McCall  ddiag_iterator &operator++() {
1280c01d18094100db92d38daa923c95661512db203John McCall    assert(Ptr && "attempt to increment past end of diag list");
1290c01d18094100db92d38daa923c95661512db203John McCall    Ptr = Ptr->NextDiagnostic;
1300c01d18094100db92d38daa923c95661512db203John McCall    return *this;
1310c01d18094100db92d38daa923c95661512db203John McCall  }
1320c01d18094100db92d38daa923c95661512db203John McCall
1330c01d18094100db92d38daa923c95661512db203John McCall  ddiag_iterator operator++(int) {
1340c01d18094100db92d38daa923c95661512db203John McCall    ddiag_iterator tmp = *this;
1350c01d18094100db92d38daa923c95661512db203John McCall    ++*this;
1360c01d18094100db92d38daa923c95661512db203John McCall    return tmp;
1370c01d18094100db92d38daa923c95661512db203John McCall  }
1380c01d18094100db92d38daa923c95661512db203John McCall
1390c01d18094100db92d38daa923c95661512db203John McCall  bool operator==(ddiag_iterator Other) const {
1400c01d18094100db92d38daa923c95661512db203John McCall    return Ptr == Other.Ptr;
1410c01d18094100db92d38daa923c95661512db203John McCall  }
1420c01d18094100db92d38daa923c95661512db203John McCall
1430c01d18094100db92d38daa923c95661512db203John McCall  bool operator!=(ddiag_iterator Other) const {
1440c01d18094100db92d38daa923c95661512db203John McCall    return Ptr != Other.Ptr;
1450c01d18094100db92d38daa923c95661512db203John McCall  }
1460c01d18094100db92d38daa923c95661512db203John McCall
1470c01d18094100db92d38daa923c95661512db203John McCall  ddiag_iterator &operator+=(difference_type N) {
1480c01d18094100db92d38daa923c95661512db203John McCall    assert(N >= 0 && "cannot rewind a DeclContext::ddiag_iterator");
1490c01d18094100db92d38daa923c95661512db203John McCall    while (N--)
1500c01d18094100db92d38daa923c95661512db203John McCall      ++*this;
1510c01d18094100db92d38daa923c95661512db203John McCall    return *this;
1520c01d18094100db92d38daa923c95661512db203John McCall  }
1530c01d18094100db92d38daa923c95661512db203John McCall
1540c01d18094100db92d38daa923c95661512db203John McCall  ddiag_iterator operator+(difference_type N) const {
1550c01d18094100db92d38daa923c95661512db203John McCall    ddiag_iterator tmp = *this;
1560c01d18094100db92d38daa923c95661512db203John McCall    tmp += N;
1570c01d18094100db92d38daa923c95661512db203John McCall    return tmp;
1580c01d18094100db92d38daa923c95661512db203John McCall  }
1590c01d18094100db92d38daa923c95661512db203John McCall
1600c01d18094100db92d38daa923c95661512db203John McCallprivate:
1610c01d18094100db92d38daa923c95661512db203John McCall  DependentDiagnostic *Ptr;
1620c01d18094100db92d38daa923c95661512db203John McCall};
1630c01d18094100db92d38daa923c95661512db203John McCall
1640c01d18094100db92d38daa923c95661512db203John McCallinline DeclContext::ddiag_iterator DeclContext::ddiag_begin() const {
1650c01d18094100db92d38daa923c95661512db203John McCall  assert(isDependentContext()
1660c01d18094100db92d38daa923c95661512db203John McCall         && "cannot iterate dependent diagnostics of non-dependent context");
1670c01d18094100db92d38daa923c95661512db203John McCall  const DependentStoredDeclsMap *Map
1680c01d18094100db92d38daa923c95661512db203John McCall    = static_cast<DependentStoredDeclsMap*>(getPrimaryContext()->LookupPtr);
1690c01d18094100db92d38daa923c95661512db203John McCall
1700c01d18094100db92d38daa923c95661512db203John McCall  if (!Map) return ddiag_iterator();
1710c01d18094100db92d38daa923c95661512db203John McCall  return ddiag_iterator(Map->FirstDiagnostic);
1720c01d18094100db92d38daa923c95661512db203John McCall}
1730c01d18094100db92d38daa923c95661512db203John McCall
1740c01d18094100db92d38daa923c95661512db203John McCallinline DeclContext::ddiag_iterator DeclContext::ddiag_end() const {
1750c01d18094100db92d38daa923c95661512db203John McCall  return ddiag_iterator();
1760c01d18094100db92d38daa923c95661512db203John McCall}
1770c01d18094100db92d38daa923c95661512db203John McCall
1780c01d18094100db92d38daa923c95661512db203John McCall}
1790c01d18094100db92d38daa923c95661512db203John McCall
1800c01d18094100db92d38daa923c95661512db203John McCall#endif
181