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)