|  | //===--- DelayedDiagnostic.cpp - Delayed declarator diagnostics -*- 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 DelayedDiagnostic class implementation, which | 
|  | // is used to record diagnostics that are being conditionally produced | 
|  | // during declarator parsing. | 
|  | // | 
|  | // This file also defines AccessedEntity. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | #include "clang/Sema/DelayedDiagnostic.h" | 
|  | #include <string.h> | 
|  | using namespace clang; | 
|  | using namespace sema; | 
|  |  | 
|  | DelayedDiagnostic | 
|  | DelayedDiagnostic::makeAvailability(Sema::AvailabilityDiagnostic AD, | 
|  | SourceLocation Loc, | 
|  | const NamedDecl *D, | 
|  | const ObjCInterfaceDecl *UnknownObjCClass, | 
|  | const ObjCPropertyDecl  *ObjCProperty, | 
|  | StringRef Msg) { | 
|  | DelayedDiagnostic DD; | 
|  | switch (AD) { | 
|  | case Sema::AD_Deprecation: | 
|  | DD.Kind = Deprecation; | 
|  | break; | 
|  | case Sema::AD_Unavailable: | 
|  | DD.Kind = Unavailable; | 
|  | break; | 
|  | } | 
|  | DD.Triggered = false; | 
|  | DD.Loc = Loc; | 
|  | DD.DeprecationData.Decl = D; | 
|  | DD.DeprecationData.UnknownObjCClass = UnknownObjCClass; | 
|  | DD.DeprecationData.ObjCProperty = ObjCProperty; | 
|  | char *MessageData = 0; | 
|  | if (Msg.size()) { | 
|  | MessageData = new char [Msg.size()]; | 
|  | memcpy(MessageData, Msg.data(), Msg.size()); | 
|  | } | 
|  |  | 
|  | DD.DeprecationData.Message = MessageData; | 
|  | DD.DeprecationData.MessageLen = Msg.size(); | 
|  | return DD; | 
|  | } | 
|  |  | 
|  | void DelayedDiagnostic::Destroy() { | 
|  | switch (Kind) { | 
|  | case Access: | 
|  | getAccessData().~AccessedEntity(); | 
|  | break; | 
|  |  | 
|  | case Deprecation: | 
|  | delete [] DeprecationData.Message; | 
|  | break; | 
|  |  | 
|  | case ForbiddenType: | 
|  | break; | 
|  | } | 
|  | } |