DelayedDiagnostic.h revision f85e193739c953358c865005855253af4f68a497
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//===--- DelayedDiagnostic.h - Delayed declarator diagnostics ---*- C++ -*-===//
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// License. See LICENSE.TXT for details.
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//===----------------------------------------------------------------------===//
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This file defines the DelayedDiagnostic class, which is used to
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// record diagnostics that are being conditionally produced during
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// declarator parsing.  Certain kinds of diagnostics --- notably
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// deprecation and access control --- are suppressed based on
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// semantic properties of the parsed declaration that aren't known
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// until it is fully parsed.
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This file also defines AccessedEntity.
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//===----------------------------------------------------------------------===//
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef LLVM_CLANG_SEMA_DELAYED_DIAGNOSTIC_H
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define LLVM_CLANG_SEMA_DELAYED_DIAGNOSTIC_H
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "clang/AST/DeclCXX.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace clang {
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace sema {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// A declaration being accessed, together with information about how
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// it was accessed.
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class AccessedEntity {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public:
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// A member declaration found through lookup.  The target is the
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// member.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  enum MemberNonce { Member };
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// A hierarchy (base-to-derived or derived-to-base) conversion.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// The target is the base class.
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  enum BaseNonce { Base };
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool isMemberAccess() const { return IsMember; }
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AccessedEntity(ASTContext &Context,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 MemberNonce _,
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 CXXRecordDecl *NamingClass,
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 DeclAccessPair FoundDecl,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 QualType BaseObjectType)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : Access(FoundDecl.getAccess()), IsMember(true),
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Target(FoundDecl.getDecl()), NamingClass(NamingClass),
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      BaseObjectType(BaseObjectType), Diag(0, Context.getDiagAllocator()) {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AccessedEntity(ASTContext &Context,
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 BaseNonce _,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 CXXRecordDecl *BaseClass,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 CXXRecordDecl *DerivedClass,
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 AccessSpecifier Access)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : Access(Access), IsMember(false),
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Target(BaseClass),
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NamingClass(DerivedClass),
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Diag(0, Context.getDiagAllocator()) {
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool isQuiet() const { return Diag.getDiagID() == 0; }
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AccessSpecifier getAccess() const { return AccessSpecifier(Access); }
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // These apply to member decls...
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NamedDecl *getTargetDecl() const { return Target; }
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CXXRecordDecl *getNamingClass() const { return NamingClass; }
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ...and these apply to hierarchy conversions.
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CXXRecordDecl *getBaseClass() const {
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(!IsMember); return cast<CXXRecordDecl>(Target);
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CXXRecordDecl *getDerivedClass() const { return NamingClass; }
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// Retrieves the base object type, important when accessing
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// an instance member.
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  QualType getBaseObjectType() const { return BaseObjectType; }
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// Sets a diagnostic to be performed.  The diagnostic is given
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// four (additional) arguments:
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///   %0 - 0 if the entity was private, 1 if protected
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///   %1 - the DeclarationName of the entity
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///   %2 - the TypeDecl type of the naming class
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///   %3 - the TypeDecl type of the declaring class
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void setDiag(const PartialDiagnostic &PDiag) {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(isQuiet() && "partial diagnostic already defined");
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Diag = PDiag;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PartialDiagnostic &setDiag(unsigned DiagID) {
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(isQuiet() && "partial diagnostic already defined");
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(DiagID && "creating null diagnostic");
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Diag.Reset(DiagID);
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return Diag;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const PartialDiagnostic &getDiag() const {
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return Diag;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)private:
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned Access : 2;
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned IsMember : 1;
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NamedDecl *Target;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CXXRecordDecl *NamingClass;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  QualType BaseObjectType;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PartialDiagnostic Diag;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// A diagnostic message which has been conditionally emitted pending
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// the complete parsing of the current declaration.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DelayedDiagnostic {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public:
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  enum DDKind { Deprecation, Access, ForbiddenType };
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned char Kind; // actually a DDKind
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool Triggered;
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SourceLocation Loc;
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Destroy();
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static DelayedDiagnostic makeDeprecation(SourceLocation Loc,
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           const NamedDecl *D,
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           llvm::StringRef Msg);
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static DelayedDiagnostic makeAccess(SourceLocation Loc,
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const AccessedEntity &Entity) {
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DelayedDiagnostic DD;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Kind = Access;
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Triggered = false;
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Loc = Loc;
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new (&DD.getAccessData()) AccessedEntity(Entity);
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return DD;
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static DelayedDiagnostic makeForbiddenType(SourceLocation loc,
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             unsigned diagnostic,
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             QualType type,
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             unsigned argument) {
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DelayedDiagnostic DD;
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Kind = ForbiddenType;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Triggered = false;
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.Loc = loc;
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.ForbiddenTypeData.Diagnostic = diagnostic;
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.ForbiddenTypeData.OperandType = type.getAsOpaquePtr();
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DD.ForbiddenTypeData.Argument = argument;
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return DD;
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AccessedEntity &getAccessData() {
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(Kind == Access && "Not an access diagnostic.");
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return *reinterpret_cast<AccessedEntity*>(AccessData);
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const AccessedEntity &getAccessData() const {
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(Kind == Access && "Not an access diagnostic.");
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return *reinterpret_cast<const AccessedEntity*>(AccessData);
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const NamedDecl *getDeprecationDecl() const {
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    assert(Kind == Deprecation && "Not a deprecation diagnostic.");
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return DeprecationData.Decl;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  llvm::StringRef getDeprecationMessage() const {
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(Kind == Deprecation && "Not a deprecation diagnostic.");
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return llvm::StringRef(DeprecationData.Message,
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           DeprecationData.MessageLen);
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// The diagnostic ID to emit.  Used like so:
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///   Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///     << diag.getForbiddenTypeOperand()
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ///     << diag.getForbiddenTypeArgument();
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned getForbiddenTypeDiagnostic() const {
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ForbiddenTypeData.Diagnostic;
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned getForbiddenTypeArgument() const {
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ForbiddenTypeData.Argument;
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QualType getForbiddenTypeOperand() const {
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    assert(Kind == ForbiddenType && "not a forbidden-type diagnostic");
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return QualType::getFromOpaquePtr(ForbiddenTypeData.OperandType);
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)private:
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  union {
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /// Deprecation.
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    struct {
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const NamedDecl *Decl;
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const char *Message;
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      size_t MessageLen;
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } DeprecationData;
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    struct {
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      unsigned Diagnostic;
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      unsigned Argument;
20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      void *OperandType;
20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } ForbiddenTypeData;
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /// Access control.
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    char AccessData[sizeof(AccessedEntity)];
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)