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