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