diff options
Diffstat (limited to 'clang/lib/Sema/DelayedDiagnostic.cpp')
| -rw-r--r-- | clang/lib/Sema/DelayedDiagnostic.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/clang/lib/Sema/DelayedDiagnostic.cpp b/clang/lib/Sema/DelayedDiagnostic.cpp new file mode 100644 index 000000000000..cb2721b92090 --- /dev/null +++ b/clang/lib/Sema/DelayedDiagnostic.cpp @@ -0,0 +1,73 @@ +//===- DelayedDiagnostic.cpp - Delayed declarator diagnostics -------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines the DelayedDiagnostic class implementation, which +// is used to record diagnostics that are being conditionally produced +// during declarator parsing. +// +// This file also defines AccessedEntity. +// +//===----------------------------------------------------------------------===// + +#include "clang/Sema/DelayedDiagnostic.h" +#include <cstring> + +using namespace clang; +using namespace sema; + +DelayedDiagnostic +DelayedDiagnostic::makeAvailability(AvailabilityResult AR, + ArrayRef<SourceLocation> Locs, + const NamedDecl *ReferringDecl, + const NamedDecl *OffendingDecl, + const ObjCInterfaceDecl *UnknownObjCClass, + const ObjCPropertyDecl *ObjCProperty, + StringRef Msg, + bool ObjCPropertyAccess) { + assert(!Locs.empty()); + DelayedDiagnostic DD; + DD.Kind = Availability; + DD.Triggered = false; + DD.Loc = Locs.front(); + DD.AvailabilityData.ReferringDecl = ReferringDecl; + DD.AvailabilityData.OffendingDecl = OffendingDecl; + DD.AvailabilityData.UnknownObjCClass = UnknownObjCClass; + DD.AvailabilityData.ObjCProperty = ObjCProperty; + char *MessageData = nullptr; + if (!Msg.empty()) { + MessageData = new char [Msg.size()]; + memcpy(MessageData, Msg.data(), Msg.size()); + } + DD.AvailabilityData.Message = MessageData; + DD.AvailabilityData.MessageLen = Msg.size(); + + DD.AvailabilityData.SelectorLocs = new SourceLocation[Locs.size()]; + memcpy(DD.AvailabilityData.SelectorLocs, Locs.data(), + sizeof(SourceLocation) * Locs.size()); + DD.AvailabilityData.NumSelectorLocs = Locs.size(); + + DD.AvailabilityData.AR = AR; + DD.AvailabilityData.ObjCPropertyAccess = ObjCPropertyAccess; + return DD; +} + +void DelayedDiagnostic::Destroy() { + switch (Kind) { + case Access: + getAccessData().~AccessedEntity(); + break; + + case Availability: + delete[] AvailabilityData.Message; + delete[] AvailabilityData.SelectorLocs; + break; + + case ForbiddenType: + break; + } +} |
