129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor//===--- DelayedDiagnostic.cpp - Delayed declarator diagnostics -*- C++ -*-===// 229233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 329233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// The LLVM Compiler Infrastructure 429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// This file is distributed under the University of Illinois Open Source 629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// License. See LICENSE.TXT for details. 729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor//===----------------------------------------------------------------------===// 929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 1029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// This file defines the DelayedDiagnostic class implementation, which 1129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// is used to record diagnostics that are being conditionally produced 1229233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// during declarator parsing. 1329233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 1429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// This file also defines AccessedEntity. 1529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor// 1629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor//===----------------------------------------------------------------------===// 1729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor#include "clang/Sema/DelayedDiagnostic.h" 1829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor#include <string.h> 1929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregorusing namespace clang; 2029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregorusing namespace sema; 2129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 22651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDelayedDiagnostic 23651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDelayedDiagnostic::makeAvailability(Sema::AvailabilityDiagnostic AD, 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc, 25b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian const NamedDecl *D, 26b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian const ObjCInterfaceDecl *UnknownObjCClass, 27fd09088880f758c874edc8d3d22fa922baec0483Fariborz Jahanian const ObjCPropertyDecl *ObjCProperty, 28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines StringRef Msg, 29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool ObjCPropertyAccess) { 3029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DelayedDiagnostic DD; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (AD) { 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Sema::AD_Deprecation: 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DD.Kind = Deprecation; 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Sema::AD_Unavailable: 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DD.Kind = Unavailable; 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.Triggered = false; 4029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.Loc = Loc; 4129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.Decl = D; 42b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian DD.DeprecationData.UnknownObjCClass = UnknownObjCClass; 43fd09088880f758c874edc8d3d22fa922baec0483Fariborz Jahanian DD.DeprecationData.ObjCProperty = ObjCProperty; 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines char *MessageData = nullptr; 4529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor if (Msg.size()) { 4629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor MessageData = new char [Msg.size()]; 4729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor memcpy(MessageData, Msg.data(), Msg.size()); 4829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor } 4929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 5029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.Message = MessageData; 5129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.MessageLen = Msg.size(); 52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DD.DeprecationData.ObjCPropertyAccess = ObjCPropertyAccess; 5329233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor return DD; 5429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor} 5529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 5629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregorvoid DelayedDiagnostic::Destroy() { 576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines switch (static_cast<DDKind>(Kind)) { 5829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor case Access: 5929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor getAccessData().~AccessedEntity(); 6029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor break; 6129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Deprecation: 636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case Unavailable: 6429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor delete [] DeprecationData.Message; 6529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor break; 66f85e193739c953358c865005855253af4f68a497John McCall 67f85e193739c953358c865005855253af4f68a497John McCall case ForbiddenType: 68f85e193739c953358c865005855253af4f68a497John McCall break; 6929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor } 7029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor} 71