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 2229233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas GregorDelayedDiagnostic DelayedDiagnostic::makeDeprecation(SourceLocation Loc, 23b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian const NamedDecl *D, 24b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian const ObjCInterfaceDecl *UnknownObjCClass, 25b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian StringRef Msg) { 2629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DelayedDiagnostic DD; 2729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.Kind = Deprecation; 2829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.Triggered = false; 2929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.Loc = Loc; 3029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.Decl = D; 31b0a6615cb9f5e881b81b117017b484fe91112967Fariborz Jahanian DD.DeprecationData.UnknownObjCClass = UnknownObjCClass; 3229233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor char *MessageData = 0; 3329233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor if (Msg.size()) { 3429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor MessageData = new char [Msg.size()]; 3529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor memcpy(MessageData, Msg.data(), Msg.size()); 3629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor } 3729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 3829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.Message = MessageData; 3929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor DD.DeprecationData.MessageLen = Msg.size(); 4029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor return DD; 4129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor} 4229233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 4329233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregorvoid DelayedDiagnostic::Destroy() { 4429233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor switch (Kind) { 4529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor case Access: 4629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor getAccessData().~AccessedEntity(); 4729233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor break; 4829233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor 4929233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor case Deprecation: 5029233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor delete [] DeprecationData.Message; 5129233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor break; 52f85e193739c953358c865005855253af4f68a497John McCall 53f85e193739c953358c865005855253af4f68a497John McCall case ForbiddenType: 54f85e193739c953358c865005855253af4f68a497John McCall break; 5529233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor } 5629233802236f7fe1db20e00eca4f5cc8f3f64adeDouglas Gregor} 57