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