1//===--- Sema.h - Semantic Analysis & AST Building --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Sema class, which performs semantic analysis and
10// builds ASTs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_SEMA_H
15#define LLVM_CLANG_SEMA_SEMA_H
16
17#include "clang/APINotes/APINotesManager.h"
18#include "clang/AST/ASTConcept.h"
19#include "clang/AST/ASTFwd.h"
20#include "clang/AST/Attr.h"
21#include "clang/AST/Availability.h"
22#include "clang/AST/ComparisonCategories.h"
23#include "clang/AST/DeclTemplate.h"
24#include "clang/AST/DeclarationName.h"
25#include "clang/AST/Expr.h"
26#include "clang/AST/ExprCXX.h"
27#include "clang/AST/ExprConcepts.h"
28#include "clang/AST/ExprObjC.h"
29#include "clang/AST/ExprOpenMP.h"
30#include "clang/AST/ExternalASTSource.h"
31#include "clang/AST/LocInfoType.h"
32#include "clang/AST/MangleNumberingContext.h"
33#include "clang/AST/NSAPI.h"
34#include "clang/AST/PrettyPrinter.h"
35#include "clang/AST/StmtCXX.h"
36#include "clang/AST/StmtOpenMP.h"
37#include "clang/AST/TypeLoc.h"
38#include "clang/AST/TypeOrdering.h"
39#include "clang/Basic/BitmaskEnum.h"
40#include "clang/Basic/Builtins.h"
41#include "clang/Basic/DarwinSDKInfo.h"
42#include "clang/Basic/ExpressionTraits.h"
43#include "clang/Basic/Module.h"
44#include "clang/Basic/OpenCLOptions.h"
45#include "clang/Basic/OpenMPKinds.h"
46#include "clang/Basic/PragmaKinds.h"
47#include "clang/Basic/Specifiers.h"
48#include "clang/Basic/TemplateKinds.h"
49#include "clang/Basic/TypeTraits.h"
50#include "clang/Sema/AnalysisBasedWarnings.h"
51#include "clang/Sema/CleanupInfo.h"
52#include "clang/Sema/DeclSpec.h"
53#include "clang/Sema/ExternalSemaSource.h"
54#include "clang/Sema/IdentifierResolver.h"
55#include "clang/Sema/ObjCMethodList.h"
56#include "clang/Sema/Ownership.h"
57#include "clang/Sema/Scope.h"
58#include "clang/Sema/SemaConcept.h"
59#include "clang/Sema/TypoCorrection.h"
60#include "clang/Sema/Weak.h"
61#include "llvm/ADT/ArrayRef.h"
62#include "llvm/ADT/SetVector.h"
63#include "llvm/ADT/SmallBitVector.h"
64#include "llvm/ADT/SmallPtrSet.h"
65#include "llvm/ADT/SmallSet.h"
66#include "llvm/ADT/SmallVector.h"
67#include "llvm/ADT/TinyPtrVector.h"
68#include "llvm/Frontend/OpenMP/OMPConstants.h"
69#include <deque>
70#include <memory>
71#include <optional>
72#include <string>
73#include <tuple>
74#include <vector>
75
76namespace llvm {
77  class APSInt;
78  template <typename ValueT, typename ValueInfoT> class DenseSet;
79  class SmallBitVector;
80  struct InlineAsmIdentifierInfo;
81}
82
83namespace clang {
84  class ADLResult;
85  class ASTConsumer;
86  class ASTContext;
87  class ASTMutationListener;
88  class ASTReader;
89  class ASTWriter;
90  class ArrayType;
91  class ParsedAttr;
92  class BindingDecl;
93  class BlockDecl;
94  class CapturedDecl;
95  class CXXBasePath;
96  class CXXBasePaths;
97  class CXXBindTemporaryExpr;
98  typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath;
99  class CXXConstructorDecl;
100  class CXXConversionDecl;
101  class CXXDeleteExpr;
102  class CXXDestructorDecl;
103  class CXXFieldCollector;
104  class CXXMemberCallExpr;
105  class CXXMethodDecl;
106  class CXXScopeSpec;
107  class CXXTemporary;
108  class CXXTryStmt;
109  class CallExpr;
110  class ClassTemplateDecl;
111  class ClassTemplatePartialSpecializationDecl;
112  class ClassTemplateSpecializationDecl;
113  class VarTemplatePartialSpecializationDecl;
114  class CodeCompleteConsumer;
115  class CodeCompletionAllocator;
116  class CodeCompletionTUInfo;
117  class CodeCompletionResult;
118  class CoroutineBodyStmt;
119  class Decl;
120  class DeclAccessPair;
121  class DeclContext;
122  class DeclRefExpr;
123  class DeclaratorDecl;
124  class DeducedTemplateArgument;
125  class DependentDiagnostic;
126  class DesignatedInitExpr;
127  class Designation;
128  class EnableIfAttr;
129  class EnumConstantDecl;
130  class Expr;
131  class ExtVectorType;
132  class FormatAttr;
133  class FriendDecl;
134  class FunctionDecl;
135  class FunctionProtoType;
136  class FunctionTemplateDecl;
137  class ImplicitConversionSequence;
138  typedef MutableArrayRef<ImplicitConversionSequence> ConversionSequenceList;
139  class InitListExpr;
140  class InitializationKind;
141  class InitializationSequence;
142  class InitializedEntity;
143  class IntegerLiteral;
144  class LabelStmt;
145  class LambdaExpr;
146  class LangOptions;
147  class LocalInstantiationScope;
148  class LookupResult;
149  class MacroInfo;
150  typedef ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> ModuleIdPath;
151  class ModuleLoader;
152  class MultiLevelTemplateArgumentList;
153  class NamedDecl;
154  class ObjCCategoryDecl;
155  class ObjCCategoryImplDecl;
156  class ObjCCompatibleAliasDecl;
157  class ObjCContainerDecl;
158  class ObjCImplDecl;
159  class ObjCImplementationDecl;
160  class ObjCInterfaceDecl;
161  class ObjCIvarDecl;
162  template <class T> class ObjCList;
163  class ObjCMessageExpr;
164  class ObjCMethodDecl;
165  class ObjCPropertyDecl;
166  class ObjCProtocolDecl;
167  class OMPThreadPrivateDecl;
168  class OMPRequiresDecl;
169  class OMPDeclareReductionDecl;
170  class OMPDeclareSimdDecl;
171  class OMPClause;
172  struct OMPVarListLocTy;
173  struct OverloadCandidate;
174  enum class OverloadCandidateParamOrder : char;
175  enum OverloadCandidateRewriteKind : unsigned;
176  class OverloadCandidateSet;
177  class OverloadExpr;
178  class ParenListExpr;
179  class ParmVarDecl;
180  class Preprocessor;
181  class PseudoDestructorTypeStorage;
182  class PseudoObjectExpr;
183  class QualType;
184  class StandardConversionSequence;
185  class Stmt;
186  class StringLiteral;
187  class SwitchStmt;
188  class TemplateArgument;
189  class TemplateArgumentList;
190  class TemplateArgumentLoc;
191  class TemplateDecl;
192  class TemplateInstantiationCallback;
193  class TemplateParameterList;
194  class TemplatePartialOrderingContext;
195  class TemplateTemplateParmDecl;
196  class Token;
197  class TypeAliasDecl;
198  class TypedefDecl;
199  class TypedefNameDecl;
200  class TypeLoc;
201  class TypoCorrectionConsumer;
202  class UnqualifiedId;
203  class UnresolvedLookupExpr;
204  class UnresolvedMemberExpr;
205  class UnresolvedSetImpl;
206  class UnresolvedSetIterator;
207  class UsingDecl;
208  class UsingShadowDecl;
209  class ValueDecl;
210  class VarDecl;
211  class VarTemplateSpecializationDecl;
212  class VisibilityAttr;
213  class VisibleDeclConsumer;
214  class IndirectFieldDecl;
215  struct DeductionFailureInfo;
216  class TemplateSpecCandidateSet;
217
218namespace sema {
219  class AccessedEntity;
220  class BlockScopeInfo;
221  class Capture;
222  class CapturedRegionScopeInfo;
223  class CapturingScopeInfo;
224  class CompoundScopeInfo;
225  class DelayedDiagnostic;
226  class DelayedDiagnosticPool;
227  class FunctionScopeInfo;
228  class LambdaScopeInfo;
229  class PossiblyUnreachableDiag;
230  class RISCVIntrinsicManager;
231  class SemaPPCallbacks;
232  class TemplateDeductionInfo;
233}
234
235namespace threadSafety {
236  class BeforeSet;
237  void threadSafetyCleanup(BeforeSet* Cache);
238}
239
240// FIXME: No way to easily map from TemplateTypeParmTypes to
241// TemplateTypeParmDecls, so we have this horrible PointerUnion.
242typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *>,
243                  SourceLocation>
244    UnexpandedParameterPack;
245
246/// Describes whether we've seen any nullability information for the given
247/// file.
248struct FileNullability {
249  /// The first pointer declarator (of any pointer kind) in the file that does
250  /// not have a corresponding nullability annotation.
251  SourceLocation PointerLoc;
252
253  /// The end location for the first pointer declarator in the file. Used for
254  /// placing fix-its.
255  SourceLocation PointerEndLoc;
256
257  /// Which kind of pointer declarator we saw.
258  uint8_t PointerKind;
259
260  /// Whether we saw any type nullability annotations in the given file.
261  bool SawTypeNullability = false;
262};
263
264/// A mapping from file IDs to a record of whether we've seen nullability
265/// information in that file.
266class FileNullabilityMap {
267  /// A mapping from file IDs to the nullability information for each file ID.
268  llvm::DenseMap<FileID, FileNullability> Map;
269
270  /// A single-element cache based on the file ID.
271  struct {
272    FileID File;
273    FileNullability Nullability;
274  } Cache;
275
276public:
277  FileNullability &operator[](FileID file) {
278    // Check the single-element cache.
279    if (file == Cache.File)
280      return Cache.Nullability;
281
282    // It's not in the single-element cache; flush the cache if we have one.
283    if (!Cache.File.isInvalid()) {
284      Map[Cache.File] = Cache.Nullability;
285    }
286
287    // Pull this entry into the cache.
288    Cache.File = file;
289    Cache.Nullability = Map[file];
290    return Cache.Nullability;
291  }
292};
293
294/// Tracks expected type during expression parsing, for use in code completion.
295/// The type is tied to a particular token, all functions that update or consume
296/// the type take a start location of the token they are looking at as a
297/// parameter. This avoids updating the type on hot paths in the parser.
298class PreferredTypeBuilder {
299public:
300  PreferredTypeBuilder(bool Enabled) : Enabled(Enabled) {}
301
302  void enterCondition(Sema &S, SourceLocation Tok);
303  void enterReturn(Sema &S, SourceLocation Tok);
304  void enterVariableInit(SourceLocation Tok, Decl *D);
305  /// Handles e.g. BaseType{ .D = Tok...
306  void enterDesignatedInitializer(SourceLocation Tok, QualType BaseType,
307                                  const Designation &D);
308  /// Computing a type for the function argument may require running
309  /// overloading, so we postpone its computation until it is actually needed.
310  ///
311  /// Clients should be very careful when using this function, as it stores a
312  /// function_ref, clients should make sure all calls to get() with the same
313  /// location happen while function_ref is alive.
314  ///
315  /// The callback should also emit signature help as a side-effect, but only
316  /// if the completion point has been reached.
317  void enterFunctionArgument(SourceLocation Tok,
318                             llvm::function_ref<QualType()> ComputeType);
319
320  void enterParenExpr(SourceLocation Tok, SourceLocation LParLoc);
321  void enterUnary(Sema &S, SourceLocation Tok, tok::TokenKind OpKind,
322                  SourceLocation OpLoc);
323  void enterBinary(Sema &S, SourceLocation Tok, Expr *LHS, tok::TokenKind Op);
324  void enterMemAccess(Sema &S, SourceLocation Tok, Expr *Base);
325  void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
326  /// Handles all type casts, including C-style cast, C++ casts, etc.
327  void enterTypeCast(SourceLocation Tok, QualType CastType);
328
329  /// Get the expected type associated with this location, if any.
330  ///
331  /// If the location is a function argument, determining the expected type
332  /// involves considering all function overloads and the arguments so far.
333  /// In this case, signature help for these function overloads will be reported
334  /// as a side-effect (only if the completion point has been reached).
335  QualType get(SourceLocation Tok) const {
336    if (!Enabled || Tok != ExpectedLoc)
337      return QualType();
338    if (!Type.isNull())
339      return Type;
340    if (ComputeType)
341      return ComputeType();
342    return QualType();
343  }
344
345private:
346  bool Enabled;
347  /// Start position of a token for which we store expected type.
348  SourceLocation ExpectedLoc;
349  /// Expected type for a token starting at ExpectedLoc.
350  QualType Type;
351  /// A function to compute expected type at ExpectedLoc. It is only considered
352  /// if Type is null.
353  llvm::function_ref<QualType()> ComputeType;
354};
355
356/// Sema - This implements semantic analysis and AST building for C.
357class Sema final {
358  Sema(const Sema &) = delete;
359  void operator=(const Sema &) = delete;
360
361  ///Source of additional semantic information.
362  IntrusiveRefCntPtr<ExternalSemaSource> ExternalSource;
363
364  static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
365
366  /// Determine whether two declarations should be linked together, given that
367  /// the old declaration might not be visible and the new declaration might
368  /// not have external linkage.
369  bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
370                                    const NamedDecl *New) {
371    if (isVisible(Old))
372     return true;
373    // See comment in below overload for why it's safe to compute the linkage
374    // of the new declaration here.
375    if (New->isExternallyDeclarable()) {
376      assert(Old->isExternallyDeclarable() &&
377             "should not have found a non-externally-declarable previous decl");
378      return true;
379    }
380    return false;
381  }
382  bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
383
384  void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
385                                      QualType ResultTy,
386                                      ArrayRef<QualType> Args);
387
388public:
389  /// The maximum alignment, same as in llvm::Value. We duplicate them here
390  /// because that allows us not to duplicate the constants in clang code,
391  /// which we must to since we can't directly use the llvm constants.
392  /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
393  ///
394  /// This is the greatest alignment value supported by load, store, and alloca
395  /// instructions, and global values.
396  static const unsigned MaxAlignmentExponent = 32;
397  static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
398
399  typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy;
400  typedef OpaquePtr<TemplateName> TemplateTy;
401  typedef OpaquePtr<QualType> TypeTy;
402
403  OpenCLOptions OpenCLFeatures;
404  FPOptions CurFPFeatures;
405
406  const LangOptions &LangOpts;
407  Preprocessor &PP;
408  ASTContext &Context;
409  ASTConsumer &Consumer;
410  DiagnosticsEngine &Diags;
411  SourceManager &SourceMgr;
412  api_notes::APINotesManager APINotes;
413
414  /// Flag indicating whether or not to collect detailed statistics.
415  bool CollectStats;
416
417  /// Code-completion consumer.
418  CodeCompleteConsumer *CodeCompleter;
419
420  /// CurContext - This is the current declaration context of parsing.
421  DeclContext *CurContext;
422
423  /// Generally null except when we temporarily switch decl contexts,
424  /// like in \see ActOnObjCTemporaryExitContainerContext.
425  DeclContext *OriginalLexicalContext;
426
427  /// VAListTagName - The declaration name corresponding to __va_list_tag.
428  /// This is used as part of a hack to omit that class from ADL results.
429  DeclarationName VAListTagName;
430
431  bool MSStructPragmaOn; // True when \#pragma ms_struct on
432
433  /// Controls member pointer representation format under the MS ABI.
434  LangOptions::PragmaMSPointersToMembersKind
435      MSPointerToMemberRepresentationMethod;
436
437  /// Stack of active SEH __finally scopes.  Can be empty.
438  SmallVector<Scope*, 2> CurrentSEHFinally;
439
440  /// Source location for newly created implicit MSInheritanceAttrs
441  SourceLocation ImplicitMSInheritanceAttrLoc;
442
443  /// Holds TypoExprs that are created from `createDelayedTypo`. This is used by
444  /// `TransformTypos` in order to keep track of any TypoExprs that are created
445  /// recursively during typo correction and wipe them away if the correction
446  /// fails.
447  llvm::SmallVector<TypoExpr *, 2> TypoExprs;
448
449  /// pragma clang section kind
450  enum PragmaClangSectionKind {
451    PCSK_Invalid      = 0,
452    PCSK_BSS          = 1,
453    PCSK_Data         = 2,
454    PCSK_Rodata       = 3,
455    PCSK_Text         = 4,
456    PCSK_Relro        = 5
457   };
458
459  enum PragmaClangSectionAction {
460    PCSA_Set     = 0,
461    PCSA_Clear   = 1
462  };
463
464  struct PragmaClangSection {
465    std::string SectionName;
466    bool Valid = false;
467    SourceLocation PragmaLocation;
468  };
469
470   PragmaClangSection PragmaClangBSSSection;
471   PragmaClangSection PragmaClangDataSection;
472   PragmaClangSection PragmaClangRodataSection;
473   PragmaClangSection PragmaClangRelroSection;
474   PragmaClangSection PragmaClangTextSection;
475
476  enum PragmaMsStackAction {
477    PSK_Reset     = 0x0,                // #pragma ()
478    PSK_Set       = 0x1,                // #pragma (value)
479    PSK_Push      = 0x2,                // #pragma (push[, id])
480    PSK_Pop       = 0x4,                // #pragma (pop[, id])
481    PSK_Show      = 0x8,                // #pragma (show) -- only for "pack"!
482    PSK_Push_Set  = PSK_Push | PSK_Set, // #pragma (push[, id], value)
483    PSK_Pop_Set   = PSK_Pop | PSK_Set,  // #pragma (pop[, id], value)
484  };
485
486  struct PragmaPackInfo {
487    PragmaMsStackAction Action;
488    StringRef SlotLabel;
489    Token Alignment;
490  };
491
492  // #pragma pack and align.
493  class AlignPackInfo {
494  public:
495    // `Native` represents default align mode, which may vary based on the
496    // platform.
497    enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
498
499    // #pragma pack info constructor
500    AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
501        : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
502      assert(Num == PackNumber && "The pack number has been truncated.");
503    }
504
505    // #pragma align info constructor
506    AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
507        : PackAttr(false), AlignMode(M),
508          PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
509
510    explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
511
512    AlignPackInfo() : AlignPackInfo(Native, false) {}
513
514    // When a AlignPackInfo itself cannot be used, this returns an 32-bit
515    // integer encoding for it. This should only be passed to
516    // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
517    static uint32_t getRawEncoding(const AlignPackInfo &Info) {
518      std::uint32_t Encoding{};
519      if (Info.IsXLStack())
520        Encoding |= IsXLMask;
521
522      Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
523
524      if (Info.IsPackAttr())
525        Encoding |= PackAttrMask;
526
527      Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
528
529      return Encoding;
530    }
531
532    static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
533      bool IsXL = static_cast<bool>(Encoding & IsXLMask);
534      AlignPackInfo::Mode M =
535          static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
536      int PackNumber = (Encoding & PackNumMask) >> 4;
537
538      if (Encoding & PackAttrMask)
539        return AlignPackInfo(M, PackNumber, IsXL);
540
541      return AlignPackInfo(M, IsXL);
542    }
543
544    bool IsPackAttr() const { return PackAttr; }
545
546    bool IsAlignAttr() const { return !PackAttr; }
547
548    Mode getAlignMode() const { return AlignMode; }
549
550    unsigned getPackNumber() const { return PackNumber; }
551
552    bool IsPackSet() const {
553      // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
554      // attriute on a decl.
555      return PackNumber != UninitPackVal && PackNumber != 0;
556    }
557
558    bool IsXLStack() const { return XLStack; }
559
560    bool operator==(const AlignPackInfo &Info) const {
561      return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
562             std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
563                      Info.XLStack);
564    }
565
566    bool operator!=(const AlignPackInfo &Info) const {
567      return !(*this == Info);
568    }
569
570  private:
571    /// \brief True if this is a pragma pack attribute,
572    ///         not a pragma align attribute.
573    bool PackAttr;
574
575    /// \brief The alignment mode that is in effect.
576    Mode AlignMode;
577
578    /// \brief The pack number of the stack.
579    unsigned char PackNumber;
580
581    /// \brief True if it is a XL #pragma align/pack stack.
582    bool XLStack;
583
584    /// \brief Uninitialized pack value.
585    static constexpr unsigned char UninitPackVal = -1;
586
587    // Masks to encode and decode an AlignPackInfo.
588    static constexpr uint32_t IsXLMask{0x0000'0001};
589    static constexpr uint32_t AlignModeMask{0x0000'0006};
590    static constexpr uint32_t PackAttrMask{0x00000'0008};
591    static constexpr uint32_t PackNumMask{0x0000'01F0};
592  };
593
594  template<typename ValueType>
595  struct PragmaStack {
596    struct Slot {
597      llvm::StringRef StackSlotLabel;
598      ValueType Value;
599      SourceLocation PragmaLocation;
600      SourceLocation PragmaPushLocation;
601      Slot(llvm::StringRef StackSlotLabel, ValueType Value,
602           SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
603          : StackSlotLabel(StackSlotLabel), Value(Value),
604            PragmaLocation(PragmaLocation),
605            PragmaPushLocation(PragmaPushLocation) {}
606    };
607
608    void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
609             llvm::StringRef StackSlotLabel, ValueType Value) {
610      if (Action == PSK_Reset) {
611        CurrentValue = DefaultValue;
612        CurrentPragmaLocation = PragmaLocation;
613        return;
614      }
615      if (Action & PSK_Push)
616        Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
617                           PragmaLocation);
618      else if (Action & PSK_Pop) {
619        if (!StackSlotLabel.empty()) {
620          // If we've got a label, try to find it and jump there.
621          auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
622            return x.StackSlotLabel == StackSlotLabel;
623          });
624          // If we found the label so pop from there.
625          if (I != Stack.rend()) {
626            CurrentValue = I->Value;
627            CurrentPragmaLocation = I->PragmaLocation;
628            Stack.erase(std::prev(I.base()), Stack.end());
629          }
630        } else if (!Stack.empty()) {
631          // We do not have a label, just pop the last entry.
632          CurrentValue = Stack.back().Value;
633          CurrentPragmaLocation = Stack.back().PragmaLocation;
634          Stack.pop_back();
635        }
636      }
637      if (Action & PSK_Set) {
638        CurrentValue = Value;
639        CurrentPragmaLocation = PragmaLocation;
640      }
641    }
642
643    // MSVC seems to add artificial slots to #pragma stacks on entering a C++
644    // method body to restore the stacks on exit, so it works like this:
645    //
646    //   struct S {
647    //     #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
648    //     void Method {}
649    //     #pragma <name>(pop, InternalPragmaSlot)
650    //   };
651    //
652    // It works even with #pragma vtordisp, although MSVC doesn't support
653    //   #pragma vtordisp(push [, id], n)
654    // syntax.
655    //
656    // Push / pop a named sentinel slot.
657    void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
658      assert((Action == PSK_Push || Action == PSK_Pop) &&
659             "Can only push / pop #pragma stack sentinels!");
660      Act(CurrentPragmaLocation, Action, Label, CurrentValue);
661    }
662
663    // Constructors.
664    explicit PragmaStack(const ValueType &Default)
665        : DefaultValue(Default), CurrentValue(Default) {}
666
667    bool hasValue() const { return CurrentValue != DefaultValue; }
668
669    SmallVector<Slot, 2> Stack;
670    ValueType DefaultValue; // Value used for PSK_Reset action.
671    ValueType CurrentValue;
672    SourceLocation CurrentPragmaLocation;
673  };
674  // FIXME: We should serialize / deserialize these if they occur in a PCH (but
675  // we shouldn't do so if they're in a module).
676
677  /// Whether to insert vtordisps prior to virtual bases in the Microsoft
678  /// C++ ABI.  Possible values are 0, 1, and 2, which mean:
679  ///
680  /// 0: Suppress all vtordisps
681  /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
682  ///    structors
683  /// 2: Always insert vtordisps to support RTTI on partially constructed
684  ///    objects
685  PragmaStack<MSVtorDispMode> VtorDispStack;
686  PragmaStack<AlignPackInfo> AlignPackStack;
687  // The current #pragma align/pack values and locations at each #include.
688  struct AlignPackIncludeState {
689    AlignPackInfo CurrentValue;
690    SourceLocation CurrentPragmaLocation;
691    bool HasNonDefaultValue, ShouldWarnOnInclude;
692  };
693  SmallVector<AlignPackIncludeState, 8> AlignPackIncludeStack;
694  // Segment #pragmas.
695  PragmaStack<StringLiteral *> DataSegStack;
696  PragmaStack<StringLiteral *> BSSSegStack;
697  PragmaStack<StringLiteral *> ConstSegStack;
698  PragmaStack<StringLiteral *> CodeSegStack;
699
700  // #pragma strict_gs_check.
701  PragmaStack<bool> StrictGuardStackCheckStack;
702
703  // This stack tracks the current state of Sema.CurFPFeatures.
704  PragmaStack<FPOptionsOverride> FpPragmaStack;
705  FPOptionsOverride CurFPFeatureOverrides() {
706    FPOptionsOverride result;
707    if (!FpPragmaStack.hasValue()) {
708      result = FPOptionsOverride();
709    } else {
710      result = FpPragmaStack.CurrentValue;
711    }
712    return result;
713  }
714
715  // Saves the current floating-point pragma stack and clear it in this Sema.
716  class FpPragmaStackSaveRAII {
717  public:
718    FpPragmaStackSaveRAII(Sema &S)
719        : S(S), SavedStack(std::move(S.FpPragmaStack)) {
720      S.FpPragmaStack.Stack.clear();
721    }
722    ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
723
724  private:
725    Sema &S;
726    PragmaStack<FPOptionsOverride> SavedStack;
727  };
728
729  void resetFPOptions(FPOptions FPO) {
730    CurFPFeatures = FPO;
731    FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
732  }
733
734  // RAII object to push / pop sentinel slots for all MS #pragma stacks.
735  // Actions should be performed only if we enter / exit a C++ method body.
736  class PragmaStackSentinelRAII {
737  public:
738    PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
739    ~PragmaStackSentinelRAII();
740
741  private:
742    Sema &S;
743    StringRef SlotLabel;
744    bool ShouldAct;
745  };
746
747  /// A mapping that describes the nullability we've seen in each header file.
748  FileNullabilityMap NullabilityMap;
749
750  /// Last section used with #pragma init_seg.
751  StringLiteral *CurInitSeg;
752  SourceLocation CurInitSegLoc;
753
754  /// Sections used with #pragma alloc_text.
755  llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
756
757  /// VisContext - Manages the stack for \#pragma GCC visibility.
758  void *VisContext; // Really a "PragmaVisStack*"
759
760  /// This an attribute introduced by \#pragma clang attribute.
761  struct PragmaAttributeEntry {
762    SourceLocation Loc;
763    ParsedAttr *Attribute;
764    SmallVector<attr::SubjectMatchRule, 4> MatchRules;
765    bool IsUsed;
766  };
767
768  /// A push'd group of PragmaAttributeEntries.
769  struct PragmaAttributeGroup {
770    /// The location of the push attribute.
771    SourceLocation Loc;
772    /// The namespace of this push group.
773    const IdentifierInfo *Namespace;
774    SmallVector<PragmaAttributeEntry, 2> Entries;
775  };
776
777  SmallVector<PragmaAttributeGroup, 2> PragmaAttributeStack;
778
779  /// The declaration that is currently receiving an attribute from the
780  /// #pragma attribute stack.
781  const Decl *PragmaAttributeCurrentTargetDecl;
782
783  /// This represents the last location of a "#pragma clang optimize off"
784  /// directive if such a directive has not been closed by an "on" yet. If
785  /// optimizations are currently "on", this is set to an invalid location.
786  SourceLocation OptimizeOffPragmaLocation;
787
788  /// The "on" or "off" argument passed by \#pragma optimize, that denotes
789  /// whether the optimizations in the list passed to the pragma should be
790  /// turned off or on. This boolean is true by default because command line
791  /// options are honored when `#pragma optimize("", on)`.
792  /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
793  bool MSPragmaOptimizeIsOn = true;
794
795  /// Set of no-builtin functions listed by \#pragma function.
796  llvm::SmallSetVector<StringRef, 4> MSFunctionNoBuiltins;
797
798  /// Flag indicating if Sema is building a recovery call expression.
799  ///
800  /// This flag is used to avoid building recovery call expressions
801  /// if Sema is already doing so, which would cause infinite recursions.
802  bool IsBuildingRecoveryCallExpr;
803
804  /// Used to control the generation of ExprWithCleanups.
805  CleanupInfo Cleanup;
806
807  /// ExprCleanupObjects - This is the stack of objects requiring
808  /// cleanup that are created by the current full expression.
809  SmallVector<ExprWithCleanups::CleanupObject, 8> ExprCleanupObjects;
810
811  /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
812  /// to a variable (constant) that may or may not be odr-used in this Expr, and
813  /// we won't know until all lvalue-to-rvalue and discarded value conversions
814  /// have been applied to all subexpressions of the enclosing full expression.
815  /// This is cleared at the end of each full expression.
816  using MaybeODRUseExprSet = llvm::SmallSetVector<Expr *, 4>;
817  MaybeODRUseExprSet MaybeODRUseExprs;
818
819  std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
820
821  /// Stack containing information about each of the nested
822  /// function, block, and method scopes that are currently active.
823  SmallVector<sema::FunctionScopeInfo *, 4> FunctionScopes;
824
825  /// The index of the first FunctionScope that corresponds to the current
826  /// context.
827  unsigned FunctionScopesStart = 0;
828
829  /// Track the number of currently active capturing scopes.
830  unsigned CapturingFunctionScopes = 0;
831
832  ArrayRef<sema::FunctionScopeInfo*> getFunctionScopes() const {
833    return llvm::ArrayRef(FunctionScopes.begin() + FunctionScopesStart,
834                          FunctionScopes.end());
835  }
836
837  /// Stack containing information needed when in C++2a an 'auto' is encountered
838  /// in a function declaration parameter type specifier in order to invent a
839  /// corresponding template parameter in the enclosing abbreviated function
840  /// template. This information is also present in LambdaScopeInfo, stored in
841  /// the FunctionScopes stack.
842  SmallVector<InventedTemplateParameterInfo, 4> InventedParameterInfos;
843
844  /// The index of the first InventedParameterInfo that refers to the current
845  /// context.
846  unsigned InventedParameterInfosStart = 0;
847
848  ArrayRef<InventedTemplateParameterInfo> getInventedParameterInfos() const {
849    return llvm::ArrayRef(InventedParameterInfos.begin() +
850                              InventedParameterInfosStart,
851                          InventedParameterInfos.end());
852  }
853
854  typedef LazyVector<TypedefNameDecl *, ExternalSemaSource,
855                     &ExternalSemaSource::ReadExtVectorDecls, 2, 2>
856    ExtVectorDeclsType;
857
858  /// ExtVectorDecls - This is a list all the extended vector types. This allows
859  /// us to associate a raw vector type with one of the ext_vector type names.
860  /// This is only necessary for issuing pretty diagnostics.
861  ExtVectorDeclsType ExtVectorDecls;
862
863  /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
864  std::unique_ptr<CXXFieldCollector> FieldCollector;
865
866  typedef llvm::SmallSetVector<const NamedDecl *, 16> NamedDeclSetType;
867
868  /// Set containing all declared private fields that are not used.
869  NamedDeclSetType UnusedPrivateFields;
870
871  /// Set containing all typedefs that are likely unused.
872  llvm::SmallSetVector<const TypedefNameDecl *, 4>
873      UnusedLocalTypedefNameCandidates;
874
875  /// Delete-expressions to be analyzed at the end of translation unit
876  ///
877  /// This list contains class members, and locations of delete-expressions
878  /// that could not be proven as to whether they mismatch with new-expression
879  /// used in initializer of the field.
880  typedef std::pair<SourceLocation, bool> DeleteExprLoc;
881  typedef llvm::SmallVector<DeleteExprLoc, 4> DeleteLocs;
882  llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
883
884  typedef llvm::SmallPtrSet<const CXXRecordDecl*, 8> RecordDeclSetTy;
885
886  /// PureVirtualClassDiagSet - a set of class declarations which we have
887  /// emitted a list of pure virtual functions. Used to prevent emitting the
888  /// same list more than once.
889  std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
890
891  /// ParsingInitForAutoVars - a set of declarations with auto types for which
892  /// we are currently parsing the initializer.
893  llvm::SmallPtrSet<const Decl*, 4> ParsingInitForAutoVars;
894
895  /// Look for a locally scoped extern "C" declaration by the given name.
896  NamedDecl *findLocallyScopedExternCDecl(DeclarationName Name);
897
898  typedef LazyVector<VarDecl *, ExternalSemaSource,
899                     &ExternalSemaSource::ReadTentativeDefinitions, 2, 2>
900    TentativeDefinitionsType;
901
902  /// All the tentative definitions encountered in the TU.
903  TentativeDefinitionsType TentativeDefinitions;
904
905  /// All the external declarations encoutered and used in the TU.
906  SmallVector<VarDecl *, 4> ExternalDeclarations;
907
908  typedef LazyVector<const DeclaratorDecl *, ExternalSemaSource,
909                     &ExternalSemaSource::ReadUnusedFileScopedDecls, 2, 2>
910    UnusedFileScopedDeclsType;
911
912  /// The set of file scoped decls seen so far that have not been used
913  /// and must warn if not used. Only contains the first declaration.
914  UnusedFileScopedDeclsType UnusedFileScopedDecls;
915
916  typedef LazyVector<CXXConstructorDecl *, ExternalSemaSource,
917                     &ExternalSemaSource::ReadDelegatingConstructors, 2, 2>
918    DelegatingCtorDeclsType;
919
920  /// All the delegating constructors seen so far in the file, used for
921  /// cycle detection at the end of the TU.
922  DelegatingCtorDeclsType DelegatingCtorDecls;
923
924  /// All the overriding functions seen during a class definition
925  /// that had their exception spec checks delayed, plus the overridden
926  /// function.
927  SmallVector<std::pair<const CXXMethodDecl*, const CXXMethodDecl*>, 2>
928    DelayedOverridingExceptionSpecChecks;
929
930  /// All the function redeclarations seen during a class definition that had
931  /// their exception spec checks delayed, plus the prior declaration they
932  /// should be checked against. Except during error recovery, the new decl
933  /// should always be a friend declaration, as that's the only valid way to
934  /// redeclare a special member before its class is complete.
935  SmallVector<std::pair<FunctionDecl*, FunctionDecl*>, 2>
936    DelayedEquivalentExceptionSpecChecks;
937
938  typedef llvm::MapVector<const FunctionDecl *,
939                          std::unique_ptr<LateParsedTemplate>>
940      LateParsedTemplateMapT;
941  LateParsedTemplateMapT LateParsedTemplateMap;
942
943  /// Callback to the parser to parse templated functions when needed.
944  typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
945  typedef void LateTemplateParserCleanupCB(void *P);
946  LateTemplateParserCB *LateTemplateParser;
947  LateTemplateParserCleanupCB *LateTemplateParserCleanup;
948  void *OpaqueParser;
949
950  void SetLateTemplateParser(LateTemplateParserCB *LTP,
951                             LateTemplateParserCleanupCB *LTPCleanup,
952                             void *P) {
953    LateTemplateParser = LTP;
954    LateTemplateParserCleanup = LTPCleanup;
955    OpaqueParser = P;
956  }
957
958  /// Callback to the parser to parse a type expressed as a string.
959  std::function<TypeResult(StringRef, StringRef, SourceLocation)>
960      ParseTypeFromStringCallback;
961
962  class DelayedDiagnostics;
963
964  class DelayedDiagnosticsState {
965    sema::DelayedDiagnosticPool *SavedPool = nullptr;
966    friend class Sema::DelayedDiagnostics;
967  };
968  typedef DelayedDiagnosticsState ParsingDeclState;
969  typedef DelayedDiagnosticsState ProcessingContextState;
970
971  /// A class which encapsulates the logic for delaying diagnostics
972  /// during parsing and other processing.
973  class DelayedDiagnostics {
974    /// The current pool of diagnostics into which delayed
975    /// diagnostics should go.
976    sema::DelayedDiagnosticPool *CurPool = nullptr;
977
978  public:
979    DelayedDiagnostics() = default;
980
981    /// Adds a delayed diagnostic.
982    void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
983
984    /// Determines whether diagnostics should be delayed.
985    bool shouldDelayDiagnostics() { return CurPool != nullptr; }
986
987    /// Returns the current delayed-diagnostics pool.
988    sema::DelayedDiagnosticPool *getCurrentPool() const {
989      return CurPool;
990    }
991
992    /// Enter a new scope.  Access and deprecation diagnostics will be
993    /// collected in this pool.
994    DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool) {
995      DelayedDiagnosticsState state;
996      state.SavedPool = CurPool;
997      CurPool = &pool;
998      return state;
999    }
1000
1001    /// Leave a delayed-diagnostic state that was previously pushed.
1002    /// Do not emit any of the diagnostics.  This is performed as part
1003    /// of the bookkeeping of popping a pool "properly".
1004    void popWithoutEmitting(DelayedDiagnosticsState state) {
1005      CurPool = state.SavedPool;
1006    }
1007
1008    /// Enter a new scope where access and deprecation diagnostics are
1009    /// not delayed.
1010    DelayedDiagnosticsState pushUndelayed() {
1011      DelayedDiagnosticsState state;
1012      state.SavedPool = CurPool;
1013      CurPool = nullptr;
1014      return state;
1015    }
1016
1017    /// Undo a previous pushUndelayed().
1018    void popUndelayed(DelayedDiagnosticsState state) {
1019      assert(CurPool == nullptr);
1020      CurPool = state.SavedPool;
1021    }
1022  } DelayedDiagnostics;
1023
1024  enum CUDAFunctionTarget {
1025    CFT_Device,
1026    CFT_Global,
1027    CFT_Host,
1028    CFT_HostDevice,
1029    CFT_InvalidTarget
1030  };
1031
1032  /// A RAII object to temporarily push a declaration context.
1033  class ContextRAII {
1034  private:
1035    Sema &S;
1036    DeclContext *SavedContext;
1037    ProcessingContextState SavedContextState;
1038    QualType SavedCXXThisTypeOverride;
1039    unsigned SavedFunctionScopesStart;
1040    unsigned SavedInventedParameterInfosStart;
1041
1042  public:
1043    ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
1044      : S(S), SavedContext(S.CurContext),
1045        SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
1046        SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
1047        SavedFunctionScopesStart(S.FunctionScopesStart),
1048        SavedInventedParameterInfosStart(S.InventedParameterInfosStart)
1049    {
1050      assert(ContextToPush && "pushing null context");
1051      S.CurContext = ContextToPush;
1052      if (NewThisContext)
1053        S.CXXThisTypeOverride = QualType();
1054      // Any saved FunctionScopes do not refer to this context.
1055      S.FunctionScopesStart = S.FunctionScopes.size();
1056      S.InventedParameterInfosStart = S.InventedParameterInfos.size();
1057    }
1058
1059    void pop() {
1060      if (!SavedContext) return;
1061      S.CurContext = SavedContext;
1062      S.DelayedDiagnostics.popUndelayed(SavedContextState);
1063      S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
1064      S.FunctionScopesStart = SavedFunctionScopesStart;
1065      S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
1066      SavedContext = nullptr;
1067    }
1068
1069    ~ContextRAII() {
1070      pop();
1071    }
1072  };
1073
1074  /// RAII object to handle the state changes required to synthesize
1075  /// a function body.
1076  class SynthesizedFunctionScope {
1077    Sema &S;
1078    Sema::ContextRAII SavedContext;
1079    bool PushedCodeSynthesisContext = false;
1080
1081  public:
1082    SynthesizedFunctionScope(Sema &S, DeclContext *DC)
1083        : S(S), SavedContext(S, DC) {
1084      auto *FD = dyn_cast<FunctionDecl>(DC);
1085      S.PushFunctionScope();
1086      S.PushExpressionEvaluationContext(
1087          (FD && FD->isConsteval())
1088              ? ExpressionEvaluationContext::ImmediateFunctionContext
1089              : ExpressionEvaluationContext::PotentiallyEvaluated);
1090      if (FD) {
1091        FD->setWillHaveBody(true);
1092        S.ExprEvalContexts.back().InImmediateFunctionContext =
1093            FD->isImmediateFunction() ||
1094            S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
1095                .isConstantEvaluated();
1096        S.ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
1097            S.getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
1098      } else
1099        assert(isa<ObjCMethodDecl>(DC));
1100    }
1101
1102    void addContextNote(SourceLocation UseLoc) {
1103      assert(!PushedCodeSynthesisContext);
1104
1105      Sema::CodeSynthesisContext Ctx;
1106      Ctx.Kind = Sema::CodeSynthesisContext::DefiningSynthesizedFunction;
1107      Ctx.PointOfInstantiation = UseLoc;
1108      Ctx.Entity = cast<Decl>(S.CurContext);
1109      S.pushCodeSynthesisContext(Ctx);
1110
1111      PushedCodeSynthesisContext = true;
1112    }
1113
1114    ~SynthesizedFunctionScope() {
1115      if (PushedCodeSynthesisContext)
1116        S.popCodeSynthesisContext();
1117      if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
1118        FD->setWillHaveBody(false);
1119        S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
1120      }
1121      S.PopExpressionEvaluationContext();
1122      S.PopFunctionScopeInfo();
1123    }
1124  };
1125
1126  /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
1127  /// declared. Rare. May alias another identifier, declared or undeclared.
1128  ///
1129  /// For aliases, the target identifier is used as a key for eventual
1130  /// processing when the target is declared. For the single-identifier form,
1131  /// the sole identifier is used as the key. Each entry is a `SetVector`
1132  /// (ordered by parse order) of aliases (identified by the alias name) in case
1133  /// of multiple aliases to the same undeclared identifier.
1134  llvm::MapVector<
1135      IdentifierInfo *,
1136      llvm::SetVector<
1137          WeakInfo, llvm::SmallVector<WeakInfo, 1u>,
1138          llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
1139      WeakUndeclaredIdentifiers;
1140
1141  /// ExtnameUndeclaredIdentifiers - Identifiers contained in
1142  /// \#pragma redefine_extname before declared.  Used in Solaris system headers
1143  /// to define functions that occur in multiple standards to call the version
1144  /// in the currently selected standard.
1145  llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*> ExtnameUndeclaredIdentifiers;
1146
1147
1148  /// Load weak undeclared identifiers from the external source.
1149  void LoadExternalWeakUndeclaredIdentifiers();
1150
1151  /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
1152  /// \#pragma weak during processing of other Decls.
1153  /// I couldn't figure out a clean way to generate these in-line, so
1154  /// we store them here and handle separately -- which is a hack.
1155  /// It would be best to refactor this.
1156  SmallVector<Decl*,2> WeakTopLevelDecl;
1157
1158  IdentifierResolver IdResolver;
1159
1160  /// Translation Unit Scope - useful to Objective-C actions that need
1161  /// to lookup file scope declarations in the "ordinary" C decl namespace.
1162  /// For example, user-defined classes, built-in "id" type, etc.
1163  Scope *TUScope;
1164
1165  /// The C++ "std" namespace, where the standard library resides.
1166  LazyDeclPtr StdNamespace;
1167
1168  /// The C++ "std::bad_alloc" class, which is defined by the C++
1169  /// standard library.
1170  LazyDeclPtr StdBadAlloc;
1171
1172  /// The C++ "std::align_val_t" enum class, which is defined by the C++
1173  /// standard library.
1174  LazyDeclPtr StdAlignValT;
1175
1176  /// The C++ "std::initializer_list" template, which is defined in
1177  /// \<initializer_list>.
1178  ClassTemplateDecl *StdInitializerList;
1179
1180  /// The C++ "std::coroutine_traits" template, which is defined in
1181  /// \<coroutine_traits>
1182  ClassTemplateDecl *StdCoroutineTraitsCache;
1183
1184  /// The C++ "type_info" declaration, which is defined in \<typeinfo>.
1185  RecordDecl *CXXTypeInfoDecl;
1186
1187  /// The C++ "std::source_location::__impl" struct, defined in
1188  /// \<source_location>.
1189  RecordDecl *StdSourceLocationImplDecl;
1190
1191  /// Caches identifiers/selectors for NSFoundation APIs.
1192  std::unique_ptr<NSAPI> NSAPIObj;
1193
1194  /// The declaration of the Objective-C NSNumber class.
1195  ObjCInterfaceDecl *NSNumberDecl;
1196
1197  /// The declaration of the Objective-C NSValue class.
1198  ObjCInterfaceDecl *NSValueDecl;
1199
1200  /// Pointer to NSNumber type (NSNumber *).
1201  QualType NSNumberPointer;
1202
1203  /// Pointer to NSValue type (NSValue *).
1204  QualType NSValuePointer;
1205
1206  /// The Objective-C NSNumber methods used to create NSNumber literals.
1207  ObjCMethodDecl *NSNumberLiteralMethods[NSAPI::NumNSNumberLiteralMethods];
1208
1209  /// The declaration of the Objective-C NSString class.
1210  ObjCInterfaceDecl *NSStringDecl;
1211
1212  /// Pointer to NSString type (NSString *).
1213  QualType NSStringPointer;
1214
1215  /// The declaration of the stringWithUTF8String: method.
1216  ObjCMethodDecl *StringWithUTF8StringMethod;
1217
1218  /// The declaration of the valueWithBytes:objCType: method.
1219  ObjCMethodDecl *ValueWithBytesObjCTypeMethod;
1220
1221  /// The declaration of the Objective-C NSArray class.
1222  ObjCInterfaceDecl *NSArrayDecl;
1223
1224  /// The declaration of the arrayWithObjects:count: method.
1225  ObjCMethodDecl *ArrayWithObjectsMethod;
1226
1227  /// The declaration of the Objective-C NSDictionary class.
1228  ObjCInterfaceDecl *NSDictionaryDecl;
1229
1230  /// The declaration of the dictionaryWithObjects:forKeys:count: method.
1231  ObjCMethodDecl *DictionaryWithObjectsMethod;
1232
1233  /// id<NSCopying> type.
1234  QualType QIDNSCopying;
1235
1236  /// will hold 'respondsToSelector:'
1237  Selector RespondsToSelectorSel;
1238
1239  /// A flag to remember whether the implicit forms of operator new and delete
1240  /// have been declared.
1241  bool GlobalNewDeleteDeclared;
1242
1243  /// Describes how the expressions currently being parsed are
1244  /// evaluated at run-time, if at all.
1245  enum class ExpressionEvaluationContext {
1246    /// The current expression and its subexpressions occur within an
1247    /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
1248    /// \c sizeof, where the type of the expression may be significant but
1249    /// no code will be generated to evaluate the value of the expression at
1250    /// run time.
1251    Unevaluated,
1252
1253    /// The current expression occurs within a braced-init-list within
1254    /// an unevaluated operand. This is mostly like a regular unevaluated
1255    /// context, except that we still instantiate constexpr functions that are
1256    /// referenced here so that we can perform narrowing checks correctly.
1257    UnevaluatedList,
1258
1259    /// The current expression occurs within a discarded statement.
1260    /// This behaves largely similarly to an unevaluated operand in preventing
1261    /// definitions from being required, but not in other ways.
1262    DiscardedStatement,
1263
1264    /// The current expression occurs within an unevaluated
1265    /// operand that unconditionally permits abstract references to
1266    /// fields, such as a SIZE operator in MS-style inline assembly.
1267    UnevaluatedAbstract,
1268
1269    /// The current context is "potentially evaluated" in C++11 terms,
1270    /// but the expression is evaluated at compile-time (like the values of
1271    /// cases in a switch statement).
1272    ConstantEvaluated,
1273
1274    /// In addition of being constant evaluated, the current expression
1275    /// occurs in an immediate function context - either a consteval function
1276    /// or a consteval if statement.
1277    ImmediateFunctionContext,
1278
1279    /// The current expression is potentially evaluated at run time,
1280    /// which means that code may be generated to evaluate the value of the
1281    /// expression at run time.
1282    PotentiallyEvaluated,
1283
1284    /// The current expression is potentially evaluated, but any
1285    /// declarations referenced inside that expression are only used if
1286    /// in fact the current expression is used.
1287    ///
1288    /// This value is used when parsing default function arguments, for which
1289    /// we would like to provide diagnostics (e.g., passing non-POD arguments
1290    /// through varargs) but do not want to mark declarations as "referenced"
1291    /// until the default argument is used.
1292    PotentiallyEvaluatedIfUsed
1293  };
1294
1295  using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
1296
1297  /// Data structure used to record current or nested
1298  /// expression evaluation contexts.
1299  struct ExpressionEvaluationContextRecord {
1300    /// The expression evaluation context.
1301    ExpressionEvaluationContext Context;
1302
1303    /// Whether the enclosing context needed a cleanup.
1304    CleanupInfo ParentCleanup;
1305
1306    /// The number of active cleanup objects when we entered
1307    /// this expression evaluation context.
1308    unsigned NumCleanupObjects;
1309
1310    /// The number of typos encountered during this expression evaluation
1311    /// context (i.e. the number of TypoExprs created).
1312    unsigned NumTypos;
1313
1314    MaybeODRUseExprSet SavedMaybeODRUseExprs;
1315
1316    /// The lambdas that are present within this context, if it
1317    /// is indeed an unevaluated context.
1318    SmallVector<LambdaExpr *, 2> Lambdas;
1319
1320    /// The declaration that provides context for lambda expressions
1321    /// and block literals if the normal declaration context does not
1322    /// suffice, e.g., in a default function argument.
1323    Decl *ManglingContextDecl;
1324
1325    /// If we are processing a decltype type, a set of call expressions
1326    /// for which we have deferred checking the completeness of the return type.
1327    SmallVector<CallExpr *, 8> DelayedDecltypeCalls;
1328
1329    /// If we are processing a decltype type, a set of temporary binding
1330    /// expressions for which we have deferred checking the destructor.
1331    SmallVector<CXXBindTemporaryExpr *, 8> DelayedDecltypeBinds;
1332
1333    llvm::SmallPtrSet<const Expr *, 8> PossibleDerefs;
1334
1335    /// Expressions appearing as the LHS of a volatile assignment in this
1336    /// context. We produce a warning for these when popping the context if
1337    /// they are not discarded-value expressions nor unevaluated operands.
1338    SmallVector<Expr*, 2> VolatileAssignmentLHSs;
1339
1340    /// Set of candidates for starting an immediate invocation.
1341    llvm::SmallVector<ImmediateInvocationCandidate, 4> ImmediateInvocationCandidates;
1342
1343    /// Set of DeclRefExprs referencing a consteval function when used in a
1344    /// context not already known to be immediately invoked.
1345    llvm::SmallPtrSet<DeclRefExpr *, 4> ReferenceToConsteval;
1346
1347    /// \brief Describes whether we are in an expression constext which we have
1348    /// to handle differently.
1349    enum ExpressionKind {
1350      EK_Decltype, EK_TemplateArgument, EK_Other
1351    } ExprContext;
1352
1353    // A context can be nested in both a discarded statement context and
1354    // an immediate function context, so they need to be tracked independently.
1355    bool InDiscardedStatement;
1356    bool InImmediateFunctionContext;
1357    bool InImmediateEscalatingFunctionContext;
1358
1359    bool IsCurrentlyCheckingDefaultArgumentOrInitializer = false;
1360
1361    // We are in a constant context, but we also allow
1362    // non constant expressions, for example for array bounds (which may be
1363    // VLAs).
1364    bool InConditionallyConstantEvaluateContext = false;
1365
1366    // When evaluating immediate functions in the initializer of a default
1367    // argument or default member initializer, this is the declaration whose
1368    // default initializer is being evaluated and the location of the call
1369    // or constructor definition.
1370    struct InitializationContext {
1371      InitializationContext(SourceLocation Loc, ValueDecl *Decl,
1372                            DeclContext *Context)
1373          : Loc(Loc), Decl(Decl), Context(Context) {
1374        assert(Decl && Context && "invalid initialization context");
1375      }
1376
1377      SourceLocation Loc;
1378      ValueDecl *Decl = nullptr;
1379      DeclContext *Context = nullptr;
1380    };
1381    std::optional<InitializationContext> DelayedDefaultInitializationContext;
1382
1383    ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context,
1384                                      unsigned NumCleanupObjects,
1385                                      CleanupInfo ParentCleanup,
1386                                      Decl *ManglingContextDecl,
1387                                      ExpressionKind ExprContext)
1388        : Context(Context), ParentCleanup(ParentCleanup),
1389          NumCleanupObjects(NumCleanupObjects), NumTypos(0),
1390          ManglingContextDecl(ManglingContextDecl), ExprContext(ExprContext),
1391          InDiscardedStatement(false), InImmediateFunctionContext(false),
1392          InImmediateEscalatingFunctionContext(false) {}
1393
1394    bool isUnevaluated() const {
1395      return Context == ExpressionEvaluationContext::Unevaluated ||
1396             Context == ExpressionEvaluationContext::UnevaluatedAbstract ||
1397             Context == ExpressionEvaluationContext::UnevaluatedList;
1398    }
1399
1400    bool isConstantEvaluated() const {
1401      return Context == ExpressionEvaluationContext::ConstantEvaluated ||
1402             Context == ExpressionEvaluationContext::ImmediateFunctionContext;
1403    }
1404
1405    bool isImmediateFunctionContext() const {
1406      return Context == ExpressionEvaluationContext::ImmediateFunctionContext ||
1407             (Context == ExpressionEvaluationContext::DiscardedStatement &&
1408              InImmediateFunctionContext) ||
1409             // C++23 [expr.const]p14:
1410             // An expression or conversion is in an immediate function
1411             // context if it is potentially evaluated and either:
1412             //   * its innermost enclosing non-block scope is a function
1413             //     parameter scope of an immediate function, or
1414             //   * its enclosing statement is enclosed by the compound-
1415             //     statement of a consteval if statement.
1416             (Context == ExpressionEvaluationContext::PotentiallyEvaluated &&
1417              InImmediateFunctionContext);
1418    }
1419
1420    bool isDiscardedStatementContext() const {
1421      return Context == ExpressionEvaluationContext::DiscardedStatement ||
1422             (Context ==
1423                  ExpressionEvaluationContext::ImmediateFunctionContext &&
1424              InDiscardedStatement);
1425    }
1426  };
1427
1428  /// A stack of expression evaluation contexts.
1429  SmallVector<ExpressionEvaluationContextRecord, 8> ExprEvalContexts;
1430
1431  // Set of failed immediate invocations to avoid double diagnosing.
1432  llvm::SmallPtrSet<ConstantExpr *, 4> FailedImmediateInvocations;
1433
1434  /// Emit a warning for all pending noderef expressions that we recorded.
1435  void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
1436
1437  /// Compute the mangling number context for a lambda expression or
1438  /// block literal. Also return the extra mangling decl if any.
1439  ///
1440  /// \param DC - The DeclContext containing the lambda expression or
1441  /// block literal.
1442  std::tuple<MangleNumberingContext *, Decl *>
1443  getCurrentMangleNumberContext(const DeclContext *DC);
1444
1445
1446  /// SpecialMemberOverloadResult - The overloading result for a special member
1447  /// function.
1448  ///
1449  /// This is basically a wrapper around PointerIntPair. The lowest bits of the
1450  /// integer are used to determine whether overload resolution succeeded.
1451  class SpecialMemberOverloadResult {
1452  public:
1453    enum Kind {
1454      NoMemberOrDeleted,
1455      Ambiguous,
1456      Success
1457    };
1458
1459  private:
1460    llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
1461
1462  public:
1463    SpecialMemberOverloadResult() {}
1464    SpecialMemberOverloadResult(CXXMethodDecl *MD)
1465        : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
1466
1467    CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
1468    void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
1469
1470    Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
1471    void setKind(Kind K) { Pair.setInt(K); }
1472  };
1473
1474  class SpecialMemberOverloadResultEntry
1475      : public llvm::FastFoldingSetNode,
1476        public SpecialMemberOverloadResult {
1477  public:
1478    SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
1479      : FastFoldingSetNode(ID)
1480    {}
1481  };
1482
1483  /// A cache of special member function overload resolution results
1484  /// for C++ records.
1485  llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
1486
1487  /// A cache of the flags available in enumerations with the flag_bits
1488  /// attribute.
1489  mutable llvm::DenseMap<const EnumDecl*, llvm::APInt> FlagBitsCache;
1490
1491  /// The kind of translation unit we are processing.
1492  ///
1493  /// When we're processing a complete translation unit, Sema will perform
1494  /// end-of-translation-unit semantic tasks (such as creating
1495  /// initializers for tentative definitions in C) once parsing has
1496  /// completed. Modules and precompiled headers perform different kinds of
1497  /// checks.
1498  const TranslationUnitKind TUKind;
1499
1500  llvm::BumpPtrAllocator BumpAlloc;
1501
1502  /// The number of SFINAE diagnostics that have been trapped.
1503  unsigned NumSFINAEErrors;
1504
1505  typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
1506    UnparsedDefaultArgInstantiationsMap;
1507
1508  /// A mapping from parameters with unparsed default arguments to the
1509  /// set of instantiations of each parameter.
1510  ///
1511  /// This mapping is a temporary data structure used when parsing
1512  /// nested class templates or nested classes of class templates,
1513  /// where we might end up instantiating an inner class before the
1514  /// default arguments of its methods have been parsed.
1515  UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations;
1516
1517  // Contains the locations of the beginning of unparsed default
1518  // argument locations.
1519  llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
1520
1521  /// UndefinedInternals - all the used, undefined objects which require a
1522  /// definition in this translation unit.
1523  llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
1524
1525  /// Determine if VD, which must be a variable or function, is an external
1526  /// symbol that nonetheless can't be referenced from outside this translation
1527  /// unit because its type has no linkage and it's not extern "C".
1528  bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
1529
1530  /// Obtain a sorted list of functions that are undefined but ODR-used.
1531  void getUndefinedButUsed(
1532      SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> > &Undefined);
1533
1534  /// Retrieves list of suspicious delete-expressions that will be checked at
1535  /// the end of translation unit.
1536  const llvm::MapVector<FieldDecl *, DeleteLocs> &
1537  getMismatchingDeleteExpressions() const;
1538
1539  class GlobalMethodPool {
1540  public:
1541    using Lists = std::pair<ObjCMethodList, ObjCMethodList>;
1542    using iterator = llvm::DenseMap<Selector, Lists>::iterator;
1543    iterator begin() { return Methods.begin(); }
1544    iterator end() { return Methods.end(); }
1545    iterator find(Selector Sel) { return Methods.find(Sel); }
1546    std::pair<iterator, bool> insert(std::pair<Selector, Lists> &&Val) {
1547      return Methods.insert(Val);
1548    }
1549    int count(Selector Sel) const { return Methods.count(Sel); }
1550    bool empty() const { return Methods.empty(); }
1551
1552  private:
1553    llvm::DenseMap<Selector, Lists> Methods;
1554  };
1555
1556  /// Method Pool - allows efficient lookup when typechecking messages to "id".
1557  /// We need to maintain a list, since selectors can have differing signatures
1558  /// across classes. In Cocoa, this happens to be extremely uncommon (only 1%
1559  /// of selectors are "overloaded").
1560  /// At the head of the list it is recorded whether there were 0, 1, or >= 2
1561  /// methods inside categories with a particular selector.
1562  GlobalMethodPool MethodPool;
1563
1564  /// Method selectors used in a \@selector expression. Used for implementation
1565  /// of -Wselector.
1566  llvm::MapVector<Selector, SourceLocation> ReferencedSelectors;
1567
1568  /// List of SourceLocations where 'self' is implicitly retained inside a
1569  /// block.
1570  llvm::SmallVector<std::pair<SourceLocation, const BlockDecl *>, 1>
1571      ImplicitlyRetainedSelfLocs;
1572
1573  /// Kinds of C++ special members.
1574  enum CXXSpecialMember {
1575    CXXDefaultConstructor,
1576    CXXCopyConstructor,
1577    CXXMoveConstructor,
1578    CXXCopyAssignment,
1579    CXXMoveAssignment,
1580    CXXDestructor,
1581    CXXInvalid
1582  };
1583
1584  typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMember>
1585      SpecialMemberDecl;
1586
1587  /// The C++ special members which we are currently in the process of
1588  /// declaring. If this process recursively triggers the declaration of the
1589  /// same special member, we should act as if it is not yet declared.
1590  llvm::SmallPtrSet<SpecialMemberDecl, 4> SpecialMembersBeingDeclared;
1591
1592  /// Kinds of defaulted comparison operator functions.
1593  enum class DefaultedComparisonKind : unsigned char {
1594    /// This is not a defaultable comparison operator.
1595    None,
1596    /// This is an operator== that should be implemented as a series of
1597    /// subobject comparisons.
1598    Equal,
1599    /// This is an operator<=> that should be implemented as a series of
1600    /// subobject comparisons.
1601    ThreeWay,
1602    /// This is an operator!= that should be implemented as a rewrite in terms
1603    /// of a == comparison.
1604    NotEqual,
1605    /// This is an <, <=, >, or >= that should be implemented as a rewrite in
1606    /// terms of a <=> comparison.
1607    Relational,
1608  };
1609
1610  /// The function definitions which were renamed as part of typo-correction
1611  /// to match their respective declarations. We want to keep track of them
1612  /// to ensure that we don't emit a "redefinition" error if we encounter a
1613  /// correctly named definition after the renamed definition.
1614  llvm::SmallPtrSet<const NamedDecl *, 4> TypoCorrectedFunctionDefinitions;
1615
1616  /// Stack of types that correspond to the parameter entities that are
1617  /// currently being copy-initialized. Can be empty.
1618  llvm::SmallVector<QualType, 4> CurrentParameterCopyTypes;
1619
1620  void ReadMethodPool(Selector Sel);
1621  void updateOutOfDateSelector(Selector Sel);
1622
1623  /// Private Helper predicate to check for 'self'.
1624  bool isSelfExpr(Expr *RExpr);
1625  bool isSelfExpr(Expr *RExpr, const ObjCMethodDecl *Method);
1626
1627  /// Cause the active diagnostic on the DiagosticsEngine to be
1628  /// emitted. This is closely coupled to the SemaDiagnosticBuilder class and
1629  /// should not be used elsewhere.
1630  void EmitCurrentDiagnostic(unsigned DiagID);
1631
1632  /// Records and restores the CurFPFeatures state on entry/exit of compound
1633  /// statements.
1634  class FPFeaturesStateRAII {
1635  public:
1636    FPFeaturesStateRAII(Sema &S);
1637    ~FPFeaturesStateRAII();
1638    FPOptionsOverride getOverrides() { return OldOverrides; }
1639
1640  private:
1641    Sema& S;
1642    FPOptions OldFPFeaturesState;
1643    FPOptionsOverride OldOverrides;
1644    LangOptions::FPEvalMethodKind OldEvalMethod;
1645    SourceLocation OldFPPragmaLocation;
1646  };
1647
1648  void addImplicitTypedef(StringRef Name, QualType T);
1649
1650  bool WarnedStackExhausted = false;
1651
1652  /// Increment when we find a reference; decrement when we find an ignored
1653  /// assignment.  Ultimately the value is 0 if every reference is an ignored
1654  /// assignment.
1655  llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
1656
1657  /// Indicate RISC-V vector builtin functions enabled or not.
1658  bool DeclareRISCVVBuiltins = false;
1659
1660  /// Indicate RISC-V SiFive vector builtin functions enabled or not.
1661  bool DeclareRISCVSiFiveVectorBuiltins = false;
1662
1663private:
1664  std::unique_ptr<sema::RISCVIntrinsicManager> RVIntrinsicManager;
1665
1666  std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1667
1668  bool WarnedDarwinSDKInfoMissing = false;
1669
1670public:
1671  Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
1672       TranslationUnitKind TUKind = TU_Complete,
1673       CodeCompleteConsumer *CompletionConsumer = nullptr);
1674  ~Sema();
1675
1676  /// Perform initialization that occurs after the parser has been
1677  /// initialized but before it parses anything.
1678  void Initialize();
1679
1680  /// This virtual key function only exists to limit the emission of debug info
1681  /// describing the Sema class. GCC and Clang only emit debug info for a class
1682  /// with a vtable when the vtable is emitted. Sema is final and not
1683  /// polymorphic, but the debug info size savings are so significant that it is
1684  /// worth adding a vtable just to take advantage of this optimization.
1685  virtual void anchor();
1686
1687  const LangOptions &getLangOpts() const { return LangOpts; }
1688  OpenCLOptions &getOpenCLOptions() { return OpenCLFeatures; }
1689  FPOptions     &getCurFPFeatures() { return CurFPFeatures; }
1690
1691  DiagnosticsEngine &getDiagnostics() const { return Diags; }
1692  SourceManager &getSourceManager() const { return SourceMgr; }
1693  Preprocessor &getPreprocessor() const { return PP; }
1694  ASTContext &getASTContext() const { return Context; }
1695  ASTConsumer &getASTConsumer() const { return Consumer; }
1696  ASTMutationListener *getASTMutationListener() const;
1697  ExternalSemaSource *getExternalSource() const { return ExternalSource.get(); }
1698
1699  DarwinSDKInfo *getDarwinSDKInfoForAvailabilityChecking(SourceLocation Loc,
1700                                                         StringRef Platform);
1701  DarwinSDKInfo *getDarwinSDKInfoForAvailabilityChecking();
1702
1703  ///Registers an external source. If an external source already exists,
1704  /// creates a multiplex external source and appends to it.
1705  ///
1706  ///\param[in] E - A non-null external sema source.
1707  ///
1708  void addExternalSource(ExternalSemaSource *E);
1709
1710  void PrintStats() const;
1711
1712  /// Warn that the stack is nearly exhausted.
1713  void warnStackExhausted(SourceLocation Loc);
1714
1715  /// Run some code with "sufficient" stack space. (Currently, at least 256K is
1716  /// guaranteed). Produces a warning if we're low on stack space and allocates
1717  /// more in that case. Use this in code that may recurse deeply (for example,
1718  /// in template instantiation) to avoid stack overflow.
1719  void runWithSufficientStackSpace(SourceLocation Loc,
1720                                   llvm::function_ref<void()> Fn);
1721
1722  /// Helper class that creates diagnostics with optional
1723  /// template instantiation stacks.
1724  ///
1725  /// This class provides a wrapper around the basic DiagnosticBuilder
1726  /// class that emits diagnostics. ImmediateDiagBuilder is
1727  /// responsible for emitting the diagnostic (as DiagnosticBuilder
1728  /// does) and, if the diagnostic comes from inside a template
1729  /// instantiation, printing the template instantiation stack as
1730  /// well.
1731  class ImmediateDiagBuilder : public DiagnosticBuilder {
1732    Sema &SemaRef;
1733    unsigned DiagID;
1734
1735  public:
1736    ImmediateDiagBuilder(DiagnosticBuilder &DB, Sema &SemaRef, unsigned DiagID)
1737        : DiagnosticBuilder(DB), SemaRef(SemaRef), DiagID(DiagID) {}
1738    ImmediateDiagBuilder(DiagnosticBuilder &&DB, Sema &SemaRef, unsigned DiagID)
1739        : DiagnosticBuilder(DB), SemaRef(SemaRef), DiagID(DiagID) {}
1740
1741    // This is a cunning lie. DiagnosticBuilder actually performs move
1742    // construction in its copy constructor (but due to varied uses, it's not
1743    // possible to conveniently express this as actual move construction). So
1744    // the default copy ctor here is fine, because the base class disables the
1745    // source anyway, so the user-defined ~ImmediateDiagBuilder is a safe no-op
1746    // in that case anwyay.
1747    ImmediateDiagBuilder(const ImmediateDiagBuilder &) = default;
1748
1749    ~ImmediateDiagBuilder() {
1750      // If we aren't active, there is nothing to do.
1751      if (!isActive()) return;
1752
1753      // Otherwise, we need to emit the diagnostic. First clear the diagnostic
1754      // builder itself so it won't emit the diagnostic in its own destructor.
1755      //
1756      // This seems wasteful, in that as written the DiagnosticBuilder dtor will
1757      // do its own needless checks to see if the diagnostic needs to be
1758      // emitted. However, because we take care to ensure that the builder
1759      // objects never escape, a sufficiently smart compiler will be able to
1760      // eliminate that code.
1761      Clear();
1762
1763      // Dispatch to Sema to emit the diagnostic.
1764      SemaRef.EmitCurrentDiagnostic(DiagID);
1765    }
1766
1767    /// Teach operator<< to produce an object of the correct type.
1768    template <typename T>
1769    friend const ImmediateDiagBuilder &
1770    operator<<(const ImmediateDiagBuilder &Diag, const T &Value) {
1771      const DiagnosticBuilder &BaseDiag = Diag;
1772      BaseDiag << Value;
1773      return Diag;
1774    }
1775
1776    // It is necessary to limit this to rvalue reference to avoid calling this
1777    // function with a bitfield lvalue argument since non-const reference to
1778    // bitfield is not allowed.
1779    template <typename T,
1780              typename = std::enable_if_t<!std::is_lvalue_reference<T>::value>>
1781    const ImmediateDiagBuilder &operator<<(T &&V) const {
1782      const DiagnosticBuilder &BaseDiag = *this;
1783      BaseDiag << std::move(V);
1784      return *this;
1785    }
1786  };
1787
1788  /// A generic diagnostic builder for errors which may or may not be deferred.
1789  ///
1790  /// In CUDA, there exist constructs (e.g. variable-length arrays, try/catch)
1791  /// which are not allowed to appear inside __device__ functions and are
1792  /// allowed to appear in __host__ __device__ functions only if the host+device
1793  /// function is never codegen'ed.
1794  ///
1795  /// To handle this, we use the notion of "deferred diagnostics", where we
1796  /// attach a diagnostic to a FunctionDecl that's emitted iff it's codegen'ed.
1797  ///
1798  /// This class lets you emit either a regular diagnostic, a deferred
1799  /// diagnostic, or no diagnostic at all, according to an argument you pass to
1800  /// its constructor, thus simplifying the process of creating these "maybe
1801  /// deferred" diagnostics.
1802  class SemaDiagnosticBuilder {
1803  public:
1804    enum Kind {
1805      /// Emit no diagnostics.
1806      K_Nop,
1807      /// Emit the diagnostic immediately (i.e., behave like Sema::Diag()).
1808      K_Immediate,
1809      /// Emit the diagnostic immediately, and, if it's a warning or error, also
1810      /// emit a call stack showing how this function can be reached by an a
1811      /// priori known-emitted function.
1812      K_ImmediateWithCallStack,
1813      /// Create a deferred diagnostic, which is emitted only if the function
1814      /// it's attached to is codegen'ed.  Also emit a call stack as with
1815      /// K_ImmediateWithCallStack.
1816      K_Deferred
1817    };
1818
1819    SemaDiagnosticBuilder(Kind K, SourceLocation Loc, unsigned DiagID,
1820                          const FunctionDecl *Fn, Sema &S);
1821    SemaDiagnosticBuilder(SemaDiagnosticBuilder &&D);
1822    SemaDiagnosticBuilder(const SemaDiagnosticBuilder &) = default;
1823
1824    // The copy and move assignment operator is defined as deleted pending
1825    // further motivation.
1826    SemaDiagnosticBuilder &operator=(const SemaDiagnosticBuilder &) = delete;
1827    SemaDiagnosticBuilder &operator=(SemaDiagnosticBuilder &&) = delete;
1828
1829    ~SemaDiagnosticBuilder();
1830
1831    bool isImmediate() const { return ImmediateDiag.has_value(); }
1832
1833    /// Convertible to bool: True if we immediately emitted an error, false if
1834    /// we didn't emit an error or we created a deferred error.
1835    ///
1836    /// Example usage:
1837    ///
1838    ///   if (SemaDiagnosticBuilder(...) << foo << bar)
1839    ///     return ExprError();
1840    ///
1841    /// But see CUDADiagIfDeviceCode() and CUDADiagIfHostCode() -- you probably
1842    /// want to use these instead of creating a SemaDiagnosticBuilder yourself.
1843    operator bool() const { return isImmediate(); }
1844
1845    template <typename T>
1846    friend const SemaDiagnosticBuilder &
1847    operator<<(const SemaDiagnosticBuilder &Diag, const T &Value) {
1848      if (Diag.ImmediateDiag)
1849        *Diag.ImmediateDiag << Value;
1850      else if (Diag.PartialDiagId)
1851        Diag.S.DeviceDeferredDiags[Diag.Fn][*Diag.PartialDiagId].second
1852            << Value;
1853      return Diag;
1854    }
1855
1856    // It is necessary to limit this to rvalue reference to avoid calling this
1857    // function with a bitfield lvalue argument since non-const reference to
1858    // bitfield is not allowed.
1859    template <typename T,
1860              typename = std::enable_if_t<!std::is_lvalue_reference<T>::value>>
1861    const SemaDiagnosticBuilder &operator<<(T &&V) const {
1862      if (ImmediateDiag)
1863        *ImmediateDiag << std::move(V);
1864      else if (PartialDiagId)
1865        S.DeviceDeferredDiags[Fn][*PartialDiagId].second << std::move(V);
1866      return *this;
1867    }
1868
1869    friend const SemaDiagnosticBuilder &
1870    operator<<(const SemaDiagnosticBuilder &Diag, const PartialDiagnostic &PD) {
1871      if (Diag.ImmediateDiag)
1872        PD.Emit(*Diag.ImmediateDiag);
1873      else if (Diag.PartialDiagId)
1874        Diag.S.DeviceDeferredDiags[Diag.Fn][*Diag.PartialDiagId].second = PD;
1875      return Diag;
1876    }
1877
1878    void AddFixItHint(const FixItHint &Hint) const {
1879      if (ImmediateDiag)
1880        ImmediateDiag->AddFixItHint(Hint);
1881      else if (PartialDiagId)
1882        S.DeviceDeferredDiags[Fn][*PartialDiagId].second.AddFixItHint(Hint);
1883    }
1884
1885    friend ExprResult ExprError(const SemaDiagnosticBuilder &) {
1886      return ExprError();
1887    }
1888    friend StmtResult StmtError(const SemaDiagnosticBuilder &) {
1889      return StmtError();
1890    }
1891    operator ExprResult() const { return ExprError(); }
1892    operator StmtResult() const { return StmtError(); }
1893    operator TypeResult() const { return TypeError(); }
1894    operator DeclResult() const { return DeclResult(true); }
1895    operator MemInitResult() const { return MemInitResult(true); }
1896
1897  private:
1898    Sema &S;
1899    SourceLocation Loc;
1900    unsigned DiagID;
1901    const FunctionDecl *Fn;
1902    bool ShowCallStack;
1903
1904    // Invariant: At most one of these Optionals has a value.
1905    // FIXME: Switch these to a Variant once that exists.
1906    std::optional<ImmediateDiagBuilder> ImmediateDiag;
1907    std::optional<unsigned> PartialDiagId;
1908  };
1909
1910  /// Is the last error level diagnostic immediate. This is used to determined
1911  /// whether the next info diagnostic should be immediate.
1912  bool IsLastErrorImmediate = true;
1913
1914  /// Emit a diagnostic.
1915  SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID,
1916                             bool DeferHint = false);
1917
1918  /// Emit a partial diagnostic.
1919  SemaDiagnosticBuilder Diag(SourceLocation Loc, const PartialDiagnostic &PD,
1920                             bool DeferHint = false);
1921
1922  /// Build a partial diagnostic.
1923  PartialDiagnostic PDiag(unsigned DiagID = 0); // in SemaInternal.h
1924
1925  /// Whether deferrable diagnostics should be deferred.
1926  bool DeferDiags = false;
1927
1928  /// RAII class to control scope of DeferDiags.
1929  class DeferDiagsRAII {
1930    Sema &S;
1931    bool SavedDeferDiags = false;
1932
1933  public:
1934    DeferDiagsRAII(Sema &S, bool DeferDiags)
1935        : S(S), SavedDeferDiags(S.DeferDiags) {
1936      S.DeferDiags = DeferDiags;
1937    }
1938    ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
1939  };
1940
1941  /// Whether uncompilable error has occurred. This includes error happens
1942  /// in deferred diagnostics.
1943  bool hasUncompilableErrorOccurred() const;
1944
1945  bool findMacroSpelling(SourceLocation &loc, StringRef name);
1946
1947  /// Get a string to suggest for zero-initialization of a type.
1948  std::string
1949  getFixItZeroInitializerForType(QualType T, SourceLocation Loc) const;
1950  std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
1951
1952  /// Calls \c Lexer::getLocForEndOfToken()
1953  SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
1954
1955  /// Retrieve the module loader associated with the preprocessor.
1956  ModuleLoader &getModuleLoader() const;
1957
1958  /// Invent a new identifier for parameters of abbreviated templates.
1959  IdentifierInfo *
1960  InventAbbreviatedTemplateParameterTypeName(IdentifierInfo *ParamName,
1961                                             unsigned Index);
1962
1963  void emitAndClearUnusedLocalTypedefWarnings();
1964
1965  private:
1966    /// Function or variable declarations to be checked for whether the deferred
1967    /// diagnostics should be emitted.
1968    llvm::SmallSetVector<Decl *, 4> DeclsToCheckForDeferredDiags;
1969
1970  public:
1971  // Emit all deferred diagnostics.
1972  void emitDeferredDiags();
1973
1974  enum TUFragmentKind {
1975    /// The global module fragment, between 'module;' and a module-declaration.
1976    Global,
1977    /// A normal translation unit fragment. For a non-module unit, this is the
1978    /// entire translation unit. Otherwise, it runs from the module-declaration
1979    /// to the private-module-fragment (if any) or the end of the TU (if not).
1980    Normal,
1981    /// The private module fragment, between 'module :private;' and the end of
1982    /// the translation unit.
1983    Private
1984  };
1985
1986  void ActOnStartOfTranslationUnit();
1987  void ActOnEndOfTranslationUnit();
1988  void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind);
1989
1990  void CheckDelegatingCtorCycles();
1991
1992  Scope *getScopeForContext(DeclContext *Ctx);
1993
1994  void PushFunctionScope();
1995  void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1996  sema::LambdaScopeInfo *PushLambdaScope();
1997
1998  /// This is used to inform Sema what the current TemplateParameterDepth
1999  /// is during Parsing.  Currently it is used to pass on the depth
2000  /// when parsing generic lambda 'auto' parameters.
2001  void RecordParsingTemplateParameterDepth(unsigned Depth);
2002
2003  void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
2004                               RecordDecl *RD, CapturedRegionKind K,
2005                               unsigned OpenMPCaptureLevel = 0);
2006
2007  /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
2008  /// time after they've been popped.
2009  class PoppedFunctionScopeDeleter {
2010    Sema *Self;
2011
2012  public:
2013    explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
2014    void operator()(sema::FunctionScopeInfo *Scope) const;
2015  };
2016
2017  using PoppedFunctionScopePtr =
2018      std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
2019
2020  PoppedFunctionScopePtr
2021  PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP = nullptr,
2022                       const Decl *D = nullptr,
2023                       QualType BlockType = QualType());
2024
2025  sema::FunctionScopeInfo *getCurFunction() const {
2026    return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
2027  }
2028
2029  sema::FunctionScopeInfo *getEnclosingFunction() const;
2030
2031  void setFunctionHasBranchIntoScope();
2032  void setFunctionHasBranchProtectedScope();
2033  void setFunctionHasIndirectGoto();
2034  void setFunctionHasMustTail();
2035
2036  void PushCompoundScope(bool IsStmtExpr);
2037  void PopCompoundScope();
2038
2039  sema::CompoundScopeInfo &getCurCompoundScope() const;
2040
2041  bool hasAnyUnrecoverableErrorsInThisFunction() const;
2042
2043  /// Retrieve the current block, if any.
2044  sema::BlockScopeInfo *getCurBlock();
2045
2046  /// Get the innermost lambda enclosing the current location, if any. This
2047  /// looks through intervening non-lambda scopes such as local functions and
2048  /// blocks.
2049  sema::LambdaScopeInfo *getEnclosingLambda() const;
2050
2051  /// Retrieve the current lambda scope info, if any.
2052  /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
2053  /// lambda scope info ignoring all inner capturing scopes that are not
2054  /// lambda scopes.
2055  sema::LambdaScopeInfo *
2056  getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
2057
2058  /// Retrieve the current generic lambda info, if any.
2059  sema::LambdaScopeInfo *getCurGenericLambda();
2060
2061  /// Retrieve the current captured region, if any.
2062  sema::CapturedRegionScopeInfo *getCurCapturedRegion();
2063
2064  /// Retrieve the current function, if any, that should be analyzed for
2065  /// potential availability violations.
2066  sema::FunctionScopeInfo *getCurFunctionAvailabilityContext();
2067
2068  /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
2069  SmallVectorImpl<Decl *> &WeakTopLevelDecls() { return WeakTopLevelDecl; }
2070
2071  /// Called before parsing a function declarator belonging to a function
2072  /// declaration.
2073  void ActOnStartFunctionDeclarationDeclarator(Declarator &D,
2074                                               unsigned TemplateParameterDepth);
2075
2076  /// Called after parsing a function declarator belonging to a function
2077  /// declaration.
2078  void ActOnFinishFunctionDeclarationDeclarator(Declarator &D);
2079
2080  void ActOnComment(SourceRange Comment);
2081
2082  //===--------------------------------------------------------------------===//
2083  // Type Analysis / Processing: SemaType.cpp.
2084  //
2085
2086  QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs,
2087                              const DeclSpec *DS = nullptr);
2088  QualType BuildQualifiedType(QualType T, SourceLocation Loc, unsigned CVRA,
2089                              const DeclSpec *DS = nullptr);
2090  QualType BuildPointerType(QualType T,
2091                            SourceLocation Loc, DeclarationName Entity);
2092  QualType BuildReferenceType(QualType T, bool LValueRef,
2093                              SourceLocation Loc, DeclarationName Entity);
2094  QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize,
2095                          unsigned Quals, SourceRange Brackets,
2096                          DeclarationName Entity);
2097  QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc);
2098  QualType BuildExtVectorType(QualType T, Expr *ArraySize,
2099                              SourceLocation AttrLoc);
2100  QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
2101                           SourceLocation AttrLoc);
2102
2103  QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
2104                                 SourceLocation AttrLoc);
2105
2106  /// Same as above, but constructs the AddressSpace index if not provided.
2107  QualType BuildAddressSpaceAttr(QualType &T, Expr *AddrSpace,
2108                                 SourceLocation AttrLoc);
2109
2110  CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
2111  bool CheckRebuiltStmtAttributes(ArrayRef<const Attr *> Attrs);
2112
2113  bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc);
2114
2115  bool CheckFunctionReturnType(QualType T, SourceLocation Loc);
2116
2117  /// Check an argument list for placeholders that we won't try to
2118  /// handle later.
2119  bool CheckArgsForPlaceholders(MultiExprArg args);
2120
2121  /// Build a function type.
2122  ///
2123  /// This routine checks the function type according to C++ rules and
2124  /// under the assumption that the result type and parameter types have
2125  /// just been instantiated from a template. It therefore duplicates
2126  /// some of the behavior of GetTypeForDeclarator, but in a much
2127  /// simpler form that is only suitable for this narrow use case.
2128  ///
2129  /// \param T The return type of the function.
2130  ///
2131  /// \param ParamTypes The parameter types of the function. This array
2132  /// will be modified to account for adjustments to the types of the
2133  /// function parameters.
2134  ///
2135  /// \param Loc The location of the entity whose type involves this
2136  /// function type or, if there is no such entity, the location of the
2137  /// type that will have function type.
2138  ///
2139  /// \param Entity The name of the entity that involves the function
2140  /// type, if known.
2141  ///
2142  /// \param EPI Extra information about the function type. Usually this will
2143  /// be taken from an existing function with the same prototype.
2144  ///
2145  /// \returns A suitable function type, if there are no errors. The
2146  /// unqualified type will always be a FunctionProtoType.
2147  /// Otherwise, returns a NULL type.
2148  QualType BuildFunctionType(QualType T,
2149                             MutableArrayRef<QualType> ParamTypes,
2150                             SourceLocation Loc, DeclarationName Entity,
2151                             const FunctionProtoType::ExtProtoInfo &EPI);
2152
2153  QualType BuildMemberPointerType(QualType T, QualType Class,
2154                                  SourceLocation Loc,
2155                                  DeclarationName Entity);
2156  QualType BuildBlockPointerType(QualType T,
2157                                 SourceLocation Loc, DeclarationName Entity);
2158  QualType BuildParenType(QualType T);
2159  QualType BuildAtomicType(QualType T, SourceLocation Loc);
2160  QualType BuildReadPipeType(QualType T,
2161                         SourceLocation Loc);
2162  QualType BuildWritePipeType(QualType T,
2163                         SourceLocation Loc);
2164  QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
2165
2166  TypeSourceInfo *GetTypeForDeclarator(Declarator &D);
2167  TypeSourceInfo *GetTypeForDeclaratorCast(Declarator &D, QualType FromTy);
2168
2169  /// Package the given type and TSI into a ParsedType.
2170  ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo);
2171  DeclarationNameInfo GetNameForDeclarator(Declarator &D);
2172  DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name);
2173  static QualType GetTypeFromParser(ParsedType Ty,
2174                                    TypeSourceInfo **TInfo = nullptr);
2175  CanThrowResult canThrow(const Stmt *E);
2176  /// Determine whether the callee of a particular function call can throw.
2177  /// E, D and Loc are all optional.
2178  static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
2179                                       SourceLocation Loc = SourceLocation());
2180  const FunctionProtoType *ResolveExceptionSpec(SourceLocation Loc,
2181                                                const FunctionProtoType *FPT);
2182  void UpdateExceptionSpec(FunctionDecl *FD,
2183                           const FunctionProtoType::ExceptionSpecInfo &ESI);
2184  bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range);
2185  bool CheckDistantExceptionSpec(QualType T);
2186  bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New);
2187  bool CheckEquivalentExceptionSpec(
2188      const FunctionProtoType *Old, SourceLocation OldLoc,
2189      const FunctionProtoType *New, SourceLocation NewLoc);
2190  bool CheckEquivalentExceptionSpec(
2191      const PartialDiagnostic &DiagID, const PartialDiagnostic & NoteID,
2192      const FunctionProtoType *Old, SourceLocation OldLoc,
2193      const FunctionProtoType *New, SourceLocation NewLoc);
2194  bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
2195  bool CheckExceptionSpecSubset(
2196      const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
2197      const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
2198      const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
2199      SourceLocation SuperLoc, const FunctionProtoType *Subset,
2200      bool SkipSubsetFirstParameter, SourceLocation SubLoc);
2201  bool CheckParamExceptionSpec(
2202      const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
2203      const FunctionProtoType *Target, bool SkipTargetFirstParameter,
2204      SourceLocation TargetLoc, const FunctionProtoType *Source,
2205      bool SkipSourceFirstParameter, SourceLocation SourceLoc);
2206
2207  TypeResult ActOnTypeName(Declarator &D);
2208
2209  /// The parser has parsed the context-sensitive type 'instancetype'
2210  /// in an Objective-C message declaration. Return the appropriate type.
2211  ParsedType ActOnObjCInstanceType(SourceLocation Loc);
2212
2213  /// Abstract class used to diagnose incomplete types.
2214  struct TypeDiagnoser {
2215    TypeDiagnoser() {}
2216
2217    virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
2218    virtual ~TypeDiagnoser() {}
2219  };
2220
2221  static int getPrintable(int I) { return I; }
2222  static unsigned getPrintable(unsigned I) { return I; }
2223  static bool getPrintable(bool B) { return B; }
2224  static const char * getPrintable(const char *S) { return S; }
2225  static StringRef getPrintable(StringRef S) { return S; }
2226  static const std::string &getPrintable(const std::string &S) { return S; }
2227  static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
2228    return II;
2229  }
2230  static DeclarationName getPrintable(DeclarationName N) { return N; }
2231  static QualType getPrintable(QualType T) { return T; }
2232  static SourceRange getPrintable(SourceRange R) { return R; }
2233  static SourceRange getPrintable(SourceLocation L) { return L; }
2234  static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
2235  static SourceRange getPrintable(TypeLoc TL) { return TL.getSourceRange();}
2236
2237  template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
2238  protected:
2239    unsigned DiagID;
2240    std::tuple<const Ts &...> Args;
2241
2242    template <std::size_t... Is>
2243    void emit(const SemaDiagnosticBuilder &DB,
2244              std::index_sequence<Is...>) const {
2245      // Apply all tuple elements to the builder in order.
2246      bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
2247      (void)Dummy;
2248    }
2249
2250  public:
2251    BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
2252        : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
2253      assert(DiagID != 0 && "no diagnostic for type diagnoser");
2254    }
2255
2256    void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
2257      const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
2258      emit(DB, std::index_sequence_for<Ts...>());
2259      DB << T;
2260    }
2261  };
2262
2263  /// Do a check to make sure \p Name looks like a legal argument for the
2264  /// swift_name attribute applied to decl \p D.  Raise a diagnostic if the name
2265  /// is invalid for the given declaration.
2266  ///
2267  /// \p AL is used to provide caret diagnostics in case of a malformed name.
2268  ///
2269  /// \returns true if the name is a valid swift name for \p D, false otherwise.
2270  bool DiagnoseSwiftName(Decl *D, StringRef Name, SourceLocation Loc,
2271                         const ParsedAttr &AL, bool IsAsync);
2272
2273  /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
2274  /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
2275  /// For example, a diagnostic with no other parameters would generally have
2276  /// the form "...%select{incomplete|sizeless}0 type %1...".
2277  template <typename... Ts>
2278  class SizelessTypeDiagnoser : public BoundTypeDiagnoser<Ts...> {
2279  public:
2280    SizelessTypeDiagnoser(unsigned DiagID, const Ts &... Args)
2281        : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
2282
2283    void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
2284      const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
2285      this->emit(DB, std::index_sequence_for<Ts...>());
2286      DB << T->isSizelessType() << T;
2287    }
2288  };
2289
2290  enum class CompleteTypeKind {
2291    /// Apply the normal rules for complete types.  In particular,
2292    /// treat all sizeless types as incomplete.
2293    Normal,
2294
2295    /// Relax the normal rules for complete types so that they include
2296    /// sizeless built-in types.
2297    AcceptSizeless,
2298
2299    // FIXME: Eventually we should flip the default to Normal and opt in
2300    // to AcceptSizeless rather than opt out of it.
2301    Default = AcceptSizeless
2302  };
2303
2304  enum class AcceptableKind { Visible, Reachable };
2305
2306private:
2307  /// Methods for marking which expressions involve dereferencing a pointer
2308  /// marked with the 'noderef' attribute. Expressions are checked bottom up as
2309  /// they are parsed, meaning that a noderef pointer may not be accessed. For
2310  /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
2311  /// `*p`, but need to check that `address of` is called on it. This requires
2312  /// keeping a container of all pending expressions and checking if the address
2313  /// of them are eventually taken.
2314  void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
2315  void CheckAddressOfNoDeref(const Expr *E);
2316  void CheckMemberAccessOfNoDeref(const MemberExpr *E);
2317
2318  bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
2319                               CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
2320
2321  struct ModuleScope {
2322    SourceLocation BeginLoc;
2323    clang::Module *Module = nullptr;
2324    VisibleModuleSet OuterVisibleModules;
2325  };
2326  /// The modules we're currently parsing.
2327  llvm::SmallVector<ModuleScope, 16> ModuleScopes;
2328
2329  /// For an interface unit, this is the implicitly imported interface unit.
2330  clang::Module *ThePrimaryInterface = nullptr;
2331
2332  /// The explicit global module fragment of the current translation unit.
2333  /// The explicit Global Module Fragment, as specified in C++
2334  /// [module.global.frag].
2335  clang::Module *TheGlobalModuleFragment = nullptr;
2336
2337  /// The implicit global module fragments of the current translation unit.
2338  ///
2339  /// The contents in the implicit global module fragment can't be discarded.
2340  clang::Module *TheImplicitGlobalModuleFragment = nullptr;
2341
2342  /// Namespace definitions that we will export when they finish.
2343  llvm::SmallPtrSet<const NamespaceDecl*, 8> DeferredExportedNamespaces;
2344
2345  /// In a C++ standard module, inline declarations require a definition to be
2346  /// present at the end of a definition domain.  This set holds the decls to
2347  /// be checked at the end of the TU.
2348  llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
2349
2350  /// Helper function to judge if we are in module purview.
2351  /// Return false if we are not in a module.
2352  bool isCurrentModulePurview() const;
2353
2354  /// Enter the scope of the explicit global module fragment.
2355  Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
2356  /// Leave the scope of the explicit global module fragment.
2357  void PopGlobalModuleFragment();
2358
2359  /// Enter the scope of an implicit global module fragment.
2360  Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
2361  /// Leave the scope of an implicit global module fragment.
2362  void PopImplicitGlobalModuleFragment();
2363
2364  VisibleModuleSet VisibleModules;
2365
2366  /// Cache for module units which is usable for current module.
2367  llvm::DenseSet<const Module *> UsableModuleUnitsCache;
2368
2369  bool isUsableModule(const Module *M);
2370
2371  bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
2372
2373public:
2374  /// Get the module unit whose scope we are currently within.
2375  Module *getCurrentModule() const {
2376    return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
2377  }
2378
2379  /// Is the module scope we are an implementation unit?
2380  bool currentModuleIsImplementation() const {
2381    return ModuleScopes.empty()
2382               ? false
2383               : ModuleScopes.back().Module->isModuleImplementation();
2384  }
2385
2386  /// Is the module scope we are in a C++ Header Unit?
2387  bool currentModuleIsHeaderUnit() const {
2388    return ModuleScopes.empty() ? false
2389                                : ModuleScopes.back().Module->isHeaderUnit();
2390  }
2391
2392  /// Get the module owning an entity.
2393  Module *getOwningModule(const Decl *Entity) {
2394    return Entity->getOwningModule();
2395  }
2396
2397  /// Make a merged definition of an existing hidden definition \p ND
2398  /// visible at the specified location.
2399  void makeMergedDefinitionVisible(NamedDecl *ND);
2400
2401  bool isModuleVisible(const Module *M, bool ModulePrivate = false);
2402
2403  // When loading a non-modular PCH files, this is used to restore module
2404  // visibility.
2405  void makeModuleVisible(Module *Mod, SourceLocation ImportLoc) {
2406    VisibleModules.setVisible(Mod, ImportLoc);
2407  }
2408
2409  /// Determine whether a declaration is visible to name lookup.
2410  bool isVisible(const NamedDecl *D) {
2411    return D->isUnconditionallyVisible() ||
2412           isAcceptableSlow(D, AcceptableKind::Visible);
2413  }
2414
2415  /// Determine whether a declaration is reachable.
2416  bool isReachable(const NamedDecl *D) {
2417    // All visible declarations are reachable.
2418    return D->isUnconditionallyVisible() ||
2419           isAcceptableSlow(D, AcceptableKind::Reachable);
2420  }
2421
2422  /// Determine whether a declaration is acceptable (visible/reachable).
2423  bool isAcceptable(const NamedDecl *D, AcceptableKind Kind) {
2424    return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
2425  }
2426
2427  /// Determine whether any declaration of an entity is visible.
2428  bool
2429  hasVisibleDeclaration(const NamedDecl *D,
2430                        llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
2431    return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
2432  }
2433
2434  bool hasVisibleDeclarationSlow(const NamedDecl *D,
2435                                 llvm::SmallVectorImpl<Module *> *Modules);
2436  /// Determine whether any declaration of an entity is reachable.
2437  bool
2438  hasReachableDeclaration(const NamedDecl *D,
2439                          llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
2440    return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
2441  }
2442  bool hasReachableDeclarationSlow(
2443      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2444
2445  bool hasVisibleMergedDefinition(const NamedDecl *Def);
2446  bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def);
2447
2448  /// Determine if \p D and \p Suggested have a structurally compatible
2449  /// layout as described in C11 6.2.7/1.
2450  bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
2451
2452  /// Determine if \p D has a visible definition. If not, suggest a declaration
2453  /// that should be made visible to expose the definition.
2454  bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
2455                            bool OnlyNeedComplete = false);
2456  bool hasVisibleDefinition(const NamedDecl *D) {
2457    NamedDecl *Hidden;
2458    return hasVisibleDefinition(const_cast<NamedDecl*>(D), &Hidden);
2459  }
2460
2461  /// Determine if \p D has a reachable definition. If not, suggest a
2462  /// declaration that should be made reachable to expose the definition.
2463  bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
2464                              bool OnlyNeedComplete = false);
2465  bool hasReachableDefinition(NamedDecl *D) {
2466    NamedDecl *Hidden;
2467    return hasReachableDefinition(D, &Hidden);
2468  }
2469
2470  bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
2471                               AcceptableKind Kind,
2472                               bool OnlyNeedComplete = false);
2473  bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind) {
2474    NamedDecl *Hidden;
2475    return hasAcceptableDefinition(D, &Hidden, Kind);
2476  }
2477
2478  /// Determine if the template parameter \p D has a visible default argument.
2479  bool
2480  hasVisibleDefaultArgument(const NamedDecl *D,
2481                            llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2482  /// Determine if the template parameter \p D has a reachable default argument.
2483  bool hasReachableDefaultArgument(
2484      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2485  /// Determine if the template parameter \p D has a reachable default argument.
2486  bool hasAcceptableDefaultArgument(const NamedDecl *D,
2487                                    llvm::SmallVectorImpl<Module *> *Modules,
2488                                    Sema::AcceptableKind Kind);
2489
2490  /// Determine if there is a visible declaration of \p D that is an explicit
2491  /// specialization declaration for a specialization of a template. (For a
2492  /// member specialization, use hasVisibleMemberSpecialization.)
2493  bool hasVisibleExplicitSpecialization(
2494      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2495  /// Determine if there is a reachable declaration of \p D that is an explicit
2496  /// specialization declaration for a specialization of a template. (For a
2497  /// member specialization, use hasReachableMemberSpecialization.)
2498  bool hasReachableExplicitSpecialization(
2499      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2500
2501  /// Determine if there is a visible declaration of \p D that is a member
2502  /// specialization declaration (as opposed to an instantiated declaration).
2503  bool hasVisibleMemberSpecialization(
2504      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2505  /// Determine if there is a reachable declaration of \p D that is a member
2506  /// specialization declaration (as opposed to an instantiated declaration).
2507  bool hasReachableMemberSpecialization(
2508      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
2509
2510  /// Determine if \p A and \p B are equivalent internal linkage declarations
2511  /// from different modules, and thus an ambiguity error can be downgraded to
2512  /// an extension warning.
2513  bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
2514                                              const NamedDecl *B);
2515  void diagnoseEquivalentInternalLinkageDeclarations(
2516      SourceLocation Loc, const NamedDecl *D,
2517      ArrayRef<const NamedDecl *> Equiv);
2518
2519  bool isUsualDeallocationFunction(const CXXMethodDecl *FD);
2520
2521  // Check whether the size of array element of type \p EltTy is a multiple of
2522  // its alignment and return false if it isn't.
2523  bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc);
2524
2525  bool isCompleteType(SourceLocation Loc, QualType T,
2526                      CompleteTypeKind Kind = CompleteTypeKind::Default) {
2527    return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
2528  }
2529  bool RequireCompleteType(SourceLocation Loc, QualType T,
2530                           CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
2531  bool RequireCompleteType(SourceLocation Loc, QualType T,
2532                           CompleteTypeKind Kind, unsigned DiagID);
2533
2534  bool RequireCompleteType(SourceLocation Loc, QualType T,
2535                           TypeDiagnoser &Diagnoser) {
2536    return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
2537  }
2538  bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
2539    return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
2540  }
2541
2542  template <typename... Ts>
2543  bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
2544                           const Ts &...Args) {
2545    BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
2546    return RequireCompleteType(Loc, T, Diagnoser);
2547  }
2548
2549  template <typename... Ts>
2550  bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID,
2551                                const Ts &... Args) {
2552    SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
2553    return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
2554  }
2555
2556  /// Get the type of expression E, triggering instantiation to complete the
2557  /// type if necessary -- that is, if the expression refers to a templated
2558  /// static data member of incomplete array type.
2559  ///
2560  /// May still return an incomplete type if instantiation was not possible or
2561  /// if the type is incomplete for a different reason. Use
2562  /// RequireCompleteExprType instead if a diagnostic is expected for an
2563  /// incomplete expression type.
2564  QualType getCompletedType(Expr *E);
2565
2566  void completeExprArrayBound(Expr *E);
2567  bool RequireCompleteExprType(Expr *E, CompleteTypeKind Kind,
2568                               TypeDiagnoser &Diagnoser);
2569  bool RequireCompleteExprType(Expr *E, unsigned DiagID);
2570
2571  template <typename... Ts>
2572  bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
2573    BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
2574    return RequireCompleteExprType(E, CompleteTypeKind::Default, Diagnoser);
2575  }
2576
2577  template <typename... Ts>
2578  bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
2579                                    const Ts &... Args) {
2580    SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
2581    return RequireCompleteExprType(E, CompleteTypeKind::Normal, Diagnoser);
2582  }
2583
2584  bool RequireLiteralType(SourceLocation Loc, QualType T,
2585                          TypeDiagnoser &Diagnoser);
2586  bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
2587
2588  template <typename... Ts>
2589  bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
2590                          const Ts &...Args) {
2591    BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
2592    return RequireLiteralType(Loc, T, Diagnoser);
2593  }
2594
2595  QualType getElaboratedType(ElaboratedTypeKeyword Keyword,
2596                             const CXXScopeSpec &SS, QualType T,
2597                             TagDecl *OwnedTagDecl = nullptr);
2598
2599  // Returns the underlying type of a decltype with the given expression.
2600  QualType getDecltypeForExpr(Expr *E);
2601
2602  QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind);
2603  /// If AsUnevaluated is false, E is treated as though it were an evaluated
2604  /// context, such as when building a type for decltype(auto).
2605  QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
2606
2607  using UTTKind = UnaryTransformType::UTTKind;
2608  QualType BuildUnaryTransformType(QualType BaseType, UTTKind UKind,
2609                                   SourceLocation Loc);
2610  QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc);
2611  QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc);
2612  QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc);
2613  QualType BuiltinDecay(QualType BaseType, SourceLocation Loc);
2614  QualType BuiltinAddReference(QualType BaseType, UTTKind UKind,
2615                               SourceLocation Loc);
2616  QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind,
2617                               SourceLocation Loc);
2618  QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind,
2619                                  SourceLocation Loc);
2620  QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind,
2621                                      SourceLocation Loc);
2622  QualType BuiltinChangeSignedness(QualType BaseType, UTTKind UKind,
2623                                   SourceLocation Loc);
2624
2625  //===--------------------------------------------------------------------===//
2626  // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
2627  //
2628
2629  struct SkipBodyInfo {
2630    SkipBodyInfo() = default;
2631    bool ShouldSkip = false;
2632    bool CheckSameAsPrevious = false;
2633    NamedDecl *Previous = nullptr;
2634    NamedDecl *New = nullptr;
2635  };
2636
2637  DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
2638
2639  void DiagnoseUseOfUnimplementedSelectors();
2640
2641  bool isSimpleTypeSpecifier(tok::TokenKind Kind) const;
2642
2643  ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
2644                         Scope *S, CXXScopeSpec *SS = nullptr,
2645                         bool isClassName = false, bool HasTrailingDot = false,
2646                         ParsedType ObjectType = nullptr,
2647                         bool IsCtorOrDtorName = false,
2648                         bool WantNontrivialTypeSourceInfo = false,
2649                         bool IsClassTemplateDeductionContext = true,
2650                         ImplicitTypenameContext AllowImplicitTypename =
2651                             ImplicitTypenameContext::No,
2652                         IdentifierInfo **CorrectedII = nullptr);
2653  TypeSpecifierType isTagName(IdentifierInfo &II, Scope *S);
2654  bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
2655  void DiagnoseUnknownTypeName(IdentifierInfo *&II,
2656                               SourceLocation IILoc,
2657                               Scope *S,
2658                               CXXScopeSpec *SS,
2659                               ParsedType &SuggestedType,
2660                               bool IsTemplateName = false);
2661
2662  /// Attempt to behave like MSVC in situations where lookup of an unqualified
2663  /// type name has failed in a dependent context. In these situations, we
2664  /// automatically form a DependentTypeName that will retry lookup in a related
2665  /// scope during instantiation.
2666  ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II,
2667                                      SourceLocation NameLoc,
2668                                      bool IsTemplateTypeArg);
2669
2670  /// Describes the result of the name lookup and resolution performed
2671  /// by \c ClassifyName().
2672  enum NameClassificationKind {
2673    /// This name is not a type or template in this context, but might be
2674    /// something else.
2675    NC_Unknown,
2676    /// Classification failed; an error has been produced.
2677    NC_Error,
2678    /// The name has been typo-corrected to a keyword.
2679    NC_Keyword,
2680    /// The name was classified as a type.
2681    NC_Type,
2682    /// The name was classified as a specific non-type, non-template
2683    /// declaration. ActOnNameClassifiedAsNonType should be called to
2684    /// convert the declaration to an expression.
2685    NC_NonType,
2686    /// The name was classified as an ADL-only function name.
2687    /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
2688    /// result to an expression.
2689    NC_UndeclaredNonType,
2690    /// The name denotes a member of a dependent type that could not be
2691    /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
2692    /// convert the result to an expression.
2693    NC_DependentNonType,
2694    /// The name was classified as an overload set, and an expression
2695    /// representing that overload set has been formed.
2696    /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
2697    /// expression referencing the overload set.
2698    NC_OverloadSet,
2699    /// The name was classified as a template whose specializations are types.
2700    NC_TypeTemplate,
2701    /// The name was classified as a variable template name.
2702    NC_VarTemplate,
2703    /// The name was classified as a function template name.
2704    NC_FunctionTemplate,
2705    /// The name was classified as an ADL-only function template name.
2706    NC_UndeclaredTemplate,
2707    /// The name was classified as a concept name.
2708    NC_Concept,
2709  };
2710
2711  class NameClassification {
2712    NameClassificationKind Kind;
2713    union {
2714      ExprResult Expr;
2715      NamedDecl *NonTypeDecl;
2716      TemplateName Template;
2717      ParsedType Type;
2718    };
2719
2720    explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
2721
2722  public:
2723    NameClassification(ParsedType Type) : Kind(NC_Type), Type(Type) {}
2724
2725    NameClassification(const IdentifierInfo *Keyword) : Kind(NC_Keyword) {}
2726
2727    static NameClassification Error() {
2728      return NameClassification(NC_Error);
2729    }
2730
2731    static NameClassification Unknown() {
2732      return NameClassification(NC_Unknown);
2733    }
2734
2735    static NameClassification OverloadSet(ExprResult E) {
2736      NameClassification Result(NC_OverloadSet);
2737      Result.Expr = E;
2738      return Result;
2739    }
2740
2741    static NameClassification NonType(NamedDecl *D) {
2742      NameClassification Result(NC_NonType);
2743      Result.NonTypeDecl = D;
2744      return Result;
2745    }
2746
2747    static NameClassification UndeclaredNonType() {
2748      return NameClassification(NC_UndeclaredNonType);
2749    }
2750
2751    static NameClassification DependentNonType() {
2752      return NameClassification(NC_DependentNonType);
2753    }
2754
2755    static NameClassification TypeTemplate(TemplateName Name) {
2756      NameClassification Result(NC_TypeTemplate);
2757      Result.Template = Name;
2758      return Result;
2759    }
2760
2761    static NameClassification VarTemplate(TemplateName Name) {
2762      NameClassification Result(NC_VarTemplate);
2763      Result.Template = Name;
2764      return Result;
2765    }
2766
2767    static NameClassification FunctionTemplate(TemplateName Name) {
2768      NameClassification Result(NC_FunctionTemplate);
2769      Result.Template = Name;
2770      return Result;
2771    }
2772
2773    static NameClassification Concept(TemplateName Name) {
2774      NameClassification Result(NC_Concept);
2775      Result.Template = Name;
2776      return Result;
2777    }
2778
2779    static NameClassification UndeclaredTemplate(TemplateName Name) {
2780      NameClassification Result(NC_UndeclaredTemplate);
2781      Result.Template = Name;
2782      return Result;
2783    }
2784
2785    NameClassificationKind getKind() const { return Kind; }
2786
2787    ExprResult getExpression() const {
2788      assert(Kind == NC_OverloadSet);
2789      return Expr;
2790    }
2791
2792    ParsedType getType() const {
2793      assert(Kind == NC_Type);
2794      return Type;
2795    }
2796
2797    NamedDecl *getNonTypeDecl() const {
2798      assert(Kind == NC_NonType);
2799      return NonTypeDecl;
2800    }
2801
2802    TemplateName getTemplateName() const {
2803      assert(Kind == NC_TypeTemplate || Kind == NC_FunctionTemplate ||
2804             Kind == NC_VarTemplate || Kind == NC_Concept ||
2805             Kind == NC_UndeclaredTemplate);
2806      return Template;
2807    }
2808
2809    TemplateNameKind getTemplateNameKind() const {
2810      switch (Kind) {
2811      case NC_TypeTemplate:
2812        return TNK_Type_template;
2813      case NC_FunctionTemplate:
2814        return TNK_Function_template;
2815      case NC_VarTemplate:
2816        return TNK_Var_template;
2817      case NC_Concept:
2818        return TNK_Concept_template;
2819      case NC_UndeclaredTemplate:
2820        return TNK_Undeclared_template;
2821      default:
2822        llvm_unreachable("unsupported name classification.");
2823      }
2824    }
2825  };
2826
2827  /// Perform name lookup on the given name, classifying it based on
2828  /// the results of name lookup and the following token.
2829  ///
2830  /// This routine is used by the parser to resolve identifiers and help direct
2831  /// parsing. When the identifier cannot be found, this routine will attempt
2832  /// to correct the typo and classify based on the resulting name.
2833  ///
2834  /// \param S The scope in which we're performing name lookup.
2835  ///
2836  /// \param SS The nested-name-specifier that precedes the name.
2837  ///
2838  /// \param Name The identifier. If typo correction finds an alternative name,
2839  /// this pointer parameter will be updated accordingly.
2840  ///
2841  /// \param NameLoc The location of the identifier.
2842  ///
2843  /// \param NextToken The token following the identifier. Used to help
2844  /// disambiguate the name.
2845  ///
2846  /// \param CCC The correction callback, if typo correction is desired.
2847  NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
2848                                  IdentifierInfo *&Name, SourceLocation NameLoc,
2849                                  const Token &NextToken,
2850                                  CorrectionCandidateCallback *CCC = nullptr);
2851
2852  /// Act on the result of classifying a name as an undeclared (ADL-only)
2853  /// non-type declaration.
2854  ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name,
2855                                                    SourceLocation NameLoc);
2856  /// Act on the result of classifying a name as an undeclared member of a
2857  /// dependent base class.
2858  ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS,
2859                                                   IdentifierInfo *Name,
2860                                                   SourceLocation NameLoc,
2861                                                   bool IsAddressOfOperand);
2862  /// Act on the result of classifying a name as a specific non-type
2863  /// declaration.
2864  ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS,
2865                                          NamedDecl *Found,
2866                                          SourceLocation NameLoc,
2867                                          const Token &NextToken);
2868  /// Act on the result of classifying a name as an overload set.
2869  ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet);
2870
2871  /// Describes the detailed kind of a template name. Used in diagnostics.
2872  enum class TemplateNameKindForDiagnostics {
2873    ClassTemplate,
2874    FunctionTemplate,
2875    VarTemplate,
2876    AliasTemplate,
2877    TemplateTemplateParam,
2878    Concept,
2879    DependentTemplate
2880  };
2881  TemplateNameKindForDiagnostics
2882  getTemplateNameKindForDiagnostics(TemplateName Name);
2883
2884  /// Determine whether it's plausible that E was intended to be a
2885  /// template-name.
2886  bool mightBeIntendedToBeTemplateName(ExprResult E, bool &Dependent) {
2887    if (!getLangOpts().CPlusPlus || E.isInvalid())
2888      return false;
2889    Dependent = false;
2890    if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
2891      return !DRE->hasExplicitTemplateArgs();
2892    if (auto *ME = dyn_cast<MemberExpr>(E.get()))
2893      return !ME->hasExplicitTemplateArgs();
2894    Dependent = true;
2895    if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
2896      return !DSDRE->hasExplicitTemplateArgs();
2897    if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
2898      return !DSME->hasExplicitTemplateArgs();
2899    // Any additional cases recognized here should also be handled by
2900    // diagnoseExprIntendedAsTemplateName.
2901    return false;
2902  }
2903  void diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName,
2904                                          SourceLocation Less,
2905                                          SourceLocation Greater);
2906
2907  void warnOnReservedIdentifier(const NamedDecl *D);
2908
2909  Decl *ActOnDeclarator(Scope *S, Declarator &D);
2910
2911  NamedDecl *HandleDeclarator(Scope *S, Declarator &D,
2912                              MultiTemplateParamsArg TemplateParameterLists);
2913  bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo,
2914                                       QualType &T, SourceLocation Loc,
2915                                       unsigned FailedFoldDiagID);
2916  void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S);
2917  bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info);
2918  bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
2919                                    DeclarationName Name, SourceLocation Loc,
2920                                    bool IsTemplateId);
2921  void
2922  diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
2923                            SourceLocation FallbackLoc,
2924                            SourceLocation ConstQualLoc = SourceLocation(),
2925                            SourceLocation VolatileQualLoc = SourceLocation(),
2926                            SourceLocation RestrictQualLoc = SourceLocation(),
2927                            SourceLocation AtomicQualLoc = SourceLocation(),
2928                            SourceLocation UnalignedQualLoc = SourceLocation());
2929
2930  static bool adjustContextForLocalExternDecl(DeclContext *&DC);
2931  void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
2932  NamedDecl *getShadowedDeclaration(const TypedefNameDecl *D,
2933                                    const LookupResult &R);
2934  NamedDecl *getShadowedDeclaration(const VarDecl *D, const LookupResult &R);
2935  NamedDecl *getShadowedDeclaration(const BindingDecl *D,
2936                                    const LookupResult &R);
2937  void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
2938                   const LookupResult &R);
2939  void CheckShadow(Scope *S, VarDecl *D);
2940
2941  /// Warn if 'E', which is an expression that is about to be modified, refers
2942  /// to a shadowing declaration.
2943  void CheckShadowingDeclModification(Expr *E, SourceLocation Loc);
2944
2945  void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI);
2946
2947private:
2948  /// Map of current shadowing declarations to shadowed declarations. Warn if
2949  /// it looks like the user is trying to modify the shadowing declaration.
2950  llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
2951
2952public:
2953  void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2954  void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
2955  void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
2956                                    TypedefNameDecl *NewTD);
2957  void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D);
2958  NamedDecl* ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
2959                                    TypeSourceInfo *TInfo,
2960                                    LookupResult &Previous);
2961  NamedDecl* ActOnTypedefNameDecl(Scope* S, DeclContext* DC, TypedefNameDecl *D,
2962                                  LookupResult &Previous, bool &Redeclaration);
2963  NamedDecl *ActOnVariableDeclarator(
2964      Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo,
2965      LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists,
2966      bool &AddToScope, ArrayRef<BindingDecl *> Bindings = std::nullopt);
2967  NamedDecl *
2968  ActOnDecompositionDeclarator(Scope *S, Declarator &D,
2969                               MultiTemplateParamsArg TemplateParamLists);
2970  void DiagPlaceholderVariableDefinition(SourceLocation Loc);
2971  bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc,
2972                                         RecordDecl *ClassDecl,
2973                                         const IdentifierInfo *Name);
2974  // Returns true if the variable declaration is a redeclaration
2975  bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
2976  void CheckVariableDeclarationType(VarDecl *NewVD);
2977  bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,
2978                                     Expr *Init);
2979  void CheckCompleteVariableDeclaration(VarDecl *VD);
2980  void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD);
2981  void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D);
2982
2983  NamedDecl* ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
2984                                     TypeSourceInfo *TInfo,
2985                                     LookupResult &Previous,
2986                                     MultiTemplateParamsArg TemplateParamLists,
2987                                     bool &AddToScope);
2988  bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
2989
2990  enum class CheckConstexprKind {
2991    /// Diagnose issues that are non-constant or that are extensions.
2992    Diagnose,
2993    /// Identify whether this function satisfies the formal rules for constexpr
2994    /// functions in the current lanugage mode (with no extensions).
2995    CheckValid
2996  };
2997
2998  bool CheckConstexprFunctionDefinition(const FunctionDecl *FD,
2999                                        CheckConstexprKind Kind);
3000
3001  void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD);
3002  void FindHiddenVirtualMethods(CXXMethodDecl *MD,
3003                          SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods);
3004  void NoteHiddenVirtualMethods(CXXMethodDecl *MD,
3005                          SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods);
3006  // Returns true if the function declaration is a redeclaration
3007  bool CheckFunctionDeclaration(Scope *S,
3008                                FunctionDecl *NewFD, LookupResult &Previous,
3009                                bool IsMemberSpecialization, bool DeclIsDefn);
3010  bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
3011  bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
3012                                      QualType NewT, QualType OldT);
3013  void CheckMain(FunctionDecl *FD, const DeclSpec &D);
3014  void CheckMSVCRTEntryPoint(FunctionDecl *FD);
3015  void ActOnHLSLTopLevelFunction(FunctionDecl *FD);
3016  void CheckHLSLEntryPoint(FunctionDecl *FD);
3017  void CheckHLSLSemanticAnnotation(FunctionDecl *EntryPoint, const Decl *Param,
3018                                   const HLSLAnnotationAttr *AnnotationAttr);
3019  void DiagnoseHLSLAttrStageMismatch(
3020      const Attr *A, HLSLShaderAttr::ShaderType Stage,
3021      std::initializer_list<HLSLShaderAttr::ShaderType> AllowedStages);
3022  Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
3023                                                   bool IsDefinition);
3024  void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
3025  Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
3026                             SourceLocation ExplicitThisLoc = {});
3027  ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC,
3028                                          SourceLocation Loc,
3029                                          QualType T);
3030  QualType AdjustParameterTypeForObjCAutoRefCount(QualType T,
3031                                                  SourceLocation NameLoc,
3032                                                  TypeSourceInfo *TSInfo);
3033  ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
3034                              SourceLocation NameLoc, IdentifierInfo *Name,
3035                              QualType T, TypeSourceInfo *TSInfo,
3036                              StorageClass SC);
3037  void ActOnParamDefaultArgument(Decl *param,
3038                                 SourceLocation EqualLoc,
3039                                 Expr *defarg);
3040  void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc,
3041                                         SourceLocation ArgLoc);
3042  void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc,
3043                                      Expr* DefaultArg);
3044  ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
3045                                         SourceLocation EqualLoc);
3046  void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
3047                               SourceLocation EqualLoc);
3048
3049  // Contexts where using non-trivial C union types can be disallowed. This is
3050  // passed to err_non_trivial_c_union_in_invalid_context.
3051  enum NonTrivialCUnionContext {
3052    // Function parameter.
3053    NTCUC_FunctionParam,
3054    // Function return.
3055    NTCUC_FunctionReturn,
3056    // Default-initialized object.
3057    NTCUC_DefaultInitializedObject,
3058    // Variable with automatic storage duration.
3059    NTCUC_AutoVar,
3060    // Initializer expression that might copy from another object.
3061    NTCUC_CopyInit,
3062    // Assignment.
3063    NTCUC_Assignment,
3064    // Compound literal.
3065    NTCUC_CompoundLiteral,
3066    // Block capture.
3067    NTCUC_BlockCapture,
3068    // lvalue-to-rvalue conversion of volatile type.
3069    NTCUC_LValueToRValueVolatile,
3070  };
3071
3072  /// Emit diagnostics if the initializer or any of its explicit or
3073  /// implicitly-generated subexpressions require copying or
3074  /// default-initializing a type that is or contains a C union type that is
3075  /// non-trivial to copy or default-initialize.
3076  void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
3077
3078  // These flags are passed to checkNonTrivialCUnion.
3079  enum NonTrivialCUnionKind {
3080    NTCUK_Init = 0x1,
3081    NTCUK_Destruct = 0x2,
3082    NTCUK_Copy = 0x4,
3083  };
3084
3085  /// Emit diagnostics if a non-trivial C union type or a struct that contains
3086  /// a non-trivial C union is used in an invalid context.
3087  void checkNonTrivialCUnion(QualType QT, SourceLocation Loc,
3088                             NonTrivialCUnionContext UseContext,
3089                             unsigned NonTrivialKind);
3090
3091  void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
3092  void ActOnUninitializedDecl(Decl *dcl);
3093  void ActOnInitializerError(Decl *Dcl);
3094
3095  void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
3096  void ActOnCXXForRangeDecl(Decl *D);
3097  StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc,
3098                                        IdentifierInfo *Ident,
3099                                        ParsedAttributes &Attrs);
3100  void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc);
3101  void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
3102  void CheckStaticLocalForDllExport(VarDecl *VD);
3103  void CheckThreadLocalForLargeAlignment(VarDecl *VD);
3104  void FinalizeDeclaration(Decl *D);
3105  DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS,
3106                                         ArrayRef<Decl *> Group);
3107  DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef<Decl *> Group);
3108
3109  /// Should be called on all declarations that might have attached
3110  /// documentation comments.
3111  void ActOnDocumentableDecl(Decl *D);
3112  void ActOnDocumentableDecls(ArrayRef<Decl *> Group);
3113
3114  enum class FnBodyKind {
3115    /// C++ [dcl.fct.def.general]p1
3116    /// function-body:
3117    ///   ctor-initializer[opt] compound-statement
3118    ///   function-try-block
3119    Other,
3120    ///   = default ;
3121    Default,
3122    ///   = delete ;
3123    Delete
3124  };
3125
3126  void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D,
3127                                       SourceLocation LocAfterDecls);
3128  void CheckForFunctionRedefinition(
3129      FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
3130      SkipBodyInfo *SkipBody = nullptr);
3131  Decl *ActOnStartOfFunctionDef(Scope *S, Declarator &D,
3132                                MultiTemplateParamsArg TemplateParamLists,
3133                                SkipBodyInfo *SkipBody = nullptr,
3134                                FnBodyKind BodyKind = FnBodyKind::Other);
3135  Decl *ActOnStartOfFunctionDef(Scope *S, Decl *D,
3136                                SkipBodyInfo *SkipBody = nullptr,
3137                                FnBodyKind BodyKind = FnBodyKind::Other);
3138  void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind);
3139  void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D);
3140  ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr);
3141  ExprResult ActOnRequiresClause(ExprResult ConstraintExpr);
3142  void ActOnStartOfObjCMethodDef(Scope *S, Decl *D);
3143  bool isObjCMethodDecl(Decl *D) {
3144    return D && isa<ObjCMethodDecl>(D);
3145  }
3146
3147  /// Determine whether we can delay parsing the body of a function or
3148  /// function template until it is used, assuming we don't care about emitting
3149  /// code for that function.
3150  ///
3151  /// This will be \c false if we may need the body of the function in the
3152  /// middle of parsing an expression (where it's impractical to switch to
3153  /// parsing a different function), for instance, if it's constexpr in C++11
3154  /// or has an 'auto' return type in C++14. These cases are essentially bugs.
3155  bool canDelayFunctionBody(const Declarator &D);
3156
3157  /// Determine whether we can skip parsing the body of a function
3158  /// definition, assuming we don't care about analyzing its body or emitting
3159  /// code for that function.
3160  ///
3161  /// This will be \c false only if we may need the body of the function in
3162  /// order to parse the rest of the program (for instance, if it is
3163  /// \c constexpr in C++11 or has an 'auto' return type in C++14).
3164  bool canSkipFunctionBody(Decl *D);
3165
3166  /// Determine whether \param D is function like (function or function
3167  /// template) for parsing.
3168  bool isDeclaratorFunctionLike(Declarator &D);
3169
3170  void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope);
3171  Decl *ActOnFinishFunctionBody(Decl *Decl, Stmt *Body);
3172  Decl *ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation);
3173  Decl *ActOnSkippedFunctionBody(Decl *Decl);
3174  void ActOnFinishInlineFunctionDef(FunctionDecl *D);
3175
3176  /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
3177  /// attribute for which parsing is delayed.
3178  void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs);
3179
3180  /// Diagnose any unused parameters in the given sequence of
3181  /// ParmVarDecl pointers.
3182  void DiagnoseUnusedParameters(ArrayRef<ParmVarDecl *> Parameters);
3183
3184  /// Diagnose whether the size of parameters or return value of a
3185  /// function or obj-c method definition is pass-by-value and larger than a
3186  /// specified threshold.
3187  void
3188  DiagnoseSizeOfParametersAndReturnValue(ArrayRef<ParmVarDecl *> Parameters,
3189                                         QualType ReturnTy, NamedDecl *D);
3190
3191  void DiagnoseInvalidJumps(Stmt *Body);
3192  Decl *ActOnFileScopeAsmDecl(Expr *expr,
3193                              SourceLocation AsmLoc,
3194                              SourceLocation RParenLoc);
3195
3196  Decl *ActOnTopLevelStmtDecl(Stmt *Statement);
3197
3198  /// Handle a C++11 empty-declaration and attribute-declaration.
3199  Decl *ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList,
3200                              SourceLocation SemiLoc);
3201
3202  enum class ModuleDeclKind {
3203    Interface,               ///< 'export module X;'
3204    Implementation,          ///< 'module X;'
3205    PartitionInterface,      ///< 'export module X:Y;'
3206    PartitionImplementation, ///< 'module X:Y;'
3207  };
3208
3209  /// An enumeration to represent the transition of states in parsing module
3210  /// fragments and imports.  If we are not parsing a C++20 TU, or we find
3211  /// an error in state transition, the state is set to NotACXX20Module.
3212  enum class ModuleImportState {
3213    FirstDecl,      ///< Parsing the first decl in a TU.
3214    GlobalFragment, ///< after 'module;' but before 'module X;'
3215    ImportAllowed,  ///< after 'module X;' but before any non-import decl.
3216    ImportFinished, ///< after any non-import decl.
3217    PrivateFragmentImportAllowed,  ///< after 'module :private;' but before any
3218                                   ///< non-import decl.
3219    PrivateFragmentImportFinished, ///< after 'module :private;' but a
3220                                   ///< non-import decl has already been seen.
3221    NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
3222  };
3223
3224private:
3225  /// The parser has begun a translation unit to be compiled as a C++20
3226  /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
3227  void HandleStartOfHeaderUnit();
3228
3229public:
3230  /// The parser has processed a module-declaration that begins the definition
3231  /// of a module interface or implementation.
3232  DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc,
3233                                 SourceLocation ModuleLoc, ModuleDeclKind MDK,
3234                                 ModuleIdPath Path, ModuleIdPath Partition,
3235                                 ModuleImportState &ImportState);
3236
3237  /// The parser has processed a global-module-fragment declaration that begins
3238  /// the definition of the global module fragment of the current module unit.
3239  /// \param ModuleLoc The location of the 'module' keyword.
3240  DeclGroupPtrTy ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc);
3241
3242  /// The parser has processed a private-module-fragment declaration that begins
3243  /// the definition of the private module fragment of the current module unit.
3244  /// \param ModuleLoc The location of the 'module' keyword.
3245  /// \param PrivateLoc The location of the 'private' keyword.
3246  DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc,
3247                                                SourceLocation PrivateLoc);
3248
3249  /// The parser has processed a module import declaration.
3250  ///
3251  /// \param StartLoc The location of the first token in the declaration. This
3252  ///        could be the location of an '@', 'export', or 'import'.
3253  /// \param ExportLoc The location of the 'export' keyword, if any.
3254  /// \param ImportLoc The location of the 'import' keyword.
3255  /// \param Path The module toplevel name as an access path.
3256  /// \param IsPartition If the name is for a partition.
3257  DeclResult ActOnModuleImport(SourceLocation StartLoc,
3258                               SourceLocation ExportLoc,
3259                               SourceLocation ImportLoc, ModuleIdPath Path,
3260                               bool IsPartition = false);
3261  DeclResult ActOnModuleImport(SourceLocation StartLoc,
3262                               SourceLocation ExportLoc,
3263                               SourceLocation ImportLoc, Module *M,
3264                               ModuleIdPath Path = {});
3265
3266  /// The parser has processed a module import translated from a
3267  /// #include or similar preprocessing directive.
3268  void ActOnModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
3269  void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
3270
3271  /// The parsed has entered a submodule.
3272  void ActOnModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
3273  /// The parser has left a submodule.
3274  void ActOnModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
3275
3276  /// Create an implicit import of the given module at the given
3277  /// source location, for error recovery, if possible.
3278  ///
3279  /// This routine is typically used when an entity found by name lookup
3280  /// is actually hidden within a module that we know about but the user
3281  /// has forgotten to import.
3282  void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
3283                                                  Module *Mod);
3284
3285  /// Kinds of missing import. Note, the values of these enumerators correspond
3286  /// to %select values in diagnostics.
3287  enum class MissingImportKind {
3288    Declaration,
3289    Definition,
3290    DefaultArgument,
3291    ExplicitSpecialization,
3292    PartialSpecialization
3293  };
3294
3295  /// Diagnose that the specified declaration needs to be visible but
3296  /// isn't, and suggest a module import that would resolve the problem.
3297  void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl,
3298                             MissingImportKind MIK, bool Recover = true);
3299  void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl,
3300                             SourceLocation DeclLoc, ArrayRef<Module *> Modules,
3301                             MissingImportKind MIK, bool Recover);
3302
3303  Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
3304                             SourceLocation LBraceLoc);
3305  Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
3306                              SourceLocation RBraceLoc);
3307
3308  /// We've found a use of a templated declaration that would trigger an
3309  /// implicit instantiation. Check that any relevant explicit specializations
3310  /// and partial specializations are visible/reachable, and diagnose if not.
3311  void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec);
3312  void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec);
3313
3314  /// Retrieve a suitable printing policy for diagnostics.
3315  PrintingPolicy getPrintingPolicy() const {
3316    return getPrintingPolicy(Context, PP);
3317  }
3318
3319  /// Retrieve a suitable printing policy for diagnostics.
3320  static PrintingPolicy getPrintingPolicy(const ASTContext &Ctx,
3321                                          const Preprocessor &PP);
3322
3323  /// Scope actions.
3324  void ActOnPopScope(SourceLocation Loc, Scope *S);
3325  void ActOnTranslationUnitScope(Scope *S);
3326
3327  Decl *ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS,
3328                                   const ParsedAttributesView &DeclAttrs,
3329                                   RecordDecl *&AnonRecord);
3330  Decl *ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS,
3331                                   const ParsedAttributesView &DeclAttrs,
3332                                   MultiTemplateParamsArg TemplateParams,
3333                                   bool IsExplicitInstantiation,
3334                                   RecordDecl *&AnonRecord);
3335
3336  Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
3337                                    AccessSpecifier AS,
3338                                    RecordDecl *Record,
3339                                    const PrintingPolicy &Policy);
3340
3341  /// Called once it is known whether
3342  /// a tag declaration is an anonymous union or struct.
3343  void ActOnDefinedDeclarationSpecifier(Decl *D);
3344
3345  void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record);
3346
3347  Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
3348                                       RecordDecl *Record);
3349
3350  /// Common ways to introduce type names without a tag for use in diagnostics.
3351  /// Keep in sync with err_tag_reference_non_tag.
3352  enum NonTagKind {
3353    NTK_NonStruct,
3354    NTK_NonClass,
3355    NTK_NonUnion,
3356    NTK_NonEnum,
3357    NTK_Typedef,
3358    NTK_TypeAlias,
3359    NTK_Template,
3360    NTK_TypeAliasTemplate,
3361    NTK_TemplateTemplateArgument,
3362  };
3363
3364  /// Given a non-tag type declaration, returns an enum useful for indicating
3365  /// what kind of non-tag type this is.
3366  NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
3367
3368  bool isAcceptableTagRedeclaration(const TagDecl *Previous,
3369                                    TagTypeKind NewTag, bool isDefinition,
3370                                    SourceLocation NewTagLoc,
3371                                    const IdentifierInfo *Name);
3372
3373  enum TagUseKind {
3374    TUK_Reference,   // Reference to a tag:  'struct foo *X;'
3375    TUK_Declaration, // Fwd decl of a tag:   'struct foo;'
3376    TUK_Definition,  // Definition of a tag: 'struct foo { int X; } Y;'
3377    TUK_Friend       // Friend declaration:  'friend struct foo;'
3378  };
3379
3380  enum OffsetOfKind {
3381    // Not parsing a type within __builtin_offsetof.
3382    OOK_Outside,
3383    // Parsing a type within __builtin_offsetof.
3384    OOK_Builtin,
3385    // Parsing a type within macro "offsetof", defined in __buitin_offsetof
3386    // To improve our diagnostic message.
3387    OOK_Macro,
3388  };
3389
3390  DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
3391                      SourceLocation KWLoc, CXXScopeSpec &SS,
3392                      IdentifierInfo *Name, SourceLocation NameLoc,
3393                      const ParsedAttributesView &Attr, AccessSpecifier AS,
3394                      SourceLocation ModulePrivateLoc,
3395                      MultiTemplateParamsArg TemplateParameterLists,
3396                      bool &OwnedDecl, bool &IsDependent,
3397                      SourceLocation ScopedEnumKWLoc,
3398                      bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
3399                      bool IsTypeSpecifier, bool IsTemplateParamOrArg,
3400                      OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
3401
3402  DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc,
3403                                     unsigned TagSpec, SourceLocation TagLoc,
3404                                     CXXScopeSpec &SS, IdentifierInfo *Name,
3405                                     SourceLocation NameLoc,
3406                                     const ParsedAttributesView &Attr,
3407                                     MultiTemplateParamsArg TempParamLists);
3408
3409  TypeResult ActOnDependentTag(Scope *S,
3410                               unsigned TagSpec,
3411                               TagUseKind TUK,
3412                               const CXXScopeSpec &SS,
3413                               IdentifierInfo *Name,
3414                               SourceLocation TagLoc,
3415                               SourceLocation NameLoc);
3416
3417  void ActOnDefs(Scope *S, Decl *TagD, SourceLocation DeclStart,
3418                 IdentifierInfo *ClassName,
3419                 SmallVectorImpl<Decl *> &Decls);
3420  Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
3421                   Declarator &D, Expr *BitfieldWidth);
3422
3423  FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
3424                         Declarator &D, Expr *BitfieldWidth,
3425                         InClassInitStyle InitStyle,
3426                         AccessSpecifier AS);
3427  MSPropertyDecl *HandleMSProperty(Scope *S, RecordDecl *TagD,
3428                                   SourceLocation DeclStart, Declarator &D,
3429                                   Expr *BitfieldWidth,
3430                                   InClassInitStyle InitStyle,
3431                                   AccessSpecifier AS,
3432                                   const ParsedAttr &MSPropertyAttr);
3433
3434  FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
3435                            TypeSourceInfo *TInfo,
3436                            RecordDecl *Record, SourceLocation Loc,
3437                            bool Mutable, Expr *BitfieldWidth,
3438                            InClassInitStyle InitStyle,
3439                            SourceLocation TSSL,
3440                            AccessSpecifier AS, NamedDecl *PrevDecl,
3441                            Declarator *D = nullptr);
3442
3443  bool CheckNontrivialField(FieldDecl *FD);
3444  void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMember CSM);
3445
3446  enum TrivialABIHandling {
3447    /// The triviality of a method unaffected by "trivial_abi".
3448    TAH_IgnoreTrivialABI,
3449
3450    /// The triviality of a method affected by "trivial_abi".
3451    TAH_ConsiderTrivialABI
3452  };
3453
3454  bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMember CSM,
3455                              TrivialABIHandling TAH = TAH_IgnoreTrivialABI,
3456                              bool Diagnose = false);
3457
3458  /// For a defaulted function, the kind of defaulted function that it is.
3459  class DefaultedFunctionKind {
3460    CXXSpecialMember SpecialMember : 8;
3461    DefaultedComparisonKind Comparison : 8;
3462
3463  public:
3464    DefaultedFunctionKind()
3465        : SpecialMember(CXXInvalid), Comparison(DefaultedComparisonKind::None) {
3466    }
3467    DefaultedFunctionKind(CXXSpecialMember CSM)
3468        : SpecialMember(CSM), Comparison(DefaultedComparisonKind::None) {}
3469    DefaultedFunctionKind(DefaultedComparisonKind Comp)
3470        : SpecialMember(CXXInvalid), Comparison(Comp) {}
3471
3472    bool isSpecialMember() const { return SpecialMember != CXXInvalid; }
3473    bool isComparison() const {
3474      return Comparison != DefaultedComparisonKind::None;
3475    }
3476
3477    explicit operator bool() const {
3478      return isSpecialMember() || isComparison();
3479    }
3480
3481    CXXSpecialMember asSpecialMember() const { return SpecialMember; }
3482    DefaultedComparisonKind asComparison() const { return Comparison; }
3483
3484    /// Get the index of this function kind for use in diagnostics.
3485    unsigned getDiagnosticIndex() const {
3486      static_assert(CXXInvalid > CXXDestructor,
3487                    "invalid should have highest index");
3488      static_assert((unsigned)DefaultedComparisonKind::None == 0,
3489                    "none should be equal to zero");
3490      return SpecialMember + (unsigned)Comparison;
3491    }
3492  };
3493
3494  DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
3495
3496  CXXSpecialMember getSpecialMember(const CXXMethodDecl *MD) {
3497    return getDefaultedFunctionKind(MD).asSpecialMember();
3498  }
3499  DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD) {
3500    return getDefaultedFunctionKind(FD).asComparison();
3501  }
3502
3503  void ActOnLastBitfield(SourceLocation DeclStart,
3504                         SmallVectorImpl<Decl *> &AllIvarDecls);
3505  Decl *ActOnIvar(Scope *S, SourceLocation DeclStart, Declarator &D,
3506                  Expr *BitWidth, tok::ObjCKeywordKind visibility);
3507
3508  // This is used for both record definitions and ObjC interface declarations.
3509  void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
3510                   ArrayRef<Decl *> Fields, SourceLocation LBrac,
3511                   SourceLocation RBrac, const ParsedAttributesView &AttrList);
3512
3513  /// ActOnTagStartDefinition - Invoked when we have entered the
3514  /// scope of a tag's definition (e.g., for an enumeration, class,
3515  /// struct, or union).
3516  void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
3517
3518  /// Perform ODR-like check for C/ObjC when merging tag types from modules.
3519  /// Differently from C++, actually parse the body and reject / error out
3520  /// in case of a structural mismatch.
3521  bool ActOnDuplicateDefinition(Decl *Prev, SkipBodyInfo &SkipBody);
3522
3523  /// Check ODR hashes for C/ObjC when merging types from modules.
3524  /// Differently from C++, actually parse the body and reject in case
3525  /// of a mismatch.
3526  template <typename T,
3527            typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
3528  bool ActOnDuplicateODRHashDefinition(T *Duplicate, T *Previous) {
3529    if (Duplicate->getODRHash() != Previous->getODRHash())
3530      return false;
3531
3532    // Make the previous decl visible.
3533    makeMergedDefinitionVisible(Previous);
3534    return true;
3535  }
3536
3537  typedef void *SkippedDefinitionContext;
3538
3539  /// Invoked when we enter a tag definition that we're skipping.
3540  SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD);
3541
3542  void ActOnObjCContainerStartDefinition(ObjCContainerDecl *IDecl);
3543
3544  /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
3545  /// C++ record definition's base-specifiers clause and are starting its
3546  /// member declarations.
3547  void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl,
3548                                       SourceLocation FinalLoc,
3549                                       bool IsFinalSpelledSealed,
3550                                       bool IsAbstract,
3551                                       SourceLocation LBraceLoc);
3552
3553  /// ActOnTagFinishDefinition - Invoked once we have finished parsing
3554  /// the definition of a tag (enumeration, class, struct, or union).
3555  void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl,
3556                                SourceRange BraceRange);
3557
3558  void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context);
3559
3560  void ActOnObjCContainerFinishDefinition();
3561
3562  /// Invoked when we must temporarily exit the objective-c container
3563  /// scope for parsing/looking-up C constructs.
3564  ///
3565  /// Must be followed by a call to \see ActOnObjCReenterContainerContext
3566  void ActOnObjCTemporaryExitContainerContext(ObjCContainerDecl *ObjCCtx);
3567  void ActOnObjCReenterContainerContext(ObjCContainerDecl *ObjCCtx);
3568
3569  /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
3570  /// error parsing the definition of a tag.
3571  void ActOnTagDefinitionError(Scope *S, Decl *TagDecl);
3572
3573  EnumConstantDecl *CheckEnumConstant(EnumDecl *Enum,
3574                                      EnumConstantDecl *LastEnumConst,
3575                                      SourceLocation IdLoc,
3576                                      IdentifierInfo *Id,
3577                                      Expr *val);
3578  bool CheckEnumUnderlyingType(TypeSourceInfo *TI);
3579  bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
3580                              QualType EnumUnderlyingTy, bool IsFixed,
3581                              const EnumDecl *Prev);
3582
3583  /// Determine whether the body of an anonymous enumeration should be skipped.
3584  /// \param II The name of the first enumerator.
3585  SkipBodyInfo shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II,
3586                                      SourceLocation IILoc);
3587
3588  Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
3589                          SourceLocation IdLoc, IdentifierInfo *Id,
3590                          const ParsedAttributesView &Attrs,
3591                          SourceLocation EqualLoc, Expr *Val);
3592  void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
3593                     Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
3594                     const ParsedAttributesView &Attr);
3595
3596  /// Set the current declaration context until it gets popped.
3597  void PushDeclContext(Scope *S, DeclContext *DC);
3598  void PopDeclContext();
3599
3600  /// EnterDeclaratorContext - Used when we must lookup names in the context
3601  /// of a declarator's nested name specifier.
3602  void EnterDeclaratorContext(Scope *S, DeclContext *DC);
3603  void ExitDeclaratorContext(Scope *S);
3604
3605  /// Enter a template parameter scope, after it's been associated with a particular
3606  /// DeclContext. Causes lookup within the scope to chain through enclosing contexts
3607  /// in the correct order.
3608  void EnterTemplatedContext(Scope *S, DeclContext *DC);
3609
3610  /// Push the parameters of D, which must be a function, into scope.
3611  void ActOnReenterFunctionContext(Scope* S, Decl* D);
3612  void ActOnExitFunctionContext();
3613
3614  /// If \p AllowLambda is true, treat lambda as function.
3615  DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
3616
3617  /// Returns a pointer to the innermost enclosing function, or nullptr if the
3618  /// current context is not inside a function. If \p AllowLambda is true,
3619  /// this can return the call operator of an enclosing lambda, otherwise
3620  /// lambdas are skipped when looking for an enclosing function.
3621  FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
3622
3623  /// getCurMethodDecl - If inside of a method body, this returns a pointer to
3624  /// the method decl for the method being parsed.  If we're currently
3625  /// in a 'block', this returns the containing context.
3626  ObjCMethodDecl *getCurMethodDecl();
3627
3628  /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
3629  /// or C function we're in, otherwise return null.  If we're currently
3630  /// in a 'block', this returns the containing context.
3631  NamedDecl *getCurFunctionOrMethodDecl() const;
3632
3633  /// Add this decl to the scope shadowed decl chains.
3634  void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
3635
3636  /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
3637  /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
3638  /// true if 'D' belongs to the given declaration context.
3639  ///
3640  /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
3641  ///        enclosing namespace set of the context, rather than contained
3642  ///        directly within it.
3643  bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
3644                     bool AllowInlineNamespace = false) const;
3645
3646  /// Finds the scope corresponding to the given decl context, if it
3647  /// happens to be an enclosing scope.  Otherwise return NULL.
3648  static Scope *getScopeForDeclContext(Scope *S, DeclContext *DC);
3649
3650  /// Subroutines of ActOnDeclarator().
3651  TypedefDecl *ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
3652                                TypeSourceInfo *TInfo);
3653  bool isIncompatibleTypedef(TypeDecl *Old, TypedefNameDecl *New);
3654
3655  /// Describes the kind of merge to perform for availability
3656  /// attributes (including "deprecated", "unavailable", and "availability").
3657  enum AvailabilityMergeKind {
3658    /// Don't merge availability attributes at all.
3659    AMK_None,
3660    /// Merge availability attributes for a redeclaration, which requires
3661    /// an exact match.
3662    AMK_Redeclaration,
3663    /// Merge availability attributes for an override, which requires
3664    /// an exact match or a weakening of constraints.
3665    AMK_Override,
3666    /// Merge availability attributes for an implementation of
3667    /// a protocol requirement.
3668    AMK_ProtocolImplementation,
3669    /// Merge availability attributes for an implementation of
3670    /// an optional protocol requirement.
3671    AMK_OptionalProtocolImplementation
3672  };
3673
3674  /// Describes the kind of priority given to an availability attribute.
3675  ///
3676  /// The sum of priorities deteremines the final priority of the attribute.
3677  /// The final priority determines how the attribute will be merged.
3678  /// An attribute with a lower priority will always remove higher priority
3679  /// attributes for the specified platform when it is being applied. An
3680  /// attribute with a higher priority will not be applied if the declaration
3681  /// already has an availability attribute with a lower priority for the
3682  /// specified platform. The final prirority values are not expected to match
3683  /// the values in this enumeration, but instead should be treated as a plain
3684  /// integer value. This enumeration just names the priority weights that are
3685  /// used to calculate that final vaue.
3686  enum AvailabilityPriority : int {
3687    /// The availability attribute was specified explicitly next to the
3688    /// declaration.
3689    AP_Explicit = 0,
3690
3691    /// The availability attribute was applied using '#pragma clang attribute'.
3692    AP_PragmaClangAttribute = 1,
3693
3694    /// The availability attribute for a specific platform was inferred from
3695    /// an availability attribute for another platform.
3696    AP_InferredFromOtherPlatform = 2
3697  };
3698
3699  /// Attribute merging methods. Return true if a new attribute was added.
3700  AvailabilityAttr *
3701  mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI,
3702                        IdentifierInfo *Platform, bool Implicit,
3703                        VersionTuple Introduced, VersionTuple Deprecated,
3704                        VersionTuple Obsoleted, bool IsUnavailable,
3705                        StringRef Message, bool IsStrict, StringRef Replacement,
3706                        AvailabilityMergeKind AMK, int Priority);
3707  TypeVisibilityAttr *
3708  mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
3709                          TypeVisibilityAttr::VisibilityType Vis);
3710  VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
3711                                      VisibilityAttr::VisibilityType Vis);
3712  UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
3713                          StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
3714  DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
3715  DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
3716  MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
3717                                            const AttributeCommonInfo &CI,
3718                                            bool BestCase,
3719                                            MSInheritanceModel Model);
3720  ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
3721                            StringRef NewUserDiagnostic);
3722  FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
3723                              IdentifierInfo *Format, int FormatIdx,
3724                              int FirstArg);
3725  SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
3726                                StringRef Name);
3727  CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
3728                                StringRef Name);
3729  AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
3730                                          const AttributeCommonInfo &CI,
3731                                          const IdentifierInfo *Ident);
3732  MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
3733  SwiftNameAttr *mergeSwiftNameAttr(Decl *D, const SwiftNameAttr &SNA,
3734                                    StringRef Name);
3735  OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
3736                                          const AttributeCommonInfo &CI);
3737  InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
3738  InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
3739                                                const InternalLinkageAttr &AL);
3740  WebAssemblyImportNameAttr *mergeImportNameAttr(
3741      Decl *D, const WebAssemblyImportNameAttr &AL);
3742  WebAssemblyImportModuleAttr *mergeImportModuleAttr(
3743      Decl *D, const WebAssemblyImportModuleAttr &AL);
3744  EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
3745  EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
3746                                              const EnforceTCBLeafAttr &AL);
3747  BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
3748  HLSLNumThreadsAttr *mergeHLSLNumThreadsAttr(Decl *D,
3749                                              const AttributeCommonInfo &AL,
3750                                              int X, int Y, int Z);
3751  HLSLShaderAttr *mergeHLSLShaderAttr(Decl *D, const AttributeCommonInfo &AL,
3752                                      HLSLShaderAttr::ShaderType ShaderType);
3753  HLSLParamModifierAttr *
3754  mergeHLSLParamModifierAttr(Decl *D, const AttributeCommonInfo &AL,
3755                             HLSLParamModifierAttr::Spelling Spelling);
3756
3757  void mergeDeclAttributes(NamedDecl *New, Decl *Old,
3758                           AvailabilityMergeKind AMK = AMK_Redeclaration);
3759  void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New,
3760                            LookupResult &OldDecls);
3761  bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S,
3762                         bool MergeTypeWithOld, bool NewDeclIsDefn);
3763  bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old,
3764                                    Scope *S, bool MergeTypeWithOld);
3765  void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old);
3766  void MergeVarDecl(VarDecl *New, LookupResult &Previous);
3767  void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
3768  void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old);
3769  bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
3770  void notePreviousDefinition(const NamedDecl *Old, SourceLocation New);
3771  bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S);
3772
3773  // AssignmentAction - This is used by all the assignment diagnostic functions
3774  // to represent what is actually causing the operation
3775  enum AssignmentAction {
3776    AA_Assigning,
3777    AA_Passing,
3778    AA_Returning,
3779    AA_Converting,
3780    AA_Initializing,
3781    AA_Sending,
3782    AA_Casting,
3783    AA_Passing_CFAudited
3784  };
3785
3786  /// C++ Overloading.
3787  enum OverloadKind {
3788    /// This is a legitimate overload: the existing declarations are
3789    /// functions or function templates with different signatures.
3790    Ovl_Overload,
3791
3792    /// This is not an overload because the signature exactly matches
3793    /// an existing declaration.
3794    Ovl_Match,
3795
3796    /// This is not an overload because the lookup results contain a
3797    /// non-function.
3798    Ovl_NonFunction
3799  };
3800  OverloadKind CheckOverload(Scope *S,
3801                             FunctionDecl *New,
3802                             const LookupResult &OldDecls,
3803                             NamedDecl *&OldDecl,
3804                             bool UseMemberUsingDeclRules);
3805  bool IsOverload(FunctionDecl *New, FunctionDecl *Old,
3806                  bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
3807
3808  // Checks whether MD constitutes an override the base class method BaseMD.
3809  // When checking for overrides, the object object members are ignored.
3810  bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
3811                  bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
3812
3813  // Calculates whether the expression Constraint depends on an enclosing
3814  // template, for the purposes of [temp.friend] p9.
3815  // TemplateDepth is the 'depth' of the friend function, which is used to
3816  // compare whether a declaration reference is referring to a containing
3817  // template, or just the current friend function. A 'lower' TemplateDepth in
3818  // the AST refers to a 'containing' template. As the constraint is
3819  // uninstantiated, this is relative to the 'top' of the TU.
3820  bool
3821  ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend,
3822                                                 unsigned TemplateDepth,
3823                                                 const Expr *Constraint);
3824
3825  // Calculates whether the friend function depends on an enclosing template for
3826  // the purposes of [temp.friend] p9.
3827  bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD);
3828
3829  enum class AllowedExplicit {
3830    /// Allow no explicit functions to be used.
3831    None,
3832    /// Allow explicit conversion functions but not explicit constructors.
3833    Conversions,
3834    /// Allow both explicit conversion functions and explicit constructors.
3835    All
3836  };
3837
3838  ImplicitConversionSequence
3839  TryImplicitConversion(Expr *From, QualType ToType,
3840                        bool SuppressUserConversions,
3841                        AllowedExplicit AllowExplicit,
3842                        bool InOverloadResolution,
3843                        bool CStyle,
3844                        bool AllowObjCWritebackConversion);
3845
3846  bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
3847  bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
3848  bool IsComplexPromotion(QualType FromType, QualType ToType);
3849  bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
3850                           bool InOverloadResolution,
3851                           QualType& ConvertedType, bool &IncompatibleObjC);
3852  bool isObjCPointerConversion(QualType FromType, QualType ToType,
3853                               QualType& ConvertedType, bool &IncompatibleObjC);
3854  bool isObjCWritebackConversion(QualType FromType, QualType ToType,
3855                                 QualType &ConvertedType);
3856  bool IsBlockPointerConversion(QualType FromType, QualType ToType,
3857                                QualType& ConvertedType);
3858
3859  bool FunctionParamTypesAreEqual(ArrayRef<QualType> Old,
3860                                  ArrayRef<QualType> New,
3861                                  unsigned *ArgPos = nullptr,
3862                                  bool Reversed = false);
3863
3864  bool FunctionParamTypesAreEqual(const FunctionProtoType *OldType,
3865                                  const FunctionProtoType *NewType,
3866                                  unsigned *ArgPos = nullptr,
3867                                  bool Reversed = false);
3868
3869  bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
3870                                           const FunctionDecl *NewFunction,
3871                                           unsigned *ArgPos = nullptr,
3872                                           bool Reversed = false);
3873
3874  void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag,
3875                                  QualType FromType, QualType ToType);
3876
3877  void maybeExtendBlockObject(ExprResult &E);
3878  CastKind PrepareCastToObjCObjectPointer(ExprResult &E);
3879  bool CheckPointerConversion(Expr *From, QualType ToType,
3880                              CastKind &Kind,
3881                              CXXCastPath& BasePath,
3882                              bool IgnoreBaseAccess,
3883                              bool Diagnose = true);
3884  bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
3885                                 bool InOverloadResolution,
3886                                 QualType &ConvertedType);
3887  bool CheckMemberPointerConversion(Expr *From, QualType ToType,
3888                                    CastKind &Kind,
3889                                    CXXCastPath &BasePath,
3890                                    bool IgnoreBaseAccess);
3891  bool IsQualificationConversion(QualType FromType, QualType ToType,
3892                                 bool CStyle, bool &ObjCLifetimeConversion);
3893  bool IsFunctionConversion(QualType FromType, QualType ToType,
3894                            QualType &ResultTy);
3895  bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType);
3896  bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg);
3897
3898  bool CanPerformAggregateInitializationForOverloadResolution(
3899      const InitializedEntity &Entity, InitListExpr *From);
3900
3901  bool IsStringInit(Expr *Init, const ArrayType *AT);
3902
3903  bool CanPerformCopyInitialization(const InitializedEntity &Entity,
3904                                    ExprResult Init);
3905  ExprResult PerformCopyInitialization(const InitializedEntity &Entity,
3906                                       SourceLocation EqualLoc,
3907                                       ExprResult Init,
3908                                       bool TopLevelOfInitList = false,
3909                                       bool AllowExplicit = false);
3910  ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj,
3911                                              FunctionDecl *Fun);
3912  ExprResult PerformImplicitObjectArgumentInitialization(
3913      Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl,
3914      CXXMethodDecl *Method);
3915
3916  /// Check that the lifetime of the initializer (and its subobjects) is
3917  /// sufficient for initializing the entity, and perform lifetime extension
3918  /// (when permitted) if not.
3919  void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init);
3920
3921  ExprResult PerformContextuallyConvertToBool(Expr *From);
3922  ExprResult PerformContextuallyConvertToObjCPointer(Expr *From);
3923
3924  /// Contexts in which a converted constant expression is required.
3925  enum CCEKind {
3926    CCEK_CaseValue,    ///< Expression in a case label.
3927    CCEK_Enumerator,   ///< Enumerator value with fixed underlying type.
3928    CCEK_TemplateArg,  ///< Value of a non-type template parameter.
3929    CCEK_ArrayBound,   ///< Array bound in array declarator or new-expression.
3930    CCEK_ExplicitBool, ///< Condition in an explicit(bool) specifier.
3931    CCEK_Noexcept,     ///< Condition in a noexcept(bool) specifier.
3932    CCEK_StaticAssertMessageSize, ///< Call to size() in a static assert
3933                                  ///< message.
3934    CCEK_StaticAssertMessageData, ///< Call to data() in a static assert
3935                                  ///< message.
3936  };
3937
3938  ExprResult BuildConvertedConstantExpression(Expr *From, QualType T,
3939                                              CCEKind CCE,
3940                                              NamedDecl *Dest = nullptr);
3941
3942  ExprResult CheckConvertedConstantExpression(Expr *From, QualType T,
3943                                              llvm::APSInt &Value, CCEKind CCE);
3944  ExprResult CheckConvertedConstantExpression(Expr *From, QualType T,
3945                                              APValue &Value, CCEKind CCE,
3946                                              NamedDecl *Dest = nullptr);
3947
3948  ExprResult
3949  EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value,
3950                                      CCEKind CCE, bool RequireInt,
3951                                      const APValue &PreNarrowingValue);
3952
3953  /// Abstract base class used to perform a contextual implicit
3954  /// conversion from an expression to any type passing a filter.
3955  class ContextualImplicitConverter {
3956  public:
3957    bool Suppress;
3958    bool SuppressConversion;
3959
3960    ContextualImplicitConverter(bool Suppress = false,
3961                                bool SuppressConversion = false)
3962        : Suppress(Suppress), SuppressConversion(SuppressConversion) {}
3963
3964    /// Determine whether the specified type is a valid destination type
3965    /// for this conversion.
3966    virtual bool match(QualType T) = 0;
3967
3968    /// Emits a diagnostic complaining that the expression does not have
3969    /// integral or enumeration type.
3970    virtual SemaDiagnosticBuilder
3971    diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T) = 0;
3972
3973    /// Emits a diagnostic when the expression has incomplete class type.
3974    virtual SemaDiagnosticBuilder
3975    diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T) = 0;
3976
3977    /// Emits a diagnostic when the only matching conversion function
3978    /// is explicit.
3979    virtual SemaDiagnosticBuilder diagnoseExplicitConv(
3980        Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) = 0;
3981
3982    /// Emits a note for the explicit conversion function.
3983    virtual SemaDiagnosticBuilder
3984    noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) = 0;
3985
3986    /// Emits a diagnostic when there are multiple possible conversion
3987    /// functions.
3988    virtual SemaDiagnosticBuilder
3989    diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T) = 0;
3990
3991    /// Emits a note for one of the candidate conversions.
3992    virtual SemaDiagnosticBuilder
3993    noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) = 0;
3994
3995    /// Emits a diagnostic when we picked a conversion function
3996    /// (for cases when we are not allowed to pick a conversion function).
3997    virtual SemaDiagnosticBuilder diagnoseConversion(
3998        Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) = 0;
3999
4000    virtual ~ContextualImplicitConverter() {}
4001  };
4002
4003  class ICEConvertDiagnoser : public ContextualImplicitConverter {
4004    bool AllowScopedEnumerations;
4005
4006  public:
4007    ICEConvertDiagnoser(bool AllowScopedEnumerations,
4008                        bool Suppress, bool SuppressConversion)
4009        : ContextualImplicitConverter(Suppress, SuppressConversion),
4010          AllowScopedEnumerations(AllowScopedEnumerations) {}
4011
4012    /// Match an integral or (possibly scoped) enumeration type.
4013    bool match(QualType T) override;
4014
4015    SemaDiagnosticBuilder
4016    diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T) override {
4017      return diagnoseNotInt(S, Loc, T);
4018    }
4019
4020    /// Emits a diagnostic complaining that the expression does not have
4021    /// integral or enumeration type.
4022    virtual SemaDiagnosticBuilder
4023    diagnoseNotInt(Sema &S, SourceLocation Loc, QualType T) = 0;
4024  };
4025
4026  /// Perform a contextual implicit conversion.
4027  ExprResult PerformContextualImplicitConversion(
4028      SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter);
4029
4030
4031  enum ObjCSubscriptKind {
4032    OS_Array,
4033    OS_Dictionary,
4034    OS_Error
4035  };
4036  ObjCSubscriptKind CheckSubscriptingKind(Expr *FromE);
4037
4038  // Note that LK_String is intentionally after the other literals, as
4039  // this is used for diagnostics logic.
4040  enum ObjCLiteralKind {
4041    LK_Array,
4042    LK_Dictionary,
4043    LK_Numeric,
4044    LK_Boxed,
4045    LK_String,
4046    LK_Block,
4047    LK_None
4048  };
4049  ObjCLiteralKind CheckLiteralKind(Expr *FromE);
4050
4051  ExprResult PerformObjectMemberConversion(Expr *From,
4052                                           NestedNameSpecifier *Qualifier,
4053                                           NamedDecl *FoundDecl,
4054                                           NamedDecl *Member);
4055
4056  // Members have to be NamespaceDecl* or TranslationUnitDecl*.
4057  // TODO: make this is a typesafe union.
4058  typedef llvm::SmallSetVector<DeclContext   *, 16> AssociatedNamespaceSet;
4059  typedef llvm::SmallSetVector<CXXRecordDecl *, 16> AssociatedClassSet;
4060
4061  using ADLCallKind = CallExpr::ADLCallKind;
4062
4063  void AddOverloadCandidate(
4064      FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef<Expr *> Args,
4065      OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
4066      bool PartialOverloading = false, bool AllowExplicit = true,
4067      bool AllowExplicitConversion = false,
4068      ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
4069      ConversionSequenceList EarlyConversions = std::nullopt,
4070      OverloadCandidateParamOrder PO = {},
4071      bool AggregateCandidateDeduction = false);
4072  void AddFunctionCandidates(const UnresolvedSetImpl &Functions,
4073                      ArrayRef<Expr *> Args,
4074                      OverloadCandidateSet &CandidateSet,
4075                      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
4076                      bool SuppressUserConversions = false,
4077                      bool PartialOverloading = false,
4078                      bool FirstArgumentIsBase = false);
4079  void AddMethodCandidate(DeclAccessPair FoundDecl,
4080                          QualType ObjectType,
4081                          Expr::Classification ObjectClassification,
4082                          ArrayRef<Expr *> Args,
4083                          OverloadCandidateSet& CandidateSet,
4084                          bool SuppressUserConversion = false,
4085                          OverloadCandidateParamOrder PO = {});
4086  void
4087  AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
4088                     CXXRecordDecl *ActingContext, QualType ObjectType,
4089                     Expr::Classification ObjectClassification,
4090                     ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
4091                     bool SuppressUserConversions = false,
4092                     bool PartialOverloading = false,
4093                     ConversionSequenceList EarlyConversions = std::nullopt,
4094                     OverloadCandidateParamOrder PO = {});
4095  void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl,
4096                                  DeclAccessPair FoundDecl,
4097                                  CXXRecordDecl *ActingContext,
4098                                 TemplateArgumentListInfo *ExplicitTemplateArgs,
4099                                  QualType ObjectType,
4100                                  Expr::Classification ObjectClassification,
4101                                  ArrayRef<Expr *> Args,
4102                                  OverloadCandidateSet& CandidateSet,
4103                                  bool SuppressUserConversions = false,
4104                                  bool PartialOverloading = false,
4105                                  OverloadCandidateParamOrder PO = {});
4106  void AddTemplateOverloadCandidate(
4107      FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
4108      TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
4109      OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
4110      bool PartialOverloading = false, bool AllowExplicit = true,
4111      ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
4112      OverloadCandidateParamOrder PO = {},
4113      bool AggregateCandidateDeduction = false);
4114  bool CheckNonDependentConversions(
4115      FunctionTemplateDecl *FunctionTemplate, ArrayRef<QualType> ParamTypes,
4116      ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
4117      ConversionSequenceList &Conversions, bool SuppressUserConversions,
4118      CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
4119      Expr::Classification ObjectClassification = {},
4120      OverloadCandidateParamOrder PO = {});
4121  void AddConversionCandidate(
4122      CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
4123      CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
4124      OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
4125      bool AllowExplicit, bool AllowResultConversion = true);
4126  void AddTemplateConversionCandidate(
4127      FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
4128      CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
4129      OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
4130      bool AllowExplicit, bool AllowResultConversion = true);
4131  void AddSurrogateCandidate(CXXConversionDecl *Conversion,
4132                             DeclAccessPair FoundDecl,
4133                             CXXRecordDecl *ActingContext,
4134                             const FunctionProtoType *Proto,
4135                             Expr *Object, ArrayRef<Expr *> Args,
4136                             OverloadCandidateSet& CandidateSet);
4137  void AddNonMemberOperatorCandidates(
4138      const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
4139      OverloadCandidateSet &CandidateSet,
4140      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
4141  void AddMemberOperatorCandidates(OverloadedOperatorKind Op,
4142                                   SourceLocation OpLoc, ArrayRef<Expr *> Args,
4143                                   OverloadCandidateSet &CandidateSet,
4144                                   OverloadCandidateParamOrder PO = {});
4145  void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
4146                           OverloadCandidateSet& CandidateSet,
4147                           bool IsAssignmentOperator = false,
4148                           unsigned NumContextualBoolArguments = 0);
4149  void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
4150                                    SourceLocation OpLoc, ArrayRef<Expr *> Args,
4151                                    OverloadCandidateSet& CandidateSet);
4152  void AddArgumentDependentLookupCandidates(DeclarationName Name,
4153                                            SourceLocation Loc,
4154                                            ArrayRef<Expr *> Args,
4155                                TemplateArgumentListInfo *ExplicitTemplateArgs,
4156                                            OverloadCandidateSet& CandidateSet,
4157                                            bool PartialOverloading = false);
4158
4159  // Emit as a 'note' the specific overload candidate
4160  void NoteOverloadCandidate(
4161      const NamedDecl *Found, const FunctionDecl *Fn,
4162      OverloadCandidateRewriteKind RewriteKind = OverloadCandidateRewriteKind(),
4163      QualType DestType = QualType(), bool TakingAddress = false);
4164
4165  // Emit as a series of 'note's all template and non-templates identified by
4166  // the expression Expr
4167  void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
4168                                 bool TakingAddress = false);
4169
4170  /// Check the enable_if expressions on the given function. Returns the first
4171  /// failing attribute, or NULL if they were all successful.
4172  EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
4173                              ArrayRef<Expr *> Args,
4174                              bool MissingImplicitThis = false);
4175
4176  /// Find the failed Boolean condition within a given Boolean
4177  /// constant expression, and describe it with a string.
4178  std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
4179
4180  /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
4181  /// non-ArgDependent DiagnoseIfAttrs.
4182  ///
4183  /// Argument-dependent diagnose_if attributes should be checked each time a
4184  /// function is used as a direct callee of a function call.
4185  ///
4186  /// Returns true if any errors were emitted.
4187  bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
4188                                           const Expr *ThisArg,
4189                                           ArrayRef<const Expr *> Args,
4190                                           SourceLocation Loc);
4191
4192  /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
4193  /// ArgDependent DiagnoseIfAttrs.
4194  ///
4195  /// Argument-independent diagnose_if attributes should be checked on every use
4196  /// of a function.
4197  ///
4198  /// Returns true if any errors were emitted.
4199  bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
4200                                             SourceLocation Loc);
4201
4202  /// Returns whether the given function's address can be taken or not,
4203  /// optionally emitting a diagnostic if the address can't be taken.
4204  ///
4205  /// Returns false if taking the address of the function is illegal.
4206  bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
4207                                         bool Complain = false,
4208                                         SourceLocation Loc = SourceLocation());
4209
4210  // [PossiblyAFunctionType]  -->   [Return]
4211  // NonFunctionType --> NonFunctionType
4212  // R (A) --> R(A)
4213  // R (*)(A) --> R (A)
4214  // R (&)(A) --> R (A)
4215  // R (S::*)(A) --> R (A)
4216  QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
4217
4218  FunctionDecl *
4219  ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr,
4220                                     QualType TargetType,
4221                                     bool Complain,
4222                                     DeclAccessPair &Found,
4223                                     bool *pHadMultipleCandidates = nullptr);
4224
4225  FunctionDecl *
4226  resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
4227
4228  bool resolveAndFixAddressOfSingleOverloadCandidate(
4229      ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
4230
4231  FunctionDecl *ResolveSingleFunctionTemplateSpecialization(
4232      OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
4233      TemplateSpecCandidateSet *FailedTSC = nullptr);
4234
4235  bool ResolveAndFixSingleFunctionTemplateSpecialization(
4236      ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
4237      bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
4238      QualType DestTypeForComplaining = QualType(),
4239      unsigned DiagIDForComplaining = 0);
4240
4241  ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl,
4242                                            FunctionDecl *Fn);
4243  ExprResult FixOverloadedFunctionReference(ExprResult,
4244                                            DeclAccessPair FoundDecl,
4245                                            FunctionDecl *Fn);
4246
4247  void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
4248                                   ArrayRef<Expr *> Args,
4249                                   OverloadCandidateSet &CandidateSet,
4250                                   bool PartialOverloading = false);
4251  void AddOverloadedCallCandidates(
4252      LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
4253      ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
4254
4255  // An enum used to represent the different possible results of building a
4256  // range-based for loop.
4257  enum ForRangeStatus {
4258    FRS_Success,
4259    FRS_NoViableFunction,
4260    FRS_DiagnosticIssued
4261  };
4262
4263  ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc,
4264                                           SourceLocation RangeLoc,
4265                                           const DeclarationNameInfo &NameInfo,
4266                                           LookupResult &MemberLookup,
4267                                           OverloadCandidateSet *CandidateSet,
4268                                           Expr *Range, ExprResult *CallExpr);
4269
4270  ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn,
4271                                     UnresolvedLookupExpr *ULE,
4272                                     SourceLocation LParenLoc,
4273                                     MultiExprArg Args,
4274                                     SourceLocation RParenLoc,
4275                                     Expr *ExecConfig,
4276                                     bool AllowTypoCorrection=true,
4277                                     bool CalleesAddressIsTaken=false);
4278
4279  bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE,
4280                              MultiExprArg Args, SourceLocation RParenLoc,
4281                              OverloadCandidateSet *CandidateSet,
4282                              ExprResult *Result);
4283
4284  ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass,
4285                                        NestedNameSpecifierLoc NNSLoc,
4286                                        DeclarationNameInfo DNI,
4287                                        const UnresolvedSetImpl &Fns,
4288                                        bool PerformADL = true);
4289
4290  ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc,
4291                                     UnaryOperatorKind Opc,
4292                                     const UnresolvedSetImpl &Fns,
4293                                     Expr *input, bool RequiresADL = true);
4294
4295  void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet,
4296                             OverloadedOperatorKind Op,
4297                             const UnresolvedSetImpl &Fns,
4298                             ArrayRef<Expr *> Args, bool RequiresADL = true);
4299  ExprResult CreateOverloadedBinOp(SourceLocation OpLoc,
4300                                   BinaryOperatorKind Opc,
4301                                   const UnresolvedSetImpl &Fns,
4302                                   Expr *LHS, Expr *RHS,
4303                                   bool RequiresADL = true,
4304                                   bool AllowRewrittenCandidates = true,
4305                                   FunctionDecl *DefaultedFn = nullptr);
4306  ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc,
4307                                                const UnresolvedSetImpl &Fns,
4308                                                Expr *LHS, Expr *RHS,
4309                                                FunctionDecl *DefaultedFn);
4310
4311  ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
4312                                                SourceLocation RLoc, Expr *Base,
4313                                                MultiExprArg Args);
4314
4315  ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr,
4316                                       SourceLocation LParenLoc,
4317                                       MultiExprArg Args,
4318                                       SourceLocation RParenLoc,
4319                                       Expr *ExecConfig = nullptr,
4320                                       bool IsExecConfig = false,
4321                                       bool AllowRecovery = false);
4322  ExprResult
4323  BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc,
4324                               MultiExprArg Args,
4325                               SourceLocation RParenLoc);
4326
4327  ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base,
4328                                      SourceLocation OpLoc,
4329                                      bool *NoArrowOperatorFound = nullptr);
4330
4331  /// CheckCallReturnType - Checks that a call expression's return type is
4332  /// complete. Returns true on failure. The location passed in is the location
4333  /// that best represents the call.
4334  bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
4335                           CallExpr *CE, FunctionDecl *FD);
4336
4337  /// Helpers for dealing with blocks and functions.
4338  bool CheckParmsForFunctionDef(ArrayRef<ParmVarDecl *> Parameters,
4339                                bool CheckParameterNames);
4340  void CheckCXXDefaultArguments(FunctionDecl *FD);
4341  void CheckExtraCXXDefaultArguments(Declarator &D);
4342  Scope *getNonFieldDeclScope(Scope *S);
4343
4344  /// \name Name lookup
4345  ///
4346  /// These routines provide name lookup that is used during semantic
4347  /// analysis to resolve the various kinds of names (identifiers,
4348  /// overloaded operator names, constructor names, etc.) into zero or
4349  /// more declarations within a particular scope. The major entry
4350  /// points are LookupName, which performs unqualified name lookup,
4351  /// and LookupQualifiedName, which performs qualified name lookup.
4352  ///
4353  /// All name lookup is performed based on some specific criteria,
4354  /// which specify what names will be visible to name lookup and how
4355  /// far name lookup should work. These criteria are important both
4356  /// for capturing language semantics (certain lookups will ignore
4357  /// certain names, for example) and for performance, since name
4358  /// lookup is often a bottleneck in the compilation of C++. Name
4359  /// lookup criteria is specified via the LookupCriteria enumeration.
4360  ///
4361  /// The results of name lookup can vary based on the kind of name
4362  /// lookup performed, the current language, and the translation
4363  /// unit. In C, for example, name lookup will either return nothing
4364  /// (no entity found) or a single declaration. In C++, name lookup
4365  /// can additionally refer to a set of overloaded functions or
4366  /// result in an ambiguity. All of the possible results of name
4367  /// lookup are captured by the LookupResult class, which provides
4368  /// the ability to distinguish among them.
4369  //@{
4370
4371  /// Describes the kind of name lookup to perform.
4372  enum LookupNameKind {
4373    /// Ordinary name lookup, which finds ordinary names (functions,
4374    /// variables, typedefs, etc.) in C and most kinds of names
4375    /// (functions, variables, members, types, etc.) in C++.
4376    LookupOrdinaryName = 0,
4377    /// Tag name lookup, which finds the names of enums, classes,
4378    /// structs, and unions.
4379    LookupTagName,
4380    /// Label name lookup.
4381    LookupLabel,
4382    /// Member name lookup, which finds the names of
4383    /// class/struct/union members.
4384    LookupMemberName,
4385    /// Look up of an operator name (e.g., operator+) for use with
4386    /// operator overloading. This lookup is similar to ordinary name
4387    /// lookup, but will ignore any declarations that are class members.
4388    LookupOperatorName,
4389    /// Look up a name following ~ in a destructor name. This is an ordinary
4390    /// lookup, but prefers tags to typedefs.
4391    LookupDestructorName,
4392    /// Look up of a name that precedes the '::' scope resolution
4393    /// operator in C++. This lookup completely ignores operator, object,
4394    /// function, and enumerator names (C++ [basic.lookup.qual]p1).
4395    LookupNestedNameSpecifierName,
4396    /// Look up a namespace name within a C++ using directive or
4397    /// namespace alias definition, ignoring non-namespace names (C++
4398    /// [basic.lookup.udir]p1).
4399    LookupNamespaceName,
4400    /// Look up all declarations in a scope with the given name,
4401    /// including resolved using declarations.  This is appropriate
4402    /// for checking redeclarations for a using declaration.
4403    LookupUsingDeclName,
4404    /// Look up an ordinary name that is going to be redeclared as a
4405    /// name with linkage. This lookup ignores any declarations that
4406    /// are outside of the current scope unless they have linkage. See
4407    /// C99 6.2.2p4-5 and C++ [basic.link]p6.
4408    LookupRedeclarationWithLinkage,
4409    /// Look up a friend of a local class. This lookup does not look
4410    /// outside the innermost non-class scope. See C++11 [class.friend]p11.
4411    LookupLocalFriendName,
4412    /// Look up the name of an Objective-C protocol.
4413    LookupObjCProtocolName,
4414    /// Look up implicit 'self' parameter of an objective-c method.
4415    LookupObjCImplicitSelfParam,
4416    /// Look up the name of an OpenMP user-defined reduction operation.
4417    LookupOMPReductionName,
4418    /// Look up the name of an OpenMP user-defined mapper.
4419    LookupOMPMapperName,
4420    /// Look up any declaration with any name.
4421    LookupAnyName
4422  };
4423
4424  /// Specifies whether (or how) name lookup is being performed for a
4425  /// redeclaration (vs. a reference).
4426  enum RedeclarationKind {
4427    /// The lookup is a reference to this name that is not for the
4428    /// purpose of redeclaring the name.
4429    NotForRedeclaration = 0,
4430    /// The lookup results will be used for redeclaration of a name,
4431    /// if an entity by that name already exists and is visible.
4432    ForVisibleRedeclaration,
4433    /// The lookup results will be used for redeclaration of a name
4434    /// with external linkage; non-visible lookup results with external linkage
4435    /// may also be found.
4436    ForExternalRedeclaration
4437  };
4438
4439  RedeclarationKind forRedeclarationInCurContext() const {
4440    // A declaration with an owning module for linkage can never link against
4441    // anything that is not visible. We don't need to check linkage here; if
4442    // the context has internal linkage, redeclaration lookup won't find things
4443    // from other TUs, and we can't safely compute linkage yet in general.
4444    if (cast<Decl>(CurContext)
4445            ->getOwningModuleForLinkage(/*IgnoreLinkage*/true))
4446      return ForVisibleRedeclaration;
4447    return ForExternalRedeclaration;
4448  }
4449
4450  /// The possible outcomes of name lookup for a literal operator.
4451  enum LiteralOperatorLookupResult {
4452    /// The lookup resulted in an error.
4453    LOLR_Error,
4454    /// The lookup found no match but no diagnostic was issued.
4455    LOLR_ErrorNoDiagnostic,
4456    /// The lookup found a single 'cooked' literal operator, which
4457    /// expects a normal literal to be built and passed to it.
4458    LOLR_Cooked,
4459    /// The lookup found a single 'raw' literal operator, which expects
4460    /// a string literal containing the spelling of the literal token.
4461    LOLR_Raw,
4462    /// The lookup found an overload set of literal operator templates,
4463    /// which expect the characters of the spelling of the literal token to be
4464    /// passed as a non-type template argument pack.
4465    LOLR_Template,
4466    /// The lookup found an overload set of literal operator templates,
4467    /// which expect the character type and characters of the spelling of the
4468    /// string literal token to be passed as template arguments.
4469    LOLR_StringTemplatePack,
4470  };
4471
4472  SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D,
4473                                                  CXXSpecialMember SM,
4474                                                  bool ConstArg,
4475                                                  bool VolatileArg,
4476                                                  bool RValueThis,
4477                                                  bool ConstThis,
4478                                                  bool VolatileThis);
4479
4480  typedef std::function<void(const TypoCorrection &)> TypoDiagnosticGenerator;
4481  typedef std::function<ExprResult(Sema &, TypoExpr *, TypoCorrection)>
4482      TypoRecoveryCallback;
4483
4484private:
4485  bool CppLookupName(LookupResult &R, Scope *S);
4486
4487  struct TypoExprState {
4488    std::unique_ptr<TypoCorrectionConsumer> Consumer;
4489    TypoDiagnosticGenerator DiagHandler;
4490    TypoRecoveryCallback RecoveryHandler;
4491    TypoExprState();
4492    TypoExprState(TypoExprState &&other) noexcept;
4493    TypoExprState &operator=(TypoExprState &&other) noexcept;
4494  };
4495
4496  /// The set of unhandled TypoExprs and their associated state.
4497  llvm::MapVector<TypoExpr *, TypoExprState> DelayedTypos;
4498
4499  /// Creates a new TypoExpr AST node.
4500  TypoExpr *createDelayedTypo(std::unique_ptr<TypoCorrectionConsumer> TCC,
4501                              TypoDiagnosticGenerator TDG,
4502                              TypoRecoveryCallback TRC, SourceLocation TypoLoc);
4503
4504  // The set of known/encountered (unique, canonicalized) NamespaceDecls.
4505  //
4506  // The boolean value will be true to indicate that the namespace was loaded
4507  // from an AST/PCH file, or false otherwise.
4508  llvm::MapVector<NamespaceDecl*, bool> KnownNamespaces;
4509
4510  /// Whether we have already loaded known namespaces from an extenal
4511  /// source.
4512  bool LoadedExternalKnownNamespaces;
4513
4514  /// Helper for CorrectTypo and CorrectTypoDelayed used to create and
4515  /// populate a new TypoCorrectionConsumer. Returns nullptr if typo correction
4516  /// should be skipped entirely.
4517  std::unique_ptr<TypoCorrectionConsumer>
4518  makeTypoCorrectionConsumer(const DeclarationNameInfo &Typo,
4519                             Sema::LookupNameKind LookupKind, Scope *S,
4520                             CXXScopeSpec *SS,
4521                             CorrectionCandidateCallback &CCC,
4522                             DeclContext *MemberContext, bool EnteringContext,
4523                             const ObjCObjectPointerType *OPT,
4524                             bool ErrorRecovery);
4525
4526public:
4527  const TypoExprState &getTypoExprState(TypoExpr *TE) const;
4528
4529  /// Clears the state of the given TypoExpr.
4530  void clearDelayedTypo(TypoExpr *TE);
4531
4532  /// Look up a name, looking for a single declaration.  Return
4533  /// null if the results were absent, ambiguous, or overloaded.
4534  ///
4535  /// It is preferable to use the elaborated form and explicitly handle
4536  /// ambiguity and overloaded.
4537  NamedDecl *LookupSingleName(Scope *S, DeclarationName Name,
4538                              SourceLocation Loc,
4539                              LookupNameKind NameKind,
4540                              RedeclarationKind Redecl
4541                                = NotForRedeclaration);
4542  bool LookupBuiltin(LookupResult &R);
4543  void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
4544  bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
4545                  bool ForceNoCPlusPlus = false);
4546  bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
4547                           bool InUnqualifiedLookup = false);
4548  bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
4549                           CXXScopeSpec &SS);
4550  bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS,
4551                        bool AllowBuiltinCreation = false,
4552                        bool EnteringContext = false);
4553  ObjCProtocolDecl *LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc,
4554                                   RedeclarationKind Redecl
4555                                     = NotForRedeclaration);
4556  bool LookupInSuper(LookupResult &R, CXXRecordDecl *Class);
4557
4558  void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
4559                                    UnresolvedSetImpl &Functions);
4560
4561  LabelDecl *LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc,
4562                                 SourceLocation GnuLabelLoc = SourceLocation());
4563
4564  DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class);
4565  CXXConstructorDecl *LookupDefaultConstructor(CXXRecordDecl *Class);
4566  CXXConstructorDecl *LookupCopyingConstructor(CXXRecordDecl *Class,
4567                                               unsigned Quals);
4568  CXXMethodDecl *LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals,
4569                                         bool RValueThis, unsigned ThisQuals);
4570  CXXConstructorDecl *LookupMovingConstructor(CXXRecordDecl *Class,
4571                                              unsigned Quals);
4572  CXXMethodDecl *LookupMovingAssignment(CXXRecordDecl *Class, unsigned Quals,
4573                                        bool RValueThis, unsigned ThisQuals);
4574  CXXDestructorDecl *LookupDestructor(CXXRecordDecl *Class);
4575
4576  bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
4577                              bool IsUDSuffix);
4578  LiteralOperatorLookupResult
4579  LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef<QualType> ArgTys,
4580                        bool AllowRaw, bool AllowTemplate,
4581                        bool AllowStringTemplate, bool DiagnoseMissing,
4582                        StringLiteral *StringLit = nullptr);
4583  bool isKnownName(StringRef name);
4584
4585  /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4586  enum class FunctionEmissionStatus {
4587    Emitted,
4588    CUDADiscarded,     // Discarded due to CUDA/HIP hostness
4589    OMPDiscarded,      // Discarded due to OpenMP hostness
4590    TemplateDiscarded, // Discarded due to uninstantiated templates
4591    Unknown,
4592  };
4593  FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4594                                           bool Final = false);
4595
4596  // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4597  bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee);
4598
4599  void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc,
4600                               ArrayRef<Expr *> Args, ADLResult &Functions);
4601
4602  void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
4603                          VisibleDeclConsumer &Consumer,
4604                          bool IncludeGlobalScope = true,
4605                          bool LoadExternal = true);
4606  void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
4607                          VisibleDeclConsumer &Consumer,
4608                          bool IncludeGlobalScope = true,
4609                          bool IncludeDependentBases = false,
4610                          bool LoadExternal = true);
4611
4612  enum CorrectTypoKind {
4613    CTK_NonError,     // CorrectTypo used in a non error recovery situation.
4614    CTK_ErrorRecovery // CorrectTypo used in normal error recovery.
4615  };
4616
4617  TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo,
4618                             Sema::LookupNameKind LookupKind,
4619                             Scope *S, CXXScopeSpec *SS,
4620                             CorrectionCandidateCallback &CCC,
4621                             CorrectTypoKind Mode,
4622                             DeclContext *MemberContext = nullptr,
4623                             bool EnteringContext = false,
4624                             const ObjCObjectPointerType *OPT = nullptr,
4625                             bool RecordFailure = true);
4626
4627  TypoExpr *CorrectTypoDelayed(const DeclarationNameInfo &Typo,
4628                               Sema::LookupNameKind LookupKind, Scope *S,
4629                               CXXScopeSpec *SS,
4630                               CorrectionCandidateCallback &CCC,
4631                               TypoDiagnosticGenerator TDG,
4632                               TypoRecoveryCallback TRC, CorrectTypoKind Mode,
4633                               DeclContext *MemberContext = nullptr,
4634                               bool EnteringContext = false,
4635                               const ObjCObjectPointerType *OPT = nullptr);
4636
4637  /// Process any TypoExprs in the given Expr and its children,
4638  /// generating diagnostics as appropriate and returning a new Expr if there
4639  /// were typos that were all successfully corrected and ExprError if one or
4640  /// more typos could not be corrected.
4641  ///
4642  /// \param E The Expr to check for TypoExprs.
4643  ///
4644  /// \param InitDecl A VarDecl to avoid because the Expr being corrected is its
4645  /// initializer.
4646  ///
4647  /// \param RecoverUncorrectedTypos If true, when typo correction fails, it
4648  /// will rebuild the given Expr with all TypoExprs degraded to RecoveryExprs.
4649  ///
4650  /// \param Filter A function applied to a newly rebuilt Expr to determine if
4651  /// it is an acceptable/usable result from a single combination of typo
4652  /// corrections. As long as the filter returns ExprError, different
4653  /// combinations of corrections will be tried until all are exhausted.
4654  ExprResult CorrectDelayedTyposInExpr(
4655      Expr *E, VarDecl *InitDecl = nullptr,
4656      bool RecoverUncorrectedTypos = false,
4657      llvm::function_ref<ExprResult(Expr *)> Filter =
4658          [](Expr *E) -> ExprResult { return E; });
4659
4660  ExprResult CorrectDelayedTyposInExpr(
4661      ExprResult ER, VarDecl *InitDecl = nullptr,
4662      bool RecoverUncorrectedTypos = false,
4663      llvm::function_ref<ExprResult(Expr *)> Filter =
4664          [](Expr *E) -> ExprResult { return E; }) {
4665    return ER.isInvalid()
4666               ? ER
4667               : CorrectDelayedTyposInExpr(ER.get(), InitDecl,
4668                                           RecoverUncorrectedTypos, Filter);
4669  }
4670
4671  void diagnoseTypo(const TypoCorrection &Correction,
4672                    const PartialDiagnostic &TypoDiag,
4673                    bool ErrorRecovery = true);
4674
4675  void diagnoseTypo(const TypoCorrection &Correction,
4676                    const PartialDiagnostic &TypoDiag,
4677                    const PartialDiagnostic &PrevNote,
4678                    bool ErrorRecovery = true);
4679
4680  void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F);
4681
4682  void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc,
4683                                          ArrayRef<Expr *> Args,
4684                                   AssociatedNamespaceSet &AssociatedNamespaces,
4685                                   AssociatedClassSet &AssociatedClasses);
4686
4687  void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S,
4688                            bool ConsiderLinkage, bool AllowInlineNamespace);
4689
4690  bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old);
4691  bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old);
4692  bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old);
4693  bool IsRedefinitionInModule(const NamedDecl *New,
4694                                 const NamedDecl *Old) const;
4695
4696  void DiagnoseAmbiguousLookup(LookupResult &Result);
4697  //@}
4698
4699  /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
4700  ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End,
4701                                ArrayRef<Expr *> SubExprs,
4702                                QualType T = QualType());
4703
4704  ObjCInterfaceDecl *getObjCInterfaceDecl(IdentifierInfo *&Id,
4705                                          SourceLocation IdLoc,
4706                                          bool TypoCorrection = false);
4707  FunctionDecl *CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID,
4708                              SourceLocation Loc);
4709  NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,
4710                                 Scope *S, bool ForRedeclaration,
4711                                 SourceLocation Loc);
4712  NamedDecl *ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II,
4713                                      Scope *S);
4714  void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(
4715      FunctionDecl *FD);
4716  void AddKnownFunctionAttributes(FunctionDecl *FD);
4717
4718  // More parsing and symbol table subroutines.
4719
4720  void ProcessPragmaWeak(Scope *S, Decl *D);
4721  // Decl attributes - this routine is the top level dispatcher.
4722  void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
4723  // Helper for delayed processing of attributes.
4724  void ProcessDeclAttributeDelayed(Decl *D,
4725                                   const ParsedAttributesView &AttrList);
4726
4727  // Options for ProcessDeclAttributeList().
4728  struct ProcessDeclAttributeOptions {
4729    ProcessDeclAttributeOptions()
4730        : IncludeCXX11Attributes(true), IgnoreTypeAttributes(false) {}
4731
4732    ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val) {
4733      ProcessDeclAttributeOptions Result = *this;
4734      Result.IncludeCXX11Attributes = Val;
4735      return Result;
4736    }
4737
4738    ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val) {
4739      ProcessDeclAttributeOptions Result = *this;
4740      Result.IgnoreTypeAttributes = Val;
4741      return Result;
4742    }
4743
4744    // Should C++11 attributes be processed?
4745    bool IncludeCXX11Attributes;
4746
4747    // Should any type attributes encountered be ignored?
4748    // If this option is false, a diagnostic will be emitted for any type
4749    // attributes of a kind that does not "slide" from the declaration to
4750    // the decl-specifier-seq.
4751    bool IgnoreTypeAttributes;
4752  };
4753
4754  void ProcessDeclAttributeList(Scope *S, Decl *D,
4755                                const ParsedAttributesView &AttrList,
4756                                const ProcessDeclAttributeOptions &Options =
4757                                    ProcessDeclAttributeOptions());
4758  bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl,
4759                                   const ParsedAttributesView &AttrList);
4760
4761  void checkUnusedDeclAttributes(Declarator &D);
4762
4763  /// Handles semantic checking for features that are common to all attributes,
4764  /// such as checking whether a parameter was properly specified, or the
4765  /// correct number of arguments were passed, etc. Returns true if the
4766  /// attribute has been diagnosed.
4767  bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
4768                                    bool SkipArgCountCheck = false);
4769  bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
4770                                    bool SkipArgCountCheck = false);
4771
4772  /// Determine if type T is a valid subject for a nonnull and similar
4773  /// attributes. By default, we look through references (the behavior used by
4774  /// nonnull), but if the second parameter is true, then we treat a reference
4775  /// type as valid.
4776  bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4777
4778  bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
4779
4780  /// Check validaty of calling convention attribute \p attr. If \p FD
4781  /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
4782  /// target. Otherwise, it is specified by \p CFT.
4783  bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC,
4784                            const FunctionDecl *FD = nullptr,
4785                            CUDAFunctionTarget CFT = CFT_InvalidTarget);
4786  bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4787  bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4788  bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI,
4789                                      const Expr *E, StringRef &Str,
4790                                      SourceLocation *ArgLocation = nullptr);
4791  bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4792                                      StringRef &Str,
4793                                      SourceLocation *ArgLocation = nullptr);
4794  llvm::Error isValidSectionSpecifier(StringRef Str);
4795  bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
4796  bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
4797  bool checkTargetVersionAttr(SourceLocation LiteralLoc, StringRef &Str,
4798                              bool &isDefault);
4799  bool
4800  checkTargetClonesAttrString(SourceLocation LiteralLoc, StringRef Str,
4801                              const StringLiteral *Literal, bool &HasDefault,
4802                              bool &HasCommas, bool &HasNotDefault,
4803                              SmallVectorImpl<SmallString<64>> &StringsBuffer);
4804  bool checkMSInheritanceAttrOnDefinition(
4805      CXXRecordDecl *RD, SourceRange Range, bool BestCase,
4806      MSInheritanceModel SemanticSpelling);
4807
4808  void CheckAlignasUnderalignment(Decl *D);
4809
4810  bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
4811                         const AttributeCommonInfo &A);
4812  bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
4813                             const AttributeCommonInfo &A);
4814
4815  bool CheckCountedByAttr(Scope *Scope, const FieldDecl *FD);
4816
4817  /// Adjust the calling convention of a method to be the ABI default if it
4818  /// wasn't specified explicitly.  This handles method types formed from
4819  /// function type typedefs and typename template arguments.
4820  void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
4821                              bool IsCtorOrDtor, SourceLocation Loc);
4822
4823  // Check if there is an explicit attribute, but only look through parens.
4824  // The intent is to look for an attribute on the current declarator, but not
4825  // one that came from a typedef.
4826  bool hasExplicitCallingConv(QualType T);
4827
4828  /// Get the outermost AttributedType node that sets a calling convention.
4829  /// Valid types should not have multiple attributes with different CCs.
4830  const AttributedType *getCallingConvAttributedType(QualType T) const;
4831
4832  /// Check whether a nullability type specifier can be added to the given
4833  /// type through some means not written in source (e.g. API notes).
4834  ///
4835  /// \param Type The type to which the nullability specifier will be
4836  /// added. On success, this type will be updated appropriately.
4837  ///
4838  /// \param Nullability The nullability specifier to add.
4839  ///
4840  /// \param DiagLoc The location to use for diagnostics.
4841  ///
4842  /// \param AllowArrayTypes Whether to accept nullability specifiers on an
4843  /// array type (e.g., because it will decay to a pointer).
4844  ///
4845  /// \param OverrideExisting Whether to override an existing, locally-specified
4846  /// nullability specifier rather than complaining about the conflict.
4847  ///
4848  /// \returns true if nullability cannot be applied, false otherwise.
4849  bool CheckImplicitNullabilityTypeSpecifier(QualType &Type,
4850                                             NullabilityKind Nullability,
4851                                             SourceLocation DiagLoc,
4852                                             bool AllowArrayTypes,
4853                                             bool OverrideExisting);
4854
4855  /// Process the attributes before creating an attributed statement. Returns
4856  /// the semantic attributes that have been processed.
4857  void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
4858                             SmallVectorImpl<const Attr *> &OutAttrs);
4859
4860  void WarnConflictingTypedMethods(ObjCMethodDecl *Method,
4861                                   ObjCMethodDecl *MethodDecl,
4862                                   bool IsProtocolMethodDecl);
4863
4864  void CheckConflictingOverridingMethod(ObjCMethodDecl *Method,
4865                                   ObjCMethodDecl *Overridden,
4866                                   bool IsProtocolMethodDecl);
4867
4868  /// WarnExactTypedMethods - This routine issues a warning if method
4869  /// implementation declaration matches exactly that of its declaration.
4870  void WarnExactTypedMethods(ObjCMethodDecl *Method,
4871                             ObjCMethodDecl *MethodDecl,
4872                             bool IsProtocolMethodDecl);
4873
4874  typedef llvm::SmallPtrSet<Selector, 8> SelectorSet;
4875
4876  /// CheckImplementationIvars - This routine checks if the instance variables
4877  /// listed in the implelementation match those listed in the interface.
4878  void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
4879                                ObjCIvarDecl **Fields, unsigned nIvars,
4880                                SourceLocation Loc);
4881
4882  /// ImplMethodsVsClassMethods - This is main routine to warn if any method
4883  /// remains unimplemented in the class or category \@implementation.
4884  void ImplMethodsVsClassMethods(Scope *S, ObjCImplDecl* IMPDecl,
4885                                 ObjCContainerDecl* IDecl,
4886                                 bool IncompleteImpl = false);
4887
4888  /// DiagnoseUnimplementedProperties - This routine warns on those properties
4889  /// which must be implemented by this implementation.
4890  void DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
4891                                       ObjCContainerDecl *CDecl,
4892                                       bool SynthesizeProperties);
4893
4894  /// Diagnose any null-resettable synthesized setters.
4895  void diagnoseNullResettableSynthesizedSetters(const ObjCImplDecl *impDecl);
4896
4897  /// DefaultSynthesizeProperties - This routine default synthesizes all
4898  /// properties which must be synthesized in the class's \@implementation.
4899  void DefaultSynthesizeProperties(Scope *S, ObjCImplDecl *IMPDecl,
4900                                   ObjCInterfaceDecl *IDecl,
4901                                   SourceLocation AtEnd);
4902  void DefaultSynthesizeProperties(Scope *S, Decl *D, SourceLocation AtEnd);
4903
4904  /// IvarBacksCurrentMethodAccessor - This routine returns 'true' if 'IV' is
4905  /// an ivar synthesized for 'Method' and 'Method' is a property accessor
4906  /// declared in class 'IFace'.
4907  bool IvarBacksCurrentMethodAccessor(ObjCInterfaceDecl *IFace,
4908                                      ObjCMethodDecl *Method, ObjCIvarDecl *IV);
4909
4910  /// DiagnoseUnusedBackingIvarInAccessor - Issue an 'unused' warning if ivar which
4911  /// backs the property is not used in the property's accessor.
4912  void DiagnoseUnusedBackingIvarInAccessor(Scope *S,
4913                                           const ObjCImplementationDecl *ImplD);
4914
4915  /// GetIvarBackingPropertyAccessor - If method is a property setter/getter and
4916  /// it property has a backing ivar, returns this ivar; otherwise, returns NULL.
4917  /// It also returns ivar's property on success.
4918  ObjCIvarDecl *GetIvarBackingPropertyAccessor(const ObjCMethodDecl *Method,
4919                                               const ObjCPropertyDecl *&PDecl) const;
4920
4921  /// Called by ActOnProperty to handle \@property declarations in
4922  /// class extensions.
4923  ObjCPropertyDecl *HandlePropertyInClassExtension(Scope *S,
4924                      SourceLocation AtLoc,
4925                      SourceLocation LParenLoc,
4926                      FieldDeclarator &FD,
4927                      Selector GetterSel,
4928                      SourceLocation GetterNameLoc,
4929                      Selector SetterSel,
4930                      SourceLocation SetterNameLoc,
4931                      const bool isReadWrite,
4932                      unsigned &Attributes,
4933                      const unsigned AttributesAsWritten,
4934                      QualType T,
4935                      TypeSourceInfo *TSI,
4936                      tok::ObjCKeywordKind MethodImplKind);
4937
4938  /// Called by ActOnProperty and HandlePropertyInClassExtension to
4939  /// handle creating the ObjcPropertyDecl for a category or \@interface.
4940  ObjCPropertyDecl *CreatePropertyDecl(Scope *S,
4941                                       ObjCContainerDecl *CDecl,
4942                                       SourceLocation AtLoc,
4943                                       SourceLocation LParenLoc,
4944                                       FieldDeclarator &FD,
4945                                       Selector GetterSel,
4946                                       SourceLocation GetterNameLoc,
4947                                       Selector SetterSel,
4948                                       SourceLocation SetterNameLoc,
4949                                       const bool isReadWrite,
4950                                       const unsigned Attributes,
4951                                       const unsigned AttributesAsWritten,
4952                                       QualType T,
4953                                       TypeSourceInfo *TSI,
4954                                       tok::ObjCKeywordKind MethodImplKind,
4955                                       DeclContext *lexicalDC = nullptr);
4956
4957  /// AtomicPropertySetterGetterRules - This routine enforces the rule (via
4958  /// warning) when atomic property has one but not the other user-declared
4959  /// setter or getter.
4960  void AtomicPropertySetterGetterRules(ObjCImplDecl* IMPDecl,
4961                                       ObjCInterfaceDecl* IDecl);
4962
4963  void DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D);
4964
4965  void DiagnoseMissingDesignatedInitOverrides(
4966                                          const ObjCImplementationDecl *ImplD,
4967                                          const ObjCInterfaceDecl *IFD);
4968
4969  void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID);
4970
4971  enum MethodMatchStrategy {
4972    MMS_loose,
4973    MMS_strict
4974  };
4975
4976  /// MatchTwoMethodDeclarations - Checks if two methods' type match and returns
4977  /// true, or false, accordingly.
4978  bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method,
4979                                  const ObjCMethodDecl *PrevMethod,
4980                                  MethodMatchStrategy strategy = MMS_strict);
4981
4982  /// MatchAllMethodDeclarations - Check methods declaraed in interface or
4983  /// or protocol against those declared in their implementations.
4984  void MatchAllMethodDeclarations(const SelectorSet &InsMap,
4985                                  const SelectorSet &ClsMap,
4986                                  SelectorSet &InsMapSeen,
4987                                  SelectorSet &ClsMapSeen,
4988                                  ObjCImplDecl* IMPDecl,
4989                                  ObjCContainerDecl* IDecl,
4990                                  bool &IncompleteImpl,
4991                                  bool ImmediateClass,
4992                                  bool WarnCategoryMethodImpl=false);
4993
4994  /// CheckCategoryVsClassMethodMatches - Checks that methods implemented in
4995  /// category matches with those implemented in its primary class and
4996  /// warns each time an exact match is found.
4997  void CheckCategoryVsClassMethodMatches(ObjCCategoryImplDecl *CatIMP);
4998
4999  /// Add the given method to the list of globally-known methods.
5000  void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method);
5001
5002  /// Returns default addr space for method qualifiers.
5003  LangAS getDefaultCXXMethodAddrSpace() const;
5004
5005private:
5006  /// AddMethodToGlobalPool - Add an instance or factory method to the global
5007  /// pool. See descriptoin of AddInstanceMethodToGlobalPool.
5008  void AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl, bool instance);
5009
5010  /// LookupMethodInGlobalPool - Returns the instance or factory method and
5011  /// optionally warns if there are multiple signatures.
5012  ObjCMethodDecl *LookupMethodInGlobalPool(Selector Sel, SourceRange R,
5013                                           bool receiverIdOrClass,
5014                                           bool instance);
5015
5016public:
5017  /// - Returns instance or factory methods in global method pool for
5018  /// given selector. It checks the desired kind first, if none is found, and
5019  /// parameter checkTheOther is set, it then checks the other kind. If no such
5020  /// method or only one method is found, function returns false; otherwise, it
5021  /// returns true.
5022  bool
5023  CollectMultipleMethodsInGlobalPool(Selector Sel,
5024                                     SmallVectorImpl<ObjCMethodDecl*>& Methods,
5025                                     bool InstanceFirst, bool CheckTheOther,
5026                                     const ObjCObjectType *TypeBound = nullptr);
5027
5028  bool
5029  AreMultipleMethodsInGlobalPool(Selector Sel, ObjCMethodDecl *BestMethod,
5030                                 SourceRange R, bool receiverIdOrClass,
5031                                 SmallVectorImpl<ObjCMethodDecl*>& Methods);
5032
5033  void
5034  DiagnoseMultipleMethodInGlobalPool(SmallVectorImpl<ObjCMethodDecl*> &Methods,
5035                                     Selector Sel, SourceRange R,
5036                                     bool receiverIdOrClass);
5037
5038private:
5039  /// - Returns a selector which best matches given argument list or
5040  /// nullptr if none could be found
5041  ObjCMethodDecl *SelectBestMethod(Selector Sel, MultiExprArg Args,
5042                                   bool IsInstance,
5043                                   SmallVectorImpl<ObjCMethodDecl*>& Methods);
5044
5045
5046  /// Record the typo correction failure and return an empty correction.
5047  TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
5048                                  bool RecordFailure = true) {
5049    if (RecordFailure)
5050      TypoCorrectionFailures[Typo].insert(TypoLoc);
5051    return TypoCorrection();
5052  }
5053
5054public:
5055  /// AddInstanceMethodToGlobalPool - All instance methods in a translation
5056  /// unit are added to a global pool. This allows us to efficiently associate
5057  /// a selector with a method declaraation for purposes of typechecking
5058  /// messages sent to "id" (where the class of the object is unknown).
5059  void AddInstanceMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false) {
5060    AddMethodToGlobalPool(Method, impl, /*instance*/true);
5061  }
5062
5063  /// AddFactoryMethodToGlobalPool - Same as above, but for factory methods.
5064  void AddFactoryMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false) {
5065    AddMethodToGlobalPool(Method, impl, /*instance*/false);
5066  }
5067
5068  /// AddAnyMethodToGlobalPool - Add any method, instance or factory to global
5069  /// pool.
5070  void AddAnyMethodToGlobalPool(Decl *D);
5071
5072  /// LookupInstanceMethodInGlobalPool - Returns the method and warns if
5073  /// there are multiple signatures.
5074  ObjCMethodDecl *LookupInstanceMethodInGlobalPool(Selector Sel, SourceRange R,
5075                                                   bool receiverIdOrClass=false) {
5076    return LookupMethodInGlobalPool(Sel, R, receiverIdOrClass,
5077                                    /*instance*/true);
5078  }
5079
5080  /// LookupFactoryMethodInGlobalPool - Returns the method and warns if
5081  /// there are multiple signatures.
5082  ObjCMethodDecl *LookupFactoryMethodInGlobalPool(Selector Sel, SourceRange R,
5083                                                  bool receiverIdOrClass=false) {
5084    return LookupMethodInGlobalPool(Sel, R, receiverIdOrClass,
5085                                    /*instance*/false);
5086  }
5087
5088  const ObjCMethodDecl *SelectorsForTypoCorrection(Selector Sel,
5089                              QualType ObjectType=QualType());
5090  /// LookupImplementedMethodInGlobalPool - Returns the method which has an
5091  /// implementation.
5092  ObjCMethodDecl *LookupImplementedMethodInGlobalPool(Selector Sel);
5093
5094  /// CollectIvarsToConstructOrDestruct - Collect those ivars which require
5095  /// initialization.
5096  void CollectIvarsToConstructOrDestruct(ObjCInterfaceDecl *OI,
5097                                  SmallVectorImpl<ObjCIvarDecl*> &Ivars);
5098
5099  //===--------------------------------------------------------------------===//
5100  // Statement Parsing Callbacks: SemaStmt.cpp.
5101public:
5102  class FullExprArg {
5103  public:
5104    FullExprArg() : E(nullptr) { }
5105    FullExprArg(Sema &actions) : E(nullptr) { }
5106
5107    ExprResult release() {
5108      return E;
5109    }
5110
5111    Expr *get() const { return E; }
5112
5113    Expr *operator->() {
5114      return E;
5115    }
5116
5117  private:
5118    // FIXME: No need to make the entire Sema class a friend when it's just
5119    // Sema::MakeFullExpr that needs access to the constructor below.
5120    friend class Sema;
5121
5122    explicit FullExprArg(Expr *expr) : E(expr) {}
5123
5124    Expr *E;
5125  };
5126
5127  FullExprArg MakeFullExpr(Expr *Arg) {
5128    return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
5129  }
5130  FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC) {
5131    return FullExprArg(
5132        ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
5133  }
5134  FullExprArg MakeFullDiscardedValueExpr(Expr *Arg) {
5135    ExprResult FE =
5136        ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
5137                            /*DiscardedValue*/ true);
5138    return FullExprArg(FE.get());
5139  }
5140
5141  StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
5142  StmtResult ActOnExprStmtError();
5143
5144  StmtResult ActOnNullStmt(SourceLocation SemiLoc,
5145                           bool HasLeadingEmptyMacro = false);
5146
5147  void ActOnStartOfCompoundStmt(bool IsStmtExpr);
5148  void ActOnAfterCompoundStatementLeadingPragmas();
5149  void ActOnFinishOfCompoundStmt();
5150  StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R,
5151                               ArrayRef<Stmt *> Elts, bool isStmtExpr);
5152
5153  /// A RAII object to enter scope of a compound statement.
5154  class CompoundScopeRAII {
5155  public:
5156    CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
5157      S.ActOnStartOfCompoundStmt(IsStmtExpr);
5158    }
5159
5160    ~CompoundScopeRAII() {
5161      S.ActOnFinishOfCompoundStmt();
5162    }
5163
5164  private:
5165    Sema &S;
5166  };
5167
5168  /// An RAII helper that pops function a function scope on exit.
5169  struct FunctionScopeRAII {
5170    Sema &S;
5171    bool Active;
5172    FunctionScopeRAII(Sema &S) : S(S), Active(true) {}
5173    ~FunctionScopeRAII() {
5174      if (Active)
5175        S.PopFunctionScopeInfo();
5176    }
5177    void disable() { Active = false; }
5178  };
5179
5180  StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl,
5181                                   SourceLocation StartLoc,
5182                                   SourceLocation EndLoc);
5183  void ActOnForEachDeclStmt(DeclGroupPtrTy Decl);
5184  StmtResult ActOnForEachLValueExpr(Expr *E);
5185  ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val);
5186  StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS,
5187                           SourceLocation DotDotDotLoc, ExprResult RHS,
5188                           SourceLocation ColonLoc);
5189  void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
5190
5191  StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc,
5192                                      SourceLocation ColonLoc,
5193                                      Stmt *SubStmt, Scope *CurScope);
5194  StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl,
5195                            SourceLocation ColonLoc, Stmt *SubStmt);
5196
5197  StmtResult BuildAttributedStmt(SourceLocation AttrsLoc,
5198                                 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
5199  StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList,
5200                                 Stmt *SubStmt);
5201
5202  class ConditionResult;
5203
5204  StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind,
5205                         SourceLocation LParenLoc, Stmt *InitStmt,
5206                         ConditionResult Cond, SourceLocation RParenLoc,
5207                         Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
5208  StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind,
5209                         SourceLocation LParenLoc, Stmt *InitStmt,
5210                         ConditionResult Cond, SourceLocation RParenLoc,
5211                         Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
5212  StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc,
5213                                    SourceLocation LParenLoc, Stmt *InitStmt,
5214                                    ConditionResult Cond,
5215                                    SourceLocation RParenLoc);
5216  StmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc,
5217                                           Stmt *Switch, Stmt *Body);
5218  StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
5219                            ConditionResult Cond, SourceLocation RParenLoc,
5220                            Stmt *Body);
5221  StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body,
5222                         SourceLocation WhileLoc, SourceLocation CondLParen,
5223                         Expr *Cond, SourceLocation CondRParen);
5224
5225  StmtResult ActOnForStmt(SourceLocation ForLoc,
5226                          SourceLocation LParenLoc,
5227                          Stmt *First,
5228                          ConditionResult Second,
5229                          FullExprArg Third,
5230                          SourceLocation RParenLoc,
5231                          Stmt *Body);
5232  ExprResult CheckObjCForCollectionOperand(SourceLocation forLoc,
5233                                           Expr *collection);
5234  StmtResult ActOnObjCForCollectionStmt(SourceLocation ForColLoc,
5235                                        Stmt *First, Expr *collection,
5236                                        SourceLocation RParenLoc);
5237  StmtResult FinishObjCForCollectionStmt(Stmt *ForCollection, Stmt *Body);
5238
5239  enum BuildForRangeKind {
5240    /// Initial building of a for-range statement.
5241    BFRK_Build,
5242    /// Instantiation or recovery rebuild of a for-range statement. Don't
5243    /// attempt any typo-correction.
5244    BFRK_Rebuild,
5245    /// Determining whether a for-range statement could be built. Avoid any
5246    /// unnecessary or irreversible actions.
5247    BFRK_Check
5248  };
5249
5250  StmtResult ActOnCXXForRangeStmt(Scope *S, SourceLocation ForLoc,
5251                                  SourceLocation CoawaitLoc,
5252                                  Stmt *InitStmt,
5253                                  Stmt *LoopVar,
5254                                  SourceLocation ColonLoc, Expr *Collection,
5255                                  SourceLocation RParenLoc,
5256                                  BuildForRangeKind Kind);
5257  StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc,
5258                                  SourceLocation CoawaitLoc,
5259                                  Stmt *InitStmt,
5260                                  SourceLocation ColonLoc,
5261                                  Stmt *RangeDecl, Stmt *Begin, Stmt *End,
5262                                  Expr *Cond, Expr *Inc,
5263                                  Stmt *LoopVarDecl,
5264                                  SourceLocation RParenLoc,
5265                                  BuildForRangeKind Kind);
5266  StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
5267
5268  StmtResult ActOnGotoStmt(SourceLocation GotoLoc,
5269                           SourceLocation LabelLoc,
5270                           LabelDecl *TheDecl);
5271  StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
5272                                   SourceLocation StarLoc,
5273                                   Expr *DestExp);
5274  StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope);
5275  StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope);
5276
5277  void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
5278                                CapturedRegionKind Kind, unsigned NumParams);
5279  typedef std::pair<StringRef, QualType> CapturedParamNameType;
5280  void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
5281                                CapturedRegionKind Kind,
5282                                ArrayRef<CapturedParamNameType> Params,
5283                                unsigned OpenMPCaptureLevel = 0);
5284  StmtResult ActOnCapturedRegionEnd(Stmt *S);
5285  void ActOnCapturedRegionError();
5286  RecordDecl *CreateCapturedStmtRecordDecl(CapturedDecl *&CD,
5287                                           SourceLocation Loc,
5288                                           unsigned NumParams);
5289
5290  struct NamedReturnInfo {
5291    const VarDecl *Candidate;
5292
5293    enum Status : uint8_t { None, MoveEligible, MoveEligibleAndCopyElidable };
5294    Status S;
5295
5296    bool isMoveEligible() const { return S != None; };
5297    bool isCopyElidable() const { return S == MoveEligibleAndCopyElidable; }
5298  };
5299  enum class SimplerImplicitMoveMode { ForceOff, Normal, ForceOn };
5300  NamedReturnInfo getNamedReturnInfo(
5301      Expr *&E, SimplerImplicitMoveMode Mode = SimplerImplicitMoveMode::Normal);
5302  NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
5303  const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
5304                                         QualType ReturnType);
5305
5306  ExprResult
5307  PerformMoveOrCopyInitialization(const InitializedEntity &Entity,
5308                                  const NamedReturnInfo &NRInfo, Expr *Value,
5309                                  bool SupressSimplerImplicitMoves = false);
5310
5311  StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
5312                             Scope *CurScope);
5313  StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
5314                             bool AllowRecovery = false);
5315  StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
5316                                     NamedReturnInfo &NRInfo,
5317                                     bool SupressSimplerImplicitMoves);
5318
5319  StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
5320                             bool IsVolatile, unsigned NumOutputs,
5321                             unsigned NumInputs, IdentifierInfo **Names,
5322                             MultiExprArg Constraints, MultiExprArg Exprs,
5323                             Expr *AsmString, MultiExprArg Clobbers,
5324                             unsigned NumLabels,
5325                             SourceLocation RParenLoc);
5326
5327  void FillInlineAsmIdentifierInfo(Expr *Res,
5328                                   llvm::InlineAsmIdentifierInfo &Info);
5329  ExprResult LookupInlineAsmIdentifier(CXXScopeSpec &SS,
5330                                       SourceLocation TemplateKWLoc,
5331                                       UnqualifiedId &Id,
5332                                       bool IsUnevaluatedContext);
5333  bool LookupInlineAsmField(StringRef Base, StringRef Member,
5334                            unsigned &Offset, SourceLocation AsmLoc);
5335  ExprResult LookupInlineAsmVarDeclField(Expr *RefExpr, StringRef Member,
5336                                         SourceLocation AsmLoc);
5337  StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
5338                            ArrayRef<Token> AsmToks,
5339                            StringRef AsmString,
5340                            unsigned NumOutputs, unsigned NumInputs,
5341                            ArrayRef<StringRef> Constraints,
5342                            ArrayRef<StringRef> Clobbers,
5343                            ArrayRef<Expr*> Exprs,
5344                            SourceLocation EndLoc);
5345  LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
5346                                   SourceLocation Location,
5347                                   bool AlwaysCreate);
5348
5349  VarDecl *BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType ExceptionType,
5350                                  SourceLocation StartLoc,
5351                                  SourceLocation IdLoc, IdentifierInfo *Id,
5352                                  bool Invalid = false);
5353
5354  Decl *ActOnObjCExceptionDecl(Scope *S, Declarator &D);
5355
5356  StmtResult ActOnObjCAtCatchStmt(SourceLocation AtLoc, SourceLocation RParen,
5357                                  Decl *Parm, Stmt *Body);
5358
5359  StmtResult ActOnObjCAtFinallyStmt(SourceLocation AtLoc, Stmt *Body);
5360
5361  StmtResult ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try,
5362                                MultiStmtArg Catch, Stmt *Finally);
5363
5364  StmtResult BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw);
5365  StmtResult ActOnObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw,
5366                                  Scope *CurScope);
5367  ExprResult ActOnObjCAtSynchronizedOperand(SourceLocation atLoc,
5368                                            Expr *operand);
5369  StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc,
5370                                         Expr *SynchExpr,
5371                                         Stmt *SynchBody);
5372
5373  StmtResult ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body);
5374
5375  VarDecl *BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo,
5376                                     SourceLocation StartLoc,
5377                                     SourceLocation IdLoc,
5378                                     IdentifierInfo *Id);
5379
5380  Decl *ActOnExceptionDeclarator(Scope *S, Declarator &D);
5381
5382  StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc,
5383                                Decl *ExDecl, Stmt *HandlerBlock);
5384  StmtResult ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock,
5385                              ArrayRef<Stmt *> Handlers);
5386
5387  StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
5388                              SourceLocation TryLoc, Stmt *TryBlock,
5389                              Stmt *Handler);
5390  StmtResult ActOnSEHExceptBlock(SourceLocation Loc,
5391                                 Expr *FilterExpr,
5392                                 Stmt *Block);
5393  void ActOnStartSEHFinallyBlock();
5394  void ActOnAbortSEHFinallyBlock();
5395  StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block);
5396  StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope);
5397
5398  void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock);
5399
5400  bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const;
5401
5402  /// If it's a file scoped decl that must warn if not used, keep track
5403  /// of it.
5404  void MarkUnusedFileScopedDecl(const DeclaratorDecl *D);
5405
5406  typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
5407      DiagReceiverTy;
5408
5409  /// DiagnoseUnusedExprResult - If the statement passed in is an expression
5410  /// whose result is unused, warn.
5411  void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
5412  void DiagnoseUnusedNestedTypedefs(const RecordDecl *D);
5413  void DiagnoseUnusedNestedTypedefs(const RecordDecl *D,
5414                                    DiagReceiverTy DiagReceiver);
5415  void DiagnoseUnusedDecl(const NamedDecl *ND);
5416  void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
5417
5418  /// If VD is set but not otherwise used, diagnose, for a parameter or a
5419  /// variable.
5420  void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
5421
5422  /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
5423  /// statement as a \p Body, and it is located on the same line.
5424  ///
5425  /// This helps prevent bugs due to typos, such as:
5426  ///     if (condition);
5427  ///       do_stuff();
5428  void DiagnoseEmptyStmtBody(SourceLocation StmtLoc,
5429                             const Stmt *Body,
5430                             unsigned DiagID);
5431
5432  /// Warn if a for/while loop statement \p S, which is followed by
5433  /// \p PossibleBody, has a suspicious null statement as a body.
5434  void DiagnoseEmptyLoopBody(const Stmt *S,
5435                             const Stmt *PossibleBody);
5436
5437  /// Warn if a value is moved to itself.
5438  void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
5439                        SourceLocation OpLoc);
5440
5441  /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
5442  /// SelfAssigned when inside a CXXMethodDecl.
5443  const FieldDecl *
5444  getSelfAssignmentClassMemberCandidate(const ValueDecl *SelfAssigned);
5445
5446  /// Warn if we're implicitly casting from a _Nullable pointer type to a
5447  /// _Nonnull one.
5448  void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType,
5449                                           SourceLocation Loc);
5450
5451  /// Warn when implicitly casting 0 to nullptr.
5452  void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
5453
5454  ParsingDeclState PushParsingDeclaration(sema::DelayedDiagnosticPool &pool) {
5455    return DelayedDiagnostics.push(pool);
5456  }
5457  void PopParsingDeclaration(ParsingDeclState state, Decl *decl);
5458
5459  typedef ProcessingContextState ParsingClassState;
5460  ParsingClassState PushParsingClass() {
5461    ParsingClassDepth++;
5462    return DelayedDiagnostics.pushUndelayed();
5463  }
5464  void PopParsingClass(ParsingClassState state) {
5465    ParsingClassDepth--;
5466    DelayedDiagnostics.popUndelayed(state);
5467  }
5468
5469  void redelayDiagnostics(sema::DelayedDiagnosticPool &pool);
5470
5471  void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs,
5472                                  const ObjCInterfaceDecl *UnknownObjCClass,
5473                                  bool ObjCPropertyAccess,
5474                                  bool AvoidPartialAvailabilityChecks = false,
5475                                  ObjCInterfaceDecl *ClassReceiver = nullptr);
5476
5477  bool makeUnavailableInSystemHeader(SourceLocation loc,
5478                                     UnavailableAttr::ImplicitReason reason);
5479
5480  /// Issue any -Wunguarded-availability warnings in \c FD
5481  void DiagnoseUnguardedAvailabilityViolations(Decl *FD);
5482
5483  void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx);
5484
5485  //===--------------------------------------------------------------------===//
5486  // Expression Parsing Callbacks: SemaExpr.cpp.
5487
5488  bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
5489  // A version of DiagnoseUseOfDecl that should be used if overload resolution
5490  // has been used to find this declaration, which means we don't have to bother
5491  // checking the trailing requires clause.
5492  bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc) {
5493    return DiagnoseUseOfDecl(
5494        D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
5495        /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
5496        /*SkipTrailingRequiresClause=*/true);
5497  }
5498
5499  bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs,
5500                         const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
5501                         bool ObjCPropertyAccess = false,
5502                         bool AvoidPartialAvailabilityChecks = false,
5503                         ObjCInterfaceDecl *ClassReciever = nullptr,
5504                         bool SkipTrailingRequiresClause = false);
5505  void NoteDeletedFunction(FunctionDecl *FD);
5506  void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD);
5507  bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD,
5508                                        ObjCMethodDecl *Getter,
5509                                        SourceLocation Loc);
5510  void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc,
5511                             ArrayRef<Expr *> Args);
5512
5513  void PushExpressionEvaluationContext(
5514      ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
5515      ExpressionEvaluationContextRecord::ExpressionKind Type =
5516          ExpressionEvaluationContextRecord::EK_Other);
5517  enum ReuseLambdaContextDecl_t { ReuseLambdaContextDecl };
5518  void PushExpressionEvaluationContext(
5519      ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
5520      ExpressionEvaluationContextRecord::ExpressionKind Type =
5521          ExpressionEvaluationContextRecord::EK_Other);
5522  void PopExpressionEvaluationContext();
5523
5524  void DiscardCleanupsInEvaluationContext();
5525
5526  ExprResult TransformToPotentiallyEvaluated(Expr *E);
5527  TypeSourceInfo *TransformToPotentiallyEvaluated(TypeSourceInfo *TInfo);
5528  ExprResult HandleExprEvaluationContextForTypeof(Expr *E);
5529
5530  ExprResult CheckUnevaluatedOperand(Expr *E);
5531  void CheckUnusedVolatileAssignment(Expr *E);
5532
5533  ExprResult ActOnConstantExpression(ExprResult Res);
5534
5535  // Functions for marking a declaration referenced.  These functions also
5536  // contain the relevant logic for marking if a reference to a function or
5537  // variable is an odr-use (in the C++11 sense).  There are separate variants
5538  // for expressions referring to a decl; these exist because odr-use marking
5539  // needs to be delayed for some constant variables when we build one of the
5540  // named expressions.
5541  //
5542  // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
5543  // should usually be true. This only needs to be set to false if the lack of
5544  // odr-use cannot be determined from the current context (for instance,
5545  // because the name denotes a virtual function and was written without an
5546  // explicit nested-name-specifier).
5547  void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
5548  void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func,
5549                              bool MightBeOdrUse = true);
5550  void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var);
5551  void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
5552  void MarkMemberReferenced(MemberExpr *E);
5553  void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E);
5554  void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc,
5555                                         unsigned CapturingScopeIndex);
5556
5557  ExprResult CheckLValueToRValueConversionOperand(Expr *E);
5558  void CleanupVarDeclMarking();
5559
5560  enum TryCaptureKind {
5561    TryCapture_Implicit, TryCapture_ExplicitByVal, TryCapture_ExplicitByRef
5562  };
5563
5564  /// Try to capture the given variable.
5565  ///
5566  /// \param Var The variable to capture.
5567  ///
5568  /// \param Loc The location at which the capture occurs.
5569  ///
5570  /// \param Kind The kind of capture, which may be implicit (for either a
5571  /// block or a lambda), or explicit by-value or by-reference (for a lambda).
5572  ///
5573  /// \param EllipsisLoc The location of the ellipsis, if one is provided in
5574  /// an explicit lambda capture.
5575  ///
5576  /// \param BuildAndDiagnose Whether we are actually supposed to add the
5577  /// captures or diagnose errors. If false, this routine merely check whether
5578  /// the capture can occur without performing the capture itself or complaining
5579  /// if the variable cannot be captured.
5580  ///
5581  /// \param CaptureType Will be set to the type of the field used to capture
5582  /// this variable in the innermost block or lambda. Only valid when the
5583  /// variable can be captured.
5584  ///
5585  /// \param DeclRefType Will be set to the type of a reference to the capture
5586  /// from within the current scope. Only valid when the variable can be
5587  /// captured.
5588  ///
5589  /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
5590  /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
5591  /// This is useful when enclosing lambdas must speculatively capture
5592  /// variables that may or may not be used in certain specializations of
5593  /// a nested generic lambda.
5594  ///
5595  /// \returns true if an error occurred (i.e., the variable cannot be
5596  /// captured) and false if the capture succeeded.
5597  bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc,
5598                          TryCaptureKind Kind, SourceLocation EllipsisLoc,
5599                          bool BuildAndDiagnose, QualType &CaptureType,
5600                          QualType &DeclRefType,
5601                          const unsigned *const FunctionScopeIndexToStopAt);
5602
5603  /// Try to capture the given variable.
5604  bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc,
5605                          TryCaptureKind Kind = TryCapture_Implicit,
5606                          SourceLocation EllipsisLoc = SourceLocation());
5607
5608  /// Checks if the variable must be captured.
5609  bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc);
5610
5611  /// Given a variable, determine the type that a reference to that
5612  /// variable will have in the given scope.
5613  QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc);
5614
5615  /// Mark all of the declarations referenced within a particular AST node as
5616  /// referenced. Used when template instantiation instantiates a non-dependent
5617  /// type -- entities referenced by the type are now referenced.
5618  void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T);
5619  void MarkDeclarationsReferencedInExpr(
5620      Expr *E, bool SkipLocalVariables = false,
5621      ArrayRef<const Expr *> StopAt = std::nullopt);
5622
5623  /// Try to recover by turning the given expression into a
5624  /// call.  Returns true if recovery was attempted or an error was
5625  /// emitted; this may also leave the ExprResult invalid.
5626  bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,
5627                            bool ForceComplain = false,
5628                            bool (*IsPlausibleResult)(QualType) = nullptr);
5629
5630  /// Figure out if an expression could be turned into a call.
5631  bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
5632                     UnresolvedSetImpl &NonTemplateOverloads);
5633
5634  /// Try to convert an expression \p E to type \p Ty. Returns the result of the
5635  /// conversion.
5636  ExprResult tryConvertExprToType(Expr *E, QualType Ty);
5637
5638  /// Conditionally issue a diagnostic based on the statements's reachability
5639  /// analysis.
5640  ///
5641  /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
5642  /// the function body is parsed, and then do a basic reachability analysis to
5643  /// determine if the statement is reachable. If it is unreachable, the
5644  /// diagnostic will not be emitted.
5645  bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
5646                       const PartialDiagnostic &PD);
5647
5648  /// Conditionally issue a diagnostic based on the current
5649  /// evaluation context.
5650  ///
5651  /// \param Statement If Statement is non-null, delay reporting the
5652  /// diagnostic until the function body is parsed, and then do a basic
5653  /// reachability analysis to determine if the statement is reachable.
5654  /// If it is unreachable, the diagnostic will not be emitted.
5655  bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
5656                           const PartialDiagnostic &PD);
5657  /// Similar, but diagnostic is only produced if all the specified statements
5658  /// are reachable.
5659  bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt*> Stmts,
5660                           const PartialDiagnostic &PD);
5661
5662  // Primary Expressions.
5663  SourceRange getExprRange(Expr *E) const;
5664
5665  ExprResult ActOnIdExpression(
5666      Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
5667      UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand,
5668      CorrectionCandidateCallback *CCC = nullptr,
5669      bool IsInlineAsmIdentifier = false, Token *KeywordReplacement = nullptr);
5670
5671  void DecomposeUnqualifiedId(const UnqualifiedId &Id,
5672                              TemplateArgumentListInfo &Buffer,
5673                              DeclarationNameInfo &NameInfo,
5674                              const TemplateArgumentListInfo *&TemplateArgs);
5675
5676  bool DiagnoseDependentMemberLookup(const LookupResult &R);
5677
5678  bool
5679  DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
5680                      CorrectionCandidateCallback &CCC,
5681                      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
5682                      ArrayRef<Expr *> Args = std::nullopt,
5683                      DeclContext *LookupCtx = nullptr,
5684                      TypoExpr **Out = nullptr);
5685
5686  DeclResult LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S,
5687                                    IdentifierInfo *II);
5688  ExprResult BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV);
5689
5690  ExprResult LookupInObjCMethod(LookupResult &LookUp, Scope *S,
5691                                IdentifierInfo *II,
5692                                bool AllowBuiltinCreation=false);
5693
5694  ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS,
5695                                        SourceLocation TemplateKWLoc,
5696                                        const DeclarationNameInfo &NameInfo,
5697                                        bool isAddressOfOperand,
5698                                const TemplateArgumentListInfo *TemplateArgs);
5699
5700  /// If \p D cannot be odr-used in the current expression evaluation context,
5701  /// return a reason explaining why. Otherwise, return NOUR_None.
5702  NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D);
5703
5704  DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
5705                                SourceLocation Loc,
5706                                const CXXScopeSpec *SS = nullptr);
5707  DeclRefExpr *
5708  BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
5709                   const DeclarationNameInfo &NameInfo,
5710                   const CXXScopeSpec *SS = nullptr,
5711                   NamedDecl *FoundD = nullptr,
5712                   SourceLocation TemplateKWLoc = SourceLocation(),
5713                   const TemplateArgumentListInfo *TemplateArgs = nullptr);
5714  DeclRefExpr *
5715  BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
5716                   const DeclarationNameInfo &NameInfo,
5717                   NestedNameSpecifierLoc NNS,
5718                   NamedDecl *FoundD = nullptr,
5719                   SourceLocation TemplateKWLoc = SourceLocation(),
5720                   const TemplateArgumentListInfo *TemplateArgs = nullptr);
5721
5722  ExprResult
5723  BuildAnonymousStructUnionMemberReference(
5724      const CXXScopeSpec &SS,
5725      SourceLocation nameLoc,
5726      IndirectFieldDecl *indirectField,
5727      DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
5728      Expr *baseObjectExpr = nullptr,
5729      SourceLocation opLoc = SourceLocation());
5730
5731  ExprResult BuildPossibleImplicitMemberExpr(
5732      const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
5733      const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
5734      UnresolvedLookupExpr *AsULE = nullptr);
5735  ExprResult BuildImplicitMemberExpr(const CXXScopeSpec &SS,
5736                                     SourceLocation TemplateKWLoc,
5737                                     LookupResult &R,
5738                                const TemplateArgumentListInfo *TemplateArgs,
5739                                     bool IsDefiniteInstance,
5740                                     const Scope *S);
5741  bool UseArgumentDependentLookup(const CXXScopeSpec &SS,
5742                                  const LookupResult &R,
5743                                  bool HasTrailingLParen);
5744
5745  ExprResult
5746  BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS,
5747                                    const DeclarationNameInfo &NameInfo,
5748                                    bool IsAddressOfOperand, const Scope *S,
5749                                    TypeSourceInfo **RecoveryTSI = nullptr);
5750
5751  ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS,
5752                                       SourceLocation TemplateKWLoc,
5753                                const DeclarationNameInfo &NameInfo,
5754                                const TemplateArgumentListInfo *TemplateArgs);
5755
5756  ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS,
5757                                      LookupResult &R,
5758                                      bool NeedsADL,
5759                                      bool AcceptInvalidDecl = false);
5760  ExprResult BuildDeclarationNameExpr(
5761      const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
5762      NamedDecl *FoundD = nullptr,
5763      const TemplateArgumentListInfo *TemplateArgs = nullptr,
5764      bool AcceptInvalidDecl = false);
5765
5766  ExprResult BuildLiteralOperatorCall(LookupResult &R,
5767                      DeclarationNameInfo &SuffixInfo,
5768                      ArrayRef<Expr *> Args,
5769                      SourceLocation LitEndLoc,
5770                      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
5771
5772  // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
5773  // where Tokens representing function local predefined macros (such as
5774  // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
5775  std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
5776
5777  ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
5778  ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
5779  ExprResult ActOnIntegerConstant(SourceLocation Loc, uint64_t Val);
5780
5781  ExprResult BuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
5782                                           SourceLocation LParen,
5783                                           SourceLocation RParen,
5784                                           TypeSourceInfo *TSI);
5785  ExprResult ActOnSYCLUniqueStableNameExpr(SourceLocation OpLoc,
5786                                           SourceLocation LParen,
5787                                           SourceLocation RParen,
5788                                           ParsedType ParsedTy);
5789
5790  bool CheckLoopHintExpr(Expr *E, SourceLocation Loc);
5791
5792  ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
5793  ExprResult ActOnCharacterConstant(const Token &Tok,
5794                                    Scope *UDLScope = nullptr);
5795  ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
5796  ExprResult ActOnParenListExpr(SourceLocation L,
5797                                SourceLocation R,
5798                                MultiExprArg Val);
5799
5800  /// ActOnStringLiteral - The specified tokens were lexed as pasted string
5801  /// fragments (e.g. "foo" "bar" L"baz").
5802  ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
5803                                Scope *UDLScope = nullptr);
5804
5805  ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
5806
5807  /// ControllingExprOrType is either an opaque pointer coming out of a
5808  /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
5809  /// into two so we don't take a void *, but that's awkward because one of
5810  /// the operands is either a ParsedType or an Expr *, which doesn't lend
5811  /// itself to generic code very well.
5812  ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
5813                                       SourceLocation DefaultLoc,
5814                                       SourceLocation RParenLoc,
5815                                       bool PredicateIsExpr,
5816                                       void *ControllingExprOrType,
5817                                       ArrayRef<ParsedType> ArgTypes,
5818                                       ArrayRef<Expr *> ArgExprs);
5819  /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
5820  /// it'd be better to split this interface into two so we don't take a
5821  /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
5822  /// isn't a trivial change.
5823  ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
5824                                        SourceLocation DefaultLoc,
5825                                        SourceLocation RParenLoc,
5826                                        bool PredicateIsExpr,
5827                                        void *ControllingExprOrType,
5828                                        ArrayRef<TypeSourceInfo *> Types,
5829                                        ArrayRef<Expr *> Exprs);
5830
5831  // Binary/Unary Operators.  'Tok' is the token for the operator.
5832  ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
5833                                  Expr *InputExpr, bool IsAfterAmp = false);
5834  ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
5835                          Expr *Input, bool IsAfterAmp = false);
5836  ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
5837                          Expr *Input, bool IsAfterAmp = false);
5838
5839  bool isQualifiedMemberAccess(Expr *E);
5840  bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
5841                                             const Expr *Op,
5842                                             const CXXMethodDecl *MD);
5843
5844  QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
5845
5846  bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
5847
5848  bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
5849                                SourceLocation OpLoc, SourceRange R);
5850  bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
5851                                SourceLocation OpLoc, SourceRange R);
5852
5853  ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
5854                                            SourceLocation OpLoc,
5855                                            UnaryExprOrTypeTrait ExprKind,
5856                                            SourceRange R);
5857  ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
5858                                            UnaryExprOrTypeTrait ExprKind);
5859  ExprResult
5860    ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
5861                                  UnaryExprOrTypeTrait ExprKind,
5862                                  bool IsType, void *TyOrEx,
5863                                  SourceRange ArgRange);
5864
5865  ExprResult CheckPlaceholderExpr(Expr *E);
5866  bool CheckVecStepExpr(Expr *E);
5867
5868  bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind);
5869  bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
5870                                        SourceRange ExprRange,
5871                                        UnaryExprOrTypeTrait ExprKind,
5872                                        StringRef KWName);
5873  ExprResult ActOnSizeofParameterPackExpr(Scope *S,
5874                                          SourceLocation OpLoc,
5875                                          IdentifierInfo &Name,
5876                                          SourceLocation NameLoc,
5877                                          SourceLocation RParenLoc);
5878  ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
5879                                 tok::TokenKind Kind, Expr *Input);
5880
5881  ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
5882                                     MultiExprArg ArgExprs,
5883                                     SourceLocation RLoc);
5884  ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
5885                                             Expr *Idx, SourceLocation RLoc);
5886
5887  ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
5888                                              Expr *ColumnIdx,
5889                                              SourceLocation RBLoc);
5890
5891  ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc,
5892                                      Expr *LowerBound,
5893                                      SourceLocation ColonLocFirst,
5894                                      SourceLocation ColonLocSecond,
5895                                      Expr *Length, Expr *Stride,
5896                                      SourceLocation RBLoc);
5897  ExprResult ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
5898                                      SourceLocation RParenLoc,
5899                                      ArrayRef<Expr *> Dims,
5900                                      ArrayRef<SourceRange> Brackets);
5901
5902  /// Data structure for iterator expression.
5903  struct OMPIteratorData {
5904    IdentifierInfo *DeclIdent = nullptr;
5905    SourceLocation DeclIdentLoc;
5906    ParsedType Type;
5907    OMPIteratorExpr::IteratorRange Range;
5908    SourceLocation AssignLoc;
5909    SourceLocation ColonLoc;
5910    SourceLocation SecColonLoc;
5911  };
5912
5913  ExprResult ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc,
5914                                  SourceLocation LLoc, SourceLocation RLoc,
5915                                  ArrayRef<OMPIteratorData> Data);
5916
5917  // This struct is for use by ActOnMemberAccess to allow
5918  // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
5919  // changing the access operator from a '.' to a '->' (to see if that is the
5920  // change needed to fix an error about an unknown member, e.g. when the class
5921  // defines a custom operator->).
5922  struct ActOnMemberAccessExtraArgs {
5923    Scope *S;
5924    UnqualifiedId &Id;
5925    Decl *ObjCImpDecl;
5926  };
5927
5928  ExprResult BuildMemberReferenceExpr(
5929      Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
5930      CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
5931      NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
5932      const TemplateArgumentListInfo *TemplateArgs,
5933      const Scope *S,
5934      ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
5935
5936  ExprResult
5937  BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc,
5938                           bool IsArrow, const CXXScopeSpec &SS,
5939                           SourceLocation TemplateKWLoc,
5940                           NamedDecl *FirstQualifierInScope, LookupResult &R,
5941                           const TemplateArgumentListInfo *TemplateArgs,
5942                           const Scope *S,
5943                           bool SuppressQualifierCheck = false,
5944                           ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
5945
5946  ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
5947                                     SourceLocation OpLoc,
5948                                     const CXXScopeSpec &SS, FieldDecl *Field,
5949                                     DeclAccessPair FoundDecl,
5950                                     const DeclarationNameInfo &MemberNameInfo);
5951
5952  ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow);
5953
5954  bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
5955                                     const CXXScopeSpec &SS,
5956                                     const LookupResult &R);
5957
5958  ExprResult ActOnDependentMemberExpr(Expr *Base, QualType BaseType,
5959                                      bool IsArrow, SourceLocation OpLoc,
5960                                      const CXXScopeSpec &SS,
5961                                      SourceLocation TemplateKWLoc,
5962                                      NamedDecl *FirstQualifierInScope,
5963                               const DeclarationNameInfo &NameInfo,
5964                               const TemplateArgumentListInfo *TemplateArgs);
5965
5966  ExprResult ActOnMemberAccessExpr(Scope *S, Expr *Base,
5967                                   SourceLocation OpLoc,
5968                                   tok::TokenKind OpKind,
5969                                   CXXScopeSpec &SS,
5970                                   SourceLocation TemplateKWLoc,
5971                                   UnqualifiedId &Member,
5972                                   Decl *ObjCImpDecl);
5973
5974  MemberExpr *
5975  BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
5976                  const CXXScopeSpec *SS, SourceLocation TemplateKWLoc,
5977                  ValueDecl *Member, DeclAccessPair FoundDecl,
5978                  bool HadMultipleCandidates,
5979                  const DeclarationNameInfo &MemberNameInfo, QualType Ty,
5980                  ExprValueKind VK, ExprObjectKind OK,
5981                  const TemplateArgumentListInfo *TemplateArgs = nullptr);
5982  MemberExpr *
5983  BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
5984                  NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
5985                  ValueDecl *Member, DeclAccessPair FoundDecl,
5986                  bool HadMultipleCandidates,
5987                  const DeclarationNameInfo &MemberNameInfo, QualType Ty,
5988                  ExprValueKind VK, ExprObjectKind OK,
5989                  const TemplateArgumentListInfo *TemplateArgs = nullptr);
5990
5991  void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
5992  bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
5993                               FunctionDecl *FDecl,
5994                               const FunctionProtoType *Proto,
5995                               ArrayRef<Expr *> Args,
5996                               SourceLocation RParenLoc,
5997                               bool ExecConfig = false);
5998  void CheckStaticArrayArgument(SourceLocation CallLoc,
5999                                ParmVarDecl *Param,
6000                                const Expr *ArgExpr);
6001
6002  /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
6003  /// This provides the location of the left/right parens and a list of comma
6004  /// locations.
6005  ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
6006                           MultiExprArg ArgExprs, SourceLocation RParenLoc,
6007                           Expr *ExecConfig = nullptr);
6008  ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
6009                           MultiExprArg ArgExprs, SourceLocation RParenLoc,
6010                           Expr *ExecConfig = nullptr,
6011                           bool IsExecConfig = false,
6012                           bool AllowRecovery = false);
6013  Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
6014                             MultiExprArg CallArgs);
6015  enum class AtomicArgumentOrder { API, AST };
6016  ExprResult
6017  BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
6018                  SourceLocation RParenLoc, MultiExprArg Args,
6019                  AtomicExpr::AtomicOp Op,
6020                  AtomicArgumentOrder ArgOrder = AtomicArgumentOrder::API);
6021  ExprResult
6022  BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
6023                        ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
6024                        Expr *Config = nullptr, bool IsExecConfig = false,
6025                        ADLCallKind UsesADL = ADLCallKind::NotADL);
6026
6027  ExprResult ActOnCUDAExecConfigExpr(Scope *S, SourceLocation LLLLoc,
6028                                     MultiExprArg ExecConfig,
6029                                     SourceLocation GGGLoc);
6030
6031  ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
6032                           Declarator &D, ParsedType &Ty,
6033                           SourceLocation RParenLoc, Expr *CastExpr);
6034  ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc,
6035                                 TypeSourceInfo *Ty,
6036                                 SourceLocation RParenLoc,
6037                                 Expr *Op);
6038  CastKind PrepareScalarCast(ExprResult &src, QualType destType);
6039
6040  /// Build an altivec or OpenCL literal.
6041  ExprResult BuildVectorLiteral(SourceLocation LParenLoc,
6042                                SourceLocation RParenLoc, Expr *E,
6043                                TypeSourceInfo *TInfo);
6044
6045  ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME);
6046
6047  ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc,
6048                                  ParsedType Ty,
6049                                  SourceLocation RParenLoc,
6050                                  Expr *InitExpr);
6051
6052  ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc,
6053                                      TypeSourceInfo *TInfo,
6054                                      SourceLocation RParenLoc,
6055                                      Expr *LiteralExpr);
6056
6057  ExprResult ActOnInitList(SourceLocation LBraceLoc,
6058                           MultiExprArg InitArgList,
6059                           SourceLocation RBraceLoc);
6060
6061  ExprResult BuildInitList(SourceLocation LBraceLoc,
6062                           MultiExprArg InitArgList,
6063                           SourceLocation RBraceLoc);
6064
6065  ExprResult ActOnDesignatedInitializer(Designation &Desig,
6066                                        SourceLocation EqualOrColonLoc,
6067                                        bool GNUSyntax,
6068                                        ExprResult Init);
6069
6070private:
6071  static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
6072
6073public:
6074  ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc,
6075                        tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr);
6076  ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc,
6077                        BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr);
6078  ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc,
6079                                Expr *LHSExpr, Expr *RHSExpr);
6080  void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc,
6081                   UnresolvedSetImpl &Functions);
6082
6083  void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
6084
6085  /// ActOnConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
6086  /// in the case of a the GNU conditional expr extension.
6087  ExprResult ActOnConditionalOp(SourceLocation QuestionLoc,
6088                                SourceLocation ColonLoc,
6089                                Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr);
6090
6091  /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
6092  ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc,
6093                            LabelDecl *TheDecl);
6094
6095  void ActOnStartStmtExpr();
6096  ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
6097                           SourceLocation RPLoc);
6098  ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt,
6099                           SourceLocation RPLoc, unsigned TemplateDepth);
6100  // Handle the final expression in a statement expression.
6101  ExprResult ActOnStmtExprResult(ExprResult E);
6102  void ActOnStmtExprError();
6103
6104  // __builtin_offsetof(type, identifier(.identifier|[expr])*)
6105  struct OffsetOfComponent {
6106    SourceLocation LocStart, LocEnd;
6107    bool isBrackets;  // true if [expr], false if .ident
6108    union {
6109      IdentifierInfo *IdentInfo;
6110      Expr *E;
6111    } U;
6112  };
6113
6114  /// __builtin_offsetof(type, a.b[123][456].c)
6115  ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc,
6116                                  TypeSourceInfo *TInfo,
6117                                  ArrayRef<OffsetOfComponent> Components,
6118                                  SourceLocation RParenLoc);
6119  ExprResult ActOnBuiltinOffsetOf(Scope *S,
6120                                  SourceLocation BuiltinLoc,
6121                                  SourceLocation TypeLoc,
6122                                  ParsedType ParsedArgTy,
6123                                  ArrayRef<OffsetOfComponent> Components,
6124                                  SourceLocation RParenLoc);
6125
6126  // __builtin_choose_expr(constExpr, expr1, expr2)
6127  ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc,
6128                             Expr *CondExpr, Expr *LHSExpr,
6129                             Expr *RHSExpr, SourceLocation RPLoc);
6130
6131  // __builtin_va_arg(expr, type)
6132  ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty,
6133                        SourceLocation RPLoc);
6134  ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E,
6135                            TypeSourceInfo *TInfo, SourceLocation RPLoc);
6136
6137  // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
6138  // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
6139  ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind,
6140                                SourceLocation BuiltinLoc,
6141                                SourceLocation RPLoc);
6142
6143  // Build a potentially resolved SourceLocExpr.
6144  ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
6145                                SourceLocation BuiltinLoc, SourceLocation RPLoc,
6146                                DeclContext *ParentContext);
6147
6148  // __null
6149  ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc);
6150
6151  bool CheckCaseExpression(Expr *E);
6152
6153  /// Describes the result of an "if-exists" condition check.
6154  enum IfExistsResult {
6155    /// The symbol exists.
6156    IER_Exists,
6157
6158    /// The symbol does not exist.
6159    IER_DoesNotExist,
6160
6161    /// The name is a dependent name, so the results will differ
6162    /// from one instantiation to the next.
6163    IER_Dependent,
6164
6165    /// An error occurred.
6166    IER_Error
6167  };
6168
6169  IfExistsResult
6170  CheckMicrosoftIfExistsSymbol(Scope *S, CXXScopeSpec &SS,
6171                               const DeclarationNameInfo &TargetNameInfo);
6172
6173  IfExistsResult
6174  CheckMicrosoftIfExistsSymbol(Scope *S, SourceLocation KeywordLoc,
6175                               bool IsIfExists, CXXScopeSpec &SS,
6176                               UnqualifiedId &Name);
6177
6178  StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc,
6179                                        bool IsIfExists,
6180                                        NestedNameSpecifierLoc QualifierLoc,
6181                                        DeclarationNameInfo NameInfo,
6182                                        Stmt *Nested);
6183  StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc,
6184                                        bool IsIfExists,
6185                                        CXXScopeSpec &SS, UnqualifiedId &Name,
6186                                        Stmt *Nested);
6187
6188  //===------------------------- "Block" Extension ------------------------===//
6189
6190  /// ActOnBlockStart - This callback is invoked when a block literal is
6191  /// started.
6192  void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
6193
6194  /// ActOnBlockArguments - This callback allows processing of block arguments.
6195  /// If there are no arguments, this is still invoked.
6196  void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
6197                           Scope *CurScope);
6198
6199  /// ActOnBlockError - If there is an error parsing a block, this callback
6200  /// is invoked to pop the information about the block from the action impl.
6201  void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
6202
6203  /// ActOnBlockStmtExpr - This is called when the body of a block statement
6204  /// literal was successfully completed.  ^(int x){...}
6205  ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body,
6206                                Scope *CurScope);
6207
6208  //===---------------------------- Clang Extensions ----------------------===//
6209
6210  /// __builtin_convertvector(...)
6211  ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy,
6212                                    SourceLocation BuiltinLoc,
6213                                    SourceLocation RParenLoc);
6214
6215  //===---------------------------- OpenCL Features -----------------------===//
6216
6217  /// __builtin_astype(...)
6218  ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
6219                             SourceLocation BuiltinLoc,
6220                             SourceLocation RParenLoc);
6221  ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy,
6222                             SourceLocation BuiltinLoc,
6223                             SourceLocation RParenLoc);
6224
6225  //===---------------------------- HLSL Features -------------------------===//
6226  Decl *ActOnStartHLSLBuffer(Scope *BufferScope, bool CBuffer,
6227                             SourceLocation KwLoc, IdentifierInfo *Ident,
6228                             SourceLocation IdentLoc, SourceLocation LBrace);
6229  void ActOnFinishHLSLBuffer(Decl *Dcl, SourceLocation RBrace);
6230
6231  //===---------------------------- C++ Features --------------------------===//
6232
6233  // Act on C++ namespaces
6234  Decl *ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc,
6235                               SourceLocation NamespaceLoc,
6236                               SourceLocation IdentLoc, IdentifierInfo *Ident,
6237                               SourceLocation LBrace,
6238                               const ParsedAttributesView &AttrList,
6239                               UsingDirectiveDecl *&UsingDecl, bool IsNested);
6240  void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
6241
6242  NamespaceDecl *getStdNamespace() const;
6243  NamespaceDecl *getOrCreateStdNamespace();
6244
6245  CXXRecordDecl *getStdBadAlloc() const;
6246  EnumDecl *getStdAlignValT() const;
6247
6248  ValueDecl *tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl,
6249                                           const IdentifierInfo *MemberOrBase);
6250
6251private:
6252  // A cache representing if we've fully checked the various comparison category
6253  // types stored in ASTContext. The bit-index corresponds to the integer value
6254  // of a ComparisonCategoryType enumerator.
6255  llvm::SmallBitVector FullyCheckedComparisonCategories;
6256
6257  ValueDecl *tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl,
6258                                         CXXScopeSpec &SS,
6259                                         ParsedType TemplateTypeTy,
6260                                         IdentifierInfo *MemberOrBase);
6261
6262public:
6263  enum class ComparisonCategoryUsage {
6264    /// The '<=>' operator was used in an expression and a builtin operator
6265    /// was selected.
6266    OperatorInExpression,
6267    /// A defaulted 'operator<=>' needed the comparison category. This
6268    /// typically only applies to 'std::strong_ordering', due to the implicit
6269    /// fallback return value.
6270    DefaultedOperator,
6271  };
6272
6273  /// Lookup the specified comparison category types in the standard
6274  ///   library, an check the VarDecls possibly returned by the operator<=>
6275  ///   builtins for that type.
6276  ///
6277  /// \return The type of the comparison category type corresponding to the
6278  ///   specified Kind, or a null type if an error occurs
6279  QualType CheckComparisonCategoryType(ComparisonCategoryType Kind,
6280                                       SourceLocation Loc,
6281                                       ComparisonCategoryUsage Usage);
6282
6283  /// Tests whether Ty is an instance of std::initializer_list and, if
6284  /// it is and Element is not NULL, assigns the element type to Element.
6285  bool isStdInitializerList(QualType Ty, QualType *Element);
6286
6287  /// Looks for the std::initializer_list template and instantiates it
6288  /// with Element, or emits an error if it's not found.
6289  ///
6290  /// \returns The instantiated template, or null on error.
6291  QualType BuildStdInitializerList(QualType Element, SourceLocation Loc);
6292
6293  /// Determine whether Ctor is an initializer-list constructor, as
6294  /// defined in [dcl.init.list]p2.
6295  bool isInitListConstructor(const FunctionDecl *Ctor);
6296
6297  Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
6298                            SourceLocation NamespcLoc, CXXScopeSpec &SS,
6299                            SourceLocation IdentLoc,
6300                            IdentifierInfo *NamespcName,
6301                            const ParsedAttributesView &AttrList);
6302
6303  void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir);
6304
6305  Decl *ActOnNamespaceAliasDef(Scope *CurScope,
6306                               SourceLocation NamespaceLoc,
6307                               SourceLocation AliasLoc,
6308                               IdentifierInfo *Alias,
6309                               CXXScopeSpec &SS,
6310                               SourceLocation IdentLoc,
6311                               IdentifierInfo *Ident);
6312
6313  void FilterUsingLookup(Scope *S, LookupResult &lookup);
6314  void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
6315  bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target,
6316                            const LookupResult &PreviousDecls,
6317                            UsingShadowDecl *&PrevShadow);
6318  UsingShadowDecl *BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD,
6319                                        NamedDecl *Target,
6320                                        UsingShadowDecl *PrevDecl);
6321
6322  bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc,
6323                                   bool HasTypenameKeyword,
6324                                   const CXXScopeSpec &SS,
6325                                   SourceLocation NameLoc,
6326                                   const LookupResult &Previous);
6327  bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
6328                               const CXXScopeSpec &SS,
6329                               const DeclarationNameInfo &NameInfo,
6330                               SourceLocation NameLoc,
6331                               const LookupResult *R = nullptr,
6332                               const UsingDecl *UD = nullptr);
6333
6334  NamedDecl *BuildUsingDeclaration(
6335      Scope *S, AccessSpecifier AS, SourceLocation UsingLoc,
6336      bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS,
6337      DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc,
6338      const ParsedAttributesView &AttrList, bool IsInstantiation,
6339      bool IsUsingIfExists);
6340  NamedDecl *BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS,
6341                                       SourceLocation UsingLoc,
6342                                       SourceLocation EnumLoc,
6343                                       SourceLocation NameLoc,
6344                                       TypeSourceInfo *EnumType, EnumDecl *ED);
6345  NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
6346                                ArrayRef<NamedDecl *> Expansions);
6347
6348  bool CheckInheritingConstructorUsingDecl(UsingDecl *UD);
6349
6350  /// Given a derived-class using shadow declaration for a constructor and the
6351  /// correspnding base class constructor, find or create the implicit
6352  /// synthesized derived class constructor to use for this initialization.
6353  CXXConstructorDecl *
6354  findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor,
6355                            ConstructorUsingShadowDecl *DerivedShadow);
6356
6357  Decl *ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS,
6358                              SourceLocation UsingLoc,
6359                              SourceLocation TypenameLoc, CXXScopeSpec &SS,
6360                              UnqualifiedId &Name, SourceLocation EllipsisLoc,
6361                              const ParsedAttributesView &AttrList);
6362  Decl *ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS,
6363                                  SourceLocation UsingLoc,
6364                                  SourceLocation EnumLoc,
6365                                  SourceLocation IdentLoc, IdentifierInfo &II,
6366                                  CXXScopeSpec *SS = nullptr);
6367  Decl *ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS,
6368                              MultiTemplateParamsArg TemplateParams,
6369                              SourceLocation UsingLoc, UnqualifiedId &Name,
6370                              const ParsedAttributesView &AttrList,
6371                              TypeResult Type, Decl *DeclFromDeclSpec);
6372
6373  /// BuildCXXConstructExpr - Creates a complete call to a constructor,
6374  /// including handling of its default argument expressions.
6375  ///
6376  /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
6377  ExprResult BuildCXXConstructExpr(
6378      SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
6379      CXXConstructorDecl *Constructor, MultiExprArg Exprs,
6380      bool HadMultipleCandidates, bool IsListInitialization,
6381      bool IsStdInitListInitialization, bool RequiresZeroInit,
6382      CXXConstructionKind ConstructKind, SourceRange ParenRange);
6383
6384  /// Build a CXXConstructExpr whose constructor has already been resolved if
6385  /// it denotes an inherited constructor.
6386  ExprResult BuildCXXConstructExpr(
6387      SourceLocation ConstructLoc, QualType DeclInitType,
6388      CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
6389      bool HadMultipleCandidates, bool IsListInitialization,
6390      bool IsStdInitListInitialization, bool RequiresZeroInit,
6391      CXXConstructionKind ConstructKind, SourceRange ParenRange);
6392
6393  // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
6394  // the constructor can be elidable?
6395  ExprResult BuildCXXConstructExpr(
6396      SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
6397      CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
6398      bool HadMultipleCandidates, bool IsListInitialization,
6399      bool IsStdInitListInitialization, bool RequiresZeroInit,
6400      CXXConstructionKind ConstructKind, SourceRange ParenRange);
6401
6402  ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr,
6403                                                SourceLocation InitLoc);
6404
6405  ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field);
6406
6407
6408  /// Instantiate or parse a C++ default argument expression as necessary.
6409  /// Return true on error.
6410  bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD,
6411                              ParmVarDecl *Param, Expr *Init = nullptr,
6412                              bool SkipImmediateInvocations = true);
6413
6414  /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
6415  /// the default expr if needed.
6416  ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD,
6417                                    ParmVarDecl *Param, Expr *Init = nullptr);
6418
6419  /// FinalizeVarWithDestructor - Prepare for calling destructor on the
6420  /// constructed variable.
6421  void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType);
6422
6423  /// Helper class that collects exception specifications for
6424  /// implicitly-declared special member functions.
6425  class ImplicitExceptionSpecification {
6426    // Pointer to allow copying
6427    Sema *Self;
6428    // We order exception specifications thus:
6429    // noexcept is the most restrictive, but is only used in C++11.
6430    // throw() comes next.
6431    // Then a throw(collected exceptions)
6432    // Finally no specification, which is expressed as noexcept(false).
6433    // throw(...) is used instead if any called function uses it.
6434    ExceptionSpecificationType ComputedEST;
6435    llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
6436    SmallVector<QualType, 4> Exceptions;
6437
6438    void ClearExceptions() {
6439      ExceptionsSeen.clear();
6440      Exceptions.clear();
6441    }
6442
6443  public:
6444    explicit ImplicitExceptionSpecification(Sema &Self)
6445      : Self(&Self), ComputedEST(EST_BasicNoexcept) {
6446      if (!Self.getLangOpts().CPlusPlus11)
6447        ComputedEST = EST_DynamicNone;
6448    }
6449
6450    /// Get the computed exception specification type.
6451    ExceptionSpecificationType getExceptionSpecType() const {
6452      assert(!isComputedNoexcept(ComputedEST) &&
6453             "noexcept(expr) should not be a possible result");
6454      return ComputedEST;
6455    }
6456
6457    /// The number of exceptions in the exception specification.
6458    unsigned size() const { return Exceptions.size(); }
6459
6460    /// The set of exceptions in the exception specification.
6461    const QualType *data() const { return Exceptions.data(); }
6462
6463    /// Integrate another called method into the collected data.
6464    void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
6465
6466    /// Integrate an invoked expression into the collected data.
6467    void CalledExpr(Expr *E) { CalledStmt(E); }
6468
6469    /// Integrate an invoked statement into the collected data.
6470    void CalledStmt(Stmt *S);
6471
6472    /// Overwrite an EPI's exception specification with this
6473    /// computed exception specification.
6474    FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const {
6475      FunctionProtoType::ExceptionSpecInfo ESI;
6476      ESI.Type = getExceptionSpecType();
6477      if (ESI.Type == EST_Dynamic) {
6478        ESI.Exceptions = Exceptions;
6479      } else if (ESI.Type == EST_None) {
6480        /// C++11 [except.spec]p14:
6481        ///   The exception-specification is noexcept(false) if the set of
6482        ///   potential exceptions of the special member function contains "any"
6483        ESI.Type = EST_NoexceptFalse;
6484        ESI.NoexceptExpr = Self->ActOnCXXBoolLiteral(SourceLocation(),
6485                                                     tok::kw_false).get();
6486      }
6487      return ESI;
6488    }
6489  };
6490
6491  /// Evaluate the implicit exception specification for a defaulted
6492  /// special member function.
6493  void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD);
6494
6495  /// Check the given noexcept-specifier, convert its expression, and compute
6496  /// the appropriate ExceptionSpecificationType.
6497  ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6498                               ExceptionSpecificationType &EST);
6499
6500  /// Check the given exception-specification and update the
6501  /// exception specification information with the results.
6502  void checkExceptionSpecification(bool IsTopLevel,
6503                                   ExceptionSpecificationType EST,
6504                                   ArrayRef<ParsedType> DynamicExceptions,
6505                                   ArrayRef<SourceRange> DynamicExceptionRanges,
6506                                   Expr *NoexceptExpr,
6507                                   SmallVectorImpl<QualType> &Exceptions,
6508                                   FunctionProtoType::ExceptionSpecInfo &ESI);
6509
6510  /// Determine if we're in a case where we need to (incorrectly) eagerly
6511  /// parse an exception specification to work around a libstdc++ bug.
6512  bool isLibstdcxxEagerExceptionSpecHack(const Declarator &D);
6513
6514  /// Add an exception-specification to the given member function
6515  /// (or member function template). The exception-specification was parsed
6516  /// after the method itself was declared.
6517  void actOnDelayedExceptionSpecification(Decl *Method,
6518         ExceptionSpecificationType EST,
6519         SourceRange SpecificationRange,
6520         ArrayRef<ParsedType> DynamicExceptions,
6521         ArrayRef<SourceRange> DynamicExceptionRanges,
6522         Expr *NoexceptExpr);
6523
6524  class InheritedConstructorInfo;
6525
6526  /// Determine if a special member function should have a deleted
6527  /// definition when it is defaulted.
6528  bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM,
6529                                 InheritedConstructorInfo *ICI = nullptr,
6530                                 bool Diagnose = false);
6531
6532  /// Produce notes explaining why a defaulted function was defined as deleted.
6533  void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD);
6534
6535  /// Declare the implicit default constructor for the given class.
6536  ///
6537  /// \param ClassDecl The class declaration into which the implicit
6538  /// default constructor will be added.
6539  ///
6540  /// \returns The implicitly-declared default constructor.
6541  CXXConstructorDecl *DeclareImplicitDefaultConstructor(
6542                                                     CXXRecordDecl *ClassDecl);
6543
6544  /// DefineImplicitDefaultConstructor - Checks for feasibility of
6545  /// defining this constructor as the default constructor.
6546  void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
6547                                        CXXConstructorDecl *Constructor);
6548
6549  /// Declare the implicit destructor for the given class.
6550  ///
6551  /// \param ClassDecl The class declaration into which the implicit
6552  /// destructor will be added.
6553  ///
6554  /// \returns The implicitly-declared destructor.
6555  CXXDestructorDecl *DeclareImplicitDestructor(CXXRecordDecl *ClassDecl);
6556
6557  /// DefineImplicitDestructor - Checks for feasibility of
6558  /// defining this destructor as the default destructor.
6559  void DefineImplicitDestructor(SourceLocation CurrentLocation,
6560                                CXXDestructorDecl *Destructor);
6561
6562  /// Build an exception spec for destructors that don't have one.
6563  ///
6564  /// C++11 says that user-defined destructors with no exception spec get one
6565  /// that looks as if the destructor was implicitly declared.
6566  void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor);
6567
6568  /// Define the specified inheriting constructor.
6569  void DefineInheritingConstructor(SourceLocation UseLoc,
6570                                   CXXConstructorDecl *Constructor);
6571
6572  /// Declare the implicit copy constructor for the given class.
6573  ///
6574  /// \param ClassDecl The class declaration into which the implicit
6575  /// copy constructor will be added.
6576  ///
6577  /// \returns The implicitly-declared copy constructor.
6578  CXXConstructorDecl *DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl);
6579
6580  /// DefineImplicitCopyConstructor - Checks for feasibility of
6581  /// defining this constructor as the copy constructor.
6582  void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
6583                                     CXXConstructorDecl *Constructor);
6584
6585  /// Declare the implicit move constructor for the given class.
6586  ///
6587  /// \param ClassDecl The Class declaration into which the implicit
6588  /// move constructor will be added.
6589  ///
6590  /// \returns The implicitly-declared move constructor, or NULL if it wasn't
6591  /// declared.
6592  CXXConstructorDecl *DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl);
6593
6594  /// DefineImplicitMoveConstructor - Checks for feasibility of
6595  /// defining this constructor as the move constructor.
6596  void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
6597                                     CXXConstructorDecl *Constructor);
6598
6599  /// Declare the implicit copy assignment operator for the given class.
6600  ///
6601  /// \param ClassDecl The class declaration into which the implicit
6602  /// copy assignment operator will be added.
6603  ///
6604  /// \returns The implicitly-declared copy assignment operator.
6605  CXXMethodDecl *DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl);
6606
6607  /// Defines an implicitly-declared copy assignment operator.
6608  void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
6609                                    CXXMethodDecl *MethodDecl);
6610
6611  /// Declare the implicit move assignment operator for the given class.
6612  ///
6613  /// \param ClassDecl The Class declaration into which the implicit
6614  /// move assignment operator will be added.
6615  ///
6616  /// \returns The implicitly-declared move assignment operator, or NULL if it
6617  /// wasn't declared.
6618  CXXMethodDecl *DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl);
6619
6620  /// Defines an implicitly-declared move assignment operator.
6621  void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
6622                                    CXXMethodDecl *MethodDecl);
6623
6624  /// Force the declaration of any implicitly-declared members of this
6625  /// class.
6626  void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class);
6627
6628  /// Check a completed declaration of an implicit special member.
6629  void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD);
6630
6631  /// Determine whether the given function is an implicitly-deleted
6632  /// special member function.
6633  bool isImplicitlyDeleted(FunctionDecl *FD);
6634
6635  /// Check whether 'this' shows up in the type of a static member
6636  /// function after the (naturally empty) cv-qualifier-seq would be.
6637  ///
6638  /// \returns true if an error occurred.
6639  bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method);
6640
6641  /// Whether this' shows up in the exception specification of a static
6642  /// member function.
6643  bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method);
6644
6645  /// Check whether 'this' shows up in the attributes of the given
6646  /// static member function.
6647  ///
6648  /// \returns true if an error occurred.
6649  bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method);
6650
6651  /// MaybeBindToTemporary - If the passed in expression has a record type with
6652  /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
6653  /// it simply returns the passed in expression.
6654  ExprResult MaybeBindToTemporary(Expr *E);
6655
6656  /// Wrap the expression in a ConstantExpr if it is a potential immediate
6657  /// invocation.
6658  ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl);
6659
6660  bool CheckImmediateEscalatingFunctionDefinition(
6661      FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
6662
6663  void MarkExpressionAsImmediateEscalating(Expr *E);
6664
6665  void DiagnoseImmediateEscalatingReason(FunctionDecl *FD);
6666
6667  bool CompleteConstructorCall(CXXConstructorDecl *Constructor,
6668                               QualType DeclInitType, MultiExprArg ArgsPtr,
6669                               SourceLocation Loc,
6670                               SmallVectorImpl<Expr *> &ConvertedArgs,
6671                               bool AllowExplicit = false,
6672                               bool IsListInitialization = false);
6673
6674  ParsedType getInheritingConstructorName(CXXScopeSpec &SS,
6675                                          SourceLocation NameLoc,
6676                                          IdentifierInfo &Name);
6677
6678  ParsedType getConstructorName(IdentifierInfo &II, SourceLocation NameLoc,
6679                                Scope *S, CXXScopeSpec &SS,
6680                                bool EnteringContext);
6681  ParsedType getDestructorName(IdentifierInfo &II, SourceLocation NameLoc,
6682                               Scope *S, CXXScopeSpec &SS,
6683                               ParsedType ObjectType, bool EnteringContext);
6684
6685  ParsedType getDestructorTypeForDecltype(const DeclSpec &DS,
6686                                          ParsedType ObjectType);
6687
6688  // Checks that reinterpret casts don't have undefined behavior.
6689  void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
6690                                      bool IsDereference, SourceRange Range);
6691
6692  // Checks that the vector type should be initialized from a scalar
6693  // by splatting the value rather than populating a single element.
6694  // This is the case for AltiVecVector types as well as with
6695  // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
6696  bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
6697
6698  // Checks if the -faltivec-src-compat=gcc option is specified.
6699  // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
6700  // treated the same way as they are when trying to initialize
6701  // these vectors on gcc (an error is emitted).
6702  bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy,
6703                                  QualType SrcTy);
6704
6705  /// ActOnCXXNamedCast - Parse
6706  /// {dynamic,static,reinterpret,const,addrspace}_cast's.
6707  ExprResult ActOnCXXNamedCast(SourceLocation OpLoc,
6708                               tok::TokenKind Kind,
6709                               SourceLocation LAngleBracketLoc,
6710                               Declarator &D,
6711                               SourceLocation RAngleBracketLoc,
6712                               SourceLocation LParenLoc,
6713                               Expr *E,
6714                               SourceLocation RParenLoc);
6715
6716  ExprResult BuildCXXNamedCast(SourceLocation OpLoc,
6717                               tok::TokenKind Kind,
6718                               TypeSourceInfo *Ty,
6719                               Expr *E,
6720                               SourceRange AngleBrackets,
6721                               SourceRange Parens);
6722
6723  ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl,
6724                                     ExprResult Operand,
6725                                     SourceLocation RParenLoc);
6726
6727  ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI,
6728                                     Expr *Operand, SourceLocation RParenLoc);
6729
6730  ExprResult BuildCXXTypeId(QualType TypeInfoType,
6731                            SourceLocation TypeidLoc,
6732                            TypeSourceInfo *Operand,
6733                            SourceLocation RParenLoc);
6734  ExprResult BuildCXXTypeId(QualType TypeInfoType,
6735                            SourceLocation TypeidLoc,
6736                            Expr *Operand,
6737                            SourceLocation RParenLoc);
6738
6739  /// ActOnCXXTypeid - Parse typeid( something ).
6740  ExprResult ActOnCXXTypeid(SourceLocation OpLoc,
6741                            SourceLocation LParenLoc, bool isType,
6742                            void *TyOrExpr,
6743                            SourceLocation RParenLoc);
6744
6745  ExprResult BuildCXXUuidof(QualType TypeInfoType,
6746                            SourceLocation TypeidLoc,
6747                            TypeSourceInfo *Operand,
6748                            SourceLocation RParenLoc);
6749  ExprResult BuildCXXUuidof(QualType TypeInfoType,
6750                            SourceLocation TypeidLoc,
6751                            Expr *Operand,
6752                            SourceLocation RParenLoc);
6753
6754  /// ActOnCXXUuidof - Parse __uuidof( something ).
6755  ExprResult ActOnCXXUuidof(SourceLocation OpLoc,
6756                            SourceLocation LParenLoc, bool isType,
6757                            void *TyOrExpr,
6758                            SourceLocation RParenLoc);
6759
6760  /// Handle a C++1z fold-expression: ( expr op ... op expr ).
6761  ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
6762                              tok::TokenKind Operator,
6763                              SourceLocation EllipsisLoc, Expr *RHS,
6764                              SourceLocation RParenLoc);
6765  ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
6766                              SourceLocation LParenLoc, Expr *LHS,
6767                              BinaryOperatorKind Operator,
6768                              SourceLocation EllipsisLoc, Expr *RHS,
6769                              SourceLocation RParenLoc,
6770                              std::optional<unsigned> NumExpansions);
6771  ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
6772                                   BinaryOperatorKind Operator);
6773
6774  //// ActOnCXXThis -  Parse 'this' pointer.
6775  ExprResult ActOnCXXThis(SourceLocation loc);
6776
6777  /// Build a CXXThisExpr and mark it referenced in the current context.
6778  Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
6779  void MarkThisReferenced(CXXThisExpr *This);
6780
6781  /// Try to retrieve the type of the 'this' pointer.
6782  ///
6783  /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
6784  QualType getCurrentThisType();
6785
6786  /// When non-NULL, the C++ 'this' expression is allowed despite the
6787  /// current context not being a non-static member function. In such cases,
6788  /// this provides the type used for 'this'.
6789  QualType CXXThisTypeOverride;
6790
6791  /// RAII object used to temporarily allow the C++ 'this' expression
6792  /// to be used, with the given qualifiers on the current class type.
6793  class CXXThisScopeRAII {
6794    Sema &S;
6795    QualType OldCXXThisTypeOverride;
6796    bool Enabled;
6797
6798  public:
6799    /// Introduce a new scope where 'this' may be allowed (when enabled),
6800    /// using the given declaration (which is either a class template or a
6801    /// class) along with the given qualifiers.
6802    /// along with the qualifiers placed on '*this'.
6803    CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
6804                     bool Enabled = true);
6805
6806    ~CXXThisScopeRAII();
6807  };
6808
6809  /// Make sure the value of 'this' is actually available in the current
6810  /// context, if it is a potentially evaluated context.
6811  ///
6812  /// \param Loc The location at which the capture of 'this' occurs.
6813  ///
6814  /// \param Explicit Whether 'this' is explicitly captured in a lambda
6815  /// capture list.
6816  ///
6817  /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
6818  /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
6819  /// This is useful when enclosing lambdas must speculatively capture
6820  /// 'this' that may or may not be used in certain specializations of
6821  /// a nested generic lambda (depending on whether the name resolves to
6822  /// a non-static member function or a static function).
6823  /// \return returns 'true' if failed, 'false' if success.
6824  bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit = false,
6825      bool BuildAndDiagnose = true,
6826      const unsigned *const FunctionScopeIndexToStopAt = nullptr,
6827      bool ByCopy = false);
6828
6829  /// Determine whether the given type is the type of *this that is used
6830  /// outside of the body of a member function for a type that is currently
6831  /// being defined.
6832  bool isThisOutsideMemberFunctionBody(QualType BaseType);
6833
6834  /// ActOnCXXBoolLiteral - Parse {true,false} literals.
6835  ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind);
6836
6837
6838  /// ActOnObjCBoolLiteral - Parse {__objc_yes,__objc_no} literals.
6839  ExprResult ActOnObjCBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind);
6840
6841  ExprResult
6842  ActOnObjCAvailabilityCheckExpr(llvm::ArrayRef<AvailabilitySpec> AvailSpecs,
6843                                 SourceLocation AtLoc, SourceLocation RParen);
6844
6845  /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
6846  ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc);
6847
6848  //// ActOnCXXThrow -  Parse throw expressions.
6849  ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr);
6850  ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex,
6851                           bool IsThrownVarInScope);
6852  bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
6853
6854  /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
6855  /// Can be interpreted either as function-style casting ("int(x)")
6856  /// or class type construction ("ClassType(x,y,z)")
6857  /// or creation of a value-initialized type ("int()").
6858  ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep,
6859                                       SourceLocation LParenOrBraceLoc,
6860                                       MultiExprArg Exprs,
6861                                       SourceLocation RParenOrBraceLoc,
6862                                       bool ListInitialization);
6863
6864  ExprResult BuildCXXTypeConstructExpr(TypeSourceInfo *Type,
6865                                       SourceLocation LParenLoc,
6866                                       MultiExprArg Exprs,
6867                                       SourceLocation RParenLoc,
6868                                       bool ListInitialization);
6869
6870  /// ActOnCXXNew - Parsed a C++ 'new' expression.
6871  ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
6872                         SourceLocation PlacementLParen,
6873                         MultiExprArg PlacementArgs,
6874                         SourceLocation PlacementRParen,
6875                         SourceRange TypeIdParens, Declarator &D,
6876                         Expr *Initializer);
6877  ExprResult
6878  BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
6879              MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
6880              SourceRange TypeIdParens, QualType AllocType,
6881              TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
6882              SourceRange DirectInitRange, Expr *Initializer);
6883
6884  /// Determine whether \p FD is an aligned allocation or deallocation
6885  /// function that is unavailable.
6886  bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const;
6887
6888  /// Produce diagnostics if \p FD is an aligned allocation or deallocation
6889  /// function that is unavailable.
6890  void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD,
6891                                            SourceLocation Loc);
6892
6893  bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
6894                          SourceRange R);
6895
6896  /// The scope in which to find allocation functions.
6897  enum AllocationFunctionScope {
6898    /// Only look for allocation functions in the global scope.
6899    AFS_Global,
6900    /// Only look for allocation functions in the scope of the
6901    /// allocated class.
6902    AFS_Class,
6903    /// Look for allocation functions in both the global scope
6904    /// and in the scope of the allocated class.
6905    AFS_Both
6906  };
6907
6908  /// Finds the overloads of operator new and delete that are appropriate
6909  /// for the allocation.
6910  bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
6911                               AllocationFunctionScope NewScope,
6912                               AllocationFunctionScope DeleteScope,
6913                               QualType AllocType, bool IsArray,
6914                               bool &PassAlignment, MultiExprArg PlaceArgs,
6915                               FunctionDecl *&OperatorNew,
6916                               FunctionDecl *&OperatorDelete,
6917                               bool Diagnose = true);
6918  void DeclareGlobalNewDelete();
6919  void DeclareGlobalAllocationFunction(DeclarationName Name, QualType Return,
6920                                       ArrayRef<QualType> Params);
6921
6922  bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
6923                                DeclarationName Name, FunctionDecl *&Operator,
6924                                bool Diagnose = true, bool WantSize = false,
6925                                bool WantAligned = false);
6926  FunctionDecl *FindUsualDeallocationFunction(SourceLocation StartLoc,
6927                                              bool CanProvideSize,
6928                                              bool Overaligned,
6929                                              DeclarationName Name);
6930  FunctionDecl *FindDeallocationFunctionForDestructor(SourceLocation StartLoc,
6931                                                      CXXRecordDecl *RD);
6932
6933  /// ActOnCXXDelete - Parsed a C++ 'delete' expression
6934  ExprResult ActOnCXXDelete(SourceLocation StartLoc,
6935                            bool UseGlobal, bool ArrayForm,
6936                            Expr *Operand);
6937  void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc,
6938                            bool IsDelete, bool CallCanBeVirtual,
6939                            bool WarnOnNonAbstractTypes,
6940                            SourceLocation DtorLoc);
6941
6942  ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
6943                               Expr *Operand, SourceLocation RParen);
6944  ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
6945                                  SourceLocation RParen);
6946
6947  /// Parsed one of the type trait support pseudo-functions.
6948  ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
6949                            ArrayRef<ParsedType> Args,
6950                            SourceLocation RParenLoc);
6951  ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
6952                            ArrayRef<TypeSourceInfo *> Args,
6953                            SourceLocation RParenLoc);
6954
6955  /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
6956  /// pseudo-functions.
6957  ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT,
6958                                 SourceLocation KWLoc,
6959                                 ParsedType LhsTy,
6960                                 Expr *DimExpr,
6961                                 SourceLocation RParen);
6962
6963  ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT,
6964                                 SourceLocation KWLoc,
6965                                 TypeSourceInfo *TSInfo,
6966                                 Expr *DimExpr,
6967                                 SourceLocation RParen);
6968
6969  /// ActOnExpressionTrait - Parsed one of the unary type trait support
6970  /// pseudo-functions.
6971  ExprResult ActOnExpressionTrait(ExpressionTrait OET,
6972                                  SourceLocation KWLoc,
6973                                  Expr *Queried,
6974                                  SourceLocation RParen);
6975
6976  ExprResult BuildExpressionTrait(ExpressionTrait OET,
6977                                  SourceLocation KWLoc,
6978                                  Expr *Queried,
6979                                  SourceLocation RParen);
6980
6981  ExprResult ActOnStartCXXMemberReference(Scope *S,
6982                                          Expr *Base,
6983                                          SourceLocation OpLoc,
6984                                          tok::TokenKind OpKind,
6985                                          ParsedType &ObjectType,
6986                                          bool &MayBePseudoDestructor);
6987
6988  ExprResult BuildPseudoDestructorExpr(Expr *Base,
6989                                       SourceLocation OpLoc,
6990                                       tok::TokenKind OpKind,
6991                                       const CXXScopeSpec &SS,
6992                                       TypeSourceInfo *ScopeType,
6993                                       SourceLocation CCLoc,
6994                                       SourceLocation TildeLoc,
6995                                     PseudoDestructorTypeStorage DestroyedType);
6996
6997  ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base,
6998                                       SourceLocation OpLoc,
6999                                       tok::TokenKind OpKind,
7000                                       CXXScopeSpec &SS,
7001                                       UnqualifiedId &FirstTypeName,
7002                                       SourceLocation CCLoc,
7003                                       SourceLocation TildeLoc,
7004                                       UnqualifiedId &SecondTypeName);
7005
7006  ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base,
7007                                       SourceLocation OpLoc,
7008                                       tok::TokenKind OpKind,
7009                                       SourceLocation TildeLoc,
7010                                       const DeclSpec& DS);
7011
7012  /// MaybeCreateExprWithCleanups - If the current full-expression
7013  /// requires any cleanups, surround it with a ExprWithCleanups node.
7014  /// Otherwise, just returns the passed-in expression.
7015  Expr *MaybeCreateExprWithCleanups(Expr *SubExpr);
7016  Stmt *MaybeCreateStmtWithCleanups(Stmt *SubStmt);
7017  ExprResult MaybeCreateExprWithCleanups(ExprResult SubExpr);
7018
7019  MaterializeTemporaryExpr *
7020  CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary,
7021                                 bool BoundToLvalueReference);
7022
7023  ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
7024    return ActOnFinishFullExpr(
7025        Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
7026  }
7027  ExprResult ActOnFinishFullExpr(Expr *Expr, SourceLocation CC,
7028                                 bool DiscardedValue, bool IsConstexpr = false,
7029                                 bool IsTemplateArgument = false);
7030  StmtResult ActOnFinishFullStmt(Stmt *Stmt);
7031
7032  // Marks SS invalid if it represents an incomplete type.
7033  bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC);
7034  // Complete an enum decl, maybe without a scope spec.
7035  bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L,
7036                               CXXScopeSpec *SS = nullptr);
7037
7038  DeclContext *computeDeclContext(QualType T);
7039  DeclContext *computeDeclContext(const CXXScopeSpec &SS,
7040                                  bool EnteringContext = false);
7041  bool isDependentScopeSpecifier(const CXXScopeSpec &SS);
7042  CXXRecordDecl *getCurrentInstantiationOf(NestedNameSpecifier *NNS);
7043
7044  /// The parser has parsed a global nested-name-specifier '::'.
7045  ///
7046  /// \param CCLoc The location of the '::'.
7047  ///
7048  /// \param SS The nested-name-specifier, which will be updated in-place
7049  /// to reflect the parsed nested-name-specifier.
7050  ///
7051  /// \returns true if an error occurred, false otherwise.
7052  bool ActOnCXXGlobalScopeSpecifier(SourceLocation CCLoc, CXXScopeSpec &SS);
7053
7054  /// The parser has parsed a '__super' nested-name-specifier.
7055  ///
7056  /// \param SuperLoc The location of the '__super' keyword.
7057  ///
7058  /// \param ColonColonLoc The location of the '::'.
7059  ///
7060  /// \param SS The nested-name-specifier, which will be updated in-place
7061  /// to reflect the parsed nested-name-specifier.
7062  ///
7063  /// \returns true if an error occurred, false otherwise.
7064  bool ActOnSuperScopeSpecifier(SourceLocation SuperLoc,
7065                                SourceLocation ColonColonLoc, CXXScopeSpec &SS);
7066
7067  bool isAcceptableNestedNameSpecifier(const NamedDecl *SD,
7068                                       bool *CanCorrect = nullptr);
7069  NamedDecl *FindFirstQualifierInScope(Scope *S, NestedNameSpecifier *NNS);
7070
7071  /// Keeps information about an identifier in a nested-name-spec.
7072  ///
7073  struct NestedNameSpecInfo {
7074    /// The type of the object, if we're parsing nested-name-specifier in
7075    /// a member access expression.
7076    ParsedType ObjectType;
7077
7078    /// The identifier preceding the '::'.
7079    IdentifierInfo *Identifier;
7080
7081    /// The location of the identifier.
7082    SourceLocation IdentifierLoc;
7083
7084    /// The location of the '::'.
7085    SourceLocation CCLoc;
7086
7087    /// Creates info object for the most typical case.
7088    NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc,
7089             SourceLocation ColonColonLoc, ParsedType ObjectType = ParsedType())
7090      : ObjectType(ObjectType), Identifier(II), IdentifierLoc(IdLoc),
7091        CCLoc(ColonColonLoc) {
7092    }
7093
7094    NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc,
7095                       SourceLocation ColonColonLoc, QualType ObjectType)
7096      : ObjectType(ParsedType::make(ObjectType)), Identifier(II),
7097        IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {
7098    }
7099  };
7100
7101  bool BuildCXXNestedNameSpecifier(Scope *S,
7102                                   NestedNameSpecInfo &IdInfo,
7103                                   bool EnteringContext,
7104                                   CXXScopeSpec &SS,
7105                                   NamedDecl *ScopeLookupResult,
7106                                   bool ErrorRecoveryLookup,
7107                                   bool *IsCorrectedToColon = nullptr,
7108                                   bool OnlyNamespace = false);
7109
7110  /// The parser has parsed a nested-name-specifier 'identifier::'.
7111  ///
7112  /// \param S The scope in which this nested-name-specifier occurs.
7113  ///
7114  /// \param IdInfo Parser information about an identifier in the
7115  /// nested-name-spec.
7116  ///
7117  /// \param EnteringContext Whether we're entering the context nominated by
7118  /// this nested-name-specifier.
7119  ///
7120  /// \param SS The nested-name-specifier, which is both an input
7121  /// parameter (the nested-name-specifier before this type) and an
7122  /// output parameter (containing the full nested-name-specifier,
7123  /// including this new type).
7124  ///
7125  /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
7126  /// are allowed.  The bool value pointed by this parameter is set to 'true'
7127  /// if the identifier is treated as if it was followed by ':', not '::'.
7128  ///
7129  /// \param OnlyNamespace If true, only considers namespaces in lookup.
7130  ///
7131  /// \returns true if an error occurred, false otherwise.
7132  bool ActOnCXXNestedNameSpecifier(Scope *S,
7133                                   NestedNameSpecInfo &IdInfo,
7134                                   bool EnteringContext,
7135                                   CXXScopeSpec &SS,
7136                                   bool *IsCorrectedToColon = nullptr,
7137                                   bool OnlyNamespace = false);
7138
7139  ExprResult ActOnDecltypeExpression(Expr *E);
7140
7141  bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS,
7142                                           const DeclSpec &DS,
7143                                           SourceLocation ColonColonLoc);
7144
7145  bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS,
7146                                 NestedNameSpecInfo &IdInfo,
7147                                 bool EnteringContext);
7148
7149  bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7150
7151  /// The parser has parsed a nested-name-specifier
7152  /// 'template[opt] template-name < template-args >::'.
7153  ///
7154  /// \param S The scope in which this nested-name-specifier occurs.
7155  ///
7156  /// \param SS The nested-name-specifier, which is both an input
7157  /// parameter (the nested-name-specifier before this type) and an
7158  /// output parameter (containing the full nested-name-specifier,
7159  /// including this new type).
7160  ///
7161  /// \param TemplateKWLoc the location of the 'template' keyword, if any.
7162  /// \param TemplateName the template name.
7163  /// \param TemplateNameLoc The location of the template name.
7164  /// \param LAngleLoc The location of the opening angle bracket  ('<').
7165  /// \param TemplateArgs The template arguments.
7166  /// \param RAngleLoc The location of the closing angle bracket  ('>').
7167  /// \param CCLoc The location of the '::'.
7168  ///
7169  /// \param EnteringContext Whether we're entering the context of the
7170  /// nested-name-specifier.
7171  ///
7172  ///
7173  /// \returns true if an error occurred, false otherwise.
7174  bool ActOnCXXNestedNameSpecifier(Scope *S,
7175                                   CXXScopeSpec &SS,
7176                                   SourceLocation TemplateKWLoc,
7177                                   TemplateTy TemplateName,
7178                                   SourceLocation TemplateNameLoc,
7179                                   SourceLocation LAngleLoc,
7180                                   ASTTemplateArgsPtr TemplateArgs,
7181                                   SourceLocation RAngleLoc,
7182                                   SourceLocation CCLoc,
7183                                   bool EnteringContext);
7184
7185  /// Given a C++ nested-name-specifier, produce an annotation value
7186  /// that the parser can use later to reconstruct the given
7187  /// nested-name-specifier.
7188  ///
7189  /// \param SS A nested-name-specifier.
7190  ///
7191  /// \returns A pointer containing all of the information in the
7192  /// nested-name-specifier \p SS.
7193  void *SaveNestedNameSpecifierAnnotation(CXXScopeSpec &SS);
7194
7195  /// Given an annotation pointer for a nested-name-specifier, restore
7196  /// the nested-name-specifier structure.
7197  ///
7198  /// \param Annotation The annotation pointer, produced by
7199  /// \c SaveNestedNameSpecifierAnnotation().
7200  ///
7201  /// \param AnnotationRange The source range corresponding to the annotation.
7202  ///
7203  /// \param SS The nested-name-specifier that will be updated with the contents
7204  /// of the annotation pointer.
7205  void RestoreNestedNameSpecifierAnnotation(void *Annotation,
7206                                            SourceRange AnnotationRange,
7207                                            CXXScopeSpec &SS);
7208
7209  bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
7210
7211  /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
7212  /// scope or nested-name-specifier) is parsed, part of a declarator-id.
7213  /// After this method is called, according to [C++ 3.4.3p3], names should be
7214  /// looked up in the declarator-id's scope, until the declarator is parsed and
7215  /// ActOnCXXExitDeclaratorScope is called.
7216  /// The 'SS' should be a non-empty valid CXXScopeSpec.
7217  bool ActOnCXXEnterDeclaratorScope(Scope *S, CXXScopeSpec &SS);
7218
7219  /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
7220  /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
7221  /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
7222  /// Used to indicate that names should revert to being looked up in the
7223  /// defining scope.
7224  void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
7225
7226  /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
7227  /// initializer for the declaration 'Dcl'.
7228  /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
7229  /// static data member of class X, names should be looked up in the scope of
7230  /// class X.
7231  void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl);
7232
7233  /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
7234  /// initializer for the declaration 'Dcl'.
7235  void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
7236
7237  /// Create a new lambda closure type.
7238  CXXRecordDecl *createLambdaClosureType(SourceRange IntroducerRange,
7239                                         TypeSourceInfo *Info,
7240                                         unsigned LambdaDependencyKind,
7241                                         LambdaCaptureDefault CaptureDefault);
7242
7243  /// Number lambda for linkage purposes if necessary.
7244  void handleLambdaNumbering(CXXRecordDecl *Class, CXXMethodDecl *Method,
7245                             std::optional<CXXRecordDecl::LambdaNumbering>
7246                                 NumberingOverride = std::nullopt);
7247
7248  /// Endow the lambda scope info with the relevant properties.
7249  void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
7250                        SourceRange IntroducerRange,
7251                        LambdaCaptureDefault CaptureDefault,
7252                        SourceLocation CaptureDefaultLoc, bool ExplicitParams,
7253                        bool Mutable);
7254
7255  CXXMethodDecl *CreateLambdaCallOperator(SourceRange IntroducerRange,
7256                                          CXXRecordDecl *Class);
7257
7258  void AddTemplateParametersToLambdaCallOperator(
7259      CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
7260      TemplateParameterList *TemplateParams);
7261
7262  void CompleteLambdaCallOperator(
7263      CXXMethodDecl *Method, SourceLocation LambdaLoc,
7264      SourceLocation CallOperatorLoc, Expr *TrailingRequiresClause,
7265      TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind,
7266      StorageClass SC, ArrayRef<ParmVarDecl *> Params,
7267      bool HasExplicitResultType);
7268
7269  void DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method);
7270
7271  /// Perform initialization analysis of the init-capture and perform
7272  /// any implicit conversions such as an lvalue-to-rvalue conversion if
7273  /// not being used to initialize a reference.
7274  ParsedType actOnLambdaInitCaptureInitialization(
7275      SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
7276      IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
7277    return ParsedType::make(buildLambdaInitCaptureInitialization(
7278        Loc, ByRef, EllipsisLoc, std::nullopt, Id,
7279        InitKind != LambdaCaptureInitKind::CopyInit, Init));
7280  }
7281  QualType buildLambdaInitCaptureInitialization(
7282      SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
7283      std::optional<unsigned> NumExpansions, IdentifierInfo *Id,
7284      bool DirectInit, Expr *&Init);
7285
7286  /// Create a dummy variable within the declcontext of the lambda's
7287  ///  call operator, for name lookup purposes for a lambda init capture.
7288  ///
7289  ///  CodeGen handles emission of lambda captures, ignoring these dummy
7290  ///  variables appropriately.
7291  VarDecl *createLambdaInitCaptureVarDecl(
7292      SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
7293      IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
7294
7295  /// Add an init-capture to a lambda scope.
7296  void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
7297
7298  /// Note that we have finished the explicit captures for the
7299  /// given lambda.
7300  void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI);
7301
7302  /// Deduce a block or lambda's return type based on the return
7303  /// statements present in the body.
7304  void deduceClosureReturnType(sema::CapturingScopeInfo &CSI);
7305
7306  /// Once the Lambdas capture are known, we can start to create the closure,
7307  /// call operator method, and keep track of the captures.
7308  /// We do the capture lookup here, but they are not actually captured until
7309  /// after we know what the qualifiers of the call operator are.
7310  void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro,
7311                                            Scope *CurContext);
7312
7313  /// This is called after parsing the explicit template parameter list
7314  /// on a lambda (if it exists) in C++2a.
7315  void ActOnLambdaExplicitTemplateParameterList(LambdaIntroducer &Intro,
7316                                                SourceLocation LAngleLoc,
7317                                                ArrayRef<NamedDecl *> TParams,
7318                                                SourceLocation RAngleLoc,
7319                                                ExprResult RequiresClause);
7320
7321  void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro,
7322                                    SourceLocation MutableLoc);
7323
7324  void ActOnLambdaClosureParameters(
7325      Scope *LambdaScope,
7326      MutableArrayRef<DeclaratorChunk::ParamInfo> ParamInfo);
7327
7328  /// ActOnStartOfLambdaDefinition - This is called just before we start
7329  /// parsing the body of a lambda; it analyzes the explicit captures and
7330  /// arguments, and sets up various data-structures for the body of the
7331  /// lambda.
7332  void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
7333                                    Declarator &ParamInfo, const DeclSpec &DS);
7334
7335  /// ActOnLambdaError - If there is an error parsing a lambda, this callback
7336  /// is invoked to pop the information about the lambda.
7337  void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
7338                        bool IsInstantiation = false);
7339
7340  /// ActOnLambdaExpr - This is called when the body of a lambda expression
7341  /// was successfully completed.
7342  ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body);
7343
7344  /// Does copying/destroying the captured variable have side effects?
7345  bool CaptureHasSideEffects(const sema::Capture &From);
7346
7347  /// Diagnose if an explicit lambda capture is unused. Returns true if a
7348  /// diagnostic is emitted.
7349  bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
7350                                   const sema::Capture &From);
7351
7352  /// Build a FieldDecl suitable to hold the given capture.
7353  FieldDecl *BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture);
7354
7355  /// Initialize the given capture with a suitable expression.
7356  ExprResult BuildCaptureInit(const sema::Capture &Capture,
7357                              SourceLocation ImplicitCaptureLoc,
7358                              bool IsOpenMPMapping = false);
7359
7360  /// Complete a lambda-expression having processed and attached the
7361  /// lambda body.
7362  ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
7363                             sema::LambdaScopeInfo *LSI);
7364
7365  /// Get the return type to use for a lambda's conversion function(s) to
7366  /// function pointer type, given the type of the call operator.
7367  QualType
7368  getLambdaConversionFunctionResultType(const FunctionProtoType *CallOpType,
7369                                        CallingConv CC);
7370
7371  /// Define the "body" of the conversion from a lambda object to a
7372  /// function pointer.
7373  ///
7374  /// This routine doesn't actually define a sensible body; rather, it fills
7375  /// in the initialization expression needed to copy the lambda object into
7376  /// the block, and IR generation actually generates the real body of the
7377  /// block pointer conversion.
7378  void DefineImplicitLambdaToFunctionPointerConversion(
7379         SourceLocation CurrentLoc, CXXConversionDecl *Conv);
7380
7381  /// Define the "body" of the conversion from a lambda object to a
7382  /// block pointer.
7383  ///
7384  /// This routine doesn't actually define a sensible body; rather, it fills
7385  /// in the initialization expression needed to copy the lambda object into
7386  /// the block, and IR generation actually generates the real body of the
7387  /// block pointer conversion.
7388  void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc,
7389                                                    CXXConversionDecl *Conv);
7390
7391  ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation,
7392                                           SourceLocation ConvLocation,
7393                                           CXXConversionDecl *Conv,
7394                                           Expr *Src);
7395
7396  sema::LambdaScopeInfo *RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator);
7397
7398  class LambdaScopeForCallOperatorInstantiationRAII
7399      : private FunctionScopeRAII {
7400  public:
7401    LambdaScopeForCallOperatorInstantiationRAII(
7402        Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
7403        LocalInstantiationScope &Scope,
7404        bool ShouldAddDeclsFromParentScope = true);
7405  };
7406
7407  /// Check whether the given expression is a valid constraint expression.
7408  /// A diagnostic is emitted if it is not, false is returned, and
7409  /// PossibleNonPrimary will be set to true if the failure might be due to a
7410  /// non-primary expression being used as an atomic constraint.
7411  bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
7412                                 bool *PossibleNonPrimary = nullptr,
7413                                 bool IsTrailingRequiresClause = false);
7414
7415private:
7416  /// Caches pairs of template-like decls whose associated constraints were
7417  /// checked for subsumption and whether or not the first's constraints did in
7418  /// fact subsume the second's.
7419  llvm::DenseMap<std::pair<NamedDecl *, NamedDecl *>, bool> SubsumptionCache;
7420  /// Caches the normalized associated constraints of declarations (concepts or
7421  /// constrained declarations). If an error occurred while normalizing the
7422  /// associated constraints of the template or concept, nullptr will be cached
7423  /// here.
7424  llvm::DenseMap<NamedDecl *, NormalizedConstraint *>
7425      NormalizationCache;
7426
7427  llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
7428      SatisfactionCache;
7429
7430  /// Introduce the instantiated local variables into the local
7431  /// instantiation scope.
7432  void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
7433                                       const FunctionDecl *PatternDecl,
7434                                       LocalInstantiationScope &Scope);
7435  /// Introduce the instantiated function parameters into the local
7436  /// instantiation scope, and set the parameter names to those used
7437  /// in the template.
7438  bool addInstantiatedParametersToScope(
7439      FunctionDecl *Function, const FunctionDecl *PatternDecl,
7440      LocalInstantiationScope &Scope,
7441      const MultiLevelTemplateArgumentList &TemplateArgs);
7442
7443  /// Introduce the instantiated captures of the lambda into the local
7444  /// instantiation scope.
7445  bool addInstantiatedCapturesToScope(
7446      FunctionDecl *Function, const FunctionDecl *PatternDecl,
7447      LocalInstantiationScope &Scope,
7448      const MultiLevelTemplateArgumentList &TemplateArgs);
7449
7450  /// used by SetupConstraintCheckingTemplateArgumentsAndScope to recursively(in
7451  /// the case of lambdas) set up the LocalInstantiationScope of the current
7452  /// function.
7453  bool SetupConstraintScope(
7454      FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
7455      MultiLevelTemplateArgumentList MLTAL, LocalInstantiationScope &Scope);
7456
7457  /// Used during constraint checking, sets up the constraint template argument
7458  /// lists, and calls SetupConstraintScope to set up the
7459  /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
7460  std::optional<MultiLevelTemplateArgumentList>
7461  SetupConstraintCheckingTemplateArgumentsAndScope(
7462      FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
7463      LocalInstantiationScope &Scope);
7464
7465private:
7466  // The current stack of constraint satisfactions, so we can exit-early.
7467  using SatisfactionStackEntryTy =
7468      std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
7469  llvm::SmallVector<SatisfactionStackEntryTy, 10>
7470      SatisfactionStack;
7471
7472public:
7473  void PushSatisfactionStackEntry(const NamedDecl *D,
7474                                  const llvm::FoldingSetNodeID &ID) {
7475    const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
7476    SatisfactionStack.emplace_back(Can, ID);
7477  }
7478
7479  void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
7480
7481  bool SatisfactionStackContains(const NamedDecl *D,
7482                                 const llvm::FoldingSetNodeID &ID) const {
7483    const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
7484    return llvm::find(SatisfactionStack,
7485                      SatisfactionStackEntryTy{Can, ID}) !=
7486           SatisfactionStack.end();
7487  }
7488
7489  // Resets the current SatisfactionStack for cases where we are instantiating
7490  // constraints as a 'side effect' of normal instantiation in a way that is not
7491  // indicative of recursive definition.
7492  class SatisfactionStackResetRAII {
7493    llvm::SmallVector<SatisfactionStackEntryTy, 10>
7494        BackupSatisfactionStack;
7495    Sema &SemaRef;
7496
7497  public:
7498    SatisfactionStackResetRAII(Sema &S) : SemaRef(S) {
7499      SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
7500    }
7501
7502    ~SatisfactionStackResetRAII() {
7503      SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
7504    }
7505  };
7506
7507  void SwapSatisfactionStack(
7508      llvm::SmallVectorImpl<SatisfactionStackEntryTy> &NewSS) {
7509    SatisfactionStack.swap(NewSS);
7510  }
7511
7512  const NormalizedConstraint *
7513  getNormalizedAssociatedConstraints(
7514      NamedDecl *ConstrainedDecl, ArrayRef<const Expr *> AssociatedConstraints);
7515
7516  /// \brief Check whether the given declaration's associated constraints are
7517  /// at least as constrained than another declaration's according to the
7518  /// partial ordering of constraints.
7519  ///
7520  /// \param Result If no error occurred, receives the result of true if D1 is
7521  /// at least constrained than D2, and false otherwise.
7522  ///
7523  /// \returns true if an error occurred, false otherwise.
7524  bool IsAtLeastAsConstrained(NamedDecl *D1, MutableArrayRef<const Expr *> AC1,
7525                              NamedDecl *D2, MutableArrayRef<const Expr *> AC2,
7526                              bool &Result);
7527
7528  /// If D1 was not at least as constrained as D2, but would've been if a pair
7529  /// of atomic constraints involved had been declared in a concept and not
7530  /// repeated in two separate places in code.
7531  /// \returns true if such a diagnostic was emitted, false otherwise.
7532  bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1,
7533      ArrayRef<const Expr *> AC1, NamedDecl *D2, ArrayRef<const Expr *> AC2);
7534
7535  /// \brief Check whether the given list of constraint expressions are
7536  /// satisfied (as if in a 'conjunction') given template arguments.
7537  /// \param Template the template-like entity that triggered the constraints
7538  /// check (either a concept or a constrained entity).
7539  /// \param ConstraintExprs a list of constraint expressions, treated as if
7540  /// they were 'AND'ed together.
7541  /// \param TemplateArgLists the list of template arguments to substitute into
7542  /// the constraint expression.
7543  /// \param TemplateIDRange The source range of the template id that
7544  /// caused the constraints check.
7545  /// \param Satisfaction if true is returned, will contain details of the
7546  /// satisfaction, with enough information to diagnose an unsatisfied
7547  /// expression.
7548  /// \returns true if an error occurred and satisfaction could not be checked,
7549  /// false otherwise.
7550  bool CheckConstraintSatisfaction(
7551      const NamedDecl *Template, ArrayRef<const Expr *> ConstraintExprs,
7552      const MultiLevelTemplateArgumentList &TemplateArgLists,
7553      SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction) {
7554    llvm::SmallVector<Expr *, 4> Converted;
7555    return CheckConstraintSatisfaction(Template, ConstraintExprs, Converted,
7556                                       TemplateArgLists, TemplateIDRange,
7557                                       Satisfaction);
7558  }
7559
7560  /// \brief Check whether the given list of constraint expressions are
7561  /// satisfied (as if in a 'conjunction') given template arguments.
7562  /// Additionally, takes an empty list of Expressions which is populated with
7563  /// the instantiated versions of the ConstraintExprs.
7564  /// \param Template the template-like entity that triggered the constraints
7565  /// check (either a concept or a constrained entity).
7566  /// \param ConstraintExprs a list of constraint expressions, treated as if
7567  /// they were 'AND'ed together.
7568  /// \param ConvertedConstraints a out parameter that will get populated with
7569  /// the instantiated version of the ConstraintExprs if we successfully checked
7570  /// satisfaction.
7571  /// \param TemplateArgList the multi-level list of template arguments to
7572  /// substitute into the constraint expression. This should be relative to the
7573  /// top-level (hence multi-level), since we need to instantiate fully at the
7574  /// time of checking.
7575  /// \param TemplateIDRange The source range of the template id that
7576  /// caused the constraints check.
7577  /// \param Satisfaction if true is returned, will contain details of the
7578  /// satisfaction, with enough information to diagnose an unsatisfied
7579  /// expression.
7580  /// \returns true if an error occurred and satisfaction could not be checked,
7581  /// false otherwise.
7582  bool CheckConstraintSatisfaction(
7583      const NamedDecl *Template, ArrayRef<const Expr *> ConstraintExprs,
7584      llvm::SmallVectorImpl<Expr *> &ConvertedConstraints,
7585      const MultiLevelTemplateArgumentList &TemplateArgList,
7586      SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction);
7587
7588  /// \brief Check whether the given non-dependent constraint expression is
7589  /// satisfied. Returns false and updates Satisfaction with the satisfaction
7590  /// verdict if successful, emits a diagnostic and returns true if an error
7591  /// occurred and satisfaction could not be determined.
7592  ///
7593  /// \returns true if an error occurred, false otherwise.
7594  bool CheckConstraintSatisfaction(const Expr *ConstraintExpr,
7595                                   ConstraintSatisfaction &Satisfaction);
7596
7597  /// Check whether the given function decl's trailing requires clause is
7598  /// satisfied, if any. Returns false and updates Satisfaction with the
7599  /// satisfaction verdict if successful, emits a diagnostic and returns true if
7600  /// an error occurred and satisfaction could not be determined.
7601  ///
7602  /// \returns true if an error occurred, false otherwise.
7603  bool CheckFunctionConstraints(const FunctionDecl *FD,
7604                                ConstraintSatisfaction &Satisfaction,
7605                                SourceLocation UsageLoc = SourceLocation(),
7606                                bool ForOverloadResolution = false);
7607
7608  /// \brief Ensure that the given template arguments satisfy the constraints
7609  /// associated with the given template, emitting a diagnostic if they do not.
7610  ///
7611  /// \param Template The template to which the template arguments are being
7612  /// provided.
7613  ///
7614  /// \param TemplateArgs The converted, canonicalized template arguments.
7615  ///
7616  /// \param TemplateIDRange The source range of the template id that
7617  /// caused the constraints check.
7618  ///
7619  /// \returns true if the constrains are not satisfied or could not be checked
7620  /// for satisfaction, false if the constraints are satisfied.
7621  bool EnsureTemplateArgumentListConstraints(
7622      TemplateDecl *Template,
7623      const MultiLevelTemplateArgumentList &TemplateArgs,
7624      SourceRange TemplateIDRange);
7625
7626  /// \brief Emit diagnostics explaining why a constraint expression was deemed
7627  /// unsatisfied.
7628  /// \param First whether this is the first time an unsatisfied constraint is
7629  /// diagnosed for this error.
7630  void
7631  DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction,
7632                                bool First = true);
7633
7634  /// \brief Emit diagnostics explaining why a constraint expression was deemed
7635  /// unsatisfied.
7636  void
7637  DiagnoseUnsatisfiedConstraint(const ASTConstraintSatisfaction &Satisfaction,
7638                                bool First = true);
7639
7640  // ParseObjCStringLiteral - Parse Objective-C string literals.
7641  ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs,
7642                                    ArrayRef<Expr *> Strings);
7643
7644  ExprResult BuildObjCStringLiteral(SourceLocation AtLoc, StringLiteral *S);
7645
7646  /// BuildObjCNumericLiteral - builds an ObjCBoxedExpr AST node for the
7647  /// numeric literal expression. Type of the expression will be "NSNumber *"
7648  /// or "id" if NSNumber is unavailable.
7649  ExprResult BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number);
7650  ExprResult ActOnObjCBoolLiteral(SourceLocation AtLoc, SourceLocation ValueLoc,
7651                                  bool Value);
7652  ExprResult BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements);
7653
7654  /// BuildObjCBoxedExpr - builds an ObjCBoxedExpr AST node for the
7655  /// '@' prefixed parenthesized expression. The type of the expression will
7656  /// either be "NSNumber *", "NSString *" or "NSValue *" depending on the type
7657  /// of ValueType, which is allowed to be a built-in numeric type, "char *",
7658  /// "const char *" or C structure with attribute 'objc_boxable'.
7659  ExprResult BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr);
7660
7661  ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr,
7662                                          Expr *IndexExpr,
7663                                          ObjCMethodDecl *getterMethod,
7664                                          ObjCMethodDecl *setterMethod);
7665
7666  ExprResult BuildObjCDictionaryLiteral(SourceRange SR,
7667                               MutableArrayRef<ObjCDictionaryElement> Elements);
7668
7669  ExprResult BuildObjCEncodeExpression(SourceLocation AtLoc,
7670                                  TypeSourceInfo *EncodedTypeInfo,
7671                                  SourceLocation RParenLoc);
7672  ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl,
7673                                    CXXConversionDecl *Method,
7674                                    bool HadMultipleCandidates);
7675
7676  ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc,
7677                                       SourceLocation EncodeLoc,
7678                                       SourceLocation LParenLoc,
7679                                       ParsedType Ty,
7680                                       SourceLocation RParenLoc);
7681
7682  /// ParseObjCSelectorExpression - Build selector expression for \@selector
7683  ExprResult ParseObjCSelectorExpression(Selector Sel,
7684                                         SourceLocation AtLoc,
7685                                         SourceLocation SelLoc,
7686                                         SourceLocation LParenLoc,
7687                                         SourceLocation RParenLoc,
7688                                         bool WarnMultipleSelectors);
7689
7690  /// ParseObjCProtocolExpression - Build protocol expression for \@protocol
7691  ExprResult ParseObjCProtocolExpression(IdentifierInfo * ProtocolName,
7692                                         SourceLocation AtLoc,
7693                                         SourceLocation ProtoLoc,
7694                                         SourceLocation LParenLoc,
7695                                         SourceLocation ProtoIdLoc,
7696                                         SourceLocation RParenLoc);
7697
7698  //===--------------------------------------------------------------------===//
7699  // C++ Declarations
7700  //
7701  Decl *ActOnStartLinkageSpecification(Scope *S,
7702                                       SourceLocation ExternLoc,
7703                                       Expr *LangStr,
7704                                       SourceLocation LBraceLoc);
7705  Decl *ActOnFinishLinkageSpecification(Scope *S,
7706                                        Decl *LinkageSpec,
7707                                        SourceLocation RBraceLoc);
7708
7709
7710  //===--------------------------------------------------------------------===//
7711  // C++ Classes
7712  //
7713  CXXRecordDecl *getCurrentClass(Scope *S, const CXXScopeSpec *SS);
7714  bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
7715                          const CXXScopeSpec *SS = nullptr);
7716  bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS);
7717
7718  bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc,
7719                            SourceLocation ColonLoc,
7720                            const ParsedAttributesView &Attrs);
7721
7722  NamedDecl *ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS,
7723                                 Declarator &D,
7724                                 MultiTemplateParamsArg TemplateParameterLists,
7725                                 Expr *BitfieldWidth, const VirtSpecifiers &VS,
7726                                 InClassInitStyle InitStyle);
7727
7728  void ActOnStartCXXInClassMemberInitializer();
7729  void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl,
7730                                              SourceLocation EqualLoc,
7731                                              Expr *Init);
7732
7733  MemInitResult ActOnMemInitializer(Decl *ConstructorD,
7734                                    Scope *S,
7735                                    CXXScopeSpec &SS,
7736                                    IdentifierInfo *MemberOrBase,
7737                                    ParsedType TemplateTypeTy,
7738                                    const DeclSpec &DS,
7739                                    SourceLocation IdLoc,
7740                                    SourceLocation LParenLoc,
7741                                    ArrayRef<Expr *> Args,
7742                                    SourceLocation RParenLoc,
7743                                    SourceLocation EllipsisLoc);
7744
7745  MemInitResult ActOnMemInitializer(Decl *ConstructorD,
7746                                    Scope *S,
7747                                    CXXScopeSpec &SS,
7748                                    IdentifierInfo *MemberOrBase,
7749                                    ParsedType TemplateTypeTy,
7750                                    const DeclSpec &DS,
7751                                    SourceLocation IdLoc,
7752                                    Expr *InitList,
7753                                    SourceLocation EllipsisLoc);
7754
7755  MemInitResult BuildMemInitializer(Decl *ConstructorD,
7756                                    Scope *S,
7757                                    CXXScopeSpec &SS,
7758                                    IdentifierInfo *MemberOrBase,
7759                                    ParsedType TemplateTypeTy,
7760                                    const DeclSpec &DS,
7761                                    SourceLocation IdLoc,
7762                                    Expr *Init,
7763                                    SourceLocation EllipsisLoc);
7764
7765  MemInitResult BuildMemberInitializer(ValueDecl *Member,
7766                                       Expr *Init,
7767                                       SourceLocation IdLoc);
7768
7769  MemInitResult BuildBaseInitializer(QualType BaseType,
7770                                     TypeSourceInfo *BaseTInfo,
7771                                     Expr *Init,
7772                                     CXXRecordDecl *ClassDecl,
7773                                     SourceLocation EllipsisLoc);
7774
7775  MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo,
7776                                           Expr *Init,
7777                                           CXXRecordDecl *ClassDecl);
7778
7779  bool SetDelegatingInitializer(CXXConstructorDecl *Constructor,
7780                                CXXCtorInitializer *Initializer);
7781
7782  bool SetCtorInitializers(
7783      CXXConstructorDecl *Constructor, bool AnyErrors,
7784      ArrayRef<CXXCtorInitializer *> Initializers = std::nullopt);
7785
7786  void SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation);
7787
7788
7789  /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
7790  /// mark all the non-trivial destructors of its members and bases as
7791  /// referenced.
7792  void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
7793                                              CXXRecordDecl *Record);
7794
7795  /// Mark destructors of virtual bases of this class referenced. In the Itanium
7796  /// C++ ABI, this is done when emitting a destructor for any non-abstract
7797  /// class. In the Microsoft C++ ABI, this is done any time a class's
7798  /// destructor is referenced.
7799  void MarkVirtualBaseDestructorsReferenced(
7800      SourceLocation Location, CXXRecordDecl *ClassDecl,
7801      llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases = nullptr);
7802
7803  /// Do semantic checks to allow the complete destructor variant to be emitted
7804  /// when the destructor is defined in another translation unit. In the Itanium
7805  /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
7806  /// can be emitted in separate TUs. To emit the complete variant, run a subset
7807  /// of the checks performed when emitting a regular destructor.
7808  void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
7809                                      CXXDestructorDecl *Dtor);
7810
7811  /// The list of classes whose vtables have been used within
7812  /// this translation unit, and the source locations at which the
7813  /// first use occurred.
7814  typedef std::pair<CXXRecordDecl*, SourceLocation> VTableUse;
7815
7816  /// The list of vtables that are required but have not yet been
7817  /// materialized.
7818  SmallVector<VTableUse, 16> VTableUses;
7819
7820  /// The set of classes whose vtables have been used within
7821  /// this translation unit, and a bit that will be true if the vtable is
7822  /// required to be emitted (otherwise, it should be emitted only if needed
7823  /// by code generation).
7824  llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
7825
7826  /// Load any externally-stored vtable uses.
7827  void LoadExternalVTableUses();
7828
7829  /// Note that the vtable for the given class was used at the
7830  /// given location.
7831  void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class,
7832                      bool DefinitionRequired = false);
7833
7834  /// Mark the exception specifications of all virtual member functions
7835  /// in the given class as needed.
7836  void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc,
7837                                             const CXXRecordDecl *RD);
7838
7839  /// MarkVirtualMembersReferenced - Will mark all members of the given
7840  /// CXXRecordDecl referenced.
7841  void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD,
7842                                    bool ConstexprOnly = false);
7843
7844  /// Define all of the vtables that have been used in this
7845  /// translation unit and reference any virtual members used by those
7846  /// vtables.
7847  ///
7848  /// \returns true if any work was done, false otherwise.
7849  bool DefineUsedVTables();
7850
7851  void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl);
7852
7853  void ActOnMemInitializers(Decl *ConstructorDecl,
7854                            SourceLocation ColonLoc,
7855                            ArrayRef<CXXCtorInitializer*> MemInits,
7856                            bool AnyErrors);
7857
7858  /// Check class-level dllimport/dllexport attribute. The caller must
7859  /// ensure that referenceDLLExportedClassMethods is called some point later
7860  /// when all outer classes of Class are complete.
7861  void checkClassLevelDLLAttribute(CXXRecordDecl *Class);
7862  void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class);
7863
7864  void referenceDLLExportedClassMethods();
7865
7866  void propagateDLLAttrToBaseClassTemplate(
7867      CXXRecordDecl *Class, Attr *ClassAttr,
7868      ClassTemplateSpecializationDecl *BaseTemplateSpec,
7869      SourceLocation BaseLoc);
7870
7871  /// Add gsl::Pointer attribute to std::container::iterator
7872  /// \param ND The declaration that introduces the name
7873  /// std::container::iterator. \param UnderlyingRecord The record named by ND.
7874  void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
7875
7876  /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
7877  void inferGslOwnerPointerAttribute(CXXRecordDecl *Record);
7878
7879  /// Add [[gsl::Pointer]] attributes for std:: types.
7880  void inferGslPointerAttribute(TypedefNameDecl *TD);
7881
7882  void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record);
7883
7884  /// Check that the C++ class annoated with "trivial_abi" satisfies all the
7885  /// conditions that are needed for the attribute to have an effect.
7886  void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD);
7887
7888  void ActOnFinishCXXMemberSpecification(Scope *S, SourceLocation RLoc,
7889                                         Decl *TagDecl, SourceLocation LBrac,
7890                                         SourceLocation RBrac,
7891                                         const ParsedAttributesView &AttrList);
7892  void ActOnFinishCXXMemberDecls();
7893  void ActOnFinishCXXNonNestedClass();
7894
7895  void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param);
7896  unsigned ActOnReenterTemplateScope(Decl *Template,
7897                                     llvm::function_ref<Scope *()> EnterScope);
7898  void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record);
7899  void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method);
7900  void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
7901  void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record);
7902  void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method);
7903  void ActOnFinishDelayedMemberInitializers(Decl *Record);
7904  void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD,
7905                                CachedTokens &Toks);
7906  void UnmarkAsLateParsedTemplate(FunctionDecl *FD);
7907  bool IsInsideALocalClassWithinATemplateFunction();
7908
7909  bool EvaluateStaticAssertMessageAsString(Expr *Message, std::string &Result,
7910                                           ASTContext &Ctx,
7911                                           bool ErrorOnInvalidMessage);
7912  Decl *ActOnStaticAssertDeclaration(SourceLocation StaticAssertLoc,
7913                                     Expr *AssertExpr,
7914                                     Expr *AssertMessageExpr,
7915                                     SourceLocation RParenLoc);
7916  Decl *BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc,
7917                                     Expr *AssertExpr, Expr *AssertMessageExpr,
7918                                     SourceLocation RParenLoc, bool Failed);
7919  void DiagnoseStaticAssertDetails(const Expr *E);
7920
7921  FriendDecl *CheckFriendTypeDecl(SourceLocation LocStart,
7922                                  SourceLocation FriendLoc,
7923                                  TypeSourceInfo *TSInfo);
7924  Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
7925                            MultiTemplateParamsArg TemplateParams);
7926  NamedDecl *ActOnFriendFunctionDecl(Scope *S, Declarator &D,
7927                                     MultiTemplateParamsArg TemplateParams);
7928
7929  QualType CheckConstructorDeclarator(Declarator &D, QualType R,
7930                                      StorageClass& SC);
7931  void CheckConstructor(CXXConstructorDecl *Constructor);
7932  QualType CheckDestructorDeclarator(Declarator &D, QualType R,
7933                                     StorageClass& SC);
7934  bool CheckDestructor(CXXDestructorDecl *Destructor);
7935  void CheckConversionDeclarator(Declarator &D, QualType &R,
7936                                 StorageClass& SC);
7937  Decl *ActOnConversionDeclarator(CXXConversionDecl *Conversion);
7938  bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R,
7939                                     StorageClass &SC);
7940  void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD);
7941
7942  void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD);
7943
7944  bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD,
7945                                             CXXSpecialMember CSM,
7946                                             SourceLocation DefaultLoc);
7947  void CheckDelayedMemberExceptionSpecs();
7948
7949  bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD,
7950                                          DefaultedComparisonKind DCK);
7951  void DeclareImplicitEqualityComparison(CXXRecordDecl *RD,
7952                                         FunctionDecl *Spaceship);
7953  void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD,
7954                                 DefaultedComparisonKind DCK);
7955
7956  void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name,
7957                                         QualType R, bool IsLambda,
7958                                         DeclContext *DC = nullptr);
7959  void CheckExplicitObjectMemberFunction(DeclContext *DC, Declarator &D,
7960                                         DeclarationName Name, QualType R);
7961  void CheckExplicitObjectLambda(Declarator &D);
7962
7963  //===--------------------------------------------------------------------===//
7964  // C++ Derived Classes
7965  //
7966
7967  /// ActOnBaseSpecifier - Parsed a base specifier
7968  CXXBaseSpecifier *CheckBaseSpecifier(CXXRecordDecl *Class,
7969                                       SourceRange SpecifierRange,
7970                                       bool Virtual, AccessSpecifier Access,
7971                                       TypeSourceInfo *TInfo,
7972                                       SourceLocation EllipsisLoc);
7973
7974  BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
7975                                const ParsedAttributesView &Attrs, bool Virtual,
7976                                AccessSpecifier Access, ParsedType basetype,
7977                                SourceLocation BaseLoc,
7978                                SourceLocation EllipsisLoc);
7979
7980  bool AttachBaseSpecifiers(CXXRecordDecl *Class,
7981                            MutableArrayRef<CXXBaseSpecifier *> Bases);
7982  void ActOnBaseSpecifiers(Decl *ClassDecl,
7983                           MutableArrayRef<CXXBaseSpecifier *> Bases);
7984
7985  bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base);
7986  bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,
7987                     CXXBasePaths &Paths);
7988
7989  // FIXME: I don't like this name.
7990  void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
7991
7992  bool CheckDerivedToBaseConversion(QualType Derived, QualType Base,
7993                                    SourceLocation Loc, SourceRange Range,
7994                                    CXXCastPath *BasePath = nullptr,
7995                                    bool IgnoreAccess = false);
7996  bool CheckDerivedToBaseConversion(QualType Derived, QualType Base,
7997                                    unsigned InaccessibleBaseID,
7998                                    unsigned AmbiguousBaseConvID,
7999                                    SourceLocation Loc, SourceRange Range,
8000                                    DeclarationName Name,
8001                                    CXXCastPath *BasePath,
8002                                    bool IgnoreAccess = false);
8003
8004  std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
8005
8006  bool CheckOverridingFunctionAttributes(const CXXMethodDecl *New,
8007                                         const CXXMethodDecl *Old);
8008
8009  /// CheckOverridingFunctionReturnType - Checks whether the return types are
8010  /// covariant, according to C++ [class.virtual]p5.
8011  bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New,
8012                                         const CXXMethodDecl *Old);
8013
8014  // Check that the overriding method has no explicit object parameter.
8015  bool CheckExplicitObjectOverride(CXXMethodDecl *New,
8016                                   const CXXMethodDecl *Old);
8017
8018  /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
8019  /// spec is a subset of base spec.
8020  bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New,
8021                                            const CXXMethodDecl *Old);
8022
8023  bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange);
8024
8025  /// CheckOverrideControl - Check C++11 override control semantics.
8026  void CheckOverrideControl(NamedDecl *D);
8027
8028  /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
8029  /// not used in the declaration of an overriding method.
8030  void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent);
8031
8032  /// CheckForFunctionMarkedFinal - Checks whether a virtual member function
8033  /// overrides a virtual member function marked 'final', according to
8034  /// C++11 [class.virtual]p4.
8035  bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New,
8036                                              const CXXMethodDecl *Old);
8037
8038
8039  //===--------------------------------------------------------------------===//
8040  // C++ Access Control
8041  //
8042
8043  enum AccessResult {
8044    AR_accessible,
8045    AR_inaccessible,
8046    AR_dependent,
8047    AR_delayed
8048  };
8049
8050  bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
8051                                NamedDecl *PrevMemberDecl,
8052                                AccessSpecifier LexicalAS);
8053
8054  AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E,
8055                                           DeclAccessPair FoundDecl);
8056  AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E,
8057                                           DeclAccessPair FoundDecl);
8058  AccessResult CheckAllocationAccess(SourceLocation OperatorLoc,
8059                                     SourceRange PlacementRange,
8060                                     CXXRecordDecl *NamingClass,
8061                                     DeclAccessPair FoundDecl,
8062                                     bool Diagnose = true);
8063  AccessResult CheckConstructorAccess(SourceLocation Loc,
8064                                      CXXConstructorDecl *D,
8065                                      DeclAccessPair FoundDecl,
8066                                      const InitializedEntity &Entity,
8067                                      bool IsCopyBindingRefToTemp = false);
8068  AccessResult CheckConstructorAccess(SourceLocation Loc,
8069                                      CXXConstructorDecl *D,
8070                                      DeclAccessPair FoundDecl,
8071                                      const InitializedEntity &Entity,
8072                                      const PartialDiagnostic &PDiag);
8073  AccessResult CheckDestructorAccess(SourceLocation Loc,
8074                                     CXXDestructorDecl *Dtor,
8075                                     const PartialDiagnostic &PDiag,
8076                                     QualType objectType = QualType());
8077  AccessResult CheckFriendAccess(NamedDecl *D);
8078  AccessResult CheckMemberAccess(SourceLocation UseLoc,
8079                                 CXXRecordDecl *NamingClass,
8080                                 DeclAccessPair Found);
8081  AccessResult
8082  CheckStructuredBindingMemberAccess(SourceLocation UseLoc,
8083                                     CXXRecordDecl *DecomposedClass,
8084                                     DeclAccessPair Field);
8085  AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr,
8086                                         const SourceRange &,
8087                                         DeclAccessPair FoundDecl);
8088  AccessResult CheckMemberOperatorAccess(SourceLocation Loc,
8089                                         Expr *ObjectExpr,
8090                                         Expr *ArgExpr,
8091                                         DeclAccessPair FoundDecl);
8092  AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr,
8093                                         ArrayRef<Expr *> ArgExprs,
8094                                         DeclAccessPair FoundDecl);
8095  AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr,
8096                                          DeclAccessPair FoundDecl);
8097  AccessResult CheckBaseClassAccess(SourceLocation AccessLoc,
8098                                    QualType Base, QualType Derived,
8099                                    const CXXBasePath &Path,
8100                                    unsigned DiagID,
8101                                    bool ForceCheck = false,
8102                                    bool ForceUnprivileged = false);
8103  void CheckLookupAccess(const LookupResult &R);
8104  bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
8105                          QualType BaseType);
8106  bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass,
8107                                     DeclAccessPair Found, QualType ObjectType,
8108                                     SourceLocation Loc,
8109                                     const PartialDiagnostic &Diag);
8110  bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass,
8111                                     DeclAccessPair Found,
8112                                     QualType ObjectType) {
8113    return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
8114                                         SourceLocation(), PDiag());
8115  }
8116
8117  void HandleDependentAccessCheck(const DependentDiagnostic &DD,
8118                         const MultiLevelTemplateArgumentList &TemplateArgs);
8119  void PerformDependentDiagnostics(const DeclContext *Pattern,
8120                        const MultiLevelTemplateArgumentList &TemplateArgs);
8121
8122  void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx);
8123
8124  /// When true, access checking violations are treated as SFINAE
8125  /// failures rather than hard errors.
8126  bool AccessCheckingSFINAE;
8127
8128  enum AbstractDiagSelID {
8129    AbstractNone = -1,
8130    AbstractReturnType,
8131    AbstractParamType,
8132    AbstractVariableType,
8133    AbstractFieldType,
8134    AbstractIvarType,
8135    AbstractSynthesizedIvarType,
8136    AbstractArrayType
8137  };
8138
8139  bool isAbstractType(SourceLocation Loc, QualType T);
8140  bool RequireNonAbstractType(SourceLocation Loc, QualType T,
8141                              TypeDiagnoser &Diagnoser);
8142  template <typename... Ts>
8143  bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID,
8144                              const Ts &...Args) {
8145    BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8146    return RequireNonAbstractType(Loc, T, Diagnoser);
8147  }
8148
8149  void DiagnoseAbstractType(const CXXRecordDecl *RD);
8150
8151  //===--------------------------------------------------------------------===//
8152  // C++ Overloaded Operators [C++ 13.5]
8153  //
8154
8155  bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl);
8156
8157  bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl);
8158
8159  //===--------------------------------------------------------------------===//
8160  // C++ Templates [C++ 14]
8161  //
8162  void FilterAcceptableTemplateNames(LookupResult &R,
8163                                     bool AllowFunctionTemplates = true,
8164                                     bool AllowDependent = true);
8165  bool hasAnyAcceptableTemplateNames(LookupResult &R,
8166                                     bool AllowFunctionTemplates = true,
8167                                     bool AllowDependent = true,
8168                                     bool AllowNonTemplateFunctions = false);
8169  /// Try to interpret the lookup result D as a template-name.
8170  ///
8171  /// \param D A declaration found by name lookup.
8172  /// \param AllowFunctionTemplates Whether function templates should be
8173  ///        considered valid results.
8174  /// \param AllowDependent Whether unresolved using declarations (that might
8175  ///        name templates) should be considered valid results.
8176  static NamedDecl *getAsTemplateNameDecl(NamedDecl *D,
8177                                          bool AllowFunctionTemplates = true,
8178                                          bool AllowDependent = true);
8179
8180  enum TemplateNameIsRequiredTag { TemplateNameIsRequired };
8181  /// Whether and why a template name is required in this lookup.
8182  class RequiredTemplateKind {
8183  public:
8184    /// Template name is required if TemplateKWLoc is valid.
8185    RequiredTemplateKind(SourceLocation TemplateKWLoc = SourceLocation())
8186        : TemplateKW(TemplateKWLoc) {}
8187    /// Template name is unconditionally required.
8188    RequiredTemplateKind(TemplateNameIsRequiredTag) {}
8189
8190    SourceLocation getTemplateKeywordLoc() const {
8191      return TemplateKW.value_or(SourceLocation());
8192    }
8193    bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); }
8194    bool isRequired() const { return TemplateKW != SourceLocation(); }
8195    explicit operator bool() const { return isRequired(); }
8196
8197  private:
8198    std::optional<SourceLocation> TemplateKW;
8199  };
8200
8201  enum class AssumedTemplateKind {
8202    /// This is not assumed to be a template name.
8203    None,
8204    /// This is assumed to be a template name because lookup found nothing.
8205    FoundNothing,
8206    /// This is assumed to be a template name because lookup found one or more
8207    /// functions (but no function templates).
8208    FoundFunctions,
8209  };
8210  bool LookupTemplateName(
8211      LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType,
8212      bool EnteringContext, bool &MemberOfUnknownSpecialization,
8213      RequiredTemplateKind RequiredTemplate = SourceLocation(),
8214      AssumedTemplateKind *ATK = nullptr, bool AllowTypoCorrection = true);
8215
8216  TemplateNameKind isTemplateName(Scope *S,
8217                                  CXXScopeSpec &SS,
8218                                  bool hasTemplateKeyword,
8219                                  const UnqualifiedId &Name,
8220                                  ParsedType ObjectType,
8221                                  bool EnteringContext,
8222                                  TemplateTy &Template,
8223                                  bool &MemberOfUnknownSpecialization,
8224                                  bool Disambiguation = false);
8225
8226  /// Try to resolve an undeclared template name as a type template.
8227  ///
8228  /// Sets II to the identifier corresponding to the template name, and updates
8229  /// Name to a corresponding (typo-corrected) type template name and TNK to
8230  /// the corresponding kind, if possible.
8231  void ActOnUndeclaredTypeTemplateName(Scope *S, TemplateTy &Name,
8232                                       TemplateNameKind &TNK,
8233                                       SourceLocation NameLoc,
8234                                       IdentifierInfo *&II);
8235
8236  bool resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name,
8237                                        SourceLocation NameLoc,
8238                                        bool Diagnose = true);
8239
8240  /// Determine whether a particular identifier might be the name in a C++1z
8241  /// deduction-guide declaration.
8242  bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
8243                            SourceLocation NameLoc, CXXScopeSpec &SS,
8244                            ParsedTemplateTy *Template = nullptr);
8245
8246  bool DiagnoseUnknownTemplateName(const IdentifierInfo &II,
8247                                   SourceLocation IILoc,
8248                                   Scope *S,
8249                                   const CXXScopeSpec *SS,
8250                                   TemplateTy &SuggestedTemplate,
8251                                   TemplateNameKind &SuggestedKind);
8252
8253  bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation,
8254                                      NamedDecl *Instantiation,
8255                                      bool InstantiatedFromMember,
8256                                      const NamedDecl *Pattern,
8257                                      const NamedDecl *PatternDef,
8258                                      TemplateSpecializationKind TSK,
8259                                      bool Complain = true);
8260
8261  void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl);
8262  TemplateDecl *AdjustDeclIfTemplate(Decl *&Decl);
8263
8264  NamedDecl *ActOnTypeParameter(Scope *S, bool Typename,
8265                                SourceLocation EllipsisLoc,
8266                                SourceLocation KeyLoc,
8267                                IdentifierInfo *ParamName,
8268                                SourceLocation ParamNameLoc,
8269                                unsigned Depth, unsigned Position,
8270                                SourceLocation EqualLoc,
8271                                ParsedType DefaultArg, bool HasTypeConstraint);
8272
8273  bool CheckTypeConstraint(TemplateIdAnnotation *TypeConstraint);
8274
8275  bool ActOnTypeConstraint(const CXXScopeSpec &SS,
8276                           TemplateIdAnnotation *TypeConstraint,
8277                           TemplateTypeParmDecl *ConstrainedParameter,
8278                           SourceLocation EllipsisLoc);
8279  bool BuildTypeConstraint(const CXXScopeSpec &SS,
8280                           TemplateIdAnnotation *TypeConstraint,
8281                           TemplateTypeParmDecl *ConstrainedParameter,
8282                           SourceLocation EllipsisLoc,
8283                           bool AllowUnexpandedPack);
8284
8285  bool AttachTypeConstraint(NestedNameSpecifierLoc NS,
8286                            DeclarationNameInfo NameInfo,
8287                            ConceptDecl *NamedConcept,
8288                            const TemplateArgumentListInfo *TemplateArgs,
8289                            TemplateTypeParmDecl *ConstrainedParameter,
8290                            SourceLocation EllipsisLoc);
8291
8292  bool AttachTypeConstraint(AutoTypeLoc TL,
8293                            NonTypeTemplateParmDecl *NewConstrainedParm,
8294                            NonTypeTemplateParmDecl *OrigConstrainedParm,
8295                            SourceLocation EllipsisLoc);
8296
8297  bool RequireStructuralType(QualType T, SourceLocation Loc);
8298
8299  QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI,
8300                                             SourceLocation Loc);
8301  QualType CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc);
8302
8303  NamedDecl *ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
8304                                      unsigned Depth,
8305                                      unsigned Position,
8306                                      SourceLocation EqualLoc,
8307                                      Expr *DefaultArg);
8308  NamedDecl *ActOnTemplateTemplateParameter(Scope *S,
8309                                       SourceLocation TmpLoc,
8310                                       TemplateParameterList *Params,
8311                                       SourceLocation EllipsisLoc,
8312                                       IdentifierInfo *ParamName,
8313                                       SourceLocation ParamNameLoc,
8314                                       unsigned Depth,
8315                                       unsigned Position,
8316                                       SourceLocation EqualLoc,
8317                                       ParsedTemplateArgument DefaultArg);
8318
8319  TemplateParameterList *
8320  ActOnTemplateParameterList(unsigned Depth,
8321                             SourceLocation ExportLoc,
8322                             SourceLocation TemplateLoc,
8323                             SourceLocation LAngleLoc,
8324                             ArrayRef<NamedDecl *> Params,
8325                             SourceLocation RAngleLoc,
8326                             Expr *RequiresClause);
8327
8328  /// The context in which we are checking a template parameter list.
8329  enum TemplateParamListContext {
8330    TPC_ClassTemplate,
8331    TPC_VarTemplate,
8332    TPC_FunctionTemplate,
8333    TPC_ClassTemplateMember,
8334    TPC_FriendClassTemplate,
8335    TPC_FriendFunctionTemplate,
8336    TPC_FriendFunctionTemplateDefinition,
8337    TPC_TypeAliasTemplate
8338  };
8339
8340  bool CheckTemplateParameterList(TemplateParameterList *NewParams,
8341                                  TemplateParameterList *OldParams,
8342                                  TemplateParamListContext TPC,
8343                                  SkipBodyInfo *SkipBody = nullptr);
8344  TemplateParameterList *MatchTemplateParametersToScopeSpecifier(
8345      SourceLocation DeclStartLoc, SourceLocation DeclLoc,
8346      const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
8347      ArrayRef<TemplateParameterList *> ParamLists,
8348      bool IsFriend, bool &IsMemberSpecialization, bool &Invalid,
8349      bool SuppressDiagnostic = false);
8350
8351  DeclResult CheckClassTemplate(
8352      Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
8353      CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
8354      const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
8355      AccessSpecifier AS, SourceLocation ModulePrivateLoc,
8356      SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
8357      TemplateParameterList **OuterTemplateParamLists,
8358      SkipBodyInfo *SkipBody = nullptr);
8359
8360  TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg,
8361                                                    QualType NTTPType,
8362                                                    SourceLocation Loc);
8363
8364  /// Get a template argument mapping the given template parameter to itself,
8365  /// e.g. for X in \c template<int X>, this would return an expression template
8366  /// argument referencing X.
8367  TemplateArgumentLoc getIdentityTemplateArgumentLoc(NamedDecl *Param,
8368                                                     SourceLocation Location);
8369
8370  void translateTemplateArguments(const ASTTemplateArgsPtr &In,
8371                                  TemplateArgumentListInfo &Out);
8372
8373  ParsedTemplateArgument ActOnTemplateTypeArgument(TypeResult ParsedType);
8374
8375  void NoteAllFoundTemplates(TemplateName Name);
8376
8377  QualType CheckTemplateIdType(TemplateName Template,
8378                               SourceLocation TemplateLoc,
8379                              TemplateArgumentListInfo &TemplateArgs);
8380
8381  TypeResult
8382  ActOnTemplateIdType(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8383                      TemplateTy Template, IdentifierInfo *TemplateII,
8384                      SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
8385                      ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
8386                      bool IsCtorOrDtorName = false, bool IsClassName = false,
8387                      ImplicitTypenameContext AllowImplicitTypename =
8388                          ImplicitTypenameContext::No);
8389
8390  /// Parsed an elaborated-type-specifier that refers to a template-id,
8391  /// such as \c class T::template apply<U>.
8392  TypeResult ActOnTagTemplateIdType(TagUseKind TUK,
8393                                    TypeSpecifierType TagSpec,
8394                                    SourceLocation TagLoc,
8395                                    CXXScopeSpec &SS,
8396                                    SourceLocation TemplateKWLoc,
8397                                    TemplateTy TemplateD,
8398                                    SourceLocation TemplateLoc,
8399                                    SourceLocation LAngleLoc,
8400                                    ASTTemplateArgsPtr TemplateArgsIn,
8401                                    SourceLocation RAngleLoc);
8402
8403  DeclResult ActOnVarTemplateSpecialization(
8404      Scope *S, Declarator &D, TypeSourceInfo *DI,
8405      SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
8406      StorageClass SC, bool IsPartialSpecialization);
8407
8408  /// Get the specialization of the given variable template corresponding to
8409  /// the specified argument list, or a null-but-valid result if the arguments
8410  /// are dependent.
8411  DeclResult CheckVarTemplateId(VarTemplateDecl *Template,
8412                                SourceLocation TemplateLoc,
8413                                SourceLocation TemplateNameLoc,
8414                                const TemplateArgumentListInfo &TemplateArgs);
8415
8416  /// Form a reference to the specialization of the given variable template
8417  /// corresponding to the specified argument list, or a null-but-valid result
8418  /// if the arguments are dependent.
8419  ExprResult CheckVarTemplateId(const CXXScopeSpec &SS,
8420                                const DeclarationNameInfo &NameInfo,
8421                                VarTemplateDecl *Template,
8422                                SourceLocation TemplateLoc,
8423                                const TemplateArgumentListInfo *TemplateArgs);
8424
8425  ExprResult
8426  CheckConceptTemplateId(const CXXScopeSpec &SS,
8427                         SourceLocation TemplateKWLoc,
8428                         const DeclarationNameInfo &ConceptNameInfo,
8429                         NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
8430                         const TemplateArgumentListInfo *TemplateArgs);
8431
8432  void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc);
8433
8434  ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS,
8435                                 SourceLocation TemplateKWLoc,
8436                                 LookupResult &R,
8437                                 bool RequiresADL,
8438                               const TemplateArgumentListInfo *TemplateArgs);
8439
8440  ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS,
8441                                          SourceLocation TemplateKWLoc,
8442                               const DeclarationNameInfo &NameInfo,
8443                               const TemplateArgumentListInfo *TemplateArgs);
8444
8445  TemplateNameKind ActOnTemplateName(
8446      Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8447      const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext,
8448      TemplateTy &Template, bool AllowInjectedClassName = false);
8449
8450  DeclResult ActOnClassTemplateSpecialization(
8451      Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
8452      SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
8453      TemplateIdAnnotation &TemplateId, const ParsedAttributesView &Attr,
8454      MultiTemplateParamsArg TemplateParameterLists,
8455      SkipBodyInfo *SkipBody = nullptr);
8456
8457  bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc,
8458                                              TemplateDecl *PrimaryTemplate,
8459                                              unsigned NumExplicitArgs,
8460                                              ArrayRef<TemplateArgument> Args);
8461  void CheckTemplatePartialSpecialization(
8462      ClassTemplatePartialSpecializationDecl *Partial);
8463  void CheckTemplatePartialSpecialization(
8464      VarTemplatePartialSpecializationDecl *Partial);
8465
8466  Decl *ActOnTemplateDeclarator(Scope *S,
8467                                MultiTemplateParamsArg TemplateParameterLists,
8468                                Declarator &D);
8469
8470  bool
8471  CheckSpecializationInstantiationRedecl(SourceLocation NewLoc,
8472                                         TemplateSpecializationKind NewTSK,
8473                                         NamedDecl *PrevDecl,
8474                                         TemplateSpecializationKind PrevTSK,
8475                                         SourceLocation PrevPtOfInstantiation,
8476                                         bool &SuppressNew);
8477
8478  bool CheckDependentFunctionTemplateSpecialization(
8479      FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
8480      LookupResult &Previous);
8481
8482  bool CheckFunctionTemplateSpecialization(
8483      FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
8484      LookupResult &Previous, bool QualifiedFriend = false);
8485  bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous);
8486  void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous);
8487
8488  DeclResult ActOnExplicitInstantiation(
8489      Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
8490      unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
8491      TemplateTy Template, SourceLocation TemplateNameLoc,
8492      SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
8493      SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
8494
8495  DeclResult ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
8496                                        SourceLocation TemplateLoc,
8497                                        unsigned TagSpec, SourceLocation KWLoc,
8498                                        CXXScopeSpec &SS, IdentifierInfo *Name,
8499                                        SourceLocation NameLoc,
8500                                        const ParsedAttributesView &Attr);
8501
8502  DeclResult ActOnExplicitInstantiation(Scope *S,
8503                                        SourceLocation ExternLoc,
8504                                        SourceLocation TemplateLoc,
8505                                        Declarator &D);
8506
8507  TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(
8508      TemplateDecl *Template, SourceLocation TemplateLoc,
8509      SourceLocation RAngleLoc, Decl *Param,
8510      ArrayRef<TemplateArgument> SugaredConverted,
8511      ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
8512
8513  SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const;
8514
8515  /// Specifies the context in which a particular template
8516  /// argument is being checked.
8517  enum CheckTemplateArgumentKind {
8518    /// The template argument was specified in the code or was
8519    /// instantiated with some deduced template arguments.
8520    CTAK_Specified,
8521
8522    /// The template argument was deduced via template argument
8523    /// deduction.
8524    CTAK_Deduced,
8525
8526    /// The template argument was deduced from an array bound
8527    /// via template argument deduction.
8528    CTAK_DeducedFromArrayBound
8529  };
8530
8531  bool
8532  CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg,
8533                        NamedDecl *Template, SourceLocation TemplateLoc,
8534                        SourceLocation RAngleLoc, unsigned ArgumentPackIndex,
8535                        SmallVectorImpl<TemplateArgument> &SugaredConverted,
8536                        SmallVectorImpl<TemplateArgument> &CanonicalConverted,
8537                        CheckTemplateArgumentKind CTAK);
8538
8539  /// Check that the given template arguments can be provided to
8540  /// the given template, converting the arguments along the way.
8541  ///
8542  /// \param Template The template to which the template arguments are being
8543  /// provided.
8544  ///
8545  /// \param TemplateLoc The location of the template name in the source.
8546  ///
8547  /// \param TemplateArgs The list of template arguments. If the template is
8548  /// a template template parameter, this function may extend the set of
8549  /// template arguments to also include substituted, defaulted template
8550  /// arguments.
8551  ///
8552  /// \param PartialTemplateArgs True if the list of template arguments is
8553  /// intentionally partial, e.g., because we're checking just the initial
8554  /// set of template arguments.
8555  ///
8556  /// \param Converted Will receive the converted, canonicalized template
8557  /// arguments.
8558  ///
8559  /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
8560  /// contain the converted forms of the template arguments as written.
8561  /// Otherwise, \p TemplateArgs will not be modified.
8562  ///
8563  /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
8564  /// receive true if the cause for the error is the associated constraints of
8565  /// the template not being satisfied by the template arguments.
8566  ///
8567  /// \returns true if an error occurred, false otherwise.
8568  bool CheckTemplateArgumentList(
8569      TemplateDecl *Template, SourceLocation TemplateLoc,
8570      TemplateArgumentListInfo &TemplateArgs, bool PartialTemplateArgs,
8571      SmallVectorImpl<TemplateArgument> &SugaredConverted,
8572      SmallVectorImpl<TemplateArgument> &CanonicalConverted,
8573      bool UpdateArgsWithConversions = true,
8574      bool *ConstraintsNotSatisfied = nullptr);
8575
8576  bool CheckTemplateTypeArgument(
8577      TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg,
8578      SmallVectorImpl<TemplateArgument> &SugaredConverted,
8579      SmallVectorImpl<TemplateArgument> &CanonicalConverted);
8580
8581  bool CheckTemplateArgument(TypeSourceInfo *Arg);
8582  ExprResult CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
8583                                   QualType InstantiatedParamType, Expr *Arg,
8584                                   TemplateArgument &SugaredConverted,
8585                                   TemplateArgument &CanonicalConverted,
8586                                   CheckTemplateArgumentKind CTAK);
8587  bool CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
8588                                     TemplateParameterList *Params,
8589                                     TemplateArgumentLoc &Arg);
8590
8591  void NoteTemplateLocation(const NamedDecl &Decl,
8592                            std::optional<SourceRange> ParamRange = {});
8593  void NoteTemplateParameterLocation(const NamedDecl &Decl);
8594
8595  ExprResult
8596  BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg,
8597                                          QualType ParamType,
8598                                          SourceLocation Loc);
8599  ExprResult
8600  BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg,
8601                                             SourceLocation Loc);
8602
8603  /// Enumeration describing how template parameter lists are compared
8604  /// for equality.
8605  enum TemplateParameterListEqualKind {
8606    /// We are matching the template parameter lists of two templates
8607    /// that might be redeclarations.
8608    ///
8609    /// \code
8610    /// template<typename T> struct X;
8611    /// template<typename T> struct X;
8612    /// \endcode
8613    TPL_TemplateMatch,
8614
8615    /// We are matching the template parameter lists of two template
8616    /// template parameters as part of matching the template parameter lists
8617    /// of two templates that might be redeclarations.
8618    ///
8619    /// \code
8620    /// template<template<int I> class TT> struct X;
8621    /// template<template<int Value> class Other> struct X;
8622    /// \endcode
8623    TPL_TemplateTemplateParmMatch,
8624
8625    /// We are matching the template parameter lists of a template
8626    /// template argument against the template parameter lists of a template
8627    /// template parameter.
8628    ///
8629    /// \code
8630    /// template<template<int Value> class Metafun> struct X;
8631    /// template<int Value> struct integer_c;
8632    /// X<integer_c> xic;
8633    /// \endcode
8634    TPL_TemplateTemplateArgumentMatch,
8635
8636    /// We are determining whether the template-parameters are equivalent
8637    /// according to C++ [temp.over.link]/6. This comparison does not consider
8638    /// constraints.
8639    ///
8640    /// \code
8641    /// template<C1 T> void f(T);
8642    /// template<C2 T> void f(T);
8643    /// \endcode
8644    TPL_TemplateParamsEquivalent,
8645  };
8646
8647  // A struct to represent the 'new' declaration, which is either itself just
8648  // the named decl, or the important information we need about it in order to
8649  // do constraint comparisons.
8650  class TemplateCompareNewDeclInfo {
8651    const NamedDecl *ND = nullptr;
8652    const DeclContext *DC = nullptr;
8653    const DeclContext *LexicalDC = nullptr;
8654    SourceLocation Loc;
8655
8656  public:
8657    TemplateCompareNewDeclInfo(const NamedDecl *ND) : ND(ND) {}
8658    TemplateCompareNewDeclInfo(const DeclContext *DeclCtx,
8659                               const DeclContext *LexicalDeclCtx,
8660                               SourceLocation Loc)
8661
8662        : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
8663      assert(DC && LexicalDC &&
8664             "Constructor only for cases where we have the information to put "
8665             "in here");
8666    }
8667
8668    // If this was constructed with no information, we cannot do substitution
8669    // for constraint comparison, so make sure we can check that.
8670    bool isInvalid() const { return !ND && !DC; }
8671
8672    const NamedDecl *getDecl() const { return ND; }
8673
8674    bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
8675
8676    const DeclContext *getLexicalDeclContext() const {
8677      return ND ? ND->getLexicalDeclContext() : LexicalDC;
8678    }
8679
8680    const DeclContext *getDeclContext() const {
8681      return ND ? ND->getDeclContext() : DC;
8682    }
8683
8684    SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
8685  };
8686
8687  bool TemplateParameterListsAreEqual(
8688      const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
8689      const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
8690      TemplateParameterListEqualKind Kind,
8691      SourceLocation TemplateArgLoc = SourceLocation());
8692
8693  bool TemplateParameterListsAreEqual(
8694      TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
8695      TemplateParameterListEqualKind Kind,
8696      SourceLocation TemplateArgLoc = SourceLocation()) {
8697    return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
8698                                          Kind, TemplateArgLoc);
8699  }
8700
8701  // Calculates whether two constraint expressions are equal irrespective of a
8702  // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
8703  // 'New', which are the "source" of the constraint, since this is necessary
8704  // for figuring out the relative 'depth' of the constraint. The depth of the
8705  // 'primary template' and the 'instantiated from' templates aren't necessarily
8706  // the same, such as a case when one is a 'friend' defined in a class.
8707  bool AreConstraintExpressionsEqual(const NamedDecl *Old,
8708                                     const Expr *OldConstr,
8709                                     const TemplateCompareNewDeclInfo &New,
8710                                     const Expr *NewConstr);
8711
8712  bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
8713
8714  /// Called when the parser has parsed a C++ typename
8715  /// specifier, e.g., "typename T::type".
8716  ///
8717  /// \param S The scope in which this typename type occurs.
8718  /// \param TypenameLoc the location of the 'typename' keyword
8719  /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
8720  /// \param II the identifier we're retrieving (e.g., 'type' in the example).
8721  /// \param IdLoc the location of the identifier.
8722  /// \param IsImplicitTypename context where T::type refers to a type.
8723  TypeResult ActOnTypenameType(
8724      Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
8725      const IdentifierInfo &II, SourceLocation IdLoc,
8726      ImplicitTypenameContext IsImplicitTypename = ImplicitTypenameContext::No);
8727
8728  /// Called when the parser has parsed a C++ typename
8729  /// specifier that ends in a template-id, e.g.,
8730  /// "typename MetaFun::template apply<T1, T2>".
8731  ///
8732  /// \param S The scope in which this typename type occurs.
8733  /// \param TypenameLoc the location of the 'typename' keyword
8734  /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
8735  /// \param TemplateLoc the location of the 'template' keyword, if any.
8736  /// \param TemplateName The template name.
8737  /// \param TemplateII The identifier used to name the template.
8738  /// \param TemplateIILoc The location of the template name.
8739  /// \param LAngleLoc The location of the opening angle bracket  ('<').
8740  /// \param TemplateArgs The template arguments.
8741  /// \param RAngleLoc The location of the closing angle bracket  ('>').
8742  TypeResult
8743  ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
8744                    const CXXScopeSpec &SS,
8745                    SourceLocation TemplateLoc,
8746                    TemplateTy TemplateName,
8747                    IdentifierInfo *TemplateII,
8748                    SourceLocation TemplateIILoc,
8749                    SourceLocation LAngleLoc,
8750                    ASTTemplateArgsPtr TemplateArgs,
8751                    SourceLocation RAngleLoc);
8752
8753  QualType CheckTypenameType(ElaboratedTypeKeyword Keyword,
8754                             SourceLocation KeywordLoc,
8755                             NestedNameSpecifierLoc QualifierLoc,
8756                             const IdentifierInfo &II,
8757                             SourceLocation IILoc,
8758                             TypeSourceInfo **TSI,
8759                             bool DeducedTSTContext);
8760
8761  QualType CheckTypenameType(ElaboratedTypeKeyword Keyword,
8762                             SourceLocation KeywordLoc,
8763                             NestedNameSpecifierLoc QualifierLoc,
8764                             const IdentifierInfo &II,
8765                             SourceLocation IILoc,
8766                             bool DeducedTSTContext = true);
8767
8768
8769  TypeSourceInfo *RebuildTypeInCurrentInstantiation(TypeSourceInfo *T,
8770                                                    SourceLocation Loc,
8771                                                    DeclarationName Name);
8772  bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS);
8773
8774  ExprResult RebuildExprInCurrentInstantiation(Expr *E);
8775  bool RebuildTemplateParamsInCurrentInstantiation(
8776                                                TemplateParameterList *Params);
8777
8778  std::string
8779  getTemplateArgumentBindingsText(const TemplateParameterList *Params,
8780                                  const TemplateArgumentList &Args);
8781
8782  std::string
8783  getTemplateArgumentBindingsText(const TemplateParameterList *Params,
8784                                  const TemplateArgument *Args,
8785                                  unsigned NumArgs);
8786
8787  //===--------------------------------------------------------------------===//
8788  // C++ Concepts
8789  //===--------------------------------------------------------------------===//
8790  Decl *ActOnConceptDefinition(
8791      Scope *S, MultiTemplateParamsArg TemplateParameterLists,
8792      IdentifierInfo *Name, SourceLocation NameLoc, Expr *ConstraintExpr);
8793
8794  void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous,
8795                                bool &AddToScope);
8796
8797  RequiresExprBodyDecl *
8798  ActOnStartRequiresExpr(SourceLocation RequiresKWLoc,
8799                         ArrayRef<ParmVarDecl *> LocalParameters,
8800                         Scope *BodyScope);
8801  void ActOnFinishRequiresExpr();
8802  concepts::Requirement *ActOnSimpleRequirement(Expr *E);
8803  concepts::Requirement *ActOnTypeRequirement(
8804      SourceLocation TypenameKWLoc, CXXScopeSpec &SS, SourceLocation NameLoc,
8805      IdentifierInfo *TypeName, TemplateIdAnnotation *TemplateId);
8806  concepts::Requirement *ActOnCompoundRequirement(Expr *E,
8807                                                  SourceLocation NoexceptLoc);
8808  concepts::Requirement *
8809  ActOnCompoundRequirement(
8810      Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8811      TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8812  concepts::Requirement *ActOnNestedRequirement(Expr *Constraint);
8813  concepts::ExprRequirement *
8814  BuildExprRequirement(
8815      Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8816      concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement);
8817  concepts::ExprRequirement *
8818  BuildExprRequirement(
8819      concepts::Requirement::SubstitutionDiagnostic *ExprSubstDiag,
8820      bool IsSatisfied, SourceLocation NoexceptLoc,
8821      concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement);
8822  concepts::TypeRequirement *BuildTypeRequirement(TypeSourceInfo *Type);
8823  concepts::TypeRequirement *
8824  BuildTypeRequirement(
8825      concepts::Requirement::SubstitutionDiagnostic *SubstDiag);
8826  concepts::NestedRequirement *BuildNestedRequirement(Expr *E);
8827  concepts::NestedRequirement *
8828  BuildNestedRequirement(StringRef InvalidConstraintEntity,
8829                         const ASTConstraintSatisfaction &Satisfaction);
8830  ExprResult ActOnRequiresExpr(SourceLocation RequiresKWLoc,
8831                               RequiresExprBodyDecl *Body,
8832                               SourceLocation LParenLoc,
8833                               ArrayRef<ParmVarDecl *> LocalParameters,
8834                               SourceLocation RParenLoc,
8835                               ArrayRef<concepts::Requirement *> Requirements,
8836                               SourceLocation ClosingBraceLoc);
8837
8838  //===--------------------------------------------------------------------===//
8839  // C++ Variadic Templates (C++0x [temp.variadic])
8840  //===--------------------------------------------------------------------===//
8841
8842  /// Determine whether an unexpanded parameter pack might be permitted in this
8843  /// location. Useful for error recovery.
8844  bool isUnexpandedParameterPackPermitted();
8845
8846  /// The context in which an unexpanded parameter pack is
8847  /// being diagnosed.
8848  ///
8849  /// Note that the values of this enumeration line up with the first
8850  /// argument to the \c err_unexpanded_parameter_pack diagnostic.
8851  enum UnexpandedParameterPackContext {
8852    /// An arbitrary expression.
8853    UPPC_Expression = 0,
8854
8855    /// The base type of a class type.
8856    UPPC_BaseType,
8857
8858    /// The type of an arbitrary declaration.
8859    UPPC_DeclarationType,
8860
8861    /// The type of a data member.
8862    UPPC_DataMemberType,
8863
8864    /// The size of a bit-field.
8865    UPPC_BitFieldWidth,
8866
8867    /// The expression in a static assertion.
8868    UPPC_StaticAssertExpression,
8869
8870    /// The fixed underlying type of an enumeration.
8871    UPPC_FixedUnderlyingType,
8872
8873    /// The enumerator value.
8874    UPPC_EnumeratorValue,
8875
8876    /// A using declaration.
8877    UPPC_UsingDeclaration,
8878
8879    /// A friend declaration.
8880    UPPC_FriendDeclaration,
8881
8882    /// A declaration qualifier.
8883    UPPC_DeclarationQualifier,
8884
8885    /// An initializer.
8886    UPPC_Initializer,
8887
8888    /// A default argument.
8889    UPPC_DefaultArgument,
8890
8891    /// The type of a non-type template parameter.
8892    UPPC_NonTypeTemplateParameterType,
8893
8894    /// The type of an exception.
8895    UPPC_ExceptionType,
8896
8897    /// Explicit specialization.
8898    UPPC_ExplicitSpecialization,
8899
8900    /// Partial specialization.
8901    UPPC_PartialSpecialization,
8902
8903    /// Microsoft __if_exists.
8904    UPPC_IfExists,
8905
8906    /// Microsoft __if_not_exists.
8907    UPPC_IfNotExists,
8908
8909    /// Lambda expression.
8910    UPPC_Lambda,
8911
8912    /// Block expression.
8913    UPPC_Block,
8914
8915    /// A type constraint.
8916    UPPC_TypeConstraint,
8917
8918    // A requirement in a requires-expression.
8919    UPPC_Requirement,
8920
8921    // A requires-clause.
8922    UPPC_RequiresClause,
8923  };
8924
8925  /// Diagnose unexpanded parameter packs.
8926  ///
8927  /// \param Loc The location at which we should emit the diagnostic.
8928  ///
8929  /// \param UPPC The context in which we are diagnosing unexpanded
8930  /// parameter packs.
8931  ///
8932  /// \param Unexpanded the set of unexpanded parameter packs.
8933  ///
8934  /// \returns true if an error occurred, false otherwise.
8935  bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc,
8936                                        UnexpandedParameterPackContext UPPC,
8937                                  ArrayRef<UnexpandedParameterPack> Unexpanded);
8938
8939  /// If the given type contains an unexpanded parameter pack,
8940  /// diagnose the error.
8941  ///
8942  /// \param Loc The source location where a diagnostc should be emitted.
8943  ///
8944  /// \param T The type that is being checked for unexpanded parameter
8945  /// packs.
8946  ///
8947  /// \returns true if an error occurred, false otherwise.
8948  bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T,
8949                                       UnexpandedParameterPackContext UPPC);
8950
8951  /// If the given expression contains an unexpanded parameter
8952  /// pack, diagnose the error.
8953  ///
8954  /// \param E The expression that is being checked for unexpanded
8955  /// parameter packs.
8956  ///
8957  /// \returns true if an error occurred, false otherwise.
8958  bool DiagnoseUnexpandedParameterPack(Expr *E,
8959                       UnexpandedParameterPackContext UPPC = UPPC_Expression);
8960
8961  /// If the given requirees-expression contains an unexpanded reference to one
8962  /// of its own parameter packs, diagnose the error.
8963  ///
8964  /// \param RE The requiress-expression that is being checked for unexpanded
8965  /// parameter packs.
8966  ///
8967  /// \returns true if an error occurred, false otherwise.
8968  bool DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr *RE);
8969
8970  /// If the given nested-name-specifier contains an unexpanded
8971  /// parameter pack, diagnose the error.
8972  ///
8973  /// \param SS The nested-name-specifier that is being checked for
8974  /// unexpanded parameter packs.
8975  ///
8976  /// \returns true if an error occurred, false otherwise.
8977  bool DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS,
8978                                       UnexpandedParameterPackContext UPPC);
8979
8980  /// If the given name contains an unexpanded parameter pack,
8981  /// diagnose the error.
8982  ///
8983  /// \param NameInfo The name (with source location information) that
8984  /// is being checked for unexpanded parameter packs.
8985  ///
8986  /// \returns true if an error occurred, false otherwise.
8987  bool DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo,
8988                                       UnexpandedParameterPackContext UPPC);
8989
8990  /// If the given template name contains an unexpanded parameter pack,
8991  /// diagnose the error.
8992  ///
8993  /// \param Loc The location of the template name.
8994  ///
8995  /// \param Template The template name that is being checked for unexpanded
8996  /// parameter packs.
8997  ///
8998  /// \returns true if an error occurred, false otherwise.
8999  bool DiagnoseUnexpandedParameterPack(SourceLocation Loc,
9000                                       TemplateName Template,
9001                                       UnexpandedParameterPackContext UPPC);
9002
9003  /// If the given template argument contains an unexpanded parameter
9004  /// pack, diagnose the error.
9005  ///
9006  /// \param Arg The template argument that is being checked for unexpanded
9007  /// parameter packs.
9008  ///
9009  /// \returns true if an error occurred, false otherwise.
9010  bool DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg,
9011                                       UnexpandedParameterPackContext UPPC);
9012
9013  /// Collect the set of unexpanded parameter packs within the given
9014  /// template argument.
9015  ///
9016  /// \param Arg The template argument that will be traversed to find
9017  /// unexpanded parameter packs.
9018  void collectUnexpandedParameterPacks(TemplateArgument Arg,
9019                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9020
9021  /// Collect the set of unexpanded parameter packs within the given
9022  /// template argument.
9023  ///
9024  /// \param Arg The template argument that will be traversed to find
9025  /// unexpanded parameter packs.
9026  void collectUnexpandedParameterPacks(TemplateArgumentLoc Arg,
9027                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9028
9029  /// Collect the set of unexpanded parameter packs within the given
9030  /// type.
9031  ///
9032  /// \param T The type that will be traversed to find
9033  /// unexpanded parameter packs.
9034  void collectUnexpandedParameterPacks(QualType T,
9035                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9036
9037  /// Collect the set of unexpanded parameter packs within the given
9038  /// type.
9039  ///
9040  /// \param TL The type that will be traversed to find
9041  /// unexpanded parameter packs.
9042  void collectUnexpandedParameterPacks(TypeLoc TL,
9043                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9044
9045  /// Collect the set of unexpanded parameter packs within the given
9046  /// nested-name-specifier.
9047  ///
9048  /// \param NNS The nested-name-specifier that will be traversed to find
9049  /// unexpanded parameter packs.
9050  void collectUnexpandedParameterPacks(NestedNameSpecifierLoc NNS,
9051                         SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9052
9053  /// Collect the set of unexpanded parameter packs within the given
9054  /// name.
9055  ///
9056  /// \param NameInfo The name that will be traversed to find
9057  /// unexpanded parameter packs.
9058  void collectUnexpandedParameterPacks(const DeclarationNameInfo &NameInfo,
9059                         SmallVectorImpl<UnexpandedParameterPack> &Unexpanded);
9060
9061  /// Invoked when parsing a template argument followed by an
9062  /// ellipsis, which creates a pack expansion.
9063  ///
9064  /// \param Arg The template argument preceding the ellipsis, which
9065  /// may already be invalid.
9066  ///
9067  /// \param EllipsisLoc The location of the ellipsis.
9068  ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg,
9069                                            SourceLocation EllipsisLoc);
9070
9071  /// Invoked when parsing a type followed by an ellipsis, which
9072  /// creates a pack expansion.
9073  ///
9074  /// \param Type The type preceding the ellipsis, which will become
9075  /// the pattern of the pack expansion.
9076  ///
9077  /// \param EllipsisLoc The location of the ellipsis.
9078  TypeResult ActOnPackExpansion(ParsedType Type, SourceLocation EllipsisLoc);
9079
9080  /// Construct a pack expansion type from the pattern of the pack
9081  /// expansion.
9082  TypeSourceInfo *CheckPackExpansion(TypeSourceInfo *Pattern,
9083                                     SourceLocation EllipsisLoc,
9084                                     std::optional<unsigned> NumExpansions);
9085
9086  /// Construct a pack expansion type from the pattern of the pack
9087  /// expansion.
9088  QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
9089                              SourceLocation EllipsisLoc,
9090                              std::optional<unsigned> NumExpansions);
9091
9092  /// Invoked when parsing an expression followed by an ellipsis, which
9093  /// creates a pack expansion.
9094  ///
9095  /// \param Pattern The expression preceding the ellipsis, which will become
9096  /// the pattern of the pack expansion.
9097  ///
9098  /// \param EllipsisLoc The location of the ellipsis.
9099  ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
9100
9101  /// Invoked when parsing an expression followed by an ellipsis, which
9102  /// creates a pack expansion.
9103  ///
9104  /// \param Pattern The expression preceding the ellipsis, which will become
9105  /// the pattern of the pack expansion.
9106  ///
9107  /// \param EllipsisLoc The location of the ellipsis.
9108  ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
9109                                std::optional<unsigned> NumExpansions);
9110
9111  /// Determine whether we could expand a pack expansion with the
9112  /// given set of parameter packs into separate arguments by repeatedly
9113  /// transforming the pattern.
9114  ///
9115  /// \param EllipsisLoc The location of the ellipsis that identifies the
9116  /// pack expansion.
9117  ///
9118  /// \param PatternRange The source range that covers the entire pattern of
9119  /// the pack expansion.
9120  ///
9121  /// \param Unexpanded The set of unexpanded parameter packs within the
9122  /// pattern.
9123  ///
9124  /// \param ShouldExpand Will be set to \c true if the transformer should
9125  /// expand the corresponding pack expansions into separate arguments. When
9126  /// set, \c NumExpansions must also be set.
9127  ///
9128  /// \param RetainExpansion Whether the caller should add an unexpanded
9129  /// pack expansion after all of the expanded arguments. This is used
9130  /// when extending explicitly-specified template argument packs per
9131  /// C++0x [temp.arg.explicit]p9.
9132  ///
9133  /// \param NumExpansions The number of separate arguments that will be in
9134  /// the expanded form of the corresponding pack expansion. This is both an
9135  /// input and an output parameter, which can be set by the caller if the
9136  /// number of expansions is known a priori (e.g., due to a prior substitution)
9137  /// and will be set by the callee when the number of expansions is known.
9138  /// The callee must set this value when \c ShouldExpand is \c true; it may
9139  /// set this value in other cases.
9140  ///
9141  /// \returns true if an error occurred (e.g., because the parameter packs
9142  /// are to be instantiated with arguments of different lengths), false
9143  /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
9144  /// must be set.
9145  bool CheckParameterPacksForExpansion(
9146      SourceLocation EllipsisLoc, SourceRange PatternRange,
9147      ArrayRef<UnexpandedParameterPack> Unexpanded,
9148      const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
9149      bool &RetainExpansion, std::optional<unsigned> &NumExpansions);
9150
9151  /// Determine the number of arguments in the given pack expansion
9152  /// type.
9153  ///
9154  /// This routine assumes that the number of arguments in the expansion is
9155  /// consistent across all of the unexpanded parameter packs in its pattern.
9156  ///
9157  /// Returns an empty Optional if the type can't be expanded.
9158  std::optional<unsigned> getNumArgumentsInExpansion(
9159      QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
9160
9161  /// Determine whether the given declarator contains any unexpanded
9162  /// parameter packs.
9163  ///
9164  /// This routine is used by the parser to disambiguate function declarators
9165  /// with an ellipsis prior to the ')', e.g.,
9166  ///
9167  /// \code
9168  ///   void f(T...);
9169  /// \endcode
9170  ///
9171  /// To determine whether we have an (unnamed) function parameter pack or
9172  /// a variadic function.
9173  ///
9174  /// \returns true if the declarator contains any unexpanded parameter packs,
9175  /// false otherwise.
9176  bool containsUnexpandedParameterPacks(Declarator &D);
9177
9178  /// Returns the pattern of the pack expansion for a template argument.
9179  ///
9180  /// \param OrigLoc The template argument to expand.
9181  ///
9182  /// \param Ellipsis Will be set to the location of the ellipsis.
9183  ///
9184  /// \param NumExpansions Will be set to the number of expansions that will
9185  /// be generated from this pack expansion, if known a priori.
9186  TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(
9187      TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis,
9188      std::optional<unsigned> &NumExpansions) const;
9189
9190  /// Given a template argument that contains an unexpanded parameter pack, but
9191  /// which has already been substituted, attempt to determine the number of
9192  /// elements that will be produced once this argument is fully-expanded.
9193  ///
9194  /// This is intended for use when transforming 'sizeof...(Arg)' in order to
9195  /// avoid actually expanding the pack where possible.
9196  std::optional<unsigned> getFullyPackExpandedSize(TemplateArgument Arg);
9197
9198  //===--------------------------------------------------------------------===//
9199  // C++ Template Argument Deduction (C++ [temp.deduct])
9200  //===--------------------------------------------------------------------===//
9201
9202  /// Adjust the type \p ArgFunctionType to match the calling convention,
9203  /// noreturn, and optionally the exception specification of \p FunctionType.
9204  /// Deduction often wants to ignore these properties when matching function
9205  /// types.
9206  QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType,
9207                               bool AdjustExceptionSpec = false);
9208
9209  /// Describes the result of template argument deduction.
9210  ///
9211  /// The TemplateDeductionResult enumeration describes the result of
9212  /// template argument deduction, as returned from
9213  /// DeduceTemplateArguments(). The separate TemplateDeductionInfo
9214  /// structure provides additional information about the results of
9215  /// template argument deduction, e.g., the deduced template argument
9216  /// list (if successful) or the specific template parameters or
9217  /// deduced arguments that were involved in the failure.
9218  enum TemplateDeductionResult {
9219    /// Template argument deduction was successful.
9220    TDK_Success = 0,
9221    /// The declaration was invalid; do nothing.
9222    TDK_Invalid,
9223    /// Template argument deduction exceeded the maximum template
9224    /// instantiation depth (which has already been diagnosed).
9225    TDK_InstantiationDepth,
9226    /// Template argument deduction did not deduce a value
9227    /// for every template parameter.
9228    TDK_Incomplete,
9229    /// Template argument deduction did not deduce a value for every
9230    /// expansion of an expanded template parameter pack.
9231    TDK_IncompletePack,
9232    /// Template argument deduction produced inconsistent
9233    /// deduced values for the given template parameter.
9234    TDK_Inconsistent,
9235    /// Template argument deduction failed due to inconsistent
9236    /// cv-qualifiers on a template parameter type that would
9237    /// otherwise be deduced, e.g., we tried to deduce T in "const T"
9238    /// but were given a non-const "X".
9239    TDK_Underqualified,
9240    /// Substitution of the deduced template argument values
9241    /// resulted in an error.
9242    TDK_SubstitutionFailure,
9243    /// After substituting deduced template arguments, a dependent
9244    /// parameter type did not match the corresponding argument.
9245    TDK_DeducedMismatch,
9246    /// After substituting deduced template arguments, an element of
9247    /// a dependent parameter type did not match the corresponding element
9248    /// of the corresponding argument (when deducing from an initializer list).
9249    TDK_DeducedMismatchNested,
9250    /// A non-depnedent component of the parameter did not match the
9251    /// corresponding component of the argument.
9252    TDK_NonDeducedMismatch,
9253    /// When performing template argument deduction for a function
9254    /// template, there were too many call arguments.
9255    TDK_TooManyArguments,
9256    /// When performing template argument deduction for a function
9257    /// template, there were too few call arguments.
9258    TDK_TooFewArguments,
9259    /// The explicitly-specified template arguments were not valid
9260    /// template arguments for the given template.
9261    TDK_InvalidExplicitArguments,
9262    /// Checking non-dependent argument conversions failed.
9263    TDK_NonDependentConversionFailure,
9264    /// The deduced arguments did not satisfy the constraints associated
9265    /// with the template.
9266    TDK_ConstraintsNotSatisfied,
9267    /// Deduction failed; that's all we know.
9268    TDK_MiscellaneousDeductionFailure,
9269    /// CUDA Target attributes do not match.
9270    TDK_CUDATargetMismatch,
9271    /// Some error which was already diagnosed.
9272    TDK_AlreadyDiagnosed
9273  };
9274
9275  TemplateDeductionResult
9276  DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
9277                          const TemplateArgumentList &TemplateArgs,
9278                          sema::TemplateDeductionInfo &Info);
9279
9280  TemplateDeductionResult
9281  DeduceTemplateArguments(VarTemplatePartialSpecializationDecl *Partial,
9282                          const TemplateArgumentList &TemplateArgs,
9283                          sema::TemplateDeductionInfo &Info);
9284
9285  TemplateDeductionResult SubstituteExplicitTemplateArguments(
9286      FunctionTemplateDecl *FunctionTemplate,
9287      TemplateArgumentListInfo &ExplicitTemplateArgs,
9288      SmallVectorImpl<DeducedTemplateArgument> &Deduced,
9289      SmallVectorImpl<QualType> &ParamTypes, QualType *FunctionType,
9290      sema::TemplateDeductionInfo &Info);
9291
9292  /// brief A function argument from which we performed template argument
9293  // deduction for a call.
9294  struct OriginalCallArg {
9295    OriginalCallArg(QualType OriginalParamType, bool DecomposedParam,
9296                    unsigned ArgIdx, QualType OriginalArgType)
9297        : OriginalParamType(OriginalParamType),
9298          DecomposedParam(DecomposedParam), ArgIdx(ArgIdx),
9299          OriginalArgType(OriginalArgType) {}
9300
9301    QualType OriginalParamType;
9302    bool DecomposedParam;
9303    unsigned ArgIdx;
9304    QualType OriginalArgType;
9305  };
9306
9307  TemplateDeductionResult FinishTemplateArgumentDeduction(
9308      FunctionTemplateDecl *FunctionTemplate,
9309      SmallVectorImpl<DeducedTemplateArgument> &Deduced,
9310      unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
9311      sema::TemplateDeductionInfo &Info,
9312      SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs = nullptr,
9313      bool PartialOverloading = false,
9314      llvm::function_ref<bool()> CheckNonDependent = []{ return false; });
9315
9316  TemplateDeductionResult DeduceTemplateArguments(
9317      FunctionTemplateDecl *FunctionTemplate,
9318      TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
9319      FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info,
9320      bool PartialOverloading, bool AggregateDeductionCandidate,
9321      QualType ObjectType, Expr::Classification ObjectClassification,
9322      llvm::function_ref<bool(ArrayRef<QualType>)> CheckNonDependent);
9323
9324  TemplateDeductionResult
9325  DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
9326                          TemplateArgumentListInfo *ExplicitTemplateArgs,
9327                          QualType ArgFunctionType,
9328                          FunctionDecl *&Specialization,
9329                          sema::TemplateDeductionInfo &Info,
9330                          bool IsAddressOfFunction = false);
9331
9332  TemplateDeductionResult DeduceTemplateArguments(
9333      FunctionTemplateDecl *FunctionTemplate, QualType ObjectType,
9334      Expr::Classification ObjectClassification, QualType ToType,
9335      CXXConversionDecl *&Specialization, sema::TemplateDeductionInfo &Info);
9336
9337  TemplateDeductionResult
9338  DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
9339                          TemplateArgumentListInfo *ExplicitTemplateArgs,
9340                          FunctionDecl *&Specialization,
9341                          sema::TemplateDeductionInfo &Info,
9342                          bool IsAddressOfFunction = false);
9343
9344  /// Substitute Replacement for \p auto in \p TypeWithAuto
9345  QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
9346  /// Substitute Replacement for auto in TypeWithAuto
9347  TypeSourceInfo* SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto,
9348                                          QualType Replacement);
9349
9350  // Substitute auto in TypeWithAuto for a Dependent auto type
9351  QualType SubstAutoTypeDependent(QualType TypeWithAuto);
9352
9353  // Substitute auto in TypeWithAuto for a Dependent auto type
9354  TypeSourceInfo *
9355  SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto);
9356
9357  /// Completely replace the \c auto in \p TypeWithAuto by
9358  /// \p Replacement. This does not retain any \c auto type sugar.
9359  QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
9360  TypeSourceInfo *ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto,
9361                                            QualType Replacement);
9362
9363  TemplateDeductionResult
9364  DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result,
9365                 sema::TemplateDeductionInfo &Info,
9366                 bool DependentDeduction = false,
9367                 bool IgnoreConstraints = false,
9368                 TemplateSpecCandidateSet *FailedTSC = nullptr);
9369  void DiagnoseAutoDeductionFailure(VarDecl *VDecl, Expr *Init);
9370  bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc,
9371                        bool Diagnose = true);
9372
9373  bool CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD,
9374                                                SourceLocation Loc);
9375
9376  /// Declare implicit deduction guides for a class template if we've
9377  /// not already done so.
9378  void DeclareImplicitDeductionGuides(TemplateDecl *Template,
9379                                      SourceLocation Loc);
9380  FunctionTemplateDecl *DeclareImplicitDeductionGuideFromInitList(
9381      TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
9382      SourceLocation Loc);
9383  llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9384      AggregateDeductionCandidates;
9385
9386  QualType DeduceTemplateSpecializationFromInitializer(
9387      TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9388      const InitializationKind &Kind, MultiExprArg Init);
9389
9390  QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name,
9391                                        QualType Type, TypeSourceInfo *TSI,
9392                                        SourceRange Range, bool DirectInit,
9393                                        Expr *Init);
9394
9395  TypeLoc getReturnTypeLoc(FunctionDecl *FD) const;
9396
9397  bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD,
9398                                        SourceLocation ReturnLoc, Expr *RetExpr,
9399                                        const AutoType *AT);
9400
9401  FunctionTemplateDecl *getMoreSpecializedTemplate(
9402      FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc,
9403      TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
9404      unsigned NumCallArguments2, bool Reversed = false);
9405  UnresolvedSetIterator
9406  getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
9407                     TemplateSpecCandidateSet &FailedCandidates,
9408                     SourceLocation Loc,
9409                     const PartialDiagnostic &NoneDiag,
9410                     const PartialDiagnostic &AmbigDiag,
9411                     const PartialDiagnostic &CandidateDiag,
9412                     bool Complain = true, QualType TargetType = QualType());
9413
9414  ClassTemplatePartialSpecializationDecl *
9415  getMoreSpecializedPartialSpecialization(
9416                                  ClassTemplatePartialSpecializationDecl *PS1,
9417                                  ClassTemplatePartialSpecializationDecl *PS2,
9418                                  SourceLocation Loc);
9419
9420  bool isMoreSpecializedThanPrimary(ClassTemplatePartialSpecializationDecl *T,
9421                                    sema::TemplateDeductionInfo &Info);
9422
9423  VarTemplatePartialSpecializationDecl *getMoreSpecializedPartialSpecialization(
9424      VarTemplatePartialSpecializationDecl *PS1,
9425      VarTemplatePartialSpecializationDecl *PS2, SourceLocation Loc);
9426
9427  bool isMoreSpecializedThanPrimary(VarTemplatePartialSpecializationDecl *T,
9428                                    sema::TemplateDeductionInfo &Info);
9429
9430  bool isTemplateTemplateParameterAtLeastAsSpecializedAs(
9431      TemplateParameterList *PParam, TemplateDecl *AArg, SourceLocation Loc);
9432
9433  void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
9434                                  unsigned Depth, llvm::SmallBitVector &Used);
9435
9436  void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
9437                                  bool OnlyDeduced,
9438                                  unsigned Depth,
9439                                  llvm::SmallBitVector &Used);
9440  void MarkDeducedTemplateParameters(
9441                                  const FunctionTemplateDecl *FunctionTemplate,
9442                                  llvm::SmallBitVector &Deduced) {
9443    return MarkDeducedTemplateParameters(Context, FunctionTemplate, Deduced);
9444  }
9445  static void MarkDeducedTemplateParameters(ASTContext &Ctx,
9446                                  const FunctionTemplateDecl *FunctionTemplate,
9447                                  llvm::SmallBitVector &Deduced);
9448
9449  //===--------------------------------------------------------------------===//
9450  // C++ Template Instantiation
9451  //
9452
9453  MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
9454      const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
9455      const TemplateArgumentList *Innermost = nullptr,
9456      bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
9457      bool ForConstraintInstantiation = false,
9458      bool SkipForSpecialization = false);
9459
9460  /// A context in which code is being synthesized (where a source location
9461  /// alone is not sufficient to identify the context). This covers template
9462  /// instantiation and various forms of implicitly-generated functions.
9463  struct CodeSynthesisContext {
9464    /// The kind of template instantiation we are performing
9465    enum SynthesisKind {
9466      /// We are instantiating a template declaration. The entity is
9467      /// the declaration we're instantiating (e.g., a CXXRecordDecl).
9468      TemplateInstantiation,
9469
9470      /// We are instantiating a default argument for a template
9471      /// parameter. The Entity is the template parameter whose argument is
9472      /// being instantiated, the Template is the template, and the
9473      /// TemplateArgs/NumTemplateArguments provide the template arguments as
9474      /// specified.
9475      DefaultTemplateArgumentInstantiation,
9476
9477      /// We are instantiating a default argument for a function.
9478      /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
9479      /// provides the template arguments as specified.
9480      DefaultFunctionArgumentInstantiation,
9481
9482      /// We are substituting explicit template arguments provided for
9483      /// a function template. The entity is a FunctionTemplateDecl.
9484      ExplicitTemplateArgumentSubstitution,
9485
9486      /// We are substituting template argument determined as part of
9487      /// template argument deduction for either a class template
9488      /// partial specialization or a function template. The
9489      /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
9490      /// a TemplateDecl.
9491      DeducedTemplateArgumentSubstitution,
9492
9493      /// We are substituting into a lambda expression.
9494      LambdaExpressionSubstitution,
9495
9496      /// We are substituting prior template arguments into a new
9497      /// template parameter. The template parameter itself is either a
9498      /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
9499      PriorTemplateArgumentSubstitution,
9500
9501      /// We are checking the validity of a default template argument that
9502      /// has been used when naming a template-id.
9503      DefaultTemplateArgumentChecking,
9504
9505      /// We are computing the exception specification for a defaulted special
9506      /// member function.
9507      ExceptionSpecEvaluation,
9508
9509      /// We are instantiating the exception specification for a function
9510      /// template which was deferred until it was needed.
9511      ExceptionSpecInstantiation,
9512
9513      /// We are instantiating a requirement of a requires expression.
9514      RequirementInstantiation,
9515
9516      /// We are checking the satisfaction of a nested requirement of a requires
9517      /// expression.
9518      NestedRequirementConstraintsCheck,
9519
9520      /// We are declaring an implicit special member function.
9521      DeclaringSpecialMember,
9522
9523      /// We are declaring an implicit 'operator==' for a defaulted
9524      /// 'operator<=>'.
9525      DeclaringImplicitEqualityComparison,
9526
9527      /// We are defining a synthesized function (such as a defaulted special
9528      /// member).
9529      DefiningSynthesizedFunction,
9530
9531      // We are checking the constraints associated with a constrained entity or
9532      // the constraint expression of a concept. This includes the checks that
9533      // atomic constraints have the type 'bool' and that they can be constant
9534      // evaluated.
9535      ConstraintsCheck,
9536
9537      // We are substituting template arguments into a constraint expression.
9538      ConstraintSubstitution,
9539
9540      // We are normalizing a constraint expression.
9541      ConstraintNormalization,
9542
9543      // Instantiating a Requires Expression parameter clause.
9544      RequirementParameterInstantiation,
9545
9546      // We are substituting into the parameter mapping of an atomic constraint
9547      // during normalization.
9548      ParameterMappingSubstitution,
9549
9550      /// We are rewriting a comparison operator in terms of an operator<=>.
9551      RewritingOperatorAsSpaceship,
9552
9553      /// We are initializing a structured binding.
9554      InitializingStructuredBinding,
9555
9556      /// We are marking a class as __dllexport.
9557      MarkingClassDllexported,
9558
9559      /// We are building an implied call from __builtin_dump_struct. The
9560      /// arguments are in CallArgs.
9561      BuildingBuiltinDumpStructCall,
9562
9563      /// Added for Template instantiation observation.
9564      /// Memoization means we are _not_ instantiating a template because
9565      /// it is already instantiated (but we entered a context where we
9566      /// would have had to if it was not already instantiated).
9567      Memoization,
9568
9569      /// We are building deduction guides for a class.
9570      BuildingDeductionGuides,
9571    } Kind;
9572
9573    /// Was the enclosing context a non-instantiation SFINAE context?
9574    bool SavedInNonInstantiationSFINAEContext;
9575
9576    /// The point of instantiation or synthesis within the source code.
9577    SourceLocation PointOfInstantiation;
9578
9579    /// The entity that is being synthesized.
9580    Decl *Entity;
9581
9582    /// The template (or partial specialization) in which we are
9583    /// performing the instantiation, for substitutions of prior template
9584    /// arguments.
9585    NamedDecl *Template;
9586
9587    union {
9588      /// The list of template arguments we are substituting, if they
9589      /// are not part of the entity.
9590      const TemplateArgument *TemplateArgs;
9591
9592      /// The list of argument expressions in a synthesized call.
9593      const Expr *const *CallArgs;
9594    };
9595
9596    // FIXME: Wrap this union around more members, or perhaps store the
9597    // kind-specific members in the RAII object owning the context.
9598    union {
9599      /// The number of template arguments in TemplateArgs.
9600      unsigned NumTemplateArgs;
9601
9602      /// The number of expressions in CallArgs.
9603      unsigned NumCallArgs;
9604
9605      /// The special member being declared or defined.
9606      CXXSpecialMember SpecialMember;
9607    };
9608
9609    ArrayRef<TemplateArgument> template_arguments() const {
9610      assert(Kind != DeclaringSpecialMember);
9611      return {TemplateArgs, NumTemplateArgs};
9612    }
9613
9614    /// The template deduction info object associated with the
9615    /// substitution or checking of explicit or deduced template arguments.
9616    sema::TemplateDeductionInfo *DeductionInfo;
9617
9618    /// The source range that covers the construct that cause
9619    /// the instantiation, e.g., the template-id that causes a class
9620    /// template instantiation.
9621    SourceRange InstantiationRange;
9622
9623    CodeSynthesisContext()
9624        : Kind(TemplateInstantiation),
9625          SavedInNonInstantiationSFINAEContext(false), Entity(nullptr),
9626          Template(nullptr), TemplateArgs(nullptr), NumTemplateArgs(0),
9627          DeductionInfo(nullptr) {}
9628
9629    /// Determines whether this template is an actual instantiation
9630    /// that should be counted toward the maximum instantiation depth.
9631    bool isInstantiationRecord() const;
9632  };
9633
9634  /// List of active code synthesis contexts.
9635  ///
9636  /// This vector is treated as a stack. As synthesis of one entity requires
9637  /// synthesis of another, additional contexts are pushed onto the stack.
9638  SmallVector<CodeSynthesisContext, 16> CodeSynthesisContexts;
9639
9640  /// Specializations whose definitions are currently being instantiated.
9641  llvm::DenseSet<std::pair<Decl *, unsigned>> InstantiatingSpecializations;
9642
9643  /// Non-dependent types used in templates that have already been instantiated
9644  /// by some template instantiation.
9645  llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
9646
9647  /// Extra modules inspected when performing a lookup during a template
9648  /// instantiation. Computed lazily.
9649  SmallVector<Module*, 16> CodeSynthesisContextLookupModules;
9650
9651  /// Cache of additional modules that should be used for name lookup
9652  /// within the current template instantiation. Computed lazily; use
9653  /// getLookupModules() to get a complete set.
9654  llvm::DenseSet<Module*> LookupModulesCache;
9655
9656  /// Get the set of additional modules that should be checked during
9657  /// name lookup. A module and its imports become visible when instanting a
9658  /// template defined within it.
9659  llvm::DenseSet<Module*> &getLookupModules();
9660
9661  /// Map from the most recent declaration of a namespace to the most
9662  /// recent visible declaration of that namespace.
9663  llvm::DenseMap<NamedDecl*, NamedDecl*> VisibleNamespaceCache;
9664
9665  /// Whether we are in a SFINAE context that is not associated with
9666  /// template instantiation.
9667  ///
9668  /// This is used when setting up a SFINAE trap (\c see SFINAETrap) outside
9669  /// of a template instantiation or template argument deduction.
9670  bool InNonInstantiationSFINAEContext;
9671
9672  /// The number of \p CodeSynthesisContexts that are not template
9673  /// instantiations and, therefore, should not be counted as part of the
9674  /// instantiation depth.
9675  ///
9676  /// When the instantiation depth reaches the user-configurable limit
9677  /// \p LangOptions::InstantiationDepth we will abort instantiation.
9678  // FIXME: Should we have a similar limit for other forms of synthesis?
9679  unsigned NonInstantiationEntries;
9680
9681  /// The depth of the context stack at the point when the most recent
9682  /// error or warning was produced.
9683  ///
9684  /// This value is used to suppress printing of redundant context stacks
9685  /// when there are multiple errors or warnings in the same instantiation.
9686  // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
9687  unsigned LastEmittedCodeSynthesisContextDepth = 0;
9688
9689  /// The template instantiation callbacks to trace or track
9690  /// instantiations (objects can be chained).
9691  ///
9692  /// This callbacks is used to print, trace or track template
9693  /// instantiations as they are being constructed.
9694  std::vector<std::unique_ptr<TemplateInstantiationCallback>>
9695      TemplateInstCallbacks;
9696
9697  /// The current index into pack expansion arguments that will be
9698  /// used for substitution of parameter packs.
9699  ///
9700  /// The pack expansion index will be -1 to indicate that parameter packs
9701  /// should be instantiated as themselves. Otherwise, the index specifies
9702  /// which argument within the parameter pack will be used for substitution.
9703  int ArgumentPackSubstitutionIndex;
9704
9705  /// RAII object used to change the argument pack substitution index
9706  /// within a \c Sema object.
9707  ///
9708  /// See \c ArgumentPackSubstitutionIndex for more information.
9709  class ArgumentPackSubstitutionIndexRAII {
9710    Sema &Self;
9711    int OldSubstitutionIndex;
9712
9713  public:
9714    ArgumentPackSubstitutionIndexRAII(Sema &Self, int NewSubstitutionIndex)
9715      : Self(Self), OldSubstitutionIndex(Self.ArgumentPackSubstitutionIndex) {
9716      Self.ArgumentPackSubstitutionIndex = NewSubstitutionIndex;
9717    }
9718
9719    ~ArgumentPackSubstitutionIndexRAII() {
9720      Self.ArgumentPackSubstitutionIndex = OldSubstitutionIndex;
9721    }
9722  };
9723
9724  friend class ArgumentPackSubstitutionRAII;
9725
9726  /// For each declaration that involved template argument deduction, the
9727  /// set of diagnostics that were suppressed during that template argument
9728  /// deduction.
9729  ///
9730  /// FIXME: Serialize this structure to the AST file.
9731  typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1> >
9732    SuppressedDiagnosticsMap;
9733  SuppressedDiagnosticsMap SuppressedDiagnostics;
9734
9735  /// A stack object to be created when performing template
9736  /// instantiation.
9737  ///
9738  /// Construction of an object of type \c InstantiatingTemplate
9739  /// pushes the current instantiation onto the stack of active
9740  /// instantiations. If the size of this stack exceeds the maximum
9741  /// number of recursive template instantiations, construction
9742  /// produces an error and evaluates true.
9743  ///
9744  /// Destruction of this object will pop the named instantiation off
9745  /// the stack.
9746  struct InstantiatingTemplate {
9747    /// Note that we are instantiating a class template,
9748    /// function template, variable template, alias template,
9749    /// or a member thereof.
9750    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9751                          Decl *Entity,
9752                          SourceRange InstantiationRange = SourceRange());
9753
9754    struct ExceptionSpecification {};
9755    /// Note that we are instantiating an exception specification
9756    /// of a function template.
9757    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9758                          FunctionDecl *Entity, ExceptionSpecification,
9759                          SourceRange InstantiationRange = SourceRange());
9760
9761    /// Note that we are instantiating a default argument in a
9762    /// template-id.
9763    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9764                          TemplateParameter Param, TemplateDecl *Template,
9765                          ArrayRef<TemplateArgument> TemplateArgs,
9766                          SourceRange InstantiationRange = SourceRange());
9767
9768    /// Note that we are substituting either explicitly-specified or
9769    /// deduced template arguments during function template argument deduction.
9770    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9771                          FunctionTemplateDecl *FunctionTemplate,
9772                          ArrayRef<TemplateArgument> TemplateArgs,
9773                          CodeSynthesisContext::SynthesisKind Kind,
9774                          sema::TemplateDeductionInfo &DeductionInfo,
9775                          SourceRange InstantiationRange = SourceRange());
9776
9777    /// Note that we are instantiating as part of template
9778    /// argument deduction for a class template declaration.
9779    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9780                          TemplateDecl *Template,
9781                          ArrayRef<TemplateArgument> TemplateArgs,
9782                          sema::TemplateDeductionInfo &DeductionInfo,
9783                          SourceRange InstantiationRange = SourceRange());
9784
9785    /// Note that we are instantiating as part of template
9786    /// argument deduction for a class template partial
9787    /// specialization.
9788    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9789                          ClassTemplatePartialSpecializationDecl *PartialSpec,
9790                          ArrayRef<TemplateArgument> TemplateArgs,
9791                          sema::TemplateDeductionInfo &DeductionInfo,
9792                          SourceRange InstantiationRange = SourceRange());
9793
9794    /// Note that we are instantiating as part of template
9795    /// argument deduction for a variable template partial
9796    /// specialization.
9797    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9798                          VarTemplatePartialSpecializationDecl *PartialSpec,
9799                          ArrayRef<TemplateArgument> TemplateArgs,
9800                          sema::TemplateDeductionInfo &DeductionInfo,
9801                          SourceRange InstantiationRange = SourceRange());
9802
9803    /// Note that we are instantiating a default argument for a function
9804    /// parameter.
9805    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9806                          ParmVarDecl *Param,
9807                          ArrayRef<TemplateArgument> TemplateArgs,
9808                          SourceRange InstantiationRange = SourceRange());
9809
9810    /// Note that we are substituting prior template arguments into a
9811    /// non-type parameter.
9812    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9813                          NamedDecl *Template,
9814                          NonTypeTemplateParmDecl *Param,
9815                          ArrayRef<TemplateArgument> TemplateArgs,
9816                          SourceRange InstantiationRange);
9817
9818    /// Note that we are substituting prior template arguments into a
9819    /// template template parameter.
9820    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9821                          NamedDecl *Template,
9822                          TemplateTemplateParmDecl *Param,
9823                          ArrayRef<TemplateArgument> TemplateArgs,
9824                          SourceRange InstantiationRange);
9825
9826    /// Note that we are checking the default template argument
9827    /// against the template parameter for a given template-id.
9828    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9829                          TemplateDecl *Template,
9830                          NamedDecl *Param,
9831                          ArrayRef<TemplateArgument> TemplateArgs,
9832                          SourceRange InstantiationRange);
9833
9834    struct ConstraintsCheck {};
9835    /// \brief Note that we are checking the constraints associated with some
9836    /// constrained entity (a concept declaration or a template with associated
9837    /// constraints).
9838    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9839                          ConstraintsCheck, NamedDecl *Template,
9840                          ArrayRef<TemplateArgument> TemplateArgs,
9841                          SourceRange InstantiationRange);
9842
9843    struct ConstraintSubstitution {};
9844    /// \brief Note that we are checking a constraint expression associated
9845    /// with a template declaration or as part of the satisfaction check of a
9846    /// concept.
9847    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9848                          ConstraintSubstitution, NamedDecl *Template,
9849                          sema::TemplateDeductionInfo &DeductionInfo,
9850                          SourceRange InstantiationRange);
9851
9852    struct ConstraintNormalization {};
9853    /// \brief Note that we are normalizing a constraint expression.
9854    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9855                          ConstraintNormalization, NamedDecl *Template,
9856                          SourceRange InstantiationRange);
9857
9858    struct ParameterMappingSubstitution {};
9859    /// \brief Note that we are subtituting into the parameter mapping of an
9860    /// atomic constraint during constraint normalization.
9861    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9862                          ParameterMappingSubstitution, NamedDecl *Template,
9863                          SourceRange InstantiationRange);
9864
9865    /// \brief Note that we are substituting template arguments into a part of
9866    /// a requirement of a requires expression.
9867    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9868                          concepts::Requirement *Req,
9869                          sema::TemplateDeductionInfo &DeductionInfo,
9870                          SourceRange InstantiationRange = SourceRange());
9871
9872    /// \brief Note that we are checking the satisfaction of the constraint
9873    /// expression inside of a nested requirement.
9874    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9875                          concepts::NestedRequirement *Req, ConstraintsCheck,
9876                          SourceRange InstantiationRange = SourceRange());
9877
9878    /// \brief Note that we are checking a requires clause.
9879    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9880                          const RequiresExpr *E,
9881                          sema::TemplateDeductionInfo &DeductionInfo,
9882                          SourceRange InstantiationRange);
9883
9884    struct BuildingDeductionGuidesTag {};
9885    /// \brief Note that we are building deduction guides.
9886    InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
9887                          TemplateDecl *Entity, BuildingDeductionGuidesTag,
9888                          SourceRange InstantiationRange = SourceRange());
9889
9890    /// Note that we have finished instantiating this template.
9891    void Clear();
9892
9893    ~InstantiatingTemplate() { Clear(); }
9894
9895    /// Determines whether we have exceeded the maximum
9896    /// recursive template instantiations.
9897    bool isInvalid() const { return Invalid; }
9898
9899    /// Determine whether we are already instantiating this
9900    /// specialization in some surrounding active instantiation.
9901    bool isAlreadyInstantiating() const { return AlreadyInstantiating; }
9902
9903  private:
9904    Sema &SemaRef;
9905    bool Invalid;
9906    bool AlreadyInstantiating;
9907    bool CheckInstantiationDepth(SourceLocation PointOfInstantiation,
9908                                 SourceRange InstantiationRange);
9909
9910    InstantiatingTemplate(
9911        Sema &SemaRef, CodeSynthesisContext::SynthesisKind Kind,
9912        SourceLocation PointOfInstantiation, SourceRange InstantiationRange,
9913        Decl *Entity, NamedDecl *Template = nullptr,
9914        ArrayRef<TemplateArgument> TemplateArgs = std::nullopt,
9915        sema::TemplateDeductionInfo *DeductionInfo = nullptr);
9916
9917    InstantiatingTemplate(const InstantiatingTemplate&) = delete;
9918
9919    InstantiatingTemplate&
9920    operator=(const InstantiatingTemplate&) = delete;
9921  };
9922
9923  void pushCodeSynthesisContext(CodeSynthesisContext Ctx);
9924  void popCodeSynthesisContext();
9925
9926  /// Determine whether we are currently performing template instantiation.
9927  bool inTemplateInstantiation() const {
9928    return CodeSynthesisContexts.size() > NonInstantiationEntries;
9929  }
9930
9931  void PrintContextStack() {
9932    if (!CodeSynthesisContexts.empty() &&
9933        CodeSynthesisContexts.size() != LastEmittedCodeSynthesisContextDepth) {
9934      PrintInstantiationStack();
9935      LastEmittedCodeSynthesisContextDepth = CodeSynthesisContexts.size();
9936    }
9937    if (PragmaAttributeCurrentTargetDecl)
9938      PrintPragmaAttributeInstantiationPoint();
9939  }
9940  void PrintInstantiationStack();
9941
9942  void PrintPragmaAttributeInstantiationPoint();
9943
9944  /// Determines whether we are currently in a context where
9945  /// template argument substitution failures are not considered
9946  /// errors.
9947  ///
9948  /// \returns An empty \c Optional if we're not in a SFINAE context.
9949  /// Otherwise, contains a pointer that, if non-NULL, contains the nearest
9950  /// template-deduction context object, which can be used to capture
9951  /// diagnostics that will be suppressed.
9952  std::optional<sema::TemplateDeductionInfo *> isSFINAEContext() const;
9953
9954  /// Whether the AST is currently being rebuilt to correct immediate
9955  /// invocations. Immediate invocation candidates and references to consteval
9956  /// functions aren't tracked when this is set.
9957  bool RebuildingImmediateInvocation = false;
9958
9959  /// Used to change context to isConstantEvaluated without pushing a heavy
9960  /// ExpressionEvaluationContextRecord object.
9961  bool isConstantEvaluatedOverride = false;
9962
9963  const ExpressionEvaluationContextRecord &currentEvaluationContext() const {
9964    assert(!ExprEvalContexts.empty() &&
9965           "Must be in an expression evaluation context");
9966    return ExprEvalContexts.back();
9967  };
9968
9969  bool isConstantEvaluatedContext() const {
9970    return currentEvaluationContext().isConstantEvaluated() ||
9971           isConstantEvaluatedOverride;
9972  }
9973
9974  bool isAlwaysConstantEvaluatedContext() const {
9975    const ExpressionEvaluationContextRecord &Ctx = currentEvaluationContext();
9976    return (Ctx.isConstantEvaluated() || isConstantEvaluatedOverride) &&
9977           !Ctx.InConditionallyConstantEvaluateContext;
9978  }
9979
9980  /// Determines whether we are currently in a context that
9981  /// is not evaluated as per C++ [expr] p5.
9982  bool isUnevaluatedContext() const {
9983    return currentEvaluationContext().isUnevaluated();
9984  }
9985
9986  bool isImmediateFunctionContext() const {
9987    return currentEvaluationContext().isImmediateFunctionContext();
9988  }
9989
9990  bool isCheckingDefaultArgumentOrInitializer() const {
9991    const ExpressionEvaluationContextRecord &Ctx = currentEvaluationContext();
9992    return (Ctx.Context ==
9993            ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed) ||
9994           Ctx.IsCurrentlyCheckingDefaultArgumentOrInitializer;
9995  }
9996
9997  std::optional<ExpressionEvaluationContextRecord::InitializationContext>
9998  InnermostDeclarationWithDelayedImmediateInvocations() const {
9999    assert(!ExprEvalContexts.empty() &&
10000           "Must be in an expression evaluation context");
10001    for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
10002      if (Ctx.Context == ExpressionEvaluationContext::PotentiallyEvaluated &&
10003          Ctx.DelayedDefaultInitializationContext)
10004        return Ctx.DelayedDefaultInitializationContext;
10005      if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
10006          Ctx.isUnevaluated())
10007        break;
10008    }
10009    return std::nullopt;
10010  }
10011
10012  std::optional<ExpressionEvaluationContextRecord::InitializationContext>
10013  OutermostDeclarationWithDelayedImmediateInvocations() const {
10014    assert(!ExprEvalContexts.empty() &&
10015           "Must be in an expression evaluation context");
10016    std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
10017    for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
10018      if (Ctx.Context == ExpressionEvaluationContext::PotentiallyEvaluated &&
10019          !Ctx.DelayedDefaultInitializationContext && Res)
10020        break;
10021      if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
10022          Ctx.isUnevaluated())
10023        break;
10024      Res = Ctx.DelayedDefaultInitializationContext;
10025    }
10026    return Res;
10027  }
10028
10029  /// RAII class used to determine whether SFINAE has
10030  /// trapped any errors that occur during template argument
10031  /// deduction.
10032  class SFINAETrap {
10033    Sema &SemaRef;
10034    unsigned PrevSFINAEErrors;
10035    bool PrevInNonInstantiationSFINAEContext;
10036    bool PrevAccessCheckingSFINAE;
10037    bool PrevLastDiagnosticIgnored;
10038
10039  public:
10040    explicit SFINAETrap(Sema &SemaRef, bool AccessCheckingSFINAE = false)
10041      : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors),
10042        PrevInNonInstantiationSFINAEContext(
10043                                      SemaRef.InNonInstantiationSFINAEContext),
10044        PrevAccessCheckingSFINAE(SemaRef.AccessCheckingSFINAE),
10045        PrevLastDiagnosticIgnored(
10046            SemaRef.getDiagnostics().isLastDiagnosticIgnored())
10047    {
10048      if (!SemaRef.isSFINAEContext())
10049        SemaRef.InNonInstantiationSFINAEContext = true;
10050      SemaRef.AccessCheckingSFINAE = AccessCheckingSFINAE;
10051    }
10052
10053    ~SFINAETrap() {
10054      SemaRef.NumSFINAEErrors = PrevSFINAEErrors;
10055      SemaRef.InNonInstantiationSFINAEContext
10056        = PrevInNonInstantiationSFINAEContext;
10057      SemaRef.AccessCheckingSFINAE = PrevAccessCheckingSFINAE;
10058      SemaRef.getDiagnostics().setLastDiagnosticIgnored(
10059          PrevLastDiagnosticIgnored);
10060    }
10061
10062    /// Determine whether any SFINAE errors have been trapped.
10063    bool hasErrorOccurred() const {
10064      return SemaRef.NumSFINAEErrors > PrevSFINAEErrors;
10065    }
10066  };
10067
10068  /// RAII class used to indicate that we are performing provisional
10069  /// semantic analysis to determine the validity of a construct, so
10070  /// typo-correction and diagnostics in the immediate context (not within
10071  /// implicitly-instantiated templates) should be suppressed.
10072  class TentativeAnalysisScope {
10073    Sema &SemaRef;
10074    // FIXME: Using a SFINAETrap for this is a hack.
10075    SFINAETrap Trap;
10076    bool PrevDisableTypoCorrection;
10077  public:
10078    explicit TentativeAnalysisScope(Sema &SemaRef)
10079        : SemaRef(SemaRef), Trap(SemaRef, true),
10080          PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
10081      SemaRef.DisableTypoCorrection = true;
10082    }
10083    ~TentativeAnalysisScope() {
10084      SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
10085    }
10086  };
10087
10088  /// The current instantiation scope used to store local
10089  /// variables.
10090  LocalInstantiationScope *CurrentInstantiationScope;
10091
10092  /// Tracks whether we are in a context where typo correction is
10093  /// disabled.
10094  bool DisableTypoCorrection;
10095
10096  /// The number of typos corrected by CorrectTypo.
10097  unsigned TyposCorrected;
10098
10099  typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
10100  typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
10101
10102  /// A cache containing identifiers for which typo correction failed and
10103  /// their locations, so that repeated attempts to correct an identifier in a
10104  /// given location are ignored if typo correction already failed for it.
10105  IdentifierSourceLocations TypoCorrectionFailures;
10106
10107  /// Worker object for performing CFG-based warnings.
10108  sema::AnalysisBasedWarnings AnalysisWarnings;
10109  threadSafety::BeforeSet *ThreadSafetyDeclCache;
10110
10111  /// An entity for which implicit template instantiation is required.
10112  ///
10113  /// The source location associated with the declaration is the first place in
10114  /// the source code where the declaration was "used". It is not necessarily
10115  /// the point of instantiation (which will be either before or after the
10116  /// namespace-scope declaration that triggered this implicit instantiation),
10117  /// However, it is the location that diagnostics should generally refer to,
10118  /// because users will need to know what code triggered the instantiation.
10119  typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
10120
10121  /// The queue of implicit template instantiations that are required
10122  /// but have not yet been performed.
10123  std::deque<PendingImplicitInstantiation> PendingInstantiations;
10124
10125  /// Queue of implicit template instantiations that cannot be performed
10126  /// eagerly.
10127  SmallVector<PendingImplicitInstantiation, 1> LateParsedInstantiations;
10128
10129  SmallVector<SmallVector<VTableUse, 16>, 8> SavedVTableUses;
10130  SmallVector<std::deque<PendingImplicitInstantiation>, 8>
10131      SavedPendingInstantiations;
10132
10133  class GlobalEagerInstantiationScope {
10134  public:
10135    GlobalEagerInstantiationScope(Sema &S, bool Enabled)
10136        : S(S), Enabled(Enabled) {
10137      if (!Enabled) return;
10138
10139      S.SavedPendingInstantiations.emplace_back();
10140      S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
10141
10142      S.SavedVTableUses.emplace_back();
10143      S.SavedVTableUses.back().swap(S.VTableUses);
10144    }
10145
10146    void perform() {
10147      if (Enabled) {
10148        S.DefineUsedVTables();
10149        S.PerformPendingInstantiations();
10150      }
10151    }
10152
10153    ~GlobalEagerInstantiationScope() {
10154      if (!Enabled) return;
10155
10156      // Restore the set of pending vtables.
10157      assert(S.VTableUses.empty() &&
10158             "VTableUses should be empty before it is discarded.");
10159      S.VTableUses.swap(S.SavedVTableUses.back());
10160      S.SavedVTableUses.pop_back();
10161
10162      // Restore the set of pending implicit instantiations.
10163      if (S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) {
10164        assert(S.PendingInstantiations.empty() &&
10165               "PendingInstantiations should be empty before it is discarded.");
10166        S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
10167        S.SavedPendingInstantiations.pop_back();
10168      } else {
10169        // Template instantiations in the PCH may be delayed until the TU.
10170        S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
10171        S.PendingInstantiations.insert(
10172            S.PendingInstantiations.end(),
10173            S.SavedPendingInstantiations.back().begin(),
10174            S.SavedPendingInstantiations.back().end());
10175        S.SavedPendingInstantiations.pop_back();
10176      }
10177    }
10178
10179  private:
10180    Sema &S;
10181    bool Enabled;
10182  };
10183
10184  /// The queue of implicit template instantiations that are required
10185  /// and must be performed within the current local scope.
10186  ///
10187  /// This queue is only used for member functions of local classes in
10188  /// templates, which must be instantiated in the same scope as their
10189  /// enclosing function, so that they can reference function-local
10190  /// types, static variables, enumerators, etc.
10191  std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
10192
10193  class LocalEagerInstantiationScope {
10194  public:
10195    LocalEagerInstantiationScope(Sema &S) : S(S) {
10196      SavedPendingLocalImplicitInstantiations.swap(
10197          S.PendingLocalImplicitInstantiations);
10198    }
10199
10200    void perform() { S.PerformPendingInstantiations(/*LocalOnly=*/true); }
10201
10202    ~LocalEagerInstantiationScope() {
10203      assert(S.PendingLocalImplicitInstantiations.empty() &&
10204             "there shouldn't be any pending local implicit instantiations");
10205      SavedPendingLocalImplicitInstantiations.swap(
10206          S.PendingLocalImplicitInstantiations);
10207    }
10208
10209  private:
10210    Sema &S;
10211    std::deque<PendingImplicitInstantiation>
10212        SavedPendingLocalImplicitInstantiations;
10213  };
10214
10215  /// A helper class for building up ExtParameterInfos.
10216  class ExtParameterInfoBuilder {
10217    SmallVector<FunctionProtoType::ExtParameterInfo, 16> Infos;
10218    bool HasInteresting = false;
10219
10220  public:
10221    /// Set the ExtParameterInfo for the parameter at the given index,
10222    ///
10223    void set(unsigned index, FunctionProtoType::ExtParameterInfo info) {
10224      assert(Infos.size() <= index);
10225      Infos.resize(index);
10226      Infos.push_back(info);
10227
10228      if (!HasInteresting)
10229        HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
10230    }
10231
10232    /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
10233    /// ExtParameterInfo array we've built up.
10234    const FunctionProtoType::ExtParameterInfo *
10235    getPointerOrNull(unsigned numParams) {
10236      if (!HasInteresting) return nullptr;
10237      Infos.resize(numParams);
10238      return Infos.data();
10239    }
10240  };
10241
10242  void PerformPendingInstantiations(bool LocalOnly = false);
10243
10244  TypeSourceInfo *SubstType(TypeSourceInfo *T,
10245                            const MultiLevelTemplateArgumentList &TemplateArgs,
10246                            SourceLocation Loc, DeclarationName Entity,
10247                            bool AllowDeducedTST = false);
10248
10249  QualType SubstType(QualType T,
10250                     const MultiLevelTemplateArgumentList &TemplateArgs,
10251                     SourceLocation Loc, DeclarationName Entity);
10252
10253  TypeSourceInfo *SubstType(TypeLoc TL,
10254                            const MultiLevelTemplateArgumentList &TemplateArgs,
10255                            SourceLocation Loc, DeclarationName Entity);
10256
10257  TypeSourceInfo *SubstFunctionDeclType(
10258      TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
10259      SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
10260      Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
10261  void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto,
10262                          const MultiLevelTemplateArgumentList &Args);
10263  bool SubstExceptionSpec(SourceLocation Loc,
10264                          FunctionProtoType::ExceptionSpecInfo &ESI,
10265                          SmallVectorImpl<QualType> &ExceptionStorage,
10266                          const MultiLevelTemplateArgumentList &Args);
10267  ParmVarDecl *
10268  SubstParmVarDecl(ParmVarDecl *D,
10269                   const MultiLevelTemplateArgumentList &TemplateArgs,
10270                   int indexAdjustment, std::optional<unsigned> NumExpansions,
10271                   bool ExpectParameterPack, bool EvaluateConstraints = true);
10272  bool SubstParmTypes(SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
10273                      const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
10274                      const MultiLevelTemplateArgumentList &TemplateArgs,
10275                      SmallVectorImpl<QualType> &ParamTypes,
10276                      SmallVectorImpl<ParmVarDecl *> *OutParams,
10277                      ExtParameterInfoBuilder &ParamInfos);
10278  bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param,
10279                            const MultiLevelTemplateArgumentList &TemplateArgs,
10280                            bool ForCallExpr = false);
10281  ExprResult SubstExpr(Expr *E,
10282                       const MultiLevelTemplateArgumentList &TemplateArgs);
10283
10284  // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
10285  // to disable constraint evaluation, then restore the state.
10286  template <typename InstTy> struct ConstraintEvalRAII {
10287    InstTy &TI;
10288    bool OldValue;
10289
10290    ConstraintEvalRAII(InstTy &TI)
10291        : TI(TI), OldValue(TI.getEvaluateConstraints()) {
10292      TI.setEvaluateConstraints(false);
10293    }
10294    ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
10295  };
10296
10297  // Must be used instead of SubstExpr at 'constraint checking' time.
10298  ExprResult
10299  SubstConstraintExpr(Expr *E,
10300                      const MultiLevelTemplateArgumentList &TemplateArgs);
10301  // Unlike the above, this does not evaluates constraints.
10302  ExprResult SubstConstraintExprWithoutSatisfaction(
10303      Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
10304
10305  /// Substitute the given template arguments into a list of
10306  /// expressions, expanding pack expansions if required.
10307  ///
10308  /// \param Exprs The list of expressions to substitute into.
10309  ///
10310  /// \param IsCall Whether this is some form of call, in which case
10311  /// default arguments will be dropped.
10312  ///
10313  /// \param TemplateArgs The set of template arguments to substitute.
10314  ///
10315  /// \param Outputs Will receive all of the substituted arguments.
10316  ///
10317  /// \returns true if an error occurred, false otherwise.
10318  bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
10319                  const MultiLevelTemplateArgumentList &TemplateArgs,
10320                  SmallVectorImpl<Expr *> &Outputs);
10321
10322  StmtResult SubstStmt(Stmt *S,
10323                       const MultiLevelTemplateArgumentList &TemplateArgs);
10324
10325  TemplateParameterList *
10326  SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner,
10327                      const MultiLevelTemplateArgumentList &TemplateArgs,
10328                      bool EvaluateConstraints = true);
10329
10330  bool
10331  SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
10332                         const MultiLevelTemplateArgumentList &TemplateArgs,
10333                         TemplateArgumentListInfo &Outputs);
10334
10335  Decl *SubstDecl(Decl *D, DeclContext *Owner,
10336                  const MultiLevelTemplateArgumentList &TemplateArgs);
10337
10338  /// Substitute the name and return type of a defaulted 'operator<=>' to form
10339  /// an implicit 'operator=='.
10340  FunctionDecl *SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD,
10341                                           FunctionDecl *Spaceship);
10342
10343  ExprResult SubstInitializer(Expr *E,
10344                       const MultiLevelTemplateArgumentList &TemplateArgs,
10345                       bool CXXDirectInit);
10346
10347  bool
10348  SubstBaseSpecifiers(CXXRecordDecl *Instantiation,
10349                      CXXRecordDecl *Pattern,
10350                      const MultiLevelTemplateArgumentList &TemplateArgs);
10351
10352  bool
10353  InstantiateClass(SourceLocation PointOfInstantiation,
10354                   CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
10355                   const MultiLevelTemplateArgumentList &TemplateArgs,
10356                   TemplateSpecializationKind TSK,
10357                   bool Complain = true);
10358
10359  bool InstantiateEnum(SourceLocation PointOfInstantiation,
10360                       EnumDecl *Instantiation, EnumDecl *Pattern,
10361                       const MultiLevelTemplateArgumentList &TemplateArgs,
10362                       TemplateSpecializationKind TSK);
10363
10364  bool InstantiateInClassInitializer(
10365      SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
10366      FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
10367
10368  struct LateInstantiatedAttribute {
10369    const Attr *TmplAttr;
10370    LocalInstantiationScope *Scope;
10371    Decl *NewDecl;
10372
10373    LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S,
10374                              Decl *D)
10375      : TmplAttr(A), Scope(S), NewDecl(D)
10376    { }
10377  };
10378  typedef SmallVector<LateInstantiatedAttribute, 16> LateInstantiatedAttrVec;
10379
10380  void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
10381                        const Decl *Pattern, Decl *Inst,
10382                        LateInstantiatedAttrVec *LateAttrs = nullptr,
10383                        LocalInstantiationScope *OuterMostScope = nullptr);
10384  void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
10385
10386  void
10387  InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs,
10388                          const Decl *Pattern, Decl *Inst,
10389                          LateInstantiatedAttrVec *LateAttrs = nullptr,
10390                          LocalInstantiationScope *OuterMostScope = nullptr);
10391
10392  void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor);
10393
10394  bool usesPartialOrExplicitSpecialization(
10395      SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
10396
10397  bool
10398  InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation,
10399                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
10400                           TemplateSpecializationKind TSK,
10401                           bool Complain = true);
10402
10403  void InstantiateClassMembers(SourceLocation PointOfInstantiation,
10404                               CXXRecordDecl *Instantiation,
10405                            const MultiLevelTemplateArgumentList &TemplateArgs,
10406                               TemplateSpecializationKind TSK);
10407
10408  void InstantiateClassTemplateSpecializationMembers(
10409                                          SourceLocation PointOfInstantiation,
10410                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
10411                                                TemplateSpecializationKind TSK);
10412
10413  NestedNameSpecifierLoc
10414  SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
10415                           const MultiLevelTemplateArgumentList &TemplateArgs);
10416
10417  DeclarationNameInfo
10418  SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
10419                           const MultiLevelTemplateArgumentList &TemplateArgs);
10420  TemplateName
10421  SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name,
10422                    SourceLocation Loc,
10423                    const MultiLevelTemplateArgumentList &TemplateArgs);
10424
10425  bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC,
10426                           const MultiLevelTemplateArgumentList &TemplateArgs,
10427                           bool EvaluateConstraint);
10428
10429  bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD,
10430                                  ParmVarDecl *Param);
10431  void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
10432                                FunctionDecl *Function);
10433  bool CheckInstantiatedFunctionTemplateConstraints(
10434      SourceLocation PointOfInstantiation, FunctionDecl *Decl,
10435      ArrayRef<TemplateArgument> TemplateArgs,
10436      ConstraintSatisfaction &Satisfaction);
10437  FunctionDecl *InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD,
10438                                               const TemplateArgumentList *Args,
10439                                               SourceLocation Loc);
10440  void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
10441                                     FunctionDecl *Function,
10442                                     bool Recursive = false,
10443                                     bool DefinitionRequired = false,
10444                                     bool AtEndOfTU = false);
10445  VarTemplateSpecializationDecl *BuildVarTemplateInstantiation(
10446      VarTemplateDecl *VarTemplate, VarDecl *FromVar,
10447      const TemplateArgumentList &TemplateArgList,
10448      const TemplateArgumentListInfo &TemplateArgsInfo,
10449      SmallVectorImpl<TemplateArgument> &Converted,
10450      SourceLocation PointOfInstantiation,
10451      LateInstantiatedAttrVec *LateAttrs = nullptr,
10452      LocalInstantiationScope *StartingScope = nullptr);
10453  VarTemplateSpecializationDecl *CompleteVarTemplateSpecializationDecl(
10454      VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
10455      const MultiLevelTemplateArgumentList &TemplateArgs);
10456  void
10457  BuildVariableInstantiation(VarDecl *NewVar, VarDecl *OldVar,
10458                             const MultiLevelTemplateArgumentList &TemplateArgs,
10459                             LateInstantiatedAttrVec *LateAttrs,
10460                             DeclContext *Owner,
10461                             LocalInstantiationScope *StartingScope,
10462                             bool InstantiatingVarTemplate = false,
10463                             VarTemplateSpecializationDecl *PrevVTSD = nullptr);
10464
10465  void InstantiateVariableInitializer(
10466      VarDecl *Var, VarDecl *OldVar,
10467      const MultiLevelTemplateArgumentList &TemplateArgs);
10468  void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
10469                                     VarDecl *Var, bool Recursive = false,
10470                                     bool DefinitionRequired = false,
10471                                     bool AtEndOfTU = false);
10472
10473  void InstantiateMemInitializers(CXXConstructorDecl *New,
10474                                  const CXXConstructorDecl *Tmpl,
10475                            const MultiLevelTemplateArgumentList &TemplateArgs);
10476
10477  ExplicitSpecifier instantiateExplicitSpecifier(
10478      const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
10479
10480  NamedDecl *FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
10481                          const MultiLevelTemplateArgumentList &TemplateArgs,
10482                          bool FindingInstantiatedContext = false);
10483  DeclContext *FindInstantiatedContext(SourceLocation Loc, DeclContext *DC,
10484                          const MultiLevelTemplateArgumentList &TemplateArgs);
10485
10486  // Objective-C declarations.
10487  enum ObjCContainerKind {
10488    OCK_None = -1,
10489    OCK_Interface = 0,
10490    OCK_Protocol,
10491    OCK_Category,
10492    OCK_ClassExtension,
10493    OCK_Implementation,
10494    OCK_CategoryImplementation
10495  };
10496  ObjCContainerKind getObjCContainerKind() const;
10497
10498  DeclResult actOnObjCTypeParam(Scope *S,
10499                                ObjCTypeParamVariance variance,
10500                                SourceLocation varianceLoc,
10501                                unsigned index,
10502                                IdentifierInfo *paramName,
10503                                SourceLocation paramLoc,
10504                                SourceLocation colonLoc,
10505                                ParsedType typeBound);
10506
10507  ObjCTypeParamList *actOnObjCTypeParamList(Scope *S, SourceLocation lAngleLoc,
10508                                            ArrayRef<Decl *> typeParams,
10509                                            SourceLocation rAngleLoc);
10510  void popObjCTypeParamList(Scope *S, ObjCTypeParamList *typeParamList);
10511
10512  ObjCInterfaceDecl *ActOnStartClassInterface(
10513      Scope *S, SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName,
10514      SourceLocation ClassLoc, ObjCTypeParamList *typeParamList,
10515      IdentifierInfo *SuperName, SourceLocation SuperLoc,
10516      ArrayRef<ParsedType> SuperTypeArgs, SourceRange SuperTypeArgsRange,
10517      Decl *const *ProtoRefs, unsigned NumProtoRefs,
10518      const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc,
10519      const ParsedAttributesView &AttrList, SkipBodyInfo *SkipBody);
10520
10521  void ActOnSuperClassOfClassInterface(Scope *S,
10522                                       SourceLocation AtInterfaceLoc,
10523                                       ObjCInterfaceDecl *IDecl,
10524                                       IdentifierInfo *ClassName,
10525                                       SourceLocation ClassLoc,
10526                                       IdentifierInfo *SuperName,
10527                                       SourceLocation SuperLoc,
10528                                       ArrayRef<ParsedType> SuperTypeArgs,
10529                                       SourceRange SuperTypeArgsRange);
10530
10531  void ActOnTypedefedProtocols(SmallVectorImpl<Decl *> &ProtocolRefs,
10532                               SmallVectorImpl<SourceLocation> &ProtocolLocs,
10533                               IdentifierInfo *SuperName,
10534                               SourceLocation SuperLoc);
10535
10536  Decl *ActOnCompatibilityAlias(
10537                    SourceLocation AtCompatibilityAliasLoc,
10538                    IdentifierInfo *AliasName,  SourceLocation AliasLocation,
10539                    IdentifierInfo *ClassName, SourceLocation ClassLocation);
10540
10541  bool CheckForwardProtocolDeclarationForCircularDependency(
10542    IdentifierInfo *PName,
10543    SourceLocation &PLoc, SourceLocation PrevLoc,
10544    const ObjCList<ObjCProtocolDecl> &PList);
10545
10546  ObjCProtocolDecl *ActOnStartProtocolInterface(
10547      SourceLocation AtProtoInterfaceLoc, IdentifierInfo *ProtocolName,
10548      SourceLocation ProtocolLoc, Decl *const *ProtoRefNames,
10549      unsigned NumProtoRefs, const SourceLocation *ProtoLocs,
10550      SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList,
10551      SkipBodyInfo *SkipBody);
10552
10553  ObjCCategoryDecl *ActOnStartCategoryInterface(
10554      SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName,
10555      SourceLocation ClassLoc, ObjCTypeParamList *typeParamList,
10556      IdentifierInfo *CategoryName, SourceLocation CategoryLoc,
10557      Decl *const *ProtoRefs, unsigned NumProtoRefs,
10558      const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc,
10559      const ParsedAttributesView &AttrList);
10560
10561  ObjCImplementationDecl *ActOnStartClassImplementation(
10562      SourceLocation AtClassImplLoc, IdentifierInfo *ClassName,
10563      SourceLocation ClassLoc, IdentifierInfo *SuperClassname,
10564      SourceLocation SuperClassLoc, const ParsedAttributesView &AttrList);
10565
10566  ObjCCategoryImplDecl *ActOnStartCategoryImplementation(
10567      SourceLocation AtCatImplLoc, IdentifierInfo *ClassName,
10568      SourceLocation ClassLoc, IdentifierInfo *CatName, SourceLocation CatLoc,
10569      const ParsedAttributesView &AttrList);
10570
10571  DeclGroupPtrTy ActOnFinishObjCImplementation(Decl *ObjCImpDecl,
10572                                               ArrayRef<Decl *> Decls);
10573
10574  DeclGroupPtrTy ActOnForwardClassDeclaration(SourceLocation Loc,
10575                   IdentifierInfo **IdentList,
10576                   SourceLocation *IdentLocs,
10577                   ArrayRef<ObjCTypeParamList *> TypeParamLists,
10578                   unsigned NumElts);
10579
10580  DeclGroupPtrTy
10581  ActOnForwardProtocolDeclaration(SourceLocation AtProtoclLoc,
10582                                  ArrayRef<IdentifierLocPair> IdentList,
10583                                  const ParsedAttributesView &attrList);
10584
10585  void FindProtocolDeclaration(bool WarnOnDeclarations, bool ForObjCContainer,
10586                               ArrayRef<IdentifierLocPair> ProtocolId,
10587                               SmallVectorImpl<Decl *> &Protocols);
10588
10589  void DiagnoseTypeArgsAndProtocols(IdentifierInfo *ProtocolId,
10590                                    SourceLocation ProtocolLoc,
10591                                    IdentifierInfo *TypeArgId,
10592                                    SourceLocation TypeArgLoc,
10593                                    bool SelectProtocolFirst = false);
10594
10595  /// Given a list of identifiers (and their locations), resolve the
10596  /// names to either Objective-C protocol qualifiers or type
10597  /// arguments, as appropriate.
10598  void actOnObjCTypeArgsOrProtocolQualifiers(
10599         Scope *S,
10600         ParsedType baseType,
10601         SourceLocation lAngleLoc,
10602         ArrayRef<IdentifierInfo *> identifiers,
10603         ArrayRef<SourceLocation> identifierLocs,
10604         SourceLocation rAngleLoc,
10605         SourceLocation &typeArgsLAngleLoc,
10606         SmallVectorImpl<ParsedType> &typeArgs,
10607         SourceLocation &typeArgsRAngleLoc,
10608         SourceLocation &protocolLAngleLoc,
10609         SmallVectorImpl<Decl *> &protocols,
10610         SourceLocation &protocolRAngleLoc,
10611         bool warnOnIncompleteProtocols);
10612
10613  /// Build a an Objective-C protocol-qualified 'id' type where no
10614  /// base type was specified.
10615  TypeResult actOnObjCProtocolQualifierType(
10616               SourceLocation lAngleLoc,
10617               ArrayRef<Decl *> protocols,
10618               ArrayRef<SourceLocation> protocolLocs,
10619               SourceLocation rAngleLoc);
10620
10621  /// Build a specialized and/or protocol-qualified Objective-C type.
10622  TypeResult actOnObjCTypeArgsAndProtocolQualifiers(
10623               Scope *S,
10624               SourceLocation Loc,
10625               ParsedType BaseType,
10626               SourceLocation TypeArgsLAngleLoc,
10627               ArrayRef<ParsedType> TypeArgs,
10628               SourceLocation TypeArgsRAngleLoc,
10629               SourceLocation ProtocolLAngleLoc,
10630               ArrayRef<Decl *> Protocols,
10631               ArrayRef<SourceLocation> ProtocolLocs,
10632               SourceLocation ProtocolRAngleLoc);
10633
10634  /// Build an Objective-C type parameter type.
10635  QualType BuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
10636                                  SourceLocation ProtocolLAngleLoc,
10637                                  ArrayRef<ObjCProtocolDecl *> Protocols,
10638                                  ArrayRef<SourceLocation> ProtocolLocs,
10639                                  SourceLocation ProtocolRAngleLoc,
10640                                  bool FailOnError = false);
10641
10642  /// Build an Objective-C object pointer type.
10643  QualType BuildObjCObjectType(
10644      QualType BaseType, SourceLocation Loc, SourceLocation TypeArgsLAngleLoc,
10645      ArrayRef<TypeSourceInfo *> TypeArgs, SourceLocation TypeArgsRAngleLoc,
10646      SourceLocation ProtocolLAngleLoc, ArrayRef<ObjCProtocolDecl *> Protocols,
10647      ArrayRef<SourceLocation> ProtocolLocs, SourceLocation ProtocolRAngleLoc,
10648      bool FailOnError, bool Rebuilding);
10649
10650  /// Ensure attributes are consistent with type.
10651  /// \param [in, out] Attributes The attributes to check; they will
10652  /// be modified to be consistent with \p PropertyTy.
10653  void CheckObjCPropertyAttributes(Decl *PropertyPtrTy,
10654                                   SourceLocation Loc,
10655                                   unsigned &Attributes,
10656                                   bool propertyInPrimaryClass);
10657
10658  /// Process the specified property declaration and create decls for the
10659  /// setters and getters as needed.
10660  /// \param property The property declaration being processed
10661  void ProcessPropertyDecl(ObjCPropertyDecl *property);
10662
10663
10664  void DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
10665                                ObjCPropertyDecl *SuperProperty,
10666                                const IdentifierInfo *Name,
10667                                bool OverridingProtocolProperty);
10668
10669  void DiagnoseClassExtensionDupMethods(ObjCCategoryDecl *CAT,
10670                                        ObjCInterfaceDecl *ID);
10671
10672  Decl *ActOnAtEnd(Scope *S, SourceRange AtEnd,
10673                   ArrayRef<Decl *> allMethods = std::nullopt,
10674                   ArrayRef<DeclGroupPtrTy> allTUVars = std::nullopt);
10675
10676  Decl *ActOnProperty(Scope *S, SourceLocation AtLoc,
10677                      SourceLocation LParenLoc,
10678                      FieldDeclarator &FD, ObjCDeclSpec &ODS,
10679                      Selector GetterSel, Selector SetterSel,
10680                      tok::ObjCKeywordKind MethodImplKind,
10681                      DeclContext *lexicalDC = nullptr);
10682
10683  Decl *ActOnPropertyImplDecl(Scope *S,
10684                              SourceLocation AtLoc,
10685                              SourceLocation PropertyLoc,
10686                              bool ImplKind,
10687                              IdentifierInfo *PropertyId,
10688                              IdentifierInfo *PropertyIvar,
10689                              SourceLocation PropertyIvarLoc,
10690                              ObjCPropertyQueryKind QueryKind);
10691
10692  enum ObjCSpecialMethodKind {
10693    OSMK_None,
10694    OSMK_Alloc,
10695    OSMK_New,
10696    OSMK_Copy,
10697    OSMK_RetainingInit,
10698    OSMK_NonRetainingInit
10699  };
10700
10701  struct ObjCArgInfo {
10702    IdentifierInfo *Name;
10703    SourceLocation NameLoc;
10704    // The Type is null if no type was specified, and the DeclSpec is invalid
10705    // in this case.
10706    ParsedType Type;
10707    ObjCDeclSpec DeclSpec;
10708
10709    /// ArgAttrs - Attribute list for this argument.
10710    ParsedAttributesView ArgAttrs;
10711  };
10712
10713  Decl *ActOnMethodDeclaration(
10714      Scope *S,
10715      SourceLocation BeginLoc, // location of the + or -.
10716      SourceLocation EndLoc,   // location of the ; or {.
10717      tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType,
10718      ArrayRef<SourceLocation> SelectorLocs, Selector Sel,
10719      // optional arguments. The number of types/arguments is obtained
10720      // from the Sel.getNumArgs().
10721      ObjCArgInfo *ArgInfo, DeclaratorChunk::ParamInfo *CParamInfo,
10722      unsigned CNumArgs, // c-style args
10723      const ParsedAttributesView &AttrList, tok::ObjCKeywordKind MethodImplKind,
10724      bool isVariadic, bool MethodDefinition);
10725
10726  ObjCMethodDecl *LookupMethodInQualifiedType(Selector Sel,
10727                                              const ObjCObjectPointerType *OPT,
10728                                              bool IsInstance);
10729  ObjCMethodDecl *LookupMethodInObjectType(Selector Sel, QualType Ty,
10730                                           bool IsInstance);
10731
10732  bool CheckARCMethodDecl(ObjCMethodDecl *method);
10733  bool inferObjCARCLifetime(ValueDecl *decl);
10734
10735  void deduceOpenCLAddressSpace(ValueDecl *decl);
10736
10737  ExprResult
10738  HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
10739                            Expr *BaseExpr,
10740                            SourceLocation OpLoc,
10741                            DeclarationName MemberName,
10742                            SourceLocation MemberLoc,
10743                            SourceLocation SuperLoc, QualType SuperType,
10744                            bool Super);
10745
10746  ExprResult
10747  ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
10748                            IdentifierInfo &propertyName,
10749                            SourceLocation receiverNameLoc,
10750                            SourceLocation propertyNameLoc);
10751
10752  ObjCMethodDecl *tryCaptureObjCSelf(SourceLocation Loc);
10753
10754  /// Describes the kind of message expression indicated by a message
10755  /// send that starts with an identifier.
10756  enum ObjCMessageKind {
10757    /// The message is sent to 'super'.
10758    ObjCSuperMessage,
10759    /// The message is an instance message.
10760    ObjCInstanceMessage,
10761    /// The message is a class message, and the identifier is a type
10762    /// name.
10763    ObjCClassMessage
10764  };
10765
10766  ObjCMessageKind getObjCMessageKind(Scope *S,
10767                                     IdentifierInfo *Name,
10768                                     SourceLocation NameLoc,
10769                                     bool IsSuper,
10770                                     bool HasTrailingDot,
10771                                     ParsedType &ReceiverType);
10772
10773  ExprResult ActOnSuperMessage(Scope *S, SourceLocation SuperLoc,
10774                               Selector Sel,
10775                               SourceLocation LBracLoc,
10776                               ArrayRef<SourceLocation> SelectorLocs,
10777                               SourceLocation RBracLoc,
10778                               MultiExprArg Args);
10779
10780  ExprResult BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
10781                               QualType ReceiverType,
10782                               SourceLocation SuperLoc,
10783                               Selector Sel,
10784                               ObjCMethodDecl *Method,
10785                               SourceLocation LBracLoc,
10786                               ArrayRef<SourceLocation> SelectorLocs,
10787                               SourceLocation RBracLoc,
10788                               MultiExprArg Args,
10789                               bool isImplicit = false);
10790
10791  ExprResult BuildClassMessageImplicit(QualType ReceiverType,
10792                                       bool isSuperReceiver,
10793                                       SourceLocation Loc,
10794                                       Selector Sel,
10795                                       ObjCMethodDecl *Method,
10796                                       MultiExprArg Args);
10797
10798  ExprResult ActOnClassMessage(Scope *S,
10799                               ParsedType Receiver,
10800                               Selector Sel,
10801                               SourceLocation LBracLoc,
10802                               ArrayRef<SourceLocation> SelectorLocs,
10803                               SourceLocation RBracLoc,
10804                               MultiExprArg Args);
10805
10806  ExprResult BuildInstanceMessage(Expr *Receiver,
10807                                  QualType ReceiverType,
10808                                  SourceLocation SuperLoc,
10809                                  Selector Sel,
10810                                  ObjCMethodDecl *Method,
10811                                  SourceLocation LBracLoc,
10812                                  ArrayRef<SourceLocation> SelectorLocs,
10813                                  SourceLocation RBracLoc,
10814                                  MultiExprArg Args,
10815                                  bool isImplicit = false);
10816
10817  ExprResult BuildInstanceMessageImplicit(Expr *Receiver,
10818                                          QualType ReceiverType,
10819                                          SourceLocation Loc,
10820                                          Selector Sel,
10821                                          ObjCMethodDecl *Method,
10822                                          MultiExprArg Args);
10823
10824  ExprResult ActOnInstanceMessage(Scope *S,
10825                                  Expr *Receiver,
10826                                  Selector Sel,
10827                                  SourceLocation LBracLoc,
10828                                  ArrayRef<SourceLocation> SelectorLocs,
10829                                  SourceLocation RBracLoc,
10830                                  MultiExprArg Args);
10831
10832  ExprResult BuildObjCBridgedCast(SourceLocation LParenLoc,
10833                                  ObjCBridgeCastKind Kind,
10834                                  SourceLocation BridgeKeywordLoc,
10835                                  TypeSourceInfo *TSInfo,
10836                                  Expr *SubExpr);
10837
10838  ExprResult ActOnObjCBridgedCast(Scope *S,
10839                                  SourceLocation LParenLoc,
10840                                  ObjCBridgeCastKind Kind,
10841                                  SourceLocation BridgeKeywordLoc,
10842                                  ParsedType Type,
10843                                  SourceLocation RParenLoc,
10844                                  Expr *SubExpr);
10845
10846  void CheckTollFreeBridgeCast(QualType castType, Expr *castExpr);
10847
10848  void CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr);
10849
10850  bool CheckTollFreeBridgeStaticCast(QualType castType, Expr *castExpr,
10851                                     CastKind &Kind);
10852
10853  bool checkObjCBridgeRelatedComponents(SourceLocation Loc,
10854                                        QualType DestType, QualType SrcType,
10855                                        ObjCInterfaceDecl *&RelatedClass,
10856                                        ObjCMethodDecl *&ClassMethod,
10857                                        ObjCMethodDecl *&InstanceMethod,
10858                                        TypedefNameDecl *&TDNDecl,
10859                                        bool CfToNs, bool Diagnose = true);
10860
10861  bool CheckObjCBridgeRelatedConversions(SourceLocation Loc,
10862                                         QualType DestType, QualType SrcType,
10863                                         Expr *&SrcExpr, bool Diagnose = true);
10864
10865  bool CheckConversionToObjCLiteral(QualType DstType, Expr *&SrcExpr,
10866                                    bool Diagnose = true);
10867
10868  bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall);
10869
10870  /// Check whether the given new method is a valid override of the
10871  /// given overridden method, and set any properties that should be inherited.
10872  void CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
10873                               const ObjCMethodDecl *Overridden);
10874
10875  /// Describes the compatibility of a result type with its method.
10876  enum ResultTypeCompatibilityKind {
10877    RTC_Compatible,
10878    RTC_Incompatible,
10879    RTC_Unknown
10880  };
10881
10882  void CheckObjCMethodDirectOverrides(ObjCMethodDecl *method,
10883                                      ObjCMethodDecl *overridden);
10884
10885  void CheckObjCMethodOverrides(ObjCMethodDecl *ObjCMethod,
10886                                ObjCInterfaceDecl *CurrentClass,
10887                                ResultTypeCompatibilityKind RTC);
10888
10889  enum PragmaOptionsAlignKind {
10890    POAK_Native,  // #pragma options align=native
10891    POAK_Natural, // #pragma options align=natural
10892    POAK_Packed,  // #pragma options align=packed
10893    POAK_Power,   // #pragma options align=power
10894    POAK_Mac68k,  // #pragma options align=mac68k
10895    POAK_Reset    // #pragma options align=reset
10896  };
10897
10898  /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
10899  void ActOnPragmaClangSection(SourceLocation PragmaLoc,
10900                               PragmaClangSectionAction Action,
10901                               PragmaClangSectionKind SecKind, StringRef SecName);
10902
10903  /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
10904  void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind,
10905                               SourceLocation PragmaLoc);
10906
10907  /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
10908  void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
10909                       StringRef SlotLabel, Expr *Alignment);
10910
10911  enum class PragmaAlignPackDiagnoseKind {
10912    NonDefaultStateAtInclude,
10913    ChangedStateAtExit
10914  };
10915
10916  void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind,
10917                                         SourceLocation IncludeLoc);
10918  void DiagnoseUnterminatedPragmaAlignPack();
10919
10920  /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
10921  /// strict_gs_check.
10922  void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation,
10923                                          PragmaMsStackAction Action,
10924                                          bool Value);
10925
10926  /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
10927  void ActOnPragmaMSStruct(PragmaMSStructKind Kind);
10928
10929  /// ActOnPragmaMSComment - Called on well formed
10930  /// \#pragma comment(kind, "arg").
10931  void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind,
10932                            StringRef Arg);
10933
10934  /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
10935  /// pointers_to_members(representation method[, general purpose
10936  /// representation]).
10937  void ActOnPragmaMSPointersToMembers(
10938      LangOptions::PragmaMSPointersToMembersKind Kind,
10939      SourceLocation PragmaLoc);
10940
10941  /// Called on well formed \#pragma vtordisp().
10942  void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
10943                             SourceLocation PragmaLoc,
10944                             MSVtorDispMode Value);
10945
10946  enum PragmaSectionKind {
10947    PSK_DataSeg,
10948    PSK_BSSSeg,
10949    PSK_ConstSeg,
10950    PSK_CodeSeg,
10951  };
10952
10953  bool UnifySection(StringRef SectionName, int SectionFlags,
10954                    NamedDecl *TheDecl);
10955  bool UnifySection(StringRef SectionName,
10956                    int SectionFlags,
10957                    SourceLocation PragmaSectionLocation);
10958
10959  /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
10960  void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
10961                        PragmaMsStackAction Action,
10962                        llvm::StringRef StackSlotLabel,
10963                        StringLiteral *SegmentName,
10964                        llvm::StringRef PragmaName);
10965
10966  /// Called on well formed \#pragma section().
10967  void ActOnPragmaMSSection(SourceLocation PragmaLocation,
10968                            int SectionFlags, StringLiteral *SegmentName);
10969
10970  /// Called on well-formed \#pragma init_seg().
10971  void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
10972                            StringLiteral *SegmentName);
10973
10974  /// Called on well-formed \#pragma alloc_text().
10975  void ActOnPragmaMSAllocText(
10976      SourceLocation PragmaLocation, StringRef Section,
10977      const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
10978          &Functions);
10979
10980  /// Called on #pragma clang __debug dump II
10981  void ActOnPragmaDump(Scope *S, SourceLocation Loc, IdentifierInfo *II);
10982
10983  /// Called on #pragma clang __debug dump E
10984  void ActOnPragmaDump(Expr *E);
10985
10986  /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
10987  void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
10988                                 StringRef Value);
10989
10990  /// Are precise floating point semantics currently enabled?
10991  bool isPreciseFPEnabled() {
10992    return !CurFPFeatures.getAllowFPReassociate() &&
10993           !CurFPFeatures.getNoSignedZero() &&
10994           !CurFPFeatures.getAllowReciprocal() &&
10995           !CurFPFeatures.getAllowApproxFunc();
10996  }
10997
10998  void ActOnPragmaFPEvalMethod(SourceLocation Loc,
10999                               LangOptions::FPEvalMethodKind Value);
11000
11001  /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
11002  void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
11003                               PragmaFloatControlKind Value);
11004
11005  /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
11006  void ActOnPragmaUnused(const Token &Identifier,
11007                         Scope *curScope,
11008                         SourceLocation PragmaLoc);
11009
11010  /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
11011  void ActOnPragmaVisibility(const IdentifierInfo* VisType,
11012                             SourceLocation PragmaLoc);
11013
11014  NamedDecl *DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II,
11015                                 SourceLocation Loc);
11016  void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
11017
11018  /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
11019  void ActOnPragmaWeakID(IdentifierInfo* WeakName,
11020                         SourceLocation PragmaLoc,
11021                         SourceLocation WeakNameLoc);
11022
11023  /// ActOnPragmaRedefineExtname - Called on well formed
11024  /// \#pragma redefine_extname oldname newname.
11025  void ActOnPragmaRedefineExtname(IdentifierInfo* WeakName,
11026                                  IdentifierInfo* AliasName,
11027                                  SourceLocation PragmaLoc,
11028                                  SourceLocation WeakNameLoc,
11029                                  SourceLocation AliasNameLoc);
11030
11031  /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
11032  void ActOnPragmaWeakAlias(IdentifierInfo* WeakName,
11033                            IdentifierInfo* AliasName,
11034                            SourceLocation PragmaLoc,
11035                            SourceLocation WeakNameLoc,
11036                            SourceLocation AliasNameLoc);
11037
11038  /// ActOnPragmaFPContract - Called on well formed
11039  /// \#pragma {STDC,OPENCL} FP_CONTRACT and
11040  /// \#pragma clang fp contract
11041  void ActOnPragmaFPContract(SourceLocation Loc, LangOptions::FPModeKind FPC);
11042
11043  /// Called on well formed
11044  /// \#pragma clang fp reassociate
11045  /// or
11046  /// \#pragma clang fp reciprocal
11047  void ActOnPragmaFPValueChangingOption(SourceLocation Loc, PragmaFPKind Kind,
11048                                        bool IsEnabled);
11049
11050  /// ActOnPragmaFenvAccess - Called on well formed
11051  /// \#pragma STDC FENV_ACCESS
11052  void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
11053
11054  /// ActOnPragmaCXLimitedRange - Called on well formed
11055  /// \#pragma STDC CX_LIMITED_RANGE
11056  void ActOnPragmaCXLimitedRange(SourceLocation Loc,
11057                                 LangOptions::ComplexRangeKind Range);
11058
11059  /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
11060  void ActOnPragmaFPExceptions(SourceLocation Loc,
11061                               LangOptions::FPExceptionModeKind);
11062
11063  /// Called to set constant rounding mode for floating point operations.
11064  void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
11065
11066  /// Called to set exception behavior for floating point operations.
11067  void setExceptionMode(SourceLocation Loc, LangOptions::FPExceptionModeKind);
11068
11069  /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
11070  /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
11071  void AddAlignmentAttributesForRecord(RecordDecl *RD);
11072
11073  /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
11074  void AddMsStructLayoutForRecord(RecordDecl *RD);
11075
11076  /// PushNamespaceVisibilityAttr - Note that we've entered a
11077  /// namespace with a visibility attribute.
11078  void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
11079                                   SourceLocation Loc);
11080
11081  /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
11082  /// add an appropriate visibility attribute.
11083  void AddPushedVisibilityAttribute(Decl *RD);
11084
11085  /// PopPragmaVisibility - Pop the top element of the visibility stack; used
11086  /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
11087  void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
11088
11089  /// FreeVisContext - Deallocate and null out VisContext.
11090  void FreeVisContext();
11091
11092  /// AddCFAuditedAttribute - Check whether we're currently within
11093  /// '\#pragma clang arc_cf_code_audited' and, if so, consider adding
11094  /// the appropriate attribute.
11095  void AddCFAuditedAttribute(Decl *D);
11096
11097  void ActOnPragmaAttributeAttribute(ParsedAttr &Attribute,
11098                                     SourceLocation PragmaLoc,
11099                                     attr::ParsedSubjectMatchRuleSet Rules);
11100  void ActOnPragmaAttributeEmptyPush(SourceLocation PragmaLoc,
11101                                     const IdentifierInfo *Namespace);
11102
11103  /// Called on well-formed '\#pragma clang attribute pop'.
11104  void ActOnPragmaAttributePop(SourceLocation PragmaLoc,
11105                               const IdentifierInfo *Namespace);
11106
11107  /// Adds the attributes that have been specified using the
11108  /// '\#pragma clang attribute push' directives to the given declaration.
11109  void AddPragmaAttributes(Scope *S, Decl *D);
11110
11111  void DiagnoseUnterminatedPragmaAttribute();
11112
11113  /// Called on well formed \#pragma clang optimize.
11114  void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
11115
11116  /// #pragma optimize("[optimization-list]", on | off).
11117  void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
11118
11119  /// Call on well formed \#pragma function.
11120  void
11121  ActOnPragmaMSFunction(SourceLocation Loc,
11122                        const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
11123
11124  /// Get the location for the currently active "\#pragma clang optimize
11125  /// off". If this location is invalid, then the state of the pragma is "on".
11126  SourceLocation getOptimizeOffPragmaLocation() const {
11127    return OptimizeOffPragmaLocation;
11128  }
11129
11130  /// Only called on function definitions; if there is a pragma in scope
11131  /// with the effect of a range-based optnone, consider marking the function
11132  /// with attribute optnone.
11133  void AddRangeBasedOptnone(FunctionDecl *FD);
11134
11135  /// Only called on function definitions; if there is a `#pragma alloc_text`
11136  /// that decides which code section the function should be in, add
11137  /// attribute section to the function.
11138  void AddSectionMSAllocText(FunctionDecl *FD);
11139
11140  /// Adds the 'optnone' attribute to the function declaration if there
11141  /// are no conflicts; Loc represents the location causing the 'optnone'
11142  /// attribute to be added (usually because of a pragma).
11143  void AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, SourceLocation Loc);
11144
11145  /// Only called on function definitions; if there is a MSVC #pragma optimize
11146  /// in scope, consider changing the function's attributes based on the
11147  /// optimization list passed to the pragma.
11148  void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD);
11149
11150  /// Only called on function definitions; if there is a pragma in scope
11151  /// with the effect of a range-based no_builtin, consider marking the function
11152  /// with attribute no_builtin.
11153  void AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD);
11154
11155  /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
11156  void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
11157                      bool IsPackExpansion);
11158  void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, TypeSourceInfo *T,
11159                      bool IsPackExpansion);
11160
11161  /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
11162  /// declaration.
11163  void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
11164                            Expr *OE);
11165
11166  /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
11167  /// declaration.
11168  void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
11169                         Expr *ParamExpr);
11170
11171  /// AddAlignValueAttr - Adds an align_value attribute to a particular
11172  /// declaration.
11173  void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
11174
11175  /// AddAnnotationAttr - Adds an annotation Annot with Args arguments to D.
11176  void AddAnnotationAttr(Decl *D, const AttributeCommonInfo &CI,
11177                         StringRef Annot, MutableArrayRef<Expr *> Args);
11178
11179  /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
11180  /// (unless they are value dependent or type dependent). Returns false
11181  /// and emits a diagnostic if one or more of the arguments could not be
11182  /// folded into a constant.
11183  bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI,
11184                            MutableArrayRef<Expr *> Args);
11185
11186  /// Create an CUDALaunchBoundsAttr attribute.
11187  CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
11188                                               Expr *MaxThreads,
11189                                               Expr *MinBlocks,
11190                                               Expr *MaxBlocks);
11191
11192  /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
11193  /// declaration.
11194  void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
11195                           Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
11196
11197  /// AddModeAttr - Adds a mode attribute to a particular declaration.
11198  void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name,
11199                   bool InInstantiation = false);
11200
11201  void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI,
11202                           ParameterABI ABI);
11203
11204  enum class RetainOwnershipKind {NS, CF, OS};
11205  void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI,
11206                        RetainOwnershipKind K, bool IsTemplateInstantiation);
11207
11208  /// Create an AMDGPUWavesPerEUAttr attribute.
11209  AMDGPUFlatWorkGroupSizeAttr *
11210  CreateAMDGPUFlatWorkGroupSizeAttr(const AttributeCommonInfo &CI, Expr *Min,
11211                                    Expr *Max);
11212
11213  /// addAMDGPUFlatWorkGroupSizeAttr - Adds an amdgpu_flat_work_group_size
11214  /// attribute to a particular declaration.
11215  void addAMDGPUFlatWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
11216                                      Expr *Min, Expr *Max);
11217
11218  /// Create an AMDGPUWavesPerEUAttr attribute.
11219  AMDGPUWavesPerEUAttr *
11220  CreateAMDGPUWavesPerEUAttr(const AttributeCommonInfo &CI, Expr *Min,
11221                             Expr *Max);
11222
11223  /// addAMDGPUWavePersEUAttr - Adds an amdgpu_waves_per_eu attribute to a
11224  /// particular declaration.
11225  void addAMDGPUWavesPerEUAttr(Decl *D, const AttributeCommonInfo &CI,
11226                               Expr *Min, Expr *Max);
11227
11228  bool checkNSReturnsRetainedReturnType(SourceLocation loc, QualType type);
11229
11230  //===--------------------------------------------------------------------===//
11231  // C++ Coroutines
11232  //
11233  bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc,
11234                               StringRef Keyword);
11235  ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E);
11236  ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E);
11237  StmtResult ActOnCoreturnStmt(Scope *S, SourceLocation KwLoc, Expr *E);
11238
11239  ExprResult BuildOperatorCoawaitLookupExpr(Scope *S, SourceLocation Loc);
11240  ExprResult BuildOperatorCoawaitCall(SourceLocation Loc, Expr *E,
11241                                      UnresolvedLookupExpr *Lookup);
11242  ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand,
11243                                      Expr *Awaiter, bool IsImplicit = false);
11244  ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand,
11245                                        UnresolvedLookupExpr *Lookup);
11246  ExprResult BuildCoyieldExpr(SourceLocation KwLoc, Expr *E);
11247  StmtResult BuildCoreturnStmt(SourceLocation KwLoc, Expr *E,
11248                               bool IsImplicit = false);
11249  StmtResult BuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs);
11250  bool buildCoroutineParameterMoves(SourceLocation Loc);
11251  VarDecl *buildCoroutinePromise(SourceLocation Loc);
11252  void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body);
11253
11254  // Heuristically tells if the function is `get_return_object` member of a
11255  // coroutine promise_type by matching the function name.
11256  static bool CanBeGetReturnObject(const FunctionDecl *FD);
11257  static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
11258
11259  // As a clang extension, enforces that a non-coroutine function must be marked
11260  // with [[clang::coro_wrapper]] if it returns a type marked with
11261  // [[clang::coro_return_type]].
11262  // Expects that FD is not a coroutine.
11263  void CheckCoroutineWrapper(FunctionDecl *FD);
11264  /// Lookup 'coroutine_traits' in std namespace and std::experimental
11265  /// namespace. The namespace found is recorded in Namespace.
11266  ClassTemplateDecl *lookupCoroutineTraits(SourceLocation KwLoc,
11267                                           SourceLocation FuncLoc);
11268  /// Check that the expression co_await promise.final_suspend() shall not be
11269  /// potentially-throwing.
11270  bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
11271
11272  //===--------------------------------------------------------------------===//
11273  // OpenMP directives and clauses.
11274  //
11275private:
11276  void *VarDataSharingAttributesStack;
11277
11278  struct DeclareTargetContextInfo {
11279    struct MapInfo {
11280      OMPDeclareTargetDeclAttr::MapTypeTy MT;
11281      SourceLocation Loc;
11282    };
11283    /// Explicitly listed variables and functions in a 'to' or 'link' clause.
11284    llvm::DenseMap<NamedDecl *, MapInfo> ExplicitlyMapped;
11285
11286    /// The 'device_type' as parsed from the clause.
11287    OMPDeclareTargetDeclAttr::DevTypeTy DT = OMPDeclareTargetDeclAttr::DT_Any;
11288
11289    /// The directive kind, `begin declare target` or `declare target`.
11290    OpenMPDirectiveKind Kind;
11291
11292    /// The directive with indirect clause.
11293    std::optional<Expr *> Indirect;
11294
11295    /// The directive location.
11296    SourceLocation Loc;
11297
11298    DeclareTargetContextInfo(OpenMPDirectiveKind Kind, SourceLocation Loc)
11299        : Kind(Kind), Loc(Loc) {}
11300  };
11301
11302  /// Number of nested '#pragma omp declare target' directives.
11303  SmallVector<DeclareTargetContextInfo, 4> DeclareTargetNesting;
11304
11305  /// Initialization of data-sharing attributes stack.
11306  void InitDataSharingAttributesStack();
11307  void DestroyDataSharingAttributesStack();
11308
11309  /// Returns OpenMP nesting level for current directive.
11310  unsigned getOpenMPNestingLevel() const;
11311
11312  /// Adjusts the function scopes index for the target-based regions.
11313  void adjustOpenMPTargetScopeIndex(unsigned &FunctionScopesIndex,
11314                                    unsigned Level) const;
11315
11316  /// Returns the number of scopes associated with the construct on the given
11317  /// OpenMP level.
11318  int getNumberOfConstructScopes(unsigned Level) const;
11319
11320  /// Push new OpenMP function region for non-capturing function.
11321  void pushOpenMPFunctionRegion();
11322
11323  /// Pop OpenMP function region for non-capturing function.
11324  void popOpenMPFunctionRegion(const sema::FunctionScopeInfo *OldFSI);
11325
11326  /// Analyzes and checks a loop nest for use by a loop transformation.
11327  ///
11328  /// \param Kind          The loop transformation directive kind.
11329  /// \param NumLoops      How many nested loops the directive is expecting.
11330  /// \param AStmt         Associated statement of the transformation directive.
11331  /// \param LoopHelpers   [out] The loop analysis result.
11332  /// \param Body          [out] The body code nested in \p NumLoops loop.
11333  /// \param OriginalInits [out] Collection of statements and declarations that
11334  ///                      must have been executed/declared before entering the
11335  ///                      loop.
11336  ///
11337  /// \return Whether there was any error.
11338  bool checkTransformableLoopNest(
11339      OpenMPDirectiveKind Kind, Stmt *AStmt, int NumLoops,
11340      SmallVectorImpl<OMPLoopBasedDirective::HelperExprs> &LoopHelpers,
11341      Stmt *&Body,
11342      SmallVectorImpl<SmallVector<llvm::PointerUnion<Stmt *, Decl *>, 0>>
11343          &OriginalInits);
11344
11345  /// Helper to keep information about the current `omp begin/end declare
11346  /// variant` nesting.
11347  struct OMPDeclareVariantScope {
11348    /// The associated OpenMP context selector.
11349    OMPTraitInfo *TI;
11350
11351    /// The associated OpenMP context selector mangling.
11352    std::string NameSuffix;
11353
11354    OMPDeclareVariantScope(OMPTraitInfo &TI);
11355  };
11356
11357  /// Return the OMPTraitInfo for the surrounding scope, if any.
11358  OMPTraitInfo *getOMPTraitInfoForSurroundingScope() {
11359    return OMPDeclareVariantScopes.empty() ? nullptr
11360                                           : OMPDeclareVariantScopes.back().TI;
11361  }
11362
11363  /// The current `omp begin/end declare variant` scopes.
11364  SmallVector<OMPDeclareVariantScope, 4> OMPDeclareVariantScopes;
11365
11366  /// The current `omp begin/end assumes` scopes.
11367  SmallVector<AssumptionAttr *, 4> OMPAssumeScoped;
11368
11369  /// All `omp assumes` we encountered so far.
11370  SmallVector<AssumptionAttr *, 4> OMPAssumeGlobal;
11371
11372  /// OMPD_loop is mapped to OMPD_for, OMPD_distribute or OMPD_simd depending
11373  /// on the parameter of the bind clause. In the methods for the
11374  /// mapped directives, check the parameters of the lastprivate clause.
11375  bool checkLastPrivateForMappedDirectives(ArrayRef<OMPClause *> Clauses);
11376  /// Depending on the bind clause of OMPD_loop map the directive to new
11377  /// directives.
11378  ///    1) loop bind(parallel) --> OMPD_for
11379  ///    2) loop bind(teams) --> OMPD_distribute
11380  ///    3) loop bind(thread) --> OMPD_simd
11381  /// This is being handled in Sema instead of Codegen because of the need for
11382  /// rigorous semantic checking in the new mapped directives.
11383  bool mapLoopConstruct(llvm::SmallVector<OMPClause *> &ClausesWithoutBind,
11384                        ArrayRef<OMPClause *> Clauses,
11385                        OpenMPBindClauseKind &BindKind,
11386                        OpenMPDirectiveKind &Kind,
11387                        OpenMPDirectiveKind &PrevMappedDirective,
11388                        SourceLocation StartLoc, SourceLocation EndLoc,
11389                        const DeclarationNameInfo &DirName,
11390                        OpenMPDirectiveKind CancelRegion);
11391
11392public:
11393  /// The declarator \p D defines a function in the scope \p S which is nested
11394  /// in an `omp begin/end declare variant` scope. In this method we create a
11395  /// declaration for \p D and rename \p D according to the OpenMP context
11396  /// selector of the surrounding scope. Return all base functions in \p Bases.
11397  void ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(
11398      Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists,
11399      SmallVectorImpl<FunctionDecl *> &Bases);
11400
11401  /// Register \p D as specialization of all base functions in \p Bases in the
11402  /// current `omp begin/end declare variant` scope.
11403  void ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(
11404      Decl *D, SmallVectorImpl<FunctionDecl *> &Bases);
11405
11406  /// Act on \p D, a function definition inside of an `omp [begin/end] assumes`.
11407  void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D);
11408
11409  /// Can we exit an OpenMP declare variant scope at the moment.
11410  bool isInOpenMPDeclareVariantScope() const {
11411    return !OMPDeclareVariantScopes.empty();
11412  }
11413
11414  ExprResult
11415  VerifyPositiveIntegerConstantInClause(Expr *Op, OpenMPClauseKind CKind,
11416                                        bool StrictlyPositive = true,
11417                                        bool SuppressExprDiags = false);
11418
11419  /// Given the potential call expression \p Call, determine if there is a
11420  /// specialization via the OpenMP declare variant mechanism available. If
11421  /// there is, return the specialized call expression, otherwise return the
11422  /// original \p Call.
11423  ExprResult ActOnOpenMPCall(ExprResult Call, Scope *Scope,
11424                             SourceLocation LParenLoc, MultiExprArg ArgExprs,
11425                             SourceLocation RParenLoc, Expr *ExecConfig);
11426
11427  /// Handle a `omp begin declare variant`.
11428  void ActOnOpenMPBeginDeclareVariant(SourceLocation Loc, OMPTraitInfo &TI);
11429
11430  /// Handle a `omp end declare variant`.
11431  void ActOnOpenMPEndDeclareVariant();
11432
11433  /// Checks if the variant/multiversion functions are compatible.
11434  bool areMultiversionVariantFunctionsCompatible(
11435      const FunctionDecl *OldFD, const FunctionDecl *NewFD,
11436      const PartialDiagnostic &NoProtoDiagID,
11437      const PartialDiagnosticAt &NoteCausedDiagIDAt,
11438      const PartialDiagnosticAt &NoSupportDiagIDAt,
11439      const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
11440      bool ConstexprSupported, bool CLinkageMayDiffer);
11441
11442  /// Function tries to capture lambda's captured variables in the OpenMP region
11443  /// before the original lambda is captured.
11444  void tryCaptureOpenMPLambdas(ValueDecl *V);
11445
11446  /// Return true if the provided declaration \a VD should be captured by
11447  /// reference.
11448  /// \param Level Relative level of nested OpenMP construct for that the check
11449  /// is performed.
11450  /// \param OpenMPCaptureLevel Capture level within an OpenMP construct.
11451  bool isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level,
11452                             unsigned OpenMPCaptureLevel) const;
11453
11454  /// Check if the specified variable is used in one of the private
11455  /// clauses (private, firstprivate, lastprivate, reduction etc.) in OpenMP
11456  /// constructs.
11457  VarDecl *isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo = false,
11458                                unsigned StopAt = 0);
11459
11460  /// The member expression(this->fd) needs to be rebuilt in the template
11461  /// instantiation to generate private copy for OpenMP when default
11462  /// clause is used. The function will return true if default
11463  /// cluse is used.
11464  bool isOpenMPRebuildMemberExpr(ValueDecl *D);
11465
11466  ExprResult getOpenMPCapturedExpr(VarDecl *Capture, ExprValueKind VK,
11467                                   ExprObjectKind OK, SourceLocation Loc);
11468
11469  /// If the current region is a loop-based region, mark the start of the loop
11470  /// construct.
11471  void startOpenMPLoop();
11472
11473  /// If the current region is a range loop-based region, mark the start of the
11474  /// loop construct.
11475  void startOpenMPCXXRangeFor();
11476
11477  /// Check if the specified variable is used in 'private' clause.
11478  /// \param Level Relative level of nested OpenMP construct for that the check
11479  /// is performed.
11480  OpenMPClauseKind isOpenMPPrivateDecl(ValueDecl *D, unsigned Level,
11481                                       unsigned CapLevel) const;
11482
11483  /// Sets OpenMP capture kind (OMPC_private, OMPC_firstprivate, OMPC_map etc.)
11484  /// for \p FD based on DSA for the provided corresponding captured declaration
11485  /// \p D.
11486  void setOpenMPCaptureKind(FieldDecl *FD, const ValueDecl *D, unsigned Level);
11487
11488  /// Check if the specified variable is captured  by 'target' directive.
11489  /// \param Level Relative level of nested OpenMP construct for that the check
11490  /// is performed.
11491  bool isOpenMPTargetCapturedDecl(const ValueDecl *D, unsigned Level,
11492                                  unsigned CaptureLevel) const;
11493
11494  /// Check if the specified global variable must be captured  by outer capture
11495  /// regions.
11496  /// \param Level Relative level of nested OpenMP construct for that
11497  /// the check is performed.
11498  bool isOpenMPGlobalCapturedDecl(ValueDecl *D, unsigned Level,
11499                                  unsigned CaptureLevel) const;
11500
11501  ExprResult PerformOpenMPImplicitIntegerConversion(SourceLocation OpLoc,
11502                                                    Expr *Op);
11503  /// Called on start of new data sharing attribute block.
11504  void StartOpenMPDSABlock(OpenMPDirectiveKind K,
11505                           const DeclarationNameInfo &DirName, Scope *CurScope,
11506                           SourceLocation Loc);
11507  /// Start analysis of clauses.
11508  void StartOpenMPClause(OpenMPClauseKind K);
11509  /// End analysis of clauses.
11510  void EndOpenMPClause();
11511  /// Called on end of data sharing attribute block.
11512  void EndOpenMPDSABlock(Stmt *CurDirective);
11513
11514  /// Check if the current region is an OpenMP loop region and if it is,
11515  /// mark loop control variable, used in \p Init for loop initialization, as
11516  /// private by default.
11517  /// \param Init First part of the for loop.
11518  void ActOnOpenMPLoopInitialization(SourceLocation ForLoc, Stmt *Init);
11519
11520  /// Called on well-formed '\#pragma omp metadirective' after parsing
11521  /// of the  associated statement.
11522  StmtResult ActOnOpenMPMetaDirective(ArrayRef<OMPClause *> Clauses,
11523                                      Stmt *AStmt, SourceLocation StartLoc,
11524                                      SourceLocation EndLoc);
11525
11526  // OpenMP directives and clauses.
11527  /// Called on correct id-expression from the '#pragma omp
11528  /// threadprivate'.
11529  ExprResult ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec,
11530                                     const DeclarationNameInfo &Id,
11531                                     OpenMPDirectiveKind Kind);
11532  /// Called on well-formed '#pragma omp threadprivate'.
11533  DeclGroupPtrTy ActOnOpenMPThreadprivateDirective(
11534                                     SourceLocation Loc,
11535                                     ArrayRef<Expr *> VarList);
11536  /// Builds a new OpenMPThreadPrivateDecl and checks its correctness.
11537  OMPThreadPrivateDecl *CheckOMPThreadPrivateDecl(SourceLocation Loc,
11538                                                  ArrayRef<Expr *> VarList);
11539  /// Called on well-formed '#pragma omp allocate'.
11540  DeclGroupPtrTy ActOnOpenMPAllocateDirective(SourceLocation Loc,
11541                                              ArrayRef<Expr *> VarList,
11542                                              ArrayRef<OMPClause *> Clauses,
11543                                              DeclContext *Owner = nullptr);
11544
11545  /// Called on well-formed '#pragma omp [begin] assume[s]'.
11546  void ActOnOpenMPAssumesDirective(SourceLocation Loc,
11547                                   OpenMPDirectiveKind DKind,
11548                                   ArrayRef<std::string> Assumptions,
11549                                   bool SkippedClauses);
11550
11551  /// Check if there is an active global `omp begin assumes` directive.
11552  bool isInOpenMPAssumeScope() const { return !OMPAssumeScoped.empty(); }
11553
11554  /// Check if there is an active global `omp assumes` directive.
11555  bool hasGlobalOpenMPAssumes() const { return !OMPAssumeGlobal.empty(); }
11556
11557  /// Called on well-formed '#pragma omp end assumes'.
11558  void ActOnOpenMPEndAssumesDirective();
11559
11560  /// Called on well-formed '#pragma omp requires'.
11561  DeclGroupPtrTy ActOnOpenMPRequiresDirective(SourceLocation Loc,
11562                                              ArrayRef<OMPClause *> ClauseList);
11563  /// Check restrictions on Requires directive
11564  OMPRequiresDecl *CheckOMPRequiresDecl(SourceLocation Loc,
11565                                        ArrayRef<OMPClause *> Clauses);
11566  /// Check if the specified type is allowed to be used in 'omp declare
11567  /// reduction' construct.
11568  QualType ActOnOpenMPDeclareReductionType(SourceLocation TyLoc,
11569                                           TypeResult ParsedType);
11570  /// Called on start of '#pragma omp declare reduction'.
11571  DeclGroupPtrTy ActOnOpenMPDeclareReductionDirectiveStart(
11572      Scope *S, DeclContext *DC, DeclarationName Name,
11573      ArrayRef<std::pair<QualType, SourceLocation>> ReductionTypes,
11574      AccessSpecifier AS, Decl *PrevDeclInScope = nullptr);
11575  /// Initialize declare reduction construct initializer.
11576  void ActOnOpenMPDeclareReductionCombinerStart(Scope *S, Decl *D);
11577  /// Finish current declare reduction construct initializer.
11578  void ActOnOpenMPDeclareReductionCombinerEnd(Decl *D, Expr *Combiner);
11579  /// Initialize declare reduction construct initializer.
11580  /// \return omp_priv variable.
11581  VarDecl *ActOnOpenMPDeclareReductionInitializerStart(Scope *S, Decl *D);
11582  /// Finish current declare reduction construct initializer.
11583  void ActOnOpenMPDeclareReductionInitializerEnd(Decl *D, Expr *Initializer,
11584                                                 VarDecl *OmpPrivParm);
11585  /// Called at the end of '#pragma omp declare reduction'.
11586  DeclGroupPtrTy ActOnOpenMPDeclareReductionDirectiveEnd(
11587      Scope *S, DeclGroupPtrTy DeclReductions, bool IsValid);
11588
11589  /// Check variable declaration in 'omp declare mapper' construct.
11590  TypeResult ActOnOpenMPDeclareMapperVarDecl(Scope *S, Declarator &D);
11591  /// Check if the specified type is allowed to be used in 'omp declare
11592  /// mapper' construct.
11593  QualType ActOnOpenMPDeclareMapperType(SourceLocation TyLoc,
11594                                        TypeResult ParsedType);
11595  /// Called on start of '#pragma omp declare mapper'.
11596  DeclGroupPtrTy ActOnOpenMPDeclareMapperDirective(
11597      Scope *S, DeclContext *DC, DeclarationName Name, QualType MapperType,
11598      SourceLocation StartLoc, DeclarationName VN, AccessSpecifier AS,
11599      Expr *MapperVarRef, ArrayRef<OMPClause *> Clauses,
11600      Decl *PrevDeclInScope = nullptr);
11601  /// Build the mapper variable of '#pragma omp declare mapper'.
11602  ExprResult ActOnOpenMPDeclareMapperDirectiveVarDecl(Scope *S,
11603                                                      QualType MapperType,
11604                                                      SourceLocation StartLoc,
11605                                                      DeclarationName VN);
11606  void ActOnOpenMPIteratorVarDecl(VarDecl *VD);
11607  bool isOpenMPDeclareMapperVarDeclAllowed(const VarDecl *VD) const;
11608  const ValueDecl *getOpenMPDeclareMapperVarName() const;
11609
11610  /// Called on the start of target region i.e. '#pragma omp declare target'.
11611  bool ActOnStartOpenMPDeclareTargetContext(DeclareTargetContextInfo &DTCI);
11612
11613  /// Called at the end of target region i.e. '#pragma omp end declare target'.
11614  const DeclareTargetContextInfo ActOnOpenMPEndDeclareTargetDirective();
11615
11616  /// Called once a target context is completed, that can be when a
11617  /// '#pragma omp end declare target' was encountered or when a
11618  /// '#pragma omp declare target' without declaration-definition-seq was
11619  /// encountered.
11620  void ActOnFinishedOpenMPDeclareTargetContext(DeclareTargetContextInfo &DTCI);
11621
11622  /// Report unterminated 'omp declare target' or 'omp begin declare target' at
11623  /// the end of a compilation unit.
11624  void DiagnoseUnterminatedOpenMPDeclareTarget();
11625
11626  /// Searches for the provided declaration name for OpenMP declare target
11627  /// directive.
11628  NamedDecl *lookupOpenMPDeclareTargetName(Scope *CurScope,
11629                                           CXXScopeSpec &ScopeSpec,
11630                                           const DeclarationNameInfo &Id);
11631
11632  /// Called on correct id-expression from the '#pragma omp declare target'.
11633  void ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc,
11634                                    OMPDeclareTargetDeclAttr::MapTypeTy MT,
11635                                    DeclareTargetContextInfo &DTCI);
11636
11637  /// Check declaration inside target region.
11638  void
11639  checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D,
11640                                   SourceLocation IdLoc = SourceLocation());
11641
11642  /// Adds OMPDeclareTargetDeclAttr to referenced variables in declare target
11643  /// directive.
11644  void ActOnOpenMPDeclareTargetInitializer(Decl *D);
11645
11646  /// Finishes analysis of the deferred functions calls that may be declared as
11647  /// host/nohost during device/host compilation.
11648  void finalizeOpenMPDelayedAnalysis(const FunctionDecl *Caller,
11649                                     const FunctionDecl *Callee,
11650                                     SourceLocation Loc);
11651
11652  /// Return true if currently in OpenMP task with untied clause context.
11653  bool isInOpenMPTaskUntiedContext() const;
11654
11655  /// Return true inside OpenMP declare target region.
11656  bool isInOpenMPDeclareTargetContext() const {
11657    return !DeclareTargetNesting.empty();
11658  }
11659  /// Return true inside OpenMP target region.
11660  bool isInOpenMPTargetExecutionDirective() const;
11661
11662  /// Return the number of captured regions created for an OpenMP directive.
11663  static int getOpenMPCaptureLevels(OpenMPDirectiveKind Kind);
11664
11665  /// Initialization of captured region for OpenMP region.
11666  void ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope);
11667
11668  /// Called for syntactical loops (ForStmt or CXXForRangeStmt) associated to
11669  /// an OpenMP loop directive.
11670  StmtResult ActOnOpenMPCanonicalLoop(Stmt *AStmt);
11671
11672  /// Process a canonical OpenMP loop nest that can either be a canonical
11673  /// literal loop (ForStmt or CXXForRangeStmt), or the generated loop of an
11674  /// OpenMP loop transformation construct.
11675  StmtResult ActOnOpenMPLoopnest(Stmt *AStmt);
11676
11677  /// End of OpenMP region.
11678  ///
11679  /// \param S Statement associated with the current OpenMP region.
11680  /// \param Clauses List of clauses for the current OpenMP region.
11681  ///
11682  /// \returns Statement for finished OpenMP region.
11683  StmtResult ActOnOpenMPRegionEnd(StmtResult S, ArrayRef<OMPClause *> Clauses);
11684  StmtResult ActOnOpenMPExecutableDirective(
11685      OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName,
11686      OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses,
11687      Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc,
11688      OpenMPDirectiveKind PrevMappedDirective = llvm::omp::OMPD_unknown);
11689  /// Called on well-formed '\#pragma omp parallel' after parsing
11690  /// of the  associated statement.
11691  StmtResult ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
11692                                          Stmt *AStmt,
11693                                          SourceLocation StartLoc,
11694                                          SourceLocation EndLoc);
11695  using VarsWithInheritedDSAType =
11696      llvm::SmallDenseMap<const ValueDecl *, const Expr *, 4>;
11697  /// Called on well-formed '\#pragma omp simd' after parsing
11698  /// of the associated statement.
11699  StmtResult
11700  ActOnOpenMPSimdDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11701                           SourceLocation StartLoc, SourceLocation EndLoc,
11702                           VarsWithInheritedDSAType &VarsWithImplicitDSA);
11703  /// Called on well-formed '#pragma omp tile' after parsing of its clauses and
11704  /// the associated statement.
11705  StmtResult ActOnOpenMPTileDirective(ArrayRef<OMPClause *> Clauses,
11706                                      Stmt *AStmt, SourceLocation StartLoc,
11707                                      SourceLocation EndLoc);
11708  /// Called on well-formed '#pragma omp unroll' after parsing of its clauses
11709  /// and the associated statement.
11710  StmtResult ActOnOpenMPUnrollDirective(ArrayRef<OMPClause *> Clauses,
11711                                        Stmt *AStmt, SourceLocation StartLoc,
11712                                        SourceLocation EndLoc);
11713  /// Called on well-formed '\#pragma omp for' after parsing
11714  /// of the associated statement.
11715  StmtResult
11716  ActOnOpenMPForDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11717                          SourceLocation StartLoc, SourceLocation EndLoc,
11718                          VarsWithInheritedDSAType &VarsWithImplicitDSA);
11719  /// Called on well-formed '\#pragma omp for simd' after parsing
11720  /// of the associated statement.
11721  StmtResult
11722  ActOnOpenMPForSimdDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11723                              SourceLocation StartLoc, SourceLocation EndLoc,
11724                              VarsWithInheritedDSAType &VarsWithImplicitDSA);
11725  /// Called on well-formed '\#pragma omp sections' after parsing
11726  /// of the associated statement.
11727  StmtResult ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
11728                                          Stmt *AStmt, SourceLocation StartLoc,
11729                                          SourceLocation EndLoc);
11730  /// Called on well-formed '\#pragma omp section' after parsing of the
11731  /// associated statement.
11732  StmtResult ActOnOpenMPSectionDirective(Stmt *AStmt, SourceLocation StartLoc,
11733                                         SourceLocation EndLoc);
11734  /// Called on well-formed '\#pragma omp scope' after parsing of the
11735  /// associated statement.
11736  StmtResult ActOnOpenMPScopeDirective(ArrayRef<OMPClause *> Clauses,
11737                                       Stmt *AStmt, SourceLocation StartLoc,
11738                                       SourceLocation EndLoc);
11739  /// Called on well-formed '\#pragma omp single' after parsing of the
11740  /// associated statement.
11741  StmtResult ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
11742                                        Stmt *AStmt, SourceLocation StartLoc,
11743                                        SourceLocation EndLoc);
11744  /// Called on well-formed '\#pragma omp master' after parsing of the
11745  /// associated statement.
11746  StmtResult ActOnOpenMPMasterDirective(Stmt *AStmt, SourceLocation StartLoc,
11747                                        SourceLocation EndLoc);
11748  /// Called on well-formed '\#pragma omp critical' after parsing of the
11749  /// associated statement.
11750  StmtResult ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName,
11751                                          ArrayRef<OMPClause *> Clauses,
11752                                          Stmt *AStmt, SourceLocation StartLoc,
11753                                          SourceLocation EndLoc);
11754  /// Called on well-formed '\#pragma omp parallel for' after parsing
11755  /// of the  associated statement.
11756  StmtResult ActOnOpenMPParallelForDirective(
11757      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11758      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11759  /// Called on well-formed '\#pragma omp parallel for simd' after
11760  /// parsing of the  associated statement.
11761  StmtResult ActOnOpenMPParallelForSimdDirective(
11762      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11763      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11764  /// Called on well-formed '\#pragma omp parallel master' after
11765  /// parsing of the  associated statement.
11766  StmtResult ActOnOpenMPParallelMasterDirective(ArrayRef<OMPClause *> Clauses,
11767                                                Stmt *AStmt,
11768                                                SourceLocation StartLoc,
11769                                                SourceLocation EndLoc);
11770  /// Called on well-formed '\#pragma omp parallel masked' after
11771  /// parsing of the associated statement.
11772  StmtResult ActOnOpenMPParallelMaskedDirective(ArrayRef<OMPClause *> Clauses,
11773                                                Stmt *AStmt,
11774                                                SourceLocation StartLoc,
11775                                                SourceLocation EndLoc);
11776  /// Called on well-formed '\#pragma omp parallel sections' after
11777  /// parsing of the  associated statement.
11778  StmtResult ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
11779                                                  Stmt *AStmt,
11780                                                  SourceLocation StartLoc,
11781                                                  SourceLocation EndLoc);
11782  /// Called on well-formed '\#pragma omp task' after parsing of the
11783  /// associated statement.
11784  StmtResult ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
11785                                      Stmt *AStmt, SourceLocation StartLoc,
11786                                      SourceLocation EndLoc);
11787  /// Called on well-formed '\#pragma omp taskyield'.
11788  StmtResult ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
11789                                           SourceLocation EndLoc);
11790  /// Called on well-formed '\#pragma omp error'.
11791  /// Error direcitive is allowed in both declared and excutable contexts.
11792  /// Adding InExContext to identify which context is called from.
11793  StmtResult ActOnOpenMPErrorDirective(ArrayRef<OMPClause *> Clauses,
11794                                       SourceLocation StartLoc,
11795                                       SourceLocation EndLoc,
11796                                       bool InExContext = true);
11797  /// Called on well-formed '\#pragma omp barrier'.
11798  StmtResult ActOnOpenMPBarrierDirective(SourceLocation StartLoc,
11799                                         SourceLocation EndLoc);
11800  /// Called on well-formed '\#pragma omp taskwait'.
11801  StmtResult ActOnOpenMPTaskwaitDirective(ArrayRef<OMPClause *> Clauses,
11802                                          SourceLocation StartLoc,
11803                                          SourceLocation EndLoc);
11804  /// Called on well-formed '\#pragma omp taskgroup'.
11805  StmtResult ActOnOpenMPTaskgroupDirective(ArrayRef<OMPClause *> Clauses,
11806                                           Stmt *AStmt, SourceLocation StartLoc,
11807                                           SourceLocation EndLoc);
11808  /// Called on well-formed '\#pragma omp flush'.
11809  StmtResult ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses,
11810                                       SourceLocation StartLoc,
11811                                       SourceLocation EndLoc);
11812  /// Called on well-formed '\#pragma omp depobj'.
11813  StmtResult ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses,
11814                                        SourceLocation StartLoc,
11815                                        SourceLocation EndLoc);
11816  /// Called on well-formed '\#pragma omp scan'.
11817  StmtResult ActOnOpenMPScanDirective(ArrayRef<OMPClause *> Clauses,
11818                                      SourceLocation StartLoc,
11819                                      SourceLocation EndLoc);
11820  /// Called on well-formed '\#pragma omp ordered' after parsing of the
11821  /// associated statement.
11822  StmtResult ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
11823                                         Stmt *AStmt, SourceLocation StartLoc,
11824                                         SourceLocation EndLoc);
11825  /// Called on well-formed '\#pragma omp atomic' after parsing of the
11826  /// associated statement.
11827  StmtResult ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses,
11828                                        Stmt *AStmt, SourceLocation StartLoc,
11829                                        SourceLocation EndLoc);
11830  /// Called on well-formed '\#pragma omp target' after parsing of the
11831  /// associated statement.
11832  StmtResult ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses,
11833                                        Stmt *AStmt, SourceLocation StartLoc,
11834                                        SourceLocation EndLoc);
11835  /// Called on well-formed '\#pragma omp target data' after parsing of
11836  /// the associated statement.
11837  StmtResult ActOnOpenMPTargetDataDirective(ArrayRef<OMPClause *> Clauses,
11838                                            Stmt *AStmt, SourceLocation StartLoc,
11839                                            SourceLocation EndLoc);
11840  /// Called on well-formed '\#pragma omp target enter data' after
11841  /// parsing of the associated statement.
11842  StmtResult ActOnOpenMPTargetEnterDataDirective(ArrayRef<OMPClause *> Clauses,
11843                                                 SourceLocation StartLoc,
11844                                                 SourceLocation EndLoc,
11845                                                 Stmt *AStmt);
11846  /// Called on well-formed '\#pragma omp target exit data' after
11847  /// parsing of the associated statement.
11848  StmtResult ActOnOpenMPTargetExitDataDirective(ArrayRef<OMPClause *> Clauses,
11849                                                SourceLocation StartLoc,
11850                                                SourceLocation EndLoc,
11851                                                Stmt *AStmt);
11852  /// Called on well-formed '\#pragma omp target parallel' after
11853  /// parsing of the associated statement.
11854  StmtResult ActOnOpenMPTargetParallelDirective(ArrayRef<OMPClause *> Clauses,
11855                                                Stmt *AStmt,
11856                                                SourceLocation StartLoc,
11857                                                SourceLocation EndLoc);
11858  /// Called on well-formed '\#pragma omp target parallel for' after
11859  /// parsing of the  associated statement.
11860  StmtResult ActOnOpenMPTargetParallelForDirective(
11861      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11862      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11863  /// Called on well-formed '\#pragma omp teams' after parsing of the
11864  /// associated statement.
11865  StmtResult ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses,
11866                                       Stmt *AStmt, SourceLocation StartLoc,
11867                                       SourceLocation EndLoc);
11868  /// Called on well-formed '\#pragma omp teams loop' after parsing of the
11869  /// associated statement.
11870  StmtResult ActOnOpenMPTeamsGenericLoopDirective(
11871      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11872      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11873  /// Called on well-formed '\#pragma omp target teams loop' after parsing of
11874  /// the associated statement.
11875  StmtResult ActOnOpenMPTargetTeamsGenericLoopDirective(
11876      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11877      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11878  /// Called on well-formed '\#pragma omp parallel loop' after parsing of the
11879  /// associated statement.
11880  StmtResult ActOnOpenMPParallelGenericLoopDirective(
11881      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11882      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11883  /// Called on well-formed '\#pragma omp target parallel loop' after parsing
11884  /// of the associated statement.
11885  StmtResult ActOnOpenMPTargetParallelGenericLoopDirective(
11886      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11887      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11888  /// Called on well-formed '\#pragma omp cancellation point'.
11889  StmtResult
11890  ActOnOpenMPCancellationPointDirective(SourceLocation StartLoc,
11891                                        SourceLocation EndLoc,
11892                                        OpenMPDirectiveKind CancelRegion);
11893  /// Called on well-formed '\#pragma omp cancel'.
11894  StmtResult ActOnOpenMPCancelDirective(ArrayRef<OMPClause *> Clauses,
11895                                        SourceLocation StartLoc,
11896                                        SourceLocation EndLoc,
11897                                        OpenMPDirectiveKind CancelRegion);
11898  /// Called on well-formed '\#pragma omp taskloop' after parsing of the
11899  /// associated statement.
11900  StmtResult
11901  ActOnOpenMPTaskLoopDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11902                               SourceLocation StartLoc, SourceLocation EndLoc,
11903                               VarsWithInheritedDSAType &VarsWithImplicitDSA);
11904  /// Called on well-formed '\#pragma omp taskloop simd' after parsing of
11905  /// the associated statement.
11906  StmtResult ActOnOpenMPTaskLoopSimdDirective(
11907      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11908      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11909  /// Called on well-formed '\#pragma omp master taskloop' after parsing of the
11910  /// associated statement.
11911  StmtResult ActOnOpenMPMasterTaskLoopDirective(
11912      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11913      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11914  /// Called on well-formed '\#pragma omp master taskloop simd' after parsing of
11915  /// the associated statement.
11916  StmtResult ActOnOpenMPMasterTaskLoopSimdDirective(
11917      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11918      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11919  /// Called on well-formed '\#pragma omp parallel master taskloop' after
11920  /// parsing of the associated statement.
11921  StmtResult ActOnOpenMPParallelMasterTaskLoopDirective(
11922      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11923      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11924  /// Called on well-formed '\#pragma omp parallel master taskloop simd' after
11925  /// parsing of the associated statement.
11926  StmtResult ActOnOpenMPParallelMasterTaskLoopSimdDirective(
11927      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11928      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11929  /// Called on well-formed '\#pragma omp masked taskloop' after parsing of the
11930  /// associated statement.
11931  StmtResult ActOnOpenMPMaskedTaskLoopDirective(
11932      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11933      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11934  /// Called on well-formed '\#pragma omp masked taskloop simd' after parsing of
11935  /// the associated statement.
11936  StmtResult ActOnOpenMPMaskedTaskLoopSimdDirective(
11937      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11938      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11939  /// Called on well-formed '\#pragma omp parallel masked taskloop' after
11940  /// parsing of the associated statement.
11941  StmtResult ActOnOpenMPParallelMaskedTaskLoopDirective(
11942      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11943      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11944  /// Called on well-formed '\#pragma omp parallel masked taskloop simd' after
11945  /// parsing of the associated statement.
11946  StmtResult ActOnOpenMPParallelMaskedTaskLoopSimdDirective(
11947      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11948      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11949  /// Called on well-formed '\#pragma omp distribute' after parsing
11950  /// of the associated statement.
11951  StmtResult
11952  ActOnOpenMPDistributeDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11953                                 SourceLocation StartLoc, SourceLocation EndLoc,
11954                                 VarsWithInheritedDSAType &VarsWithImplicitDSA);
11955  /// Called on well-formed '\#pragma omp target update'.
11956  StmtResult ActOnOpenMPTargetUpdateDirective(ArrayRef<OMPClause *> Clauses,
11957                                              SourceLocation StartLoc,
11958                                              SourceLocation EndLoc,
11959                                              Stmt *AStmt);
11960  /// Called on well-formed '\#pragma omp distribute parallel for' after
11961  /// parsing of the associated statement.
11962  StmtResult ActOnOpenMPDistributeParallelForDirective(
11963      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11964      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11965  /// Called on well-formed '\#pragma omp distribute parallel for simd'
11966  /// after parsing of the associated statement.
11967  StmtResult ActOnOpenMPDistributeParallelForSimdDirective(
11968      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11969      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11970  /// Called on well-formed '\#pragma omp distribute simd' after
11971  /// parsing of the associated statement.
11972  StmtResult ActOnOpenMPDistributeSimdDirective(
11973      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11974      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11975  /// Called on well-formed '\#pragma omp target parallel for simd' after
11976  /// parsing of the associated statement.
11977  StmtResult ActOnOpenMPTargetParallelForSimdDirective(
11978      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11979      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11980  /// Called on well-formed '\#pragma omp target simd' after parsing of
11981  /// the associated statement.
11982  StmtResult
11983  ActOnOpenMPTargetSimdDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
11984                                 SourceLocation StartLoc, SourceLocation EndLoc,
11985                                 VarsWithInheritedDSAType &VarsWithImplicitDSA);
11986  /// Called on well-formed '\#pragma omp teams distribute' after parsing of
11987  /// the associated statement.
11988  StmtResult ActOnOpenMPTeamsDistributeDirective(
11989      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11990      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11991  /// Called on well-formed '\#pragma omp teams distribute simd' after parsing
11992  /// of the associated statement.
11993  StmtResult ActOnOpenMPTeamsDistributeSimdDirective(
11994      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
11995      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
11996  /// Called on well-formed '\#pragma omp teams distribute parallel for simd'
11997  /// after parsing of the associated statement.
11998  StmtResult ActOnOpenMPTeamsDistributeParallelForSimdDirective(
11999      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12000      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12001  /// Called on well-formed '\#pragma omp teams distribute parallel for'
12002  /// after parsing of the associated statement.
12003  StmtResult ActOnOpenMPTeamsDistributeParallelForDirective(
12004      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12005      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12006  /// Called on well-formed '\#pragma omp target teams' after parsing of the
12007  /// associated statement.
12008  StmtResult ActOnOpenMPTargetTeamsDirective(ArrayRef<OMPClause *> Clauses,
12009                                             Stmt *AStmt,
12010                                             SourceLocation StartLoc,
12011                                             SourceLocation EndLoc);
12012  /// Called on well-formed '\#pragma omp target teams distribute' after parsing
12013  /// of the associated statement.
12014  StmtResult ActOnOpenMPTargetTeamsDistributeDirective(
12015      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12016      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12017  /// Called on well-formed '\#pragma omp target teams distribute parallel for'
12018  /// after parsing of the associated statement.
12019  StmtResult ActOnOpenMPTargetTeamsDistributeParallelForDirective(
12020      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12021      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12022  /// Called on well-formed '\#pragma omp target teams distribute parallel for
12023  /// simd' after parsing of the associated statement.
12024  StmtResult ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective(
12025      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12026      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12027  /// Called on well-formed '\#pragma omp target teams distribute simd' after
12028  /// parsing of the associated statement.
12029  StmtResult ActOnOpenMPTargetTeamsDistributeSimdDirective(
12030      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12031      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12032  /// Called on well-formed '\#pragma omp interop'.
12033  StmtResult ActOnOpenMPInteropDirective(ArrayRef<OMPClause *> Clauses,
12034                                         SourceLocation StartLoc,
12035                                         SourceLocation EndLoc);
12036  /// Called on well-formed '\#pragma omp dispatch' after parsing of the
12037  // /associated statement.
12038  StmtResult ActOnOpenMPDispatchDirective(ArrayRef<OMPClause *> Clauses,
12039                                          Stmt *AStmt, SourceLocation StartLoc,
12040                                          SourceLocation EndLoc);
12041  /// Called on well-formed '\#pragma omp masked' after parsing of the
12042  // /associated statement.
12043  StmtResult ActOnOpenMPMaskedDirective(ArrayRef<OMPClause *> Clauses,
12044                                        Stmt *AStmt, SourceLocation StartLoc,
12045                                        SourceLocation EndLoc);
12046
12047  /// Called on well-formed '\#pragma omp loop' after parsing of the
12048  /// associated statement.
12049  StmtResult ActOnOpenMPGenericLoopDirective(
12050      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
12051      SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA);
12052
12053  /// Checks correctness of linear modifiers.
12054  bool CheckOpenMPLinearModifier(OpenMPLinearClauseKind LinKind,
12055                                 SourceLocation LinLoc);
12056  /// Checks that the specified declaration matches requirements for the linear
12057  /// decls.
12058  bool CheckOpenMPLinearDecl(const ValueDecl *D, SourceLocation ELoc,
12059                             OpenMPLinearClauseKind LinKind, QualType Type,
12060                             bool IsDeclareSimd = false);
12061
12062  /// Called on well-formed '\#pragma omp declare simd' after parsing of
12063  /// the associated method/function.
12064  DeclGroupPtrTy ActOnOpenMPDeclareSimdDirective(
12065      DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS,
12066      Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds,
12067      ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears,
12068      ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR);
12069
12070  /// Checks '\#pragma omp declare variant' variant function and original
12071  /// functions after parsing of the associated method/function.
12072  /// \param DG Function declaration to which declare variant directive is
12073  /// applied to.
12074  /// \param VariantRef Expression that references the variant function, which
12075  /// must be used instead of the original one, specified in \p DG.
12076  /// \param TI The trait info object representing the match clause.
12077  /// \param NumAppendArgs The number of omp_interop_t arguments to account for
12078  /// in checking.
12079  /// \returns std::nullopt, if the function/variant function are not compatible
12080  /// with the pragma, pair of original function/variant ref expression
12081  /// otherwise.
12082  std::optional<std::pair<FunctionDecl *, Expr *>>
12083  checkOpenMPDeclareVariantFunction(DeclGroupPtrTy DG, Expr *VariantRef,
12084                                    OMPTraitInfo &TI, unsigned NumAppendArgs,
12085                                    SourceRange SR);
12086
12087  /// Called on well-formed '\#pragma omp declare variant' after parsing of
12088  /// the associated method/function.
12089  /// \param FD Function declaration to which declare variant directive is
12090  /// applied to.
12091  /// \param VariantRef Expression that references the variant function, which
12092  /// must be used instead of the original one, specified in \p DG.
12093  /// \param TI The context traits associated with the function variant.
12094  /// \param AdjustArgsNothing The list of 'nothing' arguments.
12095  /// \param AdjustArgsNeedDevicePtr The list of 'need_device_ptr' arguments.
12096  /// \param AppendArgs The list of 'append_args' arguments.
12097  /// \param AdjustArgsLoc The Location of an 'adjust_args' clause.
12098  /// \param AppendArgsLoc The Location of an 'append_args' clause.
12099  /// \param SR The SourceRange of the 'declare variant' directive.
12100  void ActOnOpenMPDeclareVariantDirective(
12101      FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI,
12102      ArrayRef<Expr *> AdjustArgsNothing,
12103      ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
12104      ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc,
12105      SourceLocation AppendArgsLoc, SourceRange SR);
12106
12107  OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
12108                                         Expr *Expr,
12109                                         SourceLocation StartLoc,
12110                                         SourceLocation LParenLoc,
12111                                         SourceLocation EndLoc);
12112  /// Called on well-formed 'allocator' clause.
12113  OMPClause *ActOnOpenMPAllocatorClause(Expr *Allocator,
12114                                        SourceLocation StartLoc,
12115                                        SourceLocation LParenLoc,
12116                                        SourceLocation EndLoc);
12117  /// Called on well-formed 'if' clause.
12118  OMPClause *ActOnOpenMPIfClause(OpenMPDirectiveKind NameModifier,
12119                                 Expr *Condition, SourceLocation StartLoc,
12120                                 SourceLocation LParenLoc,
12121                                 SourceLocation NameModifierLoc,
12122                                 SourceLocation ColonLoc,
12123                                 SourceLocation EndLoc);
12124  /// Called on well-formed 'final' clause.
12125  OMPClause *ActOnOpenMPFinalClause(Expr *Condition, SourceLocation StartLoc,
12126                                    SourceLocation LParenLoc,
12127                                    SourceLocation EndLoc);
12128  /// Called on well-formed 'num_threads' clause.
12129  OMPClause *ActOnOpenMPNumThreadsClause(Expr *NumThreads,
12130                                         SourceLocation StartLoc,
12131                                         SourceLocation LParenLoc,
12132                                         SourceLocation EndLoc);
12133  /// Called on well-formed 'align' clause.
12134  OMPClause *ActOnOpenMPAlignClause(Expr *Alignment, SourceLocation StartLoc,
12135                                    SourceLocation LParenLoc,
12136                                    SourceLocation EndLoc);
12137  /// Called on well-formed 'safelen' clause.
12138  OMPClause *ActOnOpenMPSafelenClause(Expr *Length,
12139                                      SourceLocation StartLoc,
12140                                      SourceLocation LParenLoc,
12141                                      SourceLocation EndLoc);
12142  /// Called on well-formed 'simdlen' clause.
12143  OMPClause *ActOnOpenMPSimdlenClause(Expr *Length, SourceLocation StartLoc,
12144                                      SourceLocation LParenLoc,
12145                                      SourceLocation EndLoc);
12146  /// Called on well-form 'sizes' clause.
12147  OMPClause *ActOnOpenMPSizesClause(ArrayRef<Expr *> SizeExprs,
12148                                    SourceLocation StartLoc,
12149                                    SourceLocation LParenLoc,
12150                                    SourceLocation EndLoc);
12151  /// Called on well-form 'full' clauses.
12152  OMPClause *ActOnOpenMPFullClause(SourceLocation StartLoc,
12153                                   SourceLocation EndLoc);
12154  /// Called on well-form 'partial' clauses.
12155  OMPClause *ActOnOpenMPPartialClause(Expr *FactorExpr, SourceLocation StartLoc,
12156                                      SourceLocation LParenLoc,
12157                                      SourceLocation EndLoc);
12158  /// Called on well-formed 'collapse' clause.
12159  OMPClause *ActOnOpenMPCollapseClause(Expr *NumForLoops,
12160                                       SourceLocation StartLoc,
12161                                       SourceLocation LParenLoc,
12162                                       SourceLocation EndLoc);
12163  /// Called on well-formed 'ordered' clause.
12164  OMPClause *
12165  ActOnOpenMPOrderedClause(SourceLocation StartLoc, SourceLocation EndLoc,
12166                           SourceLocation LParenLoc = SourceLocation(),
12167                           Expr *NumForLoops = nullptr);
12168  /// Called on well-formed 'grainsize' clause.
12169  OMPClause *ActOnOpenMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
12170                                        Expr *Size, SourceLocation StartLoc,
12171                                        SourceLocation LParenLoc,
12172                                        SourceLocation ModifierLoc,
12173                                        SourceLocation EndLoc);
12174  /// Called on well-formed 'num_tasks' clause.
12175  OMPClause *ActOnOpenMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
12176                                       Expr *NumTasks, SourceLocation StartLoc,
12177                                       SourceLocation LParenLoc,
12178                                       SourceLocation ModifierLoc,
12179                                       SourceLocation EndLoc);
12180  /// Called on well-formed 'hint' clause.
12181  OMPClause *ActOnOpenMPHintClause(Expr *Hint, SourceLocation StartLoc,
12182                                   SourceLocation LParenLoc,
12183                                   SourceLocation EndLoc);
12184  /// Called on well-formed 'detach' clause.
12185  OMPClause *ActOnOpenMPDetachClause(Expr *Evt, SourceLocation StartLoc,
12186                                     SourceLocation LParenLoc,
12187                                     SourceLocation EndLoc);
12188
12189  OMPClause *ActOnOpenMPSimpleClause(OpenMPClauseKind Kind,
12190                                     unsigned Argument,
12191                                     SourceLocation ArgumentLoc,
12192                                     SourceLocation StartLoc,
12193                                     SourceLocation LParenLoc,
12194                                     SourceLocation EndLoc);
12195  /// Called on well-formed 'when' clause.
12196  OMPClause *ActOnOpenMPWhenClause(OMPTraitInfo &TI, SourceLocation StartLoc,
12197                                   SourceLocation LParenLoc,
12198                                   SourceLocation EndLoc);
12199  /// Called on well-formed 'default' clause.
12200  OMPClause *ActOnOpenMPDefaultClause(llvm::omp::DefaultKind Kind,
12201                                      SourceLocation KindLoc,
12202                                      SourceLocation StartLoc,
12203                                      SourceLocation LParenLoc,
12204                                      SourceLocation EndLoc);
12205  /// Called on well-formed 'proc_bind' clause.
12206  OMPClause *ActOnOpenMPProcBindClause(llvm::omp::ProcBindKind Kind,
12207                                       SourceLocation KindLoc,
12208                                       SourceLocation StartLoc,
12209                                       SourceLocation LParenLoc,
12210                                       SourceLocation EndLoc);
12211  /// Called on well-formed 'order' clause.
12212  OMPClause *ActOnOpenMPOrderClause(OpenMPOrderClauseModifier Modifier,
12213                                    OpenMPOrderClauseKind Kind,
12214                                    SourceLocation StartLoc,
12215                                    SourceLocation LParenLoc,
12216                                    SourceLocation MLoc, SourceLocation KindLoc,
12217                                    SourceLocation EndLoc);
12218  /// Called on well-formed 'update' clause.
12219  OMPClause *ActOnOpenMPUpdateClause(OpenMPDependClauseKind Kind,
12220                                     SourceLocation KindLoc,
12221                                     SourceLocation StartLoc,
12222                                     SourceLocation LParenLoc,
12223                                     SourceLocation EndLoc);
12224
12225  OMPClause *ActOnOpenMPSingleExprWithArgClause(
12226      OpenMPClauseKind Kind, ArrayRef<unsigned> Arguments, Expr *Expr,
12227      SourceLocation StartLoc, SourceLocation LParenLoc,
12228      ArrayRef<SourceLocation> ArgumentsLoc, SourceLocation DelimLoc,
12229      SourceLocation EndLoc);
12230  /// Called on well-formed 'schedule' clause.
12231  OMPClause *ActOnOpenMPScheduleClause(
12232      OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
12233      OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
12234      SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
12235      SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc);
12236
12237  OMPClause *ActOnOpenMPClause(OpenMPClauseKind Kind, SourceLocation StartLoc,
12238                               SourceLocation EndLoc);
12239  /// Called on well-formed 'nowait' clause.
12240  OMPClause *ActOnOpenMPNowaitClause(SourceLocation StartLoc,
12241                                     SourceLocation EndLoc);
12242  /// Called on well-formed 'untied' clause.
12243  OMPClause *ActOnOpenMPUntiedClause(SourceLocation StartLoc,
12244                                     SourceLocation EndLoc);
12245  /// Called on well-formed 'mergeable' clause.
12246  OMPClause *ActOnOpenMPMergeableClause(SourceLocation StartLoc,
12247                                        SourceLocation EndLoc);
12248  /// Called on well-formed 'read' clause.
12249  OMPClause *ActOnOpenMPReadClause(SourceLocation StartLoc,
12250                                   SourceLocation EndLoc);
12251  /// Called on well-formed 'write' clause.
12252  OMPClause *ActOnOpenMPWriteClause(SourceLocation StartLoc,
12253                                    SourceLocation EndLoc);
12254  /// Called on well-formed 'update' clause.
12255  OMPClause *ActOnOpenMPUpdateClause(SourceLocation StartLoc,
12256                                     SourceLocation EndLoc);
12257  /// Called on well-formed 'capture' clause.
12258  OMPClause *ActOnOpenMPCaptureClause(SourceLocation StartLoc,
12259                                      SourceLocation EndLoc);
12260  /// Called on well-formed 'compare' clause.
12261  OMPClause *ActOnOpenMPCompareClause(SourceLocation StartLoc,
12262                                      SourceLocation EndLoc);
12263  /// Called on well-formed 'fail' clause.
12264  OMPClause *ActOnOpenMPFailClause(SourceLocation StartLoc,
12265                                   SourceLocation EndLoc);
12266  OMPClause *ActOnOpenMPFailClause(
12267      OpenMPClauseKind Kind, SourceLocation KindLoc,
12268      SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
12269
12270  /// Called on well-formed 'seq_cst' clause.
12271  OMPClause *ActOnOpenMPSeqCstClause(SourceLocation StartLoc,
12272                                     SourceLocation EndLoc);
12273  /// Called on well-formed 'acq_rel' clause.
12274  OMPClause *ActOnOpenMPAcqRelClause(SourceLocation StartLoc,
12275                                     SourceLocation EndLoc);
12276  /// Called on well-formed 'acquire' clause.
12277  OMPClause *ActOnOpenMPAcquireClause(SourceLocation StartLoc,
12278                                      SourceLocation EndLoc);
12279  /// Called on well-formed 'release' clause.
12280  OMPClause *ActOnOpenMPReleaseClause(SourceLocation StartLoc,
12281                                      SourceLocation EndLoc);
12282  /// Called on well-formed 'relaxed' clause.
12283  OMPClause *ActOnOpenMPRelaxedClause(SourceLocation StartLoc,
12284                                      SourceLocation EndLoc);
12285
12286  /// Called on well-formed 'init' clause.
12287  OMPClause *
12288  ActOnOpenMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
12289                        SourceLocation StartLoc, SourceLocation LParenLoc,
12290                        SourceLocation VarLoc, SourceLocation EndLoc);
12291
12292  /// Called on well-formed 'use' clause.
12293  OMPClause *ActOnOpenMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
12294                                  SourceLocation LParenLoc,
12295                                  SourceLocation VarLoc, SourceLocation EndLoc);
12296
12297  /// Called on well-formed 'destroy' clause.
12298  OMPClause *ActOnOpenMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
12299                                      SourceLocation LParenLoc,
12300                                      SourceLocation VarLoc,
12301                                      SourceLocation EndLoc);
12302  /// Called on well-formed 'novariants' clause.
12303  OMPClause *ActOnOpenMPNovariantsClause(Expr *Condition,
12304                                         SourceLocation StartLoc,
12305                                         SourceLocation LParenLoc,
12306                                         SourceLocation EndLoc);
12307  /// Called on well-formed 'nocontext' clause.
12308  OMPClause *ActOnOpenMPNocontextClause(Expr *Condition,
12309                                        SourceLocation StartLoc,
12310                                        SourceLocation LParenLoc,
12311                                        SourceLocation EndLoc);
12312  /// Called on well-formed 'filter' clause.
12313  OMPClause *ActOnOpenMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
12314                                     SourceLocation LParenLoc,
12315                                     SourceLocation EndLoc);
12316  /// Called on well-formed 'threads' clause.
12317  OMPClause *ActOnOpenMPThreadsClause(SourceLocation StartLoc,
12318                                      SourceLocation EndLoc);
12319  /// Called on well-formed 'simd' clause.
12320  OMPClause *ActOnOpenMPSIMDClause(SourceLocation StartLoc,
12321                                   SourceLocation EndLoc);
12322  /// Called on well-formed 'nogroup' clause.
12323  OMPClause *ActOnOpenMPNogroupClause(SourceLocation StartLoc,
12324                                      SourceLocation EndLoc);
12325  /// Called on well-formed 'unified_address' clause.
12326  OMPClause *ActOnOpenMPUnifiedAddressClause(SourceLocation StartLoc,
12327                                             SourceLocation EndLoc);
12328
12329  /// Called on well-formed 'unified_address' clause.
12330  OMPClause *ActOnOpenMPUnifiedSharedMemoryClause(SourceLocation StartLoc,
12331                                                  SourceLocation EndLoc);
12332
12333  /// Called on well-formed 'reverse_offload' clause.
12334  OMPClause *ActOnOpenMPReverseOffloadClause(SourceLocation StartLoc,
12335                                             SourceLocation EndLoc);
12336
12337  /// Called on well-formed 'dynamic_allocators' clause.
12338  OMPClause *ActOnOpenMPDynamicAllocatorsClause(SourceLocation StartLoc,
12339                                                SourceLocation EndLoc);
12340
12341  /// Called on well-formed 'atomic_default_mem_order' clause.
12342  OMPClause *ActOnOpenMPAtomicDefaultMemOrderClause(
12343      OpenMPAtomicDefaultMemOrderClauseKind Kind, SourceLocation KindLoc,
12344      SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
12345
12346  /// Called on well-formed 'at' clause.
12347  OMPClause *ActOnOpenMPAtClause(OpenMPAtClauseKind Kind,
12348                                 SourceLocation KindLoc,
12349                                 SourceLocation StartLoc,
12350                                 SourceLocation LParenLoc,
12351                                 SourceLocation EndLoc);
12352
12353  /// Called on well-formed 'severity' clause.
12354  OMPClause *ActOnOpenMPSeverityClause(OpenMPSeverityClauseKind Kind,
12355                                       SourceLocation KindLoc,
12356                                       SourceLocation StartLoc,
12357                                       SourceLocation LParenLoc,
12358                                       SourceLocation EndLoc);
12359
12360  /// Called on well-formed 'message' clause.
12361  /// passing string for message.
12362  OMPClause *ActOnOpenMPMessageClause(Expr *MS, SourceLocation StartLoc,
12363                                      SourceLocation LParenLoc,
12364                                      SourceLocation EndLoc);
12365
12366  /// Data used for processing a list of variables in OpenMP clauses.
12367  struct OpenMPVarListDataTy final {
12368    Expr *DepModOrTailExpr = nullptr;
12369    Expr *IteratorExpr = nullptr;
12370    SourceLocation ColonLoc;
12371    SourceLocation RLoc;
12372    CXXScopeSpec ReductionOrMapperIdScopeSpec;
12373    DeclarationNameInfo ReductionOrMapperId;
12374    int ExtraModifier = -1; ///< Additional modifier for linear, map, depend or
12375                            ///< lastprivate clause.
12376    SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
12377        MapTypeModifiers;
12378    SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
12379        MapTypeModifiersLoc;
12380    SmallVector<OpenMPMotionModifierKind, NumberOfOMPMotionModifiers>
12381        MotionModifiers;
12382    SmallVector<SourceLocation, NumberOfOMPMotionModifiers> MotionModifiersLoc;
12383    bool IsMapTypeImplicit = false;
12384    SourceLocation ExtraModifierLoc;
12385    SourceLocation OmpAllMemoryLoc;
12386    SourceLocation
12387        StepModifierLoc; /// 'step' modifier location for linear clause
12388  };
12389
12390  OMPClause *ActOnOpenMPVarListClause(OpenMPClauseKind Kind,
12391                                      ArrayRef<Expr *> Vars,
12392                                      const OMPVarListLocTy &Locs,
12393                                      OpenMPVarListDataTy &Data);
12394  /// Called on well-formed 'inclusive' clause.
12395  OMPClause *ActOnOpenMPInclusiveClause(ArrayRef<Expr *> VarList,
12396                                        SourceLocation StartLoc,
12397                                        SourceLocation LParenLoc,
12398                                        SourceLocation EndLoc);
12399  /// Called on well-formed 'exclusive' clause.
12400  OMPClause *ActOnOpenMPExclusiveClause(ArrayRef<Expr *> VarList,
12401                                        SourceLocation StartLoc,
12402                                        SourceLocation LParenLoc,
12403                                        SourceLocation EndLoc);
12404  /// Called on well-formed 'allocate' clause.
12405  OMPClause *
12406  ActOnOpenMPAllocateClause(Expr *Allocator, ArrayRef<Expr *> VarList,
12407                            SourceLocation StartLoc, SourceLocation ColonLoc,
12408                            SourceLocation LParenLoc, SourceLocation EndLoc);
12409  /// Called on well-formed 'private' clause.
12410  OMPClause *ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
12411                                      SourceLocation StartLoc,
12412                                      SourceLocation LParenLoc,
12413                                      SourceLocation EndLoc);
12414  /// Called on well-formed 'firstprivate' clause.
12415  OMPClause *ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,
12416                                           SourceLocation StartLoc,
12417                                           SourceLocation LParenLoc,
12418                                           SourceLocation EndLoc);
12419  /// Called on well-formed 'lastprivate' clause.
12420  OMPClause *ActOnOpenMPLastprivateClause(
12421      ArrayRef<Expr *> VarList, OpenMPLastprivateModifier LPKind,
12422      SourceLocation LPKindLoc, SourceLocation ColonLoc,
12423      SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
12424  /// Called on well-formed 'shared' clause.
12425  OMPClause *ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
12426                                     SourceLocation StartLoc,
12427                                     SourceLocation LParenLoc,
12428                                     SourceLocation EndLoc);
12429  /// Called on well-formed 'reduction' clause.
12430  OMPClause *ActOnOpenMPReductionClause(
12431      ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
12432      SourceLocation StartLoc, SourceLocation LParenLoc,
12433      SourceLocation ModifierLoc, SourceLocation ColonLoc,
12434      SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
12435      const DeclarationNameInfo &ReductionId,
12436      ArrayRef<Expr *> UnresolvedReductions = std::nullopt);
12437  /// Called on well-formed 'task_reduction' clause.
12438  OMPClause *ActOnOpenMPTaskReductionClause(
12439      ArrayRef<Expr *> VarList, SourceLocation StartLoc,
12440      SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
12441      CXXScopeSpec &ReductionIdScopeSpec,
12442      const DeclarationNameInfo &ReductionId,
12443      ArrayRef<Expr *> UnresolvedReductions = std::nullopt);
12444  /// Called on well-formed 'in_reduction' clause.
12445  OMPClause *ActOnOpenMPInReductionClause(
12446      ArrayRef<Expr *> VarList, SourceLocation StartLoc,
12447      SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
12448      CXXScopeSpec &ReductionIdScopeSpec,
12449      const DeclarationNameInfo &ReductionId,
12450      ArrayRef<Expr *> UnresolvedReductions = std::nullopt);
12451  /// Called on well-formed 'linear' clause.
12452  OMPClause *ActOnOpenMPLinearClause(
12453      ArrayRef<Expr *> VarList, Expr *Step, SourceLocation StartLoc,
12454      SourceLocation LParenLoc, OpenMPLinearClauseKind LinKind,
12455      SourceLocation LinLoc, SourceLocation ColonLoc,
12456      SourceLocation StepModifierLoc, SourceLocation EndLoc);
12457  /// Called on well-formed 'aligned' clause.
12458  OMPClause *ActOnOpenMPAlignedClause(ArrayRef<Expr *> VarList,
12459                                      Expr *Alignment,
12460                                      SourceLocation StartLoc,
12461                                      SourceLocation LParenLoc,
12462                                      SourceLocation ColonLoc,
12463                                      SourceLocation EndLoc);
12464  /// Called on well-formed 'copyin' clause.
12465  OMPClause *ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList,
12466                                     SourceLocation StartLoc,
12467                                     SourceLocation LParenLoc,
12468                                     SourceLocation EndLoc);
12469  /// Called on well-formed 'copyprivate' clause.
12470  OMPClause *ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
12471                                          SourceLocation StartLoc,
12472                                          SourceLocation LParenLoc,
12473                                          SourceLocation EndLoc);
12474  /// Called on well-formed 'flush' pseudo clause.
12475  OMPClause *ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList,
12476                                    SourceLocation StartLoc,
12477                                    SourceLocation LParenLoc,
12478                                    SourceLocation EndLoc);
12479  /// Called on well-formed 'depobj' pseudo clause.
12480  OMPClause *ActOnOpenMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
12481                                     SourceLocation LParenLoc,
12482                                     SourceLocation EndLoc);
12483  /// Called on well-formed 'depend' clause.
12484  OMPClause *ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data,
12485                                     Expr *DepModifier,
12486                                     ArrayRef<Expr *> VarList,
12487                                     SourceLocation StartLoc,
12488                                     SourceLocation LParenLoc,
12489                                     SourceLocation EndLoc);
12490  /// Called on well-formed 'device' clause.
12491  OMPClause *ActOnOpenMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
12492                                     Expr *Device, SourceLocation StartLoc,
12493                                     SourceLocation LParenLoc,
12494                                     SourceLocation ModifierLoc,
12495                                     SourceLocation EndLoc);
12496  /// Called on well-formed 'map' clause.
12497  OMPClause *ActOnOpenMPMapClause(
12498      Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
12499      ArrayRef<SourceLocation> MapTypeModifiersLoc,
12500      CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId,
12501      OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
12502      SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
12503      const OMPVarListLocTy &Locs, bool NoDiagnose = false,
12504      ArrayRef<Expr *> UnresolvedMappers = std::nullopt);
12505  /// Called on well-formed 'num_teams' clause.
12506  OMPClause *ActOnOpenMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
12507                                       SourceLocation LParenLoc,
12508                                       SourceLocation EndLoc);
12509  /// Called on well-formed 'thread_limit' clause.
12510  OMPClause *ActOnOpenMPThreadLimitClause(Expr *ThreadLimit,
12511                                          SourceLocation StartLoc,
12512                                          SourceLocation LParenLoc,
12513                                          SourceLocation EndLoc);
12514  /// Called on well-formed 'priority' clause.
12515  OMPClause *ActOnOpenMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
12516                                       SourceLocation LParenLoc,
12517                                       SourceLocation EndLoc);
12518  /// Called on well-formed 'dist_schedule' clause.
12519  OMPClause *ActOnOpenMPDistScheduleClause(
12520      OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize,
12521      SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation KindLoc,
12522      SourceLocation CommaLoc, SourceLocation EndLoc);
12523  /// Called on well-formed 'defaultmap' clause.
12524  OMPClause *ActOnOpenMPDefaultmapClause(
12525      OpenMPDefaultmapClauseModifier M, OpenMPDefaultmapClauseKind Kind,
12526      SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc,
12527      SourceLocation KindLoc, SourceLocation EndLoc);
12528  /// Called on well-formed 'to' clause.
12529  OMPClause *
12530  ActOnOpenMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
12531                      ArrayRef<SourceLocation> MotionModifiersLoc,
12532                      CXXScopeSpec &MapperIdScopeSpec,
12533                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
12534                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
12535                      ArrayRef<Expr *> UnresolvedMappers = std::nullopt);
12536  /// Called on well-formed 'from' clause.
12537  OMPClause *
12538  ActOnOpenMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
12539                        ArrayRef<SourceLocation> MotionModifiersLoc,
12540                        CXXScopeSpec &MapperIdScopeSpec,
12541                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
12542                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
12543                        ArrayRef<Expr *> UnresolvedMappers = std::nullopt);
12544  /// Called on well-formed 'use_device_ptr' clause.
12545  OMPClause *ActOnOpenMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
12546                                           const OMPVarListLocTy &Locs);
12547  /// Called on well-formed 'use_device_addr' clause.
12548  OMPClause *ActOnOpenMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
12549                                            const OMPVarListLocTy &Locs);
12550  /// Called on well-formed 'is_device_ptr' clause.
12551  OMPClause *ActOnOpenMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
12552                                          const OMPVarListLocTy &Locs);
12553  /// Called on well-formed 'has_device_addr' clause.
12554  OMPClause *ActOnOpenMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
12555                                            const OMPVarListLocTy &Locs);
12556  /// Called on well-formed 'nontemporal' clause.
12557  OMPClause *ActOnOpenMPNontemporalClause(ArrayRef<Expr *> VarList,
12558                                          SourceLocation StartLoc,
12559                                          SourceLocation LParenLoc,
12560                                          SourceLocation EndLoc);
12561
12562  /// Data for list of allocators.
12563  struct UsesAllocatorsData {
12564    /// Allocator.
12565    Expr *Allocator = nullptr;
12566    /// Allocator traits.
12567    Expr *AllocatorTraits = nullptr;
12568    /// Locations of '(' and ')' symbols.
12569    SourceLocation LParenLoc, RParenLoc;
12570  };
12571  /// Called on well-formed 'uses_allocators' clause.
12572  OMPClause *ActOnOpenMPUsesAllocatorClause(SourceLocation StartLoc,
12573                                            SourceLocation LParenLoc,
12574                                            SourceLocation EndLoc,
12575                                            ArrayRef<UsesAllocatorsData> Data);
12576  /// Called on well-formed 'affinity' clause.
12577  OMPClause *ActOnOpenMPAffinityClause(SourceLocation StartLoc,
12578                                       SourceLocation LParenLoc,
12579                                       SourceLocation ColonLoc,
12580                                       SourceLocation EndLoc, Expr *Modifier,
12581                                       ArrayRef<Expr *> Locators);
12582  /// Called on a well-formed 'bind' clause.
12583  OMPClause *ActOnOpenMPBindClause(OpenMPBindClauseKind Kind,
12584                                   SourceLocation KindLoc,
12585                                   SourceLocation StartLoc,
12586                                   SourceLocation LParenLoc,
12587                                   SourceLocation EndLoc);
12588
12589  /// Called on a well-formed 'ompx_dyn_cgroup_mem' clause.
12590  OMPClause *ActOnOpenMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
12591                                            SourceLocation LParenLoc,
12592                                            SourceLocation EndLoc);
12593
12594  /// Called on well-formed 'doacross' clause.
12595  OMPClause *
12596  ActOnOpenMPDoacrossClause(OpenMPDoacrossClauseModifier DepType,
12597                            SourceLocation DepLoc, SourceLocation ColonLoc,
12598                            ArrayRef<Expr *> VarList, SourceLocation StartLoc,
12599                            SourceLocation LParenLoc, SourceLocation EndLoc);
12600
12601  /// Called on a well-formed 'ompx_attribute' clause.
12602  OMPClause *ActOnOpenMPXAttributeClause(ArrayRef<const Attr *> Attrs,
12603                                         SourceLocation StartLoc,
12604                                         SourceLocation LParenLoc,
12605                                         SourceLocation EndLoc);
12606
12607  /// Called on a well-formed 'ompx_bare' clause.
12608  OMPClause *ActOnOpenMPXBareClause(SourceLocation StartLoc,
12609                                    SourceLocation EndLoc);
12610
12611  /// The kind of conversion being performed.
12612  enum CheckedConversionKind {
12613    /// An implicit conversion.
12614    CCK_ImplicitConversion,
12615    /// A C-style cast.
12616    CCK_CStyleCast,
12617    /// A functional-style cast.
12618    CCK_FunctionalCast,
12619    /// A cast other than a C-style cast.
12620    CCK_OtherCast,
12621    /// A conversion for an operand of a builtin overloaded operator.
12622    CCK_ForBuiltinOverloadedOp
12623  };
12624
12625  static bool isCast(CheckedConversionKind CCK) {
12626    return CCK == CCK_CStyleCast || CCK == CCK_FunctionalCast ||
12627           CCK == CCK_OtherCast;
12628  }
12629
12630  /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
12631  /// cast.  If there is already an implicit cast, merge into the existing one.
12632  /// If isLvalue, the result of the cast is an lvalue.
12633  ExprResult
12634  ImpCastExprToType(Expr *E, QualType Type, CastKind CK,
12635                    ExprValueKind VK = VK_PRValue,
12636                    const CXXCastPath *BasePath = nullptr,
12637                    CheckedConversionKind CCK = CCK_ImplicitConversion);
12638
12639  /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
12640  /// to the conversion from scalar type ScalarTy to the Boolean type.
12641  static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy);
12642
12643  /// IgnoredValueConversions - Given that an expression's result is
12644  /// syntactically ignored, perform any conversions that are
12645  /// required.
12646  ExprResult IgnoredValueConversions(Expr *E);
12647
12648  // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
12649  // functions and arrays to their respective pointers (C99 6.3.2.1).
12650  ExprResult UsualUnaryConversions(Expr *E);
12651
12652  /// CallExprUnaryConversions - a special case of an unary conversion
12653  /// performed on a function designator of a call expression.
12654  ExprResult CallExprUnaryConversions(Expr *E);
12655
12656  // DefaultFunctionArrayConversion - converts functions and arrays
12657  // to their respective pointers (C99 6.3.2.1).
12658  ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose = true);
12659
12660  // DefaultFunctionArrayLvalueConversion - converts functions and
12661  // arrays to their respective pointers and performs the
12662  // lvalue-to-rvalue conversion.
12663  ExprResult DefaultFunctionArrayLvalueConversion(Expr *E,
12664                                                  bool Diagnose = true);
12665
12666  // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
12667  // the operand. This function is a no-op if the operand has a function type
12668  // or an array type.
12669  ExprResult DefaultLvalueConversion(Expr *E);
12670
12671  // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
12672  // do not have a prototype. Integer promotions are performed on each
12673  // argument, and arguments that have type float are promoted to double.
12674  ExprResult DefaultArgumentPromotion(Expr *E);
12675
12676  /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
12677  /// it as an xvalue. In C++98, the result will still be a prvalue, because
12678  /// we don't have xvalues there.
12679  ExprResult TemporaryMaterializationConversion(Expr *E);
12680
12681  // Used for emitting the right warning by DefaultVariadicArgumentPromotion
12682  enum VariadicCallType {
12683    VariadicFunction,
12684    VariadicBlock,
12685    VariadicMethod,
12686    VariadicConstructor,
12687    VariadicDoesNotApply
12688  };
12689
12690  VariadicCallType getVariadicCallType(FunctionDecl *FDecl,
12691                                       const FunctionProtoType *Proto,
12692                                       Expr *Fn);
12693
12694  // Used for determining in which context a type is allowed to be passed to a
12695  // vararg function.
12696  enum VarArgKind {
12697    VAK_Valid,
12698    VAK_ValidInCXX11,
12699    VAK_Undefined,
12700    VAK_MSVCUndefined,
12701    VAK_Invalid
12702  };
12703
12704  // Determines which VarArgKind fits an expression.
12705  VarArgKind isValidVarArgType(const QualType &Ty);
12706
12707  /// Check to see if the given expression is a valid argument to a variadic
12708  /// function, issuing a diagnostic if not.
12709  void checkVariadicArgument(const Expr *E, VariadicCallType CT);
12710
12711  /// Check whether the given statement can have musttail applied to it,
12712  /// issuing a diagnostic and returning false if not. In the success case,
12713  /// the statement is rewritten to remove implicit nodes from the return
12714  /// value.
12715  bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
12716
12717private:
12718  /// Check whether the given statement can have musttail applied to it,
12719  /// issuing a diagnostic and returning false if not.
12720  bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
12721
12722public:
12723  /// Check to see if a given expression could have '.c_str()' called on it.
12724  bool hasCStrMethod(const Expr *E);
12725
12726  /// GatherArgumentsForCall - Collector argument expressions for various
12727  /// form of call prototypes.
12728  bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl,
12729                              const FunctionProtoType *Proto,
12730                              unsigned FirstParam, ArrayRef<Expr *> Args,
12731                              SmallVectorImpl<Expr *> &AllArgs,
12732                              VariadicCallType CallType = VariadicDoesNotApply,
12733                              bool AllowExplicit = false,
12734                              bool IsListInitialization = false);
12735
12736  // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
12737  // will create a runtime trap if the resulting type is not a POD type.
12738  ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
12739                                              FunctionDecl *FDecl);
12740
12741  /// Context in which we're performing a usual arithmetic conversion.
12742  enum ArithConvKind {
12743    /// An arithmetic operation.
12744    ACK_Arithmetic,
12745    /// A bitwise operation.
12746    ACK_BitwiseOp,
12747    /// A comparison.
12748    ACK_Comparison,
12749    /// A conditional (?:) operator.
12750    ACK_Conditional,
12751    /// A compound assignment expression.
12752    ACK_CompAssign,
12753  };
12754
12755  // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
12756  // operands and then handles various conversions that are common to binary
12757  // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
12758  // routine returns the first non-arithmetic type found. The client is
12759  // responsible for emitting appropriate error diagnostics.
12760  QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS,
12761                                      SourceLocation Loc, ArithConvKind ACK);
12762
12763  /// AssignConvertType - All of the 'assignment' semantic checks return this
12764  /// enum to indicate whether the assignment was allowed.  These checks are
12765  /// done for simple assignments, as well as initialization, return from
12766  /// function, argument passing, etc.  The query is phrased in terms of a
12767  /// source and destination type.
12768  enum AssignConvertType {
12769    /// Compatible - the types are compatible according to the standard.
12770    Compatible,
12771
12772    /// PointerToInt - The assignment converts a pointer to an int, which we
12773    /// accept as an extension.
12774    PointerToInt,
12775
12776    /// IntToPointer - The assignment converts an int to a pointer, which we
12777    /// accept as an extension.
12778    IntToPointer,
12779
12780    /// FunctionVoidPointer - The assignment is between a function pointer and
12781    /// void*, which the standard doesn't allow, but we accept as an extension.
12782    FunctionVoidPointer,
12783
12784    /// IncompatiblePointer - The assignment is between two pointers types that
12785    /// are not compatible, but we accept them as an extension.
12786    IncompatiblePointer,
12787
12788    /// IncompatibleFunctionPointer - The assignment is between two function
12789    /// pointers types that are not compatible, but we accept them as an
12790    /// extension.
12791    IncompatibleFunctionPointer,
12792
12793    /// IncompatibleFunctionPointerStrict - The assignment is between two
12794    /// function pointer types that are not identical, but are compatible,
12795    /// unless compiled with -fsanitize=cfi, in which case the type mismatch
12796    /// may trip an indirect call runtime check.
12797    IncompatibleFunctionPointerStrict,
12798
12799    /// IncompatiblePointerSign - The assignment is between two pointers types
12800    /// which point to integers which have a different sign, but are otherwise
12801    /// identical. This is a subset of the above, but broken out because it's by
12802    /// far the most common case of incompatible pointers.
12803    IncompatiblePointerSign,
12804
12805    /// CompatiblePointerDiscardsQualifiers - The assignment discards
12806    /// c/v/r qualifiers, which we accept as an extension.
12807    CompatiblePointerDiscardsQualifiers,
12808
12809    /// IncompatiblePointerDiscardsQualifiers - The assignment
12810    /// discards qualifiers that we don't permit to be discarded,
12811    /// like address spaces.
12812    IncompatiblePointerDiscardsQualifiers,
12813
12814    /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
12815    /// changes address spaces in nested pointer types which is not allowed.
12816    /// For instance, converting __private int ** to __generic int ** is
12817    /// illegal even though __private could be converted to __generic.
12818    IncompatibleNestedPointerAddressSpaceMismatch,
12819
12820    /// IncompatibleNestedPointerQualifiers - The assignment is between two
12821    /// nested pointer types, and the qualifiers other than the first two
12822    /// levels differ e.g. char ** -> const char **, but we accept them as an
12823    /// extension.
12824    IncompatibleNestedPointerQualifiers,
12825
12826    /// IncompatibleVectors - The assignment is between two vector types that
12827    /// have the same size, which we accept as an extension.
12828    IncompatibleVectors,
12829
12830    /// IntToBlockPointer - The assignment converts an int to a block
12831    /// pointer. We disallow this.
12832    IntToBlockPointer,
12833
12834    /// IncompatibleBlockPointer - The assignment is between two block
12835    /// pointers types that are not compatible.
12836    IncompatibleBlockPointer,
12837
12838    /// IncompatibleObjCQualifiedId - The assignment is between a qualified
12839    /// id type and something else (that is incompatible with it). For example,
12840    /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
12841    IncompatibleObjCQualifiedId,
12842
12843    /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
12844    /// object with __weak qualifier.
12845    IncompatibleObjCWeakRef,
12846
12847    /// Incompatible - We reject this conversion outright, it is invalid to
12848    /// represent it in the AST.
12849    Incompatible
12850  };
12851
12852  /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
12853  /// assignment conversion type specified by ConvTy.  This returns true if the
12854  /// conversion was invalid or false if the conversion was accepted.
12855  bool DiagnoseAssignmentResult(AssignConvertType ConvTy,
12856                                SourceLocation Loc,
12857                                QualType DstType, QualType SrcType,
12858                                Expr *SrcExpr, AssignmentAction Action,
12859                                bool *Complained = nullptr);
12860
12861  /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
12862  /// enum. If AllowMask is true, then we also allow the complement of a valid
12863  /// value, to be used as a mask.
12864  bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
12865                         bool AllowMask) const;
12866
12867  /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
12868  /// integer not in the range of enum values.
12869  void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
12870                              Expr *SrcExpr);
12871
12872  /// CheckAssignmentConstraints - Perform type checking for assignment,
12873  /// argument passing, variable initialization, and function return values.
12874  /// C99 6.5.16.
12875  AssignConvertType CheckAssignmentConstraints(SourceLocation Loc,
12876                                               QualType LHSType,
12877                                               QualType RHSType);
12878
12879  /// Check assignment constraints and optionally prepare for a conversion of
12880  /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
12881  /// is true.
12882  AssignConvertType CheckAssignmentConstraints(QualType LHSType,
12883                                               ExprResult &RHS,
12884                                               CastKind &Kind,
12885                                               bool ConvertRHS = true);
12886
12887  /// Check assignment constraints for an assignment of RHS to LHSType.
12888  ///
12889  /// \param LHSType The destination type for the assignment.
12890  /// \param RHS The source expression for the assignment.
12891  /// \param Diagnose If \c true, diagnostics may be produced when checking
12892  ///        for assignability. If a diagnostic is produced, \p RHS will be
12893  ///        set to ExprError(). Note that this function may still return
12894  ///        without producing a diagnostic, even for an invalid assignment.
12895  /// \param DiagnoseCFAudited If \c true, the target is a function parameter
12896  ///        in an audited Core Foundation API and does not need to be checked
12897  ///        for ARC retain issues.
12898  /// \param ConvertRHS If \c true, \p RHS will be updated to model the
12899  ///        conversions necessary to perform the assignment. If \c false,
12900  ///        \p Diagnose must also be \c false.
12901  AssignConvertType CheckSingleAssignmentConstraints(
12902      QualType LHSType, ExprResult &RHS, bool Diagnose = true,
12903      bool DiagnoseCFAudited = false, bool ConvertRHS = true);
12904
12905  // If the lhs type is a transparent union, check whether we
12906  // can initialize the transparent union with the given expression.
12907  AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType,
12908                                                             ExprResult &RHS);
12909
12910  bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType);
12911
12912  bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
12913
12914  ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
12915                                       AssignmentAction Action,
12916                                       bool AllowExplicit = false);
12917  ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
12918                                       const ImplicitConversionSequence& ICS,
12919                                       AssignmentAction Action,
12920                                       CheckedConversionKind CCK
12921                                          = CCK_ImplicitConversion);
12922  ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
12923                                       const StandardConversionSequence& SCS,
12924                                       AssignmentAction Action,
12925                                       CheckedConversionKind CCK);
12926
12927  ExprResult PerformQualificationConversion(
12928      Expr *E, QualType Ty, ExprValueKind VK = VK_PRValue,
12929      CheckedConversionKind CCK = CCK_ImplicitConversion);
12930
12931  /// the following "Check" methods will return a valid/converted QualType
12932  /// or a null QualType (indicating an error diagnostic was issued).
12933
12934  /// type checking binary operators (subroutines of CreateBuiltinBinOp).
12935  QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS,
12936                           ExprResult &RHS);
12937  QualType InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS,
12938                                 ExprResult &RHS);
12939  QualType CheckPointerToMemberOperands( // C++ 5.5
12940    ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK,
12941    SourceLocation OpLoc, bool isIndirect);
12942  QualType CheckMultiplyDivideOperands( // C99 6.5.5
12943    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign,
12944    bool IsDivide);
12945  QualType CheckRemainderOperands( // C99 6.5.5
12946    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12947    bool IsCompAssign = false);
12948  QualType CheckAdditionOperands( // C99 6.5.6
12949    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12950    BinaryOperatorKind Opc, QualType* CompLHSTy = nullptr);
12951  QualType CheckSubtractionOperands( // C99 6.5.6
12952    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12953    QualType* CompLHSTy = nullptr);
12954  QualType CheckShiftOperands( // C99 6.5.7
12955    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12956    BinaryOperatorKind Opc, bool IsCompAssign = false);
12957  void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE);
12958  QualType CheckCompareOperands( // C99 6.5.8/9
12959      ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12960      BinaryOperatorKind Opc);
12961  QualType CheckBitwiseOperands( // C99 6.5.[10...12]
12962      ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12963      BinaryOperatorKind Opc);
12964  QualType CheckLogicalOperands( // C99 6.5.[13,14]
12965    ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
12966    BinaryOperatorKind Opc);
12967  // CheckAssignmentOperands is used for both simple and compound assignment.
12968  // For simple assignment, pass both expressions and a null converted type.
12969  // For compound assignment, pass both expressions and the converted type.
12970  QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
12971      Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
12972      BinaryOperatorKind Opc);
12973
12974  ExprResult checkPseudoObjectIncDec(Scope *S, SourceLocation OpLoc,
12975                                     UnaryOperatorKind Opcode, Expr *Op);
12976  ExprResult checkPseudoObjectAssignment(Scope *S, SourceLocation OpLoc,
12977                                         BinaryOperatorKind Opcode,
12978                                         Expr *LHS, Expr *RHS);
12979  ExprResult checkPseudoObjectRValue(Expr *E);
12980  Expr *recreateSyntacticForm(PseudoObjectExpr *E);
12981
12982  QualType CheckConditionalOperands( // C99 6.5.15
12983    ExprResult &Cond, ExprResult &LHS, ExprResult &RHS,
12984    ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc);
12985  QualType CXXCheckConditionalOperands( // C++ 5.16
12986    ExprResult &cond, ExprResult &lhs, ExprResult &rhs,
12987    ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc);
12988  QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS,
12989                                       ExprResult &RHS,
12990                                       SourceLocation QuestionLoc);
12991
12992  QualType CheckSizelessVectorConditionalTypes(ExprResult &Cond,
12993                                               ExprResult &LHS, ExprResult &RHS,
12994                                               SourceLocation QuestionLoc);
12995  QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2,
12996                                    bool ConvertArgs = true);
12997  QualType FindCompositePointerType(SourceLocation Loc,
12998                                    ExprResult &E1, ExprResult &E2,
12999                                    bool ConvertArgs = true) {
13000    Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
13001    QualType Composite =
13002        FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
13003    E1 = E1Tmp;
13004    E2 = E2Tmp;
13005    return Composite;
13006  }
13007
13008  QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS,
13009                                        SourceLocation QuestionLoc);
13010
13011  bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
13012                                  SourceLocation QuestionLoc);
13013
13014  void DiagnoseAlwaysNonNullPointer(Expr *E,
13015                                    Expr::NullPointerConstantKind NullType,
13016                                    bool IsEqual, SourceRange Range);
13017
13018  /// type checking for vector binary operators.
13019  QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS,
13020                               SourceLocation Loc, bool IsCompAssign,
13021                               bool AllowBothBool, bool AllowBoolConversion,
13022                               bool AllowBoolOperation, bool ReportInvalid);
13023  QualType GetSignedVectorType(QualType V);
13024  QualType GetSignedSizelessVectorType(QualType V);
13025  QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
13026                                      SourceLocation Loc,
13027                                      BinaryOperatorKind Opc);
13028  QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,
13029                                              SourceLocation Loc,
13030                                              BinaryOperatorKind Opc);
13031  QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS,
13032                                      SourceLocation Loc);
13033
13034  // type checking for sizeless vector binary operators.
13035  QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS,
13036                                       SourceLocation Loc, bool IsCompAssign,
13037                                       ArithConvKind OperationKind);
13038
13039  /// Type checking for matrix binary operators.
13040  QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS,
13041                                          SourceLocation Loc,
13042                                          bool IsCompAssign);
13043  QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS,
13044                                       SourceLocation Loc, bool IsCompAssign);
13045
13046  bool isValidSveBitcast(QualType srcType, QualType destType);
13047  bool isValidRVVBitcast(QualType srcType, QualType destType);
13048
13049  bool areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy);
13050
13051  bool areVectorTypesSameSize(QualType srcType, QualType destType);
13052  bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
13053  bool isLaxVectorConversion(QualType srcType, QualType destType);
13054  bool anyAltivecTypes(QualType srcType, QualType destType);
13055
13056  /// type checking declaration initializers (C99 6.7.8)
13057  bool CheckForConstantInitializer(Expr *e, QualType t);
13058
13059  // type checking C++ declaration initializers (C++ [dcl.init]).
13060
13061  /// ReferenceCompareResult - Expresses the result of comparing two
13062  /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
13063  /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
13064  enum ReferenceCompareResult {
13065    /// Ref_Incompatible - The two types are incompatible, so direct
13066    /// reference binding is not possible.
13067    Ref_Incompatible = 0,
13068    /// Ref_Related - The two types are reference-related, which means
13069    /// that their unqualified forms (T1 and T2) are either the same
13070    /// or T1 is a base class of T2.
13071    Ref_Related,
13072    /// Ref_Compatible - The two types are reference-compatible.
13073    Ref_Compatible
13074  };
13075
13076  // Fake up a scoped enumeration that still contextually converts to bool.
13077  struct ReferenceConversionsScope {
13078    /// The conversions that would be performed on an lvalue of type T2 when
13079    /// binding a reference of type T1 to it, as determined when evaluating
13080    /// whether T1 is reference-compatible with T2.
13081    enum ReferenceConversions {
13082      Qualification = 0x1,
13083      NestedQualification = 0x2,
13084      Function = 0x4,
13085      DerivedToBase = 0x8,
13086      ObjC = 0x10,
13087      ObjCLifetime = 0x20,
13088
13089      LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/ObjCLifetime)
13090    };
13091  };
13092  using ReferenceConversions = ReferenceConversionsScope::ReferenceConversions;
13093
13094  ReferenceCompareResult
13095  CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2,
13096                               ReferenceConversions *Conv = nullptr);
13097
13098  ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType,
13099                                 Expr *CastExpr, CastKind &CastKind,
13100                                 ExprValueKind &VK, CXXCastPath &Path);
13101
13102  /// Force an expression with unknown-type to an expression of the
13103  /// given type.
13104  ExprResult forceUnknownAnyToType(Expr *E, QualType ToType);
13105
13106  /// Type-check an expression that's being passed to an
13107  /// __unknown_anytype parameter.
13108  ExprResult checkUnknownAnyArg(SourceLocation callLoc,
13109                                Expr *result, QualType &paramType);
13110
13111  // CheckMatrixCast - Check type constraints for matrix casts.
13112  // We allow casting between matrixes of the same dimensions i.e. when they
13113  // have the same number of rows and column. Returns true if the cast is
13114  // invalid.
13115  bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
13116                       CastKind &Kind);
13117
13118  // CheckVectorCast - check type constraints for vectors.
13119  // Since vectors are an extension, there are no C standard reference for this.
13120  // We allow casting between vectors and integer datatypes of the same size.
13121  // returns true if the cast is invalid
13122  bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
13123                       CastKind &Kind);
13124
13125  /// Prepare `SplattedExpr` for a vector splat operation, adding
13126  /// implicit casts if necessary.
13127  ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
13128
13129  // CheckExtVectorCast - check type constraints for extended vectors.
13130  // Since vectors are an extension, there are no C standard reference for this.
13131  // We allow casting between vectors and integer datatypes of the same size,
13132  // or vectors and the element type of that vector.
13133  // returns the cast expr
13134  ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr,
13135                                CastKind &Kind);
13136
13137  ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type,
13138                                        SourceLocation LParenLoc,
13139                                        Expr *CastExpr,
13140                                        SourceLocation RParenLoc);
13141
13142  enum ARCConversionResult { ACR_okay, ACR_unbridged, ACR_error };
13143
13144  /// Checks for invalid conversions and casts between
13145  /// retainable pointers and other pointer kinds for ARC and Weak.
13146  ARCConversionResult CheckObjCConversion(SourceRange castRange,
13147                                          QualType castType, Expr *&op,
13148                                          CheckedConversionKind CCK,
13149                                          bool Diagnose = true,
13150                                          bool DiagnoseCFAudited = false,
13151                                          BinaryOperatorKind Opc = BO_PtrMemD
13152                                          );
13153
13154  Expr *stripARCUnbridgedCast(Expr *e);
13155  void diagnoseARCUnbridgedCast(Expr *e);
13156
13157  bool CheckObjCARCUnavailableWeakConversion(QualType castType,
13158                                             QualType ExprType);
13159
13160  /// checkRetainCycles - Check whether an Objective-C message send
13161  /// might create an obvious retain cycle.
13162  void checkRetainCycles(ObjCMessageExpr *msg);
13163  void checkRetainCycles(Expr *receiver, Expr *argument);
13164  void checkRetainCycles(VarDecl *Var, Expr *Init);
13165
13166  /// checkUnsafeAssigns - Check whether +1 expr is being assigned
13167  /// to weak/__unsafe_unretained type.
13168  bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
13169
13170  /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
13171  /// to weak/__unsafe_unretained expression.
13172  void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
13173
13174  /// CheckMessageArgumentTypes - Check types in an Obj-C message send.
13175  /// \param Method - May be null.
13176  /// \param [out] ReturnType - The return type of the send.
13177  /// \return true iff there were any incompatible types.
13178  bool CheckMessageArgumentTypes(const Expr *Receiver, QualType ReceiverType,
13179                                 MultiExprArg Args, Selector Sel,
13180                                 ArrayRef<SourceLocation> SelectorLocs,
13181                                 ObjCMethodDecl *Method, bool isClassMessage,
13182                                 bool isSuperMessage, SourceLocation lbrac,
13183                                 SourceLocation rbrac, SourceRange RecRange,
13184                                 QualType &ReturnType, ExprValueKind &VK);
13185
13186  /// Determine the result of a message send expression based on
13187  /// the type of the receiver, the method expected to receive the message,
13188  /// and the form of the message send.
13189  QualType getMessageSendResultType(const Expr *Receiver, QualType ReceiverType,
13190                                    ObjCMethodDecl *Method, bool isClassMessage,
13191                                    bool isSuperMessage);
13192
13193  /// If the given expression involves a message send to a method
13194  /// with a related result type, emit a note describing what happened.
13195  void EmitRelatedResultTypeNote(const Expr *E);
13196
13197  /// Given that we had incompatible pointer types in a return
13198  /// statement, check whether we're in a method with a related result
13199  /// type, and if so, emit a note describing what happened.
13200  void EmitRelatedResultTypeNoteForReturn(QualType destType);
13201
13202  class ConditionResult {
13203    Decl *ConditionVar;
13204    FullExprArg Condition;
13205    bool Invalid;
13206    std::optional<bool> KnownValue;
13207
13208    friend class Sema;
13209    ConditionResult(Sema &S, Decl *ConditionVar, FullExprArg Condition,
13210                    bool IsConstexpr)
13211        : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
13212      if (IsConstexpr && Condition.get()) {
13213        if (std::optional<llvm::APSInt> Val =
13214                Condition.get()->getIntegerConstantExpr(S.Context)) {
13215          KnownValue = !!(*Val);
13216        }
13217      }
13218    }
13219    explicit ConditionResult(bool Invalid)
13220        : ConditionVar(nullptr), Condition(nullptr), Invalid(Invalid),
13221          KnownValue(std::nullopt) {}
13222
13223  public:
13224    ConditionResult() : ConditionResult(false) {}
13225    bool isInvalid() const { return Invalid; }
13226    std::pair<VarDecl *, Expr *> get() const {
13227      return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
13228                            Condition.get());
13229    }
13230    std::optional<bool> getKnownValue() const { return KnownValue; }
13231  };
13232  static ConditionResult ConditionError() { return ConditionResult(true); }
13233
13234  enum class ConditionKind {
13235    Boolean,     ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
13236    ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
13237    Switch       ///< An integral condition for a 'switch' statement.
13238  };
13239  QualType PreferredConditionType(ConditionKind K) const {
13240    return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
13241  }
13242
13243  ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
13244                                 ConditionKind CK, bool MissingOK = false);
13245
13246  ConditionResult ActOnConditionVariable(Decl *ConditionVar,
13247                                         SourceLocation StmtLoc,
13248                                         ConditionKind CK);
13249
13250  DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D);
13251
13252  ExprResult CheckConditionVariable(VarDecl *ConditionVar,
13253                                    SourceLocation StmtLoc,
13254                                    ConditionKind CK);
13255  ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond);
13256
13257  /// CheckBooleanCondition - Diagnose problems involving the use of
13258  /// the given expression as a boolean condition (e.g. in an if
13259  /// statement).  Also performs the standard function and array
13260  /// decays, possibly changing the input variable.
13261  ///
13262  /// \param Loc - A location associated with the condition, e.g. the
13263  /// 'if' keyword.
13264  /// \return true iff there were any errors
13265  ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E,
13266                                   bool IsConstexpr = false);
13267
13268  /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
13269  /// found in an explicit(bool) specifier.
13270  ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E);
13271
13272  /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
13273  /// Returns true if the explicit specifier is now resolved.
13274  bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec);
13275
13276  /// DiagnoseAssignmentAsCondition - Given that an expression is
13277  /// being used as a boolean condition, warn if it's an assignment.
13278  void DiagnoseAssignmentAsCondition(Expr *E);
13279
13280  /// Redundant parentheses over an equality comparison can indicate
13281  /// that the user intended an assignment used as condition.
13282  void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE);
13283
13284  /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
13285  ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
13286
13287  /// Checks that the Objective-C declaration is declared in the global scope.
13288  /// Emits an error and marks the declaration as invalid if it's not declared
13289  /// in the global scope.
13290  bool CheckObjCDeclScope(Decl *D);
13291
13292  /// Abstract base class used for diagnosing integer constant
13293  /// expression violations.
13294  class VerifyICEDiagnoser {
13295  public:
13296    bool Suppress;
13297
13298    VerifyICEDiagnoser(bool Suppress = false) : Suppress(Suppress) { }
13299
13300    virtual SemaDiagnosticBuilder
13301    diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
13302    virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S,
13303                                                 SourceLocation Loc) = 0;
13304    virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc);
13305    virtual ~VerifyICEDiagnoser() {}
13306  };
13307
13308  enum AllowFoldKind {
13309    NoFold,
13310    AllowFold,
13311  };
13312
13313  /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
13314  /// and reports the appropriate diagnostics. Returns false on success.
13315  /// Can optionally return the value of the expression.
13316  ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result,
13317                                             VerifyICEDiagnoser &Diagnoser,
13318                                             AllowFoldKind CanFold = NoFold);
13319  ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result,
13320                                             unsigned DiagID,
13321                                             AllowFoldKind CanFold = NoFold);
13322  ExprResult VerifyIntegerConstantExpression(Expr *E,
13323                                             llvm::APSInt *Result = nullptr,
13324                                             AllowFoldKind CanFold = NoFold);
13325  ExprResult VerifyIntegerConstantExpression(Expr *E,
13326                                             AllowFoldKind CanFold = NoFold) {
13327    return VerifyIntegerConstantExpression(E, nullptr, CanFold);
13328  }
13329
13330  /// VerifyBitField - verifies that a bit field expression is an ICE and has
13331  /// the correct width, and that the field type is valid.
13332  /// Returns false on success.
13333  ExprResult VerifyBitField(SourceLocation FieldLoc, IdentifierInfo *FieldName,
13334                            QualType FieldTy, bool IsMsStruct, Expr *BitWidth);
13335
13336private:
13337  unsigned ForceCUDAHostDeviceDepth = 0;
13338
13339public:
13340  /// Increments our count of the number of times we've seen a pragma forcing
13341  /// functions to be __host__ __device__.  So long as this count is greater
13342  /// than zero, all functions encountered will be __host__ __device__.
13343  void PushForceCUDAHostDevice();
13344
13345  /// Decrements our count of the number of times we've seen a pragma forcing
13346  /// functions to be __host__ __device__.  Returns false if the count is 0
13347  /// before incrementing, so you can emit an error.
13348  bool PopForceCUDAHostDevice();
13349
13350  /// Diagnostics that are emitted only if we discover that the given function
13351  /// must be codegen'ed.  Because handling these correctly adds overhead to
13352  /// compilation, this is currently only enabled for CUDA compilations.
13353  llvm::DenseMap<CanonicalDeclPtr<const FunctionDecl>,
13354                 std::vector<PartialDiagnosticAt>>
13355      DeviceDeferredDiags;
13356
13357  /// A pair of a canonical FunctionDecl and a SourceLocation.  When used as the
13358  /// key in a hashtable, both the FD and location are hashed.
13359  struct FunctionDeclAndLoc {
13360    CanonicalDeclPtr<const FunctionDecl> FD;
13361    SourceLocation Loc;
13362  };
13363
13364  /// FunctionDecls and SourceLocations for which CheckCUDACall has emitted a
13365  /// (maybe deferred) "bad call" diagnostic.  We use this to avoid emitting the
13366  /// same deferred diag twice.
13367  llvm::DenseSet<FunctionDeclAndLoc> LocsWithCUDACallDiags;
13368
13369  /// An inverse call graph, mapping known-emitted functions to one of their
13370  /// known-emitted callers (plus the location of the call).
13371  ///
13372  /// Functions that we can tell a priori must be emitted aren't added to this
13373  /// map.
13374  llvm::DenseMap</* Callee = */ CanonicalDeclPtr<const FunctionDecl>,
13375                 /* Caller = */ FunctionDeclAndLoc>
13376      DeviceKnownEmittedFns;
13377
13378  /// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
13379  /// context is "used as device code".
13380  ///
13381  /// - If CurContext is a __host__ function, does not emit any diagnostics
13382  ///   unless \p EmitOnBothSides is true.
13383  /// - If CurContext is a __device__ or __global__ function, emits the
13384  ///   diagnostics immediately.
13385  /// - If CurContext is a __host__ __device__ function and we are compiling for
13386  ///   the device, creates a diagnostic which is emitted if and when we realize
13387  ///   that the function will be codegen'ed.
13388  ///
13389  /// Example usage:
13390  ///
13391  ///  // Variable-length arrays are not allowed in CUDA device code.
13392  ///  if (CUDADiagIfDeviceCode(Loc, diag::err_cuda_vla) << CurrentCUDATarget())
13393  ///    return ExprError();
13394  ///  // Otherwise, continue parsing as normal.
13395  SemaDiagnosticBuilder CUDADiagIfDeviceCode(SourceLocation Loc,
13396                                             unsigned DiagID);
13397
13398  /// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
13399  /// context is "used as host code".
13400  ///
13401  /// Same as CUDADiagIfDeviceCode, with "host" and "device" switched.
13402  SemaDiagnosticBuilder CUDADiagIfHostCode(SourceLocation Loc, unsigned DiagID);
13403
13404  /// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
13405  /// context is "used as device code".
13406  ///
13407  /// - If CurContext is a `declare target` function or it is known that the
13408  /// function is emitted for the device, emits the diagnostics immediately.
13409  /// - If CurContext is a non-`declare target` function and we are compiling
13410  ///   for the device, creates a diagnostic which is emitted if and when we
13411  ///   realize that the function will be codegen'ed.
13412  ///
13413  /// Example usage:
13414  ///
13415  ///  // Variable-length arrays are not allowed in NVPTX device code.
13416  ///  if (diagIfOpenMPDeviceCode(Loc, diag::err_vla_unsupported))
13417  ///    return ExprError();
13418  ///  // Otherwise, continue parsing as normal.
13419  SemaDiagnosticBuilder diagIfOpenMPDeviceCode(SourceLocation Loc,
13420                                               unsigned DiagID,
13421                                               const FunctionDecl *FD);
13422
13423  /// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
13424  /// context is "used as host code".
13425  ///
13426  /// - If CurContext is a `declare target` function or it is known that the
13427  /// function is emitted for the host, emits the diagnostics immediately.
13428  /// - If CurContext is a non-host function, just ignore it.
13429  ///
13430  /// Example usage:
13431  ///
13432  ///  // Variable-length arrays are not allowed in NVPTX device code.
13433  ///  if (diagIfOpenMPHostode(Loc, diag::err_vla_unsupported))
13434  ///    return ExprError();
13435  ///  // Otherwise, continue parsing as normal.
13436  SemaDiagnosticBuilder diagIfOpenMPHostCode(SourceLocation Loc,
13437                                             unsigned DiagID,
13438                                             const FunctionDecl *FD);
13439
13440  SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
13441                                   const FunctionDecl *FD = nullptr);
13442  SemaDiagnosticBuilder targetDiag(SourceLocation Loc,
13443                                   const PartialDiagnostic &PD,
13444                                   const FunctionDecl *FD = nullptr) {
13445    return targetDiag(Loc, PD.getDiagID(), FD) << PD;
13446  }
13447
13448  /// Check if the type is allowed to be used for the current target.
13449  void checkTypeSupport(QualType Ty, SourceLocation Loc,
13450                        ValueDecl *D = nullptr);
13451
13452  /// Determines whether the given function is a CUDA device/host/kernel/etc.
13453  /// function.
13454  ///
13455  /// Use this rather than examining the function's attributes yourself -- you
13456  /// will get it wrong.  Returns CFT_Host if D is null.
13457  CUDAFunctionTarget IdentifyCUDATarget(const FunctionDecl *D,
13458                                        bool IgnoreImplicitHDAttr = false);
13459  CUDAFunctionTarget IdentifyCUDATarget(const ParsedAttributesView &Attrs);
13460
13461  enum CUDAVariableTarget {
13462    CVT_Device,  /// Emitted on device side with a shadow variable on host side
13463    CVT_Host,    /// Emitted on host side only
13464    CVT_Both,    /// Emitted on both sides with different addresses
13465    CVT_Unified, /// Emitted as a unified address, e.g. managed variables
13466  };
13467  /// Determines whether the given variable is emitted on host or device side.
13468  CUDAVariableTarget IdentifyCUDATarget(const VarDecl *D);
13469
13470  /// Defines kinds of CUDA global host/device context where a function may be
13471  /// called.
13472  enum CUDATargetContextKind {
13473    CTCK_Unknown,       /// Unknown context
13474    CTCK_InitGlobalVar, /// Function called during global variable
13475                        /// initialization
13476  };
13477
13478  /// Define the current global CUDA host/device context where a function may be
13479  /// called. Only used when a function is called outside of any functions.
13480  struct CUDATargetContext {
13481    CUDAFunctionTarget Target = CFT_HostDevice;
13482    CUDATargetContextKind Kind = CTCK_Unknown;
13483    Decl *D = nullptr;
13484  } CurCUDATargetCtx;
13485
13486  struct CUDATargetContextRAII {
13487    Sema &S;
13488    CUDATargetContext SavedCtx;
13489    CUDATargetContextRAII(Sema &S_, CUDATargetContextKind K, Decl *D);
13490    ~CUDATargetContextRAII() { S.CurCUDATargetCtx = SavedCtx; }
13491  };
13492
13493  /// Gets the CUDA target for the current context.
13494  CUDAFunctionTarget CurrentCUDATarget() {
13495    return IdentifyCUDATarget(dyn_cast<FunctionDecl>(CurContext));
13496  }
13497
13498  static bool isCUDAImplicitHostDeviceFunction(const FunctionDecl *D);
13499
13500  // CUDA function call preference. Must be ordered numerically from
13501  // worst to best.
13502  enum CUDAFunctionPreference {
13503    CFP_Never,      // Invalid caller/callee combination.
13504    CFP_WrongSide,  // Calls from host-device to host or device
13505                    // function that do not match current compilation
13506                    // mode.
13507    CFP_HostDevice, // Any calls to host/device functions.
13508    CFP_SameSide,   // Calls from host-device to host or device
13509                    // function matching current compilation mode.
13510    CFP_Native,     // host-to-host or device-to-device calls.
13511  };
13512
13513  /// Identifies relative preference of a given Caller/Callee
13514  /// combination, based on their host/device attributes.
13515  /// \param Caller function which needs address of \p Callee.
13516  ///               nullptr in case of global context.
13517  /// \param Callee target function
13518  ///
13519  /// \returns preference value for particular Caller/Callee combination.
13520  CUDAFunctionPreference IdentifyCUDAPreference(const FunctionDecl *Caller,
13521                                                const FunctionDecl *Callee);
13522
13523  /// Determines whether Caller may invoke Callee, based on their CUDA
13524  /// host/device attributes.  Returns false if the call is not allowed.
13525  ///
13526  /// Note: Will return true for CFP_WrongSide calls.  These may appear in
13527  /// semantically correct CUDA programs, but only if they're never codegen'ed.
13528  bool IsAllowedCUDACall(const FunctionDecl *Caller,
13529                         const FunctionDecl *Callee) {
13530    return IdentifyCUDAPreference(Caller, Callee) != CFP_Never;
13531  }
13532
13533  /// May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD,
13534  /// depending on FD and the current compilation settings.
13535  void maybeAddCUDAHostDeviceAttrs(FunctionDecl *FD,
13536                                   const LookupResult &Previous);
13537
13538  /// May add implicit CUDAConstantAttr attribute to VD, depending on VD
13539  /// and current compilation settings.
13540  void MaybeAddCUDAConstantAttr(VarDecl *VD);
13541
13542public:
13543  /// Check whether we're allowed to call Callee from the current context.
13544  ///
13545  /// - If the call is never allowed in a semantically-correct program
13546  ///   (CFP_Never), emits an error and returns false.
13547  ///
13548  /// - If the call is allowed in semantically-correct programs, but only if
13549  ///   it's never codegen'ed (CFP_WrongSide), creates a deferred diagnostic to
13550  ///   be emitted if and when the caller is codegen'ed, and returns true.
13551  ///
13552  ///   Will only create deferred diagnostics for a given SourceLocation once,
13553  ///   so you can safely call this multiple times without generating duplicate
13554  ///   deferred errors.
13555  ///
13556  /// - Otherwise, returns true without emitting any diagnostics.
13557  bool CheckCUDACall(SourceLocation Loc, FunctionDecl *Callee);
13558
13559  void CUDACheckLambdaCapture(CXXMethodDecl *D, const sema::Capture &Capture);
13560
13561  /// Set __device__ or __host__ __device__ attributes on the given lambda
13562  /// operator() method.
13563  ///
13564  /// CUDA lambdas by default is host device function unless it has explicit
13565  /// host or device attribute.
13566  void CUDASetLambdaAttrs(CXXMethodDecl *Method);
13567
13568  /// Record \p FD if it is a CUDA/HIP implicit host device function used on
13569  /// device side in device compilation.
13570  void CUDARecordImplicitHostDeviceFuncUsedByDevice(const FunctionDecl *FD);
13571
13572  /// Finds a function in \p Matches with highest calling priority
13573  /// from \p Caller context and erases all functions with lower
13574  /// calling priority.
13575  void EraseUnwantedCUDAMatches(
13576      const FunctionDecl *Caller,
13577      SmallVectorImpl<std::pair<DeclAccessPair, FunctionDecl *>> &Matches);
13578
13579  /// Given a implicit special member, infer its CUDA target from the
13580  /// calls it needs to make to underlying base/field special members.
13581  /// \param ClassDecl the class for which the member is being created.
13582  /// \param CSM the kind of special member.
13583  /// \param MemberDecl the special member itself.
13584  /// \param ConstRHS true if this is a copy operation with a const object on
13585  ///        its RHS.
13586  /// \param Diagnose true if this call should emit diagnostics.
13587  /// \return true if there was an error inferring.
13588  /// The result of this call is implicit CUDA target attribute(s) attached to
13589  /// the member declaration.
13590  bool inferCUDATargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl,
13591                                               CXXSpecialMember CSM,
13592                                               CXXMethodDecl *MemberDecl,
13593                                               bool ConstRHS,
13594                                               bool Diagnose);
13595
13596  /// \return true if \p CD can be considered empty according to CUDA
13597  /// (E.2.3.1 in CUDA 7.5 Programming guide).
13598  bool isEmptyCudaConstructor(SourceLocation Loc, CXXConstructorDecl *CD);
13599  bool isEmptyCudaDestructor(SourceLocation Loc, CXXDestructorDecl *CD);
13600
13601  // \brief Checks that initializers of \p Var satisfy CUDA restrictions. In
13602  // case of error emits appropriate diagnostic and invalidates \p Var.
13603  //
13604  // \details CUDA allows only empty constructors as initializers for global
13605  // variables (see E.2.3.1, CUDA 7.5). The same restriction also applies to all
13606  // __shared__ variables whether they are local or not (they all are implicitly
13607  // static in CUDA). One exception is that CUDA allows constant initializers
13608  // for __constant__ and __device__ variables.
13609  void checkAllowedCUDAInitializer(VarDecl *VD);
13610
13611  /// Check whether NewFD is a valid overload for CUDA. Emits
13612  /// diagnostics and invalidates NewFD if not.
13613  void checkCUDATargetOverload(FunctionDecl *NewFD,
13614                               const LookupResult &Previous);
13615  /// Copies target attributes from the template TD to the function FD.
13616  void inheritCUDATargetAttrs(FunctionDecl *FD, const FunctionTemplateDecl &TD);
13617
13618  /// Returns the name of the launch configuration function.  This is the name
13619  /// of the function that will be called to configure kernel call, with the
13620  /// parameters specified via <<<>>>.
13621  std::string getCudaConfigureFuncName() const;
13622
13623  /// \name Code completion
13624  //@{
13625  /// Describes the context in which code completion occurs.
13626  enum ParserCompletionContext {
13627    /// Code completion occurs at top-level or namespace context.
13628    PCC_Namespace,
13629    /// Code completion occurs within a class, struct, or union.
13630    PCC_Class,
13631    /// Code completion occurs within an Objective-C interface, protocol,
13632    /// or category.
13633    PCC_ObjCInterface,
13634    /// Code completion occurs within an Objective-C implementation or
13635    /// category implementation
13636    PCC_ObjCImplementation,
13637    /// Code completion occurs within the list of instance variables
13638    /// in an Objective-C interface, protocol, category, or implementation.
13639    PCC_ObjCInstanceVariableList,
13640    /// Code completion occurs following one or more template
13641    /// headers.
13642    PCC_Template,
13643    /// Code completion occurs following one or more template
13644    /// headers within a class.
13645    PCC_MemberTemplate,
13646    /// Code completion occurs within an expression.
13647    PCC_Expression,
13648    /// Code completion occurs within a statement, which may
13649    /// also be an expression or a declaration.
13650    PCC_Statement,
13651    /// Code completion occurs at the beginning of the
13652    /// initialization statement (or expression) in a for loop.
13653    PCC_ForInit,
13654    /// Code completion occurs within the condition of an if,
13655    /// while, switch, or for statement.
13656    PCC_Condition,
13657    /// Code completion occurs within the body of a function on a
13658    /// recovery path, where we do not have a specific handle on our position
13659    /// in the grammar.
13660    PCC_RecoveryInFunction,
13661    /// Code completion occurs where only a type is permitted.
13662    PCC_Type,
13663    /// Code completion occurs in a parenthesized expression, which
13664    /// might also be a type cast.
13665    PCC_ParenthesizedExpression,
13666    /// Code completion occurs within a sequence of declaration
13667    /// specifiers within a function, method, or block.
13668    PCC_LocalDeclarationSpecifiers,
13669    /// Code completion occurs at top-level in a REPL session
13670    PCC_TopLevelOrExpression,
13671  };
13672
13673  void CodeCompleteModuleImport(SourceLocation ImportLoc, ModuleIdPath Path);
13674  void CodeCompleteOrdinaryName(Scope *S,
13675                                ParserCompletionContext CompletionContext);
13676  void CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,
13677                            bool AllowNonIdentifiers,
13678                            bool AllowNestedNameSpecifiers);
13679
13680  struct CodeCompleteExpressionData;
13681  void CodeCompleteExpression(Scope *S,
13682                              const CodeCompleteExpressionData &Data);
13683  void CodeCompleteExpression(Scope *S, QualType PreferredType,
13684                              bool IsParenthesized = false);
13685  void CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base, Expr *OtherOpBase,
13686                                       SourceLocation OpLoc, bool IsArrow,
13687                                       bool IsBaseExprStatement,
13688                                       QualType PreferredType);
13689  void CodeCompletePostfixExpression(Scope *S, ExprResult LHS,
13690                                     QualType PreferredType);
13691  void CodeCompleteTag(Scope *S, unsigned TagSpec);
13692  void CodeCompleteTypeQualifiers(DeclSpec &DS);
13693  void CodeCompleteFunctionQualifiers(DeclSpec &DS, Declarator &D,
13694                                      const VirtSpecifiers *VS = nullptr);
13695  void CodeCompleteBracketDeclarator(Scope *S);
13696  void CodeCompleteCase(Scope *S);
13697  enum class AttributeCompletion {
13698    Attribute,
13699    Scope,
13700    None,
13701  };
13702  void CodeCompleteAttribute(
13703      AttributeCommonInfo::Syntax Syntax,
13704      AttributeCompletion Completion = AttributeCompletion::Attribute,
13705      const IdentifierInfo *Scope = nullptr);
13706  /// Determines the preferred type of the current function argument, by
13707  /// examining the signatures of all possible overloads.
13708  /// Returns null if unknown or ambiguous, or if code completion is off.
13709  ///
13710  /// If the code completion point has been reached, also reports the function
13711  /// signatures that were considered.
13712  ///
13713  /// FIXME: rename to GuessCallArgumentType to reduce confusion.
13714  QualType ProduceCallSignatureHelp(Expr *Fn, ArrayRef<Expr *> Args,
13715                                    SourceLocation OpenParLoc);
13716  QualType ProduceConstructorSignatureHelp(QualType Type, SourceLocation Loc,
13717                                           ArrayRef<Expr *> Args,
13718                                           SourceLocation OpenParLoc,
13719                                           bool Braced);
13720  QualType ProduceCtorInitMemberSignatureHelp(
13721      Decl *ConstructorDecl, CXXScopeSpec SS, ParsedType TemplateTypeTy,
13722      ArrayRef<Expr *> ArgExprs, IdentifierInfo *II, SourceLocation OpenParLoc,
13723      bool Braced);
13724  QualType ProduceTemplateArgumentSignatureHelp(
13725      TemplateTy, ArrayRef<ParsedTemplateArgument>, SourceLocation LAngleLoc);
13726  void CodeCompleteInitializer(Scope *S, Decl *D);
13727  /// Trigger code completion for a record of \p BaseType. \p InitExprs are
13728  /// expressions in the initializer list seen so far and \p D is the current
13729  /// Designation being parsed.
13730  void CodeCompleteDesignator(const QualType BaseType,
13731                              llvm::ArrayRef<Expr *> InitExprs,
13732                              const Designation &D);
13733  void CodeCompleteAfterIf(Scope *S, bool IsBracedThen);
13734
13735  void CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext,
13736                               bool IsUsingDeclaration, QualType BaseType,
13737                               QualType PreferredType);
13738  void CodeCompleteUsing(Scope *S);
13739  void CodeCompleteUsingDirective(Scope *S);
13740  void CodeCompleteNamespaceDecl(Scope *S);
13741  void CodeCompleteNamespaceAliasDecl(Scope *S);
13742  void CodeCompleteOperatorName(Scope *S);
13743  void CodeCompleteConstructorInitializer(
13744                                Decl *Constructor,
13745                                ArrayRef<CXXCtorInitializer *> Initializers);
13746
13747  void CodeCompleteLambdaIntroducer(Scope *S, LambdaIntroducer &Intro,
13748                                    bool AfterAmpersand);
13749  void CodeCompleteAfterFunctionEquals(Declarator &D);
13750
13751  void CodeCompleteObjCAtDirective(Scope *S);
13752  void CodeCompleteObjCAtVisibility(Scope *S);
13753  void CodeCompleteObjCAtStatement(Scope *S);
13754  void CodeCompleteObjCAtExpression(Scope *S);
13755  void CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS);
13756  void CodeCompleteObjCPropertyGetter(Scope *S);
13757  void CodeCompleteObjCPropertySetter(Scope *S);
13758  void CodeCompleteObjCPassingType(Scope *S, ObjCDeclSpec &DS,
13759                                   bool IsParameter);
13760  void CodeCompleteObjCMessageReceiver(Scope *S);
13761  void CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,
13762                                    ArrayRef<IdentifierInfo *> SelIdents,
13763                                    bool AtArgumentExpression);
13764  void CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,
13765                                    ArrayRef<IdentifierInfo *> SelIdents,
13766                                    bool AtArgumentExpression,
13767                                    bool IsSuper = false);
13768  void CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,
13769                                       ArrayRef<IdentifierInfo *> SelIdents,
13770                                       bool AtArgumentExpression,
13771                                       ObjCInterfaceDecl *Super = nullptr);
13772  void CodeCompleteObjCForCollection(Scope *S,
13773                                     DeclGroupPtrTy IterationVar);
13774  void CodeCompleteObjCSelector(Scope *S,
13775                                ArrayRef<IdentifierInfo *> SelIdents);
13776  void CodeCompleteObjCProtocolReferences(
13777                                         ArrayRef<IdentifierLocPair> Protocols);
13778  void CodeCompleteObjCProtocolDecl(Scope *S);
13779  void CodeCompleteObjCInterfaceDecl(Scope *S);
13780  void CodeCompleteObjCClassForwardDecl(Scope *S);
13781  void CodeCompleteObjCSuperclass(Scope *S,
13782                                  IdentifierInfo *ClassName,
13783                                  SourceLocation ClassNameLoc);
13784  void CodeCompleteObjCImplementationDecl(Scope *S);
13785  void CodeCompleteObjCInterfaceCategory(Scope *S,
13786                                         IdentifierInfo *ClassName,
13787                                         SourceLocation ClassNameLoc);
13788  void CodeCompleteObjCImplementationCategory(Scope *S,
13789                                              IdentifierInfo *ClassName,
13790                                              SourceLocation ClassNameLoc);
13791  void CodeCompleteObjCPropertyDefinition(Scope *S);
13792  void CodeCompleteObjCPropertySynthesizeIvar(Scope *S,
13793                                              IdentifierInfo *PropertyName);
13794  void CodeCompleteObjCMethodDecl(Scope *S,
13795                                  std::optional<bool> IsInstanceMethod,
13796                                  ParsedType ReturnType);
13797  void CodeCompleteObjCMethodDeclSelector(Scope *S,
13798                                          bool IsInstanceMethod,
13799                                          bool AtParameterName,
13800                                          ParsedType ReturnType,
13801                                          ArrayRef<IdentifierInfo *> SelIdents);
13802  void CodeCompleteObjCClassPropertyRefExpr(Scope *S, IdentifierInfo &ClassName,
13803                                            SourceLocation ClassNameLoc,
13804                                            bool IsBaseExprStatement);
13805  void CodeCompletePreprocessorDirective(bool InConditional);
13806  void CodeCompleteInPreprocessorConditionalExclusion(Scope *S);
13807  void CodeCompletePreprocessorMacroName(bool IsDefinition);
13808  void CodeCompletePreprocessorExpression();
13809  void CodeCompletePreprocessorMacroArgument(Scope *S,
13810                                             IdentifierInfo *Macro,
13811                                             MacroInfo *MacroInfo,
13812                                             unsigned Argument);
13813  void CodeCompleteIncludedFile(llvm::StringRef Dir, bool IsAngled);
13814  void CodeCompleteNaturalLanguage();
13815  void CodeCompleteAvailabilityPlatformName();
13816  void GatherGlobalCodeCompletions(CodeCompletionAllocator &Allocator,
13817                                   CodeCompletionTUInfo &CCTUInfo,
13818                  SmallVectorImpl<CodeCompletionResult> &Results);
13819  //@}
13820
13821  //===--------------------------------------------------------------------===//
13822  // Extra semantic analysis beyond the C type system
13823
13824public:
13825  SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL,
13826                                                unsigned ByteNo) const;
13827
13828  enum FormatArgumentPassingKind {
13829    FAPK_Fixed,    // values to format are fixed (no C-style variadic arguments)
13830    FAPK_Variadic, // values to format are passed as variadic arguments
13831    FAPK_VAList,   // values to format are passed in a va_list
13832  };
13833
13834  // Used to grab the relevant information from a FormatAttr and a
13835  // FunctionDeclaration.
13836  struct FormatStringInfo {
13837    unsigned FormatIdx;
13838    unsigned FirstDataArg;
13839    FormatArgumentPassingKind ArgPassingKind;
13840  };
13841
13842  static bool getFormatStringInfo(const FormatAttr *Format, bool IsCXXMember,
13843                                  bool IsVariadic, FormatStringInfo *FSI);
13844
13845private:
13846  void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
13847                        const ArraySubscriptExpr *ASE = nullptr,
13848                        bool AllowOnePastEnd = true, bool IndexNegated = false);
13849  void CheckArrayAccess(const Expr *E);
13850
13851  bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
13852                         const FunctionProtoType *Proto);
13853  bool CheckObjCMethodCall(ObjCMethodDecl *Method, SourceLocation loc,
13854                           ArrayRef<const Expr *> Args);
13855  bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
13856                        const FunctionProtoType *Proto);
13857  bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
13858  void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
13859                            ArrayRef<const Expr *> Args,
13860                            const FunctionProtoType *Proto, SourceLocation Loc);
13861
13862  void checkAIXMemberAlignment(SourceLocation Loc, const Expr *Arg);
13863
13864  void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
13865                         StringRef ParamName, QualType ArgTy, QualType ParamTy);
13866
13867  void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
13868                 const Expr *ThisArg, ArrayRef<const Expr *> Args,
13869                 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
13870                 VariadicCallType CallType);
13871
13872  bool CheckObjCString(Expr *Arg);
13873  ExprResult CheckOSLogFormatStringArg(Expr *Arg);
13874
13875  ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl,
13876                                      unsigned BuiltinID, CallExpr *TheCall);
13877
13878  bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13879                                  CallExpr *TheCall);
13880
13881  void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
13882
13883  bool CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall,
13884                                    unsigned MaxWidth);
13885  bool CheckNeonBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13886                                    CallExpr *TheCall);
13887  bool CheckMVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13888  bool CheckSVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13889  bool ParseSVEImmChecks(CallExpr *TheCall,
13890                         SmallVector<std::tuple<int, int, int>, 3> &ImmChecks);
13891  bool CheckSMEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13892  bool CheckCDEBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13893                                   CallExpr *TheCall);
13894  bool CheckARMCoprocessorImmediate(const TargetInfo &TI, const Expr *CoprocArg,
13895                                    bool WantCDE);
13896  bool CheckARMBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13897                                   CallExpr *TheCall);
13898
13899  bool CheckAArch64BuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13900                                       CallExpr *TheCall);
13901  bool CheckBPFBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13902  bool CheckHexagonBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13903  bool CheckHexagonBuiltinArgument(unsigned BuiltinID, CallExpr *TheCall);
13904  bool CheckMipsBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13905                                    CallExpr *TheCall);
13906  bool CheckMipsBuiltinCpu(const TargetInfo &TI, unsigned BuiltinID,
13907                           CallExpr *TheCall);
13908  bool CheckMipsBuiltinArgument(unsigned BuiltinID, CallExpr *TheCall);
13909  bool CheckSystemZBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13910  bool CheckX86BuiltinRoundingOrSAE(unsigned BuiltinID, CallExpr *TheCall);
13911  bool CheckX86BuiltinGatherScatterScale(unsigned BuiltinID, CallExpr *TheCall);
13912  bool CheckX86BuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall);
13913  bool CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall,
13914                                         ArrayRef<int> ArgNums);
13915  bool CheckX86BuiltinTileDuplicate(CallExpr *TheCall, ArrayRef<int> ArgNums);
13916  bool CheckX86BuiltinTileRangeAndDuplicate(CallExpr *TheCall,
13917                                            ArrayRef<int> ArgNums);
13918  bool CheckX86BuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13919                                   CallExpr *TheCall);
13920  bool CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13921                                   CallExpr *TheCall);
13922  bool CheckAMDGCNBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
13923  bool CheckRISCVLMUL(CallExpr *TheCall, unsigned ArgNum);
13924  bool CheckRISCVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13925                                     CallExpr *TheCall);
13926  void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D);
13927  bool CheckLoongArchBuiltinFunctionCall(const TargetInfo &TI,
13928                                         unsigned BuiltinID, CallExpr *TheCall);
13929  bool CheckWebAssemblyBuiltinFunctionCall(const TargetInfo &TI,
13930                                           unsigned BuiltinID,
13931                                           CallExpr *TheCall);
13932  bool CheckNVPTXBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
13933                                     CallExpr *TheCall);
13934
13935  bool SemaBuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
13936  bool SemaBuiltinVAStartARMMicrosoft(CallExpr *Call);
13937  bool SemaBuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
13938  bool SemaBuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
13939                                   unsigned BuiltinID);
13940  bool SemaBuiltinComplex(CallExpr *TheCall);
13941  bool SemaBuiltinVSX(CallExpr *TheCall);
13942  bool SemaBuiltinOSLogFormat(CallExpr *TheCall);
13943  bool SemaValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
13944
13945public:
13946  // Used by C++ template instantiation.
13947  ExprResult SemaBuiltinShuffleVector(CallExpr *TheCall);
13948  ExprResult SemaConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo,
13949                                   SourceLocation BuiltinLoc,
13950                                   SourceLocation RParenLoc);
13951
13952private:
13953  bool SemaBuiltinPrefetch(CallExpr *TheCall);
13954  bool SemaBuiltinAllocaWithAlign(CallExpr *TheCall);
13955  bool SemaBuiltinArithmeticFence(CallExpr *TheCall);
13956  bool SemaBuiltinAssume(CallExpr *TheCall);
13957  bool SemaBuiltinAssumeAligned(CallExpr *TheCall);
13958  bool SemaBuiltinLongjmp(CallExpr *TheCall);
13959  bool SemaBuiltinSetjmp(CallExpr *TheCall);
13960  ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult);
13961  ExprResult SemaBuiltinNontemporalOverloaded(ExprResult TheCallResult);
13962  ExprResult SemaAtomicOpsOverloaded(ExprResult TheCallResult,
13963                                     AtomicExpr::AtomicOp Op);
13964  ExprResult SemaBuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
13965                                                    bool IsDelete);
13966  bool SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum,
13967                              llvm::APSInt &Result);
13968  bool SemaBuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low,
13969                                   int High, bool RangeIsError = true);
13970  bool SemaBuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum,
13971                                      unsigned Multiple);
13972  bool SemaBuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum);
13973  bool SemaBuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum,
13974                                         unsigned ArgBits);
13975  bool SemaBuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum,
13976                                               unsigned ArgBits);
13977  bool SemaBuiltinARMSpecialReg(unsigned BuiltinID, CallExpr *TheCall,
13978                                int ArgNum, unsigned ExpectedFieldNum,
13979                                bool AllowName);
13980  bool SemaBuiltinARMMemoryTaggingCall(unsigned BuiltinID, CallExpr *TheCall);
13981  bool SemaBuiltinPPCMMACall(CallExpr *TheCall, unsigned BuiltinID,
13982                             const char *TypeDesc);
13983
13984  bool CheckPPCMMAType(QualType Type, SourceLocation TypeLoc);
13985
13986  bool SemaBuiltinElementwiseMath(CallExpr *TheCall);
13987  bool SemaBuiltinElementwiseTernaryMath(CallExpr *TheCall);
13988  bool PrepareBuiltinElementwiseMathOneArgCall(CallExpr *TheCall);
13989  bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
13990
13991  bool SemaBuiltinNonDeterministicValue(CallExpr *TheCall);
13992
13993  // Matrix builtin handling.
13994  ExprResult SemaBuiltinMatrixTranspose(CallExpr *TheCall,
13995                                        ExprResult CallResult);
13996  ExprResult SemaBuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
13997                                              ExprResult CallResult);
13998  ExprResult SemaBuiltinMatrixColumnMajorStore(CallExpr *TheCall,
13999                                               ExprResult CallResult);
14000
14001  // WebAssembly builtin handling.
14002  bool BuiltinWasmRefNullExtern(CallExpr *TheCall);
14003  bool BuiltinWasmRefNullFunc(CallExpr *TheCall);
14004  bool BuiltinWasmTableGet(CallExpr *TheCall);
14005  bool BuiltinWasmTableSet(CallExpr *TheCall);
14006  bool BuiltinWasmTableSize(CallExpr *TheCall);
14007  bool BuiltinWasmTableGrow(CallExpr *TheCall);
14008  bool BuiltinWasmTableFill(CallExpr *TheCall);
14009  bool BuiltinWasmTableCopy(CallExpr *TheCall);
14010
14011public:
14012  enum FormatStringType {
14013    FST_Scanf,
14014    FST_Printf,
14015    FST_NSString,
14016    FST_Strftime,
14017    FST_Strfmon,
14018    FST_Kprintf,
14019    FST_FreeBSDKPrintf,
14020    FST_OSTrace,
14021    FST_OSLog,
14022    FST_Unknown
14023  };
14024  static FormatStringType GetFormatStringType(const FormatAttr *Format);
14025
14026  bool FormatStringHasSArg(const StringLiteral *FExpr);
14027
14028  static bool GetFormatNSStringIdx(const FormatAttr *Format, unsigned &Idx);
14029
14030private:
14031  bool CheckFormatArguments(const FormatAttr *Format,
14032                            ArrayRef<const Expr *> Args, bool IsCXXMember,
14033                            VariadicCallType CallType, SourceLocation Loc,
14034                            SourceRange Range,
14035                            llvm::SmallBitVector &CheckedVarArgs);
14036  bool CheckFormatArguments(ArrayRef<const Expr *> Args,
14037                            FormatArgumentPassingKind FAPK, unsigned format_idx,
14038                            unsigned firstDataArg, FormatStringType Type,
14039                            VariadicCallType CallType, SourceLocation Loc,
14040                            SourceRange range,
14041                            llvm::SmallBitVector &CheckedVarArgs);
14042
14043  void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
14044
14045  void CheckAbsoluteValueFunction(const CallExpr *Call,
14046                                  const FunctionDecl *FDecl);
14047
14048  void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
14049
14050  void CheckMemaccessArguments(const CallExpr *Call,
14051                               unsigned BId,
14052                               IdentifierInfo *FnName);
14053
14054  void CheckStrlcpycatArguments(const CallExpr *Call,
14055                                IdentifierInfo *FnName);
14056
14057  void CheckStrncatArguments(const CallExpr *Call,
14058                             IdentifierInfo *FnName);
14059
14060  void CheckFreeArguments(const CallExpr *E);
14061
14062  void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
14063                          SourceLocation ReturnLoc,
14064                          bool isObjCMethod = false,
14065                          const AttrVec *Attrs = nullptr,
14066                          const FunctionDecl *FD = nullptr);
14067
14068public:
14069  void CheckFloatComparison(SourceLocation Loc, Expr *LHS, Expr *RHS,
14070                            BinaryOperatorKind Opcode);
14071
14072private:
14073  void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
14074  void CheckBoolLikeConversion(Expr *E, SourceLocation CC);
14075  void CheckForIntOverflow(const Expr *E);
14076  void CheckUnsequencedOperations(const Expr *E);
14077
14078  /// Perform semantic checks on a completed expression. This will either
14079  /// be a full-expression or a default argument expression.
14080  void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
14081                          bool IsConstexpr = false);
14082
14083  void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
14084                                   Expr *Init);
14085
14086  /// Check if there is a field shadowing.
14087  void CheckShadowInheritedFields(const SourceLocation &Loc,
14088                                  DeclarationName FieldName,
14089                                  const CXXRecordDecl *RD,
14090                                  bool DeclIsField = true);
14091
14092  /// Check if the given expression contains 'break' or 'continue'
14093  /// statement that produces control flow different from GCC.
14094  void CheckBreakContinueBinding(Expr *E);
14095
14096  /// Check whether receiver is mutable ObjC container which
14097  /// attempts to add itself into the container
14098  void CheckObjCCircularContainer(ObjCMessageExpr *Message);
14099
14100  void CheckTCBEnforcement(const SourceLocation CallExprLoc,
14101                           const NamedDecl *Callee);
14102
14103  void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
14104  void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
14105                                 bool DeleteWasArrayForm);
14106public:
14107  /// Register a magic integral constant to be used as a type tag.
14108  void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
14109                                  uint64_t MagicValue, QualType Type,
14110                                  bool LayoutCompatible, bool MustBeNull);
14111
14112  struct TypeTagData {
14113    TypeTagData() {}
14114
14115    TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull) :
14116        Type(Type), LayoutCompatible(LayoutCompatible),
14117        MustBeNull(MustBeNull)
14118    {}
14119
14120    QualType Type;
14121
14122    /// If true, \c Type should be compared with other expression's types for
14123    /// layout-compatibility.
14124    LLVM_PREFERRED_TYPE(bool)
14125    unsigned LayoutCompatible : 1;
14126    LLVM_PREFERRED_TYPE(bool)
14127    unsigned MustBeNull : 1;
14128  };
14129
14130  /// A pair of ArgumentKind identifier and magic value.  This uniquely
14131  /// identifies the magic value.
14132  typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
14133
14134private:
14135  /// A map from magic value to type information.
14136  std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
14137      TypeTagForDatatypeMagicValues;
14138
14139  /// Peform checks on a call of a function with argument_with_type_tag
14140  /// or pointer_with_type_tag attributes.
14141  void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
14142                                const ArrayRef<const Expr *> ExprArgs,
14143                                SourceLocation CallSiteLoc);
14144
14145  /// Check if we are taking the address of a packed field
14146  /// as this may be a problem if the pointer value is dereferenced.
14147  void CheckAddressOfPackedMember(Expr *rhs);
14148
14149  /// The parser's current scope.
14150  ///
14151  /// The parser maintains this state here.
14152  Scope *CurScope;
14153
14154  mutable IdentifierInfo *Ident_super;
14155
14156  /// Nullability type specifiers.
14157  IdentifierInfo *Ident__Nonnull = nullptr;
14158  IdentifierInfo *Ident__Nullable = nullptr;
14159  IdentifierInfo *Ident__Nullable_result = nullptr;
14160  IdentifierInfo *Ident__Null_unspecified = nullptr;
14161
14162  IdentifierInfo *Ident_NSError = nullptr;
14163
14164  /// The handler for the FileChanged preprocessor events.
14165  ///
14166  /// Used for diagnostics that implement custom semantic analysis for #include
14167  /// directives, like -Wpragma-pack.
14168  sema::SemaPPCallbacks *SemaPPCallbackHandler;
14169
14170protected:
14171  friend class Parser;
14172  friend class InitializationSequence;
14173  friend class ASTReader;
14174  friend class ASTDeclReader;
14175  friend class ASTWriter;
14176
14177public:
14178  /// Retrieve the keyword associated
14179  IdentifierInfo *getNullabilityKeyword(NullabilityKind nullability);
14180
14181  /// The struct behind the CFErrorRef pointer.
14182  RecordDecl *CFError = nullptr;
14183  bool isCFError(RecordDecl *D);
14184
14185  /// Retrieve the identifier "NSError".
14186  IdentifierInfo *getNSErrorIdent();
14187
14188  /// Retrieve the parser's current scope.
14189  ///
14190  /// This routine must only be used when it is certain that semantic analysis
14191  /// and the parser are in precisely the same context, which is not the case
14192  /// when, e.g., we are performing any kind of template instantiation.
14193  /// Therefore, the only safe places to use this scope are in the parser
14194  /// itself and in routines directly invoked from the parser and *never* from
14195  /// template substitution or instantiation.
14196  Scope *getCurScope() const { return CurScope; }
14197
14198  void incrementMSManglingNumber() const {
14199    return CurScope->incrementMSManglingNumber();
14200  }
14201
14202  IdentifierInfo *getSuperIdentifier() const;
14203
14204  ObjCContainerDecl *getObjCDeclContext() const;
14205
14206  DeclContext *getCurLexicalContext() const {
14207    return OriginalLexicalContext ? OriginalLexicalContext : CurContext;
14208  }
14209
14210  const DeclContext *getCurObjCLexicalContext() const {
14211    const DeclContext *DC = getCurLexicalContext();
14212    // A category implicitly has the attribute of the interface.
14213    if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(DC))
14214      DC = CatD->getClassInterface();
14215    return DC;
14216  }
14217
14218  /// Determine the number of levels of enclosing template parameters. This is
14219  /// only usable while parsing. Note that this does not include dependent
14220  /// contexts in which no template parameters have yet been declared, such as
14221  /// in a terse function template or generic lambda before the first 'auto' is
14222  /// encountered.
14223  unsigned getTemplateDepth(Scope *S) const;
14224
14225  /// To be used for checking whether the arguments being passed to
14226  /// function exceeds the number of parameters expected for it.
14227  static bool TooManyArguments(size_t NumParams, size_t NumArgs,
14228                               bool PartialOverloading = false) {
14229    // We check whether we're just after a comma in code-completion.
14230    if (NumArgs > 0 && PartialOverloading)
14231      return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
14232    return NumArgs > NumParams;
14233  }
14234
14235  // Emitting members of dllexported classes is delayed until the class
14236  // (including field initializers) is fully parsed.
14237  SmallVector<CXXRecordDecl*, 4> DelayedDllExportClasses;
14238  SmallVector<CXXMethodDecl*, 4> DelayedDllExportMemberFunctions;
14239
14240private:
14241  int ParsingClassDepth = 0;
14242
14243  class SavePendingParsedClassStateRAII {
14244  public:
14245    SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14246
14247    ~SavePendingParsedClassStateRAII() {
14248      assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14249             "there shouldn't be any pending delayed exception spec checks");
14250      assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14251             "there shouldn't be any pending delayed exception spec checks");
14252      swapSavedState();
14253    }
14254
14255  private:
14256    Sema &S;
14257    decltype(DelayedOverridingExceptionSpecChecks)
14258        SavedOverridingExceptionSpecChecks;
14259    decltype(DelayedEquivalentExceptionSpecChecks)
14260        SavedEquivalentExceptionSpecChecks;
14261
14262    void swapSavedState() {
14263      SavedOverridingExceptionSpecChecks.swap(
14264          S.DelayedOverridingExceptionSpecChecks);
14265      SavedEquivalentExceptionSpecChecks.swap(
14266          S.DelayedEquivalentExceptionSpecChecks);
14267    }
14268  };
14269
14270  /// Helper class that collects misaligned member designations and
14271  /// their location info for delayed diagnostics.
14272  struct MisalignedMember {
14273    Expr *E;
14274    RecordDecl *RD;
14275    ValueDecl *MD;
14276    CharUnits Alignment;
14277
14278    MisalignedMember() : E(), RD(), MD() {}
14279    MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
14280                     CharUnits Alignment)
14281        : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
14282    explicit MisalignedMember(Expr *E)
14283        : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
14284
14285    bool operator==(const MisalignedMember &m) { return this->E == m.E; }
14286  };
14287  /// Small set of gathered accesses to potentially misaligned members
14288  /// due to the packed attribute.
14289  SmallVector<MisalignedMember, 4> MisalignedMembers;
14290
14291  /// Adds an expression to the set of gathered misaligned members.
14292  void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
14293                                     CharUnits Alignment);
14294
14295public:
14296  /// Diagnoses the current set of gathered accesses. This typically
14297  /// happens at full expression level. The set is cleared after emitting the
14298  /// diagnostics.
14299  void DiagnoseMisalignedMembers();
14300
14301  /// This function checks if the expression is in the sef of potentially
14302  /// misaligned members and it is converted to some pointer type T with lower
14303  /// or equal alignment requirements. If so it removes it. This is used when
14304  /// we do not want to diagnose such misaligned access (e.g. in conversions to
14305  /// void*).
14306  void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
14307
14308  /// This function calls Action when it determines that E designates a
14309  /// misaligned member due to the packed attribute. This is used to emit
14310  /// local diagnostics like in reference binding.
14311  void RefersToMemberWithReducedAlignment(
14312      Expr *E,
14313      llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
14314          Action);
14315
14316  /// Describes the reason a calling convention specification was ignored, used
14317  /// for diagnostics.
14318  enum class CallingConventionIgnoredReason {
14319    ForThisTarget = 0,
14320    VariadicFunction,
14321    ConstructorDestructor,
14322    BuiltinFunction
14323  };
14324  /// Creates a SemaDiagnosticBuilder that emits the diagnostic if the current
14325  /// context is "used as device code".
14326  ///
14327  /// - If CurLexicalContext is a kernel function or it is known that the
14328  ///   function will be emitted for the device, emits the diagnostics
14329  ///   immediately.
14330  /// - If CurLexicalContext is a function and we are compiling
14331  ///   for the device, but we don't know that this function will be codegen'ed
14332  ///   for devive yet, creates a diagnostic which is emitted if and when we
14333  ///   realize that the function will be codegen'ed.
14334  ///
14335  /// Example usage:
14336  ///
14337  /// Diagnose __float128 type usage only from SYCL device code if the current
14338  /// target doesn't support it
14339  /// if (!S.Context.getTargetInfo().hasFloat128Type() &&
14340  ///     S.getLangOpts().SYCLIsDevice)
14341  ///   SYCLDiagIfDeviceCode(Loc, diag::err_type_unsupported) << "__float128";
14342  SemaDiagnosticBuilder SYCLDiagIfDeviceCode(SourceLocation Loc,
14343                                             unsigned DiagID);
14344
14345  void deepTypeCheckForSYCLDevice(SourceLocation UsedAt,
14346                                  llvm::DenseSet<QualType> Visited,
14347                                  ValueDecl *DeclToCheck);
14348};
14349
14350DeductionFailureInfo
14351MakeDeductionFailureInfo(ASTContext &Context, Sema::TemplateDeductionResult TDK,
14352                         sema::TemplateDeductionInfo &Info);
14353
14354/// Contains a late templated function.
14355/// Will be parsed at the end of the translation unit, used by Sema & Parser.
14356struct LateParsedTemplate {
14357  CachedTokens Toks;
14358  /// The template function declaration to be late parsed.
14359  Decl *D;
14360  /// Floating-point options in the point of definition.
14361  FPOptions FPO;
14362};
14363
14364template <>
14365void Sema::PragmaStack<Sema::AlignPackInfo>::Act(SourceLocation PragmaLocation,
14366                                                 PragmaMsStackAction Action,
14367                                                 llvm::StringRef StackSlotLabel,
14368                                                 AlignPackInfo Value);
14369
14370std::unique_ptr<sema::RISCVIntrinsicManager>
14371CreateRISCVIntrinsicManager(Sema &S);
14372} // end namespace clang
14373
14374namespace llvm {
14375// Hash a FunctionDeclAndLoc by looking at both its FunctionDecl and its
14376// SourceLocation.
14377template <> struct DenseMapInfo<clang::Sema::FunctionDeclAndLoc> {
14378  using FunctionDeclAndLoc = clang::Sema::FunctionDeclAndLoc;
14379  using FDBaseInfo =
14380      DenseMapInfo<clang::CanonicalDeclPtr<const clang::FunctionDecl>>;
14381
14382  static FunctionDeclAndLoc getEmptyKey() {
14383    return {FDBaseInfo::getEmptyKey(), clang::SourceLocation()};
14384  }
14385
14386  static FunctionDeclAndLoc getTombstoneKey() {
14387    return {FDBaseInfo::getTombstoneKey(), clang::SourceLocation()};
14388  }
14389
14390  static unsigned getHashValue(const FunctionDeclAndLoc &FDL) {
14391    return hash_combine(FDBaseInfo::getHashValue(FDL.FD),
14392                        FDL.Loc.getHashValue());
14393  }
14394
14395  static bool isEqual(const FunctionDeclAndLoc &LHS,
14396                      const FunctionDeclAndLoc &RHS) {
14397    return LHS.FD == RHS.FD && LHS.Loc == RHS.Loc;
14398  }
14399};
14400} // namespace llvm
14401
14402#endif
14403