brintos

brintos / llvm-project-archived public Read only

0
0
Text · 112.5 KiB · 1541b2c Raw
2958 lines · cpp
1//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the actions class which performs semantic analysis and10// builds an AST out of a parse stream.11//12//===----------------------------------------------------------------------===//13 14#include "UsedDeclVisitor.h"15#include "clang/AST/ASTContext.h"16#include "clang/AST/ASTDiagnostic.h"17#include "clang/AST/Decl.h"18#include "clang/AST/DeclCXX.h"19#include "clang/AST/DeclFriend.h"20#include "clang/AST/DeclObjC.h"21#include "clang/AST/Expr.h"22#include "clang/AST/ExprCXX.h"23#include "clang/AST/PrettyDeclStackTrace.h"24#include "clang/AST/StmtCXX.h"25#include "clang/AST/TypeOrdering.h"26#include "clang/Basic/DarwinSDKInfo.h"27#include "clang/Basic/DiagnosticOptions.h"28#include "clang/Basic/PartialDiagnostic.h"29#include "clang/Basic/SourceManager.h"30#include "clang/Basic/TargetInfo.h"31#include "clang/Lex/HeaderSearch.h"32#include "clang/Lex/HeaderSearchOptions.h"33#include "clang/Lex/Preprocessor.h"34#include "clang/Sema/CXXFieldCollector.h"35#include "clang/Sema/EnterExpressionEvaluationContext.h"36#include "clang/Sema/ExternalSemaSource.h"37#include "clang/Sema/Initialization.h"38#include "clang/Sema/MultiplexExternalSemaSource.h"39#include "clang/Sema/ObjCMethodList.h"40#include "clang/Sema/RISCVIntrinsicManager.h"41#include "clang/Sema/Scope.h"42#include "clang/Sema/ScopeInfo.h"43#include "clang/Sema/SemaAMDGPU.h"44#include "clang/Sema/SemaARM.h"45#include "clang/Sema/SemaAVR.h"46#include "clang/Sema/SemaBPF.h"47#include "clang/Sema/SemaCUDA.h"48#include "clang/Sema/SemaCodeCompletion.h"49#include "clang/Sema/SemaConsumer.h"50#include "clang/Sema/SemaDirectX.h"51#include "clang/Sema/SemaHLSL.h"52#include "clang/Sema/SemaHexagon.h"53#include "clang/Sema/SemaLoongArch.h"54#include "clang/Sema/SemaM68k.h"55#include "clang/Sema/SemaMIPS.h"56#include "clang/Sema/SemaMSP430.h"57#include "clang/Sema/SemaNVPTX.h"58#include "clang/Sema/SemaObjC.h"59#include "clang/Sema/SemaOpenACC.h"60#include "clang/Sema/SemaOpenCL.h"61#include "clang/Sema/SemaOpenMP.h"62#include "clang/Sema/SemaPPC.h"63#include "clang/Sema/SemaPseudoObject.h"64#include "clang/Sema/SemaRISCV.h"65#include "clang/Sema/SemaSPIRV.h"66#include "clang/Sema/SemaSYCL.h"67#include "clang/Sema/SemaSwift.h"68#include "clang/Sema/SemaSystemZ.h"69#include "clang/Sema/SemaWasm.h"70#include "clang/Sema/SemaX86.h"71#include "clang/Sema/TemplateDeduction.h"72#include "clang/Sema/TemplateInstCallback.h"73#include "clang/Sema/TypoCorrection.h"74#include "llvm/ADT/DenseMap.h"75#include "llvm/ADT/STLExtras.h"76#include "llvm/ADT/SmallPtrSet.h"77#include "llvm/Support/TimeProfiler.h"78#include <optional>79 80using namespace clang;81using namespace sema;82 83SourceLocation Sema::getLocForEndOfToken(SourceLocation Loc, unsigned Offset) {84  return Lexer::getLocForEndOfToken(Loc, Offset, SourceMgr, LangOpts);85}86 87SourceRange88Sema::getRangeForNextToken(SourceLocation Loc, bool IncludeMacros,89                           bool IncludeComments,90                           std::optional<tok::TokenKind> ExpectedToken) {91  if (!Loc.isValid())92    return SourceRange();93  std::optional<Token> NextToken =94      Lexer::findNextToken(Loc, SourceMgr, LangOpts, IncludeComments);95  if (!NextToken)96    return SourceRange();97  if (ExpectedToken && NextToken->getKind() != *ExpectedToken)98    return SourceRange();99  SourceLocation TokenStart = NextToken->getLocation();100  SourceLocation TokenEnd = NextToken->getLastLoc();101  if (!TokenStart.isValid() || !TokenEnd.isValid())102    return SourceRange();103  if (!IncludeMacros && (TokenStart.isMacroID() || TokenEnd.isMacroID()))104    return SourceRange();105 106  return SourceRange(TokenStart, TokenEnd);107}108 109ModuleLoader &Sema::getModuleLoader() const { return PP.getModuleLoader(); }110 111DarwinSDKInfo *112Sema::getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc,113                                              StringRef Platform) {114  auto *SDKInfo = getDarwinSDKInfoForAvailabilityChecking();115  if (!SDKInfo && !WarnedDarwinSDKInfoMissing) {116    Diag(Loc, diag::warn_missing_sdksettings_for_availability_checking)117        << Platform;118    WarnedDarwinSDKInfoMissing = true;119  }120  return SDKInfo;121}122 123DarwinSDKInfo *Sema::getDarwinSDKInfoForAvailabilityChecking() {124  if (CachedDarwinSDKInfo)125    return CachedDarwinSDKInfo->get();126  auto SDKInfo = parseDarwinSDKInfo(127      PP.getFileManager().getVirtualFileSystem(),128      PP.getHeaderSearchInfo().getHeaderSearchOpts().Sysroot);129  if (SDKInfo && *SDKInfo) {130    CachedDarwinSDKInfo = std::make_unique<DarwinSDKInfo>(std::move(**SDKInfo));131    return CachedDarwinSDKInfo->get();132  }133  if (!SDKInfo)134    llvm::consumeError(SDKInfo.takeError());135  CachedDarwinSDKInfo = std::unique_ptr<DarwinSDKInfo>();136  return nullptr;137}138 139IdentifierInfo *Sema::InventAbbreviatedTemplateParameterTypeName(140    const IdentifierInfo *ParamName, unsigned int Index) {141  std::string InventedName;142  llvm::raw_string_ostream OS(InventedName);143 144  if (!ParamName)145    OS << "auto:" << Index + 1;146  else147    OS << ParamName->getName() << ":auto";148 149  return &Context.Idents.get(OS.str());150}151 152PrintingPolicy Sema::getPrintingPolicy(const ASTContext &Context,153                                       const Preprocessor &PP) {154  PrintingPolicy Policy = Context.getPrintingPolicy();155  // In diagnostics, we print _Bool as bool if the latter is defined as the156  // former.157  Policy.Bool = Context.getLangOpts().Bool;158  if (!Policy.Bool) {159    if (const MacroInfo *BoolMacro = PP.getMacroInfo(Context.getBoolName())) {160      Policy.Bool = BoolMacro->isObjectLike() &&161                    BoolMacro->getNumTokens() == 1 &&162                    BoolMacro->getReplacementToken(0).is(tok::kw__Bool);163    }164  }165 166  // Shorten the data output if needed167  Policy.EntireContentsOfLargeArray = false;168 169  return Policy;170}171 172void Sema::ActOnTranslationUnitScope(Scope *S) {173  TUScope = S;174  PushDeclContext(S, Context.getTranslationUnitDecl());175}176 177namespace clang {178namespace sema {179 180class SemaPPCallbacks : public PPCallbacks {181  Sema *S = nullptr;182  llvm::SmallVector<SourceLocation, 8> IncludeStack;183  llvm::SmallVector<llvm::TimeTraceProfilerEntry *, 8> ProfilerStack;184 185public:186  void set(Sema &S) { this->S = &S; }187 188  void reset() { S = nullptr; }189 190  void FileChanged(SourceLocation Loc, FileChangeReason Reason,191                   SrcMgr::CharacteristicKind FileType,192                   FileID PrevFID) override {193    if (!S)194      return;195    switch (Reason) {196    case EnterFile: {197      SourceManager &SM = S->getSourceManager();198      SourceLocation IncludeLoc = SM.getIncludeLoc(SM.getFileID(Loc));199      if (IncludeLoc.isValid()) {200        if (llvm::timeTraceProfilerEnabled()) {201          OptionalFileEntryRef FE = SM.getFileEntryRefForID(SM.getFileID(Loc));202          ProfilerStack.push_back(llvm::timeTraceAsyncProfilerBegin(203              "Source", FE ? FE->getName() : StringRef("<unknown>")));204        }205 206        IncludeStack.push_back(IncludeLoc);207        S->DiagnoseNonDefaultPragmaAlignPack(208            Sema::PragmaAlignPackDiagnoseKind::NonDefaultStateAtInclude,209            IncludeLoc);210      }211      break;212    }213    case ExitFile:214      if (!IncludeStack.empty()) {215        if (llvm::timeTraceProfilerEnabled())216          llvm::timeTraceProfilerEnd(ProfilerStack.pop_back_val());217 218        S->DiagnoseNonDefaultPragmaAlignPack(219            Sema::PragmaAlignPackDiagnoseKind::ChangedStateAtExit,220            IncludeStack.pop_back_val());221      }222      break;223    default:224      break;225    }226  }227  void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace,228                        diag::Severity Mapping, StringRef Str) override {229    // If one of the analysis-based diagnostics was enabled while processing230    // a function, we want to note it in the analysis-based warnings so they231    // can be run at the end of the function body even if the analysis warnings232    // are disabled at that point.233    SmallVector<diag::kind, 256> GroupDiags;234    diag::Flavor Flavor =235        Str[1] == 'W' ? diag::Flavor::WarningOrError : diag::Flavor::Remark;236    StringRef Group = Str.substr(2);237 238    if (S->PP.getDiagnostics().getDiagnosticIDs()->getDiagnosticsInGroup(239            Flavor, Group, GroupDiags))240      return;241 242    for (diag::kind K : GroupDiags) {243      // Note: the cases in this switch should be kept in sync with the244      // diagnostics in AnalysisBasedWarnings::getPolicyInEffectAt().245      AnalysisBasedWarnings::Policy &Override =246          S->AnalysisWarnings.getPolicyOverrides();247      switch (K) {248      default: break;249      case diag::warn_unreachable:250      case diag::warn_unreachable_break:251      case diag::warn_unreachable_return:252      case diag::warn_unreachable_loop_increment:253        Override.enableCheckUnreachable = true;254        break;255      case diag::warn_double_lock:256        Override.enableThreadSafetyAnalysis = true;257        break;258      case diag::warn_use_in_invalid_state:259        Override.enableConsumedAnalysis = true;260        break;261      }262    }263  }264};265 266} // end namespace sema267} // end namespace clang268 269const unsigned Sema::MaxAlignmentExponent;270const uint64_t Sema::MaximumAlignment;271 272Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,273           TranslationUnitKind TUKind, CodeCompleteConsumer *CodeCompleter)274    : SemaBase(*this), CollectStats(false), TUKind(TUKind),275      CurFPFeatures(pp.getLangOpts()), LangOpts(pp.getLangOpts()), PP(pp),276      Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()),277      SourceMgr(PP.getSourceManager()), APINotes(SourceMgr, LangOpts),278      AnalysisWarnings(*this), ThreadSafetyDeclCache(nullptr),279      LateTemplateParser(nullptr), OpaqueParser(nullptr), CurContext(nullptr),280      ExternalSource(nullptr), StackHandler(Diags), CurScope(nullptr),281      Ident_super(nullptr), AMDGPUPtr(std::make_unique<SemaAMDGPU>(*this)),282      ARMPtr(std::make_unique<SemaARM>(*this)),283      AVRPtr(std::make_unique<SemaAVR>(*this)),284      BPFPtr(std::make_unique<SemaBPF>(*this)),285      CodeCompletionPtr(286          std::make_unique<SemaCodeCompletion>(*this, CodeCompleter)),287      CUDAPtr(std::make_unique<SemaCUDA>(*this)),288      DirectXPtr(std::make_unique<SemaDirectX>(*this)),289      HLSLPtr(std::make_unique<SemaHLSL>(*this)),290      HexagonPtr(std::make_unique<SemaHexagon>(*this)),291      LoongArchPtr(std::make_unique<SemaLoongArch>(*this)),292      M68kPtr(std::make_unique<SemaM68k>(*this)),293      MIPSPtr(std::make_unique<SemaMIPS>(*this)),294      MSP430Ptr(std::make_unique<SemaMSP430>(*this)),295      NVPTXPtr(std::make_unique<SemaNVPTX>(*this)),296      ObjCPtr(std::make_unique<SemaObjC>(*this)),297      OpenACCPtr(std::make_unique<SemaOpenACC>(*this)),298      OpenCLPtr(std::make_unique<SemaOpenCL>(*this)),299      OpenMPPtr(std::make_unique<SemaOpenMP>(*this)),300      PPCPtr(std::make_unique<SemaPPC>(*this)),301      PseudoObjectPtr(std::make_unique<SemaPseudoObject>(*this)),302      RISCVPtr(std::make_unique<SemaRISCV>(*this)),303      SPIRVPtr(std::make_unique<SemaSPIRV>(*this)),304      SYCLPtr(std::make_unique<SemaSYCL>(*this)),305      SwiftPtr(std::make_unique<SemaSwift>(*this)),306      SystemZPtr(std::make_unique<SemaSystemZ>(*this)),307      WasmPtr(std::make_unique<SemaWasm>(*this)),308      X86Ptr(std::make_unique<SemaX86>(*this)),309      MSPointerToMemberRepresentationMethod(310          LangOpts.getMSPointerToMemberRepresentationMethod()),311      MSStructPragmaOn(false), VtorDispStack(LangOpts.getVtorDispMode()),312      AlignPackStack(AlignPackInfo(getLangOpts().XLPragmaPack)),313      DataSegStack(nullptr), BSSSegStack(nullptr), ConstSegStack(nullptr),314      CodeSegStack(nullptr), StrictGuardStackCheckStack(false),315      FpPragmaStack(FPOptionsOverride()), CurInitSeg(nullptr),316      VisContext(nullptr), PragmaAttributeCurrentTargetDecl(nullptr),317      StdCoroutineTraitsCache(nullptr), IdResolver(pp),318      OriginalLexicalContext(nullptr), StdInitializerList(nullptr),319      StdTypeIdentity(nullptr),320      FullyCheckedComparisonCategories(321          static_cast<unsigned>(ComparisonCategoryType::Last) + 1),322      StdSourceLocationImplDecl(nullptr), CXXTypeInfoDecl(nullptr),323      GlobalNewDeleteDeclared(false), DisableTypoCorrection(false),324      TyposCorrected(0), IsBuildingRecoveryCallExpr(false),325      CurrentInstantiationScope(nullptr), NonInstantiationEntries(0),326      ArgPackSubstIndex(std::nullopt), SatisfactionCache(Context) {327  assert(pp.TUKind == TUKind);328  TUScope = nullptr;329 330  LoadedExternalKnownNamespaces = false;331  for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I)332    ObjC().NSNumberLiteralMethods[I] = nullptr;333 334  if (getLangOpts().ObjC)335    ObjC().NSAPIObj.reset(new NSAPI(Context));336 337  if (getLangOpts().CPlusPlus)338    FieldCollector.reset(new CXXFieldCollector());339 340  // Tell diagnostics how to render things from the AST library.341  Diags.SetArgToStringFn(&FormatASTNodeDiagnosticArgument, &Context);342 343  // This evaluation context exists to ensure that there's always at least one344  // valid evaluation context available. It is never removed from the345  // evaluation stack.346  ExprEvalContexts.emplace_back(347      ExpressionEvaluationContext::PotentiallyEvaluated, 0, CleanupInfo{},348      nullptr, ExpressionEvaluationContextRecord::EK_Other);349 350  // Initialization of data sharing attributes stack for OpenMP351  OpenMP().InitDataSharingAttributesStack();352 353  std::unique_ptr<sema::SemaPPCallbacks> Callbacks =354      std::make_unique<sema::SemaPPCallbacks>();355  SemaPPCallbackHandler = Callbacks.get();356  PP.addPPCallbacks(std::move(Callbacks));357  SemaPPCallbackHandler->set(*this);358 359  CurFPFeatures.setFPEvalMethod(PP.getCurrentFPEvalMethod());360}361 362// Anchor Sema's type info to this TU.363void Sema::anchor() {}364 365void Sema::addImplicitTypedef(StringRef Name, QualType T) {366  DeclarationName DN = &Context.Idents.get(Name);367  if (IdResolver.begin(DN) == IdResolver.end())368    PushOnScopeChains(Context.buildImplicitTypedef(T, Name), TUScope);369}370 371void Sema::Initialize() {372  // Create BuiltinVaListDecl *before* ExternalSemaSource::InitializeSema(this)373  // because during initialization ASTReader can emit globals that require374  // name mangling. And the name mangling uses BuiltinVaListDecl.375  if (Context.getTargetInfo().hasBuiltinMSVaList())376    (void)Context.getBuiltinMSVaListDecl();377  (void)Context.getBuiltinVaListDecl();378 379  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))380    SC->InitializeSema(*this);381 382  // Tell the external Sema source about this Sema object.383  if (ExternalSemaSource *ExternalSema384      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))385    ExternalSema->InitializeSema(*this);386 387  // This needs to happen after ExternalSemaSource::InitializeSema(this) or we388  // will not be able to merge any duplicate __va_list_tag decls correctly.389  VAListTagName = PP.getIdentifierInfo("__va_list_tag");390 391  if (!TUScope)392    return;393 394  // Initialize predefined 128-bit integer types, if needed.395  if (Context.getTargetInfo().hasInt128Type() ||396      (Context.getAuxTargetInfo() &&397       Context.getAuxTargetInfo()->hasInt128Type())) {398    // If either of the 128-bit integer types are unavailable to name lookup,399    // define them now.400    DeclarationName Int128 = &Context.Idents.get("__int128_t");401    if (IdResolver.begin(Int128) == IdResolver.end())402      PushOnScopeChains(Context.getInt128Decl(), TUScope);403 404    DeclarationName UInt128 = &Context.Idents.get("__uint128_t");405    if (IdResolver.begin(UInt128) == IdResolver.end())406      PushOnScopeChains(Context.getUInt128Decl(), TUScope);407  }408 409 410  // Initialize predefined Objective-C types:411  if (getLangOpts().ObjC) {412    // If 'SEL' does not yet refer to any declarations, make it refer to the413    // predefined 'SEL'.414    DeclarationName SEL = &Context.Idents.get("SEL");415    if (IdResolver.begin(SEL) == IdResolver.end())416      PushOnScopeChains(Context.getObjCSelDecl(), TUScope);417 418    // If 'id' does not yet refer to any declarations, make it refer to the419    // predefined 'id'.420    DeclarationName Id = &Context.Idents.get("id");421    if (IdResolver.begin(Id) == IdResolver.end())422      PushOnScopeChains(Context.getObjCIdDecl(), TUScope);423 424    // Create the built-in typedef for 'Class'.425    DeclarationName Class = &Context.Idents.get("Class");426    if (IdResolver.begin(Class) == IdResolver.end())427      PushOnScopeChains(Context.getObjCClassDecl(), TUScope);428 429    // Create the built-in forward declaratino for 'Protocol'.430    DeclarationName Protocol = &Context.Idents.get("Protocol");431    if (IdResolver.begin(Protocol) == IdResolver.end())432      PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope);433  }434 435  // Create the internal type for the *StringMakeConstantString builtins.436  DeclarationName ConstantString = &Context.Idents.get("__NSConstantString");437  if (IdResolver.begin(ConstantString) == IdResolver.end())438    PushOnScopeChains(Context.getCFConstantStringDecl(), TUScope);439 440  // Initialize Microsoft "predefined C++ types".441  if (getLangOpts().MSVCCompat) {442    if (getLangOpts().CPlusPlus &&443        IdResolver.begin(&Context.Idents.get("type_info")) == IdResolver.end())444      PushOnScopeChains(Context.getMSTypeInfoTagDecl(), TUScope);445 446    addImplicitTypedef("size_t", Context.getSizeType());447  }448 449  // Initialize predefined OpenCL types and supported extensions and (optional)450  // core features.451  if (getLangOpts().OpenCL) {452    getOpenCLOptions().addSupport(453        Context.getTargetInfo().getSupportedOpenCLOpts(), getLangOpts());454    addImplicitTypedef("sampler_t", Context.OCLSamplerTy);455    addImplicitTypedef("event_t", Context.OCLEventTy);456    auto OCLCompatibleVersion = getLangOpts().getOpenCLCompatibleVersion();457    if (OCLCompatibleVersion >= 200) {458      if (getLangOpts().OpenCLCPlusPlus || getLangOpts().Blocks) {459        addImplicitTypedef("clk_event_t", Context.OCLClkEventTy);460        addImplicitTypedef("queue_t", Context.OCLQueueTy);461      }462      if (getLangOpts().OpenCLPipes)463        addImplicitTypedef("reserve_id_t", Context.OCLReserveIDTy);464      addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));465      addImplicitTypedef("atomic_uint",466                         Context.getAtomicType(Context.UnsignedIntTy));467      addImplicitTypedef("atomic_float",468                         Context.getAtomicType(Context.FloatTy));469      // OpenCLC v2.0, s6.13.11.6 requires that atomic_flag is implemented as470      // 32-bit integer and OpenCLC v2.0, s6.1.1 int is always 32-bit wide.471      addImplicitTypedef("atomic_flag", Context.getAtomicType(Context.IntTy));472 473 474      // OpenCL v2.0 s6.13.11.6:475      // - The atomic_long and atomic_ulong types are supported if the476      //   cl_khr_int64_base_atomics and cl_khr_int64_extended_atomics477      //   extensions are supported.478      // - The atomic_double type is only supported if double precision479      //   is supported and the cl_khr_int64_base_atomics and480      //   cl_khr_int64_extended_atomics extensions are supported.481      // - If the device address space is 64-bits, the data types482      //   atomic_intptr_t, atomic_uintptr_t, atomic_size_t and483      //   atomic_ptrdiff_t are supported if the cl_khr_int64_base_atomics and484      //   cl_khr_int64_extended_atomics extensions are supported.485 486      auto AddPointerSizeDependentTypes = [&]() {487        auto AtomicSizeT = Context.getAtomicType(Context.getSizeType());488        auto AtomicIntPtrT = Context.getAtomicType(Context.getIntPtrType());489        auto AtomicUIntPtrT = Context.getAtomicType(Context.getUIntPtrType());490        auto AtomicPtrDiffT =491            Context.getAtomicType(Context.getPointerDiffType());492        addImplicitTypedef("atomic_size_t", AtomicSizeT);493        addImplicitTypedef("atomic_intptr_t", AtomicIntPtrT);494        addImplicitTypedef("atomic_uintptr_t", AtomicUIntPtrT);495        addImplicitTypedef("atomic_ptrdiff_t", AtomicPtrDiffT);496      };497 498      if (Context.getTypeSize(Context.getSizeType()) == 32) {499        AddPointerSizeDependentTypes();500      }501 502      if (getOpenCLOptions().isSupported("cl_khr_fp16", getLangOpts())) {503        auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);504        addImplicitTypedef("atomic_half", AtomicHalfT);505      }506 507      std::vector<QualType> Atomic64BitTypes;508      if (getOpenCLOptions().isSupported("cl_khr_int64_base_atomics",509                                         getLangOpts()) &&510          getOpenCLOptions().isSupported("cl_khr_int64_extended_atomics",511                                         getLangOpts())) {512        if (getOpenCLOptions().isSupported("cl_khr_fp64", getLangOpts())) {513          auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy);514          addImplicitTypedef("atomic_double", AtomicDoubleT);515          Atomic64BitTypes.push_back(AtomicDoubleT);516        }517        auto AtomicLongT = Context.getAtomicType(Context.LongTy);518        auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy);519        addImplicitTypedef("atomic_long", AtomicLongT);520        addImplicitTypedef("atomic_ulong", AtomicULongT);521 522 523        if (Context.getTypeSize(Context.getSizeType()) == 64) {524          AddPointerSizeDependentTypes();525        }526      }527    }528 529#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)                                      \530  if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) {                   \531    addImplicitTypedef(#ExtType, Context.Id##Ty);                              \532  }533#include "clang/Basic/OpenCLExtensionTypes.def"534  }535 536  if (Context.getTargetInfo().hasAArch64ACLETypes() ||537      (Context.getAuxTargetInfo() &&538       Context.getAuxTargetInfo()->hasAArch64ACLETypes())) {539#define SVE_TYPE(Name, Id, SingletonId)                                        \540  addImplicitTypedef(#Name, Context.SingletonId);541#define NEON_VECTOR_TYPE(Name, BaseType, ElBits, NumEls, VectorKind)           \542  addImplicitTypedef(                                                          \543      #Name, Context.getVectorType(Context.BaseType, NumEls, VectorKind));544#include "clang/Basic/AArch64ACLETypes.def"545  }546 547  if (Context.getTargetInfo().getTriple().isPPC64()) {548#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \549      addImplicitTypedef(#Name, Context.Id##Ty);550#include "clang/Basic/PPCTypes.def"551#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \552    addImplicitTypedef(#Name, Context.Id##Ty);553#include "clang/Basic/PPCTypes.def"554  }555 556  if (Context.getTargetInfo().hasRISCVVTypes()) {557#define RVV_TYPE(Name, Id, SingletonId)                                        \558  addImplicitTypedef(Name, Context.SingletonId);559#include "clang/Basic/RISCVVTypes.def"560  }561 562  if (Context.getTargetInfo().getTriple().isWasm() &&563      Context.getTargetInfo().hasFeature("reference-types")) {564#define WASM_TYPE(Name, Id, SingletonId)                                       \565  addImplicitTypedef(Name, Context.SingletonId);566#include "clang/Basic/WebAssemblyReferenceTypes.def"567  }568 569  if (Context.getTargetInfo().getTriple().isAMDGPU() ||570      (Context.getAuxTargetInfo() &&571       Context.getAuxTargetInfo()->getTriple().isAMDGPU())) {572#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)                       \573  addImplicitTypedef(Name, Context.SingletonId);574#include "clang/Basic/AMDGPUTypes.def"575  }576 577  if (Context.getTargetInfo().hasBuiltinMSVaList()) {578    DeclarationName MSVaList = &Context.Idents.get("__builtin_ms_va_list");579    if (IdResolver.begin(MSVaList) == IdResolver.end())580      PushOnScopeChains(Context.getBuiltinMSVaListDecl(), TUScope);581  }582 583  DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list");584  if (IdResolver.begin(BuiltinVaList) == IdResolver.end())585    PushOnScopeChains(Context.getBuiltinVaListDecl(), TUScope);586}587 588Sema::~Sema() {589  assert(InstantiatingSpecializations.empty() &&590         "failed to clean up an InstantiatingTemplate?");591 592  if (VisContext) FreeVisContext();593 594  // Kill all the active scopes.595  for (sema::FunctionScopeInfo *FSI : FunctionScopes)596    delete FSI;597 598  // Tell the SemaConsumer to forget about us; we're going out of scope.599  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))600    SC->ForgetSema();601 602  // Detach from the external Sema source.603  if (ExternalSemaSource *ExternalSema604        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))605    ExternalSema->ForgetSema();606 607  // Delete cached satisfactions.608  std::vector<ConstraintSatisfaction *> Satisfactions;609  Satisfactions.reserve(SatisfactionCache.size());610  for (auto &Node : SatisfactionCache)611    Satisfactions.push_back(&Node);612  for (auto *Node : Satisfactions)613    delete Node;614 615  threadSafety::threadSafetyCleanup(ThreadSafetyDeclCache);616 617  // Destroys data sharing attributes stack for OpenMP618  OpenMP().DestroyDataSharingAttributesStack();619 620  // Detach from the PP callback handler which outlives Sema since it's owned621  // by the preprocessor.622  SemaPPCallbackHandler->reset();623}624 625void Sema::runWithSufficientStackSpace(SourceLocation Loc,626                                       llvm::function_ref<void()> Fn) {627  StackHandler.runWithSufficientStackSpace(Loc, Fn);628}629 630bool Sema::makeUnavailableInSystemHeader(SourceLocation loc,631                                      UnavailableAttr::ImplicitReason reason) {632  // If we're not in a function, it's an error.633  FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);634  if (!fn) return false;635 636  // If we're in template instantiation, it's an error.637  if (inTemplateInstantiation())638    return false;639 640  // If that function's not in a system header, it's an error.641  if (!Context.getSourceManager().isInSystemHeader(loc))642    return false;643 644  // If the function is already unavailable, it's not an error.645  if (fn->hasAttr<UnavailableAttr>()) return true;646 647  fn->addAttr(UnavailableAttr::CreateImplicit(Context, "", reason, loc));648  return true;649}650 651ASTMutationListener *Sema::getASTMutationListener() const {652  return getASTConsumer().GetASTMutationListener();653}654 655void Sema::addExternalSource(IntrusiveRefCntPtr<ExternalSemaSource> E) {656  assert(E && "Cannot use with NULL ptr");657 658  if (!ExternalSource) {659    ExternalSource = std::move(E);660    return;661  }662 663  if (auto *Ex = dyn_cast<MultiplexExternalSemaSource>(ExternalSource.get()))664    Ex->AddSource(std::move(E));665  else666    ExternalSource = llvm::makeIntrusiveRefCnt<MultiplexExternalSemaSource>(667        ExternalSource, std::move(E));668}669 670void Sema::PrintStats() const {671  llvm::errs() << "\n*** Semantic Analysis Stats:\n";672  if (SFINAETrap *Trap = getSFINAEContext())673    llvm::errs() << int(Trap->hasErrorOccurred())674                 << " SFINAE diagnostics trapped.\n";675 676  BumpAlloc.PrintStats();677  AnalysisWarnings.PrintStats();678}679 680void Sema::diagnoseNullableToNonnullConversion(QualType DstType,681                                               QualType SrcType,682                                               SourceLocation Loc) {683  std::optional<NullabilityKind> ExprNullability = SrcType->getNullability();684  if (!ExprNullability || (*ExprNullability != NullabilityKind::Nullable &&685                           *ExprNullability != NullabilityKind::NullableResult))686    return;687 688  std::optional<NullabilityKind> TypeNullability = DstType->getNullability();689  if (!TypeNullability || *TypeNullability != NullabilityKind::NonNull)690    return;691 692  Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;693}694 695// Generate diagnostics when adding or removing effects in a type conversion.696void Sema::diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType,697                                            SourceLocation Loc) {698  const auto SrcFX = FunctionEffectsRef::get(SrcType);699  const auto DstFX = FunctionEffectsRef::get(DstType);700  if (SrcFX != DstFX) {701    for (const auto &Diff : FunctionEffectDiffVector(SrcFX, DstFX)) {702      if (Diff.shouldDiagnoseConversion(SrcType, SrcFX, DstType, DstFX))703        Diag(Loc, diag::warn_invalid_add_func_effects) << Diff.effectName();704    }705  }706}707 708void Sema::diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E) {709  // nullptr only exists from C++11 on, so don't warn on its absence earlier.710  if (!getLangOpts().CPlusPlus11)711    return;712 713  if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)714    return;715 716  const Expr *EStripped = E->IgnoreParenImpCasts();717  if (EStripped->getType()->isNullPtrType())718    return;719  if (isa<GNUNullExpr>(EStripped))720    return;721 722  if (Diags.isIgnored(diag::warn_zero_as_null_pointer_constant,723                      E->getBeginLoc()))724    return;725 726  // Don't diagnose the conversion from a 0 literal to a null pointer argument727  // in a synthesized call to operator<=>.728  if (!CodeSynthesisContexts.empty() &&729      CodeSynthesisContexts.back().Kind ==730          CodeSynthesisContext::RewritingOperatorAsSpaceship)731    return;732 733  // Ignore null pointers in defaulted comparison operators.734  FunctionDecl *FD = getCurFunctionDecl();735  if (FD && FD->isDefaulted()) {736    return;737  }738 739  // If it is a macro from system header, and if the macro name is not "NULL",740  // do not warn.741  // Note that uses of "NULL" will be ignored above on systems that define it742  // as __null.743  SourceLocation MaybeMacroLoc = E->getBeginLoc();744  if (Diags.getSuppressSystemWarnings() &&745      SourceMgr.isInSystemMacro(MaybeMacroLoc) &&746      !findMacroSpelling(MaybeMacroLoc, "NULL"))747    return;748 749  Diag(E->getBeginLoc(), diag::warn_zero_as_null_pointer_constant)750      << FixItHint::CreateReplacement(E->getSourceRange(), "nullptr");751}752 753/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.754/// If there is already an implicit cast, merge into the existing one.755/// The result is of the given category.756ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,757                                   CastKind Kind, ExprValueKind VK,758                                   const CXXCastPath *BasePath,759                                   CheckedConversionKind CCK) {760#ifndef NDEBUG761  if (VK == VK_PRValue && !E->isPRValue()) {762    switch (Kind) {763    default:764      llvm_unreachable(765          ("can't implicitly cast glvalue to prvalue with this cast "766           "kind: " +767           std::string(CastExpr::getCastKindName(Kind)))768              .c_str());769    case CK_Dependent:770    case CK_LValueToRValue:771    case CK_ArrayToPointerDecay:772    case CK_FunctionToPointerDecay:773    case CK_ToVoid:774    case CK_NonAtomicToAtomic:775    case CK_HLSLArrayRValue:776    case CK_HLSLAggregateSplatCast:777      break;778    }779  }780  assert((VK == VK_PRValue || Kind == CK_Dependent || !E->isPRValue()) &&781         "can't cast prvalue to glvalue");782#endif783 784  diagnoseNullableToNonnullConversion(Ty, E->getType(), E->getBeginLoc());785  diagnoseZeroToNullptrConversion(Kind, E);786  if (Context.hasAnyFunctionEffects() && !isCast(CCK) &&787      Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)788    diagnoseFunctionEffectConversion(Ty, E->getType(), E->getBeginLoc());789 790  QualType ExprTy = Context.getCanonicalType(E->getType());791  QualType TypeTy = Context.getCanonicalType(Ty);792 793  // This cast is used in place of a regular LValue to RValue cast for794  // HLSL Array Parameter Types. It needs to be emitted even if795  // ExprTy == TypeTy, except if E is an HLSLOutArgExpr796  // Emitting a cast in that case will prevent HLSLOutArgExpr from797  // being handled properly in EmitCallArg798  if (Kind == CK_HLSLArrayRValue && !isa<HLSLOutArgExpr>(E))799    return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,800                                    CurFPFeatureOverrides());801 802  if (ExprTy == TypeTy)803    return E;804 805  if (Kind == CK_ArrayToPointerDecay) {806    // C++1z [conv.array]: The temporary materialization conversion is applied.807    // We also use this to fuel C++ DR1213, which applies to C++11 onwards.808    if (getLangOpts().CPlusPlus && E->isPRValue()) {809      // The temporary is an lvalue in C++98 and an xvalue otherwise.810      ExprResult Materialized = CreateMaterializeTemporaryExpr(811          E->getType(), E, !getLangOpts().CPlusPlus11);812      if (Materialized.isInvalid())813        return ExprError();814      E = Materialized.get();815    }816    // C17 6.7.1p6 footnote 124: The implementation can treat any register817    // declaration simply as an auto declaration. However, whether or not818    // addressable storage is actually used, the address of any part of an819    // object declared with storage-class specifier register cannot be820    // computed, either explicitly(by use of the unary & operator as discussed821    // in 6.5.3.2) or implicitly(by converting an array name to a pointer as822    // discussed in 6.3.2.1).Thus, the only operator that can be applied to an823    // array declared with storage-class specifier register is sizeof.824    if (VK == VK_PRValue && !getLangOpts().CPlusPlus && !E->isPRValue()) {825      if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {826        if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {827          if (VD->getStorageClass() == SC_Register) {828            Diag(E->getExprLoc(), diag::err_typecheck_address_of)829                << /*register variable*/ 3 << E->getSourceRange();830            return ExprError();831          }832        }833      }834    }835  }836 837  if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {838    if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {839      ImpCast->setType(Ty);840      ImpCast->setValueKind(VK);841      return E;842    }843  }844 845  return ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK,846                                  CurFPFeatureOverrides());847}848 849CastKind Sema::ScalarTypeToBooleanCastKind(QualType ScalarTy) {850  switch (ScalarTy->getScalarTypeKind()) {851  case Type::STK_Bool: return CK_NoOp;852  case Type::STK_CPointer: return CK_PointerToBoolean;853  case Type::STK_BlockPointer: return CK_PointerToBoolean;854  case Type::STK_ObjCObjectPointer: return CK_PointerToBoolean;855  case Type::STK_MemberPointer: return CK_MemberPointerToBoolean;856  case Type::STK_Integral: return CK_IntegralToBoolean;857  case Type::STK_Floating: return CK_FloatingToBoolean;858  case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean;859  case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean;860  case Type::STK_FixedPoint: return CK_FixedPointToBoolean;861  }862  llvm_unreachable("unknown scalar type kind");863}864 865/// Used to prune the decls of Sema's UnusedFileScopedDecls vector.866static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {867  if (D->getMostRecentDecl()->isUsed())868    return true;869 870  if (D->isExternallyVisible())871    return true;872 873  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {874    // If this is a function template and none of its specializations is used,875    // we should warn.876    if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate())877      for (const auto *Spec : Template->specializations())878        if (ShouldRemoveFromUnused(SemaRef, Spec))879          return true;880 881    // UnusedFileScopedDecls stores the first declaration.882    // The declaration may have become definition so check again.883    const FunctionDecl *DeclToCheck;884    if (FD->hasBody(DeclToCheck))885      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);886 887    // Later redecls may add new information resulting in not having to warn,888    // so check again.889    DeclToCheck = FD->getMostRecentDecl();890    if (DeclToCheck != FD)891      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);892  }893 894  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {895    // If a variable usable in constant expressions is referenced,896    // don't warn if it isn't used: if the value of a variable is required897    // for the computation of a constant expression, it doesn't make sense to898    // warn even if the variable isn't odr-used.  (isReferenced doesn't899    // precisely reflect that, but it's a decent approximation.)900    if (VD->isReferenced() &&901        VD->mightBeUsableInConstantExpressions(SemaRef->Context))902      return true;903 904    if (VarTemplateDecl *Template = VD->getDescribedVarTemplate())905      // If this is a variable template and none of its specializations is used,906      // we should warn.907      for (const auto *Spec : Template->specializations())908        if (ShouldRemoveFromUnused(SemaRef, Spec))909          return true;910 911    // UnusedFileScopedDecls stores the first declaration.912    // The declaration may have become definition so check again.913    const VarDecl *DeclToCheck = VD->getDefinition();914    if (DeclToCheck)915      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);916 917    // Later redecls may add new information resulting in not having to warn,918    // so check again.919    DeclToCheck = VD->getMostRecentDecl();920    if (DeclToCheck != VD)921      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);922  }923 924  return false;925}926 927static bool isFunctionOrVarDeclExternC(const NamedDecl *ND) {928  if (const auto *FD = dyn_cast<FunctionDecl>(ND))929    return FD->isExternC();930  return cast<VarDecl>(ND)->isExternC();931}932 933/// Determine whether ND is an external-linkage function or variable whose934/// type has no linkage.935bool Sema::isExternalWithNoLinkageType(const ValueDecl *VD) const {936  // Note: it's not quite enough to check whether VD has UniqueExternalLinkage,937  // because we also want to catch the case where its type has VisibleNoLinkage,938  // which does not affect the linkage of VD.939  return getLangOpts().CPlusPlus && VD->hasExternalFormalLinkage() &&940         !isExternalFormalLinkage(VD->getType()->getLinkage()) &&941         !isFunctionOrVarDeclExternC(VD);942}943 944/// Obtains a sorted list of functions and variables that are undefined but945/// ODR-used.946void Sema::getUndefinedButUsed(947    SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> > &Undefined) {948  for (const auto &UndefinedUse : UndefinedButUsed) {949    NamedDecl *ND = UndefinedUse.first;950 951    // Ignore attributes that have become invalid.952    if (ND->isInvalidDecl()) continue;953 954    // __attribute__((weakref)) is basically a definition.955    if (ND->hasAttr<WeakRefAttr>()) continue;956 957    if (isa<CXXDeductionGuideDecl>(ND))958      continue;959 960    if (ND->hasAttr<DLLImportAttr>() || ND->hasAttr<DLLExportAttr>()) {961      // An exported function will always be emitted when defined, so even if962      // the function is inline, it doesn't have to be emitted in this TU. An963      // imported function implies that it has been exported somewhere else.964      continue;965    }966 967    if (const auto *FD = dyn_cast<FunctionDecl>(ND)) {968      if (FD->isDefined())969        continue;970      if (FD->isExternallyVisible() &&971          !isExternalWithNoLinkageType(FD) &&972          !FD->getMostRecentDecl()->isInlined() &&973          !FD->hasAttr<ExcludeFromExplicitInstantiationAttr>())974        continue;975      if (FD->getBuiltinID())976        continue;977    } else {978      const auto *VD = cast<VarDecl>(ND);979      if (VD->hasDefinition() != VarDecl::DeclarationOnly)980        continue;981      if (VD->isExternallyVisible() &&982          !isExternalWithNoLinkageType(VD) &&983          !VD->getMostRecentDecl()->isInline() &&984          !VD->hasAttr<ExcludeFromExplicitInstantiationAttr>())985        continue;986 987      // Skip VarDecls that lack formal definitions but which we know are in988      // fact defined somewhere.989      if (VD->isKnownToBeDefined())990        continue;991    }992 993    Undefined.push_back(std::make_pair(ND, UndefinedUse.second));994  }995}996 997/// checkUndefinedButUsed - Check for undefined objects with internal linkage998/// or that are inline.999static void checkUndefinedButUsed(Sema &S) {1000  if (S.UndefinedButUsed.empty()) return;1001 1002  // Collect all the still-undefined entities with internal linkage.1003  SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined;1004  S.getUndefinedButUsed(Undefined);1005  S.UndefinedButUsed.clear();1006  if (Undefined.empty()) return;1007 1008  for (const auto &Undef : Undefined) {1009    ValueDecl *VD = cast<ValueDecl>(Undef.first);1010    SourceLocation UseLoc = Undef.second;1011 1012    if (S.isExternalWithNoLinkageType(VD)) {1013      // C++ [basic.link]p8:1014      //   A type without linkage shall not be used as the type of a variable1015      //   or function with external linkage unless1016      //    -- the entity has C language linkage1017      //    -- the entity is not odr-used or is defined in the same TU1018      //1019      // As an extension, accept this in cases where the type is externally1020      // visible, since the function or variable actually can be defined in1021      // another translation unit in that case.1022      S.Diag(VD->getLocation(), isExternallyVisible(VD->getType()->getLinkage())1023                                    ? diag::ext_undefined_internal_type1024                                    : diag::err_undefined_internal_type)1025        << isa<VarDecl>(VD) << VD;1026    } else if (!VD->isExternallyVisible()) {1027      // FIXME: We can promote this to an error. The function or variable can't1028      // be defined anywhere else, so the program must necessarily violate the1029      // one definition rule.1030      bool IsImplicitBase = false;1031      if (const auto *BaseD = dyn_cast<FunctionDecl>(VD)) {1032        auto *DVAttr = BaseD->getAttr<OMPDeclareVariantAttr>();1033        if (DVAttr && !DVAttr->getTraitInfo().isExtensionActive(1034                          llvm::omp::TraitProperty::1035                              implementation_extension_disable_implicit_base)) {1036          const auto *Func = cast<FunctionDecl>(1037              cast<DeclRefExpr>(DVAttr->getVariantFuncRef())->getDecl());1038          IsImplicitBase = BaseD->isImplicit() &&1039                           Func->getIdentifier()->isMangledOpenMPVariantName();1040        }1041      }1042      if (!S.getLangOpts().OpenMP || !IsImplicitBase)1043        S.Diag(VD->getLocation(), diag::warn_undefined_internal)1044            << isa<VarDecl>(VD) << VD;1045    } else if (auto *FD = dyn_cast<FunctionDecl>(VD)) {1046      (void)FD;1047      assert(FD->getMostRecentDecl()->isInlined() &&1048             "used object requires definition but isn't inline or internal?");1049      // FIXME: This is ill-formed; we should reject.1050      S.Diag(VD->getLocation(), diag::warn_undefined_inline) << VD;1051    } else {1052      assert(cast<VarDecl>(VD)->getMostRecentDecl()->isInline() &&1053             "used var requires definition but isn't inline or internal?");1054      S.Diag(VD->getLocation(), diag::err_undefined_inline_var) << VD;1055    }1056    if (UseLoc.isValid())1057      S.Diag(UseLoc, diag::note_used_here);1058  }1059}1060 1061void Sema::LoadExternalWeakUndeclaredIdentifiers() {1062  if (!ExternalSource)1063    return;1064 1065  SmallVector<std::pair<IdentifierInfo *, WeakInfo>, 4> WeakIDs;1066  ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs);1067  for (auto &WeakID : WeakIDs)1068    (void)WeakUndeclaredIdentifiers[WeakID.first].insert(WeakID.second);1069}1070 1071 1072typedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap;1073 1074/// Returns true, if all methods and nested classes of the given1075/// CXXRecordDecl are defined in this translation unit.1076///1077/// Should only be called from ActOnEndOfTranslationUnit so that all1078/// definitions are actually read.1079static bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD,1080                                            RecordCompleteMap &MNCComplete) {1081  RecordCompleteMap::iterator Cache = MNCComplete.find(RD);1082  if (Cache != MNCComplete.end())1083    return Cache->second;1084  if (!RD->isCompleteDefinition())1085    return false;1086  bool Complete = true;1087  for (DeclContext::decl_iterator I = RD->decls_begin(),1088                                  E = RD->decls_end();1089       I != E && Complete; ++I) {1090    if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I))1091      Complete = M->isDefined() || M->isDefaulted() ||1092                 (M->isPureVirtual() && !isa<CXXDestructorDecl>(M));1093    else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I))1094      // If the template function is marked as late template parsed at this1095      // point, it has not been instantiated and therefore we have not1096      // performed semantic analysis on it yet, so we cannot know if the type1097      // can be considered complete.1098      Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&1099                  F->getTemplatedDecl()->isDefined();1100    else if (const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {1101      if (R->isInjectedClassName())1102        continue;1103      if (R->hasDefinition())1104        Complete = MethodsAndNestedClassesComplete(R->getDefinition(),1105                                                   MNCComplete);1106      else1107        Complete = false;1108    }1109  }1110  MNCComplete[RD] = Complete;1111  return Complete;1112}1113 1114/// Returns true, if the given CXXRecordDecl is fully defined in this1115/// translation unit, i.e. all methods are defined or pure virtual and all1116/// friends, friend functions and nested classes are fully defined in this1117/// translation unit.1118///1119/// Should only be called from ActOnEndOfTranslationUnit so that all1120/// definitions are actually read.1121static bool IsRecordFullyDefined(const CXXRecordDecl *RD,1122                                 RecordCompleteMap &RecordsComplete,1123                                 RecordCompleteMap &MNCComplete) {1124  RecordCompleteMap::iterator Cache = RecordsComplete.find(RD);1125  if (Cache != RecordsComplete.end())1126    return Cache->second;1127  bool Complete = MethodsAndNestedClassesComplete(RD, MNCComplete);1128  for (CXXRecordDecl::friend_iterator I = RD->friend_begin(),1129                                      E = RD->friend_end();1130       I != E && Complete; ++I) {1131    // Check if friend classes and methods are complete.1132    if (TypeSourceInfo *TSI = (*I)->getFriendType()) {1133      // Friend classes are available as the TypeSourceInfo of the FriendDecl.1134      if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())1135        Complete = MethodsAndNestedClassesComplete(FriendD, MNCComplete);1136      else1137        Complete = false;1138    } else {1139      // Friend functions are available through the NamedDecl of FriendDecl.1140      if (const FunctionDecl *FD =1141          dyn_cast<FunctionDecl>((*I)->getFriendDecl()))1142        Complete = FD->isDefined();1143      else1144        // This is a template friend, give up.1145        Complete = false;1146    }1147  }1148  RecordsComplete[RD] = Complete;1149  return Complete;1150}1151 1152void Sema::emitAndClearUnusedLocalTypedefWarnings() {1153  if (ExternalSource)1154    ExternalSource->ReadUnusedLocalTypedefNameCandidates(1155        UnusedLocalTypedefNameCandidates);1156  for (const TypedefNameDecl *TD : UnusedLocalTypedefNameCandidates) {1157    if (TD->isReferenced())1158      continue;1159    Diag(TD->getLocation(), diag::warn_unused_local_typedef)1160        << isa<TypeAliasDecl>(TD) << TD->getDeclName();1161  }1162  UnusedLocalTypedefNameCandidates.clear();1163}1164 1165void Sema::ActOnStartOfTranslationUnit() {1166  if (getLangOpts().CPlusPlusModules &&1167      getLangOpts().getCompilingModule() == LangOptions::CMK_HeaderUnit)1168    HandleStartOfHeaderUnit();1169}1170 1171void Sema::ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind) {1172  if (Kind == TUFragmentKind::Global) {1173    // Perform Pending Instantiations at the end of global module fragment so1174    // that the module ownership of TU-level decls won't get messed.1175    llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");1176    PerformPendingInstantiations();1177    return;1178  }1179 1180  // Transfer late parsed template instantiations over to the pending template1181  // instantiation list. During normal compilation, the late template parser1182  // will be installed and instantiating these templates will succeed.1183  //1184  // If we are building a TU prefix for serialization, it is also safe to1185  // transfer these over, even though they are not parsed. The end of the TU1186  // should be outside of any eager template instantiation scope, so when this1187  // AST is deserialized, these templates will not be parsed until the end of1188  // the combined TU.1189  PendingInstantiations.insert(PendingInstantiations.end(),1190                               LateParsedInstantiations.begin(),1191                               LateParsedInstantiations.end());1192  LateParsedInstantiations.clear();1193 1194  // If DefinedUsedVTables ends up marking any virtual member functions it1195  // might lead to more pending template instantiations, which we then need1196  // to instantiate.1197  DefineUsedVTables();1198 1199  // C++: Perform implicit template instantiations.1200  //1201  // FIXME: When we perform these implicit instantiations, we do not1202  // carefully keep track of the point of instantiation (C++ [temp.point]).1203  // This means that name lookup that occurs within the template1204  // instantiation will always happen at the end of the translation unit,1205  // so it will find some names that are not required to be found. This is1206  // valid, but we could do better by diagnosing if an instantiation uses a1207  // name that was not visible at its first point of instantiation.1208  if (ExternalSource) {1209    // Load pending instantiations from the external source.1210    SmallVector<PendingImplicitInstantiation, 4> Pending;1211    ExternalSource->ReadPendingInstantiations(Pending);1212    for (auto PII : Pending)1213      if (auto Func = dyn_cast<FunctionDecl>(PII.first))1214        Func->setInstantiationIsPending(true);1215    PendingInstantiations.insert(PendingInstantiations.begin(),1216                                 Pending.begin(), Pending.end());1217  }1218 1219  {1220    llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");1221    PerformPendingInstantiations();1222  }1223 1224  emitDeferredDiags();1225 1226  assert(LateParsedInstantiations.empty() &&1227         "end of TU template instantiation should not create more "1228         "late-parsed templates");1229}1230 1231void Sema::ActOnEndOfTranslationUnit() {1232  assert(DelayedDiagnostics.getCurrentPool() == nullptr1233         && "reached end of translation unit with a pool attached?");1234 1235  // If code completion is enabled, don't perform any end-of-translation-unit1236  // work.1237  if (PP.isCodeCompletionEnabled())1238    return;1239 1240  // Complete translation units and modules define vtables and perform implicit1241  // instantiations. PCH files do not.1242  if (TUKind != TU_Prefix) {1243    ObjC().DiagnoseUseOfUnimplementedSelectors();1244 1245    ActOnEndOfTranslationUnitFragment(1246        !ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==1247                                     Module::PrivateModuleFragment1248            ? TUFragmentKind::Private1249            : TUFragmentKind::Normal);1250 1251    CheckDelayedMemberExceptionSpecs();1252  } else {1253    // If we are building a TU prefix for serialization, it is safe to transfer1254    // these over, even though they are not parsed. The end of the TU should be1255    // outside of any eager template instantiation scope, so when this AST is1256    // deserialized, these templates will not be parsed until the end of the1257    // combined TU.1258    PendingInstantiations.insert(PendingInstantiations.end(),1259                                 LateParsedInstantiations.begin(),1260                                 LateParsedInstantiations.end());1261    LateParsedInstantiations.clear();1262 1263    if (LangOpts.PCHInstantiateTemplates) {1264      llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");1265      PerformPendingInstantiations();1266    }1267  }1268 1269  DiagnoseUnterminatedPragmaAlignPack();1270  DiagnoseUnterminatedPragmaAttribute();1271  OpenMP().DiagnoseUnterminatedOpenMPDeclareTarget();1272  DiagnosePrecisionLossInComplexDivision();1273 1274  // All delayed member exception specs should be checked or we end up accepting1275  // incompatible declarations.1276  assert(DelayedOverridingExceptionSpecChecks.empty());1277  assert(DelayedEquivalentExceptionSpecChecks.empty());1278 1279  // All dllexport classes should have been processed already.1280  assert(DelayedDllExportClasses.empty());1281  assert(DelayedDllExportMemberFunctions.empty());1282 1283  // Remove file scoped decls that turned out to be used.1284  UnusedFileScopedDecls.erase(1285      std::remove_if(UnusedFileScopedDecls.begin(nullptr, true),1286                     UnusedFileScopedDecls.end(),1287                     [this](const DeclaratorDecl *DD) {1288                       return ShouldRemoveFromUnused(this, DD);1289                     }),1290      UnusedFileScopedDecls.end());1291 1292  if (TUKind == TU_Prefix) {1293    // Translation unit prefixes don't need any of the checking below.1294    if (!PP.isIncrementalProcessingEnabled())1295      TUScope = nullptr;1296    return;1297  }1298 1299  // Check for #pragma weak identifiers that were never declared1300  LoadExternalWeakUndeclaredIdentifiers();1301  for (const auto &WeakIDs : WeakUndeclaredIdentifiers) {1302    if (WeakIDs.second.empty())1303      continue;1304 1305    Decl *PrevDecl = LookupSingleName(TUScope, WeakIDs.first, SourceLocation(),1306                                      LookupOrdinaryName);1307    if (PrevDecl != nullptr &&1308        !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))1309      for (const auto &WI : WeakIDs.second)1310        Diag(WI.getLocation(), diag::warn_attribute_wrong_decl_type)1311            << "'weak'" << /*isRegularKeyword=*/0 << ExpectedVariableOrFunction;1312    else1313      for (const auto &WI : WeakIDs.second)1314        Diag(WI.getLocation(), diag::warn_weak_identifier_undeclared)1315            << WeakIDs.first;1316  }1317 1318  if (LangOpts.CPlusPlus11 &&1319      !Diags.isIgnored(diag::warn_delegating_ctor_cycle, SourceLocation()))1320    CheckDelegatingCtorCycles();1321 1322  if (!Diags.hasErrorOccurred()) {1323    if (ExternalSource)1324      ExternalSource->ReadUndefinedButUsed(UndefinedButUsed);1325    checkUndefinedButUsed(*this);1326  }1327 1328  // A global-module-fragment is only permitted within a module unit.1329  if (!ModuleScopes.empty() && ModuleScopes.back().Module->Kind ==1330                                   Module::ExplicitGlobalModuleFragment) {1331    Diag(ModuleScopes.back().BeginLoc,1332         diag::err_module_declaration_missing_after_global_module_introducer);1333  } else if (getLangOpts().getCompilingModule() ==1334                 LangOptions::CMK_ModuleInterface &&1335             // We can't use ModuleScopes here since ModuleScopes is always1336             // empty if we're compiling the BMI.1337             !getASTContext().getCurrentNamedModule()) {1338    // If we are building a module interface unit, we should have seen the1339    // module declaration.1340    //1341    // FIXME: Make a better guess as to where to put the module declaration.1342    Diag(getSourceManager().getLocForStartOfFile(1343             getSourceManager().getMainFileID()),1344         diag::err_module_declaration_missing);1345  }1346 1347  // Now we can decide whether the modules we're building need an initializer.1348  if (Module *CurrentModule = getCurrentModule();1349      CurrentModule && CurrentModule->isInterfaceOrPartition()) {1350    auto DoesModNeedInit = [this](Module *M) {1351      if (!getASTContext().getModuleInitializers(M).empty())1352        return true;1353      for (auto [Exported, _] : M->Exports)1354        if (Exported->isNamedModuleInterfaceHasInit())1355          return true;1356      for (Module *I : M->Imports)1357        if (I->isNamedModuleInterfaceHasInit())1358          return true;1359 1360      return false;1361    };1362 1363    CurrentModule->NamedModuleHasInit =1364        DoesModNeedInit(CurrentModule) ||1365        llvm::any_of(CurrentModule->submodules(), DoesModNeedInit);1366  }1367 1368  if (TUKind == TU_ClangModule) {1369    // If we are building a module, resolve all of the exported declarations1370    // now.1371    if (Module *CurrentModule = PP.getCurrentModule()) {1372      ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();1373 1374      SmallVector<Module *, 2> Stack;1375      Stack.push_back(CurrentModule);1376      while (!Stack.empty()) {1377        Module *Mod = Stack.pop_back_val();1378 1379        // Resolve the exported declarations and conflicts.1380        // FIXME: Actually complain, once we figure out how to teach the1381        // diagnostic client to deal with complaints in the module map at this1382        // point.1383        ModMap.resolveExports(Mod, /*Complain=*/false);1384        ModMap.resolveUses(Mod, /*Complain=*/false);1385        ModMap.resolveConflicts(Mod, /*Complain=*/false);1386 1387        // Queue the submodules, so their exports will also be resolved.1388        auto SubmodulesRange = Mod->submodules();1389        Stack.append(SubmodulesRange.begin(), SubmodulesRange.end());1390      }1391    }1392 1393    // Warnings emitted in ActOnEndOfTranslationUnit() should be emitted for1394    // modules when they are built, not every time they are used.1395    emitAndClearUnusedLocalTypedefWarnings();1396  }1397 1398  // C++ standard modules. Diagnose cases where a function is declared inline1399  // in the module purview but has no definition before the end of the TU or1400  // the start of a Private Module Fragment (if one is present).1401  if (!PendingInlineFuncDecls.empty()) {1402    for (auto *D : PendingInlineFuncDecls) {1403      if (auto *FD = dyn_cast<FunctionDecl>(D)) {1404        bool DefInPMF = false;1405        if (auto *FDD = FD->getDefinition()) {1406          DefInPMF = FDD->getOwningModule()->isPrivateModule();1407          if (!DefInPMF)1408            continue;1409        }1410        Diag(FD->getLocation(), diag::err_export_inline_not_defined)1411            << DefInPMF;1412        // If we have a PMF it should be at the end of the ModuleScopes.1413        if (DefInPMF &&1414            ModuleScopes.back().Module->Kind == Module::PrivateModuleFragment) {1415          Diag(ModuleScopes.back().BeginLoc,1416               diag::note_private_module_fragment);1417        }1418      }1419    }1420    PendingInlineFuncDecls.clear();1421  }1422 1423  // C99 6.9.2p2:1424  //   A declaration of an identifier for an object that has file1425  //   scope without an initializer, and without a storage-class1426  //   specifier or with the storage-class specifier static,1427  //   constitutes a tentative definition. If a translation unit1428  //   contains one or more tentative definitions for an identifier,1429  //   and the translation unit contains no external definition for1430  //   that identifier, then the behavior is exactly as if the1431  //   translation unit contains a file scope declaration of that1432  //   identifier, with the composite type as of the end of the1433  //   translation unit, with an initializer equal to 0.1434  llvm::SmallPtrSet<VarDecl *, 32> Seen;1435  for (TentativeDefinitionsType::iterator1436           T = TentativeDefinitions.begin(ExternalSource.get()),1437           TEnd = TentativeDefinitions.end();1438       T != TEnd; ++T) {1439    VarDecl *VD = (*T)->getActingDefinition();1440 1441    // If the tentative definition was completed, getActingDefinition() returns1442    // null. If we've already seen this variable before, insert()'s second1443    // return value is false.1444    if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second)1445      continue;1446 1447    if (const IncompleteArrayType *ArrayT1448        = Context.getAsIncompleteArrayType(VD->getType())) {1449      // Set the length of the array to 1 (C99 6.9.2p5).1450      Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);1451      llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);1452      QualType T = Context.getConstantArrayType(1453          ArrayT->getElementType(), One, nullptr, ArraySizeModifier::Normal, 0);1454      VD->setType(T);1455    } else if (RequireCompleteType(VD->getLocation(), VD->getType(),1456                                   diag::err_tentative_def_incomplete_type))1457      VD->setInvalidDecl();1458 1459    // No initialization is performed for a tentative definition.1460    CheckCompleteVariableDeclaration(VD);1461 1462    // In C, if the definition is const-qualified and has no initializer, it1463    // is left uninitialized unless it has static or thread storage duration.1464    QualType Type = VD->getType();1465    if (!VD->isInvalidDecl() && !getLangOpts().CPlusPlus &&1466        Type.isConstQualified() && !VD->getAnyInitializer()) {1467      unsigned DiagID = diag::warn_default_init_const_unsafe;1468      if (VD->getStorageDuration() == SD_Static ||1469          VD->getStorageDuration() == SD_Thread)1470        DiagID = diag::warn_default_init_const;1471 1472      bool EmitCppCompat = !Diags.isIgnored(1473          diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,1474          VD->getLocation());1475 1476      Diag(VD->getLocation(), DiagID) << Type << EmitCppCompat;1477    }1478 1479    // Notify the consumer that we've completed a tentative definition.1480    if (!VD->isInvalidDecl())1481      Consumer.CompleteTentativeDefinition(VD);1482  }1483 1484  // In incremental mode, tentative definitions belong to the current1485  // partial translation unit (PTU). Once they have been completed and1486  // emitted to codegen, drop them to prevent re-emission in future PTUs.1487  if (PP.isIncrementalProcessingEnabled())1488    TentativeDefinitions.erase(TentativeDefinitions.begin(ExternalSource.get()),1489                               TentativeDefinitions.end());1490 1491  for (auto *D : ExternalDeclarations) {1492    if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed())1493      continue;1494 1495    Consumer.CompleteExternalDeclaration(D);1496  }1497 1498  if (LangOpts.HLSL)1499    HLSL().ActOnEndOfTranslationUnit(getASTContext().getTranslationUnitDecl());1500 1501  // If there were errors, disable 'unused' warnings since they will mostly be1502  // noise. Don't warn for a use from a module: either we should warn on all1503  // file-scope declarations in modules or not at all, but whether the1504  // declaration is used is immaterial.1505  if (!Diags.hasErrorOccurred() && TUKind != TU_ClangModule) {1506    // Output warning for unused file scoped decls.1507    for (UnusedFileScopedDeclsType::iterator1508             I = UnusedFileScopedDecls.begin(ExternalSource.get()),1509             E = UnusedFileScopedDecls.end();1510         I != E; ++I) {1511      if (ShouldRemoveFromUnused(this, *I))1512        continue;1513 1514      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {1515        const FunctionDecl *DiagD;1516        if (!FD->hasBody(DiagD))1517          DiagD = FD;1518        if (DiagD->isDeleted())1519          continue; // Deleted functions are supposed to be unused.1520        SourceRange DiagRange = DiagD->getLocation();1521        if (const ASTTemplateArgumentListInfo *ASTTAL =1522                DiagD->getTemplateSpecializationArgsAsWritten())1523          DiagRange.setEnd(ASTTAL->RAngleLoc);1524        if (DiagD->isReferenced()) {1525          if (isa<CXXMethodDecl>(DiagD))1526            Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)1527                << DiagD << DiagRange;1528          else {1529            if (FD->getStorageClass() == SC_Static &&1530                !FD->isInlineSpecified() &&1531                !SourceMgr.isInMainFile(1532                   SourceMgr.getExpansionLoc(FD->getLocation())))1533              Diag(DiagD->getLocation(),1534                   diag::warn_unneeded_static_internal_decl)1535                  << DiagD << DiagRange;1536            else1537              Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)1538                  << /*function=*/0 << DiagD << DiagRange;1539          }1540        } else if (!FD->isTargetMultiVersion() ||1541                   FD->isTargetMultiVersionDefault()) {1542          if (FD->getDescribedFunctionTemplate())1543            Diag(DiagD->getLocation(), diag::warn_unused_template)1544                << /*function=*/0 << DiagD << DiagRange;1545          else1546            Diag(DiagD->getLocation(), isa<CXXMethodDecl>(DiagD)1547                                           ? diag::warn_unused_member_function1548                                           : diag::warn_unused_function)1549                << DiagD << DiagRange;1550        }1551      } else {1552        const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();1553        if (!DiagD)1554          DiagD = cast<VarDecl>(*I);1555        SourceRange DiagRange = DiagD->getLocation();1556        if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(DiagD)) {1557          if (const ASTTemplateArgumentListInfo *ASTTAL =1558                  VTSD->getTemplateArgsAsWritten())1559            DiagRange.setEnd(ASTTAL->RAngleLoc);1560        }1561        if (DiagD->isReferenced()) {1562          Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)1563              << /*variable=*/1 << DiagD << DiagRange;1564        } else if (DiagD->getDescribedVarTemplate()) {1565          Diag(DiagD->getLocation(), diag::warn_unused_template)1566              << /*variable=*/1 << DiagD << DiagRange;1567        } else if (DiagD->getType().isConstQualified()) {1568          const SourceManager &SM = SourceMgr;1569          if (SM.getMainFileID() != SM.getFileID(DiagD->getLocation()) ||1570              !PP.getLangOpts().IsHeaderFile)1571            Diag(DiagD->getLocation(), diag::warn_unused_const_variable)1572                << DiagD << DiagRange;1573        } else {1574          Diag(DiagD->getLocation(), diag::warn_unused_variable)1575              << DiagD << DiagRange;1576        }1577      }1578    }1579 1580    emitAndClearUnusedLocalTypedefWarnings();1581  }1582 1583  if (!Diags.isIgnored(diag::warn_unused_private_field, SourceLocation())) {1584    // FIXME: Load additional unused private field candidates from the external1585    // source.1586    RecordCompleteMap RecordsComplete;1587    RecordCompleteMap MNCComplete;1588    for (const NamedDecl *D : UnusedPrivateFields) {1589      const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());1590      if (RD && !RD->isUnion() &&1591          IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) {1592        Diag(D->getLocation(), diag::warn_unused_private_field)1593              << D->getDeclName();1594      }1595    }1596  }1597 1598  if (!Diags.isIgnored(diag::warn_mismatched_delete_new, SourceLocation())) {1599    if (ExternalSource)1600      ExternalSource->ReadMismatchingDeleteExpressions(DeleteExprs);1601    for (const auto &DeletedFieldInfo : DeleteExprs) {1602      for (const auto &DeleteExprLoc : DeletedFieldInfo.second) {1603        AnalyzeDeleteExprMismatch(DeletedFieldInfo.first, DeleteExprLoc.first,1604                                  DeleteExprLoc.second);1605      }1606    }1607  }1608 1609  AnalysisWarnings.IssueWarnings(Context.getTranslationUnitDecl());1610 1611  if (Context.hasAnyFunctionEffects())1612    performFunctionEffectAnalysis(Context.getTranslationUnitDecl());1613 1614  // Check we've noticed that we're no longer parsing the initializer for every1615  // variable. If we miss cases, then at best we have a performance issue and1616  // at worst a rejects-valid bug.1617  assert(ParsingInitForAutoVars.empty() &&1618         "Didn't unmark var as having its initializer parsed");1619 1620  if (!PP.isIncrementalProcessingEnabled())1621    TUScope = nullptr;1622 1623  checkExposure(Context.getTranslationUnitDecl());1624}1625 1626 1627//===----------------------------------------------------------------------===//1628// Helper functions.1629//===----------------------------------------------------------------------===//1630 1631DeclContext *Sema::getFunctionLevelDeclContext(bool AllowLambda) const {1632  DeclContext *DC = CurContext;1633 1634  while (true) {1635    if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||1636        isa<RequiresExprBodyDecl>(DC)) {1637      DC = DC->getParent();1638    } else if (!AllowLambda && isa<CXXMethodDecl>(DC) &&1639               cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&1640               cast<CXXRecordDecl>(DC->getParent())->isLambda()) {1641      DC = DC->getParent()->getParent();1642    } else break;1643  }1644 1645  return DC;1646}1647 1648/// getCurFunctionDecl - If inside of a function body, this returns a pointer1649/// to the function decl for the function being parsed.  If we're currently1650/// in a 'block', this returns the containing context.1651FunctionDecl *Sema::getCurFunctionDecl(bool AllowLambda) const {1652  DeclContext *DC = getFunctionLevelDeclContext(AllowLambda);1653  return dyn_cast<FunctionDecl>(DC);1654}1655 1656ObjCMethodDecl *Sema::getCurMethodDecl() {1657  DeclContext *DC = getFunctionLevelDeclContext();1658  while (isa<RecordDecl>(DC))1659    DC = DC->getParent();1660  return dyn_cast<ObjCMethodDecl>(DC);1661}1662 1663NamedDecl *Sema::getCurFunctionOrMethodDecl() const {1664  DeclContext *DC = getFunctionLevelDeclContext();1665  if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))1666    return cast<NamedDecl>(DC);1667  return nullptr;1668}1669 1670LangAS Sema::getDefaultCXXMethodAddrSpace() const {1671  if (getLangOpts().OpenCL)1672    return getASTContext().getDefaultOpenCLPointeeAddrSpace();1673  return LangAS::Default;1674}1675 1676void Sema::EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB) {1677  // FIXME: It doesn't make sense to me that DiagID is an incoming argument here1678  // and yet we also use the current diag ID on the DiagnosticsEngine. This has1679  // been made more painfully obvious by the refactor that introduced this1680  // function, but it is possible that the incoming argument can be1681  // eliminated. If it truly cannot be (for example, there is some reentrancy1682  // issue I am not seeing yet), then there should at least be a clarifying1683  // comment somewhere.1684  Diagnostic DiagInfo(&Diags, DB);1685  if (SFINAETrap *Trap = getSFINAEContext()) {1686    sema::TemplateDeductionInfo *Info = Trap->getDeductionInfo();1687    switch (DiagnosticIDs::getDiagnosticSFINAEResponse(DiagInfo.getID())) {1688    case DiagnosticIDs::SFINAE_Report:1689      // We'll report the diagnostic below.1690      break;1691 1692    case DiagnosticIDs::SFINAE_SubstitutionFailure:1693      // Count this failure so that we know that template argument deduction1694      // has failed.1695      Trap->setErrorOccurred();1696 1697      // Make a copy of this suppressed diagnostic and store it with the1698      // template-deduction information.1699      if (Info && !Info->hasSFINAEDiagnostic())1700        Info->addSFINAEDiagnostic(1701            DiagInfo.getLocation(),1702            PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));1703 1704      Diags.setLastDiagnosticIgnored(true);1705      return;1706 1707    case DiagnosticIDs::SFINAE_AccessControl: {1708      // Per C++ Core Issue 1170, access control is part of SFINAE.1709      // Additionally, the WithAccessChecking flag can be used to temporarily1710      // make access control a part of SFINAE for the purposes of checking1711      // type traits.1712      if (!Trap->withAccessChecking() && !getLangOpts().CPlusPlus11)1713        break;1714 1715      SourceLocation Loc = DiagInfo.getLocation();1716 1717      // Suppress this diagnostic.1718      Trap->setErrorOccurred();1719 1720      // Make a copy of this suppressed diagnostic and store it with the1721      // template-deduction information.1722      if (Info && !Info->hasSFINAEDiagnostic())1723        Info->addSFINAEDiagnostic(1724            DiagInfo.getLocation(),1725            PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));1726 1727      Diags.setLastDiagnosticIgnored(true);1728 1729      // Now produce a C++98 compatibility warning.1730      Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);1731 1732      // The last diagnostic which Sema produced was ignored. Suppress any1733      // notes attached to it.1734      Diags.setLastDiagnosticIgnored(true);1735      return;1736    }1737 1738    case DiagnosticIDs::SFINAE_Suppress:1739      if (DiagnosticsEngine::Level Level = getDiagnostics().getDiagnosticLevel(1740              DiagInfo.getID(), DiagInfo.getLocation());1741          Level == DiagnosticsEngine::Ignored)1742        return;1743      // Make a copy of this suppressed diagnostic and store it with the1744      // template-deduction information;1745      if (Info) {1746        Info->addSuppressedDiagnostic(1747            DiagInfo.getLocation(),1748            PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));1749        if (!Diags.getDiagnosticIDs()->isNote(DiagID))1750          PrintContextStack([Info](SourceLocation Loc, PartialDiagnostic PD) {1751            Info->addSuppressedDiagnostic(Loc, std::move(PD));1752          });1753      }1754 1755      // Suppress this diagnostic.1756      Diags.setLastDiagnosticIgnored(true);1757      return;1758    }1759  }1760 1761  // Copy the diagnostic printing policy over the ASTContext printing policy.1762  // TODO: Stop doing that.  See: https://reviews.llvm.org/D45093#10902921763  Context.setPrintingPolicy(getPrintingPolicy());1764 1765  // Emit the diagnostic.1766  if (!Diags.EmitDiagnostic(DB))1767    return;1768 1769  // If this is not a note, and we're in a template instantiation1770  // that is different from the last template instantiation where1771  // we emitted an error, print a template instantiation1772  // backtrace.1773  if (!Diags.getDiagnosticIDs()->isNote(DiagID))1774    PrintContextStack();1775}1776 1777bool Sema::hasUncompilableErrorOccurred() const {1778  if (getDiagnostics().hasUncompilableErrorOccurred())1779    return true;1780  auto *FD = dyn_cast<FunctionDecl>(CurContext);1781  if (!FD)1782    return false;1783  auto Loc = DeviceDeferredDiags.find(FD);1784  if (Loc == DeviceDeferredDiags.end())1785    return false;1786  for (auto PDAt : Loc->second) {1787    if (Diags.getDiagnosticIDs()->isDefaultMappingAsError(1788            PDAt.second.getDiagID()))1789      return true;1790  }1791  return false;1792}1793 1794// Print notes showing how we can reach FD starting from an a priori1795// known-callable function.1796static void emitCallStackNotes(Sema &S, const FunctionDecl *FD) {1797  auto FnIt = S.CUDA().DeviceKnownEmittedFns.find(FD);1798  while (FnIt != S.CUDA().DeviceKnownEmittedFns.end()) {1799    // Respect error limit.1800    if (S.Diags.hasFatalErrorOccurred())1801      return;1802    DiagnosticBuilder Builder(1803        S.Diags.Report(FnIt->second.Loc, diag::note_called_by));1804    Builder << FnIt->second.FD;1805    FnIt = S.CUDA().DeviceKnownEmittedFns.find(FnIt->second.FD);1806  }1807}1808 1809namespace {1810 1811/// Helper class that emits deferred diagnostic messages if an entity directly1812/// or indirectly using the function that causes the deferred diagnostic1813/// messages is known to be emitted.1814///1815/// During parsing of AST, certain diagnostic messages are recorded as deferred1816/// diagnostics since it is unknown whether the functions containing such1817/// diagnostics will be emitted. A list of potentially emitted functions and1818/// variables that may potentially trigger emission of functions are also1819/// recorded. DeferredDiagnosticsEmitter recursively visits used functions1820/// by each function to emit deferred diagnostics.1821///1822/// During the visit, certain OpenMP directives or initializer of variables1823/// with certain OpenMP attributes will cause subsequent visiting of any1824/// functions enter a state which is called OpenMP device context in this1825/// implementation. The state is exited when the directive or initializer is1826/// exited. This state can change the emission states of subsequent uses1827/// of functions.1828///1829/// Conceptually the functions or variables to be visited form a use graph1830/// where the parent node uses the child node. At any point of the visit,1831/// the tree nodes traversed from the tree root to the current node form a use1832/// stack. The emission state of the current node depends on two factors:1833///    1. the emission state of the root node1834///    2. whether the current node is in OpenMP device context1835/// If the function is decided to be emitted, its contained deferred diagnostics1836/// are emitted, together with the information about the use stack.1837///1838class DeferredDiagnosticsEmitter1839    : public UsedDeclVisitor<DeferredDiagnosticsEmitter> {1840public:1841  typedef UsedDeclVisitor<DeferredDiagnosticsEmitter> Inherited;1842 1843  // Whether the function is already in the current use-path.1844  llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> InUsePath;1845 1846  // The current use-path.1847  llvm::SmallVector<CanonicalDeclPtr<FunctionDecl>, 4> UsePath;1848 1849  // Whether the visiting of the function has been done. Done[0] is for the1850  // case not in OpenMP device context. Done[1] is for the case in OpenMP1851  // device context. We need two sets because diagnostics emission may be1852  // different depending on whether it is in OpenMP device context.1853  llvm::SmallPtrSet<CanonicalDeclPtr<Decl>, 4> DoneMap[2];1854 1855  // Emission state of the root node of the current use graph.1856  bool ShouldEmitRootNode;1857 1858  // Current OpenMP device context level. It is initialized to 0 and each1859  // entering of device context increases it by 1 and each exit decreases1860  // it by 1. Non-zero value indicates it is currently in device context.1861  unsigned InOMPDeviceContext;1862 1863  DeferredDiagnosticsEmitter(Sema &S)1864      : Inherited(S), ShouldEmitRootNode(false), InOMPDeviceContext(0) {}1865 1866  bool shouldVisitDiscardedStmt() const { return false; }1867 1868  void VisitOMPTargetDirective(OMPTargetDirective *Node) {1869    ++InOMPDeviceContext;1870    Inherited::VisitOMPTargetDirective(Node);1871    --InOMPDeviceContext;1872  }1873 1874  void visitUsedDecl(SourceLocation Loc, Decl *D) {1875    if (isa<VarDecl>(D))1876      return;1877    if (auto *FD = dyn_cast<FunctionDecl>(D))1878      checkFunc(Loc, FD);1879    else1880      Inherited::visitUsedDecl(Loc, D);1881  }1882 1883  // Visitor member and parent dtors called by this dtor.1884  void VisitCalledDestructors(CXXDestructorDecl *DD) {1885    const CXXRecordDecl *RD = DD->getParent();1886 1887    // Visit the dtors of all members1888    for (const FieldDecl *FD : RD->fields()) {1889      QualType FT = FD->getType();1890      if (const auto *ClassDecl = FT->getAsCXXRecordDecl();1891          ClassDecl &&1892          (ClassDecl->isBeingDefined() || ClassDecl->isCompleteDefinition()))1893        if (CXXDestructorDecl *MemberDtor = ClassDecl->getDestructor())1894          asImpl().visitUsedDecl(MemberDtor->getLocation(), MemberDtor);1895    }1896 1897    // Also visit base class dtors1898    for (const auto &Base : RD->bases()) {1899      QualType BaseType = Base.getType();1900      if (const auto *BaseDecl = BaseType->getAsCXXRecordDecl();1901          BaseDecl &&1902          (BaseDecl->isBeingDefined() || BaseDecl->isCompleteDefinition()))1903        if (CXXDestructorDecl *BaseDtor = BaseDecl->getDestructor())1904          asImpl().visitUsedDecl(BaseDtor->getLocation(), BaseDtor);1905    }1906  }1907 1908  void VisitDeclStmt(DeclStmt *DS) {1909    // Visit dtors called by variables that need destruction1910    for (auto *D : DS->decls())1911      if (auto *VD = dyn_cast<VarDecl>(D))1912        if (VD->isThisDeclarationADefinition() &&1913            VD->needsDestruction(S.Context)) {1914          QualType VT = VD->getType();1915          if (const auto *ClassDecl = VT->getAsCXXRecordDecl();1916              ClassDecl && (ClassDecl->isBeingDefined() ||1917                            ClassDecl->isCompleteDefinition()))1918            if (CXXDestructorDecl *Dtor = ClassDecl->getDestructor())1919              asImpl().visitUsedDecl(Dtor->getLocation(), Dtor);1920        }1921 1922    Inherited::VisitDeclStmt(DS);1923  }1924  void checkVar(VarDecl *VD) {1925    assert(VD->isFileVarDecl() &&1926           "Should only check file-scope variables");1927    if (auto *Init = VD->getInit()) {1928      auto DevTy = OMPDeclareTargetDeclAttr::getDeviceType(VD);1929      bool IsDev = DevTy && (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost ||1930                             *DevTy == OMPDeclareTargetDeclAttr::DT_Any);1931      if (IsDev)1932        ++InOMPDeviceContext;1933      this->Visit(Init);1934      if (IsDev)1935        --InOMPDeviceContext;1936    }1937  }1938 1939  void checkFunc(SourceLocation Loc, FunctionDecl *FD) {1940    auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];1941    FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();1942    if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||1943        S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))1944      return;1945    // Finalize analysis of OpenMP-specific constructs.1946    if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 &&1947        (ShouldEmitRootNode || InOMPDeviceContext))1948      S.OpenMP().finalizeOpenMPDelayedAnalysis(Caller, FD, Loc);1949    if (Caller)1950      S.CUDA().DeviceKnownEmittedFns[FD] = {Caller, Loc};1951    // Always emit deferred diagnostics for the direct users. This does not1952    // lead to explosion of diagnostics since each user is visited at most1953    // twice.1954    if (ShouldEmitRootNode || InOMPDeviceContext)1955      emitDeferredDiags(FD, Caller);1956    // Do not revisit a function if the function body has been completely1957    // visited before.1958    if (!Done.insert(FD).second)1959      return;1960    InUsePath.insert(FD);1961    UsePath.push_back(FD);1962    if (auto *S = FD->getBody()) {1963      this->Visit(S);1964    }1965    if (CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(FD))1966      asImpl().VisitCalledDestructors(Dtor);1967    UsePath.pop_back();1968    InUsePath.erase(FD);1969  }1970 1971  void checkRecordedDecl(Decl *D) {1972    if (auto *FD = dyn_cast<FunctionDecl>(D)) {1973      ShouldEmitRootNode = S.getEmissionStatus(FD, /*Final=*/true) ==1974                           Sema::FunctionEmissionStatus::Emitted;1975      checkFunc(SourceLocation(), FD);1976    } else1977      checkVar(cast<VarDecl>(D));1978  }1979 1980  // Emit any deferred diagnostics for FD1981  void emitDeferredDiags(FunctionDecl *FD, bool ShowCallStack) {1982    auto It = S.DeviceDeferredDiags.find(FD);1983    if (It == S.DeviceDeferredDiags.end())1984      return;1985    bool HasWarningOrError = false;1986    bool FirstDiag = true;1987    for (PartialDiagnosticAt &PDAt : It->second) {1988      // Respect error limit.1989      if (S.Diags.hasFatalErrorOccurred())1990        return;1991      const SourceLocation &Loc = PDAt.first;1992      const PartialDiagnostic &PD = PDAt.second;1993      HasWarningOrError |=1994          S.getDiagnostics().getDiagnosticLevel(PD.getDiagID(), Loc) >=1995          DiagnosticsEngine::Warning;1996      {1997        DiagnosticBuilder Builder(S.Diags.Report(Loc, PD.getDiagID()));1998        PD.Emit(Builder);1999      }2000      // Emit the note on the first diagnostic in case too many diagnostics2001      // cause the note not emitted.2002      if (FirstDiag && HasWarningOrError && ShowCallStack) {2003        emitCallStackNotes(S, FD);2004        FirstDiag = false;2005      }2006    }2007  }2008};2009} // namespace2010 2011void Sema::emitDeferredDiags() {2012  if (ExternalSource)2013    ExternalSource->ReadDeclsToCheckForDeferredDiags(2014        DeclsToCheckForDeferredDiags);2015 2016  if ((DeviceDeferredDiags.empty() && !LangOpts.OpenMP) ||2017      DeclsToCheckForDeferredDiags.empty())2018    return;2019 2020  DeferredDiagnosticsEmitter DDE(*this);2021  for (auto *D : DeclsToCheckForDeferredDiags)2022    DDE.checkRecordedDecl(D);2023}2024 2025// In CUDA, there are some constructs which may appear in semantically-valid2026// code, but trigger errors if we ever generate code for the function in which2027// they appear.  Essentially every construct you're not allowed to use on the2028// device falls into this category, because you are allowed to use these2029// constructs in a __host__ __device__ function, but only if that function is2030// never codegen'ed on the device.2031//2032// To handle semantic checking for these constructs, we keep track of the set of2033// functions we know will be emitted, either because we could tell a priori that2034// they would be emitted, or because they were transitively called by a2035// known-emitted function.2036//2037// We also keep a partial call graph of which not-known-emitted functions call2038// which other not-known-emitted functions.2039//2040// When we see something which is illegal if the current function is emitted2041// (usually by way of DiagIfDeviceCode, DiagIfHostCode, or2042// CheckCall), we first check if the current function is known-emitted.  If2043// so, we immediately output the diagnostic.2044//2045// Otherwise, we "defer" the diagnostic.  It sits in Sema::DeviceDeferredDiags2046// until we discover that the function is known-emitted, at which point we take2047// it out of this map and emit the diagnostic.2048 2049Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(Kind K, SourceLocation Loc,2050                                                   unsigned DiagID,2051                                                   const FunctionDecl *Fn,2052                                                   Sema &S)2053    : S(S), Loc(Loc), DiagID(DiagID), Fn(Fn),2054      ShowCallStack(K == K_ImmediateWithCallStack || K == K_Deferred) {2055  switch (K) {2056  case K_Nop:2057    break;2058  case K_Immediate:2059  case K_ImmediateWithCallStack:2060    ImmediateDiag.emplace(2061        ImmediateDiagBuilder(S.Diags.Report(Loc, DiagID), S, DiagID));2062    break;2063  case K_Deferred:2064    assert(Fn && "Must have a function to attach the deferred diag to.");2065    auto &Diags = S.DeviceDeferredDiags[Fn];2066    PartialDiagId.emplace(Diags.size());2067    Diags.emplace_back(Loc, S.PDiag(DiagID));2068    break;2069  }2070}2071 2072Sema::SemaDiagnosticBuilder::SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D)2073    : S(D.S), Loc(D.Loc), DiagID(D.DiagID), Fn(D.Fn),2074      ShowCallStack(D.ShowCallStack), ImmediateDiag(D.ImmediateDiag),2075      PartialDiagId(D.PartialDiagId) {2076  // Clean the previous diagnostics.2077  D.ShowCallStack = false;2078  D.ImmediateDiag.reset();2079  D.PartialDiagId.reset();2080}2081 2082Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {2083  if (ImmediateDiag) {2084    // Emit our diagnostic and, if it was a warning or error, output a callstack2085    // if Fn isn't a priori known-emitted.2086    ImmediateDiag.reset(); // Emit the immediate diag.2087 2088    if (ShowCallStack) {2089      bool IsWarningOrError = S.getDiagnostics().getDiagnosticLevel(2090                                  DiagID, Loc) >= DiagnosticsEngine::Warning;2091      if (IsWarningOrError)2092        emitCallStackNotes(S, Fn);2093    }2094  } else {2095    assert((!PartialDiagId || ShowCallStack) &&2096           "Must always show call stack for deferred diags.");2097  }2098}2099 2100Sema::SemaDiagnosticBuilder2101Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) {2102  FD = FD ? FD : getCurFunctionDecl();2103  if (LangOpts.OpenMP)2104    return LangOpts.OpenMPIsTargetDevice2105               ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD)2106               : OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD);2107  if (getLangOpts().CUDA)2108    return getLangOpts().CUDAIsDevice ? CUDA().DiagIfDeviceCode(Loc, DiagID)2109                                      : CUDA().DiagIfHostCode(Loc, DiagID);2110 2111  if (getLangOpts().SYCLIsDevice)2112    return SYCL().DiagIfDeviceCode(Loc, DiagID);2113 2114  return SemaDiagnosticBuilder(SemaDiagnosticBuilder::K_Immediate, Loc, DiagID,2115                               FD, *this);2116}2117 2118void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {2119  if (isUnevaluatedContext() || Ty.isNull())2120    return;2121 2122  // The original idea behind checkTypeSupport function is that unused2123  // declarations can be replaced with an array of bytes of the same size during2124  // codegen, such replacement doesn't seem to be possible for types without2125  // constant byte size like zero length arrays. So, do a deep check for SYCL.2126  if (D && LangOpts.SYCLIsDevice) {2127    llvm::DenseSet<QualType> Visited;2128    SYCL().deepTypeCheckForDevice(Loc, Visited, D);2129  }2130 2131  Decl *C = cast<Decl>(getCurLexicalContext());2132 2133  // Memcpy operations for structs containing a member with unsupported type2134  // are ok, though.2135  if (const auto *MD = dyn_cast<CXXMethodDecl>(C)) {2136    if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&2137        MD->isTrivial())2138      return;2139 2140    if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD))2141      if (Ctor->isCopyOrMoveConstructor() && Ctor->isTrivial())2142        return;2143  }2144 2145  // Try to associate errors with the lexical context, if that is a function, or2146  // the value declaration otherwise.2147  const FunctionDecl *FD = isa<FunctionDecl>(C)2148                               ? cast<FunctionDecl>(C)2149                               : dyn_cast_or_null<FunctionDecl>(D);2150 2151  auto CheckDeviceType = [&](QualType Ty) {2152    if (Ty->isDependentType())2153      return;2154 2155    if (Ty->isBitIntType()) {2156      if (!Context.getTargetInfo().hasBitIntType()) {2157        PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);2158        if (D)2159          PD << D;2160        else2161          PD << "expression";2162        targetDiag(Loc, PD, FD)2163            << false /*show bit size*/ << 0 /*bitsize*/ << false /*return*/2164            << Ty << Context.getTargetInfo().getTriple().str();2165      }2166      return;2167    }2168 2169    // Check if we are dealing with two 'long double' but with different2170    // semantics.2171    bool LongDoubleMismatched = false;2172    if (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128) {2173      const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(Ty);2174      if ((&Sem != &llvm::APFloat::PPCDoubleDouble() &&2175           !Context.getTargetInfo().hasFloat128Type()) ||2176          (&Sem == &llvm::APFloat::PPCDoubleDouble() &&2177           !Context.getTargetInfo().hasIbm128Type()))2178        LongDoubleMismatched = true;2179    }2180 2181    if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) ||2182        (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) ||2183        (Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) ||2184        (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&2185         !Context.getTargetInfo().hasInt128Type()) ||2186        (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() &&2187         !LangOpts.CUDAIsDevice) ||2188        LongDoubleMismatched) {2189      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);2190      if (D)2191        PD << D;2192      else2193        PD << "expression";2194 2195      if (targetDiag(Loc, PD, FD)2196          << true /*show bit size*/2197          << static_cast<unsigned>(Context.getTypeSize(Ty)) << Ty2198          << false /*return*/ << Context.getTargetInfo().getTriple().str()) {2199        if (D)2200          D->setInvalidDecl();2201      }2202      if (D)2203        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;2204    }2205  };2206 2207  auto CheckType = [&](QualType Ty, bool IsRetTy = false) {2208    if (LangOpts.SYCLIsDevice ||2209        (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice) ||2210        LangOpts.CUDAIsDevice)2211      CheckDeviceType(Ty);2212 2213    QualType UnqualTy = Ty.getCanonicalType().getUnqualifiedType();2214    const TargetInfo &TI = Context.getTargetInfo();2215    if (!TI.hasLongDoubleType() && UnqualTy == Context.LongDoubleTy) {2216      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);2217      if (D)2218        PD << D;2219      else2220        PD << "expression";2221 2222      if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty2223                        << false /*return*/2224                        << TI.getTriple().str()) {2225        if (D)2226          D->setInvalidDecl();2227      }2228      if (D)2229        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;2230    }2231 2232    bool IsDouble = UnqualTy == Context.DoubleTy;2233    bool IsFloat = UnqualTy == Context.FloatTy;2234    if (IsRetTy && !TI.hasFPReturn() && (IsDouble || IsFloat)) {2235      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);2236      if (D)2237        PD << D;2238      else2239        PD << "expression";2240 2241      if (Diag(Loc, PD) << false /*show bit size*/ << 0 << Ty << true /*return*/2242                        << TI.getTriple().str()) {2243        if (D)2244          D->setInvalidDecl();2245      }2246      if (D)2247        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;2248    }2249 2250    if (TI.hasRISCVVTypes() && Ty->isRVVSizelessBuiltinType() && FD) {2251      llvm::StringMap<bool> CallerFeatureMap;2252      Context.getFunctionFeatureMap(CallerFeatureMap, FD);2253      RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);2254    }2255 2256    // Don't allow SVE types in functions without a SVE target.2257    if (Ty->isSVESizelessBuiltinType() && FD) {2258      llvm::StringMap<bool> CallerFeatureMap;2259      Context.getFunctionFeatureMap(CallerFeatureMap, FD);2260      ARM().checkSVETypeSupport(Ty, Loc, FD, CallerFeatureMap);2261    }2262 2263    if (auto *VT = Ty->getAs<VectorType>();2264        VT && FD &&2265        (VT->getVectorKind() == VectorKind::SveFixedLengthData ||2266         VT->getVectorKind() == VectorKind::SveFixedLengthPredicate) &&2267        (LangOpts.VScaleMin != LangOpts.VScaleStreamingMin ||2268         LangOpts.VScaleMax != LangOpts.VScaleStreamingMax)) {2269      if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true)) {2270        Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)2271            << Ty << /*Streaming*/ 0;2272      } else if (const auto *FTy = FD->getType()->getAs<FunctionProtoType>()) {2273        if (FTy->getAArch64SMEAttributes() &2274            FunctionType::SME_PStateSMCompatibleMask) {2275          Diag(Loc, diag::err_sve_fixed_vector_in_streaming_function)2276              << Ty << /*StreamingCompatible*/ 1;2277        }2278      }2279    }2280  };2281 2282  CheckType(Ty);2283  if (const auto *FPTy = dyn_cast<FunctionProtoType>(Ty)) {2284    for (const auto &ParamTy : FPTy->param_types())2285      CheckType(ParamTy);2286    CheckType(FPTy->getReturnType(), /*IsRetTy=*/true);2287  }2288  if (const auto *FNPTy = dyn_cast<FunctionNoProtoType>(Ty))2289    CheckType(FNPTy->getReturnType(), /*IsRetTy=*/true);2290}2291 2292bool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {2293  SourceLocation loc = locref;2294  if (!loc.isMacroID()) return false;2295 2296  // There's no good way right now to look at the intermediate2297  // expansions, so just jump to the expansion location.2298  loc = getSourceManager().getExpansionLoc(loc);2299 2300  // If that's written with the name, stop here.2301  SmallString<16> buffer;2302  if (getPreprocessor().getSpelling(loc, buffer) == name) {2303    locref = loc;2304    return true;2305  }2306  return false;2307}2308 2309Scope *Sema::getScopeForContext(DeclContext *Ctx) {2310 2311  if (!Ctx)2312    return nullptr;2313 2314  Ctx = Ctx->getPrimaryContext();2315  for (Scope *S = getCurScope(); S; S = S->getParent()) {2316    // Ignore scopes that cannot have declarations. This is important for2317    // out-of-line definitions of static class members.2318    if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))2319      if (DeclContext *Entity = S->getEntity())2320        if (Ctx == Entity->getPrimaryContext())2321          return S;2322  }2323 2324  return nullptr;2325}2326 2327/// Enter a new function scope2328void Sema::PushFunctionScope() {2329  if (FunctionScopes.empty() && CachedFunctionScope) {2330    // Use CachedFunctionScope to avoid allocating memory when possible.2331    CachedFunctionScope->Clear();2332    FunctionScopes.push_back(CachedFunctionScope.release());2333  } else {2334    FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics()));2335  }2336  if (LangOpts.OpenMP)2337    OpenMP().pushOpenMPFunctionRegion();2338}2339 2340void Sema::PushBlockScope(Scope *BlockScope, BlockDecl *Block) {2341  FunctionScopes.push_back(new BlockScopeInfo(getDiagnostics(),2342                                              BlockScope, Block));2343  CapturingFunctionScopes++;2344}2345 2346LambdaScopeInfo *Sema::PushLambdaScope() {2347  LambdaScopeInfo *const LSI = new LambdaScopeInfo(getDiagnostics());2348  FunctionScopes.push_back(LSI);2349  CapturingFunctionScopes++;2350  return LSI;2351}2352 2353void Sema::RecordParsingTemplateParameterDepth(unsigned Depth) {2354  if (LambdaScopeInfo *const LSI = getCurLambda()) {2355    LSI->AutoTemplateParameterDepth = Depth;2356    return;2357  }2358  llvm_unreachable(2359      "Remove assertion if intentionally called in a non-lambda context.");2360}2361 2362// Check that the type of the VarDecl has an accessible copy constructor and2363// resolve its destructor's exception specification.2364// This also performs initialization of block variables when they are moved2365// to the heap. It uses the same rules as applicable for implicit moves2366// according to the C++ standard in effect ([class.copy.elision]p3).2367static void checkEscapingByref(VarDecl *VD, Sema &S) {2368  QualType T = VD->getType();2369  EnterExpressionEvaluationContext scope(2370      S, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);2371  SourceLocation Loc = VD->getLocation();2372  Expr *VarRef =2373      new (S.Context) DeclRefExpr(S.Context, VD, false, T, VK_LValue, Loc);2374  ExprResult Result;2375  auto IE = InitializedEntity::InitializeBlock(Loc, T);2376  if (S.getLangOpts().CPlusPlus23) {2377    auto *E = ImplicitCastExpr::Create(S.Context, T, CK_NoOp, VarRef, nullptr,2378                                       VK_XValue, FPOptionsOverride());2379    Result = S.PerformCopyInitialization(IE, SourceLocation(), E);2380  } else {2381    Result = S.PerformMoveOrCopyInitialization(2382        IE, Sema::NamedReturnInfo{VD, Sema::NamedReturnInfo::MoveEligible},2383        VarRef);2384  }2385 2386  if (!Result.isInvalid()) {2387    Result = S.MaybeCreateExprWithCleanups(Result);2388    Expr *Init = Result.getAs<Expr>();2389    S.Context.setBlockVarCopyInit(VD, Init, S.canThrow(Init));2390  }2391 2392  // The destructor's exception specification is needed when IRGen generates2393  // block copy/destroy functions. Resolve it here.2394  if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())2395    if (CXXDestructorDecl *DD = RD->getDestructor()) {2396      auto *FPT = DD->getType()->castAs<FunctionProtoType>();2397      S.ResolveExceptionSpec(Loc, FPT);2398    }2399}2400 2401static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S) {2402  // Set the EscapingByref flag of __block variables captured by2403  // escaping blocks.2404  for (const BlockDecl *BD : FSI.Blocks) {2405    for (const BlockDecl::Capture &BC : BD->captures()) {2406      VarDecl *VD = BC.getVariable();2407      if (VD->hasAttr<BlocksAttr>()) {2408        // Nothing to do if this is a __block variable captured by a2409        // non-escaping block.2410        if (BD->doesNotEscape())2411          continue;2412        VD->setEscapingByref();2413      }2414      // Check whether the captured variable is or contains an object of2415      // non-trivial C union type.2416      QualType CapType = BC.getVariable()->getType();2417      if (CapType.hasNonTrivialToPrimitiveDestructCUnion() ||2418          CapType.hasNonTrivialToPrimitiveCopyCUnion())2419        S.checkNonTrivialCUnion(BC.getVariable()->getType(),2420                                BD->getCaretLocation(),2421                                NonTrivialCUnionContext::BlockCapture,2422                                Sema::NTCUK_Destruct | Sema::NTCUK_Copy);2423    }2424  }2425 2426  for (VarDecl *VD : FSI.ByrefBlockVars) {2427    // __block variables might require us to capture a copy-initializer.2428    if (!VD->isEscapingByref())2429      continue;2430    // It's currently invalid to ever have a __block variable with an2431    // array type; should we diagnose that here?2432    // Regardless, we don't want to ignore array nesting when2433    // constructing this copy.2434    if (VD->getType()->isStructureOrClassType())2435      checkEscapingByref(VD, S);2436  }2437}2438 2439Sema::PoppedFunctionScopePtr2440Sema::PopFunctionScopeInfo(const AnalysisBasedWarnings::Policy *WP,2441                           const Decl *D, QualType BlockType) {2442  assert(!FunctionScopes.empty() && "mismatched push/pop!");2443 2444  markEscapingByrefs(*FunctionScopes.back(), *this);2445 2446  PoppedFunctionScopePtr Scope(FunctionScopes.pop_back_val(),2447                               PoppedFunctionScopeDeleter(this));2448 2449  if (LangOpts.OpenMP)2450    OpenMP().popOpenMPFunctionRegion(Scope.get());2451 2452  // Issue any analysis-based warnings.2453  if (WP && D) {2454    inferNoReturnAttr(*this, D);2455    AnalysisWarnings.IssueWarnings(*WP, Scope.get(), D, BlockType);2456  } else2457    for (const auto &PUD : Scope->PossiblyUnreachableDiags)2458      Diag(PUD.Loc, PUD.PD);2459 2460  return Scope;2461}2462 2463void Sema::PoppedFunctionScopeDeleter::2464operator()(sema::FunctionScopeInfo *Scope) const {2465  if (!Scope->isPlainFunction())2466    Self->CapturingFunctionScopes--;2467  // Stash the function scope for later reuse if it's for a normal function.2468  if (Scope->isPlainFunction() && !Self->CachedFunctionScope)2469    Self->CachedFunctionScope.reset(Scope);2470  else2471    delete Scope;2472}2473 2474void Sema::PushCompoundScope(bool IsStmtExpr) {2475  getCurFunction()->CompoundScopes.push_back(2476      CompoundScopeInfo(IsStmtExpr, getCurFPFeatures()));2477}2478 2479void Sema::PopCompoundScope() {2480  FunctionScopeInfo *CurFunction = getCurFunction();2481  assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop");2482 2483  CurFunction->CompoundScopes.pop_back();2484}2485 2486bool Sema::hasAnyUnrecoverableErrorsInThisFunction() const {2487  return getCurFunction()->hasUnrecoverableErrorOccurred();2488}2489 2490void Sema::setFunctionHasBranchIntoScope() {2491  if (!FunctionScopes.empty())2492    FunctionScopes.back()->setHasBranchIntoScope();2493}2494 2495void Sema::setFunctionHasBranchProtectedScope() {2496  if (!FunctionScopes.empty())2497    FunctionScopes.back()->setHasBranchProtectedScope();2498}2499 2500void Sema::setFunctionHasIndirectGoto() {2501  if (!FunctionScopes.empty())2502    FunctionScopes.back()->setHasIndirectGoto();2503}2504 2505void Sema::setFunctionHasMustTail() {2506  if (!FunctionScopes.empty())2507    FunctionScopes.back()->setHasMustTail();2508}2509 2510BlockScopeInfo *Sema::getCurBlock() {2511  if (FunctionScopes.empty())2512    return nullptr;2513 2514  auto CurBSI = dyn_cast<BlockScopeInfo>(FunctionScopes.back());2515  if (CurBSI && CurBSI->TheDecl &&2516      !CurBSI->TheDecl->Encloses(CurContext)) {2517    // We have switched contexts due to template instantiation.2518    assert(!CodeSynthesisContexts.empty());2519    return nullptr;2520  }2521 2522  return CurBSI;2523}2524 2525FunctionScopeInfo *Sema::getEnclosingFunction() const {2526  if (FunctionScopes.empty())2527    return nullptr;2528 2529  for (int e = FunctionScopes.size() - 1; e >= 0; --e) {2530    if (isa<sema::BlockScopeInfo>(FunctionScopes[e]))2531      continue;2532    return FunctionScopes[e];2533  }2534  return nullptr;2535}2536 2537CapturingScopeInfo *Sema::getEnclosingLambdaOrBlock() const {2538  for (auto *Scope : llvm::reverse(FunctionScopes)) {2539    if (auto *CSI = dyn_cast<CapturingScopeInfo>(Scope)) {2540      auto *LSI = dyn_cast<LambdaScopeInfo>(CSI);2541      if (LSI && LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&2542          LSI->AfterParameterList) {2543        // We have switched contexts due to template instantiation.2544        // FIXME: We should swap out the FunctionScopes during code synthesis2545        // so that we don't need to check for this.2546        assert(!CodeSynthesisContexts.empty());2547        return nullptr;2548      }2549      return CSI;2550    }2551  }2552  return nullptr;2553}2554 2555LambdaScopeInfo *Sema::getCurLambda(bool IgnoreNonLambdaCapturingScope) {2556  if (FunctionScopes.empty())2557    return nullptr;2558 2559  auto I = FunctionScopes.rbegin();2560  if (IgnoreNonLambdaCapturingScope) {2561    auto E = FunctionScopes.rend();2562    while (I != E && isa<CapturingScopeInfo>(*I) && !isa<LambdaScopeInfo>(*I))2563      ++I;2564    if (I == E)2565      return nullptr;2566  }2567  auto *CurLSI = dyn_cast<LambdaScopeInfo>(*I);2568  if (CurLSI && CurLSI->Lambda && CurLSI->CallOperator &&2569      !CurLSI->Lambda->Encloses(CurContext) && CurLSI->AfterParameterList) {2570    // We have switched contexts due to template instantiation.2571    assert(!CodeSynthesisContexts.empty());2572    return nullptr;2573  }2574 2575  return CurLSI;2576}2577 2578// We have a generic lambda if we parsed auto parameters, or we have2579// an associated template parameter list.2580LambdaScopeInfo *Sema::getCurGenericLambda() {2581  if (LambdaScopeInfo *LSI =  getCurLambda()) {2582    return (LSI->TemplateParams.size() ||2583                    LSI->GLTemplateParameterList) ? LSI : nullptr;2584  }2585  return nullptr;2586}2587 2588 2589void Sema::ActOnComment(SourceRange Comment) {2590  if (!LangOpts.RetainCommentsFromSystemHeaders &&2591      SourceMgr.isInSystemHeader(Comment.getBegin()))2592    return;2593  RawComment RC(SourceMgr, Comment, LangOpts.CommentOpts, false);2594  if (RC.isAlmostTrailingComment() || RC.hasUnsupportedSplice(SourceMgr)) {2595    SourceRange MagicMarkerRange(Comment.getBegin(),2596                                 Comment.getBegin().getLocWithOffset(3));2597    StringRef MagicMarkerText;2598    switch (RC.getKind()) {2599    case RawComment::RCK_OrdinaryBCPL:2600      MagicMarkerText = "///<";2601      break;2602    case RawComment::RCK_OrdinaryC:2603      MagicMarkerText = "/**<";2604      break;2605    case RawComment::RCK_Invalid:2606      // FIXME: are there other scenarios that could produce an invalid2607      // raw comment here?2608      Diag(Comment.getBegin(), diag::warn_splice_in_doxygen_comment);2609      return;2610    default:2611      llvm_unreachable("if this is an almost Doxygen comment, "2612                       "it should be ordinary");2613    }2614    Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<2615      FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText);2616  }2617  Context.addComment(RC);2618}2619 2620// Pin this vtable to this file.2621ExternalSemaSource::~ExternalSemaSource() {}2622char ExternalSemaSource::ID;2623 2624void ExternalSemaSource::ReadMethodPool(Selector Sel) { }2625void ExternalSemaSource::updateOutOfDateSelector(Selector Sel) { }2626 2627void ExternalSemaSource::ReadKnownNamespaces(2628                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {2629}2630 2631void ExternalSemaSource::ReadUndefinedButUsed(2632    llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}2633 2634void ExternalSemaSource::ReadMismatchingDeleteExpressions(llvm::MapVector<2635    FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &) {}2636 2637bool Sema::tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,2638                         UnresolvedSetImpl &OverloadSet) {2639  ZeroArgCallReturnTy = QualType();2640  OverloadSet.clear();2641 2642  const OverloadExpr *Overloads = nullptr;2643  bool IsMemExpr = false;2644  if (E.getType() == Context.OverloadTy) {2645    OverloadExpr::FindResult FR = OverloadExpr::find(&E);2646 2647    // Ignore overloads that are pointer-to-member constants.2648    if (FR.HasFormOfMemberPointer)2649      return false;2650 2651    Overloads = FR.Expression;2652  } else if (E.getType() == Context.BoundMemberTy) {2653    Overloads = dyn_cast<UnresolvedMemberExpr>(E.IgnoreParens());2654    IsMemExpr = true;2655  }2656 2657  bool Ambiguous = false;2658  bool IsMV = false;2659 2660  if (Overloads) {2661    for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),2662         DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {2663      OverloadSet.addDecl(*it);2664 2665      // Check whether the function is a non-template, non-member which takes no2666      // arguments.2667      if (IsMemExpr)2668        continue;2669      if (const FunctionDecl *OverloadDecl2670            = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {2671        if (OverloadDecl->getMinRequiredArguments() == 0) {2672          if (!ZeroArgCallReturnTy.isNull() && !Ambiguous &&2673              (!IsMV || !(OverloadDecl->isCPUDispatchMultiVersion() ||2674                          OverloadDecl->isCPUSpecificMultiVersion()))) {2675            ZeroArgCallReturnTy = QualType();2676            Ambiguous = true;2677          } else {2678            ZeroArgCallReturnTy = OverloadDecl->getReturnType();2679            IsMV = OverloadDecl->isCPUDispatchMultiVersion() ||2680                   OverloadDecl->isCPUSpecificMultiVersion();2681          }2682        }2683      }2684    }2685 2686    // If it's not a member, use better machinery to try to resolve the call2687    if (!IsMemExpr)2688      return !ZeroArgCallReturnTy.isNull();2689  }2690 2691  // Attempt to call the member with no arguments - this will correctly handle2692  // member templates with defaults/deduction of template arguments, overloads2693  // with default arguments, etc.2694  if (IsMemExpr && !E.isTypeDependent()) {2695    Sema::TentativeAnalysisScope Trap(*this);2696    ExprResult R = BuildCallToMemberFunction(nullptr, &E, SourceLocation(), {},2697                                             SourceLocation());2698    if (R.isUsable()) {2699      ZeroArgCallReturnTy = R.get()->getType();2700      return true;2701    }2702    return false;2703  }2704 2705  if (const auto *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) {2706    if (const auto *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {2707      if (Fun->getMinRequiredArguments() == 0)2708        ZeroArgCallReturnTy = Fun->getReturnType();2709      return true;2710    }2711  }2712 2713  // We don't have an expression that's convenient to get a FunctionDecl from,2714  // but we can at least check if the type is "function of 0 arguments".2715  QualType ExprTy = E.getType();2716  const FunctionType *FunTy = nullptr;2717  QualType PointeeTy = ExprTy->getPointeeType();2718  if (!PointeeTy.isNull())2719    FunTy = PointeeTy->getAs<FunctionType>();2720  if (!FunTy)2721    FunTy = ExprTy->getAs<FunctionType>();2722 2723  if (const auto *FPT = dyn_cast_if_present<FunctionProtoType>(FunTy)) {2724    if (FPT->getNumParams() == 0)2725      ZeroArgCallReturnTy = FunTy->getReturnType();2726    return true;2727  }2728  return false;2729}2730 2731/// Give notes for a set of overloads.2732///2733/// A companion to tryExprAsCall. In cases when the name that the programmer2734/// wrote was an overloaded function, we may be able to make some guesses about2735/// plausible overloads based on their return types; such guesses can be handed2736/// off to this method to be emitted as notes.2737///2738/// \param Overloads - The overloads to note.2739/// \param FinalNoteLoc - If we've suppressed printing some overloads due to2740///  -fshow-overloads=best, this is the location to attach to the note about too2741///  many candidates. Typically this will be the location of the original2742///  ill-formed expression.2743static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads,2744                          const SourceLocation FinalNoteLoc) {2745  unsigned ShownOverloads = 0;2746  unsigned SuppressedOverloads = 0;2747  for (UnresolvedSetImpl::iterator It = Overloads.begin(),2748       DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {2749    if (ShownOverloads >= S.Diags.getNumOverloadCandidatesToShow()) {2750      ++SuppressedOverloads;2751      continue;2752    }2753 2754    const NamedDecl *Fn = (*It)->getUnderlyingDecl();2755    // Don't print overloads for non-default multiversioned functions.2756    if (const auto *FD = Fn->getAsFunction()) {2757      if (FD->isMultiVersion() && FD->hasAttr<TargetAttr>() &&2758          !FD->getAttr<TargetAttr>()->isDefaultVersion())2759        continue;2760      if (FD->isMultiVersion() && FD->hasAttr<TargetVersionAttr>() &&2761          !FD->getAttr<TargetVersionAttr>()->isDefaultVersion())2762        continue;2763    }2764    S.Diag(Fn->getLocation(), diag::note_possible_target_of_call);2765    ++ShownOverloads;2766  }2767 2768  S.Diags.overloadCandidatesShown(ShownOverloads);2769 2770  if (SuppressedOverloads)2771    S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)2772      << SuppressedOverloads;2773}2774 2775static void notePlausibleOverloads(Sema &S, SourceLocation Loc,2776                                   const UnresolvedSetImpl &Overloads,2777                                   bool (*IsPlausibleResult)(QualType)) {2778  if (!IsPlausibleResult)2779    return noteOverloads(S, Overloads, Loc);2780 2781  UnresolvedSet<2> PlausibleOverloads;2782  for (OverloadExpr::decls_iterator It = Overloads.begin(),2783         DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {2784    const auto *OverloadDecl = cast<FunctionDecl>(*It);2785    QualType OverloadResultTy = OverloadDecl->getReturnType();2786    if (IsPlausibleResult(OverloadResultTy))2787      PlausibleOverloads.addDecl(It.getDecl());2788  }2789  noteOverloads(S, PlausibleOverloads, Loc);2790}2791 2792/// Determine whether the given expression can be called by just2793/// putting parentheses after it.  Notably, expressions with unary2794/// operators can't be because the unary operator will start parsing2795/// outside the call.2796static bool IsCallableWithAppend(const Expr *E) {2797  E = E->IgnoreImplicit();2798  return (!isa<CStyleCastExpr>(E) &&2799          !isa<UnaryOperator>(E) &&2800          !isa<BinaryOperator>(E) &&2801          !isa<CXXOperatorCallExpr>(E));2802}2803 2804static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E) {2805  if (const auto *UO = dyn_cast<UnaryOperator>(E))2806    E = UO->getSubExpr();2807 2808  if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E)) {2809    if (ULE->getNumDecls() == 0)2810      return false;2811 2812    const NamedDecl *ND = *ULE->decls_begin();2813    if (const auto *FD = dyn_cast<FunctionDecl>(ND))2814      return FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion();2815  }2816  return false;2817}2818 2819bool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,2820                                bool ForceComplain,2821                                bool (*IsPlausibleResult)(QualType)) {2822  SourceLocation Loc = E.get()->getExprLoc();2823  SourceRange Range = E.get()->getSourceRange();2824  UnresolvedSet<4> Overloads;2825 2826  // If this is a SFINAE context, don't try anything that might trigger ADL2827  // prematurely.2828  if (!isSFINAEContext()) {2829    QualType ZeroArgCallTy;2830    if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&2831        !ZeroArgCallTy.isNull() &&2832        (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {2833      // At this point, we know E is potentially callable with 02834      // arguments and that it returns something of a reasonable type,2835      // so we can emit a fixit and carry on pretending that E was2836      // actually a CallExpr.2837      SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());2838      bool IsMV = IsCPUDispatchCPUSpecificMultiVersion(E.get());2839      Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range2840                    << (IsCallableWithAppend(E.get())2841                            ? FixItHint::CreateInsertion(ParenInsertionLoc,2842                                                         "()")2843                            : FixItHint());2844      if (!IsMV)2845        notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);2846 2847      // FIXME: Try this before emitting the fixit, and suppress diagnostics2848      // while doing so.2849      E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), {},2850                        Range.getEnd().getLocWithOffset(1));2851      return true;2852    }2853  }2854  if (!ForceComplain) return false;2855 2856  bool IsMV = IsCPUDispatchCPUSpecificMultiVersion(E.get());2857  Diag(Loc, PD) << /*not zero-arg*/ 0 << IsMV << Range;2858  if (!IsMV)2859    notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);2860  E = ExprError();2861  return true;2862}2863 2864IdentifierInfo *Sema::getSuperIdentifier() const {2865  if (!Ident_super)2866    Ident_super = &Context.Idents.get("super");2867  return Ident_super;2868}2869 2870void Sema::PushCapturedRegionScope(Scope *S, CapturedDecl *CD, RecordDecl *RD,2871                                   CapturedRegionKind K,2872                                   unsigned OpenMPCaptureLevel) {2873  auto *CSI = new CapturedRegionScopeInfo(2874      getDiagnostics(), S, CD, RD, CD->getContextParam(), K,2875      (getLangOpts().OpenMP && K == CR_OpenMP)2876          ? OpenMP().getOpenMPNestingLevel()2877          : 0,2878      OpenMPCaptureLevel);2879  CSI->ReturnType = Context.VoidTy;2880  FunctionScopes.push_back(CSI);2881  CapturingFunctionScopes++;2882}2883 2884CapturedRegionScopeInfo *Sema::getCurCapturedRegion() {2885  if (FunctionScopes.empty())2886    return nullptr;2887 2888  return dyn_cast<CapturedRegionScopeInfo>(FunctionScopes.back());2889}2890 2891const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &2892Sema::getMismatchingDeleteExpressions() const {2893  return DeleteExprs;2894}2895 2896Sema::FPFeaturesStateRAII::FPFeaturesStateRAII(Sema &S)2897    : S(S), OldFPFeaturesState(S.CurFPFeatures),2898      OldOverrides(S.FpPragmaStack.CurrentValue),2899      OldEvalMethod(S.PP.getCurrentFPEvalMethod()),2900      OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {}2901 2902Sema::FPFeaturesStateRAII::~FPFeaturesStateRAII() {2903  S.CurFPFeatures = OldFPFeaturesState;2904  S.FpPragmaStack.CurrentValue = OldOverrides;2905  S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod);2906}2907 2908bool Sema::isDeclaratorFunctionLike(Declarator &D) {2909  assert(D.getCXXScopeSpec().isSet() &&2910         "can only be called for qualified names");2911 2912  auto LR = LookupResult(*this, D.getIdentifier(), D.getBeginLoc(),2913                         LookupOrdinaryName, forRedeclarationInCurContext());2914  DeclContext *DC = computeDeclContext(D.getCXXScopeSpec(),2915                                       !D.getDeclSpec().isFriendSpecified());2916  if (!DC)2917    return false;2918 2919  LookupQualifiedName(LR, DC);2920  bool Result = llvm::all_of(LR, [](Decl *Dcl) {2921    if (NamedDecl *ND = dyn_cast<NamedDecl>(Dcl)) {2922      ND = ND->getUnderlyingDecl();2923      return isa<FunctionDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||2924             isa<UsingDecl>(ND);2925    }2926    return false;2927  });2928  return Result;2929}2930 2931Attr *Sema::CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,2932                                 MutableArrayRef<Expr *> Args) {2933 2934  auto *A = AnnotateAttr::Create(Context, Annot, Args.data(), Args.size(), CI);2935  if (!ConstantFoldAttrArgs(2936          CI, MutableArrayRef<Expr *>(A->args_begin(), A->args_end()))) {2937    return nullptr;2938  }2939  return A;2940}2941 2942Attr *Sema::CreateAnnotationAttr(const ParsedAttr &AL) {2943  // Make sure that there is a string literal as the annotation's first2944  // argument.2945  StringRef Str;2946  if (!checkStringLiteralArgumentAttr(AL, 0, Str))2947    return nullptr;2948 2949  llvm::SmallVector<Expr *, 4> Args;2950  Args.reserve(AL.getNumArgs() - 1);2951  for (unsigned Idx = 1; Idx < AL.getNumArgs(); Idx++) {2952    assert(!AL.isArgIdent(Idx));2953    Args.push_back(AL.getArgAsExpr(Idx));2954  }2955 2956  return CreateAnnotationAttr(AL, Str, Args);2957}2958