1//===--- DelayedDiagnostic.cpp - Delayed declarator diagnostics -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the DelayedDiagnostic class implementation, which 11// is used to record diagnostics that are being conditionally produced 12// during declarator parsing. 13// 14// This file also defines AccessedEntity. 15// 16//===----------------------------------------------------------------------===// 17#include "clang/Sema/DelayedDiagnostic.h" 18#include <string.h> 19using namespace clang; 20using namespace sema; 21 22DelayedDiagnostic 23DelayedDiagnostic::makeAvailability(Sema::AvailabilityDiagnostic AD, 24 SourceLocation Loc, 25 const NamedDecl *D, 26 const ObjCInterfaceDecl *UnknownObjCClass, 27 const ObjCPropertyDecl *ObjCProperty, 28 StringRef Msg, 29 bool ObjCPropertyAccess) { 30 DelayedDiagnostic DD; 31 switch (AD) { 32 case Sema::AD_Deprecation: 33 DD.Kind = Deprecation; 34 break; 35 case Sema::AD_Unavailable: 36 DD.Kind = Unavailable; 37 break; 38 case Sema::AD_Partial: 39 llvm_unreachable("AD_Partial diags should not be delayed"); 40 } 41 DD.Triggered = false; 42 DD.Loc = Loc; 43 DD.DeprecationData.Decl = D; 44 DD.DeprecationData.UnknownObjCClass = UnknownObjCClass; 45 DD.DeprecationData.ObjCProperty = ObjCProperty; 46 char *MessageData = nullptr; 47 if (Msg.size()) { 48 MessageData = new char [Msg.size()]; 49 memcpy(MessageData, Msg.data(), Msg.size()); 50 } 51 52 DD.DeprecationData.Message = MessageData; 53 DD.DeprecationData.MessageLen = Msg.size(); 54 DD.DeprecationData.ObjCPropertyAccess = ObjCPropertyAccess; 55 return DD; 56} 57 58void DelayedDiagnostic::Destroy() { 59 switch (static_cast<DDKind>(Kind)) { 60 case Access: 61 getAccessData().~AccessedEntity(); 62 break; 63 64 case Deprecation: 65 case Unavailable: 66 delete [] DeprecationData.Message; 67 break; 68 69 case ForbiddenType: 70 break; 71 } 72} 73