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