Home | History | Annotate | Line # | Download | only in Sema
      1 //===- DelayedDiagnostic.cpp - Delayed declarator diagnostics -------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file defines the DelayedDiagnostic class implementation, which
     10 // is used to record diagnostics that are being conditionally produced
     11 // during declarator parsing.
     12 //
     13 // This file also defines AccessedEntity.
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #include "clang/Sema/DelayedDiagnostic.h"
     18 #include <cstring>
     19 
     20 using namespace clang;
     21 using namespace sema;
     22 
     23 DelayedDiagnostic
     24 DelayedDiagnostic::makeAvailability(AvailabilityResult AR,
     25                                     ArrayRef<SourceLocation> Locs,
     26                                     const NamedDecl *ReferringDecl,
     27                                     const NamedDecl *OffendingDecl,
     28                                     const ObjCInterfaceDecl *UnknownObjCClass,
     29                                     const ObjCPropertyDecl  *ObjCProperty,
     30                                     StringRef Msg,
     31                                     bool ObjCPropertyAccess) {
     32   assert(!Locs.empty());
     33   DelayedDiagnostic DD;
     34   DD.Kind = Availability;
     35   DD.Triggered = false;
     36   DD.Loc = Locs.front();
     37   DD.AvailabilityData.ReferringDecl = ReferringDecl;
     38   DD.AvailabilityData.OffendingDecl = OffendingDecl;
     39   DD.AvailabilityData.UnknownObjCClass = UnknownObjCClass;
     40   DD.AvailabilityData.ObjCProperty = ObjCProperty;
     41   char *MessageData = nullptr;
     42   if (!Msg.empty()) {
     43     MessageData = new char [Msg.size()];
     44     memcpy(MessageData, Msg.data(), Msg.size());
     45   }
     46   DD.AvailabilityData.Message = MessageData;
     47   DD.AvailabilityData.MessageLen = Msg.size();
     48 
     49   DD.AvailabilityData.SelectorLocs = new SourceLocation[Locs.size()];
     50   memcpy(DD.AvailabilityData.SelectorLocs, Locs.data(),
     51          sizeof(SourceLocation) * Locs.size());
     52   DD.AvailabilityData.NumSelectorLocs = Locs.size();
     53 
     54   DD.AvailabilityData.AR = AR;
     55   DD.AvailabilityData.ObjCPropertyAccess = ObjCPropertyAccess;
     56   return DD;
     57 }
     58 
     59 void DelayedDiagnostic::Destroy() {
     60   switch (Kind) {
     61   case Access:
     62     getAccessData().~AccessedEntity();
     63     break;
     64 
     65   case Availability:
     66     delete[] AvailabilityData.Message;
     67     delete[] AvailabilityData.SelectorLocs;
     68     break;
     69 
     70   case ForbiddenType:
     71     break;
     72   }
     73 }
     74