clang 22.0.0git
Sema.h
Go to the documentation of this file.
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
18#include "clang/AST/ASTFwd.h"
19#include "clang/AST/ASTLambda.h"
20#include "clang/AST/Attr.h"
22#include "clang/AST/CharUnits.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
27#include "clang/AST/Expr.h"
28#include "clang/AST/ExprCXX.h"
33#include "clang/AST/StmtCXX.h"
34#include "clang/AST/Type.h"
35#include "clang/AST/TypeLoc.h"
39#include "clang/Basic/Cuda.h"
43#include "clang/Basic/LLVM.h"
44#include "clang/Basic/Lambda.h"
46#include "clang/Basic/Module.h"
58#include "clang/Sema/Attr.h"
60#include "clang/Sema/DeclSpec.h"
66#include "clang/Sema/Scope.h"
67#include "clang/Sema/SemaBase.h"
69#include "clang/Sema/Weak.h"
70#include "llvm/ADT/APInt.h"
71#include "llvm/ADT/ArrayRef.h"
72#include "llvm/ADT/BitmaskEnum.h"
73#include "llvm/ADT/DenseMap.h"
74#include "llvm/ADT/DenseSet.h"
75#include "llvm/ADT/FloatingPointMode.h"
76#include "llvm/ADT/FoldingSet.h"
77#include "llvm/ADT/MapVector.h"
78#include "llvm/ADT/PointerIntPair.h"
79#include "llvm/ADT/PointerUnion.h"
80#include "llvm/ADT/STLExtras.h"
81#include "llvm/ADT/STLForwardCompat.h"
82#include "llvm/ADT/STLFunctionalExtras.h"
83#include "llvm/ADT/SetVector.h"
84#include "llvm/ADT/SmallBitVector.h"
85#include "llvm/ADT/SmallPtrSet.h"
86#include "llvm/ADT/SmallSet.h"
87#include "llvm/ADT/SmallVector.h"
88#include "llvm/ADT/StringExtras.h"
89#include "llvm/ADT/StringMap.h"
90#include "llvm/ADT/TinyPtrVector.h"
91#include "llvm/Support/Allocator.h"
92#include "llvm/Support/Compiler.h"
93#include "llvm/Support/Error.h"
94#include "llvm/Support/ErrorHandling.h"
95#include <cassert>
96#include <climits>
97#include <cstddef>
98#include <cstdint>
99#include <deque>
100#include <functional>
101#include <iterator>
102#include <memory>
103#include <optional>
104#include <string>
105#include <tuple>
106#include <type_traits>
107#include <utility>
108#include <vector>
109
110namespace llvm {
111struct InlineAsmIdentifierInfo;
112} // namespace llvm
113
114namespace clang {
115class ADLResult;
116class APValue;
118class ASTConsumer;
119class ASTContext;
120class ASTDeclReader;
122class ASTReader;
123class ASTWriter;
124class CXXBasePath;
125class CXXBasePaths;
128enum class ComparisonCategoryType : unsigned char;
130class DarwinSDKInfo;
131class DeclGroupRef;
135class Designation;
136class IdentifierInfo;
142enum class LangAS : unsigned int;
144class LookupResult;
147class ModuleLoader;
151class ObjCMethodDecl;
152struct OverloadCandidate;
153enum class OverloadCandidateParamOrder : char;
154enum OverloadCandidateRewriteKind : unsigned;
156class Preprocessor;
157class SemaAMDGPU;
158class SemaARM;
159class SemaAVR;
160class SemaBPF;
162class SemaCUDA;
163class SemaDirectX;
164class SemaHLSL;
165class SemaHexagon;
166class SemaLoongArch;
167class SemaM68k;
168class SemaMIPS;
169class SemaMSP430;
170class SemaNVPTX;
171class SemaObjC;
172class SemaOpenACC;
173class SemaOpenCL;
174class SemaOpenMP;
175class SemaPPC;
176class SemaPseudoObject;
177class SemaRISCV;
178class SemaSPIRV;
179class SemaSYCL;
180class SemaSwift;
181class SemaSystemZ;
182class SemaWasm;
183class SemaX86;
185class TemplateArgument;
190class Token;
191class TypeConstraint;
196
197namespace sema {
198class BlockScopeInfo;
199class Capture;
206class LambdaScopeInfo;
207class SemaPPCallbacks;
209} // namespace sema
210
211// AssignmentAction - This is used by all the assignment diagnostic functions
212// to represent what is actually causing the operation
223
224namespace threadSafety {
225class BeforeSet;
226void threadSafetyCleanup(BeforeSet *Cache);
227} // namespace threadSafety
228
229// FIXME: No way to easily map from TemplateTypeParmTypes to
230// TemplateTypeParmDecls, so we have this horrible PointerUnion.
231typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
232 const TemplateSpecializationType *,
233 const SubstBuiltinTemplatePackType *>,
236
237/// Describes whether we've seen any nullability information for the given
238/// file.
240 /// The first pointer declarator (of any pointer kind) in the file that does
241 /// not have a corresponding nullability annotation.
243
244 /// The end location for the first pointer declarator in the file. Used for
245 /// placing fix-its.
247
248 /// Which kind of pointer declarator we saw.
249 uint8_t PointerKind;
250
251 /// Whether we saw any type nullability annotations in the given file.
252 bool SawTypeNullability = false;
253};
254
255/// A mapping from file IDs to a record of whether we've seen nullability
256/// information in that file.
258 /// A mapping from file IDs to the nullability information for each file ID.
259 llvm::DenseMap<FileID, FileNullability> Map;
260
261 /// A single-element cache based on the file ID.
262 struct {
265 } Cache;
266
267public:
269 // Check the single-element cache.
270 if (file == Cache.File)
271 return Cache.Nullability;
272
273 // It's not in the single-element cache; flush the cache if we have one.
274 if (!Cache.File.isInvalid()) {
275 Map[Cache.File] = Cache.Nullability;
276 }
277
278 // Pull this entry into the cache.
279 Cache.File = file;
280 Cache.Nullability = Map[file];
281 return Cache.Nullability;
282 }
283};
284
285/// Tracks expected type during expression parsing, for use in code completion.
286/// The type is tied to a particular token, all functions that update or consume
287/// the type take a start location of the token they are looking at as a
288/// parameter. This avoids updating the type on hot paths in the parser.
290public:
292 : Ctx(Ctx), Enabled(Enabled) {}
293
297 /// Handles e.g. BaseType{ .D = Tok...
299 const Designation &D);
300 /// Computing a type for the function argument may require running
301 /// overloading, so we postpone its computation until it is actually needed.
302 ///
303 /// Clients should be very careful when using this function, as it stores a
304 /// function_ref, clients should make sure all calls to get() with the same
305 /// location happen while function_ref is alive.
306 ///
307 /// The callback should also emit signature help as a side-effect, but only
308 /// if the completion point has been reached.
310 llvm::function_ref<QualType()> ComputeType);
311
314 SourceLocation OpLoc);
317 void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
318 /// Handles all type casts, including C-style cast, C++ casts, etc.
320
321 /// Get the expected type associated with this location, if any.
322 ///
323 /// If the location is a function argument, determining the expected type
324 /// involves considering all function overloads and the arguments so far.
325 /// In this case, signature help for these function overloads will be reported
326 /// as a side-effect (only if the completion point has been reached).
328 if (!Enabled || Tok != ExpectedLoc)
329 return QualType();
330 if (!Type.isNull())
331 return Type;
332 if (ComputeType)
333 return ComputeType();
334 return QualType();
335 }
336
337private:
338 ASTContext *Ctx;
339 bool Enabled;
340 /// Start position of a token for which we store expected type.
341 SourceLocation ExpectedLoc;
342 /// Expected type for a token starting at ExpectedLoc.
344 /// A function to compute expected type at ExpectedLoc. It is only considered
345 /// if Type is null.
346 llvm::function_ref<QualType()> ComputeType;
347};
348
350 SkipBodyInfo() = default;
351 bool ShouldSkip = false;
353 NamedDecl *Previous = nullptr;
354 NamedDecl *New = nullptr;
355};
356
357/// Describes the result of template argument deduction.
358///
359/// The TemplateDeductionResult enumeration describes the result of
360/// template argument deduction, as returned from
361/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
362/// structure provides additional information about the results of
363/// template argument deduction, e.g., the deduced template argument
364/// list (if successful) or the specific template parameters or
365/// deduced arguments that were involved in the failure.
367 /// Template argument deduction was successful.
369 /// The declaration was invalid; do nothing.
371 /// Template argument deduction exceeded the maximum template
372 /// instantiation depth (which has already been diagnosed).
374 /// Template argument deduction did not deduce a value
375 /// for every template parameter.
377 /// Template argument deduction did not deduce a value for every
378 /// expansion of an expanded template parameter pack.
380 /// Template argument deduction produced inconsistent
381 /// deduced values for the given template parameter.
383 /// Template argument deduction failed due to inconsistent
384 /// cv-qualifiers on a template parameter type that would
385 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
386 /// but were given a non-const "X".
388 /// Substitution of the deduced template argument values
389 /// resulted in an error.
391 /// After substituting deduced template arguments, a dependent
392 /// parameter type did not match the corresponding argument.
394 /// After substituting deduced template arguments, an element of
395 /// a dependent parameter type did not match the corresponding element
396 /// of the corresponding argument (when deducing from an initializer list).
398 /// A non-depnedent component of the parameter did not match the
399 /// corresponding component of the argument.
401 /// When performing template argument deduction for a function
402 /// template, there were too many call arguments.
404 /// When performing template argument deduction for a function
405 /// template, there were too few call arguments.
407 /// The explicitly-specified template arguments were not valid
408 /// template arguments for the given template.
410 /// Checking non-dependent argument conversions failed.
412 /// The deduced arguments did not satisfy the constraints associated
413 /// with the template.
415 /// Deduction failed; that's all we know.
417 /// CUDA Target attributes do not match.
419 /// Some error which was already diagnosed.
421};
422
423/// Kinds of C++ special members.
433
434/// The kind of conversion being performed.
436 /// An implicit conversion.
438 /// A C-style cast.
440 /// A functional-style cast.
442 /// A cast other than a C-style cast.
444 /// A conversion for an operand of a builtin overloaded operator.
446};
447
448enum class TagUseKind {
449 Reference, // Reference to a tag: 'struct foo *X;'
450 Declaration, // Fwd decl of a tag: 'struct foo;'
451 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
452 Friend // Friend declaration: 'friend struct foo;'
453};
454
455/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
456enum class FunctionEffectMode : uint8_t {
457 None, // effect is not present.
458 False, // effect(false).
459 True, // effect(true).
460 Dependent // effect(expr) where expr is dependent.
461};
462
463/// pragma clang section kind
466 BSS = 1,
467 Data = 2,
469 Text = 4,
471};
472
473enum class PragmaClangSectionAction { Set = 0, Clear = 1 };
474
476 Native, // #pragma options align=native
477 Natural, // #pragma options align=natural
478 Packed, // #pragma options align=packed
479 Power, // #pragma options align=power
480 Mac68k, // #pragma options align=mac68k
481 Reset // #pragma options align=reset
482};
483
484enum class TUFragmentKind {
485 /// The global module fragment, between 'module;' and a module-declaration.
487 /// A normal translation unit fragment. For a non-module unit, this is the
488 /// entire translation unit. Otherwise, it runs from the module-declaration
489 /// to the private-module-fragment (if any) or the end of the TU (if not).
491 /// The private module fragment, between 'module :private;' and the end of
492 /// the translation unit.
494};
495
509
510// Used for emitting the right warning by DefaultVariadicArgumentPromotion
518
527
528// Contexts where using non-trivial C union types can be disallowed. This is
529// passed to err_non_trivial_c_union_in_invalid_context.
531 // Function parameter.
533 // Function return.
535 // Default-initialized object.
537 // Variable with automatic storage duration.
539 // Initializer expression that might copy from another object.
541 // Assignment.
543 // Compound literal.
545 // Block capture.
547 // lvalue-to-rvalue conversion of volatile type.
549};
550
551/// Describes the result of the name lookup and resolution performed
552/// by \c Sema::ClassifyName().
554 /// This name is not a type or template in this context, but might be
555 /// something else.
557 /// Classification failed; an error has been produced.
559 /// The name has been typo-corrected to a keyword.
561 /// The name was classified as a type.
563 /// The name was classified as a specific non-type, non-template
564 /// declaration. ActOnNameClassifiedAsNonType should be called to
565 /// convert the declaration to an expression.
567 /// The name was classified as an ADL-only function name.
568 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
569 /// result to an expression.
571 /// The name denotes a member of a dependent type that could not be
572 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
573 /// convert the result to an expression.
575 /// The name was classified as an overload set, and an expression
576 /// representing that overload set has been formed.
577 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
578 /// expression referencing the overload set.
580 /// The name was classified as a template whose specializations are types.
582 /// The name was classified as a variable template name.
584 /// The name was classified as a function template name.
586 /// The name was classified as an ADL-only function template name.
588 /// The name was classified as a concept name.
590};
591
593 // Address discrimination argument of __ptrauth.
595
596 // Extra discriminator argument of __ptrauth.
598};
599
600/// Common ways to introduce type names without a tag for use in diagnostics.
601/// Keep in sync with err_tag_reference_non_tag.
613
614enum class OffsetOfKind {
615 // Not parsing a type within __builtin_offsetof.
617 // Parsing a type within __builtin_offsetof.
619 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
620 // To improve our diagnostic message.
622};
623
624/// Describes the kind of merge to perform for availability
625/// attributes (including "deprecated", "unavailable", and "availability").
627 /// Don't merge availability attributes at all.
629 /// Merge availability attributes for a redeclaration, which requires
630 /// an exact match.
632 /// Merge availability attributes for an override, which requires
633 /// an exact match or a weakening of constraints.
635 /// Merge availability attributes for an implementation of
636 /// a protocol requirement.
638 /// Merge availability attributes for an implementation of
639 /// an optional protocol requirement.
641};
642
644 /// The triviality of a method unaffected by "trivial_abi".
646
647 /// The triviality of a method affected by "trivial_abi".
649};
650
652
653enum class AllowFoldKind {
656};
657
658/// Context in which we're performing a usual arithmetic conversion.
659enum class ArithConvKind {
660 /// An arithmetic operation.
662 /// A bitwise operation.
664 /// A comparison.
666 /// A conditional (?:) operator.
668 /// A compound assignment expression.
670};
671
672// Used for determining in which context a type is allowed to be passed to a
673// vararg function.
681
682/// AssignConvertType - All of the 'assignment' semantic checks return this
683/// enum to indicate whether the assignment was allowed. These checks are
684/// done for simple assignments, as well as initialization, return from
685/// function, argument passing, etc. The query is phrased in terms of a
686/// source and destination type.
688 /// Compatible - the types are compatible according to the standard.
690
691 /// CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because
692 /// a void * can implicitly convert to another pointer type, which we
693 /// differentiate for better diagnostic behavior.
695
696 /// PointerToInt - The assignment converts a pointer to an int, which we
697 /// accept as an extension.
699
700 /// IntToPointer - The assignment converts an int to a pointer, which we
701 /// accept as an extension.
703
704 /// FunctionVoidPointer - The assignment is between a function pointer and
705 /// void*, which the standard doesn't allow, but we accept as an extension.
707
708 /// IncompatiblePointer - The assignment is between two pointers types that
709 /// are not compatible, but we accept them as an extension.
711
712 /// IncompatibleFunctionPointer - The assignment is between two function
713 /// pointers types that are not compatible, but we accept them as an
714 /// extension.
716
717 /// IncompatibleFunctionPointerStrict - The assignment is between two
718 /// function pointer types that are not identical, but are compatible,
719 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
720 /// may trip an indirect call runtime check.
722
723 /// IncompatiblePointerSign - The assignment is between two pointers types
724 /// which point to integers which have a different sign, but are otherwise
725 /// identical. This is a subset of the above, but broken out because it's by
726 /// far the most common case of incompatible pointers.
728
729 /// CompatiblePointerDiscardsQualifiers - The assignment discards
730 /// c/v/r qualifiers, which we accept as an extension.
732
733 /// IncompatiblePointerDiscardsQualifiers - The assignment
734 /// discards qualifiers that we don't permit to be discarded,
735 /// like address spaces.
737
738 /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
739 /// changes address spaces in nested pointer types which is not allowed.
740 /// For instance, converting __private int ** to __generic int ** is
741 /// illegal even though __private could be converted to __generic.
743
744 /// IncompatibleNestedPointerQualifiers - The assignment is between two
745 /// nested pointer types, and the qualifiers other than the first two
746 /// levels differ e.g. char ** -> const char **, but we accept them as an
747 /// extension.
749
750 /// IncompatibleVectors - The assignment is between two vector types that
751 /// have the same size, which we accept as an extension.
753
754 /// IntToBlockPointer - The assignment converts an int to a block
755 /// pointer. We disallow this.
757
758 /// IncompatibleBlockPointer - The assignment is between two block
759 /// pointers types that are not compatible.
761
762 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
763 /// id type and something else (that is incompatible with it). For example,
764 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
766
767 /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
768 /// object with __weak qualifier.
770
771 /// Incompatible - We reject this conversion outright, it is invalid to
772 /// represent it in the AST.
774};
775
776/// The scope in which to find allocation functions.
778 /// Only look for allocation functions in the global scope.
780 /// Only look for allocation functions in the scope of the
781 /// allocated class.
783 /// Look for allocation functions in both the global scope
784 /// and in the scope of the allocated class.
786};
787
788/// Describes the result of an "if-exists" condition check.
789enum class IfExistsResult {
790 /// The symbol exists.
792
793 /// The symbol does not exist.
795
796 /// The name is a dependent name, so the results will differ
797 /// from one instantiation to the next.
799
800 /// An error occurred.
802};
803
804enum class CorrectTypoKind {
805 NonError, // CorrectTypo used in a non error recovery situation.
806 ErrorRecovery // CorrectTypo used in normal error recovery.
807};
808
809enum class OverloadKind {
810 /// This is a legitimate overload: the existing declarations are
811 /// functions or function templates with different signatures.
813
814 /// This is not an overload because the signature exactly matches
815 /// an existing declaration.
817
818 /// This is not an overload because the lookup results contain a
819 /// non-function.
821};
822
823/// Contexts in which a converted constant expression is required.
824enum class CCEKind {
825 CaseValue, ///< Expression in a case label.
826 Enumerator, ///< Enumerator value with fixed underlying type.
827 TemplateArg, ///< Value of a non-type template parameter.
828 TempArgStrict, ///< As above, but applies strict template checking
829 ///< rules.
830 ArrayBound, ///< Array bound in array declarator or new-expression.
831 ExplicitBool, ///< Condition in an explicit(bool) specifier.
832 Noexcept, ///< Condition in a noexcept(bool) specifier.
833 StaticAssertMessageSize, ///< Call to size() in a static assert
834 ///< message.
835 StaticAssertMessageData, ///< Call to data() in a static assert
836 ///< message.
837};
838
839/// Enums for the diagnostics of target, target_version and target_clones.
840namespace DiagAttrParams {
844} // end namespace DiagAttrParams
845
846void inferNoReturnAttr(Sema &S, const Decl *D);
847
848#ifdef __GNUC__
849#pragma GCC diagnostic push
850#pragma GCC diagnostic ignored "-Wattributes"
851#endif
852/// Sema - This implements semantic analysis and AST building for C.
853/// \nosubgrouping
854class Sema final : public SemaBase {
855#ifdef __GNUC__
856#pragma GCC diagnostic pop
857#endif
858 // Table of Contents
859 // -----------------
860 // 1. Semantic Analysis (Sema.cpp)
861 // 2. API Notes (SemaAPINotes.cpp)
862 // 3. C++ Access Control (SemaAccess.cpp)
863 // 4. Attributes (SemaAttr.cpp)
864 // 5. Availability Attribute Handling (SemaAvailability.cpp)
865 // 6. Bounds Safety (SemaBoundsSafety.cpp)
866 // 7. Casts (SemaCast.cpp)
867 // 8. Extra Semantic Checking (SemaChecking.cpp)
868 // 9. C++ Coroutines (SemaCoroutine.cpp)
869 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
870 // 11. Declarations (SemaDecl.cpp)
871 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
872 // 13. C++ Declarations (SemaDeclCXX.cpp)
873 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
874 // 15. Expressions (SemaExpr.cpp)
875 // 16. C++ Expressions (SemaExprCXX.cpp)
876 // 17. Member Access Expressions (SemaExprMember.cpp)
877 // 18. Initializers (SemaInit.cpp)
878 // 19. C++ Lambda Expressions (SemaLambda.cpp)
879 // 20. Name Lookup (SemaLookup.cpp)
880 // 21. Modules (SemaModule.cpp)
881 // 22. C++ Overloading (SemaOverload.cpp)
882 // 23. Statements (SemaStmt.cpp)
883 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
884 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
885 // 26. C++ Templates (SemaTemplate.cpp)
886 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
887 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
888 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
889 // 30. C++ Template Declaration Instantiation
890 // (SemaTemplateInstantiateDecl.cpp)
891 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
892 // 32. Constraints and Concepts (SemaConcept.cpp)
893 // 33. Types (SemaType.cpp)
894 // 34. FixIt Helpers (SemaFixItUtils.cpp)
895 // 35. Function Effects (SemaFunctionEffects.cpp)
896
897 /// \name Semantic Analysis
898 /// Implementations are in Sema.cpp
899 ///@{
900
901public:
902 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
904 CodeCompleteConsumer *CompletionConsumer = nullptr);
905 ~Sema();
906
907 /// Perform initialization that occurs after the parser has been
908 /// initialized but before it parses anything.
909 void Initialize();
910
911 /// This virtual key function only exists to limit the emission of debug info
912 /// describing the Sema class. GCC and Clang only emit debug info for a class
913 /// with a vtable when the vtable is emitted. Sema is final and not
914 /// polymorphic, but the debug info size savings are so significant that it is
915 /// worth adding a vtable just to take advantage of this optimization.
917
918 const LangOptions &getLangOpts() const { return LangOpts; }
921
924 Preprocessor &getPreprocessor() const { return PP; }
925 ASTContext &getASTContext() const { return Context; }
929
931 StringRef Platform);
933
934 /// Registers an external source. If an external source already exists,
935 /// creates a multiplex external source and appends to it.
936 ///
937 ///\param[in] E - A non-null external sema source.
938 ///
940
941 /// Print out statistics about the semantic analysis.
942 void PrintStats() const;
943
944 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
945 /// guaranteed). Produces a warning if we're low on stack space and allocates
946 /// more in that case. Use this in code that may recurse deeply (for example,
947 /// in template instantiation) to avoid stack overflow.
949 llvm::function_ref<void()> Fn);
950
951 /// Returns default addr space for method qualifiers.
953
954 /// Load weak undeclared identifiers from the external source.
956
957 /// Determine if VD, which must be a variable or function, is an external
958 /// symbol that nonetheless can't be referenced from outside this translation
959 /// unit because its type has no linkage and it's not extern "C".
960 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
961
962 /// Obtain a sorted list of functions that are undefined but ODR-used.
964 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
965
966 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
968 /// Retrieves list of suspicious delete-expressions that will be checked at
969 /// the end of translation unit.
970 const llvm::MapVector<FieldDecl *, DeleteLocs> &
972
973 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
974 /// This is closely coupled to the SemaDiagnosticBuilder class and
975 /// should not be used elsewhere.
976 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
977
978 void addImplicitTypedef(StringRef Name, QualType T);
979
980 /// Whether uncompilable error has occurred. This includes error happens
981 /// in deferred diagnostics.
982 bool hasUncompilableErrorOccurred() const;
983
984 /// Looks through the macro-expansion chain for the given
985 /// location, looking for a macro expansion with the given name.
986 /// If one is found, returns true and sets the location to that
987 /// expansion loc.
988 bool findMacroSpelling(SourceLocation &loc, StringRef name);
989
990 /// Calls \c Lexer::getLocForEndOfToken()
991 SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
992
993 /// Calls \c Lexer::findNextToken() to find the next token, and if the
994 /// locations of both ends of the token can be resolved it return that
995 /// range; Otherwise it returns an invalid SourceRange.
997 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
998 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
999
1000 /// Retrieve the module loader associated with the preprocessor.
1002
1003 /// Invent a new identifier for parameters of abbreviated templates.
1006 unsigned Index);
1007
1009
1010 // Emit all deferred diagnostics.
1011 void emitDeferredDiags();
1012
1013 /// This is called before the very first declaration in the translation unit
1014 /// is parsed. Note that the ASTContext may have already injected some
1015 /// declarations.
1017 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1018 /// translation unit when EOF is reached and all but the top-level scope is
1019 /// popped.
1022
1023 /// Determines the active Scope associated with the given declaration
1024 /// context.
1025 ///
1026 /// This routine maps a declaration context to the active Scope object that
1027 /// represents that declaration context in the parser. It is typically used
1028 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1029 /// declarations) that injects a name for name-lookup purposes and, therefore,
1030 /// must update the Scope.
1031 ///
1032 /// \returns The scope corresponding to the given declaraion context, or NULL
1033 /// if no such scope is open.
1035
1036 void PushFunctionScope();
1037 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1039
1040 /// This is used to inform Sema what the current TemplateParameterDepth
1041 /// is during Parsing. Currently it is used to pass on the depth
1042 /// when parsing generic lambda 'auto' parameters.
1043 void RecordParsingTemplateParameterDepth(unsigned Depth);
1044
1045 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1047 unsigned OpenMPCaptureLevel = 0);
1048
1049 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1050 /// time after they've been popped.
1052 Sema *Self;
1053
1054 public:
1055 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1057 };
1058
1060 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1061
1062 /// Pop a function (or block or lambda or captured region) scope from the
1063 /// stack.
1064 ///
1065 /// \param WP The warning policy to use for CFG-based warnings, or null if
1066 /// such warnings should not be produced.
1067 /// \param D The declaration corresponding to this function scope, if
1068 /// producing CFG-based warnings.
1069 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1072 const Decl *D = nullptr,
1073 QualType BlockType = QualType());
1074
1076
1081
1082 void PushCompoundScope(bool IsStmtExpr);
1083 void PopCompoundScope();
1084
1085 /// Determine whether any errors occurred within this function/method/
1086 /// block.
1088
1089 /// Retrieve the current block, if any.
1091
1092 /// Get the innermost lambda or block enclosing the current location, if any.
1093 /// This looks through intervening non-lambda, non-block scopes such as local
1094 /// functions.
1096
1097 /// Retrieve the current lambda scope info, if any.
1098 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1099 /// lambda scope info ignoring all inner capturing scopes that are not
1100 /// lambda scopes.
1102 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1103
1104 /// Retrieve the current generic lambda info, if any.
1106
1107 /// Retrieve the current captured region, if any.
1109
1110 void ActOnComment(SourceRange Comment);
1111
1112 /// Retrieve the parser's current scope.
1113 ///
1114 /// This routine must only be used when it is certain that semantic analysis
1115 /// and the parser are in precisely the same context, which is not the case
1116 /// when, e.g., we are performing any kind of template instantiation.
1117 /// Therefore, the only safe places to use this scope are in the parser
1118 /// itself and in routines directly invoked from the parser and *never* from
1119 /// template substitution or instantiation.
1120 Scope *getCurScope() const { return CurScope; }
1121
1123
1127
1128 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1129 const FunctionDecl *FD = nullptr);
1131 const PartialDiagnostic &PD,
1132 const FunctionDecl *FD = nullptr) {
1133 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1134 }
1135
1136 /// Check if the type is allowed to be used for the current target.
1138 ValueDecl *D = nullptr);
1139
1140 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1141 /// cast. If there is already an implicit cast, merge into the existing one.
1142 /// If isLvalue, the result of the cast is an lvalue.
1145 const CXXCastPath *BasePath = nullptr,
1147
1148 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1149 /// to the conversion from scalar type ScalarTy to the Boolean type.
1151
1152 /// If \p AllowLambda is true, treat lambda as function.
1153 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1154
1155 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1156 /// current context is not inside a function. If \p AllowLambda is true,
1157 /// this can return the call operator of an enclosing lambda, otherwise
1158 /// lambdas are skipped when looking for an enclosing function.
1159 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1160
1161 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1162 /// the method decl for the method being parsed. If we're currently
1163 /// in a 'block', this returns the containing context.
1165
1166 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1167 /// or C function we're in, otherwise return null. If we're currently
1168 /// in a 'block', this returns the containing context.
1170
1171 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1172 /// _Nonnull one.
1174 SourceLocation Loc);
1175
1176 /// Warn when implicitly casting 0 to nullptr.
1177 void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
1178
1179 /// Warn when implicitly changing function effects.
1181 SourceLocation Loc);
1182
1183 /// makeUnavailableInSystemHeader - There is an error in the current
1184 /// context. If we're still in a system header, and we can plausibly
1185 /// make the relevant declaration unavailable instead of erroring, do
1186 /// so and return true.
1188 UnavailableAttr::ImplicitReason reason);
1189
1190 /// Retrieve a suitable printing policy for diagnostics.
1194
1195 /// Retrieve a suitable printing policy for diagnostics.
1197 const Preprocessor &PP);
1198
1199 /// Scope actions.
1201
1202 /// Determine whether \param D is function like (function or function
1203 /// template) for parsing.
1205
1206 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1207 /// because that allows us not to duplicate the constants in clang code,
1208 /// which we must to since we can't directly use the llvm constants.
1209 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1210 ///
1211 /// This is the greatest alignment value supported by load, store, and alloca
1212 /// instructions, and global values.
1213 static const unsigned MaxAlignmentExponent = 32;
1214 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1215
1216 /// Flag indicating whether or not to collect detailed statistics.
1218
1219 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1220
1221 /// Stack containing information about each of the nested
1222 /// function, block, and method scopes that are currently active.
1224
1225 /// The index of the first FunctionScope that corresponds to the current
1226 /// context.
1228
1229 /// Track the number of currently active capturing scopes.
1231
1232 llvm::BumpPtrAllocator BumpAlloc;
1233
1234 /// The kind of translation unit we are processing.
1235 ///
1236 /// When we're processing a complete translation unit, Sema will perform
1237 /// end-of-translation-unit semantic tasks (such as creating
1238 /// initializers for tentative definitions in C) once parsing has
1239 /// completed. Modules and precompiled headers perform different kinds of
1240 /// checks.
1242
1243 /// Translation Unit Scope - useful to Objective-C actions that need
1244 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1245 /// For example, user-defined classes, built-in "id" type, etc.
1247
1249 return CurScope->incrementMSManglingNumber();
1250 }
1251
1252 /// Try to recover by turning the given expression into a
1253 /// call. Returns true if recovery was attempted or an error was
1254 /// emitted; this may also leave the ExprResult invalid.
1256 bool ForceComplain = false,
1257 bool (*IsPlausibleResult)(QualType) = nullptr);
1258
1259 /// Figure out if an expression could be turned into a call.
1260 ///
1261 /// Use this when trying to recover from an error where the programmer may
1262 /// have written just the name of a function instead of actually calling it.
1263 ///
1264 /// \param E - The expression to examine.
1265 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1266 /// with no arguments, this parameter is set to the type returned by such a
1267 /// call; otherwise, it is set to an empty QualType.
1268 /// \param OverloadSet - If the expression is an overloaded function
1269 /// name, this parameter is populated with the decls of the various
1270 /// overloads.
1271 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1272 UnresolvedSetImpl &NonTemplateOverloads);
1273
1277
1280
1288
1289 /// A RAII object to enter scope of a compound statement.
1291 public:
1292 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1293 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1294 }
1295
1296 ~CompoundScopeRAII() { S.ActOnFinishOfCompoundStmt(); }
1297
1298 private:
1299 Sema &S;
1300 };
1301
1302 /// An RAII helper that pops function a function scope on exit.
1308 if (Active)
1309 S.PopFunctionScopeInfo();
1310 }
1311 void disable() { Active = false; }
1312 };
1313
1315 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1316 }
1317
1318 /// Worker object for performing CFG-based warnings.
1321
1322 /// Callback to the parser to parse templated functions when needed.
1323 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1324 typedef void LateTemplateParserCleanupCB(void *P);
1328
1330 LateTemplateParserCleanupCB *LTPCleanup, void *P) {
1331 LateTemplateParser = LTP;
1332 LateTemplateParserCleanup = LTPCleanup;
1333 OpaqueParser = P;
1334 }
1335
1336 /// Callback to the parser to parse a type expressed as a string.
1337 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1339
1340 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1341 /// This is used as part of a hack to omit that class from ADL results.
1343
1344 /// Is the last error level diagnostic immediate. This is used to determined
1345 /// whether the next info diagnostic should be immediate.
1347
1348 class DelayedDiagnostics;
1349
1351 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1353 };
1356
1357 /// A class which encapsulates the logic for delaying diagnostics
1358 /// during parsing and other processing.
1360 /// The current pool of diagnostics into which delayed
1361 /// diagnostics should go.
1362 sema::DelayedDiagnosticPool *CurPool = nullptr;
1363
1364 public:
1366
1367 /// Adds a delayed diagnostic.
1368 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1369
1370 /// Determines whether diagnostics should be delayed.
1371 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1372
1373 /// Returns the current delayed-diagnostics pool.
1374 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1375
1376 /// Enter a new scope. Access and deprecation diagnostics will be
1377 /// collected in this pool.
1380 state.SavedPool = CurPool;
1381 CurPool = &pool;
1382 return state;
1383 }
1384
1385 /// Leave a delayed-diagnostic state that was previously pushed.
1386 /// Do not emit any of the diagnostics. This is performed as part
1387 /// of the bookkeeping of popping a pool "properly".
1389 CurPool = state.SavedPool;
1390 }
1391
1392 /// Enter a new scope where access and deprecation diagnostics are
1393 /// not delayed.
1396 state.SavedPool = CurPool;
1397 CurPool = nullptr;
1398 return state;
1399 }
1400
1401 /// Undo a previous pushUndelayed().
1403 assert(CurPool == nullptr);
1404 CurPool = state.SavedPool;
1405 }
1407
1411
1412 /// Diagnostics that are emitted only if we discover that the given function
1413 /// must be codegen'ed. Because handling these correctly adds overhead to
1414 /// compilation, this is currently only enabled for CUDA compilations.
1415 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1416
1417 /// CurContext - This is the current declaration context of parsing.
1419
1421 assert(AMDGPUPtr);
1422 return *AMDGPUPtr;
1423 }
1424
1426 assert(ARMPtr);
1427 return *ARMPtr;
1428 }
1429
1431 assert(AVRPtr);
1432 return *AVRPtr;
1433 }
1434
1436 assert(BPFPtr);
1437 return *BPFPtr;
1438 }
1439
1441 assert(CodeCompletionPtr);
1442 return *CodeCompletionPtr;
1443 }
1444
1446 assert(CUDAPtr);
1447 return *CUDAPtr;
1448 }
1449
1451 assert(DirectXPtr);
1452 return *DirectXPtr;
1453 }
1454
1456 assert(HLSLPtr);
1457 return *HLSLPtr;
1458 }
1459
1461 assert(HexagonPtr);
1462 return *HexagonPtr;
1463 }
1464
1466 assert(LoongArchPtr);
1467 return *LoongArchPtr;
1468 }
1469
1471 assert(M68kPtr);
1472 return *M68kPtr;
1473 }
1474
1476 assert(MIPSPtr);
1477 return *MIPSPtr;
1478 }
1479
1481 assert(MSP430Ptr);
1482 return *MSP430Ptr;
1483 }
1484
1486 assert(NVPTXPtr);
1487 return *NVPTXPtr;
1488 }
1489
1491 assert(ObjCPtr);
1492 return *ObjCPtr;
1493 }
1494
1496 assert(OpenACCPtr);
1497 return *OpenACCPtr;
1498 }
1499
1501 assert(OpenCLPtr);
1502 return *OpenCLPtr;
1503 }
1504
1506 assert(OpenMPPtr && "SemaOpenMP is dead");
1507 return *OpenMPPtr;
1508 }
1509
1511 assert(PPCPtr);
1512 return *PPCPtr;
1513 }
1514
1516 assert(PseudoObjectPtr);
1517 return *PseudoObjectPtr;
1518 }
1519
1521 assert(RISCVPtr);
1522 return *RISCVPtr;
1523 }
1524
1526 assert(SPIRVPtr);
1527 return *SPIRVPtr;
1528 }
1529
1531 assert(SYCLPtr);
1532 return *SYCLPtr;
1533 }
1534
1536 assert(SwiftPtr);
1537 return *SwiftPtr;
1538 }
1539
1541 assert(SystemZPtr);
1542 return *SystemZPtr;
1543 }
1544
1546 assert(WasmPtr);
1547 return *WasmPtr;
1548 }
1549
1551 assert(X86Ptr);
1552 return *X86Ptr;
1553 }
1554
1555 /// Source of additional semantic information.
1557
1558protected:
1559 friend class Parser;
1561 friend class ASTReader;
1562 friend class ASTDeclReader;
1563 friend class ASTWriter;
1564
1565private:
1566 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1567 bool WarnedDarwinSDKInfoMissing = false;
1568
1569 StackExhaustionHandler StackHandler;
1570
1571 Sema(const Sema &) = delete;
1572 void operator=(const Sema &) = delete;
1573
1574 /// The handler for the FileChanged preprocessor events.
1575 ///
1576 /// Used for diagnostics that implement custom semantic analysis for #include
1577 /// directives, like -Wpragma-pack.
1578 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1579
1580 /// The parser's current scope.
1581 ///
1582 /// The parser maintains this state here.
1583 Scope *CurScope;
1584
1585 mutable IdentifierInfo *Ident_super;
1586
1587 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1588 std::unique_ptr<SemaARM> ARMPtr;
1589 std::unique_ptr<SemaAVR> AVRPtr;
1590 std::unique_ptr<SemaBPF> BPFPtr;
1591 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1592 std::unique_ptr<SemaCUDA> CUDAPtr;
1593 std::unique_ptr<SemaDirectX> DirectXPtr;
1594 std::unique_ptr<SemaHLSL> HLSLPtr;
1595 std::unique_ptr<SemaHexagon> HexagonPtr;
1596 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1597 std::unique_ptr<SemaM68k> M68kPtr;
1598 std::unique_ptr<SemaMIPS> MIPSPtr;
1599 std::unique_ptr<SemaMSP430> MSP430Ptr;
1600 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1601 std::unique_ptr<SemaObjC> ObjCPtr;
1602 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1603 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1604 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1605 std::unique_ptr<SemaPPC> PPCPtr;
1606 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1607 std::unique_ptr<SemaRISCV> RISCVPtr;
1608 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1609 std::unique_ptr<SemaSYCL> SYCLPtr;
1610 std::unique_ptr<SemaSwift> SwiftPtr;
1611 std::unique_ptr<SemaSystemZ> SystemZPtr;
1612 std::unique_ptr<SemaWasm> WasmPtr;
1613 std::unique_ptr<SemaX86> X86Ptr;
1614
1615 ///@}
1616
1617 //
1618 //
1619 // -------------------------------------------------------------------------
1620 //
1621 //
1622
1623 /// \name API Notes
1624 /// Implementations are in SemaAPINotes.cpp
1625 ///@{
1626
1627public:
1628 /// Map any API notes provided for this declaration to attributes on the
1629 /// declaration.
1630 ///
1631 /// Triggered by declaration-attribute processing.
1632 void ProcessAPINotes(Decl *D);
1633 /// Apply the 'Nullability:' annotation to the specified declaration
1634 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1635 /// Apply the 'Type:' annotation to the specified declaration
1636 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1637
1638 /// Whether APINotes should be gathered for all applicable Swift language
1639 /// versions, without being applied. Leaving clients of the current module
1640 /// to select and apply the correct version.
1642 return APINotes.captureVersionIndependentSwift();
1643 }
1644 ///@}
1645
1646 //
1647 //
1648 // -------------------------------------------------------------------------
1649 //
1650 //
1651
1652 /// \name C++ Access Control
1653 /// Implementations are in SemaAccess.cpp
1654 ///@{
1655
1656public:
1663
1664 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1665 /// Returns true on error (when the previous member decl access specifier
1666 /// is different from the new member decl access specifier).
1667 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1668 NamedDecl *PrevMemberDecl,
1669 AccessSpecifier LexicalAS);
1670
1671 /// Perform access-control checking on a previously-unresolved member
1672 /// access which has now been resolved to a member.
1674 DeclAccessPair FoundDecl);
1676 DeclAccessPair FoundDecl);
1677
1678 /// Checks access to an overloaded operator new or delete.
1680 SourceRange PlacementRange,
1681 CXXRecordDecl *NamingClass,
1682 DeclAccessPair FoundDecl,
1683 bool Diagnose = true);
1684
1685 /// Checks access to a constructor.
1687 DeclAccessPair FoundDecl,
1688 const InitializedEntity &Entity,
1689 bool IsCopyBindingRefToTemp = false);
1690
1691 /// Checks access to a constructor.
1693 DeclAccessPair FoundDecl,
1694 const InitializedEntity &Entity,
1695 const PartialDiagnostic &PDiag);
1697 CXXDestructorDecl *Dtor,
1698 const PartialDiagnostic &PDiag,
1699 QualType objectType = QualType());
1700
1701 /// Checks access to the target of a friend declaration.
1703
1704 /// Checks access to a member.
1706 CXXRecordDecl *NamingClass,
1708
1709 /// Checks implicit access to a member in a structured binding.
1712 CXXRecordDecl *DecomposedClass,
1713 DeclAccessPair Field);
1715 const SourceRange &,
1716 DeclAccessPair FoundDecl);
1717
1718 /// Checks access to an overloaded member operator, including
1719 /// conversion operators.
1721 Expr *ArgExpr,
1722 DeclAccessPair FoundDecl);
1724 ArrayRef<Expr *> ArgExprs,
1725 DeclAccessPair FoundDecl);
1727 DeclAccessPair FoundDecl);
1728
1729 /// Checks access for a hierarchy conversion.
1730 ///
1731 /// \param ForceCheck true if this check should be performed even if access
1732 /// control is disabled; some things rely on this for semantics
1733 /// \param ForceUnprivileged true if this check should proceed as if the
1734 /// context had no special privileges
1736 QualType Derived, const CXXBasePath &Path,
1737 unsigned DiagID, bool ForceCheck = false,
1738 bool ForceUnprivileged = false);
1739
1741 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1742 const CXXBasePath &Path, unsigned DiagID,
1743 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1744 bool ForceCheck = false, bool ForceUnprivileged = false);
1745
1746 /// Checks access to all the declarations in the given result set.
1747 void CheckLookupAccess(const LookupResult &R);
1748
1749 /// Checks access to Target from the given class. The check will take access
1750 /// specifiers into account, but no member access expressions and such.
1751 ///
1752 /// \param Target the declaration to check if it can be accessed
1753 /// \param NamingClass the class in which the lookup was started.
1754 /// \param BaseType type of the left side of member access expression.
1755 /// \p BaseType and \p NamingClass are used for C++ access control.
1756 /// Depending on the lookup case, they should be set to the following:
1757 /// - lhs.target (member access without a qualifier):
1758 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1759 /// - lhs.X::target (member access with a qualifier):
1760 /// BaseType is the type of 'lhs', NamingClass is 'X'
1761 /// - X::target (qualified lookup without member access):
1762 /// BaseType is null, NamingClass is 'X'.
1763 /// - target (unqualified lookup).
1764 /// BaseType is null, NamingClass is the parent class of 'target'.
1765 /// \return true if the Target is accessible from the Class, false otherwise.
1766 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1767 QualType BaseType);
1768
1769 /// Is the given member accessible for the purposes of deciding whether to
1770 /// define a special member function as deleted?
1772 DeclAccessPair Found, QualType ObjectType,
1773 SourceLocation Loc,
1774 const PartialDiagnostic &Diag);
1777 QualType ObjectType) {
1778 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1779 SourceLocation(), PDiag());
1780 }
1781
1783 const DependentDiagnostic &DD,
1784 const MultiLevelTemplateArgumentList &TemplateArgs);
1786
1787 ///@}
1788
1789 //
1790 //
1791 // -------------------------------------------------------------------------
1792 //
1793 //
1794
1795 /// \name Attributes
1796 /// Implementations are in SemaAttr.cpp
1797 ///@{
1798
1799public:
1800 /// Controls member pointer representation format under the MS ABI.
1803
1804 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1805
1806 /// Source location for newly created implicit MSInheritanceAttrs
1808
1814
1820
1822 PSK_Reset = 0x0, // #pragma ()
1823 PSK_Set = 0x1, // #pragma (value)
1824 PSK_Push = 0x2, // #pragma (push[, id])
1825 PSK_Pop = 0x4, // #pragma (pop[, id])
1826 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1827 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1828 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1829 };
1830
1836
1837 // #pragma pack and align.
1839 public:
1840 // `Native` represents default align mode, which may vary based on the
1841 // platform.
1842 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1843
1844 // #pragma pack info constructor
1845 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1846 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1847 assert(Num == PackNumber && "The pack number has been truncated.");
1848 }
1849
1850 // #pragma align info constructor
1852 : PackAttr(false), AlignMode(M),
1853 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1854
1855 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1856
1858
1859 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1860 // integer encoding for it. This should only be passed to
1861 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1862 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1863 std::uint32_t Encoding{};
1864 if (Info.IsXLStack())
1865 Encoding |= IsXLMask;
1866
1867 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1868
1869 if (Info.IsPackAttr())
1870 Encoding |= PackAttrMask;
1871
1872 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1873
1874 return Encoding;
1875 }
1876
1877 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1878 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1880 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1881 int PackNumber = (Encoding & PackNumMask) >> 4;
1882
1883 if (Encoding & PackAttrMask)
1884 return AlignPackInfo(M, PackNumber, IsXL);
1885
1886 return AlignPackInfo(M, IsXL);
1887 }
1888
1889 bool IsPackAttr() const { return PackAttr; }
1890
1891 bool IsAlignAttr() const { return !PackAttr; }
1892
1893 Mode getAlignMode() const { return AlignMode; }
1894
1895 unsigned getPackNumber() const { return PackNumber; }
1896
1897 bool IsPackSet() const {
1898 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1899 // attriute on a decl.
1900 return PackNumber != UninitPackVal && PackNumber != 0;
1901 }
1902
1903 bool IsXLStack() const { return XLStack; }
1904
1905 bool operator==(const AlignPackInfo &Info) const {
1906 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1907 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1908 Info.XLStack);
1909 }
1910
1911 bool operator!=(const AlignPackInfo &Info) const {
1912 return !(*this == Info);
1913 }
1914
1915 private:
1916 /// \brief True if this is a pragma pack attribute,
1917 /// not a pragma align attribute.
1918 bool PackAttr;
1919
1920 /// \brief The alignment mode that is in effect.
1921 Mode AlignMode;
1922
1923 /// \brief The pack number of the stack.
1924 unsigned char PackNumber;
1925
1926 /// \brief True if it is a XL #pragma align/pack stack.
1927 bool XLStack;
1928
1929 /// \brief Uninitialized pack value.
1930 static constexpr unsigned char UninitPackVal = -1;
1931
1932 // Masks to encode and decode an AlignPackInfo.
1933 static constexpr uint32_t IsXLMask{0x0000'0001};
1934 static constexpr uint32_t AlignModeMask{0x0000'0006};
1935 static constexpr uint32_t PackAttrMask{0x00000'0008};
1936 static constexpr uint32_t PackNumMask{0x0000'01F0};
1937 };
1938
1939 template <typename ValueType> struct PragmaStack {
1951
1952 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1953 llvm::StringRef StackSlotLabel, ValueType Value) {
1954 if (Action == PSK_Reset) {
1956 CurrentPragmaLocation = PragmaLocation;
1957 return;
1958 }
1959 if (Action & PSK_Push)
1960 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1961 PragmaLocation);
1962 else if (Action & PSK_Pop) {
1963 if (!StackSlotLabel.empty()) {
1964 // If we've got a label, try to find it and jump there.
1965 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1966 return x.StackSlotLabel == StackSlotLabel;
1967 });
1968 // If we found the label so pop from there.
1969 if (I != Stack.rend()) {
1970 CurrentValue = I->Value;
1971 CurrentPragmaLocation = I->PragmaLocation;
1972 Stack.erase(std::prev(I.base()), Stack.end());
1973 }
1974 } else if (!Stack.empty()) {
1975 // We do not have a label, just pop the last entry.
1976 CurrentValue = Stack.back().Value;
1977 CurrentPragmaLocation = Stack.back().PragmaLocation;
1978 Stack.pop_back();
1979 }
1980 }
1981 if (Action & PSK_Set) {
1983 CurrentPragmaLocation = PragmaLocation;
1984 }
1985 }
1986
1987 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
1988 // method body to restore the stacks on exit, so it works like this:
1989 //
1990 // struct S {
1991 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
1992 // void Method {}
1993 // #pragma <name>(pop, InternalPragmaSlot)
1994 // };
1995 //
1996 // It works even with #pragma vtordisp, although MSVC doesn't support
1997 // #pragma vtordisp(push [, id], n)
1998 // syntax.
1999 //
2000 // Push / pop a named sentinel slot.
2001 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
2002 assert((Action == PSK_Push || Action == PSK_Pop) &&
2003 "Can only push / pop #pragma stack sentinels!");
2004 Act(CurrentPragmaLocation, Action, Label, CurrentValue);
2005 }
2006
2007 // Constructors.
2008 explicit PragmaStack(const ValueType &Default)
2010
2011 bool hasValue() const { return CurrentValue != DefaultValue; }
2012
2014 ValueType DefaultValue; // Value used for PSK_Reset action.
2015 ValueType CurrentValue;
2017 };
2018 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2019 // we shouldn't do so if they're in a module).
2020
2021 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2022 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2023 ///
2024 /// 0: Suppress all vtordisps
2025 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2026 /// structors
2027 /// 2: Always insert vtordisps to support RTTI on partially constructed
2028 /// objects
2031 // The current #pragma align/pack values and locations at each #include.
2038 // Segment #pragmas.
2043
2044 // #pragma strict_gs_check.
2046
2047 // This stack tracks the current state of Sema.CurFPFeatures.
2050 FPOptionsOverride result;
2051 if (!FpPragmaStack.hasValue()) {
2052 result = FPOptionsOverride();
2053 } else {
2054 result = FpPragmaStack.CurrentValue;
2055 }
2056 return result;
2057 }
2058
2065
2066 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2067 // Actions should be performed only if we enter / exit a C++ method body.
2069 public:
2070 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2072
2073 private:
2074 Sema &S;
2075 StringRef SlotLabel;
2076 bool ShouldAct;
2077 };
2078
2079 /// Last section used with #pragma init_seg.
2082
2083 /// Sections used with #pragma alloc_text.
2084 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2085
2086 /// VisContext - Manages the stack for \#pragma GCC visibility.
2087 void *VisContext; // Really a "PragmaVisStack*"
2088
2089 /// This an attribute introduced by \#pragma clang attribute.
2096
2097 /// A push'd group of PragmaAttributeEntries.
2099 /// The location of the push attribute.
2101 /// The namespace of this push group.
2104 };
2105
2107
2108 /// The declaration that is currently receiving an attribute from the
2109 /// #pragma attribute stack.
2111
2112 /// This represents the last location of a "#pragma clang optimize off"
2113 /// directive if such a directive has not been closed by an "on" yet. If
2114 /// optimizations are currently "on", this is set to an invalid location.
2116
2117 /// Get the location for the currently active "\#pragma clang optimize
2118 /// off". If this location is invalid, then the state of the pragma is "on".
2122
2123 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2124 /// whether the optimizations in the list passed to the pragma should be
2125 /// turned off or on. This boolean is true by default because command line
2126 /// options are honored when `#pragma optimize("", on)`.
2127 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2129
2130 /// Set of no-builtin functions listed by \#pragma function.
2132
2133 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2134 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2136
2137 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2139
2140 /// Add gsl::Pointer attribute to std::container::iterator
2141 /// \param ND The declaration that introduces the name
2142 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2143 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2144
2145 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2147
2148 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2150
2151 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2153
2154 /// Add [[gsl::Pointer]] attributes for std:: types.
2156
2157 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2158 StringRef ParamName);
2159 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2160 // can be the name of a function parameter, we need to parse the function
2161 // declaration and rest of the parameters before processesing 'X'. Therefore
2162 // do this lazily instead of processing while parsing the annotation itself.
2164
2165 /// Add _Nullable attributes for std:: types.
2167
2168 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2171 PragmaClangSectionKind SecKind,
2172 StringRef SecName);
2173
2174 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2176 SourceLocation PragmaLoc);
2177
2178 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2179 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2180 StringRef SlotLabel, Expr *Alignment);
2181
2182 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2183 /// (unless they are value dependent or type dependent). Returns false
2184 /// and emits a diagnostic if one or more of the arguments could not be
2185 /// folded into a constant.
2188
2193
2195 SourceLocation IncludeLoc);
2197
2198 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2200
2201 /// ActOnPragmaMSComment - Called on well formed
2202 /// \#pragma comment(kind, "arg").
2204 StringRef Arg);
2205
2206 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2207 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2208 StringRef Value);
2209
2210 /// Are precise floating point semantics currently enabled?
2212 return !CurFPFeatures.getAllowFPReassociate() &&
2213 !CurFPFeatures.getNoSignedZero() &&
2214 !CurFPFeatures.getAllowReciprocal() &&
2215 !CurFPFeatures.getAllowApproxFunc();
2216 }
2217
2220
2221 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2222 void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
2224
2225 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2226 /// pointers_to_members(representation method[, general purpose
2227 /// representation]).
2230 SourceLocation PragmaLoc);
2231
2232 /// Called on well formed \#pragma vtordisp().
2233 void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
2235
2236 bool UnifySection(StringRef SectionName, int SectionFlags,
2237 NamedDecl *TheDecl);
2238 bool UnifySection(StringRef SectionName, int SectionFlags,
2239 SourceLocation PragmaSectionLocation);
2240
2241 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2242 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2243 PragmaMsStackAction Action,
2244 llvm::StringRef StackSlotLabel,
2245 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2246
2247 /// Called on well formed \#pragma section().
2248 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2249 StringLiteral *SegmentName);
2250
2251 /// Called on well-formed \#pragma init_seg().
2252 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2253 StringLiteral *SegmentName);
2254
2255 /// Called on well-formed \#pragma alloc_text().
2257 SourceLocation PragmaLocation, StringRef Section,
2258 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2259 &Functions);
2260
2261 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2262 /// strict_gs_check.
2264 PragmaMsStackAction Action,
2265 bool Value);
2266
2267 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2268 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2269 SourceLocation PragmaLoc);
2270
2272 SourceLocation PragmaLoc,
2275 const IdentifierInfo *Namespace);
2276
2277 /// Called on well-formed '\#pragma clang attribute pop'.
2279 const IdentifierInfo *Namespace);
2280
2281 /// Adds the attributes that have been specified using the
2282 /// '\#pragma clang attribute push' directives to the given declaration.
2283 void AddPragmaAttributes(Scope *S, Decl *D);
2284
2286 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2288 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2289 // This bypasses a lot of the filters in the diag engine, as it's
2290 // to be used to attach notes to diagnostics which have already
2291 // been filtered through.
2292 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2293 PD.Emit(Builder);
2294 };
2295 }
2296
2302
2304
2305 /// Called on well formed \#pragma clang optimize.
2306 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2307
2308 /// #pragma optimize("[optimization-list]", on | off).
2309 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2310
2311 /// Call on well formed \#pragma function.
2312 void
2314 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2315
2316 /// Only called on function definitions; if there is a pragma in scope
2317 /// with the effect of a range-based optnone, consider marking the function
2318 /// with attribute optnone.
2320
2321 /// Only called on function definitions; if there is a `#pragma alloc_text`
2322 /// that decides which code section the function should be in, add
2323 /// attribute section to the function.
2325
2326 /// Adds the 'optnone' attribute to the function declaration if there
2327 /// are no conflicts; Loc represents the location causing the 'optnone'
2328 /// attribute to be added (usually because of a pragma).
2330
2331 /// Only called on function definitions; if there is a MSVC #pragma optimize
2332 /// in scope, consider changing the function's attributes based on the
2333 /// optimization list passed to the pragma.
2335
2336 /// Only called on function definitions; if there is a pragma in scope
2337 /// with the effect of a range-based no_builtin, consider marking the function
2338 /// with attribute no_builtin.
2340
2341 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2342 /// add an appropriate visibility attribute.
2344
2345 /// FreeVisContext - Deallocate and null out VisContext.
2346 void FreeVisContext();
2347
2348 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2349 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2350 SourceLocation PragmaLoc);
2351
2352 /// ActOnPragmaFPContract - Called on well formed
2353 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2354 /// \#pragma clang fp contract
2356
2357 /// Called on well formed
2358 /// \#pragma clang fp reassociate
2359 /// or
2360 /// \#pragma clang fp reciprocal
2362 bool IsEnabled);
2363
2364 /// ActOnPragmaFenvAccess - Called on well formed
2365 /// \#pragma STDC FENV_ACCESS
2366 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2367
2368 /// ActOnPragmaCXLimitedRange - Called on well formed
2369 /// \#pragma STDC CX_LIMITED_RANGE
2372
2373 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2376
2377 /// Called to set constant rounding mode for floating point operations.
2378 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2379
2380 /// Called to set exception behavior for floating point operations.
2382
2383 /// PushNamespaceVisibilityAttr - Note that we've entered a
2384 /// namespace with a visibility attribute.
2385 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2386 SourceLocation Loc);
2387
2388 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2389 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2390 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2391
2392 /// Handles semantic checking for features that are common to all attributes,
2393 /// such as checking whether a parameter was properly specified, or the
2394 /// correct number of arguments were passed, etc. Returns true if the
2395 /// attribute has been diagnosed.
2396 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2397 bool SkipArgCountCheck = false);
2398 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2399 bool SkipArgCountCheck = false);
2400
2401 ///@}
2402
2403 //
2404 //
2405 // -------------------------------------------------------------------------
2406 //
2407 //
2408
2409 /// \name Availability Attribute Handling
2410 /// Implementations are in SemaAvailability.cpp
2411 ///@{
2412
2413public:
2414 /// Issue any -Wunguarded-availability warnings in \c FD
2416
2418
2419 /// Retrieve the current function, if any, that should be analyzed for
2420 /// potential availability violations.
2422
2424 const ObjCInterfaceDecl *UnknownObjCClass,
2425 bool ObjCPropertyAccess,
2426 bool AvoidPartialAvailabilityChecks,
2427 ObjCInterfaceDecl *ClassReceiver);
2428
2430
2431 std::pair<AvailabilityResult, const NamedDecl *>
2432 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2433 ObjCInterfaceDecl *ClassReceiver);
2434 ///@}
2435
2436 //
2437 //
2438 // -------------------------------------------------------------------------
2439 //
2440 //
2441
2442 /// \name Bounds Safety
2443 /// Implementations are in SemaBoundsSafety.cpp
2444 ///@{
2445public:
2446 /// Check if applying the specified attribute variant from the "counted by"
2447 /// family of attributes to FieldDecl \p FD is semantically valid. If
2448 /// semantically invalid diagnostics will be emitted explaining the problems.
2449 ///
2450 /// \param FD The FieldDecl to apply the attribute to
2451 /// \param E The count expression on the attribute
2452 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2453 /// attributes. If the false the attribute is from
2454 /// "counted_by" family of attributes.
2455 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2456 /// of attributes. If false the attribute does not have the
2457 /// suffix.
2458 ///
2459 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2460 /// \p CountInBytes and \p OrNull both being true indicates the
2461 /// `counted_by_or_null` attribute.
2462 ///
2463 /// \returns false iff semantically valid.
2464 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2465 bool OrNull);
2466
2467 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2468 /// `__counted_by_or_null` pointer type \param LHSTy.
2469 ///
2470 /// \param LHSTy The type being assigned to. Checks will only be performed if
2471 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2472 /// \param RHSExpr The expression being assigned from.
2473 /// \param Action The type assignment being performed
2474 /// \param Loc The SourceLocation to use for error diagnostics
2475 /// \param Assignee The ValueDecl being assigned. This is used to compute
2476 /// the name of the assignee. If the assignee isn't known this can
2477 /// be set to nullptr.
2478 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2479 /// Assignee to compute the name of the assignee use the fully
2480 /// qualified name, otherwise use the unqualified name.
2481 ///
2482 /// \returns True iff no diagnostic where emitted, false otherwise.
2484 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2485 SourceLocation Loc, const ValueDecl *Assignee,
2486 bool ShowFullyQualifiedAssigneeName);
2487
2488 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2489 /// pointer.
2490 ///
2491 /// \param Entity The entity being initialized
2492 /// \param Kind The kind of initialization being performed
2493 /// \param Action The type assignment being performed
2494 /// \param LHSTy The type being assigned to. Checks will only be performed if
2495 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2496 /// \param RHSExpr The expression being used for initialization.
2497 ///
2498 /// \returns True iff no diagnostic where emitted, false otherwise.
2500 const InitializationKind &Kind,
2501 AssignmentAction Action,
2502 QualType LHSType, Expr *RHSExpr);
2503
2504 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2505 /// or counted_by_or_null pointers in \param E.
2506 ///
2507 /// \param E the expression to check
2508 ///
2509 /// \returns True iff no diagnostic where emitted, false otherwise.
2511 ///@}
2512
2513 //
2514 //
2515 // -------------------------------------------------------------------------
2516 //
2517 //
2518
2519 /// \name Casts
2520 /// Implementations are in SemaCast.cpp
2521 ///@{
2522
2523public:
2529
2530 /// ActOnCXXNamedCast - Parse
2531 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2533 SourceLocation LAngleBracketLoc, Declarator &D,
2534 SourceLocation RAngleBracketLoc,
2535 SourceLocation LParenLoc, Expr *E,
2536 SourceLocation RParenLoc);
2537
2539 TypeSourceInfo *Ty, Expr *E,
2540 SourceRange AngleBrackets, SourceRange Parens);
2541
2543 ExprResult Operand,
2544 SourceLocation RParenLoc);
2545
2547 Expr *Operand, SourceLocation RParenLoc);
2548
2549 // Checks that reinterpret casts don't have undefined behavior.
2550 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2551 bool IsDereference, SourceRange Range);
2552
2553 // Checks that the vector type should be initialized from a scalar
2554 // by splatting the value rather than populating a single element.
2555 // This is the case for AltiVecVector types as well as with
2556 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2557 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2558
2559 // Checks if the -faltivec-src-compat=gcc option is specified.
2560 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2561 // treated the same way as they are when trying to initialize
2562 // these vectors on gcc (an error is emitted).
2564 QualType SrcTy);
2565
2567 SourceLocation RParenLoc, Expr *Op);
2568
2570 SourceLocation LParenLoc,
2571 Expr *CastExpr,
2572 SourceLocation RParenLoc);
2573
2574 ///@}
2575
2576 //
2577 //
2578 // -------------------------------------------------------------------------
2579 //
2580 //
2581
2582 /// \name Extra Semantic Checking
2583 /// Implementations are in SemaChecking.cpp
2584 ///@{
2585
2586public:
2587 /// Used to change context to isConstantEvaluated without pushing a heavy
2588 /// ExpressionEvaluationContextRecord object.
2590
2595
2597 unsigned ByteNo) const;
2598
2600 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2601 FAPK_Variadic, // values to format are passed as variadic arguments
2602 FAPK_VAList, // values to format are passed in a va_list
2603 FAPK_Elsewhere, // values to format are not passed to this function
2604 };
2605
2606 // Used to grab the relevant information from a FormatAttr and a
2607 // FunctionDeclaration.
2613
2614 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2615 /// populate the FomatStringInfo parameter with the attribute's correct
2616 /// format_idx and firstDataArg. Returns true when the format fits the
2617 /// function and the FormatStringInfo has been populated.
2618 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2619 unsigned FirstArg, FormatStringInfo *FSI);
2620 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2621 bool IsCXXMember, bool IsVariadic,
2622 FormatStringInfo *FSI);
2623
2624 // Used by C++ template instantiation.
2626
2627 /// ConvertVectorExpr - Handle __builtin_convertvector
2629 SourceLocation BuiltinLoc,
2630 SourceLocation RParenLoc);
2631
2632 static StringRef GetFormatStringTypeName(FormatStringType FST);
2633 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2634 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2635 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2636
2637 bool FormatStringHasSArg(const StringLiteral *FExpr);
2638
2639 /// Check for comparisons of floating-point values using == and !=. Issue a
2640 /// warning if the comparison is not likely to do what the programmer
2641 /// intended.
2642 void CheckFloatComparison(SourceLocation Loc, const Expr *LHS,
2643 const Expr *RHS, BinaryOperatorKind Opcode);
2644
2645 /// Register a magic integral constant to be used as a type tag.
2646 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2647 uint64_t MagicValue, QualType Type,
2648 bool LayoutCompatible, bool MustBeNull);
2649
2652
2656
2658
2659 /// If true, \c Type should be compared with other expression's types for
2660 /// layout-compatibility.
2661 LLVM_PREFERRED_TYPE(bool)
2663 LLVM_PREFERRED_TYPE(bool)
2664 unsigned MustBeNull : 1;
2665 };
2666
2667 /// A pair of ArgumentKind identifier and magic value. This uniquely
2668 /// identifies the magic value.
2669 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2670
2671 /// Diagnoses the current set of gathered accesses. This happens at the end of
2672 /// each expression evaluation context. Diagnostics are emitted only for
2673 /// accesses gathered in the current evaluation context.
2675
2676 /// This function checks if the expression is in the sef of potentially
2677 /// misaligned members and it is converted to some pointer type T with lower
2678 /// or equal alignment requirements. If so it removes it. This is used when
2679 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2680 /// void*).
2681 void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
2682
2683 /// Returns true if `From` is a function or pointer to a function with the
2684 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2685 /// function without this attribute.
2686 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2687
2688 /// Returns true if `From` is a function or pointer to a function without the
2689 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2690 /// function with this attribute.
2691 bool AddingCFIUncheckedCallee(QualType From, QualType To) const;
2692
2693 /// This function calls Action when it determines that E designates a
2694 /// misaligned member due to the packed attribute. This is used to emit
2695 /// local diagnostics like in reference binding.
2697 Expr *E,
2698 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2699 Action);
2700
2701 enum class AtomicArgumentOrder { API, AST };
2703 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2704 SourceLocation RParenLoc, MultiExprArg Args,
2707
2708 /// Check to see if a given expression could have '.c_str()' called on it.
2709 bool hasCStrMethod(const Expr *E);
2710
2711 /// Diagnose pointers that are always non-null.
2712 /// \param E the expression containing the pointer
2713 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2714 /// compared to a null pointer
2715 /// \param IsEqual True when the comparison is equal to a null pointer
2716 /// \param Range Extra SourceRange to highlight in the diagnostic
2719 bool IsEqual, SourceRange Range);
2720
2721 /// CheckParmsForFunctionDef - Check that the parameters of the given
2722 /// function are appropriate for the definition of a function. This
2723 /// takes care of any checks that cannot be performed on the
2724 /// declaration itself, e.g., that the types of each of the function
2725 /// parameters are complete.
2727 bool CheckParameterNames);
2728
2729 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2730 /// pointer cast increases the alignment requirements.
2731 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2732
2733 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2734 /// to weak/__unsafe_unretained type.
2735 bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
2736
2737 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2738 /// to weak/__unsafe_unretained expression.
2739 void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
2740
2741 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2742 /// statement as a \p Body, and it is located on the same line.
2743 ///
2744 /// This helps prevent bugs due to typos, such as:
2745 /// if (condition);
2746 /// do_stuff();
2747 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2748 unsigned DiagID);
2749
2750 /// Warn if a for/while loop statement \p S, which is followed by
2751 /// \p PossibleBody, has a suspicious null statement as a body.
2752 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2753
2754 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2755 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2756 SourceLocation OpLoc);
2757
2758 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2760 const TypeSourceInfo *Derived);
2761
2762 /// CheckFunctionCall - Check a direct function call for various correctness
2763 /// and safety properties not strictly enforced by the C type system.
2764 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2765 const FunctionProtoType *Proto);
2766
2773
2774 /// \param FPOnly restricts the arguments to floating-point types.
2775 std::optional<QualType>
2776 BuiltinVectorMath(CallExpr *TheCall,
2779 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2780
2781 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2782 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2783
2784 /// Handles the checks for format strings, non-POD arguments to vararg
2785 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2786 /// attributes and AArch64 SME attributes.
2787 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2788 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2789 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2790 VariadicCallType CallType);
2791
2792 /// Verify that two format strings (as understood by attribute(format) and
2793 /// attribute(format_matches) are compatible. If they are incompatible,
2794 /// diagnostics are emitted with the assumption that \c
2795 /// AuthoritativeFormatString is correct and
2796 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2797 /// diagnostics will point to it and a note will refer to \c
2798 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2799 bool
2801 const StringLiteral *AuthoritativeFormatString,
2802 const StringLiteral *TestedFormatString,
2803 const Expr *FunctionCallArg = nullptr);
2804
2805 /// Verify that one format string (as understood by attribute(format)) is
2806 /// self-consistent; for instance, that it doesn't have multiple positional
2807 /// arguments referring to the same argument in incompatible ways. Diagnose
2808 /// if it isn't.
2810
2811 /// \brief Enforce the bounds of a TCB
2812 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2813 /// directly calls other functions in the same TCB as marked by the
2814 /// enforce_tcb and enforce_tcb_leaf attributes.
2815 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2816 const NamedDecl *Callee);
2817
2818 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2819
2820 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2821 /// TheCall is a constant expression.
2822 bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum,
2823 llvm::APSInt &Result);
2824
2825 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2826 /// TheCall is a constant expression in the range [Low, High].
2827 bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low,
2828 int High, bool RangeIsError = true);
2829
2830 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2831 /// TheCall is a constant expression is a multiple of Num..
2832 bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum,
2833 unsigned Multiple);
2834
2835 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2836 /// constant expression representing a power of 2.
2837 bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum);
2838
2839 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2840 /// a constant expression representing an arbitrary byte value shifted left by
2841 /// a multiple of 8 bits.
2842 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum,
2843 unsigned ArgBits);
2844
2845 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2846 /// TheCall is a constant expression representing either a shifted byte value,
2847 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2848 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2849 /// Arm MVE intrinsics.
2850 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum,
2851 unsigned ArgBits);
2852
2853 /// Checks that a call expression's argument count is at least the desired
2854 /// number. This is useful when doing custom type-checking on a variadic
2855 /// function. Returns true on error.
2856 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2857
2858 /// Checks that a call expression's argument count is at most the desired
2859 /// number. This is useful when doing custom type-checking on a variadic
2860 /// function. Returns true on error.
2861 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2862
2863 /// Checks that a call expression's argument count is in the desired range.
2864 /// This is useful when doing custom type-checking on a variadic function.
2865 /// Returns true on error.
2866 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2867 unsigned MaxArgCount);
2868
2869 /// Checks that a call expression's argument count is the desired number.
2870 /// This is useful when doing custom type-checking. Returns true on error.
2871 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2872
2873 /// Returns true if the argument consists of one contiguous run of 1s with any
2874 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2875 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2876 /// since all 1s are not contiguous.
2877 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2878
2880 bool *ICContext = nullptr,
2881 bool IsListInit = false);
2882
2883 bool
2888 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2890
2891private:
2892 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2893 const ArraySubscriptExpr *ASE = nullptr,
2894 bool AllowOnePastEnd = true, bool IndexNegated = false);
2895 void CheckArrayAccess(const Expr *E);
2896
2897 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2898 const FunctionProtoType *Proto);
2899
2900 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2901 /// such as function pointers returned from functions.
2902 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2903
2904 /// CheckConstructorCall - Check a constructor call for correctness and safety
2905 /// properties not enforced by the C type system.
2906 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2908 const FunctionProtoType *Proto, SourceLocation Loc);
2909
2910 /// Warn if a pointer or reference argument passed to a function points to an
2911 /// object that is less aligned than the parameter. This can happen when
2912 /// creating a typedef with a lower alignment than the original type and then
2913 /// calling functions defined in terms of the original type.
2914 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2915 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2916
2917 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2918
2919 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2920 CallExpr *TheCall);
2921
2922 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2923 CallExpr *TheCall);
2924
2925 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2926
2927 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2928 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2929 /// on failure; return false on success.
2930 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2931 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2932
2933 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2934 /// friends. This is declared to take (...), so we have to check everything.
2935 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2936
2937 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2938 /// __builtin_isnan and friends. This is declared to take (...), so we have
2939 /// to check everything.
2940 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2941 unsigned BuiltinID);
2942
2943 /// Perform semantic analysis for a call to __builtin_complex.
2944 bool BuiltinComplex(CallExpr *TheCall);
2945 bool BuiltinOSLogFormat(CallExpr *TheCall);
2946
2947 /// BuiltinPrefetch - Handle __builtin_prefetch.
2948 /// This is declared to take (const void*, ...) and can take two
2949 /// optional constant int args.
2950 bool BuiltinPrefetch(CallExpr *TheCall);
2951
2952 /// Handle __builtin_alloca_with_align. This is declared
2953 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
2954 /// than 8.
2955 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
2956
2957 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
2958 bool BuiltinArithmeticFence(CallExpr *TheCall);
2959
2960 /// BuiltinAssume - Handle __assume (MS Extension).
2961 /// __assume does not evaluate its arguments, and should warn if its argument
2962 /// has side effects.
2963 bool BuiltinAssume(CallExpr *TheCall);
2964
2965 /// Handle __builtin_assume_aligned. This is declared
2966 /// as (const void*, size_t, ...) and can take one optional constant int arg.
2967 bool BuiltinAssumeAligned(CallExpr *TheCall);
2968
2969 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
2970 /// This checks that the target supports __builtin_longjmp and
2971 /// that val is a constant 1.
2972 bool BuiltinLongjmp(CallExpr *TheCall);
2973
2974 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
2975 /// This checks that the target supports __builtin_setjmp.
2976 bool BuiltinSetjmp(CallExpr *TheCall);
2977
2978 /// We have a call to a function like __sync_fetch_and_add, which is an
2979 /// overloaded function based on the pointer type of its first argument.
2980 /// The main BuildCallExpr routines have already promoted the types of
2981 /// arguments because all of these calls are prototyped as void(...).
2982 ///
2983 /// This function goes through and does final semantic checking for these
2984 /// builtins, as well as generating any warnings.
2985 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
2986
2987 /// BuiltinNontemporalOverloaded - We have a call to
2988 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
2989 /// overloaded function based on the pointer type of its last argument.
2990 ///
2991 /// This function goes through and does final semantic checking for these
2992 /// builtins.
2993 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
2994 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
2996
2997 /// \param FPOnly restricts the arguments to floating-point types.
2998 bool BuiltinElementwiseMath(CallExpr *TheCall,
3001 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
3002
3003 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3004
3005 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3007 bool BuiltinCountedByRef(CallExpr *TheCall);
3008
3009 // Matrix builtin handling.
3010 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3011 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3012 ExprResult CallResult);
3013 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3014 ExprResult CallResult);
3015
3016 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3017 /// functions) for correct use of format strings.
3018 /// Returns true if a format string has been fully checked.
3019 bool CheckFormatArguments(const FormatAttr *Format,
3020 ArrayRef<const Expr *> Args, bool IsCXXMember,
3021 VariadicCallType CallType, SourceLocation Loc,
3022 SourceRange Range,
3023 llvm::SmallBitVector &CheckedVarArgs);
3024 bool CheckFormatString(const FormatMatchesAttr *Format,
3025 ArrayRef<const Expr *> Args, bool IsCXXMember,
3026 VariadicCallType CallType, SourceLocation Loc,
3027 SourceRange Range,
3028 llvm::SmallBitVector &CheckedVarArgs);
3029 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3030 FormatArgumentPassingKind FAPK,
3031 const StringLiteral *ReferenceFormatString,
3032 unsigned format_idx, unsigned firstDataArg,
3034 SourceLocation Loc, SourceRange range,
3035 llvm::SmallBitVector &CheckedVarArgs);
3036
3037 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3038
3039 /// Warn when using the wrong abs() function.
3040 void CheckAbsoluteValueFunction(const CallExpr *Call,
3041 const FunctionDecl *FDecl);
3042
3043 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3044
3045 /// Check for dangerous or invalid arguments to memset().
3046 ///
3047 /// This issues warnings on known problematic, dangerous or unspecified
3048 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3049 /// function calls.
3050 ///
3051 /// \param Call The call expression to diagnose.
3052 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3053 IdentifierInfo *FnName);
3054
3055 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3056 // be the size of the source, instead of the destination.
3057 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3058
3059 // Warn on anti-patterns as the 'size' argument to strncat.
3060 // The correct size argument should look like following:
3061 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3062 void CheckStrncatArguments(const CallExpr *Call,
3063 const IdentifierInfo *FnName);
3064
3065 /// Alerts the user that they are attempting to free a non-malloc'd object.
3066 void CheckFreeArguments(const CallExpr *E);
3067
3068 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3069 SourceLocation ReturnLoc, bool isObjCMethod = false,
3070 const AttrVec *Attrs = nullptr,
3071 const FunctionDecl *FD = nullptr);
3072
3073 /// Diagnoses "dangerous" implicit conversions within the given
3074 /// expression (which is a full expression). Implements -Wconversion
3075 /// and -Wsign-compare.
3076 ///
3077 /// \param CC the "context" location of the implicit conversion, i.e.
3078 /// the most location of the syntactic entity requiring the implicit
3079 /// conversion
3080 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3081
3082 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3083 /// Input argument E is a logical expression.
3085
3086 /// Diagnose when expression is an integer constant expression and its
3087 /// evaluation results in integer overflow
3088 void CheckForIntOverflow(const Expr *E);
3089 void CheckUnsequencedOperations(const Expr *E);
3090
3091 /// Perform semantic checks on a completed expression. This will either
3092 /// be a full-expression or a default argument expression.
3093 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3094 bool IsConstexpr = false);
3095
3096 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3097 Expr *Init);
3098
3099 /// A map from magic value to type information.
3100 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3101 TypeTagForDatatypeMagicValues;
3102
3103 /// Peform checks on a call of a function with argument_with_type_tag
3104 /// or pointer_with_type_tag attributes.
3105 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3106 const ArrayRef<const Expr *> ExprArgs,
3107 SourceLocation CallSiteLoc);
3108
3109 /// Check if we are taking the address of a packed field
3110 /// as this may be a problem if the pointer value is dereferenced.
3111 void CheckAddressOfPackedMember(Expr *rhs);
3112
3113 /// Helper class that collects misaligned member designations and
3114 /// their location info for delayed diagnostics.
3115 struct MisalignedMember {
3116 Expr *E;
3117 RecordDecl *RD;
3118 ValueDecl *MD;
3119 CharUnits Alignment;
3120
3121 MisalignedMember() : E(), RD(), MD() {}
3122 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3123 CharUnits Alignment)
3124 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3125 explicit MisalignedMember(Expr *E)
3126 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3127
3128 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3129 };
3130
3131 /// Adds an expression to the set of gathered misaligned members.
3132 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3133 CharUnits Alignment);
3134 ///@}
3135
3136 //
3137 //
3138 // -------------------------------------------------------------------------
3139 //
3140 //
3141
3142 /// \name C++ Coroutines
3143 /// Implementations are in SemaCoroutine.cpp
3144 ///@{
3145
3146public:
3147 /// The C++ "std::coroutine_traits" template, which is defined in
3148 /// <coroutine_traits>
3150
3152 StringRef Keyword);
3156
3159 UnresolvedLookupExpr *Lookup);
3161 Expr *Awaiter, bool IsImplicit = false);
3163 UnresolvedLookupExpr *Lookup);
3166 bool IsImplicit = false);
3171
3172 // As a clang extension, enforces that a non-coroutine function must be marked
3173 // with [[clang::coro_wrapper]] if it returns a type marked with
3174 // [[clang::coro_return_type]].
3175 // Expects that FD is not a coroutine.
3177 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3178 /// namespace. The namespace found is recorded in Namespace.
3180 SourceLocation FuncLoc);
3181 /// Check that the expression co_await promise.final_suspend() shall not be
3182 /// potentially-throwing.
3183 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3184
3185 ///@}
3186
3187 //
3188 //
3189 // -------------------------------------------------------------------------
3190 //
3191 //
3192
3193 /// \name C++ Scope Specifiers
3194 /// Implementations are in SemaCXXScopeSpec.cpp
3195 ///@{
3196
3197public:
3198 // Marks SS invalid if it represents an incomplete type.
3200 // Complete an enum decl, maybe without a scope spec.
3202 CXXScopeSpec *SS = nullptr);
3203
3204 /// Compute the DeclContext that is associated with the given type.
3205 ///
3206 /// \param T the type for which we are attempting to find a DeclContext.
3207 ///
3208 /// \returns the declaration context represented by the type T,
3209 /// or NULL if the declaration context cannot be computed (e.g., because it is
3210 /// dependent and not the current instantiation).
3212
3213 /// Compute the DeclContext that is associated with the given
3214 /// scope specifier.
3215 ///
3216 /// \param SS the C++ scope specifier as it appears in the source
3217 ///
3218 /// \param EnteringContext when true, we will be entering the context of
3219 /// this scope specifier, so we can retrieve the declaration context of a
3220 /// class template or class template partial specialization even if it is
3221 /// not the current instantiation.
3222 ///
3223 /// \returns the declaration context represented by the scope specifier @p SS,
3224 /// or NULL if the declaration context cannot be computed (e.g., because it is
3225 /// dependent and not the current instantiation).
3227 bool EnteringContext = false);
3229
3230 /// If the given nested name specifier refers to the current
3231 /// instantiation, return the declaration that corresponds to that
3232 /// current instantiation (C++0x [temp.dep.type]p1).
3233 ///
3234 /// \param NNS a dependent nested name specifier.
3236
3237 /// The parser has parsed a global nested-name-specifier '::'.
3238 ///
3239 /// \param CCLoc The location of the '::'.
3240 ///
3241 /// \param SS The nested-name-specifier, which will be updated in-place
3242 /// to reflect the parsed nested-name-specifier.
3243 ///
3244 /// \returns true if an error occurred, false otherwise.
3246
3247 /// The parser has parsed a '__super' nested-name-specifier.
3248 ///
3249 /// \param SuperLoc The location of the '__super' keyword.
3250 ///
3251 /// \param ColonColonLoc The location of the '::'.
3252 ///
3253 /// \param SS The nested-name-specifier, which will be updated in-place
3254 /// to reflect the parsed nested-name-specifier.
3255 ///
3256 /// \returns true if an error occurred, false otherwise.
3258 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3259
3260 /// Determines whether the given declaration is an valid acceptable
3261 /// result for name lookup of a nested-name-specifier.
3262 /// \param SD Declaration checked for nested-name-specifier.
3263 /// \param IsExtension If not null and the declaration is accepted as an
3264 /// extension, the pointed variable is assigned true.
3266 bool *CanCorrect = nullptr);
3267
3268 /// If the given nested-name-specifier begins with a bare identifier
3269 /// (e.g., Base::), perform name lookup for that identifier as a
3270 /// nested-name-specifier within the given scope, and return the result of
3271 /// that name lookup.
3273
3274 /// Keeps information about an identifier in a nested-name-spec.
3275 ///
3277 /// The type of the object, if we're parsing nested-name-specifier in
3278 /// a member access expression.
3280
3281 /// The identifier preceding the '::'.
3283
3284 /// The location of the identifier.
3286
3287 /// The location of the '::'.
3289
3290 /// Creates info object for the most typical case.
3292 SourceLocation ColonColonLoc,
3295 CCLoc(ColonColonLoc) {}
3296
3298 SourceLocation ColonColonLoc, QualType ObjectType)
3300 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3301 };
3302
3303 /// Build a new nested-name-specifier for "identifier::", as described
3304 /// by ActOnCXXNestedNameSpecifier.
3305 ///
3306 /// \param S Scope in which the nested-name-specifier occurs.
3307 /// \param IdInfo Parser information about an identifier in the
3308 /// nested-name-spec.
3309 /// \param EnteringContext If true, enter the context specified by the
3310 /// nested-name-specifier.
3311 /// \param SS Optional nested name specifier preceding the identifier.
3312 /// \param ScopeLookupResult Provides the result of name lookup within the
3313 /// scope of the nested-name-specifier that was computed at template
3314 /// definition time.
3315 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3316 /// error recovery and what kind of recovery is performed.
3317 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3318 /// are allowed. The bool value pointed by this parameter is set to
3319 /// 'true' if the identifier is treated as if it was followed by ':',
3320 /// not '::'.
3321 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3322 ///
3323 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3324 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3325 /// the result of name lookup within the scope of the nested-name-specifier
3326 /// that was computed at template definition time.
3327 ///
3328 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3329 /// recovery. This means that it should not emit diagnostics, it should
3330 /// just return true on failure. It also means it should only return a valid
3331 /// scope if it *knows* that the result is correct. It should not return in a
3332 /// dependent context, for example. Nor will it extend \p SS with the scope
3333 /// specifier.
3334 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3335 bool EnteringContext, CXXScopeSpec &SS,
3336 NamedDecl *ScopeLookupResult,
3337 bool ErrorRecoveryLookup,
3338 bool *IsCorrectedToColon = nullptr,
3339 bool OnlyNamespace = false);
3340
3341 /// The parser has parsed a nested-name-specifier 'identifier::'.
3342 ///
3343 /// \param S The scope in which this nested-name-specifier occurs.
3344 ///
3345 /// \param IdInfo Parser information about an identifier in the
3346 /// nested-name-spec.
3347 ///
3348 /// \param EnteringContext Whether we're entering the context nominated by
3349 /// this nested-name-specifier.
3350 ///
3351 /// \param SS The nested-name-specifier, which is both an input
3352 /// parameter (the nested-name-specifier before this type) and an
3353 /// output parameter (containing the full nested-name-specifier,
3354 /// including this new type).
3355 ///
3356 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3357 /// are allowed. The bool value pointed by this parameter is set to 'true'
3358 /// if the identifier is treated as if it was followed by ':', not '::'.
3359 ///
3360 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3361 ///
3362 /// \returns true if an error occurred, false otherwise.
3363 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3364 bool EnteringContext, CXXScopeSpec &SS,
3365 bool *IsCorrectedToColon = nullptr,
3366 bool OnlyNamespace = false);
3367
3368 /// The parser has parsed a nested-name-specifier
3369 /// 'template[opt] template-name < template-args >::'.
3370 ///
3371 /// \param S The scope in which this nested-name-specifier occurs.
3372 ///
3373 /// \param SS The nested-name-specifier, which is both an input
3374 /// parameter (the nested-name-specifier before this type) and an
3375 /// output parameter (containing the full nested-name-specifier,
3376 /// including this new type).
3377 ///
3378 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3379 /// \param TemplateName the template name.
3380 /// \param TemplateNameLoc The location of the template name.
3381 /// \param LAngleLoc The location of the opening angle bracket ('<').
3382 /// \param TemplateArgs The template arguments.
3383 /// \param RAngleLoc The location of the closing angle bracket ('>').
3384 /// \param CCLoc The location of the '::'.
3385 ///
3386 /// \param EnteringContext Whether we're entering the context of the
3387 /// nested-name-specifier.
3388 ///
3389 ///
3390 /// \returns true if an error occurred, false otherwise.
3392 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3393 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3394 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3395 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3396
3398 SourceLocation ColonColonLoc);
3399
3401 const DeclSpec &DS,
3402 SourceLocation ColonColonLoc,
3403 QualType Type);
3404
3405 /// IsInvalidUnlessNestedName - This method is used for error recovery
3406 /// purposes to determine whether the specified identifier is only valid as
3407 /// a nested name specifier, for example a namespace name. It is
3408 /// conservatively correct to always return false from this method.
3409 ///
3410 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3412 NestedNameSpecInfo &IdInfo,
3413 bool EnteringContext);
3414
3415 /// Given a C++ nested-name-specifier, produce an annotation value
3416 /// that the parser can use later to reconstruct the given
3417 /// nested-name-specifier.
3418 ///
3419 /// \param SS A nested-name-specifier.
3420 ///
3421 /// \returns A pointer containing all of the information in the
3422 /// nested-name-specifier \p SS.
3424
3425 /// Given an annotation pointer for a nested-name-specifier, restore
3426 /// the nested-name-specifier structure.
3427 ///
3428 /// \param Annotation The annotation pointer, produced by
3429 /// \c SaveNestedNameSpecifierAnnotation().
3430 ///
3431 /// \param AnnotationRange The source range corresponding to the annotation.
3432 ///
3433 /// \param SS The nested-name-specifier that will be updated with the contents
3434 /// of the annotation pointer.
3435 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3436 SourceRange AnnotationRange,
3437 CXXScopeSpec &SS);
3438
3439 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3440
3441 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3442 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3443 /// After this method is called, according to [C++ 3.4.3p3], names should be
3444 /// looked up in the declarator-id's scope, until the declarator is parsed and
3445 /// ActOnCXXExitDeclaratorScope is called.
3446 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3448
3449 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3450 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3451 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3452 /// Used to indicate that names should revert to being looked up in the
3453 /// defining scope.
3455
3456 ///@}
3457
3458 //
3459 //
3460 // -------------------------------------------------------------------------
3461 //
3462 //
3463
3464 /// \name Declarations
3465 /// Implementations are in SemaDecl.cpp
3466 ///@{
3467
3468public:
3470
3471 /// The index of the first InventedParameterInfo that refers to the current
3472 /// context.
3474
3475 /// A RAII object to temporarily push a declaration context.
3477 private:
3478 Sema &S;
3479 DeclContext *SavedContext;
3480 ProcessingContextState SavedContextState;
3481 QualType SavedCXXThisTypeOverride;
3482 unsigned SavedFunctionScopesStart;
3483 unsigned SavedInventedParameterInfosStart;
3484
3485 public:
3486 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3487 : S(S), SavedContext(S.CurContext),
3488 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3489 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3490 SavedFunctionScopesStart(S.FunctionScopesStart),
3491 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3492 assert(ContextToPush && "pushing null context");
3493 S.CurContext = ContextToPush;
3494 if (NewThisContext)
3495 S.CXXThisTypeOverride = QualType();
3496 // Any saved FunctionScopes do not refer to this context.
3497 S.FunctionScopesStart = S.FunctionScopes.size();
3498 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3499 }
3500
3501 void pop() {
3502 if (!SavedContext)
3503 return;
3504 S.CurContext = SavedContext;
3505 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3506 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3507 S.FunctionScopesStart = SavedFunctionScopesStart;
3508 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3509 SavedContext = nullptr;
3510 }
3511
3513 };
3514
3515 void DiagnoseInvalidJumps(Stmt *Body);
3516
3517 /// The function definitions which were renamed as part of typo-correction
3518 /// to match their respective declarations. We want to keep track of them
3519 /// to ensure that we don't emit a "redefinition" error if we encounter a
3520 /// correctly named definition after the renamed definition.
3522
3523 /// A cache of the flags available in enumerations with the flag_bits
3524 /// attribute.
3525 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3526
3527 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3528 /// declared. Rare. May alias another identifier, declared or undeclared.
3529 ///
3530 /// For aliases, the target identifier is used as a key for eventual
3531 /// processing when the target is declared. For the single-identifier form,
3532 /// the sole identifier is used as the key. Each entry is a `SetVector`
3533 /// (ordered by parse order) of aliases (identified by the alias name) in case
3534 /// of multiple aliases to the same undeclared identifier.
3535 llvm::MapVector<
3537 llvm::SetVector<
3539 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3541
3542 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3543 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3544 /// to define functions that occur in multiple standards to call the version
3545 /// in the currently selected standard.
3546 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3547
3548 /// Set containing all typedefs that are likely unused.
3551
3555
3556 /// The set of file scoped decls seen so far that have not been used
3557 /// and must warn if not used. Only contains the first declaration.
3559
3563
3564 /// All the tentative definitions encountered in the TU.
3566
3567 /// All the external declarations encoutered and used in the TU.
3569
3570 /// Generally null except when we temporarily switch decl contexts,
3571 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3573
3574 /// Is the module scope we are in a C++ Header Unit?
3576 return ModuleScopes.empty() ? false
3577 : ModuleScopes.back().Module->isHeaderUnit();
3578 }
3579
3580 /// Get the module owning an entity.
3581 Module *getOwningModule(const Decl *Entity) {
3582 return Entity->getOwningModule();
3583 }
3584
3585 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3586
3588 /// Returns the TypeDeclType for the given type declaration,
3589 /// as ASTContext::getTypeDeclType would, but
3590 /// performs the required semantic checks for name lookup of said entity.
3591 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3592 SourceLocation NameLoc);
3593
3594 /// If the identifier refers to a type name within this scope,
3595 /// return the declaration of that type.
3596 ///
3597 /// This routine performs ordinary name lookup of the identifier II
3598 /// within the given scope, with optional C++ scope specifier SS, to
3599 /// determine whether the name refers to a type. If so, returns an
3600 /// opaque pointer (actually a QualType) corresponding to that
3601 /// type. Otherwise, returns NULL.
3603 Scope *S, CXXScopeSpec *SS = nullptr,
3604 bool isClassName = false, bool HasTrailingDot = false,
3605 ParsedType ObjectType = nullptr,
3606 bool IsCtorOrDtorName = false,
3607 bool WantNontrivialTypeSourceInfo = false,
3608 bool IsClassTemplateDeductionContext = true,
3609 ImplicitTypenameContext AllowImplicitTypename =
3611 IdentifierInfo **CorrectedII = nullptr);
3612
3613 /// isTagName() - This method is called *for error recovery purposes only*
3614 /// to determine if the specified name is a valid tag name ("struct foo"). If
3615 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3616 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3617 /// diagnose cases in C where the user forgot to specify the tag.
3619
3620 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3621 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3622 /// then downgrade the missing typename error to a warning.
3623 /// This is needed for MSVC compatibility; Example:
3624 /// @code
3625 /// template<class T> class A {
3626 /// public:
3627 /// typedef int TYPE;
3628 /// };
3629 /// template<class T> class B : public A<T> {
3630 /// public:
3631 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3632 /// };
3633 /// @endcode
3634 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3636 Scope *S, CXXScopeSpec *SS,
3637 ParsedType &SuggestedType,
3638 bool IsTemplateName = false);
3639
3640 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3641 /// type name has failed in a dependent context. In these situations, we
3642 /// automatically form a DependentTypeName that will retry lookup in a related
3643 /// scope during instantiation.
3645 SourceLocation NameLoc,
3646 bool IsTemplateTypeArg);
3647
3648 class NameClassification {
3650 union {
3655 };
3656
3657 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3658
3659 public:
3662
3665
3666 static NameClassification Error() {
3667 return NameClassification(NameClassificationKind::Error);
3668 }
3669
3670 static NameClassification Unknown() {
3671 return NameClassification(NameClassificationKind::Unknown);
3672 }
3673
3674 static NameClassification OverloadSet(ExprResult E) {
3675 NameClassification Result(NameClassificationKind::OverloadSet);
3676 Result.Expr = E;
3677 return Result;
3678 }
3679
3680 static NameClassification NonType(NamedDecl *D) {
3681 NameClassification Result(NameClassificationKind::NonType);
3682 Result.NonTypeDecl = D;
3683 return Result;
3684 }
3685
3686 static NameClassification UndeclaredNonType() {
3687 return NameClassification(NameClassificationKind::UndeclaredNonType);
3688 }
3689
3690 static NameClassification DependentNonType() {
3691 return NameClassification(NameClassificationKind::DependentNonType);
3692 }
3693
3694 static NameClassification TypeTemplate(TemplateName Name) {
3695 NameClassification Result(NameClassificationKind::TypeTemplate);
3696 Result.Template = Name;
3697 return Result;
3698 }
3699
3700 static NameClassification VarTemplate(TemplateName Name) {
3701 NameClassification Result(NameClassificationKind::VarTemplate);
3702 Result.Template = Name;
3703 return Result;
3704 }
3705
3706 static NameClassification FunctionTemplate(TemplateName Name) {
3708 Result.Template = Name;
3709 return Result;
3710 }
3711
3712 static NameClassification Concept(TemplateName Name) {
3713 NameClassification Result(NameClassificationKind::Concept);
3714 Result.Template = Name;
3715 return Result;
3716 }
3717
3718 static NameClassification UndeclaredTemplate(TemplateName Name) {
3720 Result.Template = Name;
3721 return Result;
3722 }
3723
3724 NameClassificationKind getKind() const { return Kind; }
3725
3728 return Expr;
3729 }
3730
3732 assert(Kind == NameClassificationKind::Type);
3733 return Type;
3734 }
3735
3737 assert(Kind == NameClassificationKind::NonType);
3738 return NonTypeDecl;
3739 }
3740
3749
3751 switch (Kind) {
3753 return TNK_Type_template;
3755 return TNK_Function_template;
3757 return TNK_Var_template;
3759 return TNK_Concept_template;
3762 default:
3763 llvm_unreachable("unsupported name classification.");
3764 }
3765 }
3766 };
3767
3768 /// Perform name lookup on the given name, classifying it based on
3769 /// the results of name lookup and the following token.
3770 ///
3771 /// This routine is used by the parser to resolve identifiers and help direct
3772 /// parsing. When the identifier cannot be found, this routine will attempt
3773 /// to correct the typo and classify based on the resulting name.
3774 ///
3775 /// \param S The scope in which we're performing name lookup.
3776 ///
3777 /// \param SS The nested-name-specifier that precedes the name.
3778 ///
3779 /// \param Name The identifier. If typo correction finds an alternative name,
3780 /// this pointer parameter will be updated accordingly.
3781 ///
3782 /// \param NameLoc The location of the identifier.
3783 ///
3784 /// \param NextToken The token following the identifier. Used to help
3785 /// disambiguate the name.
3786 ///
3787 /// \param CCC The correction callback, if typo correction is desired.
3788 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3789 IdentifierInfo *&Name, SourceLocation NameLoc,
3790 const Token &NextToken,
3791 CorrectionCandidateCallback *CCC = nullptr);
3792
3793 /// Act on the result of classifying a name as an undeclared (ADL-only)
3794 /// non-type declaration.
3796 SourceLocation NameLoc);
3797 /// Act on the result of classifying a name as an undeclared member of a
3798 /// dependent base class.
3800 IdentifierInfo *Name,
3801 SourceLocation NameLoc,
3802 bool IsAddressOfOperand);
3803 /// Act on the result of classifying a name as a specific non-type
3804 /// declaration.
3807 SourceLocation NameLoc,
3808 const Token &NextToken);
3809 /// Act on the result of classifying a name as an overload set.
3811
3812 /// Describes the detailed kind of a template name. Used in diagnostics.
3824
3825 /// Determine whether it's plausible that E was intended to be a
3826 /// template-name.
3828 if (!getLangOpts().CPlusPlus || E.isInvalid())
3829 return false;
3830 Dependent = false;
3831 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3832 return !DRE->hasExplicitTemplateArgs();
3833 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3834 return !ME->hasExplicitTemplateArgs();
3835 Dependent = true;
3836 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3837 return !DSDRE->hasExplicitTemplateArgs();
3838 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3839 return !DSME->hasExplicitTemplateArgs();
3840 // Any additional cases recognized here should also be handled by
3841 // diagnoseExprIntendedAsTemplateName.
3842 return false;
3843 }
3844
3845 void warnOnReservedIdentifier(const NamedDecl *D);
3847
3849
3851 MultiTemplateParamsArg TemplateParameterLists);
3852
3853 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3854 /// true if we were successful.
3856 SourceLocation Loc,
3857 unsigned FailedFoldDiagID);
3858
3859 /// Register the given locally-scoped extern "C" declaration so
3860 /// that it can be found later for redeclarations. We include any extern "C"
3861 /// declaration that is not visible in the translation unit here, not just
3862 /// function-scope declarations.
3864
3865 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3866 /// If T is the name of a class, then each of the following shall have a
3867 /// name different from T:
3868 /// - every static data member of class T;
3869 /// - every member function of class T
3870 /// - every member of class T that is itself a type;
3871 /// \returns true if the declaration name violates these rules.
3873
3874 /// Diagnose a declaration whose declarator-id has the given
3875 /// nested-name-specifier.
3876 ///
3877 /// \param SS The nested-name-specifier of the declarator-id.
3878 ///
3879 /// \param DC The declaration context to which the nested-name-specifier
3880 /// resolves.
3881 ///
3882 /// \param Name The name of the entity being declared.
3883 ///
3884 /// \param Loc The location of the name of the entity being declared.
3885 ///
3886 /// \param IsMemberSpecialization Whether we are declaring a member
3887 /// specialization.
3888 ///
3889 /// \param TemplateId The template-id, if any.
3890 ///
3891 /// \returns true if we cannot safely recover from this error, false
3892 /// otherwise.
3895 TemplateIdAnnotation *TemplateId,
3896 bool IsMemberSpecialization);
3897
3899
3900 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3901
3903 unsigned &IntVal);
3904
3905 /// Diagnose function specifiers on a declaration of an identifier that
3906 /// does not identify a function.
3907 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3908
3909 /// Return the declaration shadowed by the given typedef \p D, or null
3910 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3912 const LookupResult &R);
3913
3914 /// Return the declaration shadowed by the given variable \p D, or null
3915 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3917
3918 /// Return the declaration shadowed by the given variable \p D, or null
3919 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3921 const LookupResult &R);
3922 /// Diagnose variable or built-in function shadowing. Implements
3923 /// -Wshadow.
3924 ///
3925 /// This method is called whenever a VarDecl is added to a "useful"
3926 /// scope.
3927 ///
3928 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3929 /// \param R the lookup of the name
3930 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3931 const LookupResult &R);
3932
3933 /// Check -Wshadow without the advantage of a previous lookup.
3934 void CheckShadow(Scope *S, VarDecl *D);
3935
3936 /// Warn if 'E', which is an expression that is about to be modified, refers
3937 /// to a shadowing declaration.
3939
3940 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3941 /// when these variables are captured by the lambda.
3943
3944 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
3945 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
3946 TypedefNameDecl *NewTD);
3949 TypeSourceInfo *TInfo,
3951
3952 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
3953 /// declares a typedef-name, either using the 'typedef' type specifier or via
3954 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
3958 TypeSourceInfo *TInfo,
3960 MultiTemplateParamsArg TemplateParamLists,
3961 bool &AddToScope,
3963
3964 /// Perform semantic checking on a newly-created variable
3965 /// declaration.
3966 ///
3967 /// This routine performs all of the type-checking required for a
3968 /// variable declaration once it has been built. It is used both to
3969 /// check variables after they have been parsed and their declarators
3970 /// have been translated into a declaration, and to check variables
3971 /// that have been instantiated from a template.
3972 ///
3973 /// Sets NewVD->isInvalidDecl() if an error was encountered.
3974 ///
3975 /// Returns true if the variable declaration is a redeclaration.
3976 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
3977 void CheckVariableDeclarationType(VarDecl *NewVD);
3978 void CheckCompleteVariableDeclaration(VarDecl *VD);
3979
3980 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
3981 TypeSourceInfo *TInfo,
3982 LookupResult &Previous,
3983 MultiTemplateParamsArg TemplateParamLists,
3984 bool &AddToScope);
3985
3986 /// AddOverriddenMethods - See if a method overrides any in the base classes,
3987 /// and if so, check that it's a valid override and remember it.
3988 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
3989
3990 /// Perform semantic checking of a new function declaration.
3991 ///
3992 /// Performs semantic analysis of the new function declaration
3993 /// NewFD. This routine performs all semantic checking that does not
3994 /// require the actual declarator involved in the declaration, and is
3995 /// used both for the declaration of functions as they are parsed
3996 /// (called via ActOnDeclarator) and for the declaration of functions
3997 /// that have been instantiated via C++ template instantiation (called
3998 /// via InstantiateDecl).
3999 ///
4000 /// \param IsMemberSpecialization whether this new function declaration is
4001 /// a member specialization (that replaces any definition provided by the
4002 /// previous declaration).
4003 ///
4004 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4005 ///
4006 /// \returns true if the function declaration is a redeclaration.
4007 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4008 LookupResult &Previous,
4009 bool IsMemberSpecialization, bool DeclIsDefn);
4010
4011 /// Checks if the new declaration declared in dependent context must be
4012 /// put in the same redeclaration chain as the specified declaration.
4013 ///
4014 /// \param D Declaration that is checked.
4015 /// \param PrevDecl Previous declaration found with proper lookup method for
4016 /// the same declaration name.
4017 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4018 /// belongs to.
4019 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4020
4021 /// Determines if we can perform a correct type check for \p D as a
4022 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4023 /// best-effort check.
4024 ///
4025 /// \param NewD The new declaration.
4026 /// \param OldD The old declaration.
4027 /// \param NewT The portion of the type of the new declaration to check.
4028 /// \param OldT The portion of the type of the old declaration to check.
4029 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4030 QualType NewT, QualType OldT);
4031 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4032 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4033
4034 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4035 /// containing class. Otherwise it will return implicit SectionAttr if the
4036 /// function is a definition and there is an active value on CodeSegStack
4037 /// (from the current #pragma code-seg value).
4038 ///
4039 /// \param FD Function being declared.
4040 /// \param IsDefinition Whether it is a definition or just a declaration.
4041 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4042 /// nullptr if no attribute should be added.
4043 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4044 bool IsDefinition);
4045
4046 /// Common checks for a parameter-declaration that should apply to both
4047 /// function parameters and non-type template parameters.
4048 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4049
4050 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4051 /// to introduce parameters into function prototype scope.
4052 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4053 SourceLocation ExplicitThisLoc = {});
4054
4055 /// Synthesizes a variable for a parameter arising from a
4056 /// typedef.
4057 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4058 QualType T);
4059 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4060 SourceLocation NameLoc,
4061 const IdentifierInfo *Name, QualType T,
4062 TypeSourceInfo *TSInfo, StorageClass SC);
4063
4064 /// Emit diagnostics if the initializer or any of its explicit or
4065 /// implicitly-generated subexpressions require copying or
4066 /// default-initializing a type that is or contains a C union type that is
4067 /// non-trivial to copy or default-initialize.
4068 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4069
4070 // These flags are passed to checkNonTrivialCUnion.
4076
4077 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4078 /// a non-trivial C union is used in an invalid context.
4080 NonTrivialCUnionContext UseContext,
4081 unsigned NonTrivialKind);
4082
4083 /// Certain globally-unique variables might be accidentally duplicated if
4084 /// built into multiple shared libraries with hidden visibility. This can
4085 /// cause problems if the variable is mutable, its initialization is
4086 /// effectful, or its address is taken.
4089
4090 /// AddInitializerToDecl - Adds the initializer Init to the
4091 /// declaration dcl. If DirectInit is true, this is C++ direct
4092 /// initialization rather than copy initialization.
4093 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4094 void ActOnUninitializedDecl(Decl *dcl);
4095
4096 /// ActOnInitializerError - Given that there was an error parsing an
4097 /// initializer for the given declaration, try to at least re-establish
4098 /// invariants such as whether a variable's type is either dependent or
4099 /// complete.
4100 void ActOnInitializerError(Decl *Dcl);
4101
4102 void ActOnCXXForRangeDecl(Decl *D);
4104 IdentifierInfo *Ident,
4105 ParsedAttributes &Attrs);
4106
4107 /// Check if VD needs to be dllexport/dllimport due to being in a
4108 /// dllexport/import function.
4111
4112 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4113 /// any semantic actions necessary after any initializer has been attached.
4114 void FinalizeDeclaration(Decl *D);
4116 ArrayRef<Decl *> Group);
4117
4118 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4119 /// group, performing any necessary semantic checking.
4121
4122 /// Should be called on all declarations that might have attached
4123 /// documentation comments.
4124 void ActOnDocumentableDecl(Decl *D);
4126
4127 enum class FnBodyKind {
4128 /// C++26 [dcl.fct.def.general]p1
4129 /// function-body:
4130 /// ctor-initializer[opt] compound-statement
4131 /// function-try-block
4133 /// = default ;
4135 /// deleted-function-body
4136 ///
4137 /// deleted-function-body:
4138 /// = delete ;
4139 /// = delete ( unevaluated-string ) ;
4141 };
4142
4144 SourceLocation LocAfterDecls);
4146 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4147 SkipBodyInfo *SkipBody = nullptr);
4149 MultiTemplateParamsArg TemplateParamLists,
4150 SkipBodyInfo *SkipBody = nullptr,
4151 FnBodyKind BodyKind = FnBodyKind::Other);
4153 SkipBodyInfo *SkipBody = nullptr,
4154 FnBodyKind BodyKind = FnBodyKind::Other);
4156
4157 /// Determine whether we can delay parsing the body of a function or
4158 /// function template until it is used, assuming we don't care about emitting
4159 /// code for that function.
4160 ///
4161 /// This will be \c false if we may need the body of the function in the
4162 /// middle of parsing an expression (where it's impractical to switch to
4163 /// parsing a different function), for instance, if it's constexpr in C++11
4164 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4165 bool canDelayFunctionBody(const Declarator &D);
4166
4167 /// Determine whether we can skip parsing the body of a function
4168 /// definition, assuming we don't care about analyzing its body or emitting
4169 /// code for that function.
4170 ///
4171 /// This will be \c false only if we may need the body of the function in
4172 /// order to parse the rest of the program (for instance, if it is
4173 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4174 bool canSkipFunctionBody(Decl *D);
4175
4176 /// Given the set of return statements within a function body,
4177 /// compute the variables that are subject to the named return value
4178 /// optimization.
4179 ///
4180 /// Each of the variables that is subject to the named return value
4181 /// optimization will be marked as NRVO variables in the AST, and any
4182 /// return statement that has a marked NRVO variable as its NRVO candidate can
4183 /// use the named return value optimization.
4184 ///
4185 /// This function applies a very simplistic algorithm for NRVO: if every
4186 /// return statement in the scope of a variable has the same NRVO candidate,
4187 /// that candidate is an NRVO variable.
4189
4190 /// Performs semantic analysis at the end of a function body.
4191 ///
4192 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4193 /// releasing the associated \p FunctionScopeInfo. This is useful when
4194 /// building e.g. LambdaExprs.
4196 bool IsInstantiation = false,
4197 bool RetainFunctionScopeInfo = false);
4200
4201 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4202 /// attribute for which parsing is delayed.
4204
4205 /// Diagnose any unused parameters in the given sequence of
4206 /// ParmVarDecl pointers.
4208
4209 /// Diagnose whether the size of parameters or return value of a
4210 /// function or obj-c method definition is pass-by-value and larger than a
4211 /// specified threshold.
4212 void
4214 QualType ReturnTy, NamedDecl *D);
4215
4217 SourceLocation RParenLoc);
4218
4221
4222 void ActOnPopScope(SourceLocation Loc, Scope *S);
4223
4224 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4225 /// no declarator (e.g. "struct foo;") is parsed.
4227 const ParsedAttributesView &DeclAttrs,
4228 RecordDecl *&AnonRecord);
4229
4230 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4231 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4232 /// parameters to cope with template friend declarations.
4234 const ParsedAttributesView &DeclAttrs,
4235 MultiTemplateParamsArg TemplateParams,
4236 bool IsExplicitInstantiation,
4237 RecordDecl *&AnonRecord,
4238 SourceLocation EllipsisLoc = {});
4239
4240 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4241 /// anonymous structure or union. Anonymous unions are a C++ feature
4242 /// (C++ [class.union]) and a C11 feature; anonymous structures
4243 /// are a C11 feature and GNU C++ extension.
4244 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4245 RecordDecl *Record,
4246 const PrintingPolicy &Policy);
4247
4248 /// Called once it is known whether
4249 /// a tag declaration is an anonymous union or struct.
4251
4252 /// Emit diagnostic warnings for placeholder members.
4253 /// We can only do that after the class is fully constructed,
4254 /// as anonymous union/structs can insert placeholders
4255 /// in their parent scope (which might be a Record).
4257
4258 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4259 /// Microsoft C anonymous structure.
4260 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4261 /// Example:
4262 ///
4263 /// struct A { int a; };
4264 /// struct B { struct A; int b; };
4265 ///
4266 /// void foo() {
4267 /// B var;
4268 /// var.a = 3;
4269 /// }
4270 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4271 RecordDecl *Record);
4272
4273 /// Given a non-tag type declaration, returns an enum useful for indicating
4274 /// what kind of non-tag type this is.
4275 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4276
4277 /// Determine whether a tag with a given kind is acceptable
4278 /// as a redeclaration of the given tag declaration.
4279 ///
4280 /// \returns true if the new tag kind is acceptable, false otherwise.
4282 bool isDefinition, SourceLocation NewTagLoc,
4283 const IdentifierInfo *Name);
4284
4285 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4286 /// former case, Name will be non-null. In the later case, Name will be null.
4287 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4288 /// a reference/declaration/definition of a tag.
4289 ///
4290 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4291 /// trailing-type-specifier) other than one in an alias-declaration.
4292 ///
4293 /// \param SkipBody If non-null, will be set to indicate if the caller should
4294 /// skip the definition of this tag and treat it as if it were a declaration.
4295 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4296 SourceLocation KWLoc, CXXScopeSpec &SS,
4297 IdentifierInfo *Name, SourceLocation NameLoc,
4298 const ParsedAttributesView &Attr, AccessSpecifier AS,
4299 SourceLocation ModulePrivateLoc,
4300 MultiTemplateParamsArg TemplateParameterLists,
4301 bool &OwnedDecl, bool &IsDependent,
4302 SourceLocation ScopedEnumKWLoc,
4303 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4304 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4305 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4306
4307 /// ActOnField - Each field of a C struct/union is passed into this in order
4308 /// to create a FieldDecl object for it.
4309 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4310 Declarator &D, Expr *BitfieldWidth);
4311
4312 /// HandleField - Analyze a field of a C struct or a C++ data member.
4313 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4314 Declarator &D, Expr *BitfieldWidth,
4315 InClassInitStyle InitStyle, AccessSpecifier AS);
4316
4317 /// Build a new FieldDecl and check its well-formedness.
4318 ///
4319 /// This routine builds a new FieldDecl given the fields name, type,
4320 /// record, etc. \p PrevDecl should refer to any previous declaration
4321 /// with the same name and in the same scope as the field to be
4322 /// created.
4323 ///
4324 /// \returns a new FieldDecl.
4325 ///
4326 /// \todo The Declarator argument is a hack. It will be removed once
4327 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4328 TypeSourceInfo *TInfo, RecordDecl *Record,
4329 SourceLocation Loc, bool Mutable,
4330 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4331 SourceLocation TSSL, AccessSpecifier AS,
4332 NamedDecl *PrevDecl, Declarator *D = nullptr);
4333
4335
4336 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4337 /// class and class extensions. For every class \@interface and class
4338 /// extension \@interface, if the last ivar is a bitfield of any type,
4339 /// then add an implicit `char :0` ivar to the end of that interface.
4340 void ActOnLastBitfield(SourceLocation DeclStart,
4341 SmallVectorImpl<Decl *> &AllIvarDecls);
4342
4343 // This is used for both record definitions and ObjC interface declarations.
4344 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4345 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4346 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4347
4348 /// ActOnTagStartDefinition - Invoked when we have entered the
4349 /// scope of a tag's definition (e.g., for an enumeration, class,
4350 /// struct, or union).
4351 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4352
4353 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4354 /// Differently from C++, actually parse the body and reject / error out
4355 /// in case of a structural mismatch.
4356 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4357
4359
4360 /// Invoked when we enter a tag definition that we're skipping.
4362
4363 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4364 /// C++ record definition's base-specifiers clause and are starting its
4365 /// member declarations.
4367 SourceLocation FinalLoc,
4368 bool IsFinalSpelledSealed,
4369 bool IsAbstract,
4370 SourceLocation TriviallyRelocatable,
4371 SourceLocation Replaceable,
4372 SourceLocation LBraceLoc);
4373
4374 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4375 /// the definition of a tag (enumeration, class, struct, or union).
4377 SourceRange BraceRange);
4378
4381
4383
4384 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4385 /// error parsing the definition of a tag.
4387
4389 EnumConstantDecl *LastEnumConst,
4390 SourceLocation IdLoc, IdentifierInfo *Id,
4391 Expr *val);
4392
4393 /// Check that this is a valid underlying type for an enum declaration.
4395
4396 /// Check whether this is a valid redeclaration of a previous enumeration.
4397 /// \return true if the redeclaration was invalid.
4398 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4399 QualType EnumUnderlyingTy, bool IsFixed,
4400 const EnumDecl *Prev);
4401
4402 /// Determine whether the body of an anonymous enumeration should be skipped.
4403 /// \param II The name of the first enumerator.
4405 SourceLocation IILoc);
4406
4407 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4408 SourceLocation IdLoc, IdentifierInfo *Id,
4409 const ParsedAttributesView &Attrs,
4410 SourceLocation EqualLoc, Expr *Val,
4411 SkipBodyInfo *SkipBody = nullptr);
4412 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4413 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4414 const ParsedAttributesView &Attr);
4415
4416 /// Set the current declaration context until it gets popped.
4417 void PushDeclContext(Scope *S, DeclContext *DC);
4418 void PopDeclContext();
4419
4420 /// EnterDeclaratorContext - Used when we must lookup names in the context
4421 /// of a declarator's nested name specifier.
4424
4425 /// Enter a template parameter scope, after it's been associated with a
4426 /// particular DeclContext. Causes lookup within the scope to chain through
4427 /// enclosing contexts in the correct order.
4429
4430 /// Push the parameters of D, which must be a function, into scope.
4433
4434 /// Add this decl to the scope shadowed decl chains.
4435 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4436
4437 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4438 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4439 /// true if 'D' belongs to the given declaration context.
4440 ///
4441 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4442 /// enclosing namespace set of the context, rather than contained
4443 /// directly within it.
4444 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4445 bool AllowInlineNamespace = false) const;
4446
4447 /// Finds the scope corresponding to the given decl context, if it
4448 /// happens to be an enclosing scope. Otherwise return NULL.
4450
4451 /// Subroutines of ActOnDeclarator().
4453 TypeSourceInfo *TInfo);
4455
4456 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4458 NamedDecl *New, Decl *Old,
4460
4461 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4462 /// same name and scope as a previous declaration 'Old'. Figure out
4463 /// how to resolve this situation, merging decls or emitting
4464 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4466 LookupResult &OldDecls);
4467
4468 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4469 /// definition visible.
4470 /// This method performs any necessary cleanup on the parser state to discard
4471 /// child nodes from newly parsed decl we are retiring.
4472 void CleanupMergedEnum(Scope *S, Decl *New);
4473
4474 /// MergeFunctionDecl - We just parsed a function 'New' from
4475 /// declarator D which has the same name and scope as a previous
4476 /// declaration 'Old'. Figure out how to resolve this situation,
4477 /// merging decls or emitting diagnostics as appropriate.
4478 ///
4479 /// In C++, New and Old must be declarations that are not
4480 /// overloaded. Use IsOverload to determine whether New and Old are
4481 /// overloaded, and to select the Old declaration that New should be
4482 /// merged with.
4483 ///
4484 /// Returns true if there was an error, false otherwise.
4486 bool MergeTypeWithOld, bool NewDeclIsDefn);
4487
4488 /// Completes the merge of two function declarations that are
4489 /// known to be compatible.
4490 ///
4491 /// This routine handles the merging of attributes and other
4492 /// properties of function declarations from the old declaration to
4493 /// the new declaration, once we know that New is in fact a
4494 /// redeclaration of Old.
4495 ///
4496 /// \returns false
4498 Scope *S, bool MergeTypeWithOld);
4500
4501 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4502 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4503 /// situation, merging decls or emitting diagnostics as appropriate.
4504 ///
4505 /// Tentative definition rules (C99 6.9.2p2) are checked by
4506 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4507 /// definitions here, since the initializer hasn't been attached.
4509
4510 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4511 /// scope as a previous declaration 'Old'. Figure out how to merge their
4512 /// types, emitting diagnostics as appropriate.
4513 ///
4514 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4515 /// back to here in AddInitializerToDecl. We can't check them before the
4516 /// initializer is attached.
4517 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4518
4519 /// We've just determined that \p Old and \p New both appear to be definitions
4520 /// of the same variable. Either diagnose or fix the problem.
4521 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4523
4524 /// Filters out lookup results that don't fall within the given scope
4525 /// as determined by isDeclInScope.
4527 bool ConsiderLinkage, bool AllowInlineNamespace);
4528
4529 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4530 /// have compatible owning modules.
4532
4533 /// [module.interface]p6:
4534 /// A redeclaration of an entity X is implicitly exported if X was introduced
4535 /// by an exported declaration; otherwise it shall not be exported.
4537
4538 /// A wrapper function for checking the semantic restrictions of
4539 /// a redeclaration within a module.
4541
4542 /// Check the redefinition in C++20 Modules.
4543 ///
4544 /// [basic.def.odr]p14:
4545 /// For any definable item D with definitions in multiple translation units,
4546 /// - if D is a non-inline non-templated function or variable, or
4547 /// - if the definitions in different translation units do not satisfy the
4548 /// following requirements,
4549 /// the program is ill-formed; a diagnostic is required only if the
4550 /// definable item is attached to a named module and a prior definition is
4551 /// reachable at the point where a later definition occurs.
4552 /// - Each such definition shall not be attached to a named module
4553 /// ([module.unit]).
4554 /// - Each such definition shall consist of the same sequence of tokens, ...
4555 /// ...
4556 ///
4557 /// Return true if the redefinition is not allowed. Return false otherwise.
4558 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4559
4561
4562 /// If it's a file scoped decl that must warn if not used, keep track
4563 /// of it.
4565
4566 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4568
4571 DiagReceiverTy DiagReceiver);
4572 void DiagnoseUnusedDecl(const NamedDecl *ND);
4573
4574 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4575 /// unless they are marked attr(unused).
4576 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4577
4578 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4579 /// variable.
4580 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4581
4582 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4583 /// from S, where a non-field would be declared. This routine copes
4584 /// with the difference between C and C++ scoping rules in structs and
4585 /// unions. For example, the following code is well-formed in C but
4586 /// ill-formed in C++:
4587 /// @code
4588 /// struct S6 {
4589 /// enum { BAR } e;
4590 /// };
4591 ///
4592 /// void test_S6() {
4593 /// struct S6 a;
4594 /// a.e = BAR;
4595 /// }
4596 /// @endcode
4597 /// For the declaration of BAR, this routine will return a different
4598 /// scope. The scope S will be the scope of the unnamed enumeration
4599 /// within S6. In C++, this routine will return the scope associated
4600 /// with S6, because the enumeration's scope is a transparent
4601 /// context but structures can contain non-field names. In C, this
4602 /// routine will return the translation unit scope, since the
4603 /// enumeration's scope is a transparent context and structures cannot
4604 /// contain non-field names.
4606
4608 SourceLocation Loc);
4609
4610 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4611 /// file scope. lazily create a decl for it. ForRedeclaration is true
4612 /// if we're creating this built-in in anticipation of redeclaring the
4613 /// built-in.
4614 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4615 bool ForRedeclaration, SourceLocation Loc);
4616
4617 /// Get the outermost AttributedType node that sets a calling convention.
4618 /// Valid types should not have multiple attributes with different CCs.
4619 const AttributedType *getCallingConvAttributedType(QualType T) const;
4620
4621 /// GetNameForDeclarator - Determine the full declaration name for the
4622 /// given Declarator.
4624
4625 /// Retrieves the declaration name from a parsed unqualified-id.
4627
4628 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4629 /// we are currently parsing the initializer.
4631
4632 /// Look for a locally scoped extern "C" declaration by the given name.
4634
4637
4638 /// Adjust the \c DeclContext for a function or variable that might be a
4639 /// function-local external declaration.
4641
4643
4644 /// Checks if the variant/multiversion functions are compatible.
4646 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4647 const PartialDiagnostic &NoProtoDiagID,
4648 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4649 const PartialDiagnosticAt &NoSupportDiagIDAt,
4650 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4651 bool ConstexprSupported, bool CLinkageMayDiffer);
4652
4653 /// type checking declaration initializers (C99 6.7.8)
4655 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4656
4659 SourceRange Range, bool DirectInit,
4660 Expr *Init);
4661
4663 Expr *Init);
4664
4666
4667 // Heuristically tells if the function is `get_return_object` member of a
4668 // coroutine promise_type by matching the function name.
4669 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4670 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4671
4672 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4673 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4675 Scope *S);
4676
4677 /// If this function is a C++ replaceable global allocation function
4678 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4679 /// adds any function attributes that we know a priori based on the standard.
4680 ///
4681 /// We need to check for duplicate attributes both here and where user-written
4682 /// attributes are applied to declarations.
4684 FunctionDecl *FD);
4685
4686 /// Adds any function attributes that we know a priori based on
4687 /// the declaration of this function.
4688 ///
4689 /// These attributes can apply both to implicitly-declared builtins
4690 /// (like __builtin___printf_chk) or to library-declared functions
4691 /// like NSLog or printf.
4692 ///
4693 /// We need to check for duplicate attributes both here and where user-written
4694 /// attributes are applied to declarations.
4696
4697 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4698 /// the correct width, and that the field type is valid.
4699 /// Returns false on success.
4701 const IdentifierInfo *FieldName, QualType FieldTy,
4702 bool IsMsStruct, Expr *BitWidth);
4703
4704 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4705 /// enum. If AllowMask is true, then we also allow the complement of a valid
4706 /// value, to be used as a mask.
4707 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4708 bool AllowMask) const;
4709
4710 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4711 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4712 SourceLocation WeakNameLoc);
4713
4714 /// ActOnPragmaRedefineExtname - Called on well formed
4715 /// \#pragma redefine_extname oldname newname.
4717 IdentifierInfo *AliasName,
4718 SourceLocation PragmaLoc,
4719 SourceLocation WeakNameLoc,
4720 SourceLocation AliasNameLoc);
4721
4722 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4723 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4724 SourceLocation PragmaLoc,
4725 SourceLocation WeakNameLoc,
4726 SourceLocation AliasNameLoc);
4727
4728 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4731 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4732 OMPDiscarded, // Discarded due to OpenMP hostness
4733 TemplateDiscarded, // Discarded due to uninstantiated templates
4735 };
4736 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4737 bool Final = false);
4738
4739 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4741
4742 /// Function or variable declarations to be checked for whether the deferred
4743 /// diagnostics should be emitted.
4745
4746private:
4747 /// Map of current shadowing declarations to shadowed declarations. Warn if
4748 /// it looks like the user is trying to modify the shadowing declaration.
4749 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4750
4751 // We need this to handle
4752 //
4753 // typedef struct {
4754 // void *foo() { return 0; }
4755 // } A;
4756 //
4757 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4758 // for example. If 'A', foo will have external linkage. If we have '*A',
4759 // foo will have no linkage. Since we can't know until we get to the end
4760 // of the typedef, this function finds out if D might have non-external
4761 // linkage. Callers should verify at the end of the TU if it D has external
4762 // linkage or not.
4763 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4764
4765 ///@}
4766
4767 //
4768 //
4769 // -------------------------------------------------------------------------
4770 //
4771 //
4772
4773 /// \name Declaration Attribute Handling
4774 /// Implementations are in SemaDeclAttr.cpp
4775 ///@{
4776
4777public:
4778 /// Describes the kind of priority given to an availability attribute.
4779 ///
4780 /// The sum of priorities deteremines the final priority of the attribute.
4781 /// The final priority determines how the attribute will be merged.
4782 /// An attribute with a lower priority will always remove higher priority
4783 /// attributes for the specified platform when it is being applied. An
4784 /// attribute with a higher priority will not be applied if the declaration
4785 /// already has an availability attribute with a lower priority for the
4786 /// specified platform. The final prirority values are not expected to match
4787 /// the values in this enumeration, but instead should be treated as a plain
4788 /// integer value. This enumeration just names the priority weights that are
4789 /// used to calculate that final vaue.
4791 /// The availability attribute was specified explicitly next to the
4792 /// declaration.
4794
4795 /// The availability attribute was applied using '#pragma clang attribute'.
4797
4798 /// The availability attribute for a specific platform was inferred from
4799 /// an availability attribute for another platform.
4801 };
4802
4803 /// Describes the reason a calling convention specification was ignored, used
4804 /// for diagnostics.
4811
4812 /// A helper function to provide Attribute Location for the Attr types
4813 /// AND the ParsedAttr.
4814 template <typename AttrInfo>
4815 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4816 getAttrLoc(const AttrInfo &AL) {
4817 return AL.getLocation();
4818 }
4820
4821 /// If Expr is a valid integer constant, get the value of the integer
4822 /// expression and return success or failure. May output an error.
4823 ///
4824 /// Negative argument is implicitly converted to unsigned, unless
4825 /// \p StrictlyUnsigned is true.
4826 template <typename AttrInfo>
4827 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4828 unsigned Idx = UINT_MAX,
4829 bool StrictlyUnsigned = false) {
4830 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4831 if (Expr->isTypeDependent() ||
4833 if (Idx != UINT_MAX)
4834 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4835 << &AI << Idx << AANT_ArgumentIntegerConstant
4836 << Expr->getSourceRange();
4837 else
4838 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4840 return false;
4841 }
4842
4843 if (!I->isIntN(32)) {
4844 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4845 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4846 return false;
4847 }
4848
4849 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4850 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4851 << &AI << /*non-negative*/ 1;
4852 return false;
4853 }
4854
4855 Val = (uint32_t)I->getZExtValue();
4856 return true;
4857 }
4858
4859 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4860 /// \#pragma weak during processing of other Decls.
4861 /// I couldn't figure out a clean way to generate these in-line, so
4862 /// we store them here and handle separately -- which is a hack.
4863 /// It would be best to refactor this.
4865
4866 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4868
4872
4873 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4874 /// us to associate a raw vector type with one of the ext_vector type names.
4875 /// This is only necessary for issuing pretty diagnostics.
4877
4878 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4879 /// and return false, otherwise set \p Str to the value of the string literal
4880 /// and return true.
4882 const Expr *E, StringRef &Str,
4883 SourceLocation *ArgLocation = nullptr);
4884
4885 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4886 /// If not emit an error and return false. If the argument is an identifier it
4887 /// will emit an error with a fixit hint and treat it as if it was a string
4888 /// literal.
4889 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4890 StringRef &Str,
4891 SourceLocation *ArgLocation = nullptr);
4892
4893 /// Determine if type T is a valid subject for a nonnull and similar
4894 /// attributes. Dependent types are considered valid so they can be checked
4895 /// during instantiation time. By default, we look through references (the
4896 /// behavior used by nonnull), but if the second parameter is true, then we
4897 /// treat a reference type as valid.
4898 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4899
4900 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4901 /// declaration.
4902 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4903 Expr *OE);
4904
4905 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4906 /// declaration.
4907 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
4908 Expr *ParamExpr);
4909
4910 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4911 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4912
4913 AvailabilityAttr *mergeAvailabilityAttr(
4914 NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform,
4915 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
4916 VersionTuple Obsoleted, bool IsUnavailable, StringRef Message,
4917 bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK,
4918 int Priority, IdentifierInfo *IIEnvironment);
4919
4920 TypeVisibilityAttr *
4922 TypeVisibilityAttr::VisibilityType Vis);
4923 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
4924 VisibilityAttr::VisibilityType Vis);
4925 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
4926 StringRef Name);
4927
4928 /// Used to implement to perform semantic checking on
4929 /// attribute((section("foo"))) specifiers.
4930 ///
4931 /// In this case, "foo" is passed in to be checked. If the section
4932 /// specifier is invalid, return an Error that indicates the problem.
4933 ///
4934 /// This is a simple quality of implementation feature to catch errors
4935 /// and give good diagnostics in cases when the assembler or code generator
4936 /// would otherwise reject the section specifier.
4937 llvm::Error isValidSectionSpecifier(StringRef Str);
4938 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
4939 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
4940 StringRef Name);
4941
4942 // Check for things we'd like to warn about. Multiversioning issues are
4943 // handled later in the process, once we know how many exist.
4944 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
4945
4946 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
4947 StringRef NewUserDiagnostic);
4948 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
4949 IdentifierInfo *Format, int FormatIdx,
4950 int FirstArg);
4951 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
4952 const AttributeCommonInfo &CI,
4953 IdentifierInfo *Format,
4954 int FormatIdx,
4955 StringLiteral *FormatStr);
4956
4957 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
4958 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4959 bool IsPackExpansion);
4961 bool IsPackExpansion);
4962
4963 /// AddAlignValueAttr - Adds an align_value attribute to a particular
4964 /// declaration.
4965 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
4966
4967 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
4968 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
4971
4973 bool BestCase,
4974 MSInheritanceModel SemanticSpelling);
4975
4977
4978 /// AddModeAttr - Adds a mode attribute to a particular declaration.
4979 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name,
4980 bool InInstantiation = false);
4981 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
4982 const AttributeCommonInfo &CI,
4983 const IdentifierInfo *Ident);
4984 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
4985 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
4986 const AttributeCommonInfo &CI);
4987 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
4988 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
4989 const InternalLinkageAttr &AL);
4990
4991 /// Check validaty of calling convention attribute \p attr. If \p FD
4992 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
4993 /// target. Otherwise, it is specified by \p CFT.
4995 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
4997
4998 /// Checks a regparm attribute, returning true if it is ill-formed and
4999 /// otherwise setting numParams to the appropriate value.
5000 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5001
5002 /// Create an CUDALaunchBoundsAttr attribute.
5003 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5004 Expr *MaxThreads,
5005 Expr *MinBlocks,
5006 Expr *MaxBlocks);
5007
5008 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5009 /// declaration.
5010 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5011 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5012
5013 enum class RetainOwnershipKind { NS, CF, OS };
5014
5015 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5016 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5017
5018 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5019
5020 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5021 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5022 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5023 const AttributeCommonInfo &CI,
5024 bool BestCase,
5025 MSInheritanceModel Model);
5026
5027 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5028 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5029 const EnforceTCBLeafAttr &AL);
5030
5031 /// Helper for delayed processing TransparentUnion or
5032 /// BPFPreserveAccessIndexAttr attribute.
5034 const ParsedAttributesView &AttrList);
5035
5036 // Options for ProcessDeclAttributeList().
5040
5043 Result.IncludeCXX11Attributes = Val;
5044 return Result;
5045 }
5046
5049 Result.IgnoreTypeAttributes = Val;
5050 return Result;
5051 }
5052
5053 // Should C++11 attributes be processed?
5055
5056 // Should any type attributes encountered be ignored?
5057 // If this option is false, a diagnostic will be emitted for any type
5058 // attributes of a kind that does not "slide" from the declaration to
5059 // the decl-specifier-seq.
5061 };
5062
5063 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5064 /// attribute list to the specified decl, ignoring any type attributes.
5066 const ParsedAttributesView &AttrList,
5067 const ProcessDeclAttributeOptions &Options =
5069
5070 /// Annotation attributes are the only attributes allowed after an access
5071 /// specifier.
5073 const ParsedAttributesView &AttrList);
5074
5075 /// checkUnusedDeclAttributes - Given a declarator which is not being
5076 /// used to build a declaration, complain about any decl attributes
5077 /// which might be lying around on it.
5079
5080 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5081
5082 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5083 /// \#pragma weak needs a non-definition decl and source may not have one.
5085 SourceLocation Loc);
5086
5087 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5088 /// applied to it, possibly with an alias.
5089 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5090
5091 void ProcessPragmaWeak(Scope *S, Decl *D);
5092 // Decl attributes - this routine is the top level dispatcher.
5093 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5094
5096
5097 /// Given a set of delayed diagnostics, re-emit them as if they had
5098 /// been delayed in the current context instead of in the given pool.
5099 /// Essentially, this just moves them to the current pool.
5101
5102 /// Check if IdxExpr is a valid parameter index for a function or
5103 /// instance method D. May output an error.
5104 ///
5105 /// \returns true if IdxExpr is a valid index.
5106 template <typename AttrInfo>
5108 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5109 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5110 bool CanIndexVariadicArguments = false) {
5112
5113 // In C++ the implicit 'this' function parameter also counts.
5114 // Parameters are counted from one.
5115 bool HP = hasFunctionProto(D);
5116 bool HasImplicitThisParam = isInstanceMethod(D);
5117 bool IV = HP && isFunctionOrMethodVariadic(D);
5118 unsigned NumParams =
5119 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5120
5121 std::optional<llvm::APSInt> IdxInt;
5122 if (IdxExpr->isTypeDependent() ||
5123 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5124 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5125 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5126 << IdxExpr->getSourceRange();
5127 return false;
5128 }
5129
5130 unsigned IdxSource = IdxInt->getLimitedValue(UINT_MAX);
5131 if (IdxSource < 1 ||
5132 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5133 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5134 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5135 return false;
5136 }
5137 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5138 if (IdxSource == 1) {
5139 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5140 << &AI << IdxExpr->getSourceRange();
5141 return false;
5142 }
5143 }
5144
5145 Idx = ParamIdx(IdxSource, D);
5146 return true;
5147 }
5148
5149 ///@}
5150
5151 //
5152 //
5153 // -------------------------------------------------------------------------
5154 //
5155 //
5156
5157 /// \name C++ Declarations
5158 /// Implementations are in SemaDeclCXX.cpp
5159 ///@{
5160
5161public:
5163
5164 /// Called before parsing a function declarator belonging to a function
5165 /// declaration.
5167 unsigned TemplateParameterDepth);
5168
5169 /// Called after parsing a function declarator belonging to a function
5170 /// declaration.
5172
5173 // Act on C++ namespaces
5175 SourceLocation NamespaceLoc,
5176 SourceLocation IdentLoc, IdentifierInfo *Ident,
5177 SourceLocation LBrace,
5178 const ParsedAttributesView &AttrList,
5179 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5180
5181 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5182 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5183 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5184
5186
5187 /// Retrieve the special "std" namespace, which may require us to
5188 /// implicitly define the namespace.
5190
5192 EnumDecl *getStdAlignValT() const;
5193
5196 QualType AllocType, SourceLocation);
5197
5199 const IdentifierInfo *MemberOrBase);
5200
5202 /// The '<=>' operator was used in an expression and a builtin operator
5203 /// was selected.
5205 /// A defaulted 'operator<=>' needed the comparison category. This
5206 /// typically only applies to 'std::strong_ordering', due to the implicit
5207 /// fallback return value.
5209 };
5210
5211 /// Lookup the specified comparison category types in the standard
5212 /// library, an check the VarDecls possibly returned by the operator<=>
5213 /// builtins for that type.
5214 ///
5215 /// \return The type of the comparison category type corresponding to the
5216 /// specified Kind, or a null type if an error occurs
5218 SourceLocation Loc,
5220
5221 /// Tests whether Ty is an instance of std::initializer_list and, if
5222 /// it is and Element is not NULL, assigns the element type to Element.
5223 bool isStdInitializerList(QualType Ty, QualType *Element);
5224
5225 /// Tests whether Ty is an instance of std::type_identity and, if
5226 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5227 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5228 /// incorrectly structured despite having the correct name, the faulty Decl
5229 /// will be assigned to MalformedDecl.
5230 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5231 const Decl **MalformedDecl = nullptr);
5232
5233 /// Looks for the std::initializer_list template and instantiates it
5234 /// with Element, or emits an error if it's not found.
5235 ///
5236 /// \returns The instantiated template, or null on error.
5238
5239 /// Looks for the std::type_identity template and instantiates it
5240 /// with Type, or returns a null type if type_identity has not been declared
5241 ///
5242 /// \returns The instantiated template, or null if std::type_identity is not
5243 /// declared
5245
5246 /// Determine whether Ctor is an initializer-list constructor, as
5247 /// defined in [dcl.init.list]p2.
5248 bool isInitListConstructor(const FunctionDecl *Ctor);
5249
5250 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5251 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5252 SourceLocation IdentLoc,
5253 IdentifierInfo *NamespcName,
5254 const ParsedAttributesView &AttrList);
5255
5257
5258 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5259 SourceLocation AliasLoc, IdentifierInfo *Alias,
5260 CXXScopeSpec &SS, SourceLocation IdentLoc,
5261 IdentifierInfo *Ident);
5262
5263 /// Remove decls we can't actually see from a lookup being used to declare
5264 /// shadow using decls.
5265 ///
5266 /// \param S - The scope of the potential shadow decl
5267 /// \param Previous - The lookup of a potential shadow decl's name.
5268 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5269
5270 /// Hides a using shadow declaration. This is required by the current
5271 /// using-decl implementation when a resolvable using declaration in a
5272 /// class is followed by a declaration which would hide or override
5273 /// one or more of the using decl's targets; for example:
5274 ///
5275 /// struct Base { void foo(int); };
5276 /// struct Derived : Base {
5277 /// using Base::foo;
5278 /// void foo(int);
5279 /// };
5280 ///
5281 /// The governing language is C++03 [namespace.udecl]p12:
5282 ///
5283 /// When a using-declaration brings names from a base class into a
5284 /// derived class scope, member functions in the derived class
5285 /// override and/or hide member functions with the same name and
5286 /// parameter types in a base class (rather than conflicting).
5287 ///
5288 /// There are two ways to implement this:
5289 /// (1) optimistically create shadow decls when they're not hidden
5290 /// by existing declarations, or
5291 /// (2) don't create any shadow decls (or at least don't make them
5292 /// visible) until we've fully parsed/instantiated the class.
5293 /// The problem with (1) is that we might have to retroactively remove
5294 /// a shadow decl, which requires several O(n) operations because the
5295 /// decl structures are (very reasonably) not designed for removal.
5296 /// (2) avoids this but is very fiddly and phase-dependent.
5297 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5298
5299 /// Determines whether to create a using shadow decl for a particular
5300 /// decl, given the set of decls existing prior to this using lookup.
5302 const LookupResult &PreviousDecls,
5303 UsingShadowDecl *&PrevShadow);
5304
5305 /// Builds a shadow declaration corresponding to a 'using' declaration.
5308 UsingShadowDecl *PrevDecl);
5309
5310 /// Checks that the given using declaration is not an invalid
5311 /// redeclaration. Note that this is checking only for the using decl
5312 /// itself, not for any ill-formedness among the UsingShadowDecls.
5314 bool HasTypenameKeyword,
5315 const CXXScopeSpec &SS,
5316 SourceLocation NameLoc,
5317 const LookupResult &Previous);
5318
5319 /// Checks that the given nested-name qualifier used in a using decl
5320 /// in the current context is appropriately related to the current
5321 /// scope. If an error is found, diagnoses it and returns true.
5322 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5323 /// the result of that lookup. UD is likewise nullptr, except when we have an
5324 /// already-populated UsingDecl whose shadow decls contain the same
5325 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5326 /// scope).
5327 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5328 const CXXScopeSpec &SS,
5329 const DeclarationNameInfo &NameInfo,
5330 SourceLocation NameLoc,
5331 const LookupResult *R = nullptr,
5332 const UsingDecl *UD = nullptr);
5333
5334 /// Builds a using declaration.
5335 ///
5336 /// \param IsInstantiation - Whether this call arises from an
5337 /// instantiation of an unresolved using declaration. We treat
5338 /// the lookup differently for these declarations.
5340 SourceLocation UsingLoc,
5341 bool HasTypenameKeyword,
5342 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5343 DeclarationNameInfo NameInfo,
5344 SourceLocation EllipsisLoc,
5345 const ParsedAttributesView &AttrList,
5346 bool IsInstantiation, bool IsUsingIfExists);
5348 SourceLocation UsingLoc,
5349 SourceLocation EnumLoc,
5350 SourceLocation NameLoc,
5351 TypeSourceInfo *EnumType, EnumDecl *ED);
5352 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5353 ArrayRef<NamedDecl *> Expansions);
5354
5355 /// Additional checks for a using declaration referring to a constructor name.
5357
5358 /// Given a derived-class using shadow declaration for a constructor and the
5359 /// correspnding base class constructor, find or create the implicit
5360 /// synthesized derived class constructor to use for this initialization.
5363 ConstructorUsingShadowDecl *DerivedShadow);
5364
5366 SourceLocation UsingLoc,
5367 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5368 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5369 const ParsedAttributesView &AttrList);
5371 SourceLocation UsingLoc,
5372 SourceLocation EnumLoc, SourceRange TyLoc,
5373 const IdentifierInfo &II, ParsedType Ty,
5374 const CXXScopeSpec &SS);
5376 MultiTemplateParamsArg TemplateParams,
5377 SourceLocation UsingLoc, UnqualifiedId &Name,
5378 const ParsedAttributesView &AttrList,
5379 TypeResult Type, Decl *DeclFromDeclSpec);
5380
5381 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5382 /// including handling of its default argument expressions.
5383 ///
5384 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5386 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5388 bool HadMultipleCandidates, bool IsListInitialization,
5389 bool IsStdInitListInitialization, bool RequiresZeroInit,
5390 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5391
5392 /// Build a CXXConstructExpr whose constructor has already been resolved if
5393 /// it denotes an inherited constructor.
5395 SourceLocation ConstructLoc, QualType DeclInitType,
5396 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5397 bool HadMultipleCandidates, bool IsListInitialization,
5398 bool IsStdInitListInitialization, bool RequiresZeroInit,
5399 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5400
5401 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5402 // the constructor can be elidable?
5404 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5405 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5406 bool HadMultipleCandidates, bool IsListInitialization,
5407 bool IsStdInitListInitialization, bool RequiresZeroInit,
5408 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5409
5411 SourceLocation InitLoc);
5412
5413 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5414 /// constructed variable.
5415 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5416
5417 /// Helper class that collects exception specifications for
5418 /// implicitly-declared special member functions.
5420 // Pointer to allow copying
5421 Sema *Self;
5422 // We order exception specifications thus:
5423 // noexcept is the most restrictive, but is only used in C++11.
5424 // throw() comes next.
5425 // Then a throw(collected exceptions)
5426 // Finally no specification, which is expressed as noexcept(false).
5427 // throw(...) is used instead if any called function uses it.
5428 ExceptionSpecificationType ComputedEST;
5429 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5430 SmallVector<QualType, 4> Exceptions;
5431
5432 void ClearExceptions() {
5433 ExceptionsSeen.clear();
5434 Exceptions.clear();
5435 }
5436
5437 public:
5439 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5440 if (!Self.getLangOpts().CPlusPlus11)
5441 ComputedEST = EST_DynamicNone;
5442 }
5443
5444 /// Get the computed exception specification type.
5446 assert(!isComputedNoexcept(ComputedEST) &&
5447 "noexcept(expr) should not be a possible result");
5448 return ComputedEST;
5449 }
5450
5451 /// The number of exceptions in the exception specification.
5452 unsigned size() const { return Exceptions.size(); }
5453
5454 /// The set of exceptions in the exception specification.
5455 const QualType *data() const { return Exceptions.data(); }
5456
5457 /// Integrate another called method into the collected data.
5458 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5459
5460 /// Integrate an invoked expression into the collected data.
5461 void CalledExpr(Expr *E) { CalledStmt(E); }
5462
5463 /// Integrate an invoked statement into the collected data.
5464 void CalledStmt(Stmt *S);
5465
5466 /// Overwrite an EPI's exception specification with this
5467 /// computed exception specification.
5470 ESI.Type = getExceptionSpecType();
5471 if (ESI.Type == EST_Dynamic) {
5472 ESI.Exceptions = Exceptions;
5473 } else if (ESI.Type == EST_None) {
5474 /// C++11 [except.spec]p14:
5475 /// The exception-specification is noexcept(false) if the set of
5476 /// potential exceptions of the special member function contains "any"
5477 ESI.Type = EST_NoexceptFalse;
5478 ESI.NoexceptExpr =
5479 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5480 }
5481 return ESI;
5482 }
5483 };
5484
5485 /// Evaluate the implicit exception specification for a defaulted
5486 /// special member function.
5488
5489 /// Check the given exception-specification and update the
5490 /// exception specification information with the results.
5491 void checkExceptionSpecification(bool IsTopLevel,
5493 ArrayRef<ParsedType> DynamicExceptions,
5494 ArrayRef<SourceRange> DynamicExceptionRanges,
5495 Expr *NoexceptExpr,
5496 SmallVectorImpl<QualType> &Exceptions,
5498
5499 /// Add an exception-specification to the given member or friend function
5500 /// (or function template). The exception-specification was parsed
5501 /// after the function itself was declared.
5503 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5504 ArrayRef<ParsedType> DynamicExceptions,
5505 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5506
5507 class InheritedConstructorInfo;
5508
5509 /// Determine if a special member function should have a deleted
5510 /// definition when it is defaulted.
5512 InheritedConstructorInfo *ICI = nullptr,
5513 bool Diagnose = false);
5514
5515 /// Produce notes explaining why a defaulted function was defined as deleted.
5517
5518 /// Declare the implicit default constructor for the given class.
5519 ///
5520 /// \param ClassDecl The class declaration into which the implicit
5521 /// default constructor will be added.
5522 ///
5523 /// \returns The implicitly-declared default constructor.
5526
5527 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5528 /// defining this constructor as the default constructor.
5531
5532 /// Declare the implicit destructor for the given class.
5533 ///
5534 /// \param ClassDecl The class declaration into which the implicit
5535 /// destructor will be added.
5536 ///
5537 /// \returns The implicitly-declared destructor.
5539
5540 /// DefineImplicitDestructor - Checks for feasibility of
5541 /// defining this destructor as the default destructor.
5542 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5544
5545 /// Build an exception spec for destructors that don't have one.
5546 ///
5547 /// C++11 says that user-defined destructors with no exception spec get one
5548 /// that looks as if the destructor was implicitly declared.
5550
5551 /// Define the specified inheriting constructor.
5554
5555 /// Declare the implicit copy constructor for the given class.
5556 ///
5557 /// \param ClassDecl The class declaration into which the implicit
5558 /// copy constructor will be added.
5559 ///
5560 /// \returns The implicitly-declared copy constructor.
5562
5563 /// DefineImplicitCopyConstructor - Checks for feasibility of
5564 /// defining this constructor as the copy constructor.
5565 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5567
5568 /// Declare the implicit move constructor for the given class.
5569 ///
5570 /// \param ClassDecl The Class declaration into which the implicit
5571 /// move constructor will be added.
5572 ///
5573 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5574 /// declared.
5576
5577 /// DefineImplicitMoveConstructor - Checks for feasibility of
5578 /// defining this constructor as the move constructor.
5579 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5581
5582 /// Declare the implicit copy assignment operator for the given class.
5583 ///
5584 /// \param ClassDecl The class declaration into which the implicit
5585 /// copy assignment operator will be added.
5586 ///
5587 /// \returns The implicitly-declared copy assignment operator.
5589
5590 /// Defines an implicitly-declared copy assignment operator.
5591 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5592 CXXMethodDecl *MethodDecl);
5593
5594 /// Declare the implicit move assignment operator for the given class.
5595 ///
5596 /// \param ClassDecl The Class declaration into which the implicit
5597 /// move assignment operator will be added.
5598 ///
5599 /// \returns The implicitly-declared move assignment operator, or NULL if it
5600 /// wasn't declared.
5602
5603 /// Defines an implicitly-declared move assignment operator.
5604 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5605 CXXMethodDecl *MethodDecl);
5606
5607 /// Check a completed declaration of an implicit special member.
5609
5610 /// Determine whether the given function is an implicitly-deleted
5611 /// special member function.
5613
5614 /// Check whether 'this' shows up in the type of a static member
5615 /// function after the (naturally empty) cv-qualifier-seq would be.
5616 ///
5617 /// \returns true if an error occurred.
5619
5620 /// Whether this' shows up in the exception specification of a static
5621 /// member function.
5623
5624 /// Check whether 'this' shows up in the attributes of the given
5625 /// static member function.
5626 ///
5627 /// \returns true if an error occurred.
5629
5631 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5632
5634
5635 /// Given a constructor and the set of arguments provided for the
5636 /// constructor, convert the arguments and add any required default arguments
5637 /// to form a proper call to this constructor.
5638 ///
5639 /// \returns true if an error occurred, false otherwise.
5641 QualType DeclInitType, MultiExprArg ArgsPtr,
5642 SourceLocation Loc,
5643 SmallVectorImpl<Expr *> &ConvertedArgs,
5644 bool AllowExplicit = false,
5645 bool IsListInitialization = false);
5646
5647 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5648 /// initializer for the declaration 'Dcl'.
5649 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5650 /// static data member of class X, names should be looked up in the scope of
5651 /// class X.
5653
5654 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5655 /// initializer for the declaration 'Dcl'.
5656 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5657
5658 /// Define the "body" of the conversion from a lambda object to a
5659 /// function pointer.
5660 ///
5661 /// This routine doesn't actually define a sensible body; rather, it fills
5662 /// in the initialization expression needed to copy the lambda object into
5663 /// the block, and IR generation actually generates the real body of the
5664 /// block pointer conversion.
5665 void
5667 CXXConversionDecl *Conv);
5668
5669 /// Define the "body" of the conversion from a lambda object to a
5670 /// block pointer.
5671 ///
5672 /// This routine doesn't actually define a sensible body; rather, it fills
5673 /// in the initialization expression needed to copy the lambda object into
5674 /// the block, and IR generation actually generates the real body of the
5675 /// block pointer conversion.
5677 CXXConversionDecl *Conv);
5678
5679 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5680 /// linkage specification, including the language and (if present)
5681 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5682 /// language string literal. LBraceLoc, if valid, provides the location of
5683 /// the '{' brace. Otherwise, this linkage specification does not
5684 /// have any braces.
5686 Expr *LangStr, SourceLocation LBraceLoc);
5687
5688 /// ActOnFinishLinkageSpecification - Complete the definition of
5689 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5690 /// valid, it's the position of the closing '}' brace in a linkage
5691 /// specification that uses braces.
5693 SourceLocation RBraceLoc);
5694
5695 //===--------------------------------------------------------------------===//
5696 // C++ Classes
5697 //
5698
5699 /// Get the class that is directly named by the current context. This is the
5700 /// class for which an unqualified-id in this scope could name a constructor
5701 /// or destructor.
5702 ///
5703 /// If the scope specifier denotes a class, this will be that class.
5704 /// If the scope specifier is empty, this will be the class whose
5705 /// member-specification we are currently within. Otherwise, there
5706 /// is no such class.
5708
5709 /// isCurrentClassName - Determine whether the identifier II is the
5710 /// name of the class type currently being defined. In the case of
5711 /// nested classes, this will only return true if II is the name of
5712 /// the innermost class.
5713 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5714 const CXXScopeSpec *SS = nullptr);
5715
5716 /// Determine whether the identifier II is a typo for the name of
5717 /// the class type currently being defined. If so, update it to the identifier
5718 /// that should have been used.
5720
5721 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5723 SourceLocation ColonLoc,
5724 const ParsedAttributesView &Attrs);
5725
5726 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5727 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5728 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5729 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5730 /// present (but parsing it has been deferred).
5731 NamedDecl *
5733 MultiTemplateParamsArg TemplateParameterLists,
5734 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5735 InClassInitStyle InitStyle);
5736
5737 /// Enter a new C++ default initializer scope. After calling this, the
5738 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5739 /// parsing or instantiating the initializer failed.
5741
5742 /// This is invoked after parsing an in-class initializer for a
5743 /// non-static C++ class member, and after instantiating an in-class
5744 /// initializer in a class template. Such actions are deferred until the class
5745 /// is complete.
5747 SourceLocation EqualLoc,
5749
5750 /// Handle a C++ member initializer using parentheses syntax.
5752 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5753 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5754 const DeclSpec &DS, SourceLocation IdLoc,
5755 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5756 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5757
5758 /// Handle a C++ member initializer using braced-init-list syntax.
5759 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5760 CXXScopeSpec &SS,
5761 IdentifierInfo *MemberOrBase,
5762 ParsedType TemplateTypeTy,
5763 const DeclSpec &DS, SourceLocation IdLoc,
5764 Expr *InitList, SourceLocation EllipsisLoc);
5765
5766 /// Handle a C++ member initializer.
5767 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5768 CXXScopeSpec &SS,
5769 IdentifierInfo *MemberOrBase,
5770 ParsedType TemplateTypeTy,
5771 const DeclSpec &DS, SourceLocation IdLoc,
5772 Expr *Init, SourceLocation EllipsisLoc);
5773
5775 SourceLocation IdLoc);
5776
5778 TypeSourceInfo *BaseTInfo, Expr *Init,
5779 CXXRecordDecl *ClassDecl,
5780 SourceLocation EllipsisLoc);
5781
5783 CXXRecordDecl *ClassDecl);
5784
5787
5789 ArrayRef<CXXCtorInitializer *> Initializers = {});
5790
5791 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5792 /// mark all the non-trivial destructors of its members and bases as
5793 /// referenced.
5794 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5795 CXXRecordDecl *Record);
5796
5797 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5798 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5799 /// class. In the Microsoft C++ ABI, this is done any time a class's
5800 /// destructor is referenced.
5802 SourceLocation Location, CXXRecordDecl *ClassDecl,
5803 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5804 nullptr);
5805
5806 /// Do semantic checks to allow the complete destructor variant to be emitted
5807 /// when the destructor is defined in another translation unit. In the Itanium
5808 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5809 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5810 /// of the checks performed when emitting a regular destructor.
5811 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5812 CXXDestructorDecl *Dtor);
5813
5814 /// The list of classes whose vtables have been used within
5815 /// this translation unit, and the source locations at which the
5816 /// first use occurred.
5817 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5818
5819 /// The list of vtables that are required but have not yet been
5820 /// materialized.
5822
5823 /// The set of classes whose vtables have been used within
5824 /// this translation unit, and a bit that will be true if the vtable is
5825 /// required to be emitted (otherwise, it should be emitted only if needed
5826 /// by code generation).
5827 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5828
5829 /// Load any externally-stored vtable uses.
5831
5832 /// Note that the vtable for the given class was used at the
5833 /// given location.
5835 bool DefinitionRequired = false);
5836
5837 /// Mark the exception specifications of all virtual member functions
5838 /// in the given class as needed.
5840 const CXXRecordDecl *RD);
5841
5842 /// MarkVirtualMembersReferenced - Will mark all members of the given
5843 /// CXXRecordDecl referenced.
5845 bool ConstexprOnly = false);
5846
5847 /// Define all of the vtables that have been used in this
5848 /// translation unit and reference any virtual members used by those
5849 /// vtables.
5850 ///
5851 /// \returns true if any work was done, false otherwise.
5852 bool DefineUsedVTables();
5853
5854 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5855 /// special functions, such as the default constructor, copy
5856 /// constructor, or destructor, to the given C++ class (C++
5857 /// [special]p1). This routine can only be executed just before the
5858 /// definition of the class is complete.
5860
5861 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5862 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5864 bool AnyErrors);
5865
5866 /// Check class-level dllimport/dllexport attribute. The caller must
5867 /// ensure that referenceDLLExportedClassMethods is called some point later
5868 /// when all outer classes of Class are complete.
5871
5873
5874 /// Perform propagation of DLL attributes from a derived class to a
5875 /// templated base class for MS compatibility.
5877 CXXRecordDecl *Class, Attr *ClassAttr,
5878 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5879 SourceLocation BaseLoc);
5880
5881 /// Perform semantic checks on a class definition that has been
5882 /// completing, introducing implicitly-declared members, checking for
5883 /// abstract types, etc.
5884 ///
5885 /// \param S The scope in which the class was parsed. Null if we didn't just
5886 /// parse a class definition.
5887 /// \param Record The completed class.
5889
5890 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
5891 /// conditions that are needed for the attribute to have an effect.
5893
5894 /// Check that VTable Pointer authentication is only being set on the first
5895 /// first instantiation of the vtable
5897
5899 Decl *TagDecl, SourceLocation LBrac,
5900 SourceLocation RBrac,
5901 const ParsedAttributesView &AttrList);
5902
5903 /// Perform any semantic analysis which needs to be delayed until all
5904 /// pending class member declarations have been parsed.
5907
5908 /// This is used to implement the constant expression evaluation part of the
5909 /// attribute enable_if extension. There is nothing in standard C++ which
5910 /// would require reentering parameters.
5913 llvm::function_ref<Scope *()> EnterScope);
5915
5916 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
5917 /// parsing a top-level (non-nested) C++ class, and we are now
5918 /// parsing those parts of the given Method declaration that could
5919 /// not be parsed earlier (C++ [class.mem]p2), such as default
5920 /// arguments. This action should enter the scope of the given
5921 /// Method declaration as if we had just parsed the qualified method
5922 /// name. However, it should not bring the parameters into scope;
5923 /// that will be performed by ActOnDelayedCXXMethodParameter.
5925 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
5927
5928 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
5929 /// processing the delayed method declaration for Method. The method
5930 /// declaration is now considered finished. There may be a separate
5931 /// ActOnStartOfFunctionDef action later (not necessarily
5932 /// immediately!) for this method, if it was also defined inside the
5933 /// class body.
5936
5938
5939 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
5940 StringEvaluationContext EvalContext,
5941 bool ErrorOnInvalidMessage);
5942 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
5943 StringEvaluationContext EvalContext,
5944 bool ErrorOnInvalidMessage);
5945
5947 Expr *AssertExpr, Expr *AssertMessageExpr,
5948 SourceLocation RParenLoc);
5950 Expr *AssertExpr, Expr *AssertMessageExpr,
5951 SourceLocation RParenLoc, bool Failed);
5952
5953 /// Try to print more useful information about a failed static_assert
5954 /// with expression \E
5955 void DiagnoseStaticAssertDetails(const Expr *E);
5956
5957 /// If E represents a built-in type trait, or a known standard type trait,
5958 /// try to print more information about why the type type-trait failed.
5959 /// This assumes we already evaluated the expression to a false boolean value.
5960 void DiagnoseTypeTraitDetails(const Expr *E);
5961
5962 /// Handle a friend type declaration. This works in tandem with
5963 /// ActOnTag.
5964 ///
5965 /// Notes on friend class templates:
5966 ///
5967 /// We generally treat friend class declarations as if they were
5968 /// declaring a class. So, for example, the elaborated type specifier
5969 /// in a friend declaration is required to obey the restrictions of a
5970 /// class-head (i.e. no typedefs in the scope chain), template
5971 /// parameters are required to match up with simple template-ids, &c.
5972 /// However, unlike when declaring a template specialization, it's
5973 /// okay to refer to a template specialization without an empty
5974 /// template parameter declaration, e.g.
5975 /// friend class A<T>::B<unsigned>;
5976 /// We permit this as a special case; if there are any template
5977 /// parameters present at all, require proper matching, i.e.
5978 /// template <> template <class T> friend class A<int>::B;
5979 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
5980 MultiTemplateParamsArg TemplateParams,
5981 SourceLocation EllipsisLoc);
5983 MultiTemplateParamsArg TemplateParams);
5984
5985 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
5986 /// the well-formedness of the constructor declarator @p D with type @p
5987 /// R. If there are any errors in the declarator, this routine will
5988 /// emit diagnostics and set the invalid bit to true. In any case, the type
5989 /// will be updated to reflect a well-formed type for the constructor and
5990 /// returned.
5992 StorageClass &SC);
5993
5994 /// CheckConstructor - Checks a fully-formed constructor for
5995 /// well-formedness, issuing any diagnostics required. Returns true if
5996 /// the constructor declarator is invalid.
5998
5999 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6000 /// the well-formednes of the destructor declarator @p D with type @p
6001 /// R. If there are any errors in the declarator, this routine will
6002 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6003 /// will be updated to reflect a well-formed type for the destructor and
6004 /// returned.
6006 StorageClass &SC);
6007
6008 /// CheckDestructor - Checks a fully-formed destructor definition for
6009 /// well-formedness, issuing any diagnostics required. Returns true
6010 /// on error.
6012
6013 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6014 /// well-formednes of the conversion function declarator @p D with
6015 /// type @p R. If there are any errors in the declarator, this routine
6016 /// will emit diagnostics and return true. Otherwise, it will return
6017 /// false. Either way, the type @p R will be updated to reflect a
6018 /// well-formed type for the conversion operator.
6020
6021 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6022 /// the declaration of the given C++ conversion function. This routine
6023 /// is responsible for recording the conversion function in the C++
6024 /// class, if possible.
6026
6027 /// Check the validity of a declarator that we parsed for a deduction-guide.
6028 /// These aren't actually declarators in the grammar, so we need to check that
6029 /// the user didn't specify any pieces that are not part of the
6030 /// deduction-guide grammar. Return true on invalid deduction-guide.
6032 StorageClass &SC);
6033
6035
6038 SourceLocation DefaultLoc);
6040
6041 /// Kinds of defaulted comparison operator functions.
6042 enum class DefaultedComparisonKind : unsigned char {
6043 /// This is not a defaultable comparison operator.
6045 /// This is an operator== that should be implemented as a series of
6046 /// subobject comparisons.
6048 /// This is an operator<=> that should be implemented as a series of
6049 /// subobject comparisons.
6051 /// This is an operator!= that should be implemented as a rewrite in terms
6052 /// of a == comparison.
6054 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
6055 /// terms of a <=> comparison.
6057 };
6058
6062 FunctionDecl *Spaceship);
6065
6067 QualType R, bool IsLambda,
6068 DeclContext *DC = nullptr);
6070 DeclarationName Name, QualType R);
6072
6073 //===--------------------------------------------------------------------===//
6074 // C++ Derived Classes
6075 //
6076
6077 /// Check the validity of a C++ base class specifier.
6078 ///
6079 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6080 /// and returns NULL otherwise.
6082 SourceRange SpecifierRange, bool Virtual,
6083 AccessSpecifier Access,
6084 TypeSourceInfo *TInfo,
6085 SourceLocation EllipsisLoc);
6086
6087 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6088 /// one entry in the base class list of a class specifier, for
6089 /// example:
6090 /// class foo : public bar, virtual private baz {
6091 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6092 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6093 const ParsedAttributesView &Attrs, bool Virtual,
6094 AccessSpecifier Access, ParsedType basetype,
6095 SourceLocation BaseLoc,
6096 SourceLocation EllipsisLoc);
6097
6098 /// Performs the actual work of attaching the given base class
6099 /// specifiers to a C++ class.
6102
6103 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6104 /// class, after checking whether there are any duplicate base
6105 /// classes.
6106 void ActOnBaseSpecifiers(Decl *ClassDecl,
6108
6109 /// Determine whether the type \p Derived is a C++ class that is
6110 /// derived from the type \p Base.
6111 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6113 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6117 CXXBasePaths &Paths);
6118
6119 // FIXME: I don't like this name.
6120 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6121
6123 SourceLocation Loc, SourceRange Range,
6124 CXXCastPath *BasePath = nullptr,
6125 bool IgnoreAccess = false);
6126
6127 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6128 /// conversion (where Derived and Base are class types) is
6129 /// well-formed, meaning that the conversion is unambiguous (and
6130 /// that all of the base classes are accessible). Returns true
6131 /// and emits a diagnostic if the code is ill-formed, returns false
6132 /// otherwise. Loc is the location where this routine should point to
6133 /// if there is an error, and Range is the source range to highlight
6134 /// if there is an error.
6135 ///
6136 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6137 /// diagnostic for the respective type of error will be suppressed, but the
6138 /// check for ill-formed code will still be performed.
6140 unsigned InaccessibleBaseID,
6141 unsigned AmbiguousBaseConvID,
6142 SourceLocation Loc, SourceRange Range,
6143 DeclarationName Name, CXXCastPath *BasePath,
6144 bool IgnoreAccess = false);
6145
6146 /// Builds a string representing ambiguous paths from a
6147 /// specific derived class to different subobjects of the same base
6148 /// class.
6149 ///
6150 /// This function builds a string that can be used in error messages
6151 /// to show the different paths that one can take through the
6152 /// inheritance hierarchy to go from the derived class to different
6153 /// subobjects of a base class. The result looks something like this:
6154 /// @code
6155 /// struct D -> struct B -> struct A
6156 /// struct D -> struct C -> struct A
6157 /// @endcode
6158 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6159
6161 const CXXMethodDecl *Old);
6162
6163 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6164 /// covariant, according to C++ [class.virtual]p5.
6166 const CXXMethodDecl *Old);
6167
6168 // Check that the overriding method has no explicit object parameter.
6170 const CXXMethodDecl *Old);
6171
6172 /// Mark the given method pure.
6173 ///
6174 /// \param Method the method to be marked pure.
6175 ///
6176 /// \param InitRange the source range that covers the "0" initializer.
6178
6179 /// CheckOverrideControl - Check C++11 override control semantics.
6181
6182 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6183 /// not used in the declaration of an overriding method.
6185
6186 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6187 /// function overrides a virtual member function marked 'final', according to
6188 /// C++11 [class.virtual]p4.
6190 const CXXMethodDecl *Old);
6191
6202
6203 struct TypeDiagnoser;
6204
6207 TypeDiagnoser &Diagnoser);
6208 template <typename... Ts>
6210 const Ts &...Args) {
6211 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6212 return RequireNonAbstractType(Loc, T, Diagnoser);
6213 }
6214
6215 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6216
6217 //===--------------------------------------------------------------------===//
6218 // C++ Overloaded Operators [C++ 13.5]
6219 //
6220
6221 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6222 /// of this overloaded operator is well-formed. If so, returns false;
6223 /// otherwise, emits appropriate diagnostics and returns true.
6225
6226 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6227 /// of this literal operator function is well-formed. If so, returns
6228 /// false; otherwise, emits appropriate diagnostics and returns true.
6230
6231 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6232 /// found in an explicit(bool) specifier.
6234
6235 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6236 /// Returns true if the explicit specifier is now resolved.
6238
6239 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6240 /// C++ if/switch/while/for statement.
6241 /// e.g: "if (int x = f()) {...}"
6243
6244 // Emitting members of dllexported classes is delayed until the class
6245 // (including field initializers) is fully parsed.
6248
6249 /// Merge the exception specifications of two variable declarations.
6250 ///
6251 /// This is called when there's a redeclaration of a VarDecl. The function
6252 /// checks if the redeclaration might have an exception specification and
6253 /// validates compatibility and merges the specs if necessary.
6255
6256 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6257 /// function, once we already know that they have the same
6258 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6259 /// error, false otherwise.
6261
6262 /// Helpers for dealing with blocks and functions.
6264
6265 /// CheckExtraCXXDefaultArguments - Check for any extra default
6266 /// arguments in the declarator, which is not a function declaration
6267 /// or definition and therefore is not permitted to have default
6268 /// arguments. This routine should be invoked for every declarator
6269 /// that is not a function declaration or definition.
6271
6275
6276 /// Perform semantic analysis for the variable declaration that
6277 /// occurs within a C++ catch clause, returning the newly-created
6278 /// variable.
6280 SourceLocation StartLoc,
6281 SourceLocation IdLoc,
6282 const IdentifierInfo *Id);
6283
6284 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6285 /// handler.
6287
6289
6290 /// Handle a friend tag declaration where the scope specifier was
6291 /// templated.
6293 unsigned TagSpec, SourceLocation TagLoc,
6294 CXXScopeSpec &SS, IdentifierInfo *Name,
6295 SourceLocation NameLoc,
6296 SourceLocation EllipsisLoc,
6298 MultiTemplateParamsArg TempParamLists);
6299
6301 SourceLocation DeclStart, Declarator &D,
6302 Expr *BitfieldWidth,
6303 InClassInitStyle InitStyle,
6304 AccessSpecifier AS,
6305 const ParsedAttr &MSPropertyAttr);
6306
6307 /// Diagnose why the specified class does not have a trivial special member of
6308 /// the given kind.
6311
6312 /// Determine whether a defaulted or deleted special member function is
6313 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6314 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6318 bool Diagnose = false);
6319
6320 /// For a defaulted function, the kind of defaulted function that it is.
6322 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
6323 unsigned SpecialMember : 8;
6324 unsigned Comparison : 8;
6325
6326 public:
6328 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6329 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6331 : SpecialMember(llvm::to_underlying(CSM)),
6332 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6334 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6335 Comparison(llvm::to_underlying(Comp)) {}
6336
6337 bool isSpecialMember() const {
6338 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
6340 }
6341 bool isComparison() const {
6342 return static_cast<DefaultedComparisonKind>(Comparison) !=
6344 }
6345
6346 explicit operator bool() const {
6347 return isSpecialMember() || isComparison();
6348 }
6349
6351 return static_cast<CXXSpecialMemberKind>(SpecialMember);
6352 }
6354 return static_cast<DefaultedComparisonKind>(Comparison);
6355 }
6356
6357 /// Get the index of this function kind for use in diagnostics.
6358 unsigned getDiagnosticIndex() const {
6359 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
6360 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
6361 "invalid should have highest index");
6362 static_assert((unsigned)DefaultedComparisonKind::None == 0,
6363 "none should be equal to zero");
6364 return SpecialMember + Comparison;
6365 }
6366 };
6367
6368 /// Determine the kind of defaulting that would be done for a given function.
6369 ///
6370 /// If the function is both a default constructor and a copy / move
6371 /// constructor (due to having a default argument for the first parameter),
6372 /// this picks CXXSpecialMemberKind::DefaultConstructor.
6373 ///
6374 /// FIXME: Check that case is properly handled by all callers.
6375 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
6376
6377 /// Handle a C++11 empty-declaration and attribute-declaration.
6379 SourceLocation SemiLoc);
6380
6382 /// Diagnose issues that are non-constant or that are extensions.
6384 /// Identify whether this function satisfies the formal rules for constexpr
6385 /// functions in the current lanugage mode (with no extensions).
6387 };
6388
6389 // Check whether a function declaration satisfies the requirements of a
6390 // constexpr function definition or a constexpr constructor definition. If so,
6391 // return true. If not, produce appropriate diagnostics (unless asked not to
6392 // by Kind) and return false.
6393 //
6394 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6396 CheckConstexprKind Kind);
6397
6398 /// Diagnose methods which overload virtual methods in a base class
6399 /// without overriding any.
6401
6402 /// Check if a method overloads virtual methods in a base class without
6403 /// overriding any.
6404 void
6406 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6407 void
6409 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6410
6411 /// ActOnParamDefaultArgument - Check whether the default argument
6412 /// provided for a function parameter is well-formed. If so, attach it
6413 /// to the parameter declaration.
6414 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6415 Expr *defarg);
6416
6417 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6418 /// argument for a function parameter, but we can't parse it yet
6419 /// because we're inside a class definition. Note that this default
6420 /// argument will be parsed later.
6422 SourceLocation ArgLoc);
6423
6424 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6425 /// the default argument for the parameter param failed.
6427 Expr *DefaultArg);
6429 SourceLocation EqualLoc);
6430 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6431 SourceLocation EqualLoc);
6432
6433 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6434 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6435 StringLiteral *Message = nullptr);
6436 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6437
6438 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6439 StringLiteral *DeletedMessage = nullptr);
6443
6444 NamedDecl *
6446 MultiTemplateParamsArg TemplateParamLists);
6449 RecordDecl *ClassDecl,
6450 const IdentifierInfo *Name);
6451
6453 SourceLocation Loc);
6455
6456 /// Stack containing information needed when in C++2a an 'auto' is encountered
6457 /// in a function declaration parameter type specifier in order to invent a
6458 /// corresponding template parameter in the enclosing abbreviated function
6459 /// template. This information is also present in LambdaScopeInfo, stored in
6460 /// the FunctionScopes stack.
6462
6463 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6464 std::unique_ptr<CXXFieldCollector> FieldCollector;
6465
6467 /// Set containing all declared private fields that are not used.
6469
6471
6472 /// PureVirtualClassDiagSet - a set of class declarations which we have
6473 /// emitted a list of pure virtual functions. Used to prevent emitting the
6474 /// same list more than once.
6475 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6476
6480
6481 /// All the delegating constructors seen so far in the file, used for
6482 /// cycle detection at the end of the TU.
6484
6485 /// The C++ "std" namespace, where the standard library resides.
6487
6488 /// The C++ "std::initializer_list" template, which is defined in
6489 /// <initializer_list>.
6491
6492 /// The C++ "std::type_identity" template, which is defined in
6493 /// <type_traits>.
6495
6496 // Contains the locations of the beginning of unparsed default
6497 // argument locations.
6498 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6499
6500 /// UndefinedInternals - all the used, undefined objects which require a
6501 /// definition in this translation unit.
6502 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6503
6504 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6506
6507 /// The C++ special members which we are currently in the process of
6508 /// declaring. If this process recursively triggers the declaration of the
6509 /// same special member, we should act as if it is not yet declared.
6511
6513
6514 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6515
6518 ParsingClassDepth++;
6520 }
6522 ParsingClassDepth--;
6524 }
6525
6527 CXXScopeSpec &SS,
6528 ParsedType TemplateTypeTy,
6529 IdentifierInfo *MemberOrBase);
6530
6531private:
6532 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6533 QualType ResultTy,
6534 ArrayRef<QualType> Args);
6535 // Helper for ActOnFields to check for all function pointer members.
6536 bool EntirelyFunctionPointers(const RecordDecl *Record);
6537
6538 // A cache representing if we've fully checked the various comparison category
6539 // types stored in ASTContext. The bit-index corresponds to the integer value
6540 // of a ComparisonCategoryType enumerator.
6541 llvm::SmallBitVector FullyCheckedComparisonCategories;
6542
6543 /// Check if there is a field shadowing.
6544 void CheckShadowInheritedFields(const SourceLocation &Loc,
6545 DeclarationName FieldName,
6546 const CXXRecordDecl *RD,
6547 bool DeclIsField = true);
6548
6549 ///@}
6550
6551 //
6552 //
6553 // -------------------------------------------------------------------------
6554 //
6555 //
6556
6557 /// \name C++ Exception Specifications
6558 /// Implementations are in SemaExceptionSpec.cpp
6559 ///@{
6560
6561public:
6562 /// All the overriding functions seen during a class definition
6563 /// that had their exception spec checks delayed, plus the overridden
6564 /// function.
6567
6568 /// All the function redeclarations seen during a class definition that had
6569 /// their exception spec checks delayed, plus the prior declaration they
6570 /// should be checked against. Except during error recovery, the new decl
6571 /// should always be a friend declaration, as that's the only valid way to
6572 /// redeclare a special member before its class is complete.
6575
6576 /// Determine if we're in a case where we need to (incorrectly) eagerly
6577 /// parse an exception specification to work around a libstdc++ bug.
6579
6580 /// Check the given noexcept-specifier, convert its expression, and compute
6581 /// the appropriate ExceptionSpecificationType.
6582 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6584
6585 CanThrowResult canThrow(const Stmt *E);
6586 /// Determine whether the callee of a particular function call can throw.
6587 /// E, D and Loc are all optional.
6588 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6591 const FunctionProtoType *FPT);
6594
6595 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6596 /// exception specification. Incomplete types, or pointers to incomplete types
6597 /// other than void are not allowed.
6598 ///
6599 /// \param[in,out] T The exception type. This will be decayed to a pointer
6600 /// type
6601 /// when the input is an array or a function type.
6603
6604 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6605 /// pointer to member to a function with an exception specification. This
6606 /// means that it is invalid to add another level of indirection.
6609
6610 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6611 /// exception specifications. Exception specifications are equivalent if
6612 /// they allow exactly the same set of exception types. It does not matter how
6613 /// that is achieved. See C++ [except.spec]p2.
6615 SourceLocation OldLoc,
6616 const FunctionProtoType *New,
6617 SourceLocation NewLoc);
6619 const PartialDiagnostic &NoteID,
6620 const FunctionProtoType *Old,
6621 SourceLocation OldLoc,
6622 const FunctionProtoType *New,
6623 SourceLocation NewLoc);
6624 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6625
6626 /// CheckExceptionSpecSubset - Check whether the second function type's
6627 /// exception specification is a subset (or equivalent) of the first function
6628 /// type. This is used by override and pointer assignment checks.
6630 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6631 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6632 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6633 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6634 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6635
6636 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6637 /// two functions have equivalent exception specs. This is part of the
6638 /// assignment and override compatibility check. We do not check the
6639 /// parameters of parameter function pointers recursively, as no sane
6640 /// programmer would even be able to write such a function type.
6642 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6643 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6644 SourceLocation TargetLoc, const FunctionProtoType *Source,
6645 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6646
6647 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6648
6649 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6650 /// spec is a subset of base spec.
6652 const CXXMethodDecl *Old);
6653
6654 ///@}
6655
6656 //
6657 //
6658 // -------------------------------------------------------------------------
6659 //
6660 //
6661
6662 /// \name Expressions
6663 /// Implementations are in SemaExpr.cpp
6664 ///@{
6665
6666public:
6667 /// Describes how the expressions currently being parsed are
6668 /// evaluated at run-time, if at all.
6670 /// The current expression and its subexpressions occur within an
6671 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6672 /// \c sizeof, where the type of the expression may be significant but
6673 /// no code will be generated to evaluate the value of the expression at
6674 /// run time.
6676
6677 /// The current expression occurs within a braced-init-list within
6678 /// an unevaluated operand. This is mostly like a regular unevaluated
6679 /// context, except that we still instantiate constexpr functions that are
6680 /// referenced here so that we can perform narrowing checks correctly.
6682
6683 /// The current expression occurs within a discarded statement.
6684 /// This behaves largely similarly to an unevaluated operand in preventing
6685 /// definitions from being required, but not in other ways.
6687
6688 /// The current expression occurs within an unevaluated
6689 /// operand that unconditionally permits abstract references to
6690 /// fields, such as a SIZE operator in MS-style inline assembly.
6692
6693 /// The current context is "potentially evaluated" in C++11 terms,
6694 /// but the expression is evaluated at compile-time (like the values of
6695 /// cases in a switch statement).
6697
6698 /// In addition of being constant evaluated, the current expression
6699 /// occurs in an immediate function context - either a consteval function
6700 /// or a consteval if statement.
6702
6703 /// The current expression is potentially evaluated at run time,
6704 /// which means that code may be generated to evaluate the value of the
6705 /// expression at run time.
6707
6708 /// The current expression is potentially evaluated, but any
6709 /// declarations referenced inside that expression are only used if
6710 /// in fact the current expression is used.
6711 ///
6712 /// This value is used when parsing default function arguments, for which
6713 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6714 /// through varargs) but do not want to mark declarations as "referenced"
6715 /// until the default argument is used.
6717 };
6718
6719 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6720 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6721 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6722 /// have been applied to all subexpressions of the enclosing full expression.
6723 /// This is cleared at the end of each full expression.
6726
6727 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6728
6729 /// Data structure used to record current or nested
6730 /// expression evaluation contexts.
6732 /// The expression evaluation context.
6734
6735 /// Whether the enclosing context needed a cleanup.
6737
6738 /// The number of active cleanup objects when we entered
6739 /// this expression evaluation context.
6741
6743
6744 /// The lambdas that are present within this context, if it
6745 /// is indeed an unevaluated context.
6747
6748 /// The declaration that provides context for lambda expressions
6749 /// and block literals if the normal declaration context does not
6750 /// suffice, e.g., in a default function argument.
6752
6753 /// If we are processing a decltype type, a set of call expressions
6754 /// for which we have deferred checking the completeness of the return type.
6756
6757 /// If we are processing a decltype type, a set of temporary binding
6758 /// expressions for which we have deferred checking the destructor.
6760
6762
6763 /// Expressions appearing as the LHS of a volatile assignment in this
6764 /// context. We produce a warning for these when popping the context if
6765 /// they are not discarded-value expressions nor unevaluated operands.
6767
6768 /// Set of candidates for starting an immediate invocation.
6771
6772 /// Set of DeclRefExprs referencing a consteval function when used in a
6773 /// context not already known to be immediately invoked.
6775
6776 /// P2718R0 - Lifetime extension in range-based for loops.
6777 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6778 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6779 /// InLifetimeExtendingContext is true.
6781
6782 /// Small set of gathered accesses to potentially misaligned members
6783 /// due to the packed attribute.
6785
6786 /// \brief Describes whether we are in an expression constext which we have
6787 /// to handle differently.
6795
6796 // A context can be nested in both a discarded statement context and
6797 // an immediate function context, so they need to be tracked independently.
6801
6803
6804 // We are in a constant context, but we also allow
6805 // non constant expressions, for example for array bounds (which may be
6806 // VLAs).
6808
6809 /// Whether we are currently in a context in which all temporaries must be
6810 /// lifetime-extended, even if they're not bound to a reference (for
6811 /// example, in a for-range initializer).
6813
6814 /// Whether evaluating an expression for a switch case label.
6815 bool IsCaseExpr = false;
6816
6817 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6819
6820 // When evaluating immediate functions in the initializer of a default
6821 // argument or default member initializer, this is the declaration whose
6822 // default initializer is being evaluated and the location of the call
6823 // or constructor definition.
6827 : Loc(Loc), Decl(Decl), Context(Context) {
6828 assert(Decl && Context && "invalid initialization context");
6829 }
6830
6832 ValueDecl *Decl = nullptr;
6834 };
6835 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6836
6847
6853
6860
6865
6870 // C++23 [expr.const]p14:
6871 // An expression or conversion is in an immediate function
6872 // context if it is potentially evaluated and either:
6873 // * its innermost enclosing non-block scope is a function
6874 // parameter scope of an immediate function, or
6875 // * its enclosing statement is enclosed by the compound-
6876 // statement of a consteval if statement.
6879 }
6880
6888 };
6889
6891 assert(!ExprEvalContexts.empty() &&
6892 "Must be in an expression evaluation context");
6893 return ExprEvalContexts.back();
6894 }
6895
6897 assert(!ExprEvalContexts.empty() &&
6898 "Must be in an expression evaluation context");
6899 return ExprEvalContexts.back();
6900 }
6901
6903 assert(ExprEvalContexts.size() >= 2 &&
6904 "Must be in an expression evaluation context");
6905 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6906 }
6907
6909 return const_cast<Sema *>(this)->parentEvaluationContext();
6910 }
6911
6916
6917 /// Increment when we find a reference; decrement when we find an ignored
6918 /// assignment. Ultimately the value is 0 if every reference is an ignored
6919 /// assignment.
6920 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
6921
6922 /// Used to control the generation of ExprWithCleanups.
6924
6925 /// ExprCleanupObjects - This is the stack of objects requiring
6926 /// cleanup that are created by the current full expression.
6928
6929 /// Determine whether the use of this declaration is valid, without
6930 /// emitting diagnostics.
6931 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
6932 // A version of DiagnoseUseOfDecl that should be used if overload resolution
6933 // has been used to find this declaration, which means we don't have to bother
6934 // checking the trailing requires clause.
6936 return DiagnoseUseOfDecl(
6937 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
6938 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
6939 /*SkipTrailingRequiresClause=*/true);
6940 }
6941
6942 /// Determine whether the use of this declaration is valid, and
6943 /// emit any corresponding diagnostics.
6944 ///
6945 /// This routine diagnoses various problems with referencing
6946 /// declarations that can occur when using a declaration. For example,
6947 /// it might warn if a deprecated or unavailable declaration is being
6948 /// used, or produce an error (and return true) if a C++0x deleted
6949 /// function is being used.
6950 ///
6951 /// \returns true if there was an error (this declaration cannot be
6952 /// referenced), false otherwise.
6954 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
6955 bool ObjCPropertyAccess = false,
6956 bool AvoidPartialAvailabilityChecks = false,
6957 ObjCInterfaceDecl *ClassReciever = nullptr,
6958 bool SkipTrailingRequiresClause = false);
6959
6960 /// Emit a note explaining that this function is deleted.
6962
6963 /// DiagnoseSentinelCalls - This routine checks whether a call or
6964 /// message-send is to a declaration with the sentinel attribute, and
6965 /// if so, it checks that the requirements of the sentinel are
6966 /// satisfied.
6968 ArrayRef<Expr *> Args);
6969
6971 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
6974
6976 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
6977
6980 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
6984
6986
6990
6991 /// Check whether E, which is either a discarded-value expression or an
6992 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
6993 /// lvalue, and if so, remove it from the list of volatile-qualified
6994 /// assignments that we are going to warn are deprecated.
6996
6998
6999 // Functions for marking a declaration referenced. These functions also
7000 // contain the relevant logic for marking if a reference to a function or
7001 // variable is an odr-use (in the C++11 sense). There are separate variants
7002 // for expressions referring to a decl; these exist because odr-use marking
7003 // needs to be delayed for some constant variables when we build one of the
7004 // named expressions.
7005 //
7006 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7007 // should usually be true. This only needs to be set to false if the lack of
7008 // odr-use cannot be determined from the current context (for instance,
7009 // because the name denotes a virtual function and was written without an
7010 // explicit nested-name-specifier).
7011 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7012
7013 /// Mark a function referenced, and check whether it is odr-used
7014 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7016 bool MightBeOdrUse = true);
7017
7018 /// Mark a variable referenced, and check whether it is odr-used
7019 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7020 /// used directly for normal expressions referring to VarDecl.
7022
7023 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7024 ///
7025 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7026 /// be handled with care if the DeclRefExpr is not newly-created.
7027 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7028
7029 /// Perform reference-marking and odr-use handling for a MemberExpr.
7031
7032 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7035 unsigned CapturingScopeIndex);
7036
7038 void CleanupVarDeclMarking();
7039
7040 /// Try to capture the given variable.
7041 ///
7042 /// \param Var The variable to capture.
7043 ///
7044 /// \param Loc The location at which the capture occurs.
7045 ///
7046 /// \param Kind The kind of capture, which may be implicit (for either a
7047 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7048 ///
7049 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7050 /// an explicit lambda capture.
7051 ///
7052 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7053 /// captures or diagnose errors. If false, this routine merely check whether
7054 /// the capture can occur without performing the capture itself or complaining
7055 /// if the variable cannot be captured.
7056 ///
7057 /// \param CaptureType Will be set to the type of the field used to capture
7058 /// this variable in the innermost block or lambda. Only valid when the
7059 /// variable can be captured.
7060 ///
7061 /// \param DeclRefType Will be set to the type of a reference to the capture
7062 /// from within the current scope. Only valid when the variable can be
7063 /// captured.
7064 ///
7065 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7066 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7067 /// This is useful when enclosing lambdas must speculatively capture
7068 /// variables that may or may not be used in certain specializations of
7069 /// a nested generic lambda.
7070 ///
7071 /// \returns true if an error occurred (i.e., the variable cannot be
7072 /// captured) and false if the capture succeeded.
7074 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7075 bool BuildAndDiagnose, QualType &CaptureType,
7076 QualType &DeclRefType,
7077 const unsigned *const FunctionScopeIndexToStopAt);
7078
7079 /// Try to capture the given variable.
7082 SourceLocation EllipsisLoc = SourceLocation());
7083
7084 /// Checks if the variable must be captured.
7086
7087 /// Given a variable, determine the type that a reference to that
7088 /// variable will have in the given scope.
7090
7091 /// Mark all of the declarations referenced within a particular AST node as
7092 /// referenced. Used when template instantiation instantiates a non-dependent
7093 /// type -- entities referenced by the type are now referenced.
7095
7096 /// Mark any declarations that appear within this expression or any
7097 /// potentially-evaluated subexpressions as "referenced".
7098 ///
7099 /// \param SkipLocalVariables If true, don't mark local variables as
7100 /// 'referenced'.
7101 /// \param StopAt Subexpressions that we shouldn't recurse into.
7103 bool SkipLocalVariables = false,
7104 ArrayRef<const Expr *> StopAt = {});
7105
7106 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7107 /// conversion.
7108 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7109
7110 /// Conditionally issue a diagnostic based on the statements's reachability
7111 /// analysis.
7112 ///
7113 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7114 /// the function body is parsed, and then do a basic reachability analysis to
7115 /// determine if the statement is reachable. If it is unreachable, the
7116 /// diagnostic will not be emitted.
7117 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7118 const PartialDiagnostic &PD);
7119
7120 /// Conditionally issue a diagnostic based on the current
7121 /// evaluation context.
7122 ///
7123 /// \param Statement If Statement is non-null, delay reporting the
7124 /// diagnostic until the function body is parsed, and then do a basic
7125 /// reachability analysis to determine if the statement is reachable.
7126 /// If it is unreachable, the diagnostic will not be emitted.
7127 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7128 const PartialDiagnostic &PD);
7129 /// Similar, but diagnostic is only produced if all the specified statements
7130 /// are reachable.
7131 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7132 const PartialDiagnostic &PD);
7133
7134 // Primary Expressions.
7135 SourceRange getExprRange(Expr *E) const;
7136
7137 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7138 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7139 bool HasTrailingLParen, bool IsAddressOfOperand,
7140 CorrectionCandidateCallback *CCC = nullptr,
7141 bool IsInlineAsmIdentifier = false,
7142 Token *KeywordReplacement = nullptr);
7143
7144 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7145 /// possibly a list of template arguments.
7146 ///
7147 /// If this produces template arguments, it is permitted to call
7148 /// DecomposeTemplateName.
7149 ///
7150 /// This actually loses a lot of source location information for
7151 /// non-standard name kinds; we should consider preserving that in
7152 /// some way.
7153 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7154 TemplateArgumentListInfo &Buffer,
7155 DeclarationNameInfo &NameInfo,
7156 const TemplateArgumentListInfo *&TemplateArgs);
7157
7158 /// Diagnose a lookup that found results in an enclosing class during error
7159 /// recovery. This usually indicates that the results were found in a
7160 /// dependent base class that could not be searched as part of a template
7161 /// definition. Always issues a diagnostic (though this may be only a warning
7162 /// in MS compatibility mode).
7163 ///
7164 /// Return \c true if the error is unrecoverable, or \c false if the caller
7165 /// should attempt to recover using these lookup results.
7166 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7167
7168 /// Diagnose an empty lookup.
7169 ///
7170 /// \return false if new lookup candidates were found
7171 bool
7172 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7173 CorrectionCandidateCallback &CCC,
7174 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7175 ArrayRef<Expr *> Args = {},
7176 DeclContext *LookupCtx = nullptr);
7177
7178 /// If \p D cannot be odr-used in the current expression evaluation context,
7179 /// return a reason explaining why. Otherwise, return NOUR_None.
7181
7182 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7183 SourceLocation Loc,
7184 const CXXScopeSpec *SS = nullptr);
7185 DeclRefExpr *
7186 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7187 const DeclarationNameInfo &NameInfo,
7188 const CXXScopeSpec *SS = nullptr,
7189 NamedDecl *FoundD = nullptr,
7190 SourceLocation TemplateKWLoc = SourceLocation(),
7191 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7192
7193 /// BuildDeclRefExpr - Build an expression that references a
7194 /// declaration that does not require a closure capture.
7195 DeclRefExpr *
7196 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7197 const DeclarationNameInfo &NameInfo,
7198 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7199 SourceLocation TemplateKWLoc = SourceLocation(),
7200 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7201
7202 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7203 bool HasTrailingLParen);
7204
7205 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7206 /// declaration name, generally during template instantiation.
7207 /// There's a large number of things which don't need to be done along
7208 /// this path.
7210 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7211 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7212
7213 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7214 bool NeedsADL,
7215 bool AcceptInvalidDecl = false);
7216
7217 /// Complete semantic analysis for a reference to the given declaration.
7219 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7220 NamedDecl *FoundD = nullptr,
7221 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7222 bool AcceptInvalidDecl = false);
7223
7224 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7225 // where Tokens representing function local predefined macros (such as
7226 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7227 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7228
7229 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7230 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7231 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7232
7233 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7234
7235 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7237 Scope *UDLScope = nullptr);
7238 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7239 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7240 MultiExprArg Val);
7241 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7242 unsigned NumUserSpecifiedExprs,
7243 SourceLocation InitLoc,
7244 SourceLocation LParenLoc,
7245 SourceLocation RParenLoc);
7246
7247 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7248 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7249 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7250 /// from multiple tokens. However, the common case is that StringToks points
7251 /// to one string.
7252 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7253 Scope *UDLScope = nullptr);
7254
7255 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7256
7257 /// ControllingExprOrType is either an opaque pointer coming out of a
7258 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7259 /// into two so we don't take a void *, but that's awkward because one of
7260 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7261 /// itself to generic code very well.
7262 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7263 SourceLocation DefaultLoc,
7264 SourceLocation RParenLoc,
7265 bool PredicateIsExpr,
7266 void *ControllingExprOrType,
7267 ArrayRef<ParsedType> ArgTypes,
7268 ArrayRef<Expr *> ArgExprs);
7269 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7270 /// it'd be better to split this interface into two so we don't take a
7271 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7272 /// isn't a trivial change.
7273 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7274 SourceLocation DefaultLoc,
7275 SourceLocation RParenLoc,
7276 bool PredicateIsExpr,
7277 void *ControllingExprOrType,
7278 ArrayRef<TypeSourceInfo *> Types,
7279 ArrayRef<Expr *> Exprs);
7280
7281 // Binary/Unary Operators. 'Tok' is the token for the operator.
7282 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7283 Expr *InputExpr, bool IsAfterAmp = false);
7284 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7285 Expr *Input, bool IsAfterAmp = false);
7286
7287 /// Unary Operators. 'Tok' is the token for the operator.
7288 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7289 Expr *Input, bool IsAfterAmp = false);
7290
7291 /// Determine whether the given expression is a qualified member
7292 /// access expression, of a form that could be turned into a pointer to member
7293 /// with the address-of operator.
7294 bool isQualifiedMemberAccess(Expr *E);
7295 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7296 const Expr *Op,
7297 const CXXMethodDecl *MD);
7298
7299 /// CheckAddressOfOperand - The operand of & must be either a function
7300 /// designator or an lvalue designating an object. If it is an lvalue, the
7301 /// object cannot be declared with storage class register or be a bit field.
7302 /// Note: The usual conversions are *not* applied to the operand of the &
7303 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7304 /// In C++, the operand might be an overloaded function name, in which case
7305 /// we allow the '&' but retain the overloaded-function type.
7306 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7307
7308 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7309 /// _Alignas(type-name) .
7310 /// [dcl.align] An alignment-specifier of the form
7311 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7312 ///
7313 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7314 /// _Alignas(_Alignof(type-name)).
7315 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7316 SourceLocation OpLoc, SourceRange R);
7317 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7318 SourceLocation OpLoc, SourceRange R);
7319
7320 /// Build a sizeof or alignof expression given a type operand.
7321 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7322 SourceLocation OpLoc,
7323 UnaryExprOrTypeTrait ExprKind,
7324 SourceRange R);
7325
7326 /// Build a sizeof or alignof expression given an expression
7327 /// operand.
7328 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7329 UnaryExprOrTypeTrait ExprKind);
7330
7331 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7332 /// expr and the same for @c alignof and @c __alignof
7333 /// Note that the ArgRange is invalid if isType is false.
7334 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7335 UnaryExprOrTypeTrait ExprKind,
7336 bool IsType, void *TyOrEx,
7337 SourceRange ArgRange);
7338
7339 /// Check for operands with placeholder types and complain if found.
7340 /// Returns ExprError() if there was an error and no recovery was possible.
7342 bool CheckVecStepExpr(Expr *E);
7343
7344 /// Check the constraints on expression operands to unary type expression
7345 /// and type traits.
7346 ///
7347 /// Completes any types necessary and validates the constraints on the operand
7348 /// expression. The logic mostly mirrors the type-based overload, but may
7349 /// modify the expression as it completes the type for that expression through
7350 /// template instantiation, etc.
7352
7353 /// Check the constraints on operands to unary expression and type
7354 /// traits.
7355 ///
7356 /// This will complete any types necessary, and validate the various
7357 /// constraints on those operands.
7358 ///
7359 /// The UsualUnaryConversions() function is *not* called by this routine.
7360 /// C99 6.3.2.1p[2-4] all state:
7361 /// Except when it is the operand of the sizeof operator ...
7362 ///
7363 /// C++ [expr.sizeof]p4
7364 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7365 /// standard conversions are not applied to the operand of sizeof.
7366 ///
7367 /// This policy is followed for all of the unary trait expressions.
7368 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7369 SourceRange ExprRange,
7370 UnaryExprOrTypeTrait ExprKind,
7371 StringRef KWName);
7372
7373 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7374 tok::TokenKind Kind, Expr *Input);
7375
7376 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7377 MultiExprArg ArgExprs,
7378 SourceLocation RLoc);
7379 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7380 Expr *Idx, SourceLocation RLoc);
7381
7382 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7383 Expr *ColumnIdx,
7384 SourceLocation RBLoc);
7385
7386 /// ConvertArgumentsForCall - Converts the arguments specified in
7387 /// Args/NumArgs to the parameter types of the function FDecl with
7388 /// function prototype Proto. Call is the call expression itself, and
7389 /// Fn is the function expression. For a C++ member function, this
7390 /// routine does not attempt to convert the object argument. Returns
7391 /// true if the call is ill-formed.
7392 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7393 const FunctionProtoType *Proto,
7394 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7395 bool ExecConfig = false);
7396
7397 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7398 /// array parameter, check that it is non-null, and that if it is formed by
7399 /// array-to-pointer decay, the underlying array is sufficiently large.
7400 ///
7401 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7402 /// the array type derivation, then for each call to the function, the value
7403 /// of the corresponding actual argument shall provide access to the first
7404 /// element of an array with at least as many elements as specified by the
7405 /// size expression.
7406 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7407 const Expr *ArgExpr);
7408
7409 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7410 /// This provides the location of the left/right parens and a list of comma
7411 /// locations.
7412 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7413 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7414 Expr *ExecConfig = nullptr);
7415
7416 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7417 /// This provides the location of the left/right parens and a list of comma
7418 /// locations.
7419 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7420 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7421 Expr *ExecConfig = nullptr,
7422 bool IsExecConfig = false,
7423 bool AllowRecovery = false);
7424
7425 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7426 // with the specified CallArgs
7427 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7428 MultiExprArg CallArgs);
7429
7431
7432 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7433 /// i.e. an expression not of \p OverloadTy. The expression should
7434 /// unary-convert to an expression of function-pointer or
7435 /// block-pointer type.
7436 ///
7437 /// \param NDecl the declaration being called, if available
7439 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7440 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7441 Expr *Config = nullptr, bool IsExecConfig = false,
7442 ADLCallKind UsesADL = ADLCallKind::NotADL);
7443
7445 ParsedType &Ty, SourceLocation RParenLoc,
7446 Expr *CastExpr);
7447
7448 /// Prepares for a scalar cast, performing all the necessary stages
7449 /// except the final cast and returning the kind required.
7451
7452 /// Build an altivec or OpenCL literal.
7454 SourceLocation RParenLoc, Expr *E,
7455 TypeSourceInfo *TInfo);
7456
7457 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7458 /// the ParenListExpr into a sequence of comma binary operators.
7460
7462 SourceLocation RParenLoc, Expr *InitExpr);
7463
7465 TypeSourceInfo *TInfo,
7466 SourceLocation RParenLoc,
7467 Expr *LiteralExpr);
7468
7469 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7470 SourceLocation RBraceLoc);
7471
7472 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7473 SourceLocation RBraceLoc);
7474
7475 /// Binary Operators. 'Tok' is the token for the operator.
7477 Expr *LHSExpr, Expr *RHSExpr);
7479 Expr *LHSExpr, Expr *RHSExpr,
7480 bool ForFoldExpression = false);
7481
7482 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7483 /// operator @p Opc at location @c TokLoc. This routine only supports
7484 /// built-in operations; ActOnBinOp handles overloaded operators.
7486 Expr *LHSExpr, Expr *RHSExpr,
7487 bool ForFoldExpression = false);
7489 UnresolvedSetImpl &Functions);
7490
7491 /// Look for instances where it is likely the comma operator is confused with
7492 /// another operator. There is an explicit list of acceptable expressions for
7493 /// the left hand side of the comma operator, otherwise emit a warning.
7494 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7495
7496 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7497 /// in the case of a the GNU conditional expr extension.
7499 SourceLocation ColonLoc, Expr *CondExpr,
7500 Expr *LHSExpr, Expr *RHSExpr);
7501
7502 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7504 LabelDecl *TheDecl);
7505
7506 void ActOnStartStmtExpr();
7507 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7508 SourceLocation RPLoc);
7510 SourceLocation RPLoc, unsigned TemplateDepth);
7511 // Handle the final expression in a statement expression.
7513 void ActOnStmtExprError();
7514
7515 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7518 bool isBrackets; // true if [expr], false if .ident
7519 union {
7522 } U;
7523 };
7524
7525 /// __builtin_offsetof(type, a.b[123][456].c)
7527 TypeSourceInfo *TInfo,
7528 ArrayRef<OffsetOfComponent> Components,
7529 SourceLocation RParenLoc);
7532 ParsedType ParsedArgTy,
7533 ArrayRef<OffsetOfComponent> Components,
7534 SourceLocation RParenLoc);
7535
7536 // __builtin_choose_expr(constExpr, expr1, expr2)
7537 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7538 Expr *LHSExpr, Expr *RHSExpr,
7539 SourceLocation RPLoc);
7540
7541 // __builtin_va_arg(expr, type)
7543 SourceLocation RPLoc);
7545 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7546
7547 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7548 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7550 SourceLocation BuiltinLoc,
7551 SourceLocation RPLoc);
7552
7553 // #embed
7555 StringLiteral *BinaryData, StringRef FileName);
7556
7557 // Build a potentially resolved SourceLocExpr.
7559 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7560 DeclContext *ParentContext);
7561
7562 // __null
7564
7565 bool CheckCaseExpression(Expr *E);
7566
7567 //===------------------------- "Block" Extension ------------------------===//
7568
7569 /// ActOnBlockStart - This callback is invoked when a block literal is
7570 /// started.
7571 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7572
7573 /// ActOnBlockArguments - This callback allows processing of block arguments.
7574 /// If there are no arguments, this is still invoked.
7575 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7576 Scope *CurScope);
7577
7578 /// ActOnBlockError - If there is an error parsing a block, this callback
7579 /// is invoked to pop the information about the block from the action impl.
7580 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7581
7582 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7583 /// literal was successfully completed. ^(int x){...}
7585 Scope *CurScope);
7586
7587 //===---------------------------- Clang Extensions ----------------------===//
7588
7589 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7590 /// provided arguments.
7591 ///
7592 /// __builtin_convertvector( value, dst type )
7593 ///
7595 SourceLocation BuiltinLoc,
7596 SourceLocation RParenLoc);
7597
7598 //===---------------------------- OpenCL Features -----------------------===//
7599
7600 /// Parse a __builtin_astype expression.
7601 ///
7602 /// __builtin_astype( value, dst type )
7603 ///
7604 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7605 SourceLocation BuiltinLoc,
7606 SourceLocation RParenLoc);
7607
7608 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7610 SourceLocation BuiltinLoc,
7611 SourceLocation RParenLoc);
7612
7613 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7615 ArrayRef<Expr *> SubExprs,
7616 QualType T = QualType());
7617
7618 /// Cast a base object to a member's actual type.
7619 ///
7620 /// There are two relevant checks:
7621 ///
7622 /// C++ [class.access.base]p7:
7623 ///
7624 /// If a class member access operator [...] is used to access a non-static
7625 /// data member or non-static member function, the reference is ill-formed
7626 /// if the left operand [...] cannot be implicitly converted to a pointer to
7627 /// the naming class of the right operand.
7628 ///
7629 /// C++ [expr.ref]p7:
7630 ///
7631 /// If E2 is a non-static data member or a non-static member function, the
7632 /// program is ill-formed if the class of which E2 is directly a member is
7633 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7634 ///
7635 /// Note that the latter check does not consider access; the access of the
7636 /// "real" base class is checked as appropriate when checking the access of
7637 /// the member name.
7639 NestedNameSpecifier Qualifier,
7640 NamedDecl *FoundDecl,
7641 NamedDecl *Member);
7642
7643 /// CheckCallReturnType - Checks that a call expression's return type is
7644 /// complete. Returns true on failure. The location passed in is the location
7645 /// that best represents the call.
7646 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7647 CallExpr *CE, FunctionDecl *FD);
7648
7649 /// Emit a warning for all pending noderef expressions that we recorded.
7650 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7651
7653
7654 /// Instantiate or parse a C++ default argument expression as necessary.
7655 /// Return true on error.
7657 ParmVarDecl *Param, Expr *Init = nullptr,
7658 bool SkipImmediateInvocations = true);
7659
7660 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7661 /// the default expr if needed.
7663 ParmVarDecl *Param, Expr *Init = nullptr);
7664
7665 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7666 /// invocation.
7668
7670
7671 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7672 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7673
7674 /// Abstract base class used for diagnosing integer constant
7675 /// expression violations.
7677 public:
7679
7681
7682 virtual SemaDiagnosticBuilder
7683 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7685 SourceLocation Loc) = 0;
7688 };
7689
7690 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7691 /// and reports the appropriate diagnostics. Returns false on success.
7692 /// Can optionally return the value of the expression.
7695 VerifyICEDiagnoser &Diagnoser,
7699 unsigned DiagID,
7702 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7706 AllowFoldKind CanFold = AllowFoldKind::No) {
7707 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7708 }
7709
7710 /// DiagnoseAssignmentAsCondition - Given that an expression is
7711 /// being used as a boolean condition, warn if it's an assignment.
7713
7714 /// Redundant parentheses over an equality comparison can indicate
7715 /// that the user intended an assignment used as condition.
7717
7719 public:
7721 FullExprArg(Sema &actions) : E(nullptr) {}
7722
7723 ExprResult release() { return E; }
7724
7725 Expr *get() const { return E; }
7726
7727 Expr *operator->() { return E; }
7728
7729 private:
7730 // FIXME: No need to make the entire Sema class a friend when it's just
7731 // Sema::MakeFullExpr that needs access to the constructor below.
7732 friend class Sema;
7733
7734 explicit FullExprArg(Expr *expr) : E(expr) {}
7735
7736 Expr *E;
7737 };
7738
7740 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7741 }
7743 return FullExprArg(
7744 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7745 }
7747 ExprResult FE =
7748 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7749 /*DiscardedValue*/ true);
7750 return FullExprArg(FE.get());
7751 }
7752
7753 class ConditionResult {
7754 Decl *ConditionVar;
7755 ExprResult Condition;
7756 bool Invalid;
7757 std::optional<bool> KnownValue;
7758
7759 friend class Sema;
7760 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7761 bool IsConstexpr)
7762 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7763 if (IsConstexpr && Condition.get()) {
7764 if (std::optional<llvm::APSInt> Val =
7765 Condition.get()->getIntegerConstantExpr(S.Context)) {
7766 KnownValue = !!(*Val);
7767 }
7768 }
7769 }
7770 explicit ConditionResult(bool Invalid)
7771 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7772 KnownValue(std::nullopt) {}
7773
7774 public:
7775 ConditionResult() : ConditionResult(false) {}
7776 bool isInvalid() const { return Invalid; }
7777 std::pair<VarDecl *, Expr *> get() const {
7778 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7779 Condition.get());
7780 }
7781 std::optional<bool> getKnownValue() const { return KnownValue; }
7782 };
7784
7785 /// CheckBooleanCondition - Diagnose problems involving the use of
7786 /// the given expression as a boolean condition (e.g. in an if
7787 /// statement). Also performs the standard function and array
7788 /// decays, possibly changing the input variable.
7789 ///
7790 /// \param Loc - A location associated with the condition, e.g. the
7791 /// 'if' keyword.
7792 /// \return true iff there were any errors
7794 bool IsConstexpr = false);
7795
7796 enum class ConditionKind {
7797 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7798 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7799 Switch ///< An integral condition for a 'switch' statement.
7800 };
7801
7802 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7803 ConditionKind CK, bool MissingOK = false);
7804
7805 QualType CheckConditionalOperands( // C99 6.5.15
7807 ExprObjectKind &OK, SourceLocation QuestionLoc);
7808
7809 /// Emit a specialized diagnostic when one expression is a null pointer
7810 /// constant and the other is not a pointer. Returns true if a diagnostic is
7811 /// emitted.
7812 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7813 SourceLocation QuestionLoc);
7814
7815 /// type checking for vector binary operators.
7817 SourceLocation Loc, bool IsCompAssign,
7818 bool AllowBothBool, bool AllowBoolConversion,
7819 bool AllowBoolOperation, bool ReportInvalid);
7820
7821 /// Return a signed ext_vector_type that is of identical size and number of
7822 /// elements. For floating point vectors, return an integer type of identical
7823 /// size and number of elements. In the non ext_vector_type case, search from
7824 /// the largest type to the smallest type to avoid cases where long long ==
7825 /// long, where long gets picked over long long.
7828
7829 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7830 /// operates on extended vector types. Instead of producing an IntTy result,
7831 /// like a scalar comparison, a vector comparison produces a vector of integer
7832 /// types.
7834 SourceLocation Loc,
7835 BinaryOperatorKind Opc);
7837 SourceLocation Loc,
7838 BinaryOperatorKind Opc);
7840 SourceLocation Loc,
7841 BinaryOperatorKind Opc);
7842
7843 // type checking for sizeless vector binary operators.
7845 SourceLocation Loc, bool IsCompAssign,
7846 ArithConvKind OperationKind);
7847
7848 /// Type checking for matrix binary operators.
7850 SourceLocation Loc,
7851 bool IsCompAssign);
7853 SourceLocation Loc, bool IsCompAssign);
7854
7855 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7856 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7857 /// VLST) allowed?
7858 ///
7859 /// This will also return false if the two given types do not make sense from
7860 /// the perspective of SVE bitcasts.
7861 bool isValidSveBitcast(QualType srcType, QualType destType);
7862
7863 /// Are the two types matrix types and do they have the same dimensions i.e.
7864 /// do they have the same number of rows and the same number of columns?
7866
7867 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7868
7869 /// Are the two types lax-compatible vector types? That is, given
7870 /// that one of them is a vector, do they have equal storage sizes,
7871 /// where the storage size is the number of elements times the element
7872 /// size?
7873 ///
7874 /// This will also return false if either of the types is neither a
7875 /// vector nor a real type.
7876 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7877
7878 /// Is this a legal conversion between two types, one of which is
7879 /// known to be a vector type?
7880 bool isLaxVectorConversion(QualType srcType, QualType destType);
7881
7882 // This returns true if at least one of the types is an altivec vector.
7883 bool anyAltivecTypes(QualType srcType, QualType destType);
7884
7885 // type checking C++ declaration initializers (C++ [dcl.init]).
7886
7887 /// Check a cast of an unknown-any type. We intentionally only
7888 /// trigger this for C-style casts.
7891 ExprValueKind &VK, CXXCastPath &Path);
7892
7893 /// Force an expression with unknown-type to an expression of the
7894 /// given type.
7896
7897 /// Type-check an expression that's being passed to an
7898 /// __unknown_anytype parameter.
7900 QualType &paramType);
7901
7902 // CheckMatrixCast - Check type constraints for matrix casts.
7903 // We allow casting between matrixes of the same dimensions i.e. when they
7904 // have the same number of rows and column. Returns true if the cast is
7905 // invalid.
7906 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7907 CastKind &Kind);
7908
7909 // CheckVectorCast - check type constraints for vectors.
7910 // Since vectors are an extension, there are no C standard reference for this.
7911 // We allow casting between vectors and integer datatypes of the same size.
7912 // returns true if the cast is invalid
7913 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7914 CastKind &Kind);
7915
7916 /// Prepare `SplattedExpr` for a vector splat operation, adding
7917 /// implicit casts if necessary.
7918 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
7919
7920 // CheckExtVectorCast - check type constraints for extended vectors.
7921 // Since vectors are an extension, there are no C standard reference for this.
7922 // We allow casting between vectors and integer datatypes of the same size,
7923 // or vectors and the element type of that vector.
7924 // returns the cast expr
7926 CastKind &Kind);
7927
7929 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
7930 }
7931
7932 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
7933 // functions and arrays to their respective pointers (C99 6.3.2.1), and
7934 // promotes floating-piont types according to the language semantics.
7936
7937 // UsualUnaryFPConversions - promotes floating-point types according to the
7938 // current language semantics.
7940
7941 /// CallExprUnaryConversions - a special case of an unary conversion
7942 /// performed on a function designator of a call expression.
7944
7945 // DefaultFunctionArrayConversion - converts functions and arrays
7946 // to their respective pointers (C99 6.3.2.1).
7948
7949 // DefaultFunctionArrayLvalueConversion - converts functions and
7950 // arrays to their respective pointers and performs the
7951 // lvalue-to-rvalue conversion.
7953 bool Diagnose = true);
7954
7955 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
7956 // the operand. This function is a no-op if the operand has a function type
7957 // or an array type.
7959
7960 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
7961 // do not have a prototype. Integer promotions are performed on each
7962 // argument, and arguments that have type float are promoted to double.
7964
7966 const FunctionProtoType *Proto,
7967 Expr *Fn);
7968
7969 /// Determine the degree of POD-ness for an expression.
7970 /// Incomplete types are considered POD, since this check can be performed
7971 /// when we're in an unevaluated context.
7973
7974 /// Check to see if the given expression is a valid argument to a variadic
7975 /// function, issuing a diagnostic if not.
7976 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
7977
7978 /// GatherArgumentsForCall - Collector argument expressions for various
7979 /// form of call prototypes.
7981 SourceLocation CallLoc, FunctionDecl *FDecl,
7982 const FunctionProtoType *Proto, unsigned FirstParam,
7985 bool AllowExplicit = false, bool IsListInitialization = false);
7986
7987 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
7988 // will create a runtime trap if the resulting type is not a POD type.
7990 FunctionDecl *FDecl);
7991
7992 // Check that the usual arithmetic conversions can be performed on this pair
7993 // of expressions that might be of enumeration type.
7995 ArithConvKind ACK);
7996
7997 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
7998 // operands and then handles various conversions that are common to binary
7999 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8000 // routine returns the first non-arithmetic type found. The client is
8001 // responsible for emitting appropriate error diagnostics.
8003 SourceLocation Loc, ArithConvKind ACK);
8004
8006 switch (ConvTy) {
8007 default:
8008 return false;
8012 return true;
8013 }
8014 llvm_unreachable("impossible");
8015 }
8016
8017 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8018 /// assignment conversion type specified by ConvTy. This returns true if the
8019 /// conversion was invalid or false if the conversion was accepted.
8021 QualType DstType, QualType SrcType,
8022 Expr *SrcExpr, AssignmentAction Action,
8023 bool *Complained = nullptr);
8024
8025 /// CheckAssignmentConstraints - Perform type checking for assignment,
8026 /// argument passing, variable initialization, and function return values.
8027 /// C99 6.5.16.
8029 QualType LHSType,
8030 QualType RHSType);
8031
8032 /// Check assignment constraints and optionally prepare for a conversion of
8033 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8034 /// is true.
8036 ExprResult &RHS, CastKind &Kind,
8037 bool ConvertRHS = true);
8038
8039 /// Check assignment constraints for an assignment of RHS to LHSType.
8040 ///
8041 /// \param LHSType The destination type for the assignment.
8042 /// \param RHS The source expression for the assignment.
8043 /// \param Diagnose If \c true, diagnostics may be produced when checking
8044 /// for assignability. If a diagnostic is produced, \p RHS will be
8045 /// set to ExprError(). Note that this function may still return
8046 /// without producing a diagnostic, even for an invalid assignment.
8047 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8048 /// in an audited Core Foundation API and does not need to be checked
8049 /// for ARC retain issues.
8050 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8051 /// conversions necessary to perform the assignment. If \c false,
8052 /// \p Diagnose must also be \c false.
8054 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8055 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8056
8057 // If the lhs type is a transparent union, check whether we
8058 // can initialize the transparent union with the given expression.
8060 ExprResult &RHS);
8061
8062 /// the following "Check" methods will return a valid/converted QualType
8063 /// or a null QualType (indicating an error diagnostic was issued).
8064
8065 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8067 ExprResult &RHS);
8068
8069 /// Diagnose cases where a scalar was implicitly converted to a vector and
8070 /// diagnose the underlying types. Otherwise, diagnose the error
8071 /// as invalid vector logical operands for non-C++ cases.
8073 ExprResult &RHS);
8074
8076 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8077 BinaryOperatorKind Opc);
8078 QualType CheckRemainderOperands( // C99 6.5.5
8079 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8080 bool IsCompAssign = false);
8081 QualType CheckAdditionOperands( // C99 6.5.6
8082 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8083 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8085 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8086 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8087 QualType CheckShiftOperands( // C99 6.5.7
8088 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8089 BinaryOperatorKind Opc, bool IsCompAssign = false);
8091 QualType CheckCompareOperands( // C99 6.5.8/9
8092 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8093 BinaryOperatorKind Opc);
8094 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8095 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8096 BinaryOperatorKind Opc);
8097 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8098 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8099 BinaryOperatorKind Opc);
8100 // CheckAssignmentOperands is used for both simple and compound assignment.
8101 // For simple assignment, pass both expressions and a null converted type.
8102 // For compound assignment, pass both expressions and the converted type.
8103 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8104 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8105 BinaryOperatorKind Opc);
8106
8107 /// To be used for checking whether the arguments being passed to
8108 /// function exceeds the number of parameters expected for it.
8109 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8110 bool PartialOverloading = false) {
8111 // We check whether we're just after a comma in code-completion.
8112 if (NumArgs > 0 && PartialOverloading)
8113 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8114 return NumArgs > NumParams;
8115 }
8116
8117 /// Whether the AST is currently being rebuilt to correct immediate
8118 /// invocations. Immediate invocation candidates and references to consteval
8119 /// functions aren't tracked when this is set.
8121
8127
8128 /// Determines whether we are currently in a context that
8129 /// is not evaluated as per C++ [expr] p5.
8132 }
8133
8137
8141
8145
8152
8153 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8155 assert(!ExprEvalContexts.empty() &&
8156 "Must be in an expression evaluation context");
8157 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8159 Ctx.DelayedDefaultInitializationContext)
8160 return Ctx.DelayedDefaultInitializationContext;
8161 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8162 Ctx.isUnevaluated())
8163 break;
8164 }
8165 return std::nullopt;
8166 }
8167
8168 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8170 assert(!ExprEvalContexts.empty() &&
8171 "Must be in an expression evaluation context");
8172 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8173 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8175 !Ctx.DelayedDefaultInitializationContext && Res)
8176 break;
8177 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8178 Ctx.isUnevaluated())
8179 break;
8180 Res = Ctx.DelayedDefaultInitializationContext;
8181 }
8182 return Res;
8183 }
8184
8188
8189 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8190 /// SelfAssigned when inside a CXXMethodDecl.
8191 const FieldDecl *
8193
8195
8196 template <typename... Ts>
8198 const Ts &...Args) {
8199 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8200 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8201 }
8202
8203 template <typename... Ts>
8204 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8205 const Ts &...Args) {
8206 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8208 }
8209
8210 /// Abstract class used to diagnose incomplete types.
8213
8214 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8215 virtual ~TypeDiagnoser() {}
8216 };
8217
8218 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8219 protected:
8220 unsigned DiagID;
8221 std::tuple<const Ts &...> Args;
8222
8223 template <std::size_t... Is>
8225 std::index_sequence<Is...>) const {
8226 // Apply all tuple elements to the builder in order.
8227 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8228 (void)Dummy;
8229 }
8230
8231 public:
8232 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8233 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8234 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8235 }
8236
8237 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8238 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8239 emit(DB, std::index_sequence_for<Ts...>());
8240 DB << T;
8241 }
8242 };
8243
8244 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8245 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8246 /// For example, a diagnostic with no other parameters would generally have
8247 /// the form "...%select{incomplete|sizeless}0 type %1...".
8248 template <typename... Ts>
8250 public:
8251 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8252 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8253
8254 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8255 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8256 this->emit(DB, std::index_sequence_for<Ts...>());
8257 DB << T->isSizelessType() << T;
8258 }
8259 };
8260
8261 /// Check an argument list for placeholders that we won't try to
8262 /// handle later.
8264
8265 /// The C++ "std::source_location::__impl" struct, defined in
8266 /// <source_location>.
8268
8269 /// A stack of expression evaluation contexts.
8271
8272 // Set of failed immediate invocations to avoid double diagnosing.
8274
8275 /// List of SourceLocations where 'self' is implicitly retained inside a
8276 /// block.
8279
8280 /// Do an explicit extend of the given block pointer if we're in ARC.
8282
8283 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8286
8287private:
8288 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8289
8290 /// Methods for marking which expressions involve dereferencing a pointer
8291 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8292 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8293 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8294 /// `*p`, but need to check that `address of` is called on it. This requires
8295 /// keeping a container of all pending expressions and checking if the address
8296 /// of them are eventually taken.
8297 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8298 void CheckAddressOfNoDeref(const Expr *E);
8299
8300 ///@}
8301
8302 //
8303 //
8304 // -------------------------------------------------------------------------
8305 //
8306 //
8307
8308 /// \name C++ Expressions
8309 /// Implementations are in SemaExprCXX.cpp
8310 ///@{
8311
8312public:
8313 /// The C++ "std::bad_alloc" class, which is defined by the C++
8314 /// standard library.
8316
8317 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8318 /// standard library.
8320
8321 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8323
8324 /// A flag to remember whether the implicit forms of operator new and delete
8325 /// have been declared.
8327
8328 /// Delete-expressions to be analyzed at the end of translation unit
8329 ///
8330 /// This list contains class members, and locations of delete-expressions
8331 /// that could not be proven as to whether they mismatch with new-expression
8332 /// used in initializer of the field.
8333 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8334
8335 /// Handle the result of the special case name lookup for inheriting
8336 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8337 /// constructor names in member using declarations, even if 'X' is not the
8338 /// name of the corresponding type.
8340 SourceLocation NameLoc,
8341 const IdentifierInfo &Name);
8342
8344 SourceLocation NameLoc, Scope *S,
8345 CXXScopeSpec &SS, bool EnteringContext);
8347 Scope *S, CXXScopeSpec &SS,
8348 ParsedType ObjectType, bool EnteringContext);
8349
8351 ParsedType ObjectType);
8352
8353 /// Build a C++ typeid expression with a type operand.
8354 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8355 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8356
8357 /// Build a C++ typeid expression with an expression operand.
8358 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8359 Expr *Operand, SourceLocation RParenLoc);
8360
8361 /// ActOnCXXTypeid - Parse typeid( something ).
8363 bool isType, void *TyOrExpr,
8364 SourceLocation RParenLoc);
8365
8366 /// Build a Microsoft __uuidof expression with a type operand.
8367 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8368 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8369
8370 /// Build a Microsoft __uuidof expression with an expression operand.
8371 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8372 Expr *Operand, SourceLocation RParenLoc);
8373
8374 /// ActOnCXXUuidof - Parse __uuidof( something ).
8376 bool isType, void *TyOrExpr,
8377 SourceLocation RParenLoc);
8378
8379 //// ActOnCXXThis - Parse 'this' pointer.
8381
8382 /// Check whether the type of 'this' is valid in the current context.
8384
8385 /// Build a CXXThisExpr and mark it referenced in the current context.
8386 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8388
8389 /// Try to retrieve the type of the 'this' pointer.
8390 ///
8391 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8393
8394 /// When non-NULL, the C++ 'this' expression is allowed despite the
8395 /// current context not being a non-static member function. In such cases,
8396 /// this provides the type used for 'this'.
8398
8399 /// RAII object used to temporarily allow the C++ 'this' expression
8400 /// to be used, with the given qualifiers on the current class type.
8402 Sema &S;
8403 QualType OldCXXThisTypeOverride;
8404 bool Enabled;
8405
8406 public:
8407 /// Introduce a new scope where 'this' may be allowed (when enabled),
8408 /// using the given declaration (which is either a class template or a
8409 /// class) along with the given qualifiers.
8410 /// along with the qualifiers placed on '*this'.
8411 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8412 bool Enabled = true);
8413
8415 };
8416
8417 /// Make sure the value of 'this' is actually available in the current
8418 /// context, if it is a potentially evaluated context.
8419 ///
8420 /// \param Loc The location at which the capture of 'this' occurs.
8421 ///
8422 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8423 /// capture list.
8424 ///
8425 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8426 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8427 /// This is useful when enclosing lambdas must speculatively capture
8428 /// 'this' that may or may not be used in certain specializations of
8429 /// a nested generic lambda (depending on whether the name resolves to
8430 /// a non-static member function or a static function).
8431 /// \return returns 'true' if failed, 'false' if success.
8433 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8434 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8435 bool ByCopy = false);
8436
8437 /// Determine whether the given type is the type of *this that is used
8438 /// outside of the body of a member function for a type that is currently
8439 /// being defined.
8441
8442 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8444
8445 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8447
8448 //// ActOnCXXThrow - Parse throw expressions.
8451 bool IsThrownVarInScope);
8452
8453 /// CheckCXXThrowOperand - Validate the operand of a throw.
8454 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8455
8456 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8457 /// Can be interpreted either as function-style casting ("int(x)")
8458 /// or class type construction ("ClassType(x,y,z)")
8459 /// or creation of a value-initialized type ("int()").
8461 SourceLocation LParenOrBraceLoc,
8462 MultiExprArg Exprs,
8463 SourceLocation RParenOrBraceLoc,
8464 bool ListInitialization);
8465
8467 SourceLocation LParenLoc,
8468 MultiExprArg Exprs,
8469 SourceLocation RParenLoc,
8470 bool ListInitialization);
8471
8472 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8473 ///
8474 /// E.g.:
8475 /// @code new (memory) int[size][4] @endcode
8476 /// or
8477 /// @code ::new Foo(23, "hello") @endcode
8478 ///
8479 /// \param StartLoc The first location of the expression.
8480 /// \param UseGlobal True if 'new' was prefixed with '::'.
8481 /// \param PlacementLParen Opening paren of the placement arguments.
8482 /// \param PlacementArgs Placement new arguments.
8483 /// \param PlacementRParen Closing paren of the placement arguments.
8484 /// \param TypeIdParens If the type is in parens, the source range.
8485 /// \param D The type to be allocated, as well as array dimensions.
8486 /// \param Initializer The initializing expression or initializer-list, or
8487 /// null if there is none.
8488 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8489 SourceLocation PlacementLParen,
8490 MultiExprArg PlacementArgs,
8491 SourceLocation PlacementRParen,
8492 SourceRange TypeIdParens, Declarator &D,
8493 Expr *Initializer);
8495 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8496 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8497 SourceRange TypeIdParens, QualType AllocType,
8498 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8499 SourceRange DirectInitRange, Expr *Initializer);
8500
8501 /// Determine whether \p FD is an aligned allocation or deallocation
8502 /// function that is unavailable.
8504
8505 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8506 /// function that is unavailable.
8508 SourceLocation Loc);
8509
8510 /// Checks that a type is suitable as the allocated type
8511 /// in a new-expression.
8512 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8513 SourceRange R);
8514
8515 /// Finds the overloads of operator new and delete that are appropriate
8516 /// for the allocation.
8518 SourceLocation StartLoc, SourceRange Range,
8520 QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
8521 MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
8522 FunctionDecl *&OperatorDelete, bool Diagnose = true);
8523
8524 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8525 /// delete. These are:
8526 /// @code
8527 /// // C++03:
8528 /// void* operator new(std::size_t) throw(std::bad_alloc);
8529 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8530 /// void operator delete(void *) throw();
8531 /// void operator delete[](void *) throw();
8532 /// // C++11:
8533 /// void* operator new(std::size_t);
8534 /// void* operator new[](std::size_t);
8535 /// void operator delete(void *) noexcept;
8536 /// void operator delete[](void *) noexcept;
8537 /// // C++1y:
8538 /// void* operator new(std::size_t);
8539 /// void* operator new[](std::size_t);
8540 /// void operator delete(void *) noexcept;
8541 /// void operator delete[](void *) noexcept;
8542 /// void operator delete(void *, std::size_t) noexcept;
8543 /// void operator delete[](void *, std::size_t) noexcept;
8544 /// @endcode
8545 /// Note that the placement and nothrow forms of new are *not* implicitly
8546 /// declared. Their use requires including <new>.
8549 ArrayRef<QualType> Params);
8550
8552 DeclarationName Name, FunctionDecl *&Operator,
8554 bool Diagnose = true);
8557 DeclarationName Name,
8558 bool Diagnose = true);
8560 CXXRecordDecl *RD,
8561 bool Diagnose,
8562 bool LookForGlobal);
8563
8564 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8565 /// @code ::delete ptr; @endcode
8566 /// or
8567 /// @code delete [] ptr; @endcode
8568 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8569 bool ArrayForm, Expr *Operand);
8571 bool IsDelete, bool CallCanBeVirtual,
8572 bool WarnOnNonAbstractTypes,
8573 SourceLocation DtorLoc);
8574
8576 Expr *Operand, SourceLocation RParen);
8578 SourceLocation RParen);
8579
8581 SourceLocation OpLoc,
8582 tok::TokenKind OpKind,
8583 ParsedType &ObjectType,
8584 bool &MayBePseudoDestructor);
8585
8587 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8588 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8589 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8590
8592 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8593 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8594 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8595
8597 SourceLocation OpLoc,
8598 tok::TokenKind OpKind,
8599 SourceLocation TildeLoc,
8600 const DeclSpec &DS);
8601
8602 /// MaybeCreateExprWithCleanups - If the current full-expression
8603 /// requires any cleanups, surround it with a ExprWithCleanups node.
8604 /// Otherwise, just returns the passed-in expression.
8608
8609 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8610 return ActOnFinishFullExpr(
8611 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8612 }
8614 bool DiscardedValue, bool IsConstexpr = false,
8615 bool IsTemplateArgument = false);
8617
8618 /// Process the expression contained within a decltype. For such expressions,
8619 /// certain semantic checks on temporaries are delayed until this point, and
8620 /// are omitted for the 'topmost' call in the decltype expression. If the
8621 /// topmost call bound a temporary, strip that temporary off the expression.
8623
8624 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8625 bool IsUDSuffix);
8626
8628
8629 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8630 SourceLocation StmtLoc,
8631 ConditionKind CK);
8632
8633 /// Check the use of the given variable as a C++ condition in an if,
8634 /// while, do-while, or switch statement.
8636 SourceLocation StmtLoc, ConditionKind CK);
8637
8638 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8639 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8640
8641 /// Helper function to determine whether this is the (deprecated) C++
8642 /// conversion from a string literal to a pointer to non-const char or
8643 /// non-const wchar_t (for narrow and wide string literals,
8644 /// respectively).
8646
8647 /// PerformImplicitConversion - Perform an implicit conversion of the
8648 /// expression From to the type ToType using the pre-computed implicit
8649 /// conversion sequence ICS. Returns the converted
8650 /// expression. Action is the kind of conversion we're performing,
8651 /// used in the error message.
8653 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8654 AssignmentAction Action,
8656
8657 /// PerformImplicitConversion - Perform an implicit conversion of the
8658 /// expression From to the type ToType by following the standard
8659 /// conversion sequence SCS. Returns the converted
8660 /// expression. Flavor is the context in which we're performing this
8661 /// conversion, for use in error messages.
8663 const StandardConversionSequence &SCS,
8664 AssignmentAction Action,
8666
8667 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8668
8669 /// Parsed one of the type trait support pseudo-functions.
8672 SourceLocation RParenLoc);
8675 SourceLocation RParenLoc);
8676
8677 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8678 /// pseudo-functions.
8680 ParsedType LhsTy, Expr *DimExpr,
8681 SourceLocation RParen);
8682
8684 TypeSourceInfo *TSInfo, Expr *DimExpr,
8685 SourceLocation RParen);
8686
8687 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8688 /// pseudo-functions.
8690 Expr *Queried, SourceLocation RParen);
8691
8693 Expr *Queried, SourceLocation RParen);
8694
8697 bool isIndirect);
8699 ExprResult &RHS,
8700 SourceLocation QuestionLoc);
8701
8703 ExprResult &LHS, ExprResult &RHS,
8704 SourceLocation QuestionLoc);
8705
8706 //// Determines if a type is trivially relocatable
8707 /// according to the C++26 rules.
8708 // FIXME: This is in Sema because it requires
8709 // overload resolution, can we move to ASTContext?
8712
8713 //// Determines if a type is replaceable
8714 /// according to the C++26 rules.
8715 // FIXME: This is in Sema because it requires
8716 // overload resolution, can we move to ASTContext?
8718
8719 /// Check the operands of ?: under C++ semantics.
8720 ///
8721 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8722 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8723 ///
8724 /// This function also implements GCC's vector extension and the
8725 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8726 /// permit the use of a?b:c where the type of a is that of a integer vector
8727 /// with the same number of elements and size as the vectors of b and c. If
8728 /// one of either b or c is a scalar it is implicitly converted to match the
8729 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8730 /// c are scalars, then b and c are checked and converted to the type of a if
8731 /// possible.
8732 ///
8733 /// The expressions are evaluated differently for GCC's and OpenCL's
8734 /// extensions. For the GCC extension, the ?: operator is evaluated as
8735 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8736 /// For the OpenCL extensions, the ?: operator is evaluated as
8737 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8738 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8740 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8741 ExprObjectKind &OK, SourceLocation questionLoc);
8742
8743 /// Find a merged pointer type and convert the two expressions to it.
8744 ///
8745 /// This finds the composite pointer type for \p E1 and \p E2 according to
8746 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8747 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8748 /// ConvertArgs is \c true).
8749 ///
8750 /// \param Loc The location of the operator requiring these two expressions to
8751 /// be converted to the composite pointer type.
8752 ///
8753 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8754 /// type.
8756 bool ConvertArgs = true);
8758 ExprResult &E2, bool ConvertArgs = true) {
8759 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8760 QualType Composite =
8761 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8762 E1 = E1Tmp;
8763 E2 = E2Tmp;
8764 return Composite;
8765 }
8766
8767 /// MaybeBindToTemporary - If the passed in expression has a record type with
8768 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8769 /// it simply returns the passed in expression.
8771
8772 /// IgnoredValueConversions - Given that an expression's result is
8773 /// syntactically ignored, perform any conversions that are
8774 /// required.
8776
8778
8781 const DeclarationNameInfo &TargetNameInfo);
8782
8784 SourceLocation KeywordLoc,
8785 bool IsIfExists, CXXScopeSpec &SS,
8786 UnqualifiedId &Name);
8787
8790 ArrayRef<ParmVarDecl *> LocalParameters,
8791 Scope *BodyScope);
8795 CXXScopeSpec &SS,
8796 SourceLocation NameLoc,
8797 const IdentifierInfo *TypeName,
8798 TemplateIdAnnotation *TemplateId);
8800 SourceLocation NoexceptLoc);
8802 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8803 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8806 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8810 bool IsSatisfied, SourceLocation NoexceptLoc,
8817 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8818 const ASTConstraintSatisfaction &Satisfaction);
8821 SourceLocation LParenLoc,
8822 ArrayRef<ParmVarDecl *> LocalParameters,
8823 SourceLocation RParenLoc,
8825 SourceLocation ClosingBraceLoc);
8826
8827private:
8828 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8829 bool IsDelete);
8830
8831 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8832 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8833 bool DeleteWasArrayForm);
8834
8835 ///@}
8836
8837 //
8838 //
8839 // -------------------------------------------------------------------------
8840 //
8841 //
8842
8843 /// \name Member Access Expressions
8844 /// Implementations are in SemaExprMember.cpp
8845 ///@{
8846
8847public:
8848 /// Check whether an expression might be an implicit class member access.
8850 bool IsAddressOfOperand);
8851
8852 /// Builds an expression which might be an implicit member expression.
8854 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8855 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8856
8857 /// Builds an implicit member access expression. The current context
8858 /// is known to be an instance method, and the given unqualified lookup
8859 /// set is known to contain only instance members, at least one of which
8860 /// is from an appropriate type.
8862 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8863 LookupResult &R,
8864 const TemplateArgumentListInfo *TemplateArgs,
8865 bool IsDefiniteInstance, const Scope *S);
8866
8868 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8869 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8870 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8871 const TemplateArgumentListInfo *TemplateArgs);
8872
8873 /// The main callback when the parser finds something like
8874 /// expression . [nested-name-specifier] identifier
8875 /// expression -> [nested-name-specifier] identifier
8876 /// where 'identifier' encompasses a fairly broad spectrum of
8877 /// possibilities, including destructor and operator references.
8878 ///
8879 /// \param OpKind either tok::arrow or tok::period
8880 /// \param ObjCImpDecl the current Objective-C \@implementation
8881 /// decl; this is an ugly hack around the fact that Objective-C
8882 /// \@implementations aren't properly put in the context chain
8884 tok::TokenKind OpKind, CXXScopeSpec &SS,
8885 SourceLocation TemplateKWLoc,
8886 UnqualifiedId &Member, Decl *ObjCImpDecl);
8887
8888 MemberExpr *
8889 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8890 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8891 ValueDecl *Member, DeclAccessPair FoundDecl,
8892 bool HadMultipleCandidates,
8893 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8895 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8896
8897 // Check whether the declarations we found through a nested-name
8898 // specifier in a member expression are actually members of the base
8899 // type. The restriction here is:
8900 //
8901 // C++ [expr.ref]p2:
8902 // ... In these cases, the id-expression shall name a
8903 // member of the class or of one of its base classes.
8904 //
8905 // So it's perfectly legitimate for the nested-name specifier to name
8906 // an unrelated class, and for us to find an overload set including
8907 // decls from classes which are not superclasses, as long as the decl
8908 // we actually pick through overload resolution is from a superclass.
8909 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
8910 const CXXScopeSpec &SS,
8911 const LookupResult &R);
8912
8913 // This struct is for use by ActOnMemberAccess to allow
8914 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
8915 // changing the access operator from a '.' to a '->' (to see if that is the
8916 // change needed to fix an error about an unknown member, e.g. when the class
8917 // defines a custom operator->).
8923
8925 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
8926 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8927 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8928 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
8929 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8930
8933 bool IsArrow, const CXXScopeSpec &SS,
8934 SourceLocation TemplateKWLoc,
8935 NamedDecl *FirstQualifierInScope, LookupResult &R,
8936 const TemplateArgumentListInfo *TemplateArgs,
8937 const Scope *S, bool SuppressQualifierCheck = false,
8938 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8939
8940 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
8941 SourceLocation OpLoc,
8942 const CXXScopeSpec &SS, FieldDecl *Field,
8943 DeclAccessPair FoundDecl,
8944 const DeclarationNameInfo &MemberNameInfo);
8945
8946 /// Perform conversions on the LHS of a member access expression.
8948
8950 const CXXScopeSpec &SS, SourceLocation nameLoc,
8951 IndirectFieldDecl *indirectField,
8952 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
8953 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
8954
8955private:
8956 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
8957
8958 ///@}
8959
8960 //
8961 //
8962 // -------------------------------------------------------------------------
8963 //
8964 //
8965
8966 /// \name Initializers
8967 /// Implementations are in SemaInit.cpp
8968 ///@{
8969
8970public:
8971 /// Stack of types that correspond to the parameter entities that are
8972 /// currently being copy-initialized. Can be empty.
8974
8975 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
8977
8978 bool IsStringInit(Expr *Init, const ArrayType *AT);
8979
8980 /// Determine whether we can perform aggregate initialization for the purposes
8981 /// of overload resolution.
8983 const InitializedEntity &Entity, InitListExpr *From);
8984
8986 SourceLocation EqualOrColonLoc,
8987 bool GNUSyntax, ExprResult Init);
8988
8989 /// Check that the lifetime of the initializer (and its subobjects) is
8990 /// sufficient for initializing the entity, and perform lifetime extension
8991 /// (when permitted) if not.
8993
8996 bool BoundToLvalueReference);
8997
8998 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
8999 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9000 /// we don't have xvalues there.
9002
9006
9010 SourceLocation EqualLoc, ExprResult Init,
9011 bool TopLevelOfInitList = false,
9012 bool AllowExplicit = false);
9013
9015 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9016 const InitializationKind &Kind, MultiExprArg Init);
9017
9018 ///@}
9019
9020 //
9021 //
9022 // -------------------------------------------------------------------------
9023 //
9024 //
9025
9026 /// \name C++ Lambda Expressions
9027 /// Implementations are in SemaLambda.cpp
9028 ///@{
9029
9030public:
9031 /// Create a new lambda closure type.
9033 TypeSourceInfo *Info,
9034 unsigned LambdaDependencyKind,
9035 LambdaCaptureDefault CaptureDefault);
9036
9037 /// Number lambda for linkage purposes if necessary.
9039 std::optional<CXXRecordDecl::LambdaNumbering>
9040 NumberingOverride = std::nullopt);
9041
9042 /// Endow the lambda scope info with the relevant properties.
9043 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9044 SourceRange IntroducerRange,
9045 LambdaCaptureDefault CaptureDefault,
9046 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9047 bool Mutable);
9048
9051
9053 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9054 TemplateParameterList *TemplateParams);
9055
9056 void
9058 SourceLocation CallOperatorLoc,
9059 const AssociatedConstraint &TrailingRequiresClause,
9060 TypeSourceInfo *MethodTyInfo,
9061 ConstexprSpecKind ConstexprKind, StorageClass SC,
9063 bool HasExplicitResultType);
9064
9065 /// Returns true if the explicit object parameter was invalid.
9067 SourceLocation CallLoc);
9068
9069 /// Perform initialization analysis of the init-capture and perform
9070 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9071 /// not being used to initialize a reference.
9073 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9074 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9076 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9078 }
9080 SourceLocation EllipsisLoc,
9081 UnsignedOrNone NumExpansions,
9082 IdentifierInfo *Id,
9083 bool DirectInit, Expr *&Init);
9084
9085 /// Create a dummy variable within the declcontext of the lambda's
9086 /// call operator, for name lookup purposes for a lambda init capture.
9087 ///
9088 /// CodeGen handles emission of lambda captures, ignoring these dummy
9089 /// variables appropriately.
9091 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9092 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9093
9094 /// Add an init-capture to a lambda scope.
9095 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9096
9097 /// Note that we have finished the explicit captures for the
9098 /// given lambda.
9100
9101 /// Deduce a block or lambda's return type based on the return
9102 /// statements present in the body.
9104
9105 /// Once the Lambdas capture are known, we can start to create the closure,
9106 /// call operator method, and keep track of the captures.
9107 /// We do the capture lookup here, but they are not actually captured until
9108 /// after we know what the qualifiers of the call operator are.
9110 Scope *CurContext);
9111
9112 /// This is called after parsing the explicit template parameter list
9113 /// on a lambda (if it exists) in C++2a.
9115 SourceLocation LAngleLoc,
9116 ArrayRef<NamedDecl *> TParams,
9117 SourceLocation RAngleLoc,
9118 ExprResult RequiresClause);
9119
9121 SourceLocation MutableLoc);
9122
9124 Scope *LambdaScope,
9126
9127 /// ActOnStartOfLambdaDefinition - This is called just before we start
9128 /// parsing the body of a lambda; it analyzes the explicit captures and
9129 /// arguments, and sets up various data-structures for the body of the
9130 /// lambda.
9132 Declarator &ParamInfo, const DeclSpec &DS);
9133
9134 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9135 /// is invoked to pop the information about the lambda.
9136 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9137 bool IsInstantiation = false);
9138
9139 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9140 /// was successfully completed.
9142
9143 /// Does copying/destroying the captured variable have side effects?
9144 bool CaptureHasSideEffects(const sema::Capture &From);
9145
9146 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9147 /// diagnostic is emitted.
9148 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9149 SourceRange FixItRange,
9150 const sema::Capture &From);
9151
9152 /// Build a FieldDecl suitable to hold the given capture.
9154
9155 /// Initialize the given capture with a suitable expression.
9157 SourceLocation ImplicitCaptureLoc,
9158 bool IsOpenMPMapping = false);
9159
9160 /// Complete a lambda-expression having processed and attached the
9161 /// lambda body.
9163
9164 /// Get the return type to use for a lambda's conversion function(s) to
9165 /// function pointer type, given the type of the call operator.
9166 QualType
9168 CallingConv CC);
9169
9171 SourceLocation ConvLocation,
9172 CXXConversionDecl *Conv, Expr *Src);
9173
9175 : private FunctionScopeRAII {
9176 public:
9178 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9180 bool ShouldAddDeclsFromParentScope = true);
9181 };
9182
9183 /// Compute the mangling number context for a lambda expression or
9184 /// block literal. Also return the extra mangling decl if any.
9185 ///
9186 /// \param DC - The DeclContext containing the lambda expression or
9187 /// block literal.
9188 std::tuple<MangleNumberingContext *, Decl *>
9190
9191 ///@}
9192
9193 //
9194 //
9195 // -------------------------------------------------------------------------
9196 //
9197 //
9198
9199 /// \name Name Lookup
9200 ///
9201 /// These routines provide name lookup that is used during semantic
9202 /// analysis to resolve the various kinds of names (identifiers,
9203 /// overloaded operator names, constructor names, etc.) into zero or
9204 /// more declarations within a particular scope. The major entry
9205 /// points are LookupName, which performs unqualified name lookup,
9206 /// and LookupQualifiedName, which performs qualified name lookup.
9207 ///
9208 /// All name lookup is performed based on some specific criteria,
9209 /// which specify what names will be visible to name lookup and how
9210 /// far name lookup should work. These criteria are important both
9211 /// for capturing language semantics (certain lookups will ignore
9212 /// certain names, for example) and for performance, since name
9213 /// lookup is often a bottleneck in the compilation of C++. Name
9214 /// lookup criteria is specified via the LookupCriteria enumeration.
9215 ///
9216 /// The results of name lookup can vary based on the kind of name
9217 /// lookup performed, the current language, and the translation
9218 /// unit. In C, for example, name lookup will either return nothing
9219 /// (no entity found) or a single declaration. In C++, name lookup
9220 /// can additionally refer to a set of overloaded functions or
9221 /// result in an ambiguity. All of the possible results of name
9222 /// lookup are captured by the LookupResult class, which provides
9223 /// the ability to distinguish among them.
9224 ///
9225 /// Implementations are in SemaLookup.cpp
9226 ///@{
9227
9228public:
9229 /// Tracks whether we are in a context where typo correction is
9230 /// disabled.
9232
9233 /// The number of typos corrected by CorrectTypo.
9235
9236 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9237 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9238
9239 /// A cache containing identifiers for which typo correction failed and
9240 /// their locations, so that repeated attempts to correct an identifier in a
9241 /// given location are ignored if typo correction already failed for it.
9243
9244 /// SpecialMemberOverloadResult - The overloading result for a special member
9245 /// function.
9246 ///
9247 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9248 /// integer are used to determine whether overload resolution succeeded.
9250 public:
9252
9253 private:
9254 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9255
9256 public:
9259 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9260
9261 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9262 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9263
9264 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9265 void setKind(Kind K) { Pair.setInt(K); }
9266 };
9267
9268 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
9270 public:
9271 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
9272 : FastFoldingSetNode(ID) {}
9273 };
9274
9275 /// A cache of special member function overload resolution results
9276 /// for C++ records.
9277 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
9278
9280
9281 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9282 // TODO: make this is a typesafe union.
9285
9286 /// Describes the kind of name lookup to perform.
9288 /// Ordinary name lookup, which finds ordinary names (functions,
9289 /// variables, typedefs, etc.) in C and most kinds of names
9290 /// (functions, variables, members, types, etc.) in C++.
9292 /// Tag name lookup, which finds the names of enums, classes,
9293 /// structs, and unions.
9295 /// Label name lookup.
9297 /// Member name lookup, which finds the names of
9298 /// class/struct/union members.
9300 /// Look up of an operator name (e.g., operator+) for use with
9301 /// operator overloading. This lookup is similar to ordinary name
9302 /// lookup, but will ignore any declarations that are class members.
9304 /// Look up a name following ~ in a destructor name. This is an ordinary
9305 /// lookup, but prefers tags to typedefs.
9307 /// Look up of a name that precedes the '::' scope resolution
9308 /// operator in C++. This lookup completely ignores operator, object,
9309 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9311 /// Look up a namespace name within a C++ using directive or
9312 /// namespace alias definition, ignoring non-namespace names (C++
9313 /// [basic.lookup.udir]p1).
9315 /// Look up all declarations in a scope with the given name,
9316 /// including resolved using declarations. This is appropriate
9317 /// for checking redeclarations for a using declaration.
9319 /// Look up an ordinary name that is going to be redeclared as a
9320 /// name with linkage. This lookup ignores any declarations that
9321 /// are outside of the current scope unless they have linkage. See
9322 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9324 /// Look up a friend of a local class. This lookup does not look
9325 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9327 /// Look up the name of an Objective-C protocol.
9329 /// Look up implicit 'self' parameter of an objective-c method.
9331 /// Look up the name of an OpenMP user-defined reduction operation.
9333 /// Look up the name of an OpenMP user-defined mapper.
9335 /// Look up any declaration with any name.
9337 };
9338
9339 /// The possible outcomes of name lookup for a literal operator.
9341 /// The lookup resulted in an error.
9343 /// The lookup found no match but no diagnostic was issued.
9345 /// The lookup found a single 'cooked' literal operator, which
9346 /// expects a normal literal to be built and passed to it.
9348 /// The lookup found a single 'raw' literal operator, which expects
9349 /// a string literal containing the spelling of the literal token.
9351 /// The lookup found an overload set of literal operator templates,
9352 /// which expect the characters of the spelling of the literal token to be
9353 /// passed as a non-type template argument pack.
9355 /// The lookup found an overload set of literal operator templates,
9356 /// which expect the character type and characters of the spelling of the
9357 /// string literal token to be passed as template arguments.
9359 };
9360
9361 SpecialMemberOverloadResult
9363 bool VolatileArg, bool RValueThis, bool ConstThis,
9364 bool VolatileThis);
9365
9367
9368 /// Look up a name, looking for a single declaration. Return
9369 /// null if the results were absent, ambiguous, or overloaded.
9370 ///
9371 /// It is preferable to use the elaborated form and explicitly handle
9372 /// ambiguity and overloaded.
9374 Scope *S, DeclarationName Name, SourceLocation Loc,
9375 LookupNameKind NameKind,
9377
9378 /// Lookup a builtin function, when name lookup would otherwise
9379 /// fail.
9380 bool LookupBuiltin(LookupResult &R);
9381 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9382
9383 /// Perform unqualified name lookup starting from a given
9384 /// scope.
9385 ///
9386 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9387 /// used to find names within the current scope. For example, 'x' in
9388 /// @code
9389 /// int x;
9390 /// int f() {
9391 /// return x; // unqualified name look finds 'x' in the global scope
9392 /// }
9393 /// @endcode
9394 ///
9395 /// Different lookup criteria can find different names. For example, a
9396 /// particular scope can have both a struct and a function of the same
9397 /// name, and each can be found by certain lookup criteria. For more
9398 /// information about lookup criteria, see the documentation for the
9399 /// class LookupCriteria.
9400 ///
9401 /// @param S The scope from which unqualified name lookup will
9402 /// begin. If the lookup criteria permits, name lookup may also search
9403 /// in the parent scopes.
9404 ///
9405 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9406 /// look up and the lookup kind), and is updated with the results of lookup
9407 /// including zero or more declarations and possibly additional information
9408 /// used to diagnose ambiguities.
9409 ///
9410 /// @returns \c true if lookup succeeded and false otherwise.
9411 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9412 bool ForceNoCPlusPlus = false);
9413
9414 /// Perform qualified name lookup into a given context.
9415 ///
9416 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9417 /// names when the context of those names is explicit specified, e.g.,
9418 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9419 ///
9420 /// Different lookup criteria can find different names. For example, a
9421 /// particular scope can have both a struct and a function of the same
9422 /// name, and each can be found by certain lookup criteria. For more
9423 /// information about lookup criteria, see the documentation for the
9424 /// class LookupCriteria.
9425 ///
9426 /// \param R captures both the lookup criteria and any lookup results found.
9427 ///
9428 /// \param LookupCtx The context in which qualified name lookup will
9429 /// search. If the lookup criteria permits, name lookup may also search
9430 /// in the parent contexts or (for C++ classes) base classes.
9431 ///
9432 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9433 /// occurs as part of unqualified name lookup.
9434 ///
9435 /// \returns true if lookup succeeded, false if it failed.
9436 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9437 bool InUnqualifiedLookup = false);
9438
9439 /// Performs qualified name lookup or special type of lookup for
9440 /// "__super::" scope specifier.
9441 ///
9442 /// This routine is a convenience overload meant to be called from contexts
9443 /// that need to perform a qualified name lookup with an optional C++ scope
9444 /// specifier that might require special kind of lookup.
9445 ///
9446 /// \param R captures both the lookup criteria and any lookup results found.
9447 ///
9448 /// \param LookupCtx The context in which qualified name lookup will
9449 /// search.
9450 ///
9451 /// \param SS An optional C++ scope-specifier.
9452 ///
9453 /// \returns true if lookup succeeded, false if it failed.
9454 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9455 CXXScopeSpec &SS);
9456
9457 /// Performs name lookup for a name that was parsed in the
9458 /// source code, and may contain a C++ scope specifier.
9459 ///
9460 /// This routine is a convenience routine meant to be called from
9461 /// contexts that receive a name and an optional C++ scope specifier
9462 /// (e.g., "N::M::x"). It will then perform either qualified or
9463 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9464 /// respectively) on the given name and return those results. It will
9465 /// perform a special type of lookup for "__super::" scope specifier.
9466 ///
9467 /// @param S The scope from which unqualified name lookup will
9468 /// begin.
9469 ///
9470 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9471 ///
9472 /// @param EnteringContext Indicates whether we are going to enter the
9473 /// context of the scope-specifier SS (if present).
9474 ///
9475 /// @returns True if any decls were found (but possibly ambiguous)
9477 QualType ObjectType, bool AllowBuiltinCreation = false,
9478 bool EnteringContext = false);
9479
9480 /// Perform qualified name lookup into all base classes of the given
9481 /// class.
9482 ///
9483 /// \param R captures both the lookup criteria and any lookup results found.
9484 ///
9485 /// \param Class The context in which qualified name lookup will
9486 /// search. Name lookup will search in all base classes merging the results.
9487 ///
9488 /// @returns True if any decls were found (but possibly ambiguous)
9490
9492 UnresolvedSetImpl &Functions);
9493
9494 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9495 /// If GnuLabelLoc is a valid source location, then this is a definition
9496 /// of an __label__ label name, otherwise it is a normal label definition
9497 /// or use.
9499 SourceLocation GnuLabelLoc = SourceLocation());
9500
9501 /// Perform a name lookup for a label with the specified name; this does not
9502 /// create a new label if the lookup fails.
9504
9505 /// Look up the constructors for the given class.
9507
9508 /// Look up the default constructor for the given class.
9510
9511 /// Look up the copying constructor for the given class.
9513 unsigned Quals);
9514
9515 /// Look up the copying assignment operator for the given class.
9517 bool RValueThis, unsigned ThisQuals);
9518
9519 /// Look up the moving constructor for the given class.
9521 unsigned Quals);
9522
9523 /// Look up the moving assignment operator for the given class.
9525 bool RValueThis, unsigned ThisQuals);
9526
9527 /// Look for the destructor of the given class.
9528 ///
9529 /// During semantic analysis, this routine should be used in lieu of
9530 /// CXXRecordDecl::getDestructor().
9531 ///
9532 /// \returns The destructor for this class.
9534
9535 /// Force the declaration of any implicitly-declared members of this
9536 /// class.
9538
9539 /// Make a merged definition of an existing hidden definition \p ND
9540 /// visible at the specified location.
9542
9543 /// Check ODR hashes for C/ObjC when merging types from modules.
9544 /// Differently from C++, actually parse the body and reject in case
9545 /// of a mismatch.
9546 template <typename T,
9547 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9549 if (Duplicate->getODRHash() != Previous->getODRHash())
9550 return false;
9551
9552 // Make the previous decl visible.
9554 return true;
9555 }
9556
9557 /// Get the set of additional modules that should be checked during
9558 /// name lookup. A module and its imports become visible when instanting a
9559 /// template defined within it.
9560 llvm::DenseSet<Module *> &getLookupModules();
9561
9562 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9564
9565 /// Determine if the template parameter \p D has a visible default argument.
9566 bool
9568 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9569 /// Determine if the template parameter \p D has a reachable default argument.
9571 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9572 /// Determine if the template parameter \p D has a reachable default argument.
9576
9577 /// Determine if there is a visible declaration of \p D that is an explicit
9578 /// specialization declaration for a specialization of a template. (For a
9579 /// member specialization, use hasVisibleMemberSpecialization.)
9581 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9582 /// Determine if there is a reachable declaration of \p D that is an explicit
9583 /// specialization declaration for a specialization of a template. (For a
9584 /// member specialization, use hasReachableMemberSpecialization.)
9586 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9587
9588 /// Determine if there is a visible declaration of \p D that is a member
9589 /// specialization declaration (as opposed to an instantiated declaration).
9591 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9592 /// Determine if there is a reachable declaration of \p D that is a member
9593 /// specialization declaration (as opposed to an instantiated declaration).
9595 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9596
9597 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9598
9599 /// Determine whether any declaration of an entity is visible.
9600 bool
9602 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9603 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9604 }
9605
9608 /// Determine whether any declaration of an entity is reachable.
9609 bool
9611 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9612 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9613 }
9615 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9616
9617 void diagnoseTypo(const TypoCorrection &Correction,
9618 const PartialDiagnostic &TypoDiag,
9619 bool ErrorRecovery = true);
9620
9621 /// Diagnose a successfully-corrected typo. Separated from the correction
9622 /// itself to allow external validation of the result, etc.
9623 ///
9624 /// \param Correction The result of performing typo correction.
9625 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9626 /// string added to it (and usually also a fixit).
9627 /// \param PrevNote A note to use when indicating the location of the entity
9628 /// to which we are correcting. Will have the correction string added
9629 /// to it.
9630 /// \param ErrorRecovery If \c true (the default), the caller is going to
9631 /// recover from the typo as if the corrected string had been typed.
9632 /// In this case, \c PDiag must be an error, and we will attach a fixit
9633 /// to it.
9634 void diagnoseTypo(const TypoCorrection &Correction,
9635 const PartialDiagnostic &TypoDiag,
9636 const PartialDiagnostic &PrevNote,
9637 bool ErrorRecovery = true);
9638
9639 /// Find the associated classes and namespaces for
9640 /// argument-dependent lookup for a call with the given set of
9641 /// arguments.
9642 ///
9643 /// This routine computes the sets of associated classes and associated
9644 /// namespaces searched by argument-dependent lookup
9645 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9647 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9648 AssociatedNamespaceSet &AssociatedNamespaces,
9649 AssociatedClassSet &AssociatedClasses);
9650
9651 /// Produce a diagnostic describing the ambiguity that resulted
9652 /// from name lookup.
9653 ///
9654 /// \param Result The result of the ambiguous lookup to be diagnosed.
9656
9657 /// LookupLiteralOperator - Determine which literal operator should be used
9658 /// for a user-defined literal, per C++11 [lex.ext].
9659 ///
9660 /// Normal overload resolution is not used to select which literal operator to
9661 /// call for a user-defined literal. Look up the provided literal operator
9662 /// name, and filter the results to the appropriate set for the given argument
9663 /// types.
9666 bool AllowRaw, bool AllowTemplate,
9667 bool AllowStringTemplate, bool DiagnoseMissing,
9668 StringLiteral *StringLit = nullptr);
9669
9671 ArrayRef<Expr *> Args, ADLResult &Functions);
9672
9673 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9675 bool IncludeGlobalScope = true,
9676 bool LoadExternal = true);
9677 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9679 bool IncludeGlobalScope = true,
9680 bool IncludeDependentBases = false,
9681 bool LoadExternal = true);
9682
9683 /// Try to "correct" a typo in the source code by finding
9684 /// visible declarations whose names are similar to the name that was
9685 /// present in the source code.
9686 ///
9687 /// \param TypoName the \c DeclarationNameInfo structure that contains
9688 /// the name that was present in the source code along with its location.
9689 ///
9690 /// \param LookupKind the name-lookup criteria used to search for the name.
9691 ///
9692 /// \param S the scope in which name lookup occurs.
9693 ///
9694 /// \param SS the nested-name-specifier that precedes the name we're
9695 /// looking for, if present.
9696 ///
9697 /// \param CCC A CorrectionCandidateCallback object that provides further
9698 /// validation of typo correction candidates. It also provides flags for
9699 /// determining the set of keywords permitted.
9700 ///
9701 /// \param MemberContext if non-NULL, the context in which to look for
9702 /// a member access expression.
9703 ///
9704 /// \param EnteringContext whether we're entering the context described by
9705 /// the nested-name-specifier SS.
9706 ///
9707 /// \param OPT when non-NULL, the search for visible declarations will
9708 /// also walk the protocols in the qualified interfaces of \p OPT.
9709 ///
9710 /// \returns a \c TypoCorrection containing the corrected name if the typo
9711 /// along with information such as the \c NamedDecl where the corrected name
9712 /// was declared, and any additional \c NestedNameSpecifier needed to access
9713 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9715 Sema::LookupNameKind LookupKind, Scope *S,
9717 CorrectTypoKind Mode,
9718 DeclContext *MemberContext = nullptr,
9719 bool EnteringContext = false,
9720 const ObjCObjectPointerType *OPT = nullptr,
9721 bool RecordFailure = true);
9722
9723 /// Kinds of missing import. Note, the values of these enumerators correspond
9724 /// to %select values in diagnostics.
9732
9733 /// Diagnose that the specified declaration needs to be visible but
9734 /// isn't, and suggest a module import that would resolve the problem.
9736 MissingImportKind MIK, bool Recover = true);
9738 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9739 MissingImportKind MIK, bool Recover);
9740
9741 /// Called on #pragma clang __debug dump II
9743
9744 /// Called on #pragma clang __debug dump E
9745 void ActOnPragmaDump(Expr *E);
9746
9747private:
9748 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9749 //
9750 // The boolean value will be true to indicate that the namespace was loaded
9751 // from an AST/PCH file, or false otherwise.
9752 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9753
9754 /// Whether we have already loaded known namespaces from an extenal
9755 /// source.
9756 bool LoadedExternalKnownNamespaces;
9757
9758 bool CppLookupName(LookupResult &R, Scope *S);
9759
9760 /// Determine if we could use all the declarations in the module.
9761 bool isUsableModule(const Module *M);
9762
9763 /// Helper for CorrectTypo used to create and populate a new
9764 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9765 /// skipped entirely.
9766 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9767 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9769 DeclContext *MemberContext, bool EnteringContext,
9770 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9771
9772 /// Cache for module units which is usable for current module.
9773 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9774
9775 /// Record the typo correction failure and return an empty correction.
9776 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9777 bool RecordFailure = true) {
9778 if (RecordFailure)
9779 TypoCorrectionFailures[Typo].insert(TypoLoc);
9780 return TypoCorrection();
9781 }
9782
9783 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9784
9785 /// Determine whether two declarations should be linked together, given that
9786 /// the old declaration might not be visible and the new declaration might
9787 /// not have external linkage.
9788 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9789 const NamedDecl *New) {
9790 if (isVisible(Old))
9791 return true;
9792 // See comment in below overload for why it's safe to compute the linkage
9793 // of the new declaration here.
9794 if (New->isExternallyDeclarable()) {
9795 assert(Old->isExternallyDeclarable() &&
9796 "should not have found a non-externally-declarable previous decl");
9797 return true;
9798 }
9799 return false;
9800 }
9801 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9802
9803 ///@}
9804
9805 //
9806 //
9807 // -------------------------------------------------------------------------
9808 //
9809 //
9810
9811 /// \name Modules
9812 /// Implementations are in SemaModule.cpp
9813 ///@{
9814
9815public:
9816 /// Get the module unit whose scope we are currently within.
9818 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9819 }
9820
9821 /// Is the module scope we are an implementation unit?
9823 return ModuleScopes.empty()
9824 ? false
9825 : ModuleScopes.back().Module->isModuleImplementation();
9826 }
9827
9828 // When loading a non-modular PCH files, this is used to restore module
9829 // visibility.
9831 VisibleModules.setVisible(Mod, ImportLoc);
9832 }
9833
9834 enum class ModuleDeclKind {
9835 Interface, ///< 'export module X;'
9836 Implementation, ///< 'module X;'
9837 PartitionInterface, ///< 'export module X:Y;'
9838 PartitionImplementation, ///< 'module X:Y;'
9839 };
9840
9841 /// An enumeration to represent the transition of states in parsing module
9842 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9843 /// an error in state transition, the state is set to NotACXX20Module.
9845 FirstDecl, ///< Parsing the first decl in a TU.
9846 GlobalFragment, ///< after 'module;' but before 'module X;'
9847 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9848 ImportFinished, ///< after any non-import decl.
9849 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9850 ///< non-import decl.
9851 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9852 ///< non-import decl has already been seen.
9853 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9854 };
9855
9856 /// The parser has processed a module-declaration that begins the definition
9857 /// of a module interface or implementation.
9859 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9860 ModuleIdPath Path, ModuleIdPath Partition,
9861 ModuleImportState &ImportState,
9862 bool SeenNoTrivialPPDirective);
9863
9864 /// The parser has processed a global-module-fragment declaration that begins
9865 /// the definition of the global module fragment of the current module unit.
9866 /// \param ModuleLoc The location of the 'module' keyword.
9868
9869 /// The parser has processed a private-module-fragment declaration that begins
9870 /// the definition of the private module fragment of the current module unit.
9871 /// \param ModuleLoc The location of the 'module' keyword.
9872 /// \param PrivateLoc The location of the 'private' keyword.
9874 SourceLocation PrivateLoc);
9875
9876 /// The parser has processed a module import declaration.
9877 ///
9878 /// \param StartLoc The location of the first token in the declaration. This
9879 /// could be the location of an '@', 'export', or 'import'.
9880 /// \param ExportLoc The location of the 'export' keyword, if any.
9881 /// \param ImportLoc The location of the 'import' keyword.
9882 /// \param Path The module toplevel name as an access path.
9883 /// \param IsPartition If the name is for a partition.
9885 SourceLocation ExportLoc,
9886 SourceLocation ImportLoc, ModuleIdPath Path,
9887 bool IsPartition = false);
9889 SourceLocation ExportLoc,
9890 SourceLocation ImportLoc, Module *M,
9891 ModuleIdPath Path = {});
9892
9893 /// The parser has processed a module import translated from a
9894 /// #include or similar preprocessing directive.
9895 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9896 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9897
9898 /// The parsed has entered a submodule.
9899 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9900 /// The parser has left a submodule.
9901 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9902
9903 /// Create an implicit import of the given module at the given
9904 /// source location, for error recovery, if possible.
9905 ///
9906 /// This routine is typically used when an entity found by name lookup
9907 /// is actually hidden within a module that we know about but the user
9908 /// has forgotten to import.
9909 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
9910 Module *Mod);
9911
9912 /// We have parsed the start of an export declaration, including the '{'
9913 /// (if present).
9914 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
9915 SourceLocation LBraceLoc);
9916
9917 /// Complete the definition of an export declaration.
9918 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
9919 SourceLocation RBraceLoc);
9920
9921private:
9922 /// The parser has begun a translation unit to be compiled as a C++20
9923 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
9924 void HandleStartOfHeaderUnit();
9925
9926 struct ModuleScope {
9927 SourceLocation BeginLoc;
9928 clang::Module *Module = nullptr;
9929 VisibleModuleSet OuterVisibleModules;
9930 };
9931 /// The modules we're currently parsing.
9932 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
9933
9934 /// For an interface unit, this is the implicitly imported interface unit.
9935 clang::Module *ThePrimaryInterface = nullptr;
9936
9937 /// The explicit global module fragment of the current translation unit.
9938 /// The explicit Global Module Fragment, as specified in C++
9939 /// [module.global.frag].
9940 clang::Module *TheGlobalModuleFragment = nullptr;
9941
9942 /// The implicit global module fragments of the current translation unit.
9943 ///
9944 /// The contents in the implicit global module fragment can't be discarded.
9945 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
9946
9947 /// Namespace definitions that we will export when they finish.
9948 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
9949
9950 /// In a C++ standard module, inline declarations require a definition to be
9951 /// present at the end of a definition domain. This set holds the decls to
9952 /// be checked at the end of the TU.
9953 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
9954
9955 /// Helper function to judge if we are in module purview.
9956 /// Return false if we are not in a module.
9957 bool isCurrentModulePurview() const;
9958
9959 /// Enter the scope of the explicit global module fragment.
9960 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
9961 /// Leave the scope of the explicit global module fragment.
9962 void PopGlobalModuleFragment();
9963
9964 /// Enter the scope of an implicit global module fragment.
9965 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
9966 /// Leave the scope of an implicit global module fragment.
9967 void PopImplicitGlobalModuleFragment();
9968
9969 VisibleModuleSet VisibleModules;
9970
9971 /// Whether we had imported any named modules.
9972 bool HadImportedNamedModules = false;
9973 /// The set of instantiations we need to check if they references TU-local
9974 /// entity from TUs. This only makes sense if we imported any named modules.
9975 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
9976 PendingCheckReferenceForTULocal;
9977 /// Implement [basic.link]p18, which requires that we can't use TU-local
9978 /// entities from other TUs (ignoring header units).
9979 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
9980 SourceLocation PointOfInstantiation);
9981 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
9982 /// module interface or module partition.
9983 void checkExposure(const TranslationUnitDecl *TU);
9984
9985 ///@}
9986
9987 //
9988 //
9989 // -------------------------------------------------------------------------
9990 //
9991 //
9992
9993 /// \name C++ Overloading
9994 /// Implementations are in SemaOverload.cpp
9995 ///@{
9996
9997public:
9998 /// Whether deferrable diagnostics should be deferred.
9999 bool DeferDiags = false;
10000
10001 /// RAII class to control scope of DeferDiags.
10003 Sema &S;
10004 bool SavedDeferDiags = false;
10005
10006 public:
10008 : S(S), SavedDeferDiags(S.DeferDiags) {
10009 S.DeferDiags = DeferDiags;
10010 }
10011 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10012 };
10013
10014 /// Flag indicating if Sema is building a recovery call expression.
10015 ///
10016 /// This flag is used to avoid building recovery call expressions
10017 /// if Sema is already doing so, which would cause infinite recursions.
10019
10020 /// Determine whether the given New declaration is an overload of the
10021 /// declarations in Old. This routine returns OverloadKind::Match or
10022 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10023 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10024 /// Old declarations aren't functions (or function templates) at all. When it
10025 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10026 /// will point to the decl that New cannot be overloaded with. This decl may
10027 /// be a UsingShadowDecl on top of the underlying declaration.
10028 ///
10029 /// Example: Given the following input:
10030 ///
10031 /// void f(int, float); // #1
10032 /// void f(int, int); // #2
10033 /// int f(int, int); // #3
10034 ///
10035 /// When we process #1, there is no previous declaration of "f", so IsOverload
10036 /// will not be used.
10037 ///
10038 /// When we process #2, Old contains only the FunctionDecl for #1. By
10039 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10040 /// they have different signatures), so this routine returns
10041 /// OverloadKind::Overload; MatchedDecl is unchanged.
10042 ///
10043 /// When we process #3, Old is an overload set containing #1 and #2. We
10044 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10045 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10046 /// types of functions are not part of the signature), IsOverload returns
10047 /// OverloadKind::Match and MatchedDecl will be set to point to the
10048 /// FunctionDecl for #2.
10049 ///
10050 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10051 /// class by a using declaration. The rules for whether to hide shadow
10052 /// declarations ignore some properties which otherwise figure into a function
10053 /// template's signature.
10055 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10056 bool UseMemberUsingDeclRules);
10058 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10059
10060 // Checks whether MD constitutes an override the base class method BaseMD.
10061 // When checking for overrides, the object object members are ignored.
10062 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10063 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10064
10065 enum class AllowedExplicit {
10066 /// Allow no explicit functions to be used.
10068 /// Allow explicit conversion functions but not explicit constructors.
10070 /// Allow both explicit conversion functions and explicit constructors.
10072 };
10073
10075 Expr *From, QualType ToType, bool SuppressUserConversions,
10076 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10077 bool AllowObjCWritebackConversion);
10078
10079 /// PerformImplicitConversion - Perform an implicit conversion of the
10080 /// expression From to the type ToType. Returns the
10081 /// converted expression. Flavor is the kind of conversion we're
10082 /// performing, used in the error message. If @p AllowExplicit,
10083 /// explicit user-defined conversions are permitted.
10085 AssignmentAction Action,
10086 bool AllowExplicit = false);
10087
10088 /// IsIntegralPromotion - Determines whether the conversion from the
10089 /// expression From (whose potentially-adjusted type is FromType) to
10090 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10091 /// sets PromotedType to the promoted type.
10092 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10093
10094 /// IsFloatingPointPromotion - Determines whether the conversion from
10095 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10096 /// returns true and sets PromotedType to the promoted type.
10097 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10098
10099 /// Determine if a conversion is a complex promotion.
10100 ///
10101 /// A complex promotion is defined as a complex -> complex conversion
10102 /// where the conversion between the underlying real types is a
10103 /// floating-point or integral promotion.
10104 bool IsComplexPromotion(QualType FromType, QualType ToType);
10105
10106 /// IsPointerConversion - Determines whether the conversion of the
10107 /// expression From, which has the (possibly adjusted) type FromType,
10108 /// can be converted to the type ToType via a pointer conversion (C++
10109 /// 4.10). If so, returns true and places the converted type (that
10110 /// might differ from ToType in its cv-qualifiers at some level) into
10111 /// ConvertedType.
10112 ///
10113 /// This routine also supports conversions to and from block pointers
10114 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10115 /// pointers to interfaces. FIXME: Once we've determined the
10116 /// appropriate overloading rules for Objective-C, we may want to
10117 /// split the Objective-C checks into a different routine; however,
10118 /// GCC seems to consider all of these conversions to be pointer
10119 /// conversions, so for now they live here. IncompatibleObjC will be
10120 /// set if the conversion is an allowed Objective-C conversion that
10121 /// should result in a warning.
10122 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10123 bool InOverloadResolution, QualType &ConvertedType,
10124 bool &IncompatibleObjC);
10125
10126 /// isObjCPointerConversion - Determines whether this is an
10127 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10128 /// with the same arguments and return values.
10129 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10130 QualType &ConvertedType, bool &IncompatibleObjC);
10131 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10132 QualType &ConvertedType);
10133
10134 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10135 /// for equality of their parameter types. Caller has already checked that
10136 /// they have same number of parameters. If the parameters are different,
10137 /// ArgPos will have the parameter index of the first different parameter.
10138 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10139 /// reverse order. That's useful if one of the functions is being used as a
10140 /// C++20 synthesized operator overload with a reversed parameter order.
10143 unsigned *ArgPos = nullptr,
10144 bool Reversed = false);
10145
10147 const FunctionProtoType *NewType,
10148 unsigned *ArgPos = nullptr,
10149 bool Reversed = false);
10150
10151 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10152 const FunctionDecl *NewFunction,
10153 unsigned *ArgPos = nullptr,
10154 bool Reversed = false);
10155
10156 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10157 /// function types. Catches different number of parameter, mismatch in
10158 /// parameter types, and different return types.
10160 QualType ToType);
10161
10162 /// CheckPointerConversion - Check the pointer conversion from the
10163 /// expression From to the type ToType. This routine checks for
10164 /// ambiguous or inaccessible derived-to-base pointer
10165 /// conversions for which IsPointerConversion has already returned
10166 /// true. It returns true and produces a diagnostic if there was an
10167 /// error, or returns false otherwise.
10168 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10169 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10170 bool Diagnose = true);
10171
10172 /// IsMemberPointerConversion - Determines whether the conversion of the
10173 /// expression From, which has the (possibly adjusted) type FromType, can be
10174 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10175 /// If so, returns true and places the converted type (that might differ from
10176 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10177 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10178 bool InOverloadResolution,
10179 QualType &ConvertedType);
10180
10190 /// CheckMemberPointerConversion - Check the member pointer conversion from
10191 /// the expression From to the type ToType. This routine checks for ambiguous
10192 /// or virtual or inaccessible base-to-derived member pointer conversions for
10193 /// which IsMemberPointerConversion has already returned true. It produces a
10194 // diagnostic if there was an error.
10196 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10197 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10198 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10199
10200 /// IsQualificationConversion - Determines whether the conversion from
10201 /// an rvalue of type FromType to ToType is a qualification conversion
10202 /// (C++ 4.4).
10203 ///
10204 /// \param ObjCLifetimeConversion Output parameter that will be set to
10205 /// indicate when the qualification conversion involves a change in the
10206 /// Objective-C object lifetime.
10207 bool IsQualificationConversion(QualType FromType, QualType ToType,
10208 bool CStyle, bool &ObjCLifetimeConversion);
10209
10210 /// Determine whether the conversion from FromType to ToType is a valid
10211 /// conversion that strips "noexcept" or "noreturn" or "cfi_unchecked_callee"
10212 /// off the nested function type. This also checks if "cfi_unchecked_callee"
10213 /// was added to the function type. If "cfi_unchecked_callee" is added and
10214 /// `AddingCFIUncheckedCallee` is provided, it will be set to true. The same
10215 /// thing applies for `DiscardingCFIUncheckedCallee` if the attribute is
10216 /// discarded.
10217 bool IsFunctionConversion(QualType FromType, QualType ToType,
10218 bool *DiscardingCFIUncheckedCallee = nullptr,
10219 bool *AddingCFIUncheckedCallee = nullptr) const;
10220
10221 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10222 /// `ResultTy` to `ToType`.
10223 bool TryFunctionConversion(QualType FromType, QualType ToType,
10224 QualType &ResultTy) const;
10225
10228 DeclarationName Name,
10229 OverloadCandidateSet &CandidateSet,
10230 FunctionDecl *Fn, MultiExprArg Args,
10231 bool IsMember = false);
10232
10234 FunctionDecl *Fun);
10236 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10238
10239 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10240 /// of the expression From to bool (C++0x [conv]p3).
10242
10243 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10244 /// conversion of the expression From to an Objective-C pointer type.
10245 /// Returns a valid but null ExprResult if no conversion sequence exists.
10247
10249 CCEKind CCE,
10250 NamedDecl *Dest = nullptr);
10251
10253 llvm::APSInt &Value, CCEKind CCE);
10255 APValue &Value, CCEKind CCE,
10256 NamedDecl *Dest = nullptr);
10257
10258 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10259 /// That is a converted constant expression
10260 /// (which was built with BuildConvertedConstantExpression)
10263 CCEKind CCE, bool RequireInt,
10264 const APValue &PreNarrowingValue);
10265
10266 /// Abstract base class used to perform a contextual implicit
10267 /// conversion from an expression to any type passing a filter.
10269 public:
10272
10276
10277 /// Determine whether the specified type is a valid destination type
10278 /// for this conversion.
10279 virtual bool match(QualType T) = 0;
10280
10281 /// Emits a diagnostic complaining that the expression does not have
10282 /// integral or enumeration type.
10284 QualType T) = 0;
10285
10286 /// Emits a diagnostic when the expression has incomplete class type.
10287 virtual SemaDiagnosticBuilder
10289
10290 /// Emits a diagnostic when the only matching conversion function
10291 /// is explicit.
10293 SourceLocation Loc,
10294 QualType T,
10295 QualType ConvTy) = 0;
10296
10297 /// Emits a note for the explicit conversion function.
10298 virtual SemaDiagnosticBuilder
10300
10301 /// Emits a diagnostic when there are multiple possible conversion
10302 /// functions.
10304 QualType T) = 0;
10305
10306 /// Emits a note for one of the candidate conversions.
10307 virtual SemaDiagnosticBuilder
10309
10310 /// Emits a diagnostic when we picked a conversion function
10311 /// (for cases when we are not allowed to pick a conversion function).
10313 SourceLocation Loc,
10314 QualType T,
10315 QualType ConvTy) = 0;
10316
10318 };
10319
10321 bool AllowScopedEnumerations;
10322
10323 public:
10324 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10325 bool SuppressConversion)
10327 AllowScopedEnumerations(AllowScopedEnumerations) {}
10328
10329 /// Match an integral or (possibly scoped) enumeration type.
10330 bool match(QualType T) override;
10331
10333 QualType T) override {
10334 return diagnoseNotInt(S, Loc, T);
10335 }
10336
10337 /// Emits a diagnostic complaining that the expression does not have
10338 /// integral or enumeration type.
10340 QualType T) = 0;
10341 };
10342
10343 /// Perform a contextual implicit conversion.
10346 ContextualImplicitConverter &Converter);
10347
10348 /// ReferenceCompareResult - Expresses the result of comparing two
10349 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10350 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10352 /// Ref_Incompatible - The two types are incompatible, so direct
10353 /// reference binding is not possible.
10355 /// Ref_Related - The two types are reference-related, which means
10356 /// that their unqualified forms (T1 and T2) are either the same
10357 /// or T1 is a base class of T2.
10359 /// Ref_Compatible - The two types are reference-compatible.
10361 };
10362
10363 // Fake up a scoped enumeration that still contextually converts to bool.
10365 /// The conversions that would be performed on an lvalue of type T2 when
10366 /// binding a reference of type T1 to it, as determined when evaluating
10367 /// whether T1 is reference-compatible with T2.
10378 };
10380
10381 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10382 /// determine whether they are reference-compatible,
10383 /// reference-related, or incompatible, for use in C++ initialization by
10384 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10385 /// type, and the first type (T1) is the pointee type of the reference
10386 /// type being initialized.
10389 ReferenceConversions *Conv = nullptr);
10390
10391 /// AddOverloadCandidate - Adds the given function to the set of
10392 /// candidate functions, using the given function call arguments. If
10393 /// @p SuppressUserConversions, then don't allow user-defined
10394 /// conversions via constructors or conversion operators.
10395 ///
10396 /// \param PartialOverloading true if we are performing "partial" overloading
10397 /// based on an incomplete set of function arguments. This feature is used by
10398 /// code completion.
10401 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10402 bool PartialOverloading = false, bool AllowExplicit = true,
10403 bool AllowExplicitConversion = false,
10404 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10405 ConversionSequenceList EarlyConversions = {},
10407 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10408
10409 /// Add all of the function declarations in the given function set to
10410 /// the overload candidate set.
10412 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10413 OverloadCandidateSet &CandidateSet,
10414 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10415 bool SuppressUserConversions = false, bool PartialOverloading = false,
10416 bool FirstArgumentIsBase = false);
10417
10418 /// AddMethodCandidate - Adds a named decl (which is some kind of
10419 /// method) as a method candidate to the given overload set.
10420 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10421 Expr::Classification ObjectClassification,
10422 ArrayRef<Expr *> Args,
10423 OverloadCandidateSet &CandidateSet,
10424 bool SuppressUserConversion = false,
10425 OverloadCandidateParamOrder PO = {});
10426
10427 /// AddMethodCandidate - Adds the given C++ member function to the set
10428 /// of candidate functions, using the given function call arguments
10429 /// and the object argument (@c Object). For example, in a call
10430 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10431 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10432 /// allow user-defined conversions via constructors or conversion
10433 /// operators.
10434 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10435 CXXRecordDecl *ActingContext, QualType ObjectType,
10436 Expr::Classification ObjectClassification,
10437 ArrayRef<Expr *> Args,
10438 OverloadCandidateSet &CandidateSet,
10439 bool SuppressUserConversions = false,
10440 bool PartialOverloading = false,
10441 ConversionSequenceList EarlyConversions = {},
10443 bool StrictPackMatch = false);
10444
10445 /// Add a C++ member function template as a candidate to the candidate
10446 /// set, using template argument deduction to produce an appropriate member
10447 /// function template specialization.
10449 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10450 CXXRecordDecl *ActingContext,
10451 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10452 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10453 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10454 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10455
10456 /// Add a C++ function template specialization as a candidate
10457 /// in the candidate set, using template argument deduction to produce
10458 /// an appropriate function template specialization.
10460 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10461 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10462 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10463 bool PartialOverloading = false, bool AllowExplicit = true,
10464 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10466 bool AggregateCandidateDeduction = false);
10467
10469 /// Do not consider any user-defined conversions when constructing the
10470 /// initializing sequence.
10472
10473 /// Before constructing the initializing sequence, we check whether the
10474 /// parameter type and argument type contain any user defined conversions.
10475 /// If so, do not initialize them. This effectively bypasses some undesired
10476 /// instantiation before checking constaints, which might otherwise result
10477 /// in non-SFINAE errors e.g. recursive constraints.
10479
10486 };
10487
10488 /// Check that implicit conversion sequences can be formed for each argument
10489 /// whose corresponding parameter has a non-dependent type, per DR1391's
10490 /// [temp.deduct.call]p10.
10493 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10495 CheckNonDependentConversionsFlag UserConversionFlag,
10496 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10497 Expr::Classification ObjectClassification = {},
10498 OverloadCandidateParamOrder PO = {});
10499
10500 /// AddConversionCandidate - Add a C++ conversion function as a
10501 /// candidate in the candidate set (C++ [over.match.conv],
10502 /// C++ [over.match.copy]). From is the expression we're converting from,
10503 /// and ToType is the type that we're eventually trying to convert to
10504 /// (which may or may not be the same type as the type that the
10505 /// conversion function produces).
10507 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10508 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10509 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10510 bool AllowExplicit, bool AllowResultConversion = true,
10511 bool StrictPackMatch = false);
10512
10513 /// Adds a conversion function template specialization
10514 /// candidate to the overload set, using template argument deduction
10515 /// to deduce the template arguments of the conversion function
10516 /// template from the type that we are converting to (C++
10517 /// [temp.deduct.conv]).
10519 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10520 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10521 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10522 bool AllowExplicit, bool AllowResultConversion = true);
10523
10524 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10525 /// converts the given @c Object to a function pointer via the
10526 /// conversion function @c Conversion, and then attempts to call it
10527 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10528 /// the type of function that we'll eventually be calling.
10529 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10530 DeclAccessPair FoundDecl,
10531 CXXRecordDecl *ActingContext,
10532 const FunctionProtoType *Proto, Expr *Object,
10533 ArrayRef<Expr *> Args,
10534 OverloadCandidateSet &CandidateSet);
10535
10536 /// Add all of the non-member operator function declarations in the given
10537 /// function set to the overload candidate set.
10539 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10540 OverloadCandidateSet &CandidateSet,
10541 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10542
10543 /// Add overload candidates for overloaded operators that are
10544 /// member functions.
10545 ///
10546 /// Add the overloaded operator candidates that are member functions
10547 /// for the operator Op that was used in an operator expression such
10548 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10549 /// CandidateSet will store the added overload candidates. (C++
10550 /// [over.match.oper]).
10552 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10553 OverloadCandidateSet &CandidateSet,
10555
10556 /// AddBuiltinCandidate - Add a candidate for a built-in
10557 /// operator. ResultTy and ParamTys are the result and parameter types
10558 /// of the built-in candidate, respectively. Args and NumArgs are the
10559 /// arguments being passed to the candidate. IsAssignmentOperator
10560 /// should be true when this built-in candidate is an assignment
10561 /// operator. NumContextualBoolArguments is the number of arguments
10562 /// (at the beginning of the argument list) that will be contextually
10563 /// converted to bool.
10564 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10565 OverloadCandidateSet &CandidateSet,
10566 bool IsAssignmentOperator = false,
10567 unsigned NumContextualBoolArguments = 0);
10568
10569 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10570 /// operator overloads to the candidate set (C++ [over.built]), based
10571 /// on the operator @p Op and the arguments given. For example, if the
10572 /// operator is a binary '+', this routine might add "int
10573 /// operator+(int, int)" to cover integer addition.
10575 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10576 OverloadCandidateSet &CandidateSet);
10577
10578 /// Add function candidates found via argument-dependent lookup
10579 /// to the set of overloading candidates.
10580 ///
10581 /// This routine performs argument-dependent name lookup based on the
10582 /// given function name (which may also be an operator name) and adds
10583 /// all of the overload candidates found by ADL to the overload
10584 /// candidate set (C++ [basic.lookup.argdep]).
10586 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10587 TemplateArgumentListInfo *ExplicitTemplateArgs,
10588 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10589
10590 /// Check the enable_if expressions on the given function. Returns the first
10591 /// failing attribute, or NULL if they were all successful.
10592 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10593 ArrayRef<Expr *> Args,
10594 bool MissingImplicitThis = false);
10595
10596 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10597 /// non-ArgDependent DiagnoseIfAttrs.
10598 ///
10599 /// Argument-dependent diagnose_if attributes should be checked each time a
10600 /// function is used as a direct callee of a function call.
10601 ///
10602 /// Returns true if any errors were emitted.
10603 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10604 const Expr *ThisArg,
10605 ArrayRef<const Expr *> Args,
10606 SourceLocation Loc);
10607
10608 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10609 /// ArgDependent DiagnoseIfAttrs.
10610 ///
10611 /// Argument-independent diagnose_if attributes should be checked on every use
10612 /// of a function.
10613 ///
10614 /// Returns true if any errors were emitted.
10615 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10616 SourceLocation Loc);
10617
10618 /// Determine if \p A and \p B are equivalent internal linkage declarations
10619 /// from different modules, and thus an ambiguity error can be downgraded to
10620 /// an extension warning.
10621 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10622 const NamedDecl *B);
10624 SourceLocation Loc, const NamedDecl *D,
10625 ArrayRef<const NamedDecl *> Equiv);
10626
10627 // Emit as a 'note' the specific overload candidate
10629 const NamedDecl *Found, const FunctionDecl *Fn,
10631 QualType DestType = QualType(), bool TakingAddress = false);
10632
10633 // Emit as a series of 'note's all template and non-templates identified by
10634 // the expression Expr
10635 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10636 bool TakingAddress = false);
10637
10638 /// Returns whether the given function's address can be taken or not,
10639 /// optionally emitting a diagnostic if the address can't be taken.
10640 ///
10641 /// Returns false if taking the address of the function is illegal.
10642 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10643 bool Complain = false,
10644 SourceLocation Loc = SourceLocation());
10645
10646 // [PossiblyAFunctionType] --> [Return]
10647 // NonFunctionType --> NonFunctionType
10648 // R (A) --> R(A)
10649 // R (*)(A) --> R (A)
10650 // R (&)(A) --> R (A)
10651 // R (S::*)(A) --> R (A)
10652 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10653
10654 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10655 /// an overloaded function (C++ [over.over]), where @p From is an
10656 /// expression with overloaded function type and @p ToType is the type
10657 /// we're trying to resolve to. For example:
10658 ///
10659 /// @code
10660 /// int f(double);
10661 /// int f(int);
10662 ///
10663 /// int (*pfd)(double) = f; // selects f(double)
10664 /// @endcode
10665 ///
10666 /// This routine returns the resulting FunctionDecl if it could be
10667 /// resolved, and NULL otherwise. When @p Complain is true, this
10668 /// routine will emit diagnostics if there is an error.
10669 FunctionDecl *
10670 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10671 bool Complain, DeclAccessPair &Found,
10672 bool *pHadMultipleCandidates = nullptr);
10673
10674 /// Given an expression that refers to an overloaded function, try to
10675 /// resolve that function to a single function that can have its address
10676 /// taken. This will modify `Pair` iff it returns non-null.
10677 ///
10678 /// This routine can only succeed if from all of the candidates in the
10679 /// overload set for SrcExpr that can have their addresses taken, there is one
10680 /// candidate that is more constrained than the rest.
10681 FunctionDecl *
10682 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10683
10684 /// Given an overloaded function, tries to turn it into a non-overloaded
10685 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10686 /// will perform access checks, diagnose the use of the resultant decl, and,
10687 /// if requested, potentially perform a function-to-pointer decay.
10688 ///
10689 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10690 /// Otherwise, returns true. This may emit diagnostics and return true.
10692 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10693
10694 /// Given an expression that refers to an overloaded function, try to
10695 /// resolve that overloaded function expression down to a single function.
10696 ///
10697 /// This routine can only resolve template-ids that refer to a single function
10698 /// template, where that template-id refers to a single template whose
10699 /// template arguments are either provided by the template-id or have
10700 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10701 ///
10702 /// If no template-ids are found, no diagnostics are emitted and NULL is
10703 /// returned.
10705 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10706 TemplateSpecCandidateSet *FailedTSC = nullptr,
10707 bool ForTypeDeduction = false);
10708
10709 // Resolve and fix an overloaded expression that can be resolved
10710 // because it identifies a single function template specialization.
10711 //
10712 // Last three arguments should only be supplied if Complain = true
10713 //
10714 // Return true if it was logically possible to so resolve the
10715 // expression, regardless of whether or not it succeeded. Always
10716 // returns true if 'complain' is set.
10718 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10719 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10720 QualType DestTypeForComplaining = QualType(),
10721 unsigned DiagIDForComplaining = 0);
10722
10723 /// Add the overload candidates named by callee and/or found by argument
10724 /// dependent lookup to the given overload set.
10725 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10726 ArrayRef<Expr *> Args,
10727 OverloadCandidateSet &CandidateSet,
10728 bool PartialOverloading = false);
10729
10730 /// Add the call candidates from the given set of lookup results to the given
10731 /// overload set. Non-function lookup results are ignored.
10733 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10734 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10735
10736 // An enum used to represent the different possible results of building a
10737 // range-based for loop.
10743
10744 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10745 /// given LookupResult is non-empty, it is assumed to describe a member which
10746 /// will be invoked. Otherwise, the function will be found via argument
10747 /// dependent lookup.
10748 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10749 /// otherwise CallExpr is set to ExprError() and some non-success value
10750 /// is returned.
10752 SourceLocation RangeLoc,
10753 const DeclarationNameInfo &NameInfo,
10754 LookupResult &MemberLookup,
10755 OverloadCandidateSet *CandidateSet,
10756 Expr *Range, ExprResult *CallExpr);
10757
10758 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10759 /// (which eventually refers to the declaration Func) and the call
10760 /// arguments Args/NumArgs, attempt to resolve the function call down
10761 /// to a specific function. If overload resolution succeeds, returns
10762 /// the call expression produced by overload resolution.
10763 /// Otherwise, emits diagnostics and returns ExprError.
10765 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10766 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10767 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10768
10769 /// Constructs and populates an OverloadedCandidateSet from
10770 /// the given function.
10771 /// \returns true when an the ExprResult output parameter has been set.
10773 MultiExprArg Args, SourceLocation RParenLoc,
10774 OverloadCandidateSet *CandidateSet,
10776
10780 const UnresolvedSetImpl &Fns,
10781 bool PerformADL = true);
10782
10783 /// Create a unary operation that may resolve to an overloaded
10784 /// operator.
10785 ///
10786 /// \param OpLoc The location of the operator itself (e.g., '*').
10787 ///
10788 /// \param Opc The UnaryOperatorKind that describes this operator.
10789 ///
10790 /// \param Fns The set of non-member functions that will be
10791 /// considered by overload resolution. The caller needs to build this
10792 /// set based on the context using, e.g.,
10793 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10794 /// set should not contain any member functions; those will be added
10795 /// by CreateOverloadedUnaryOp().
10796 ///
10797 /// \param Input The input argument.
10800 const UnresolvedSetImpl &Fns, Expr *input,
10801 bool RequiresADL = true);
10802
10803 /// Perform lookup for an overloaded binary operator.
10806 const UnresolvedSetImpl &Fns,
10807 ArrayRef<Expr *> Args, bool RequiresADL = true);
10808
10809 /// Create a binary operation that may resolve to an overloaded
10810 /// operator.
10811 ///
10812 /// \param OpLoc The location of the operator itself (e.g., '+').
10813 ///
10814 /// \param Opc The BinaryOperatorKind that describes this operator.
10815 ///
10816 /// \param Fns The set of non-member functions that will be
10817 /// considered by overload resolution. The caller needs to build this
10818 /// set based on the context using, e.g.,
10819 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10820 /// set should not contain any member functions; those will be added
10821 /// by CreateOverloadedBinOp().
10822 ///
10823 /// \param LHS Left-hand argument.
10824 /// \param RHS Right-hand argument.
10825 /// \param PerformADL Whether to consider operator candidates found by ADL.
10826 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10827 /// C++20 operator rewrites.
10828 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10829 /// the function in question. Such a function is never a candidate in
10830 /// our overload resolution. This also enables synthesizing a three-way
10831 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10833 const UnresolvedSetImpl &Fns, Expr *LHS,
10834 Expr *RHS, bool RequiresADL = true,
10835 bool AllowRewrittenCandidates = true,
10836 FunctionDecl *DefaultedFn = nullptr);
10838 const UnresolvedSetImpl &Fns,
10839 Expr *LHS, Expr *RHS,
10840 FunctionDecl *DefaultedFn);
10841
10843 SourceLocation RLoc, Expr *Base,
10844 MultiExprArg Args);
10845
10846 /// BuildCallToMemberFunction - Build a call to a member
10847 /// function. MemExpr is the expression that refers to the member
10848 /// function (and includes the object parameter), Args/NumArgs are the
10849 /// arguments to the function call (not including the object
10850 /// parameter). The caller needs to validate that the member
10851 /// expression refers to a non-static member function or an overloaded
10852 /// member function.
10854 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10855 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10856 bool IsExecConfig = false, bool AllowRecovery = false);
10857
10858 /// BuildCallToObjectOfClassType - Build a call to an object of class
10859 /// type (C++ [over.call.object]), which can end up invoking an
10860 /// overloaded function call operator (@c operator()) or performing a
10861 /// user-defined conversion on the object argument.
10863 SourceLocation LParenLoc,
10864 MultiExprArg Args,
10865 SourceLocation RParenLoc);
10866
10867 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10868 /// (if one exists), where @c Base is an expression of class type and
10869 /// @c Member is the name of the member we're trying to find.
10871 SourceLocation OpLoc,
10872 bool *NoArrowOperatorFound = nullptr);
10873
10876 bool HadMultipleCandidates);
10877
10878 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10879 /// to a literal operator described by the provided lookup results.
10882 SourceLocation LitEndLoc,
10883 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10884
10885 /// FixOverloadedFunctionReference - E is an expression that refers to
10886 /// a C++ overloaded function (possibly with some parentheses and
10887 /// perhaps a '&' around it). We have resolved the overloaded function
10888 /// to the function declaration Fn, so patch up the expression E to
10889 /// refer (possibly indirectly) to Fn. Returns the new expr.
10891 FunctionDecl *Fn);
10893 DeclAccessPair FoundDecl,
10894 FunctionDecl *Fn);
10895
10896 /// - Returns a selector which best matches given argument list or
10897 /// nullptr if none could be found
10899 bool IsInstance,
10901
10902 ///@}
10903
10904 //
10905 //
10906 // -------------------------------------------------------------------------
10907 //
10908 //
10909
10910 /// \name Statements
10911 /// Implementations are in SemaStmt.cpp
10912 ///@{
10913
10914public:
10915 /// Stack of active SEH __finally scopes. Can be empty.
10917
10918 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
10920
10922 bool HasLeadingEmptyMacro = false);
10923
10925 SourceLocation EndLoc);
10927
10928 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
10929 /// whose result is unused, warn.
10930 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
10931
10932 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
10936 ArrayRef<Stmt *> Elts, bool isStmtExpr);
10937
10939
10942 SourceLocation DotDotDotLoc, ExprResult RHS,
10943 SourceLocation ColonLoc);
10944
10945 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
10946 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
10947
10949 SourceLocation ColonLoc, Stmt *SubStmt,
10950 Scope *CurScope);
10952 SourceLocation ColonLoc, Stmt *SubStmt);
10953
10955 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
10957 Stmt *SubStmt);
10958
10959 /// Check whether the given statement can have musttail applied to it,
10960 /// issuing a diagnostic and returning false if not. In the success case,
10961 /// the statement is rewritten to remove implicit nodes from the return
10962 /// value.
10963 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
10964
10966 SourceLocation LParenLoc, Stmt *InitStmt,
10968 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10970 SourceLocation LParenLoc, Stmt *InitStmt,
10972 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10973
10975
10977 SourceLocation LParenLoc, Stmt *InitStmt,
10979 SourceLocation RParenLoc);
10981 Stmt *Body);
10982
10983 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
10984 /// integer not in the range of enum values.
10985 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
10986 Expr *SrcExpr);
10987
10990 Stmt *Body);
10992 SourceLocation WhileLoc, SourceLocation CondLParen,
10993 Expr *Cond, SourceLocation CondRParen);
10994
10996 Stmt *First, ConditionResult Second,
10997 FullExprArg Third, SourceLocation RParenLoc,
10998 Stmt *Body);
10999
11000 /// In an Objective C collection iteration statement:
11001 /// for (x in y)
11002 /// x can be an arbitrary l-value expression. Bind it up as a
11003 /// full-expression.
11005
11007 /// Initial building of a for-range statement.
11009 /// Instantiation or recovery rebuild of a for-range statement. Don't
11010 /// attempt any typo-correction.
11012 /// Determining whether a for-range statement could be built. Avoid any
11013 /// unnecessary or irreversible actions.
11015 };
11016
11017 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11018 ///
11019 /// C++11 [stmt.ranged]:
11020 /// A range-based for statement is equivalent to
11021 ///
11022 /// {
11023 /// auto && __range = range-init;
11024 /// for ( auto __begin = begin-expr,
11025 /// __end = end-expr;
11026 /// __begin != __end;
11027 /// ++__begin ) {
11028 /// for-range-declaration = *__begin;
11029 /// statement
11030 /// }
11031 /// }
11032 ///
11033 /// The body of the loop is not available yet, since it cannot be analysed
11034 /// until we have determined the type of the for-range-declaration.
11036 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11037 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11038 SourceLocation RParenLoc, BuildForRangeKind Kind,
11039 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11040
11041 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11042 StmtResult BuildCXXForRangeStmt(
11043 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11044 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11045 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11046 BuildForRangeKind Kind,
11047 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11048
11049 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11050 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11051 /// body cannot be performed until after the type of the range variable is
11052 /// determined.
11053 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11054
11055 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11056 LabelDecl *TheDecl);
11057 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11058 SourceLocation StarLoc, Expr *DestExp);
11059 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11060 LabelDecl *Label, SourceLocation LabelLoc);
11061 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11062 LabelDecl *Label, SourceLocation LabelLoc);
11063
11066
11069
11070 bool isMoveEligible() const { return S != None; };
11072 };
11074
11075 /// Determine whether the given expression might be move-eligible or
11076 /// copy-elidable in either a (co_)return statement or throw expression,
11077 /// without considering function return type, if applicable.
11078 ///
11079 /// \param E The expression being returned from the function or block,
11080 /// being thrown, or being co_returned from a coroutine. This expression
11081 /// might be modified by the implementation.
11082 ///
11083 /// \param Mode Overrides detection of current language mode
11084 /// and uses the rules for C++23.
11085 ///
11086 /// \returns An aggregate which contains the Candidate and isMoveEligible
11087 /// and isCopyElidable methods. If Candidate is non-null, it means
11088 /// isMoveEligible() would be true under the most permissive language
11089 /// standard.
11090 NamedReturnInfo getNamedReturnInfo(
11092
11093 /// Determine whether the given NRVO candidate variable is move-eligible or
11094 /// copy-elidable, without considering function return type.
11095 ///
11096 /// \param VD The NRVO candidate variable.
11097 ///
11098 /// \returns An aggregate which contains the Candidate and isMoveEligible
11099 /// and isCopyElidable methods. If Candidate is non-null, it means
11100 /// isMoveEligible() would be true under the most permissive language
11101 /// standard.
11102 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11103
11104 /// Updates given NamedReturnInfo's move-eligible and
11105 /// copy-elidable statuses, considering the function
11106 /// return type criteria as applicable to return statements.
11107 ///
11108 /// \param Info The NamedReturnInfo object to update.
11109 ///
11110 /// \param ReturnType This is the return type of the function.
11111 /// \returns The copy elision candidate, in case the initial return expression
11112 /// was copy elidable, or nullptr otherwise.
11113 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11114 QualType ReturnType);
11115
11116 /// Perform the initialization of a potentially-movable value, which
11117 /// is the result of return value.
11118 ///
11119 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11120 /// treat returned lvalues as rvalues in certain cases (to prefer move
11121 /// construction), then falls back to treating them as lvalues if that failed.
11124 const NamedReturnInfo &NRInfo, Expr *Value,
11125 bool SupressSimplerImplicitMoves = false);
11126
11128
11129 /// Deduce the return type for a function from a returned expression, per
11130 /// C++1y [dcl.spec.auto]p6.
11132 SourceLocation ReturnLoc, Expr *RetExpr,
11133 const AutoType *AT);
11134
11135 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11136 Scope *CurScope);
11137 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11138 bool AllowRecovery = false);
11139
11140 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11141 /// for capturing scopes.
11143 NamedReturnInfo &NRInfo,
11144 bool SupressSimplerImplicitMoves);
11145
11146 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11147 /// and creates a proper catch handler from them.
11149 Stmt *HandlerBlock);
11150
11151 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11152 /// handlers and creates a try statement from them.
11154 ArrayRef<Stmt *> Handlers);
11155
11156 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11157
11158 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11159 SourceLocation TryLoc, Stmt *TryBlock,
11160 Stmt *Handler);
11162 Stmt *Block);
11167
11169 bool IsIfExists,
11170 NestedNameSpecifierLoc QualifierLoc,
11171 DeclarationNameInfo NameInfo,
11172 Stmt *Nested);
11174 bool IsIfExists, CXXScopeSpec &SS,
11175 UnqualifiedId &Name, Stmt *Nested);
11176
11177 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11178 CapturedRegionKind Kind, unsigned NumParams);
11179 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11180 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11181 CapturedRegionKind Kind,
11183 unsigned OpenMPCaptureLevel = 0);
11187 SourceLocation Loc,
11188 unsigned NumParams);
11189
11190private:
11191 /// Check whether the given statement can have musttail applied to it,
11192 /// issuing a diagnostic and returning false if not.
11193 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11194
11195 /// Check if the given expression contains 'break' or 'continue'
11196 /// statement that produces control flow different from GCC.
11197 void CheckBreakContinueBinding(Expr *E);
11198
11199 ///@}
11200
11201 //
11202 //
11203 // -------------------------------------------------------------------------
11204 //
11205 //
11206
11207 /// \name `inline asm` Statement
11208 /// Implementations are in SemaStmtAsm.cpp
11209 ///@{
11210
11211public:
11212 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11213 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11214 bool IsVolatile, unsigned NumOutputs,
11215 unsigned NumInputs, IdentifierInfo **Names,
11216 MultiExprArg Constraints, MultiExprArg Exprs,
11217 Expr *AsmString, MultiExprArg Clobbers,
11218 unsigned NumLabels, SourceLocation RParenLoc);
11219
11221 llvm::InlineAsmIdentifierInfo &Info);
11223 SourceLocation TemplateKWLoc,
11224 UnqualifiedId &Id,
11225 bool IsUnevaluatedContext);
11226 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11227 SourceLocation AsmLoc);
11229 SourceLocation AsmLoc);
11231 ArrayRef<Token> AsmToks, StringRef AsmString,
11232 unsigned NumOutputs, unsigned NumInputs,
11233 ArrayRef<StringRef> Constraints,
11234 ArrayRef<StringRef> Clobbers,
11235 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11236 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11237 SourceLocation Location, bool AlwaysCreate);
11238
11239 ///@}
11240
11241 //
11242 //
11243 // -------------------------------------------------------------------------
11244 //
11245 //
11246
11247 /// \name Statement Attribute Handling
11248 /// Implementations are in SemaStmtAttr.cpp
11249 ///@{
11250
11251public:
11252 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11253 const AttributeCommonInfo &A);
11254 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11255 const AttributeCommonInfo &A);
11256
11257 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11259
11260 /// Process the attributes before creating an attributed statement. Returns
11261 /// the semantic attributes that have been processed.
11262 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11264
11266 SourceRange Range);
11268 const IdentifierInfo *AttrName,
11269 SourceRange Range);
11270
11271 ///@}
11272
11273 //
11274 //
11275 // -------------------------------------------------------------------------
11276 //
11277 //
11278
11279 /// \name C++ Templates
11280 /// Implementations are in SemaTemplate.cpp
11281 ///@{
11282
11283public:
11284 // Saves the current floating-point pragma stack and clear it in this Sema.
11286 public:
11288 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11289 S.FpPragmaStack.Stack.clear();
11290 }
11291 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11292
11293 private:
11294 Sema &S;
11296 };
11297
11299 CurFPFeatures = FPO;
11300 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11301 }
11302
11308
11309 /// The number of SFINAE diagnostics that have been trapped.
11311
11316
11317 typedef llvm::MapVector<const FunctionDecl *,
11318 std::unique_ptr<LateParsedTemplate>>
11321
11322 /// Determine the number of levels of enclosing template parameters. This is
11323 /// only usable while parsing. Note that this does not include dependent
11324 /// contexts in which no template parameters have yet been declared, such as
11325 /// in a terse function template or generic lambda before the first 'auto' is
11326 /// encountered.
11327 unsigned getTemplateDepth(Scope *S) const;
11328
11330 bool AllowFunctionTemplates = true,
11331 bool AllowDependent = true);
11333 bool AllowFunctionTemplates = true,
11334 bool AllowDependent = true,
11335 bool AllowNonTemplateFunctions = false);
11336 /// Try to interpret the lookup result D as a template-name.
11337 ///
11338 /// \param D A declaration found by name lookup.
11339 /// \param AllowFunctionTemplates Whether function templates should be
11340 /// considered valid results.
11341 /// \param AllowDependent Whether unresolved using declarations (that might
11342 /// name templates) should be considered valid results.
11344 bool AllowFunctionTemplates = true,
11345 bool AllowDependent = true);
11346
11348 /// Whether and why a template name is required in this lookup.
11350 public:
11351 /// Template name is required if TemplateKWLoc is valid.
11353 : TemplateKW(TemplateKWLoc) {}
11354 /// Template name is unconditionally required.
11356
11358 return TemplateKW.value_or(SourceLocation());
11359 }
11360 bool hasTemplateKeyword() const {
11361 return getTemplateKeywordLoc().isValid();
11362 }
11363 bool isRequired() const { return TemplateKW != SourceLocation(); }
11364 explicit operator bool() const { return isRequired(); }
11365
11366 private:
11367 std::optional<SourceLocation> TemplateKW;
11368 };
11369
11371 /// This is not assumed to be a template name.
11373 /// This is assumed to be a template name because lookup found nothing.
11375 /// This is assumed to be a template name because lookup found one or more
11376 /// functions (but no function templates).
11378 };
11379
11380 bool
11382 QualType ObjectType, bool EnteringContext,
11383 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11384 AssumedTemplateKind *ATK = nullptr,
11385 bool AllowTypoCorrection = true);
11386
11388 bool hasTemplateKeyword,
11389 const UnqualifiedId &Name,
11390 ParsedType ObjectType, bool EnteringContext,
11392 bool &MemberOfUnknownSpecialization,
11393 bool Disambiguation = false);
11394
11395 /// Try to resolve an undeclared template name as a type template.
11396 ///
11397 /// Sets II to the identifier corresponding to the template name, and updates
11398 /// Name to a corresponding (typo-corrected) type template name and TNK to
11399 /// the corresponding kind, if possible.
11401 TemplateNameKind &TNK,
11402 SourceLocation NameLoc,
11403 IdentifierInfo *&II);
11404
11405 /// Determine whether a particular identifier might be the name in a C++1z
11406 /// deduction-guide declaration.
11407 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11408 SourceLocation NameLoc, CXXScopeSpec &SS,
11409 ParsedTemplateTy *Template = nullptr);
11410
11412 SourceLocation IILoc, Scope *S,
11413 const CXXScopeSpec *SS,
11414 TemplateTy &SuggestedTemplate,
11415 TemplateNameKind &SuggestedKind);
11416
11417 /// Determine whether we would be unable to instantiate this template (because
11418 /// it either has no definition, or is in the process of being instantiated).
11420 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11421 bool InstantiatedFromMember, const NamedDecl *Pattern,
11422 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11423 bool Complain = true, bool *Unreachable = nullptr);
11424
11425 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11426 /// that the template parameter 'PrevDecl' is being shadowed by a new
11427 /// declaration at location Loc. Returns true to indicate that this is
11428 /// an error, and false otherwise.
11429 ///
11430 /// \param Loc The location of the declaration that shadows a template
11431 /// parameter.
11432 ///
11433 /// \param PrevDecl The template parameter that the declaration shadows.
11434 ///
11435 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11436 /// a warning for compatibility with older versions of clang.
11437 /// Ignored when MSVC compatibility is enabled.
11439 bool SupportedForCompatibility = false);
11440
11441 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11442 /// the parameter D to reference the templated declaration and return a
11443 /// pointer to the template declaration. Otherwise, do nothing to D and return
11444 /// null.
11446
11447 /// ActOnTypeParameter - Called when a C++ template type parameter
11448 /// (e.g., "typename T") has been parsed. Typename specifies whether
11449 /// the keyword "typename" was used to declare the type parameter
11450 /// (otherwise, "class" was used), and KeyLoc is the location of the
11451 /// "class" or "typename" keyword. ParamName is the name of the
11452 /// parameter (NULL indicates an unnamed template parameter) and
11453 /// ParamNameLoc is the location of the parameter name (if any).
11454 /// If the type parameter has a default argument, it will be added
11455 /// later via ActOnTypeParameterDefault.
11457 SourceLocation EllipsisLoc,
11458 SourceLocation KeyLoc,
11459 IdentifierInfo *ParamName,
11460 SourceLocation ParamNameLoc, unsigned Depth,
11461 unsigned Position, SourceLocation EqualLoc,
11462 ParsedType DefaultArg, bool HasTypeConstraint);
11463
11465
11466 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11468 TemplateTypeParmDecl *ConstrainedParameter,
11469 SourceLocation EllipsisLoc);
11470 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11472 TemplateTypeParmDecl *ConstrainedParameter,
11473 SourceLocation EllipsisLoc,
11474 bool AllowUnexpandedPack);
11475
11476 /// Attach a type-constraint to a template parameter.
11477 /// \returns true if an error occurred. This can happen if the
11478 /// immediately-declared constraint could not be formed (e.g. incorrect number
11479 /// of arguments for the named concept).
11481 DeclarationNameInfo NameInfo,
11482 TemplateDecl *NamedConcept, NamedDecl *FoundDecl,
11483 const TemplateArgumentListInfo *TemplateArgs,
11484 TemplateTypeParmDecl *ConstrainedParameter,
11485 SourceLocation EllipsisLoc);
11486
11488 NonTypeTemplateParmDecl *NewConstrainedParm,
11489 NonTypeTemplateParmDecl *OrigConstrainedParm,
11490 SourceLocation EllipsisLoc);
11491
11492 /// Require the given type to be a structural type, and diagnose if it is not.
11493 ///
11494 /// \return \c true if an error was produced.
11496
11497 /// Check that the type of a non-type template parameter is
11498 /// well-formed.
11499 ///
11500 /// \returns the (possibly-promoted) parameter type if valid;
11501 /// otherwise, produces a diagnostic and returns a NULL type.
11503 SourceLocation Loc);
11505
11507 unsigned Depth, unsigned Position,
11508 SourceLocation EqualLoc,
11509 Expr *DefaultArg);
11510
11511 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11512 /// parameter (e.g. T in template <template <typename> class T> class array)
11513 /// has been parsed. S is the current scope.
11515 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11516 bool TypenameKeyword, TemplateParameterList *Params,
11517 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11518 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11519 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11520
11521 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11522 /// constrained by RequiresClause, that contains the template parameters in
11523 /// Params.
11525 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11526 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11527 SourceLocation RAngleLoc, Expr *RequiresClause);
11528
11529 /// The context in which we are checking a template parameter list.
11531 // For this context, Class, Variable, TypeAlias, and non-pack Template
11532 // Template Parameters are treated uniformly.
11534
11541 };
11542
11543 /// Checks the validity of a template parameter list, possibly
11544 /// considering the template parameter list from a previous
11545 /// declaration.
11546 ///
11547 /// If an "old" template parameter list is provided, it must be
11548 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11549 /// template parameter list.
11550 ///
11551 /// \param NewParams Template parameter list for a new template
11552 /// declaration. This template parameter list will be updated with any
11553 /// default arguments that are carried through from the previous
11554 /// template parameter list.
11555 ///
11556 /// \param OldParams If provided, template parameter list from a
11557 /// previous declaration of the same template. Default template
11558 /// arguments will be merged from the old template parameter list to
11559 /// the new template parameter list.
11560 ///
11561 /// \param TPC Describes the context in which we are checking the given
11562 /// template parameter list.
11563 ///
11564 /// \param SkipBody If we might have already made a prior merged definition
11565 /// of this template visible, the corresponding body-skipping information.
11566 /// Default argument redefinition is not an error when skipping such a body,
11567 /// because (under the ODR) we can assume the default arguments are the same
11568 /// as the prior merged definition.
11569 ///
11570 /// \returns true if an error occurred, false otherwise.
11572 TemplateParameterList *OldParams,
11574 SkipBodyInfo *SkipBody = nullptr);
11575
11576 /// Match the given template parameter lists to the given scope
11577 /// specifier, returning the template parameter list that applies to the
11578 /// name.
11579 ///
11580 /// \param DeclStartLoc the start of the declaration that has a scope
11581 /// specifier or a template parameter list.
11582 ///
11583 /// \param DeclLoc The location of the declaration itself.
11584 ///
11585 /// \param SS the scope specifier that will be matched to the given template
11586 /// parameter lists. This scope specifier precedes a qualified name that is
11587 /// being declared.
11588 ///
11589 /// \param TemplateId The template-id following the scope specifier, if there
11590 /// is one. Used to check for a missing 'template<>'.
11591 ///
11592 /// \param ParamLists the template parameter lists, from the outermost to the
11593 /// innermost template parameter lists.
11594 ///
11595 /// \param IsFriend Whether to apply the slightly different rules for
11596 /// matching template parameters to scope specifiers in friend
11597 /// declarations.
11598 ///
11599 /// \param IsMemberSpecialization will be set true if the scope specifier
11600 /// denotes a fully-specialized type, and therefore this is a declaration of
11601 /// a member specialization.
11602 ///
11603 /// \returns the template parameter list, if any, that corresponds to the
11604 /// name that is preceded by the scope specifier @p SS. This template
11605 /// parameter list may have template parameters (if we're declaring a
11606 /// template) or may have no template parameters (if we're declaring a
11607 /// template specialization), or may be NULL (if what we're declaring isn't
11608 /// itself a template).
11610 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11611 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11612 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11613 bool &IsMemberSpecialization, bool &Invalid,
11614 bool SuppressDiagnostic = false);
11615
11616 /// Returns the template parameter list with all default template argument
11617 /// information.
11619
11621 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11622 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11623 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11624 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11625 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11626 TemplateParameterList **OuterTemplateParamLists,
11627 SkipBodyInfo *SkipBody = nullptr);
11628
11629 /// Translates template arguments as provided by the parser
11630 /// into template arguments used by semantic analysis.
11633
11634 /// Convert a parsed type into a parsed template argument. This is mostly
11635 /// trivial, except that we may have parsed a C++17 deduced class template
11636 /// specialization type, in which case we should form a template template
11637 /// argument instead of a type template argument.
11639
11641
11644 SourceLocation TemplateLoc,
11645 TemplateArgumentListInfo &TemplateArgs,
11646 Scope *Scope, bool ForNestedNameSpecifier);
11647
11649 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11650 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11651 SourceLocation TemplateKWLoc, TemplateTy Template,
11652 const IdentifierInfo *TemplateII,
11653 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11654 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11655 bool IsCtorOrDtorName = false, bool IsClassName = false,
11656 ImplicitTypenameContext AllowImplicitTypename =
11658
11659 /// Parsed an elaborated-type-specifier that refers to a template-id,
11660 /// such as \c class T::template apply<U>.
11662 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11663 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11664 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11665 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11666
11669 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11671
11672 /// Get the specialization of the given variable template corresponding to
11673 /// the specified argument list, or a null-but-valid result if the arguments
11674 /// are dependent.
11676 SourceLocation TemplateLoc,
11677 SourceLocation TemplateNameLoc,
11678 const TemplateArgumentListInfo &TemplateArgs,
11679 bool SetWrittenArgs);
11680
11681 /// Form a reference to the specialization of the given variable template
11682 /// corresponding to the specified argument list, or a null-but-valid result
11683 /// if the arguments are dependent.
11685 const DeclarationNameInfo &NameInfo,
11687 SourceLocation TemplateLoc,
11688 const TemplateArgumentListInfo *TemplateArgs);
11689
11691 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
11693 const TemplateArgumentListInfo *TemplateArgs);
11694
11696 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11697 const DeclarationNameInfo &ConceptNameInfo,
11698 NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
11699 const TemplateArgumentListInfo *TemplateArgs);
11700
11703 bool TemplateKeyword, TemplateDecl *TD,
11704 SourceLocation Loc);
11705
11707 SourceLocation TemplateKWLoc, LookupResult &R,
11708 bool RequiresADL,
11709 const TemplateArgumentListInfo *TemplateArgs);
11710
11711 // We actually only call this from template instantiation.
11714 const DeclarationNameInfo &NameInfo,
11715 const TemplateArgumentListInfo *TemplateArgs,
11716 bool IsAddressOfOperand);
11717
11718 /// Form a template name from a name that is syntactically required to name a
11719 /// template, either due to use of the 'template' keyword or because a name in
11720 /// this syntactic context is assumed to name a template (C++
11721 /// [temp.names]p2-4).
11722 ///
11723 /// This action forms a template name given the name of the template and its
11724 /// optional scope specifier. This is used when the 'template' keyword is used
11725 /// or when the parsing context unambiguously treats a following '<' as
11726 /// introducing a template argument list. Note that this may produce a
11727 /// non-dependent template name if we can perform the lookup now and identify
11728 /// the named template.
11729 ///
11730 /// For example, given "x.MetaFun::template apply", the scope specifier
11731 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11732 /// of the "template" keyword, and "apply" is the \p Name.
11734 SourceLocation TemplateKWLoc,
11735 const UnqualifiedId &Name,
11736 ParsedType ObjectType,
11737 bool EnteringContext, TemplateTy &Template,
11738 bool AllowInjectedClassName = false);
11739
11741 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11742 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11744 MultiTemplateParamsArg TemplateParameterLists,
11745 SkipBodyInfo *SkipBody = nullptr);
11746
11747 /// Check the non-type template arguments of a class template
11748 /// partial specialization according to C++ [temp.class.spec]p9.
11749 ///
11750 /// \param TemplateNameLoc the location of the template name.
11751 /// \param PrimaryTemplate the template parameters of the primary class
11752 /// template.
11753 /// \param NumExplicit the number of explicitly-specified template arguments.
11754 /// \param TemplateArgs the template arguments of the class template
11755 /// partial specialization.
11756 ///
11757 /// \returns \c true if there was an error, \c false otherwise.
11759 TemplateDecl *PrimaryTemplate,
11760 unsigned NumExplicitArgs,
11766
11768 MultiTemplateParamsArg TemplateParameterLists,
11769 Declarator &D);
11770
11771 /// Diagnose cases where we have an explicit template specialization
11772 /// before/after an explicit template instantiation, producing diagnostics
11773 /// for those cases where they are required and determining whether the
11774 /// new specialization/instantiation will have any effect.
11775 ///
11776 /// \param NewLoc the location of the new explicit specialization or
11777 /// instantiation.
11778 ///
11779 /// \param NewTSK the kind of the new explicit specialization or
11780 /// instantiation.
11781 ///
11782 /// \param PrevDecl the previous declaration of the entity.
11783 ///
11784 /// \param PrevTSK the kind of the old explicit specialization or
11785 /// instantiatin.
11786 ///
11787 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11788 /// declaration was instantiated (either implicitly or explicitly).
11789 ///
11790 /// \param HasNoEffect will be set to true to indicate that the new
11791 /// specialization or instantiation has no effect and should be ignored.
11792 ///
11793 /// \returns true if there was an error that should prevent the introduction
11794 /// of the new declaration into the AST, false otherwise.
11796 SourceLocation NewLoc,
11797 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11798 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11799 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11800
11801 /// Perform semantic analysis for the given dependent function
11802 /// template specialization.
11803 ///
11804 /// The only possible way to get a dependent function template specialization
11805 /// is with a friend declaration, like so:
11806 ///
11807 /// \code
11808 /// template <class T> void foo(T);
11809 /// template <class T> class A {
11810 /// friend void foo<>(T);
11811 /// };
11812 /// \endcode
11813 ///
11814 /// There really isn't any useful analysis we can do here, so we
11815 /// just store the information.
11817 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11819
11820 /// Perform semantic analysis for the given function template
11821 /// specialization.
11822 ///
11823 /// This routine performs all of the semantic analysis required for an
11824 /// explicit function template specialization. On successful completion,
11825 /// the function declaration \p FD will become a function template
11826 /// specialization.
11827 ///
11828 /// \param FD the function declaration, which will be updated to become a
11829 /// function template specialization.
11830 ///
11831 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11832 /// if any. Note that this may be valid info even when 0 arguments are
11833 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11834 /// as it anyway contains info on the angle brackets locations.
11835 ///
11836 /// \param Previous the set of declarations that may be specialized by
11837 /// this function specialization.
11838 ///
11839 /// \param QualifiedFriend whether this is a lookup for a qualified friend
11840 /// declaration with no explicit template argument list that might be
11841 /// befriending a function template specialization.
11843 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
11844 LookupResult &Previous, bool QualifiedFriend = false);
11845
11846 /// Perform semantic analysis for the given non-template member
11847 /// specialization.
11848 ///
11849 /// This routine performs all of the semantic analysis required for an
11850 /// explicit member function specialization. On successful completion,
11851 /// the function declaration \p FD will become a member function
11852 /// specialization.
11853 ///
11854 /// \param Member the member declaration, which will be updated to become a
11855 /// specialization.
11856 ///
11857 /// \param Previous the set of declarations, one of which may be specialized
11858 /// by this function specialization; the set will be modified to contain the
11859 /// redeclared member.
11862
11863 // Explicit instantiation of a class template specialization
11865 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
11866 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
11867 TemplateTy Template, SourceLocation TemplateNameLoc,
11868 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
11869 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
11870
11871 // Explicit instantiation of a member class of a class template.
11873 SourceLocation TemplateLoc,
11874 unsigned TagSpec, SourceLocation KWLoc,
11875 CXXScopeSpec &SS, IdentifierInfo *Name,
11876 SourceLocation NameLoc,
11877 const ParsedAttributesView &Attr);
11878
11880 SourceLocation TemplateLoc,
11881 Declarator &D);
11882
11883 /// If the given template parameter has a default template
11884 /// argument, substitute into that default template argument and
11885 /// return the corresponding template argument.
11887 TemplateDecl *Template, SourceLocation TemplateKWLoc,
11888 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
11889 ArrayRef<TemplateArgument> SugaredConverted,
11890 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
11891
11892 /// Returns the top most location responsible for the definition of \p N.
11893 /// If \p N is a a template specialization, this is the location
11894 /// of the top of the instantiation stack.
11895 /// Otherwise, the location of \p N is returned.
11897
11898 /// Specifies the context in which a particular template
11899 /// argument is being checked.
11901 /// The template argument was specified in the code or was
11902 /// instantiated with some deduced template arguments.
11904
11905 /// The template argument was deduced via template argument
11906 /// deduction.
11908
11909 /// The template argument was deduced from an array bound
11910 /// via template argument deduction.
11912 };
11913
11921
11922 /// The checked, converted argument will be added to the
11923 /// end of these vectors.
11925
11926 /// The check is being performed in the context of partial ordering.
11928
11929 /// If true, assume these template arguments are
11930 /// the injected template arguments for a template template parameter.
11931 /// This will relax the requirement that all its possible uses are valid:
11932 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
11933 /// during instantiation.
11935
11936 /// Is set to true when, in the context of TTP matching, a pack parameter
11937 /// matches non-pack arguments.
11938 bool StrictPackMatch = false;
11939 };
11940
11941 /// Check that the given template argument corresponds to the given
11942 /// template parameter.
11943 ///
11944 /// \param Param The template parameter against which the argument will be
11945 /// checked.
11946 ///
11947 /// \param Arg The template argument, which may be updated due to conversions.
11948 ///
11949 /// \param Template The template in which the template argument resides.
11950 ///
11951 /// \param TemplateLoc The location of the template name for the template
11952 /// whose argument list we're matching.
11953 ///
11954 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
11955 /// the template argument list.
11956 ///
11957 /// \param ArgumentPackIndex The index into the argument pack where this
11958 /// argument will be placed. Only valid if the parameter is a parameter pack.
11959 ///
11960 /// \param CTAK Describes how we arrived at this particular template argument:
11961 /// explicitly written, deduced, etc.
11962 ///
11963 /// \returns true on error, false otherwise.
11965 NamedDecl *Template, SourceLocation TemplateLoc,
11966 SourceLocation RAngleLoc,
11967 unsigned ArgumentPackIndex,
11970
11971 /// Check that the given template arguments can be provided to
11972 /// the given template, converting the arguments along the way.
11973 ///
11974 /// \param Template The template to which the template arguments are being
11975 /// provided.
11976 ///
11977 /// \param TemplateLoc The location of the template name in the source.
11978 ///
11979 /// \param TemplateArgs The list of template arguments. If the template is
11980 /// a template template parameter, this function may extend the set of
11981 /// template arguments to also include substituted, defaulted template
11982 /// arguments.
11983 ///
11984 /// \param PartialTemplateArgs True if the list of template arguments is
11985 /// intentionally partial, e.g., because we're checking just the initial
11986 /// set of template arguments.
11987 ///
11988 /// \param Converted Will receive the converted, canonicalized template
11989 /// arguments.
11990 ///
11991 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
11992 /// contain the converted forms of the template arguments as written.
11993 /// Otherwise, \p TemplateArgs will not be modified.
11994 ///
11995 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
11996 /// receive true if the cause for the error is the associated constraints of
11997 /// the template not being satisfied by the template arguments.
11998 ///
11999 /// \param DefaultArgs any default arguments from template specialization
12000 /// deduction.
12001 ///
12002 /// \returns true if an error occurred, false otherwise.
12004 SourceLocation TemplateLoc,
12005 TemplateArgumentListInfo &TemplateArgs,
12006 const DefaultArguments &DefaultArgs,
12007 bool PartialTemplateArgs,
12009 bool UpdateArgsWithConversions = true,
12010 bool *ConstraintsNotSatisfied = nullptr);
12011
12014 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12015 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12016
12017 /// Check a template argument against its corresponding
12018 /// template type parameter.
12019 ///
12020 /// This routine implements the semantics of C++ [temp.arg.type]. It
12021 /// returns true if an error occurred, and false otherwise.
12023
12024 /// Check a template argument against its corresponding
12025 /// non-type template parameter.
12026 ///
12027 /// This routine implements the semantics of C++ [temp.arg.nontype].
12028 /// If an error occurred, it returns ExprError(); otherwise, it
12029 /// returns the converted template argument. \p ParamType is the
12030 /// type of the non-type template parameter after it has been instantiated.
12032 QualType InstantiatedParamType, Expr *Arg,
12033 TemplateArgument &SugaredConverted,
12034 TemplateArgument &CanonicalConverted,
12035 bool StrictCheck,
12037
12038 /// Check a template argument against its corresponding
12039 /// template template parameter.
12040 ///
12041 /// This routine implements the semantics of C++ [temp.arg.template].
12042 /// It returns true if an error occurred, and false otherwise.
12044 TemplateParameterList *Params,
12046 bool PartialOrdering,
12047 bool *StrictPackMatch);
12048
12051 const TemplateArgumentLoc &Arg);
12052
12054 std::optional<SourceRange> ParamRange = {});
12056
12057 /// Given a non-type template argument that refers to a
12058 /// declaration and the type of its corresponding non-type template
12059 /// parameter, produce an expression that properly refers to that
12060 /// declaration.
12061 /// FIXME: This is used in some contexts where the resulting expression
12062 /// doesn't need to live too long. It would be useful if this function
12063 /// could return a temporary expression.
12065 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
12066 NamedDecl *TemplateParam = nullptr);
12069 SourceLocation Loc);
12070
12071 /// Enumeration describing how template parameter lists are compared
12072 /// for equality.
12074 /// We are matching the template parameter lists of two templates
12075 /// that might be redeclarations.
12076 ///
12077 /// \code
12078 /// template<typename T> struct X;
12079 /// template<typename T> struct X;
12080 /// \endcode
12082
12083 /// We are matching the template parameter lists of two template
12084 /// template parameters as part of matching the template parameter lists
12085 /// of two templates that might be redeclarations.
12086 ///
12087 /// \code
12088 /// template<template<int I> class TT> struct X;
12089 /// template<template<int Value> class Other> struct X;
12090 /// \endcode
12092
12093 /// We are determining whether the template-parameters are equivalent
12094 /// according to C++ [temp.over.link]/6. This comparison does not consider
12095 /// constraints.
12096 ///
12097 /// \code
12098 /// template<C1 T> void f(T);
12099 /// template<C2 T> void f(T);
12100 /// \endcode
12102 };
12103
12104 // A struct to represent the 'new' declaration, which is either itself just
12105 // the named decl, or the important information we need about it in order to
12106 // do constraint comparisons.
12108 const NamedDecl *ND = nullptr;
12109 const DeclContext *DC = nullptr;
12110 const DeclContext *LexicalDC = nullptr;
12111 SourceLocation Loc;
12112
12113 public:
12116 const DeclContext *LexicalDeclCtx,
12117 SourceLocation Loc)
12118
12119 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12120 assert(DC && LexicalDC &&
12121 "Constructor only for cases where we have the information to put "
12122 "in here");
12123 }
12124
12125 // If this was constructed with no information, we cannot do substitution
12126 // for constraint comparison, so make sure we can check that.
12127 bool isInvalid() const { return !ND && !DC; }
12128
12129 const NamedDecl *getDecl() const { return ND; }
12130
12131 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12132
12134 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12135 }
12136
12138 return ND ? ND->getDeclContext() : DC;
12139 }
12140
12141 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12142 };
12143
12144 /// Determine whether the given template parameter lists are
12145 /// equivalent.
12146 ///
12147 /// \param New The new template parameter list, typically written in the
12148 /// source code as part of a new template declaration.
12149 ///
12150 /// \param Old The old template parameter list, typically found via
12151 /// name lookup of the template declared with this template parameter
12152 /// list.
12153 ///
12154 /// \param Complain If true, this routine will produce a diagnostic if
12155 /// the template parameter lists are not equivalent.
12156 ///
12157 /// \param Kind describes how we are to match the template parameter lists.
12158 ///
12159 /// \param TemplateArgLoc If this source location is valid, then we
12160 /// are actually checking the template parameter list of a template
12161 /// argument (New) against the template parameter list of its
12162 /// corresponding template template parameter (Old). We produce
12163 /// slightly different diagnostics in this scenario.
12164 ///
12165 /// \returns True if the template parameter lists are equal, false
12166 /// otherwise.
12168 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12169 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12171 SourceLocation TemplateArgLoc = SourceLocation());
12172
12174 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12176 SourceLocation TemplateArgLoc = SourceLocation()) {
12177 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12178 Kind, TemplateArgLoc);
12179 }
12180
12181 /// Check whether a template can be declared within this scope.
12182 ///
12183 /// If the template declaration is valid in this scope, returns
12184 /// false. Otherwise, issues a diagnostic and returns true.
12185 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12186
12187 /// Called when the parser has parsed a C++ typename
12188 /// specifier, e.g., "typename T::type".
12189 ///
12190 /// \param S The scope in which this typename type occurs.
12191 /// \param TypenameLoc the location of the 'typename' keyword
12192 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12193 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12194 /// \param IdLoc the location of the identifier.
12195 /// \param IsImplicitTypename context where T::type refers to a type.
12197 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12198 const IdentifierInfo &II, SourceLocation IdLoc,
12200
12201 /// Called when the parser has parsed a C++ typename
12202 /// specifier that ends in a template-id, e.g.,
12203 /// "typename MetaFun::template apply<T1, T2>".
12204 ///
12205 /// \param S The scope in which this typename type occurs.
12206 /// \param TypenameLoc the location of the 'typename' keyword
12207 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12208 /// \param TemplateLoc the location of the 'template' keyword, if any.
12209 /// \param TemplateName The template name.
12210 /// \param TemplateII The identifier used to name the template.
12211 /// \param TemplateIILoc The location of the template name.
12212 /// \param LAngleLoc The location of the opening angle bracket ('<').
12213 /// \param TemplateArgs The template arguments.
12214 /// \param RAngleLoc The location of the closing angle bracket ('>').
12216 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12217 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12218 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12219 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12220 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12221
12223 SourceLocation KeywordLoc,
12224 NestedNameSpecifierLoc QualifierLoc,
12225 const IdentifierInfo &II, SourceLocation IILoc,
12226 TypeSourceInfo **TSI, bool DeducedTSTContext);
12227
12229 SourceLocation KeywordLoc,
12230 NestedNameSpecifierLoc QualifierLoc,
12231 const IdentifierInfo &II, SourceLocation IILoc,
12232 bool DeducedTSTContext = true);
12233
12234 /// Rebuilds a type within the context of the current instantiation.
12235 ///
12236 /// The type \p T is part of the type of an out-of-line member definition of
12237 /// a class template (or class template partial specialization) that was
12238 /// parsed and constructed before we entered the scope of the class template
12239 /// (or partial specialization thereof). This routine will rebuild that type
12240 /// now that we have entered the declarator's scope, which may produce
12241 /// different canonical types, e.g.,
12242 ///
12243 /// \code
12244 /// template<typename T>
12245 /// struct X {
12246 /// typedef T* pointer;
12247 /// pointer data();
12248 /// };
12249 ///
12250 /// template<typename T>
12251 /// typename X<T>::pointer X<T>::data() { ... }
12252 /// \endcode
12253 ///
12254 /// Here, the type "typename X<T>::pointer" will be created as a
12255 /// DependentNameType, since we do not know that we can look into X<T> when we
12256 /// parsed the type. This function will rebuild the type, performing the
12257 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12258 /// canonical type is the same as the canonical type of T*, allowing the
12259 /// return types of the out-of-line definition and the declaration to match.
12261 SourceLocation Loc,
12262 DeclarationName Name);
12264
12266
12267 /// Rebuild the template parameters now that we know we're in a current
12268 /// instantiation.
12269 bool
12271
12272 /// Produces a formatted string that describes the binding of
12273 /// template parameters to template arguments.
12274 std::string
12276 const TemplateArgumentList &Args);
12277
12278 std::string
12280 const TemplateArgument *Args,
12281 unsigned NumArgs);
12282
12286
12287 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12288 /// was just parsed. This is only possible with an explicit scope
12289 /// specifier naming a dependent type.
12291 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12292 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12293 const TemplateArgumentListInfo *TemplateArgs);
12294
12297 SourceLocation TemplateKWLoc,
12298 const DeclarationNameInfo &NameInfo,
12299 const TemplateArgumentListInfo *TemplateArgs);
12300
12301 // Calculates whether the expression Constraint depends on an enclosing
12302 // template, for the purposes of [temp.friend] p9.
12303 // TemplateDepth is the 'depth' of the friend function, which is used to
12304 // compare whether a declaration reference is referring to a containing
12305 // template, or just the current friend function. A 'lower' TemplateDepth in
12306 // the AST refers to a 'containing' template. As the constraint is
12307 // uninstantiated, this is relative to the 'top' of the TU.
12308 bool
12310 unsigned TemplateDepth,
12311 const Expr *Constraint);
12312
12313 /// Find the failed Boolean condition within a given Boolean
12314 /// constant expression, and describe it with a string.
12315 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12316
12318
12320 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12321 const IdentifierInfo *Name, SourceLocation NameLoc);
12322
12324 Expr *ConstraintExpr,
12325 const ParsedAttributesView &Attrs);
12326
12328 bool &AddToScope);
12330
12331 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12332 const CXXScopeSpec &SS,
12333 const IdentifierInfo *Name,
12334 SourceLocation TagLoc, SourceLocation NameLoc);
12335
12337 CachedTokens &Toks);
12340
12341 /// We've found a use of a templated declaration that would trigger an
12342 /// implicit instantiation. Check that any relevant explicit specializations
12343 /// and partial specializations are visible/reachable, and diagnose if not.
12346
12347 ///@}
12348
12349 //
12350 //
12351 // -------------------------------------------------------------------------
12352 //
12353 //
12354
12355 /// \name C++ Template Argument Deduction
12356 /// Implementations are in SemaTemplateDeduction.cpp
12357 ///@{
12358
12359public:
12360 /// When true, access checking violations are treated as SFINAE
12361 /// failures rather than hard errors.
12363
12364 /// RAII class used to determine whether SFINAE has
12365 /// trapped any errors that occur during template argument
12366 /// deduction.
12368 Sema &SemaRef;
12369 unsigned PrevSFINAEErrors;
12370 bool PrevInNonInstantiationSFINAEContext;
12371 bool PrevAccessCheckingSFINAE;
12372 bool PrevLastDiagnosticIgnored;
12373
12374 public:
12375 /// \param ForValidityCheck If true, discard all diagnostics (from the
12376 /// immediate context) instead of adding them to the currently active
12377 /// \ref TemplateDeductionInfo (as returned by \ref isSFINAEContext).
12378 explicit SFINAETrap(Sema &SemaRef, bool ForValidityCheck = false)
12379 : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors),
12380 PrevInNonInstantiationSFINAEContext(
12382 PrevAccessCheckingSFINAE(SemaRef.AccessCheckingSFINAE),
12383 PrevLastDiagnosticIgnored(
12384 SemaRef.getDiagnostics().isLastDiagnosticIgnored()) {
12385 if (ForValidityCheck || !SemaRef.isSFINAEContext())
12386 SemaRef.InNonInstantiationSFINAEContext = true;
12387 SemaRef.AccessCheckingSFINAE = ForValidityCheck;
12388 }
12389
12391 SemaRef.NumSFINAEErrors = PrevSFINAEErrors;
12392 SemaRef.InNonInstantiationSFINAEContext =
12393 PrevInNonInstantiationSFINAEContext;
12394 SemaRef.AccessCheckingSFINAE = PrevAccessCheckingSFINAE;
12395 SemaRef.getDiagnostics().setLastDiagnosticIgnored(
12396 PrevLastDiagnosticIgnored);
12397 }
12398
12399 /// Determine whether any SFINAE errors have been trapped.
12400 bool hasErrorOccurred() const {
12401 return SemaRef.NumSFINAEErrors > PrevSFINAEErrors;
12402 }
12403 };
12404
12405 /// RAII class used to indicate that we are performing provisional
12406 /// semantic analysis to determine the validity of a construct, so
12407 /// typo-correction and diagnostics in the immediate context (not within
12408 /// implicitly-instantiated templates) should be suppressed.
12410 Sema &SemaRef;
12411 // FIXME: Using a SFINAETrap for this is a hack.
12412 SFINAETrap Trap;
12413 bool PrevDisableTypoCorrection;
12414
12415 public:
12416 explicit TentativeAnalysisScope(Sema &SemaRef)
12417 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12418 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12419 SemaRef.DisableTypoCorrection = true;
12420 }
12422 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12423 }
12424 };
12425
12426 /// For each declaration that involved template argument deduction, the
12427 /// set of diagnostics that were suppressed during that template argument
12428 /// deduction.
12429 ///
12430 /// FIXME: Serialize this structure to the AST file.
12431 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12434
12435 /// Compare types for equality with respect to possibly compatible
12436 /// function types (noreturn adjustment, implicit calling conventions). If any
12437 /// of parameter and argument is not a function, just perform type comparison.
12438 ///
12439 /// \param P the template parameter type.
12440 ///
12441 /// \param A the argument type.
12443
12444 /// Allocate a TemplateArgumentLoc where all locations have
12445 /// been initialized to the given location.
12446 ///
12447 /// \param Arg The template argument we are producing template argument
12448 /// location information for.
12449 ///
12450 /// \param NTTPType For a declaration template argument, the type of
12451 /// the non-type template parameter that corresponds to this template
12452 /// argument. Can be null if no type sugar is available to add to the
12453 /// type from the template argument.
12454 ///
12455 /// \param Loc The source location to use for the resulting template
12456 /// argument.
12459 SourceLocation Loc,
12460 NamedDecl *TemplateParam = nullptr);
12461
12462 /// Get a template argument mapping the given template parameter to itself,
12463 /// e.g. for X in \c template<int X>, this would return an expression template
12464 /// argument referencing X.
12466 SourceLocation Location);
12467
12468 /// Adjust the type \p ArgFunctionType to match the calling convention,
12469 /// noreturn, and optionally the exception specification of \p FunctionType.
12470 /// Deduction often wants to ignore these properties when matching function
12471 /// types.
12473 bool AdjustExceptionSpec = false);
12474
12477 ArrayRef<TemplateArgument> TemplateArgs,
12479
12482 ArrayRef<TemplateArgument> TemplateArgs,
12484
12485 /// Deduce the template arguments of the given template from \p FromType.
12486 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12487 /// [over.match.class.deduct]p4.
12488 ///
12489 /// It only supports class or type alias templates.
12493
12498 bool NumberOfArgumentsMustMatch);
12499
12500 /// Substitute the explicitly-provided template arguments into the
12501 /// given function template according to C++ [temp.arg.explicit].
12502 ///
12503 /// \param FunctionTemplate the function template into which the explicit
12504 /// template arguments will be substituted.
12505 ///
12506 /// \param ExplicitTemplateArgs the explicitly-specified template
12507 /// arguments.
12508 ///
12509 /// \param Deduced the deduced template arguments, which will be populated
12510 /// with the converted and checked explicit template arguments.
12511 ///
12512 /// \param ParamTypes will be populated with the instantiated function
12513 /// parameters.
12514 ///
12515 /// \param FunctionType if non-NULL, the result type of the function template
12516 /// will also be instantiated and the pointed-to value will be updated with
12517 /// the instantiated function type.
12518 ///
12519 /// \param Info if substitution fails for any reason, this object will be
12520 /// populated with more information about the failure.
12521 ///
12522 /// \returns TemplateDeductionResult::Success if substitution was successful,
12523 /// or some failure condition.
12526 TemplateArgumentListInfo &ExplicitTemplateArgs,
12530
12531 /// brief A function argument from which we performed template argument
12532 // deduction for a call.
12545
12546 /// Finish template argument deduction for a function template,
12547 /// checking the deduced template arguments for completeness and forming
12548 /// the function template specialization.
12549 ///
12550 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12551 /// which the deduced argument types should be compared.
12552 /// \param CheckNonDependent Callback before substituting into the declaration
12553 /// with the deduced template arguments.
12554 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12555 /// some breakages introduced by CWG2369, where non-user-defined conversions
12556 /// are checked first before the constraints.
12560 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12562 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12563 bool PartialOverloading, bool PartialOrdering,
12564 bool ForOverloadSetAddressResolution,
12565 llvm::function_ref<bool(bool)> CheckNonDependent =
12566 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12567 return false;
12568 });
12569
12570 /// Perform template argument deduction from a function call
12571 /// (C++ [temp.deduct.call]).
12572 ///
12573 /// \param FunctionTemplate the function template for which we are performing
12574 /// template argument deduction.
12575 ///
12576 /// \param ExplicitTemplateArgs the explicit template arguments provided
12577 /// for this call.
12578 ///
12579 /// \param Args the function call arguments
12580 ///
12581 /// \param Specialization if template argument deduction was successful,
12582 /// this will be set to the function template specialization produced by
12583 /// template argument deduction.
12584 ///
12585 /// \param Info the argument will be updated to provide additional information
12586 /// about template argument deduction.
12587 ///
12588 /// \param CheckNonDependent A callback to invoke to check conversions for
12589 /// non-dependent parameters, between deduction and substitution, per DR1391.
12590 /// If this returns true, substitution will be skipped and we return
12591 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12592 /// passed the parameter types (after substituting explicit template
12593 /// arguments).
12594 ///
12595 /// \returns the result of template argument deduction.
12598 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12600 bool PartialOverloading, bool AggregateDeductionCandidate,
12601 bool PartialOrdering, QualType ObjectType,
12602 Expr::Classification ObjectClassification,
12603 bool ForOverloadSetAddressResolution,
12604 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12605
12606 /// Deduce template arguments when taking the address of a function
12607 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12608 /// a template.
12609 ///
12610 /// \param FunctionTemplate the function template for which we are performing
12611 /// template argument deduction.
12612 ///
12613 /// \param ExplicitTemplateArgs the explicitly-specified template
12614 /// arguments.
12615 ///
12616 /// \param ArgFunctionType the function type that will be used as the
12617 /// "argument" type (A) when performing template argument deduction from the
12618 /// function template's function type. This type may be NULL, if there is no
12619 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12620 ///
12621 /// \param Specialization if template argument deduction was successful,
12622 /// this will be set to the function template specialization produced by
12623 /// template argument deduction.
12624 ///
12625 /// \param Info the argument will be updated to provide additional information
12626 /// about template argument deduction.
12627 ///
12628 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12629 /// the address of a function template per [temp.deduct.funcaddr] and
12630 /// [over.over]. If \c false, we are looking up a function template
12631 /// specialization based on its signature, per [temp.deduct.decl].
12632 ///
12633 /// \returns the result of template argument deduction.
12636 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12638 bool IsAddressOfFunction = false);
12639
12640 /// Deduce template arguments for a templated conversion
12641 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12642 /// conversion function template specialization.
12645 Expr::Classification ObjectClassification, QualType ToType,
12647
12648 /// Deduce template arguments for a function template when there is
12649 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12650 ///
12651 /// \param FunctionTemplate the function template for which we are performing
12652 /// template argument deduction.
12653 ///
12654 /// \param ExplicitTemplateArgs the explicitly-specified template
12655 /// arguments.
12656 ///
12657 /// \param Specialization if template argument deduction was successful,
12658 /// this will be set to the function template specialization produced by
12659 /// template argument deduction.
12660 ///
12661 /// \param Info the argument will be updated to provide additional information
12662 /// about template argument deduction.
12663 ///
12664 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12665 /// the address of a function template in a context where we do not have a
12666 /// target type, per [over.over]. If \c false, we are looking up a function
12667 /// template specialization based on its signature, which only happens when
12668 /// deducing a function parameter type from an argument that is a template-id
12669 /// naming a function template specialization.
12670 ///
12671 /// \returns the result of template argument deduction.
12674 TemplateArgumentListInfo *ExplicitTemplateArgs,
12677 bool IsAddressOfFunction = false);
12678
12679 /// Substitute Replacement for \p auto in \p TypeWithAuto
12680 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12681 /// Substitute Replacement for auto in TypeWithAuto
12683 QualType Replacement);
12684
12685 // Substitute auto in TypeWithAuto for a Dependent auto type
12687
12688 // Substitute auto in TypeWithAuto for a Dependent auto type
12691
12692 /// Completely replace the \c auto in \p TypeWithAuto by
12693 /// \p Replacement. This does not retain any \c auto type sugar.
12694 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12696 QualType Replacement);
12697
12698 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12699 ///
12700 /// Note that this is done even if the initializer is dependent. (This is
12701 /// necessary to support partial ordering of templates using 'auto'.)
12702 /// A dependent type will be produced when deducing from a dependent type.
12703 ///
12704 /// \param Type the type pattern using the auto type-specifier.
12705 /// \param Init the initializer for the variable whose type is to be deduced.
12706 /// \param Result if type deduction was successful, this will be set to the
12707 /// deduced type.
12708 /// \param Info the argument will be updated to provide additional information
12709 /// about template argument deduction.
12710 /// \param DependentDeduction Set if we should permit deduction in
12711 /// dependent cases. This is necessary for template partial ordering
12712 /// with 'auto' template parameters. The template parameter depth to be
12713 /// used should be specified in the 'Info' parameter.
12714 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12715 /// does not satisfy the type-constraint in the auto
12716 /// type.
12720 bool DependentDeduction = false,
12721 bool IgnoreConstraints = false,
12722 TemplateSpecCandidateSet *FailedTSC = nullptr);
12723 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12725 bool Diagnose = true);
12726
12728 SourceLocation Loc);
12729
12730 /// Returns the more specialized class template partial specialization
12731 /// according to the rules of partial ordering of class template partial
12732 /// specializations (C++ [temp.class.order]).
12733 ///
12734 /// \param PS1 the first class template partial specialization
12735 ///
12736 /// \param PS2 the second class template partial specialization
12737 ///
12738 /// \returns the more specialized class template partial specialization. If
12739 /// neither partial specialization is more specialized, returns NULL.
12744
12747
12751
12754
12756 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12757 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12758 bool PartialOrdering, bool *StrictPackMatch);
12759
12760 /// Mark which template parameters are used in a given expression.
12761 ///
12762 /// \param E the expression from which template parameters will be deduced.
12763 ///
12764 /// \param Used a bit vector whose elements will be set to \c true
12765 /// to indicate when the corresponding template parameter will be
12766 /// deduced.
12767 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12768 unsigned Depth, llvm::SmallBitVector &Used);
12769
12770 /// Mark which template parameters can be deduced from a given
12771 /// template argument list.
12772 ///
12773 /// \param TemplateArgs the template argument list from which template
12774 /// parameters will be deduced.
12775 ///
12776 /// \param Used a bit vector whose elements will be set to \c true
12777 /// to indicate when the corresponding template parameter will be
12778 /// deduced.
12779 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12780 bool OnlyDeduced, unsigned Depth,
12781 llvm::SmallBitVector &Used);
12782
12784 unsigned Depth, llvm::SmallBitVector &Used);
12785
12786 void
12788 llvm::SmallBitVector &Deduced) {
12790 }
12791
12792 /// Marks all of the template parameters that will be deduced by a
12793 /// call to the given function template.
12794 static void
12797 llvm::SmallBitVector &Deduced);
12798
12799 /// Returns the more specialized function template according
12800 /// to the rules of function template partial ordering (C++
12801 /// [temp.func.order]).
12802 ///
12803 /// \param FT1 the first function template
12804 ///
12805 /// \param FT2 the second function template
12806 ///
12807 /// \param TPOC the context in which we are performing partial ordering of
12808 /// function templates.
12809 ///
12810 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
12811 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
12812 /// when calling a member function.
12813 ///
12814 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
12815 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
12816 /// template from a member function
12817 ///
12818 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
12819 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
12820 /// template from a member function
12821 ///
12822 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
12823 /// candidate with a reversed parameter order. In this case, the corresponding
12824 /// P/A pairs between FT1 and FT2 are reversed.
12825 ///
12826 /// \returns the more specialized function template. If neither
12827 /// template is more specialized, returns NULL.
12830 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
12831 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
12832 bool PartialOverloading = false);
12833
12834 /// Retrieve the most specialized of the given function template
12835 /// specializations.
12836 ///
12837 /// \param SpecBegin the start iterator of the function template
12838 /// specializations that we will be comparing.
12839 ///
12840 /// \param SpecEnd the end iterator of the function template
12841 /// specializations, paired with \p SpecBegin.
12842 ///
12843 /// \param Loc the location where the ambiguity or no-specializations
12844 /// diagnostic should occur.
12845 ///
12846 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
12847 /// no matching candidates.
12848 ///
12849 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
12850 /// occurs.
12851 ///
12852 /// \param CandidateDiag partial diagnostic used for each function template
12853 /// specialization that is a candidate in the ambiguous ordering. One
12854 /// parameter in this diagnostic should be unbound, which will correspond to
12855 /// the string describing the template arguments for the function template
12856 /// specialization.
12857 ///
12858 /// \returns the most specialized function template specialization, if
12859 /// found. Otherwise, returns SpecEnd.
12860 UnresolvedSetIterator
12861 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
12862 TemplateSpecCandidateSet &FailedCandidates,
12863 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
12864 const PartialDiagnostic &AmbigDiag,
12865 const PartialDiagnostic &CandidateDiag,
12866 bool Complain = true, QualType TargetType = QualType());
12867
12868 /// Returns the more constrained function according to the rules of
12869 /// partial ordering by constraints (C++ [temp.constr.order]).
12870 ///
12871 /// \param FD1 the first function
12872 ///
12873 /// \param FD2 the second function
12874 ///
12875 /// \returns the more constrained function. If neither function is
12876 /// more constrained, returns NULL.
12877 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
12878 FunctionDecl *FD2);
12879
12880 ///@}
12881
12882 //
12883 //
12884 // -------------------------------------------------------------------------
12885 //
12886 //
12887
12888 /// \name C++ Template Deduction Guide
12889 /// Implementations are in SemaTemplateDeductionGuide.cpp
12890 ///@{
12891
12892 /// Declare implicit deduction guides for a class template if we've
12893 /// not already done so.
12894 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
12895 SourceLocation Loc);
12896
12897 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
12898 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
12899 SourceLocation Loc);
12900
12901 ///@}
12902
12903 //
12904 //
12905 // -------------------------------------------------------------------------
12906 //
12907 //
12908
12909 /// \name C++ Template Instantiation
12910 /// Implementations are in SemaTemplateInstantiate.cpp
12911 ///@{
12912
12913public:
12914 /// A helper class for building up ExtParameterInfos.
12917 bool HasInteresting = false;
12918
12919 public:
12920 /// Set the ExtParameterInfo for the parameter at the given index,
12921 ///
12923 assert(Infos.size() <= index);
12924 Infos.resize(index);
12925 Infos.push_back(info);
12926
12927 if (!HasInteresting)
12928 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
12929 }
12930
12931 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
12932 /// ExtParameterInfo array we've built up.
12934 getPointerOrNull(unsigned numParams) {
12935 if (!HasInteresting)
12936 return nullptr;
12937 Infos.resize(numParams);
12938 return Infos.data();
12939 }
12940 };
12941
12942 /// The current instantiation scope used to store local
12943 /// variables.
12945
12946 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
12948
12949 /// A mapping from parameters with unparsed default arguments to the
12950 /// set of instantiations of each parameter.
12951 ///
12952 /// This mapping is a temporary data structure used when parsing
12953 /// nested class templates or nested classes of class templates,
12954 /// where we might end up instantiating an inner class before the
12955 /// default arguments of its methods have been parsed.
12957
12958 /// A context in which code is being synthesized (where a source location
12959 /// alone is not sufficient to identify the context). This covers template
12960 /// instantiation and various forms of implicitly-generated functions.
12962 /// The kind of template instantiation we are performing
12964 /// We are instantiating a template declaration. The entity is
12965 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
12967
12968 /// We are instantiating a default argument for a template
12969 /// parameter. The Entity is the template parameter whose argument is
12970 /// being instantiated, the Template is the template, and the
12971 /// TemplateArgs/NumTemplateArguments provide the template arguments as
12972 /// specified.
12974
12975 /// We are instantiating a default argument for a function.
12976 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
12977 /// provides the template arguments as specified.
12979
12980 /// We are substituting explicit template arguments provided for
12981 /// a function template. The entity is a FunctionTemplateDecl.
12983
12984 /// We are substituting template argument determined as part of
12985 /// template argument deduction for either a class template
12986 /// partial specialization or a function template. The
12987 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
12988 /// a TemplateDecl.
12990
12991 /// We are substituting into a lambda expression.
12993
12994 /// We are substituting prior template arguments into a new
12995 /// template parameter. The template parameter itself is either a
12996 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
12998
12999 /// We are checking the validity of a default template argument that
13000 /// has been used when naming a template-id.
13002
13003 /// We are computing the exception specification for a defaulted special
13004 /// member function.
13006
13007 /// We are instantiating the exception specification for a function
13008 /// template which was deferred until it was needed.
13010
13011 /// We are instantiating a requirement of a requires expression.
13013
13014 /// We are checking the satisfaction of a nested requirement of a requires
13015 /// expression.
13017
13018 /// We are declaring an implicit special member function.
13020
13021 /// We are declaring an implicit 'operator==' for a defaulted
13022 /// 'operator<=>'.
13024
13025 /// We are defining a synthesized function (such as a defaulted special
13026 /// member).
13028
13029 // We are checking the constraints associated with a constrained entity or
13030 // the constraint expression of a concept. This includes the checks that
13031 // atomic constraints have the type 'bool' and that they can be constant
13032 // evaluated.
13034
13035 // We are substituting template arguments into a constraint expression.
13037
13038 // We are normalizing a constraint expression.
13040
13041 // Instantiating a Requires Expression parameter clause.
13043
13044 // We are substituting into the parameter mapping of an atomic constraint
13045 // during normalization.
13047
13048 /// We are rewriting a comparison operator in terms of an operator<=>.
13050
13051 /// We are initializing a structured binding.
13053
13054 /// We are marking a class as __dllexport.
13056
13057 /// We are building an implied call from __builtin_dump_struct. The
13058 /// arguments are in CallArgs.
13060
13061 /// Added for Template instantiation observation.
13062 /// Memoization means we are _not_ instantiating a template because
13063 /// it is already instantiated (but we entered a context where we
13064 /// would have had to if it was not already instantiated).
13066
13067 /// We are building deduction guides for a class.
13069
13070 /// We are instantiating a type alias template declaration.
13072
13073 /// We are performing partial ordering for template template parameters.
13075 } Kind;
13076
13077 /// Was the enclosing context a non-instantiation SFINAE context?
13079
13080 /// Whether we're substituting into constraints.
13082
13083 /// The point of instantiation or synthesis within the source code.
13085
13086 /// The entity that is being synthesized.
13088
13089 /// The template (or partial specialization) in which we are
13090 /// performing the instantiation, for substitutions of prior template
13091 /// arguments.
13093
13094 union {
13095 /// The list of template arguments we are substituting, if they
13096 /// are not part of the entity.
13098
13099 /// The list of argument expressions in a synthesized call.
13100 const Expr *const *CallArgs;
13101 };
13102
13103 // FIXME: Wrap this union around more members, or perhaps store the
13104 // kind-specific members in the RAII object owning the context.
13105 union {
13106 /// The number of template arguments in TemplateArgs.
13108
13109 /// The number of expressions in CallArgs.
13110 unsigned NumCallArgs;
13111
13112 /// The special member being declared or defined.
13114 };
13115
13120
13121 /// The template deduction info object associated with the
13122 /// substitution or checking of explicit or deduced template arguments.
13124
13125 /// The source range that covers the construct that cause
13126 /// the instantiation, e.g., the template-id that causes a class
13127 /// template instantiation.
13129
13135
13136 /// Determines whether this template is an actual instantiation
13137 /// that should be counted toward the maximum instantiation depth.
13138 bool isInstantiationRecord() const;
13139 };
13140
13141 /// A stack object to be created when performing template
13142 /// instantiation.
13143 ///
13144 /// Construction of an object of type \c InstantiatingTemplate
13145 /// pushes the current instantiation onto the stack of active
13146 /// instantiations. If the size of this stack exceeds the maximum
13147 /// number of recursive template instantiations, construction
13148 /// produces an error and evaluates true.
13149 ///
13150 /// Destruction of this object will pop the named instantiation off
13151 /// the stack.
13153 /// Note that we are instantiating a class template,
13154 /// function template, variable template, alias template,
13155 /// or a member thereof.
13156 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13157 Decl *Entity,
13158 SourceRange InstantiationRange = SourceRange());
13159
13161 /// Note that we are instantiating an exception specification
13162 /// of a function template.
13163 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13165 SourceRange InstantiationRange = SourceRange());
13166
13167 /// Note that we are instantiating a type alias template declaration.
13168 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13169 TypeAliasTemplateDecl *Entity,
13170 ArrayRef<TemplateArgument> TemplateArgs,
13171 SourceRange InstantiationRange = SourceRange());
13172
13173 /// Note that we are instantiating a default argument in a
13174 /// template-id.
13175 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13177 ArrayRef<TemplateArgument> TemplateArgs,
13178 SourceRange InstantiationRange = SourceRange());
13179
13180 /// Note that we are substituting either explicitly-specified or
13181 /// deduced template arguments during function template argument deduction.
13182 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13184 ArrayRef<TemplateArgument> TemplateArgs,
13186 sema::TemplateDeductionInfo &DeductionInfo,
13187 SourceRange InstantiationRange = SourceRange());
13188
13189 /// Note that we are instantiating as part of template
13190 /// argument deduction for a class template declaration.
13191 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13193 ArrayRef<TemplateArgument> TemplateArgs,
13194 sema::TemplateDeductionInfo &DeductionInfo,
13195 SourceRange InstantiationRange = SourceRange());
13196
13197 /// Note that we are instantiating as part of template
13198 /// argument deduction for a class template partial
13199 /// specialization.
13200 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13202 ArrayRef<TemplateArgument> TemplateArgs,
13203 sema::TemplateDeductionInfo &DeductionInfo,
13204 SourceRange InstantiationRange = SourceRange());
13205
13206 /// Note that we are instantiating as part of template
13207 /// argument deduction for a variable template partial
13208 /// specialization.
13209 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13211 ArrayRef<TemplateArgument> TemplateArgs,
13212 sema::TemplateDeductionInfo &DeductionInfo,
13213 SourceRange InstantiationRange = SourceRange());
13214
13215 /// Note that we are instantiating a default argument for a function
13216 /// parameter.
13217 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13218 ParmVarDecl *Param,
13219 ArrayRef<TemplateArgument> TemplateArgs,
13220 SourceRange InstantiationRange = SourceRange());
13221
13222 /// Note that we are substituting prior template arguments into a
13223 /// non-type parameter.
13224 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13226 ArrayRef<TemplateArgument> TemplateArgs,
13227 SourceRange InstantiationRange);
13228
13229 /// Note that we are substituting prior template arguments into a
13230 /// template template parameter.
13231 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13233 ArrayRef<TemplateArgument> TemplateArgs,
13234 SourceRange InstantiationRange);
13235
13236 /// Note that we are checking the default template argument
13237 /// against the template parameter for a given template-id.
13238 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13240 ArrayRef<TemplateArgument> TemplateArgs,
13241 SourceRange InstantiationRange);
13242
13244 /// \brief Note that we are checking the constraints associated with some
13245 /// constrained entity (a concept declaration or a template with associated
13246 /// constraints).
13247 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13249 ArrayRef<TemplateArgument> TemplateArgs,
13250 SourceRange InstantiationRange);
13251
13253 /// \brief Note that we are checking a constraint expression associated
13254 /// with a template declaration or as part of the satisfaction check of a
13255 /// concept.
13256 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13258 sema::TemplateDeductionInfo &DeductionInfo,
13259 SourceRange InstantiationRange);
13260
13262 /// \brief Note that we are normalizing a constraint expression.
13263 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13265 SourceRange InstantiationRange);
13266
13268 /// \brief Note that we are subtituting into the parameter mapping of an
13269 /// atomic constraint during constraint normalization.
13270 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13272 SourceRange InstantiationRange);
13273
13274 /// \brief Note that we are substituting template arguments into a part of
13275 /// a requirement of a requires expression.
13276 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13278 sema::TemplateDeductionInfo &DeductionInfo,
13279 SourceRange InstantiationRange = SourceRange());
13280
13281 /// \brief Note that we are checking the satisfaction of the constraint
13282 /// expression inside of a nested requirement.
13283 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13285 SourceRange InstantiationRange = SourceRange());
13286
13287 /// \brief Note that we are checking a requires clause.
13288 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13289 const RequiresExpr *E,
13290 sema::TemplateDeductionInfo &DeductionInfo,
13291 SourceRange InstantiationRange);
13292
13294 /// \brief Note that we are building deduction guides.
13295 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13297 SourceRange InstantiationRange = SourceRange());
13298
13300 /// \brief Note that we are partial ordering template template parameters.
13301 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13303 SourceRange InstantiationRange = SourceRange());
13304
13305 /// Note that we have finished instantiating this template.
13306 void Clear();
13307
13309
13310 /// Determines whether we have exceeded the maximum
13311 /// recursive template instantiations.
13312 bool isInvalid() const { return Invalid; }
13313
13314 /// Determine whether we are already instantiating this
13315 /// specialization in some surrounding active instantiation.
13316 bool isAlreadyInstantiating() const { return AlreadyInstantiating; }
13317
13318 private:
13319 Sema &SemaRef;
13320 bool Invalid;
13321 bool AlreadyInstantiating;
13322 bool CheckInstantiationDepth(SourceLocation PointOfInstantiation,
13323 SourceRange InstantiationRange);
13324
13327 SourceLocation PointOfInstantiation,
13328 SourceRange InstantiationRange, Decl *Entity,
13329 NamedDecl *Template = nullptr,
13330 ArrayRef<TemplateArgument> TemplateArgs = {},
13331 sema::TemplateDeductionInfo *DeductionInfo = nullptr);
13332
13334
13335 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13336 };
13337
13338 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13339 const MultiLevelTemplateArgumentList &TemplateArgs,
13340 TemplateArgumentLoc &Output,
13341 SourceLocation Loc = {},
13342 const DeclarationName &Entity = {});
13343 bool
13344 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13345 const MultiLevelTemplateArgumentList &TemplateArgs,
13346 TemplateArgumentListInfo &Outputs);
13347
13348 /// Retrieve the template argument list(s) that should be used to
13349 /// instantiate the definition of the given declaration.
13350 ///
13351 /// \param ND the declaration for which we are computing template
13352 /// instantiation arguments.
13353 ///
13354 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13355 /// the decl context where it will be created. In this case, the `Innermost`
13356 /// should likely be provided. If ND is non-null, this is ignored.
13357 ///
13358 /// \param Innermost if non-NULL, specifies a template argument list for the
13359 /// template declaration passed as ND.
13360 ///
13361 /// \param RelativeToPrimary true if we should get the template
13362 /// arguments relative to the primary template, even when we're
13363 /// dealing with a specialization. This is only relevant for function
13364 /// template specializations.
13365 ///
13366 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13367 /// instantiating the definition of the given declaration, \p ND. This is
13368 /// used to determine the proper set of template instantiation arguments for
13369 /// friend function template specializations.
13370 ///
13371 /// \param ForConstraintInstantiation when collecting arguments,
13372 /// ForConstraintInstantiation indicates we should continue looking when
13373 /// encountering a lambda generic call operator, and continue looking for
13374 /// arguments on an enclosing class template.
13375 ///
13376 /// \param SkipForSpecialization when specified, any template specializations
13377 /// in a traversal would be ignored.
13378 ///
13379 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13380 /// when encountering a specialized member function template, rather than
13381 /// returning immediately.
13382 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13383 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13384 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13385 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13386 bool ForConstraintInstantiation = false,
13387 bool SkipForSpecialization = false,
13388 bool ForDefaultArgumentSubstitution = false);
13389
13390 /// RAII object to handle the state changes required to synthesize
13391 /// a function body.
13393 Sema &S;
13394 Sema::ContextRAII SavedContext;
13395 bool PushedCodeSynthesisContext = false;
13396
13397 public:
13399 : S(S), SavedContext(S, DC) {
13400 auto *FD = dyn_cast<FunctionDecl>(DC);
13401 S.PushFunctionScope();
13402 S.PushExpressionEvaluationContextForFunction(
13404 if (FD)
13405 FD->setWillHaveBody(true);
13406 else
13407 assert(isa<ObjCMethodDecl>(DC));
13408 }
13409
13411 assert(!PushedCodeSynthesisContext);
13412
13415 Ctx.PointOfInstantiation = UseLoc;
13416 Ctx.Entity = cast<Decl>(S.CurContext);
13417 S.pushCodeSynthesisContext(Ctx);
13418
13419 PushedCodeSynthesisContext = true;
13420 }
13421
13423 if (PushedCodeSynthesisContext)
13424 S.popCodeSynthesisContext();
13425 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13426 FD->setWillHaveBody(false);
13427 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13428 }
13429 S.PopExpressionEvaluationContext();
13430 S.PopFunctionScopeInfo();
13431 }
13432 };
13433
13434 /// List of active code synthesis contexts.
13435 ///
13436 /// This vector is treated as a stack. As synthesis of one entity requires
13437 /// synthesis of another, additional contexts are pushed onto the stack.
13439
13440 /// Specializations whose definitions are currently being instantiated.
13441 llvm::DenseSet<std::pair<Decl *, unsigned>> InstantiatingSpecializations;
13442
13443 /// Non-dependent types used in templates that have already been instantiated
13444 /// by some template instantiation.
13445 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13446
13447 /// Extra modules inspected when performing a lookup during a template
13448 /// instantiation. Computed lazily.
13450
13451 /// Cache of additional modules that should be used for name lookup
13452 /// within the current template instantiation. Computed lazily; use
13453 /// getLookupModules() to get a complete set.
13454 llvm::DenseSet<Module *> LookupModulesCache;
13455
13456 /// Map from the most recent declaration of a namespace to the most
13457 /// recent visible declaration of that namespace.
13458 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13459
13460 /// Whether we are in a SFINAE context that is not associated with
13461 /// template instantiation.
13462 ///
13463 /// This is used when setting up a SFINAE trap (\c see SFINAETrap) outside
13464 /// of a template instantiation or template argument deduction.
13466
13467 /// The number of \p CodeSynthesisContexts that are not template
13468 /// instantiations and, therefore, should not be counted as part of the
13469 /// instantiation depth.
13470 ///
13471 /// When the instantiation depth reaches the user-configurable limit
13472 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13473 // FIXME: Should we have a similar limit for other forms of synthesis?
13475
13476 /// The depth of the context stack at the point when the most recent
13477 /// error or warning was produced.
13478 ///
13479 /// This value is used to suppress printing of redundant context stacks
13480 /// when there are multiple errors or warnings in the same instantiation.
13481 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13483
13484 /// The template instantiation callbacks to trace or track
13485 /// instantiations (objects can be chained).
13486 ///
13487 /// This callbacks is used to print, trace or track template
13488 /// instantiations as they are being constructed.
13489 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13491
13492 /// The current index into pack expansion arguments that will be
13493 /// used for substitution of parameter packs.
13494 ///
13495 /// The pack expansion index will be none to indicate that parameter packs
13496 /// should be instantiated as themselves. Otherwise, the index specifies
13497 /// which argument within the parameter pack will be used for substitution.
13499
13500 /// RAII object used to change the argument pack substitution index
13501 /// within a \c Sema object.
13502 ///
13503 /// See \c ArgPackSubstIndex for more information.
13505 Sema &Self;
13506 UnsignedOrNone OldSubstIndex;
13507
13508 public:
13510 : Self(Self),
13511 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13512
13513 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13514 };
13515
13516 void pushCodeSynthesisContext(CodeSynthesisContext Ctx);
13518
13529 /// Prints the current instantiation stack through a series of
13530 /// notes.
13535
13536 /// Determines whether we are currently in a context where
13537 /// template argument substitution failures are not considered
13538 /// errors.
13539 ///
13540 /// \returns An empty \c Optional if we're not in a SFINAE context.
13541 /// Otherwise, contains a pointer that, if non-NULL, contains the nearest
13542 /// template-deduction context object, which can be used to capture
13543 /// diagnostics that will be suppressed.
13544 std::optional<sema::TemplateDeductionInfo *> isSFINAEContext() const;
13545
13546 /// Perform substitution on the type T with a given set of template
13547 /// arguments.
13548 ///
13549 /// This routine substitutes the given template arguments into the
13550 /// type T and produces the instantiated type.
13551 ///
13552 /// \param T the type into which the template arguments will be
13553 /// substituted. If this type is not dependent, it will be returned
13554 /// immediately.
13555 ///
13556 /// \param Args the template arguments that will be
13557 /// substituted for the top-level template parameters within T.
13558 ///
13559 /// \param Loc the location in the source code where this substitution
13560 /// is being performed. It will typically be the location of the
13561 /// declarator (if we're instantiating the type of some declaration)
13562 /// or the location of the type in the source code (if, e.g., we're
13563 /// instantiating the type of a cast expression).
13564 ///
13565 /// \param Entity the name of the entity associated with a declaration
13566 /// being instantiated (if any). May be empty to indicate that there
13567 /// is no such entity (if, e.g., this is a type that occurs as part of
13568 /// a cast expression) or that the entity has no name (e.g., an
13569 /// unnamed function parameter).
13570 ///
13571 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13572 /// acceptable as the top level type of the result.
13573 ///
13574 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13575 /// whenever substitution would perform a replacement with a null or
13576 /// non-existent template argument.
13577 ///
13578 /// \returns If the instantiation succeeds, the instantiated
13579 /// type. Otherwise, produces diagnostics and returns a NULL type.
13581 const MultiLevelTemplateArgumentList &TemplateArgs,
13582 SourceLocation Loc, DeclarationName Entity,
13583 bool AllowDeducedTST = false);
13584
13586 const MultiLevelTemplateArgumentList &TemplateArgs,
13587 SourceLocation Loc, DeclarationName Entity,
13588 bool *IsIncompleteSubstitution = nullptr);
13589
13591 const MultiLevelTemplateArgumentList &TemplateArgs,
13592 SourceLocation Loc, DeclarationName Entity);
13593
13594 /// A form of SubstType intended specifically for instantiating the
13595 /// type of a FunctionDecl. Its purpose is solely to force the
13596 /// instantiation of default-argument expressions and to avoid
13597 /// instantiating an exception-specification.
13599 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13600 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13601 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13603 const MultiLevelTemplateArgumentList &Args);
13606 SmallVectorImpl<QualType> &ExceptionStorage,
13607 const MultiLevelTemplateArgumentList &Args);
13608 ParmVarDecl *
13610 const MultiLevelTemplateArgumentList &TemplateArgs,
13611 int indexAdjustment, UnsignedOrNone NumExpansions,
13612 bool ExpectParameterPack, bool EvaluateConstraints = true);
13613
13614 /// Substitute the given template arguments into the given set of
13615 /// parameters, producing the set of parameter types that would be generated
13616 /// from such a substitution.
13618 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13619 const MultiLevelTemplateArgumentList &TemplateArgs,
13620 SmallVectorImpl<QualType> &ParamTypes,
13622 ExtParameterInfoBuilder &ParamInfos);
13623
13624 /// Substitute the given template arguments into the default argument.
13626 const MultiLevelTemplateArgumentList &TemplateArgs,
13627 bool ForCallExpr = false);
13629 const MultiLevelTemplateArgumentList &TemplateArgs);
13630 /// Substitute an expression as if it is a address-of-operand, which makes it
13631 /// act like a CXXIdExpression rather than an attempt to call.
13633 const MultiLevelTemplateArgumentList &TemplateArgs);
13634
13635 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13636 // to disable constraint evaluation, then restore the state.
13637 template <typename InstTy> struct ConstraintEvalRAII {
13638 InstTy &TI;
13640
13642 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13643 TI.setEvaluateConstraints(false);
13644 }
13645 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13646 };
13647
13648 // Must be used instead of SubstExpr at 'constraint checking' time.
13651 const MultiLevelTemplateArgumentList &TemplateArgs);
13652 // Unlike the above, this does not evaluate constraints.
13654 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13655
13656 /// Substitute the given template arguments into a list of
13657 /// expressions, expanding pack expansions if required.
13658 ///
13659 /// \param Exprs The list of expressions to substitute into.
13660 ///
13661 /// \param IsCall Whether this is some form of call, in which case
13662 /// default arguments will be dropped.
13663 ///
13664 /// \param TemplateArgs The set of template arguments to substitute.
13665 ///
13666 /// \param Outputs Will receive all of the substituted arguments.
13667 ///
13668 /// \returns true if an error occurred, false otherwise.
13669 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13670 const MultiLevelTemplateArgumentList &TemplateArgs,
13671 SmallVectorImpl<Expr *> &Outputs);
13672
13674 const MultiLevelTemplateArgumentList &TemplateArgs);
13675
13678 bool CXXDirectInit);
13679
13680 /// Perform substitution on the base class specifiers of the
13681 /// given class template specialization.
13682 ///
13683 /// Produces a diagnostic and returns true on error, returns false and
13684 /// attaches the instantiated base classes to the class template
13685 /// specialization if successful.
13686 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13687 const MultiLevelTemplateArgumentList &TemplateArgs);
13688
13689 /// Instantiate the definition of a class from a given pattern.
13690 ///
13691 /// \param PointOfInstantiation The point of instantiation within the
13692 /// source code.
13693 ///
13694 /// \param Instantiation is the declaration whose definition is being
13695 /// instantiated. This will be either a class template specialization
13696 /// or a member class of a class template specialization.
13697 ///
13698 /// \param Pattern is the pattern from which the instantiation
13699 /// occurs. This will be either the declaration of a class template or
13700 /// the declaration of a member class of a class template.
13701 ///
13702 /// \param TemplateArgs The template arguments to be substituted into
13703 /// the pattern.
13704 ///
13705 /// \param TSK the kind of implicit or explicit instantiation to perform.
13706 ///
13707 /// \param Complain whether to complain if the class cannot be instantiated
13708 /// due to the lack of a definition.
13709 ///
13710 /// \returns true if an error occurred, false otherwise.
13711 bool InstantiateClass(SourceLocation PointOfInstantiation,
13712 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13713 const MultiLevelTemplateArgumentList &TemplateArgs,
13714 TemplateSpecializationKind TSK, bool Complain = true);
13715
13716 /// Instantiate the definition of an enum from a given pattern.
13717 ///
13718 /// \param PointOfInstantiation The point of instantiation within the
13719 /// source code.
13720 /// \param Instantiation is the declaration whose definition is being
13721 /// instantiated. This will be a member enumeration of a class
13722 /// temploid specialization, or a local enumeration within a
13723 /// function temploid specialization.
13724 /// \param Pattern The templated declaration from which the instantiation
13725 /// occurs.
13726 /// \param TemplateArgs The template arguments to be substituted into
13727 /// the pattern.
13728 /// \param TSK The kind of implicit or explicit instantiation to perform.
13729 ///
13730 /// \return \c true if an error occurred, \c false otherwise.
13731 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13732 EnumDecl *Instantiation, EnumDecl *Pattern,
13733 const MultiLevelTemplateArgumentList &TemplateArgs,
13735
13736 /// Instantiate the definition of a field from the given pattern.
13737 ///
13738 /// \param PointOfInstantiation The point of instantiation within the
13739 /// source code.
13740 /// \param Instantiation is the declaration whose definition is being
13741 /// instantiated. This will be a class of a class temploid
13742 /// specialization, or a local enumeration within a function temploid
13743 /// specialization.
13744 /// \param Pattern The templated declaration from which the instantiation
13745 /// occurs.
13746 /// \param TemplateArgs The template arguments to be substituted into
13747 /// the pattern.
13748 ///
13749 /// \return \c true if an error occurred, \c false otherwise.
13751 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
13752 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
13753
13755 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
13756
13758 SourceLocation PointOfInstantiation,
13759 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13760 TemplateSpecializationKind TSK, bool Complain,
13761 bool PrimaryStrictPackMatch);
13762
13763 /// Instantiates the definitions of all of the member
13764 /// of the given class, which is an instantiation of a class template
13765 /// or a member class of a template.
13766 void
13767 InstantiateClassMembers(SourceLocation PointOfInstantiation,
13768 CXXRecordDecl *Instantiation,
13769 const MultiLevelTemplateArgumentList &TemplateArgs,
13771
13772 /// Instantiate the definitions of all of the members of the
13773 /// given class template specialization, which was named as part of an
13774 /// explicit instantiation.
13776 SourceLocation PointOfInstantiation,
13777 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13779
13782 const MultiLevelTemplateArgumentList &TemplateArgs);
13783
13784 /// Do template substitution on declaration name info.
13787 const MultiLevelTemplateArgumentList &TemplateArgs);
13789 SubstTemplateName(SourceLocation TemplateKWLoc,
13790 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
13791 SourceLocation NameLoc,
13792 const MultiLevelTemplateArgumentList &TemplateArgs);
13793
13795 const MultiLevelTemplateArgumentList &TemplateArgs,
13796 bool EvaluateConstraint);
13797
13798 /// Determine whether we are currently performing template instantiation.
13801 }
13802
13803 /// Determine whether we are currently performing constraint substitution.
13805 return !CodeSynthesisContexts.empty() &&
13806 CodeSynthesisContexts.back().InConstraintSubstitution;
13807 }
13808
13809 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
13810
13811 /// \brief create a Requirement::SubstitutionDiagnostic with only a
13812 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
13815
13816 ///@}
13817
13818 //
13819 //
13820 // -------------------------------------------------------------------------
13821 //
13822 //
13823
13824 /// \name C++ Template Declaration Instantiation
13825 /// Implementations are in SemaTemplateInstantiateDecl.cpp
13826 ///@{
13827
13828public:
13829 /// An entity for which implicit template instantiation is required.
13830 ///
13831 /// The source location associated with the declaration is the first place in
13832 /// the source code where the declaration was "used". It is not necessarily
13833 /// the point of instantiation (which will be either before or after the
13834 /// namespace-scope declaration that triggered this implicit instantiation),
13835 /// However, it is the location that diagnostics should generally refer to,
13836 /// because users will need to know what code triggered the instantiation.
13837 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
13838
13839 /// The queue of implicit template instantiations that are required
13840 /// but have not yet been performed.
13841 std::deque<PendingImplicitInstantiation> PendingInstantiations;
13842
13843 /// Queue of implicit template instantiations that cannot be performed
13844 /// eagerly.
13846
13850
13851 /// The queue of implicit template instantiations that are required
13852 /// and must be performed within the current local scope.
13853 ///
13854 /// This queue is only used for member functions of local classes in
13855 /// templates, which must be instantiated in the same scope as their
13856 /// enclosing function, so that they can reference function-local
13857 /// types, static variables, enumerators, etc.
13858 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
13859
13861 public:
13863 : S(S), AtEndOfTU(AtEndOfTU) {
13864 SavedPendingLocalImplicitInstantiations.swap(
13865 S.PendingLocalImplicitInstantiations);
13866 }
13867
13868 void perform() {
13869 S.PerformPendingInstantiations(/*LocalOnly=*/true,
13870 /*AtEndOfTU=*/AtEndOfTU);
13871 }
13872
13874 assert(S.PendingLocalImplicitInstantiations.empty() &&
13875 "there shouldn't be any pending local implicit instantiations");
13876 SavedPendingLocalImplicitInstantiations.swap(
13877 S.PendingLocalImplicitInstantiations);
13878 }
13879
13880 private:
13881 Sema &S;
13882 bool AtEndOfTU;
13883 std::deque<PendingImplicitInstantiation>
13884 SavedPendingLocalImplicitInstantiations;
13885 };
13886
13887 /// Records and restores the CurFPFeatures state on entry/exit of compound
13888 /// statements.
13890 public:
13893 FPOptionsOverride getOverrides() { return OldOverrides; }
13894
13895 private:
13896 Sema &S;
13897 FPOptions OldFPFeaturesState;
13898 FPOptionsOverride OldOverrides;
13899 LangOptions::FPEvalMethodKind OldEvalMethod;
13900 SourceLocation OldFPPragmaLocation;
13901 };
13902
13904 public:
13905 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
13906 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
13907 if (!Enabled)
13908 return;
13909
13910 S.SavedPendingInstantiations.emplace_back();
13911 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
13912
13913 S.SavedVTableUses.emplace_back();
13914 S.SavedVTableUses.back().swap(S.VTableUses);
13915 }
13916
13917 void perform() {
13918 if (Enabled) {
13919 S.DefineUsedVTables();
13920 S.PerformPendingInstantiations(/*LocalOnly=*/false,
13921 /*AtEndOfTU=*/AtEndOfTU);
13922 }
13923 }
13924
13926 if (!Enabled)
13927 return;
13928
13929 // Restore the set of pending vtables.
13930 assert(S.VTableUses.empty() &&
13931 "VTableUses should be empty before it is discarded.");
13932 S.VTableUses.swap(S.SavedVTableUses.back());
13933 S.SavedVTableUses.pop_back();
13934
13935 // Restore the set of pending implicit instantiations.
13936 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
13937 AtEndOfTU) {
13938 assert(S.PendingInstantiations.empty() &&
13939 "PendingInstantiations should be empty before it is discarded.");
13940 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13941 S.SavedPendingInstantiations.pop_back();
13942 } else {
13943 // Template instantiations in the PCH may be delayed until the TU.
13944 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13945 S.PendingInstantiations.insert(
13946 S.PendingInstantiations.end(),
13947 S.SavedPendingInstantiations.back().begin(),
13948 S.SavedPendingInstantiations.back().end());
13949 S.SavedPendingInstantiations.pop_back();
13950 }
13951 }
13952
13953 private:
13954 Sema &S;
13955 bool Enabled;
13956 bool AtEndOfTU;
13957 };
13958
13960 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
13961
13972
13973 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
13974 const Decl *Pattern, Decl *Inst,
13975 LateInstantiatedAttrVec *LateAttrs = nullptr,
13976 LocalInstantiationScope *OuterMostScope = nullptr);
13977
13978 /// Update instantiation attributes after template was late parsed.
13979 ///
13980 /// Some attributes are evaluated based on the body of template. If it is
13981 /// late parsed, such attributes cannot be evaluated when declaration is
13982 /// instantiated. This function is used to update instantiation attributes
13983 /// when template definition is ready.
13984 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
13985
13986 void
13988 const Decl *Pattern, Decl *Inst,
13989 LateInstantiatedAttrVec *LateAttrs = nullptr,
13990 LocalInstantiationScope *OuterMostScope = nullptr);
13991
13992 /// In the MS ABI, we need to instantiate default arguments of dllexported
13993 /// default constructors along with the constructor definition. This allows IR
13994 /// gen to emit a constructor closure which calls the default constructor with
13995 /// its default arguments.
13997
13999 ParmVarDecl *Param);
14000 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14002
14003 /// Instantiate (or find existing instantiation of) a function template with a
14004 /// given set of template arguments.
14005 ///
14006 /// Usually this should not be used, and template argument deduction should be
14007 /// used in its place.
14010 SourceLocation Loc,
14013
14014 /// Instantiate the definition of the given function from its
14015 /// template.
14016 ///
14017 /// \param PointOfInstantiation the point at which the instantiation was
14018 /// required. Note that this is not precisely a "point of instantiation"
14019 /// for the function, but it's close.
14020 ///
14021 /// \param Function the already-instantiated declaration of a
14022 /// function template specialization or member function of a class template
14023 /// specialization.
14024 ///
14025 /// \param Recursive if true, recursively instantiates any functions that
14026 /// are required by this instantiation.
14027 ///
14028 /// \param DefinitionRequired if true, then we are performing an explicit
14029 /// instantiation where the body of the function is required. Complain if
14030 /// there is no such body.
14031 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14033 bool Recursive = false,
14034 bool DefinitionRequired = false,
14035 bool AtEndOfTU = false);
14038 const TemplateArgumentList *PartialSpecArgs,
14040 SourceLocation PointOfInstantiation,
14041 LateInstantiatedAttrVec *LateAttrs = nullptr,
14042 LocalInstantiationScope *StartingScope = nullptr);
14043
14044 /// Instantiates a variable template specialization by completing it
14045 /// with appropriate type information and initializer.
14047 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14048 const MultiLevelTemplateArgumentList &TemplateArgs);
14049
14050 /// BuildVariableInstantiation - Used after a new variable has been created.
14051 /// Sets basic variable data and decides whether to postpone the
14052 /// variable instantiation.
14053 void
14055 const MultiLevelTemplateArgumentList &TemplateArgs,
14056 LateInstantiatedAttrVec *LateAttrs,
14057 DeclContext *Owner,
14058 LocalInstantiationScope *StartingScope,
14059 bool InstantiatingVarTemplate = false,
14060 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14061
14062 /// Instantiate the initializer of a variable.
14064 VarDecl *Var, VarDecl *OldVar,
14065 const MultiLevelTemplateArgumentList &TemplateArgs);
14066
14067 /// Instantiate the definition of the given variable from its
14068 /// template.
14069 ///
14070 /// \param PointOfInstantiation the point at which the instantiation was
14071 /// required. Note that this is not precisely a "point of instantiation"
14072 /// for the variable, but it's close.
14073 ///
14074 /// \param Var the already-instantiated declaration of a templated variable.
14075 ///
14076 /// \param Recursive if true, recursively instantiates any functions that
14077 /// are required by this instantiation.
14078 ///
14079 /// \param DefinitionRequired if true, then we are performing an explicit
14080 /// instantiation where a definition of the variable is required. Complain
14081 /// if there is no such definition.
14082 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14083 VarDecl *Var, bool Recursive = false,
14084 bool DefinitionRequired = false,
14085 bool AtEndOfTU = false);
14086
14089 const MultiLevelTemplateArgumentList &TemplateArgs);
14090
14091 /// Find the instantiation of the given declaration within the
14092 /// current instantiation.
14093 ///
14094 /// This routine is intended to be used when \p D is a declaration
14095 /// referenced from within a template, that needs to mapped into the
14096 /// corresponding declaration within an instantiation. For example,
14097 /// given:
14098 ///
14099 /// \code
14100 /// template<typename T>
14101 /// struct X {
14102 /// enum Kind {
14103 /// KnownValue = sizeof(T)
14104 /// };
14105 ///
14106 /// bool getKind() const { return KnownValue; }
14107 /// };
14108 ///
14109 /// template struct X<int>;
14110 /// \endcode
14111 ///
14112 /// In the instantiation of X<int>::getKind(), we need to map the \p
14113 /// EnumConstantDecl for \p KnownValue (which refers to
14114 /// X<T>::<Kind>::KnownValue) to its instantiation
14115 /// (X<int>::<Kind>::KnownValue).
14116 /// \p FindInstantiatedDecl performs this mapping from within the
14117 /// instantiation of X<int>.
14118 NamedDecl *
14120 const MultiLevelTemplateArgumentList &TemplateArgs,
14121 bool FindingInstantiatedContext = false);
14122
14123 /// Finds the instantiation of the given declaration context
14124 /// within the current instantiation.
14125 ///
14126 /// \returns NULL if there was an error
14127 DeclContext *
14129 const MultiLevelTemplateArgumentList &TemplateArgs);
14130
14131 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14132 const MultiLevelTemplateArgumentList &TemplateArgs);
14133
14134 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14135 /// an implicit 'operator=='.
14137 FunctionDecl *Spaceship);
14138
14139 /// Performs template instantiation for all implicit template
14140 /// instantiations we have seen until this point.
14141 void PerformPendingInstantiations(bool LocalOnly = false,
14142 bool AtEndOfTU = true);
14143
14146 const MultiLevelTemplateArgumentList &TemplateArgs,
14147 bool EvaluateConstraints = true);
14148
14150 const DeclContext *Pattern,
14151 const MultiLevelTemplateArgumentList &TemplateArgs);
14152
14153private:
14154 /// Introduce the instantiated local variables into the local
14155 /// instantiation scope.
14156 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14157 const FunctionDecl *PatternDecl,
14159 /// Introduce the instantiated function parameters into the local
14160 /// instantiation scope, and set the parameter names to those used
14161 /// in the template.
14162 bool addInstantiatedParametersToScope(
14163 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14165 const MultiLevelTemplateArgumentList &TemplateArgs);
14166
14167 /// Introduce the instantiated captures of the lambda into the local
14168 /// instantiation scope.
14169 bool addInstantiatedCapturesToScope(
14170 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14172 const MultiLevelTemplateArgumentList &TemplateArgs);
14173
14174 int ParsingClassDepth = 0;
14175
14176 class SavePendingParsedClassStateRAII {
14177 public:
14178 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14179
14180 ~SavePendingParsedClassStateRAII() {
14181 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14182 "there shouldn't be any pending delayed exception spec checks");
14183 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14184 "there shouldn't be any pending delayed exception spec checks");
14185 swapSavedState();
14186 }
14187
14188 private:
14189 Sema &S;
14191 SavedOverridingExceptionSpecChecks;
14193 SavedEquivalentExceptionSpecChecks;
14194
14195 void swapSavedState() {
14196 SavedOverridingExceptionSpecChecks.swap(
14197 S.DelayedOverridingExceptionSpecChecks);
14198 SavedEquivalentExceptionSpecChecks.swap(
14199 S.DelayedEquivalentExceptionSpecChecks);
14200 }
14201 };
14202
14203 ///@}
14204
14205 //
14206 //
14207 // -------------------------------------------------------------------------
14208 //
14209 //
14210
14211 /// \name C++ Variadic Templates
14212 /// Implementations are in SemaTemplateVariadic.cpp
14213 ///@{
14214
14215public:
14216 /// Determine whether an unexpanded parameter pack might be permitted in this
14217 /// location. Useful for error recovery.
14219
14220 /// The context in which an unexpanded parameter pack is
14221 /// being diagnosed.
14222 ///
14223 /// Note that the values of this enumeration line up with the first
14224 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14226 /// An arbitrary expression.
14228
14229 /// The base type of a class type.
14231
14232 /// The type of an arbitrary declaration.
14234
14235 /// The type of a data member.
14237
14238 /// The size of a bit-field.
14240
14241 /// The expression in a static assertion.
14243
14244 /// The fixed underlying type of an enumeration.
14246
14247 /// The enumerator value.
14249
14250 /// A using declaration.
14252
14253 /// A friend declaration.
14255
14256 /// A declaration qualifier.
14258
14259 /// An initializer.
14261
14262 /// A default argument.
14264
14265 /// The type of a non-type template parameter.
14267
14268 /// The type of an exception.
14270
14271 /// Explicit specialization.
14273
14274 /// Partial specialization.
14276
14277 /// Microsoft __if_exists.
14279
14280 /// Microsoft __if_not_exists.
14282
14283 /// Lambda expression.
14285
14286 /// Block expression.
14288
14289 /// A type constraint.
14291
14292 // A requirement in a requires-expression.
14294
14295 // A requires-clause.
14297 };
14298
14299 /// Diagnose unexpanded parameter packs.
14300 ///
14301 /// \param Loc The location at which we should emit the diagnostic.
14302 ///
14303 /// \param UPPC The context in which we are diagnosing unexpanded
14304 /// parameter packs.
14305 ///
14306 /// \param Unexpanded the set of unexpanded parameter packs.
14307 ///
14308 /// \returns true if an error occurred, false otherwise.
14312
14313 /// If the given type contains an unexpanded parameter pack,
14314 /// diagnose the error.
14315 ///
14316 /// \param Loc The source location where a diagnostc should be emitted.
14317 ///
14318 /// \param T The type that is being checked for unexpanded parameter
14319 /// packs.
14320 ///
14321 /// \returns true if an error occurred, false otherwise.
14324
14325 /// If the given expression contains an unexpanded parameter
14326 /// pack, diagnose the error.
14327 ///
14328 /// \param E The expression that is being checked for unexpanded
14329 /// parameter packs.
14330 ///
14331 /// \returns true if an error occurred, false otherwise.
14334
14335 /// If the given requirees-expression contains an unexpanded reference to one
14336 /// of its own parameter packs, diagnose the error.
14337 ///
14338 /// \param RE The requiress-expression that is being checked for unexpanded
14339 /// parameter packs.
14340 ///
14341 /// \returns true if an error occurred, false otherwise.
14343
14344 /// If the given nested-name-specifier contains an unexpanded
14345 /// parameter pack, diagnose the error.
14346 ///
14347 /// \param SS The nested-name-specifier that is being checked for
14348 /// unexpanded parameter packs.
14349 ///
14350 /// \returns true if an error occurred, false otherwise.
14353
14354 /// If the given name contains an unexpanded parameter pack,
14355 /// diagnose the error.
14356 ///
14357 /// \param NameInfo The name (with source location information) that
14358 /// is being checked for unexpanded parameter packs.
14359 ///
14360 /// \returns true if an error occurred, false otherwise.
14363
14364 /// If the given template name contains an unexpanded parameter pack,
14365 /// diagnose the error.
14366 ///
14367 /// \param Loc The location of the template name.
14368 ///
14369 /// \param Template The template name that is being checked for unexpanded
14370 /// parameter packs.
14371 ///
14372 /// \returns true if an error occurred, false otherwise.
14376
14377 /// If the given template argument contains an unexpanded parameter
14378 /// pack, diagnose the error.
14379 ///
14380 /// \param Arg The template argument that is being checked for unexpanded
14381 /// parameter packs.
14382 ///
14383 /// \returns true if an error occurred, false otherwise.
14386
14387 /// Collect the set of unexpanded parameter packs within the given
14388 /// template argument.
14389 ///
14390 /// \param Arg The template argument that will be traversed to find
14391 /// unexpanded parameter packs.
14393 TemplateArgument Arg,
14395
14396 /// Collect the set of unexpanded parameter packs within the given
14397 /// template argument.
14398 ///
14399 /// \param Arg The template argument that will be traversed to find
14400 /// unexpanded parameter packs.
14404
14405 /// Collect the set of unexpanded parameter packs within the given
14406 /// type.
14407 ///
14408 /// \param T The type that will be traversed to find
14409 /// unexpanded parameter packs.
14412
14413 /// Collect the set of unexpanded parameter packs within the given
14414 /// type.
14415 ///
14416 /// \param TL The type that will be traversed to find
14417 /// unexpanded parameter packs.
14420
14421 /// Collect the set of unexpanded parameter packs within the given
14422 /// nested-name-specifier.
14423 ///
14424 /// \param NNS The nested-name-specifier that will be traversed to find
14425 /// unexpanded parameter packs.
14429
14430 /// Collect the set of unexpanded parameter packs within the given
14431 /// name.
14432 ///
14433 /// \param NameInfo The name that will be traversed to find
14434 /// unexpanded parameter packs.
14436 const DeclarationNameInfo &NameInfo,
14438
14439 /// Collect the set of unexpanded parameter packs within the given
14440 /// expression.
14443
14444 /// Invoked when parsing a template argument.
14445 ///
14446 /// \param Arg the template argument, which may already be invalid.
14447 ///
14448 /// If it is followed by ellipsis, this function is called before
14449 /// `ActOnPackExpansion`.
14452
14453 /// Invoked when parsing a template argument followed by an
14454 /// ellipsis, which creates a pack expansion.
14455 ///
14456 /// \param Arg The template argument preceding the ellipsis, which
14457 /// may already be invalid.
14458 ///
14459 /// \param EllipsisLoc The location of the ellipsis.
14461 SourceLocation EllipsisLoc);
14462
14463 /// Invoked when parsing a type followed by an ellipsis, which
14464 /// creates a pack expansion.
14465 ///
14466 /// \param Type The type preceding the ellipsis, which will become
14467 /// the pattern of the pack expansion.
14468 ///
14469 /// \param EllipsisLoc The location of the ellipsis.
14471
14472 /// Construct a pack expansion type from the pattern of the pack
14473 /// expansion.
14475 SourceLocation EllipsisLoc,
14476 UnsignedOrNone NumExpansions);
14477
14478 /// Construct a pack expansion type from the pattern of the pack
14479 /// expansion.
14480 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14481 SourceLocation EllipsisLoc,
14482 UnsignedOrNone NumExpansions);
14483
14484 /// Invoked when parsing an expression followed by an ellipsis, which
14485 /// creates a pack expansion.
14486 ///
14487 /// \param Pattern The expression preceding the ellipsis, which will become
14488 /// the pattern of the pack expansion.
14489 ///
14490 /// \param EllipsisLoc The location of the ellipsis.
14491 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14492
14493 /// Invoked when parsing an expression followed by an ellipsis, which
14494 /// creates a pack expansion.
14495 ///
14496 /// \param Pattern The expression preceding the ellipsis, which will become
14497 /// the pattern of the pack expansion.
14498 ///
14499 /// \param EllipsisLoc The location of the ellipsis.
14500 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14501 UnsignedOrNone NumExpansions);
14502
14503 /// Determine whether we could expand a pack expansion with the
14504 /// given set of parameter packs into separate arguments by repeatedly
14505 /// transforming the pattern.
14506 ///
14507 /// \param EllipsisLoc The location of the ellipsis that identifies the
14508 /// pack expansion.
14509 ///
14510 /// \param PatternRange The source range that covers the entire pattern of
14511 /// the pack expansion.
14512 ///
14513 /// \param Unexpanded The set of unexpanded parameter packs within the
14514 /// pattern.
14515 ///
14516 /// \param ShouldExpand Will be set to \c true if the transformer should
14517 /// expand the corresponding pack expansions into separate arguments. When
14518 /// set, \c NumExpansions must also be set.
14519 ///
14520 /// \param RetainExpansion Whether the caller should add an unexpanded
14521 /// pack expansion after all of the expanded arguments. This is used
14522 /// when extending explicitly-specified template argument packs per
14523 /// C++0x [temp.arg.explicit]p9.
14524 ///
14525 /// \param NumExpansions The number of separate arguments that will be in
14526 /// the expanded form of the corresponding pack expansion. This is both an
14527 /// input and an output parameter, which can be set by the caller if the
14528 /// number of expansions is known a priori (e.g., due to a prior substitution)
14529 /// and will be set by the callee when the number of expansions is known.
14530 /// The callee must set this value when \c ShouldExpand is \c true; it may
14531 /// set this value in other cases.
14532 ///
14533 /// \returns true if an error occurred (e.g., because the parameter packs
14534 /// are to be instantiated with arguments of different lengths), false
14535 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14536 /// must be set.
14538 SourceLocation EllipsisLoc, SourceRange PatternRange,
14540 const MultiLevelTemplateArgumentList &TemplateArgs,
14541 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14542 bool &RetainExpansion, UnsignedOrNone &NumExpansions);
14543
14544 /// Determine the number of arguments in the given pack expansion
14545 /// type.
14546 ///
14547 /// This routine assumes that the number of arguments in the expansion is
14548 /// consistent across all of the unexpanded parameter packs in its pattern.
14549 ///
14550 /// Returns an empty Optional if the type can't be expanded.
14552 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14553
14556 const MultiLevelTemplateArgumentList &TemplateArgs);
14557
14558 /// Determine whether the given declarator contains any unexpanded
14559 /// parameter packs.
14560 ///
14561 /// This routine is used by the parser to disambiguate function declarators
14562 /// with an ellipsis prior to the ')', e.g.,
14563 ///
14564 /// \code
14565 /// void f(T...);
14566 /// \endcode
14567 ///
14568 /// To determine whether we have an (unnamed) function parameter pack or
14569 /// a variadic function.
14570 ///
14571 /// \returns true if the declarator contains any unexpanded parameter packs,
14572 /// false otherwise.
14574
14575 /// Returns the pattern of the pack expansion for a template argument.
14576 ///
14577 /// \param OrigLoc The template argument to expand.
14578 ///
14579 /// \param Ellipsis Will be set to the location of the ellipsis.
14580 ///
14581 /// \param NumExpansions Will be set to the number of expansions that will
14582 /// be generated from this pack expansion, if known a priori.
14585 SourceLocation &Ellipsis,
14586 UnsignedOrNone &NumExpansions) const;
14587
14588 /// Given a template argument that contains an unexpanded parameter pack, but
14589 /// which has already been substituted, attempt to determine the number of
14590 /// elements that will be produced once this argument is fully-expanded.
14591 ///
14592 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14593 /// avoid actually expanding the pack where possible.
14595
14596 /// Called when an expression computing the size of a parameter pack
14597 /// is parsed.
14598 ///
14599 /// \code
14600 /// template<typename ...Types> struct count {
14601 /// static const unsigned value = sizeof...(Types);
14602 /// };
14603 /// \endcode
14604 ///
14605 //
14606 /// \param OpLoc The location of the "sizeof" keyword.
14607 /// \param Name The name of the parameter pack whose size will be determined.
14608 /// \param NameLoc The source location of the name of the parameter pack.
14609 /// \param RParenLoc The location of the closing parentheses.
14611 IdentifierInfo &Name,
14612 SourceLocation NameLoc,
14613 SourceLocation RParenLoc);
14614
14615 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14616 SourceLocation EllipsisLoc,
14617 SourceLocation LSquareLoc, Expr *IndexExpr,
14618 SourceLocation RSquareLoc);
14619
14620 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14621 SourceLocation EllipsisLoc, Expr *IndexExpr,
14622 SourceLocation RSquareLoc,
14623 ArrayRef<Expr *> ExpandedExprs = {},
14624 bool FullySubstituted = false);
14625
14626 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14627 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14628 tok::TokenKind Operator,
14629 SourceLocation EllipsisLoc, Expr *RHS,
14630 SourceLocation RParenLoc);
14631 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14632 SourceLocation LParenLoc, Expr *LHS,
14633 BinaryOperatorKind Operator,
14634 SourceLocation EllipsisLoc, Expr *RHS,
14635 SourceLocation RParenLoc,
14636 UnsignedOrNone NumExpansions);
14637 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14638 BinaryOperatorKind Operator);
14639
14640 ///@}
14641
14642 //
14643 //
14644 // -------------------------------------------------------------------------
14645 //
14646 //
14647
14648 /// \name Constraints and Concepts
14649 /// Implementations are in SemaConcept.cpp
14650 ///@{
14651
14652public:
14654 const llvm::FoldingSetNodeID &ID) {
14655 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14656 SatisfactionStack.emplace_back(Can, ID);
14657 }
14658
14659 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14660
14662 const llvm::FoldingSetNodeID &ID) const {
14663 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14664 return llvm::is_contained(SatisfactionStack,
14665 SatisfactionStackEntryTy{Can, ID});
14666 }
14667
14669 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14670
14671 // Resets the current SatisfactionStack for cases where we are instantiating
14672 // constraints as a 'side effect' of normal instantiation in a way that is not
14673 // indicative of recursive definition.
14676 Sema &SemaRef;
14677
14678 public:
14680 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14681 }
14682
14684 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14685 }
14686 };
14687
14690 SatisfactionStack.swap(NewSS);
14691 }
14692
14693 /// Check whether the given expression is a valid constraint expression.
14694 /// A diagnostic is emitted if it is not, false is returned, and
14695 /// PossibleNonPrimary will be set to true if the failure might be due to a
14696 /// non-primary expression being used as an atomic constraint.
14697 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14698 bool *PossibleNonPrimary = nullptr,
14699 bool IsTrailingRequiresClause = false);
14700
14701 /// \brief Check whether the given list of constraint expressions are
14702 /// satisfied (as if in a 'conjunction') given template arguments.
14703 /// \param Template the template-like entity that triggered the constraints
14704 /// check (either a concept or a constrained entity).
14705 /// \param ConstraintExprs a list of constraint expressions, treated as if
14706 /// they were 'AND'ed together.
14707 /// \param TemplateArgLists the list of template arguments to substitute into
14708 /// the constraint expression.
14709 /// \param TemplateIDRange The source range of the template id that
14710 /// caused the constraints check.
14711 /// \param Satisfaction if true is returned, will contain details of the
14712 /// satisfaction, with enough information to diagnose an unsatisfied
14713 /// expression.
14714 /// \returns true if an error occurred and satisfaction could not be checked,
14715 /// false otherwise.
14717 const NamedDecl *Template,
14718 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14719 const MultiLevelTemplateArgumentList &TemplateArgLists,
14720 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction) {
14722 return CheckConstraintSatisfaction(Template, AssociatedConstraints,
14723 Converted, TemplateArgLists,
14724 TemplateIDRange, Satisfaction);
14725 }
14726
14727 /// \brief Check whether the given list of constraint expressions are
14728 /// satisfied (as if in a 'conjunction') given template arguments.
14729 /// Additionally, takes an empty list of Expressions which is populated with
14730 /// the instantiated versions of the ConstraintExprs.
14731 /// \param Template the template-like entity that triggered the constraints
14732 /// check (either a concept or a constrained entity).
14733 /// \param ConstraintExprs a list of constraint expressions, treated as if
14734 /// they were 'AND'ed together.
14735 /// \param ConvertedConstraints a out parameter that will get populated with
14736 /// the instantiated version of the ConstraintExprs if we successfully checked
14737 /// satisfaction.
14738 /// \param TemplateArgList the multi-level list of template arguments to
14739 /// substitute into the constraint expression. This should be relative to the
14740 /// top-level (hence multi-level), since we need to instantiate fully at the
14741 /// time of checking.
14742 /// \param TemplateIDRange The source range of the template id that
14743 /// caused the constraints check.
14744 /// \param Satisfaction if true is returned, will contain details of the
14745 /// satisfaction, with enough information to diagnose an unsatisfied
14746 /// expression.
14747 /// \returns true if an error occurred and satisfaction could not be checked,
14748 /// false otherwise.
14750 const NamedDecl *Template,
14751 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14752 llvm::SmallVectorImpl<Expr *> &ConvertedConstraints,
14753 const MultiLevelTemplateArgumentList &TemplateArgList,
14754 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction);
14755
14756 /// \brief Check whether the given non-dependent constraint expression is
14757 /// satisfied. Returns false and updates Satisfaction with the satisfaction
14758 /// verdict if successful, emits a diagnostic and returns true if an error
14759 /// occurred and satisfaction could not be determined.
14760 ///
14761 /// \returns true if an error occurred, false otherwise.
14762 bool
14764 ConstraintSatisfaction &Satisfaction);
14765
14766 /// Check whether the given function decl's trailing requires clause is
14767 /// satisfied, if any. Returns false and updates Satisfaction with the
14768 /// satisfaction verdict if successful, emits a diagnostic and returns true if
14769 /// an error occurred and satisfaction could not be determined.
14770 ///
14771 /// \returns true if an error occurred, false otherwise.
14773 ConstraintSatisfaction &Satisfaction,
14774 SourceLocation UsageLoc = SourceLocation(),
14775 bool ForOverloadResolution = false);
14776
14777 // Calculates whether two constraint expressions are equal irrespective of a
14778 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
14779 // 'New', which are the "source" of the constraint, since this is necessary
14780 // for figuring out the relative 'depth' of the constraint. The depth of the
14781 // 'primary template' and the 'instantiated from' templates aren't necessarily
14782 // the same, such as a case when one is a 'friend' defined in a class.
14784 const Expr *OldConstr,
14785 const TemplateCompareNewDeclInfo &New,
14786 const Expr *NewConstr);
14787
14788 // Calculates whether the friend function depends on an enclosing template for
14789 // the purposes of [temp.friend] p9.
14791
14792 /// \brief Ensure that the given template arguments satisfy the constraints
14793 /// associated with the given template, emitting a diagnostic if they do not.
14794 ///
14795 /// \param Template The template to which the template arguments are being
14796 /// provided.
14797 ///
14798 /// \param TemplateArgs The converted, canonicalized template arguments.
14799 ///
14800 /// \param TemplateIDRange The source range of the template id that
14801 /// caused the constraints check.
14802 ///
14803 /// \returns true if the constrains are not satisfied or could not be checked
14804 /// for satisfaction, false if the constraints are satisfied.
14807 const MultiLevelTemplateArgumentList &TemplateArgs,
14808 SourceRange TemplateIDRange);
14809
14810 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
14812 ArrayRef<TemplateArgument> TemplateArgs,
14813 ConstraintSatisfaction &Satisfaction);
14814
14815 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14816 /// unsatisfied.
14817 /// \param First whether this is the first time an unsatisfied constraint is
14818 /// diagnosed for this error.
14820 bool First = true);
14821
14822 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14823 /// unsatisfied.
14824 void
14826 bool First = true);
14827
14829 const NamedDecl *ConstrainedDecl,
14830 ArrayRef<AssociatedConstraint> AssociatedConstraints);
14831
14832 /// \brief Check whether the given declaration's associated constraints are
14833 /// at least as constrained than another declaration's according to the
14834 /// partial ordering of constraints.
14835 ///
14836 /// \param Result If no error occurred, receives the result of true if D1 is
14837 /// at least constrained than D2, and false otherwise.
14838 ///
14839 /// \returns true if an error occurred, false otherwise.
14840 bool IsAtLeastAsConstrained(const NamedDecl *D1,
14842 const NamedDecl *D2,
14844 bool &Result);
14845
14846 /// If D1 was not at least as constrained as D2, but would've been if a pair
14847 /// of atomic constraints involved had been declared in a concept and not
14848 /// repeated in two separate places in code.
14849 /// \returns true if such a diagnostic was emitted, false otherwise.
14853
14854private:
14855 /// Caches pairs of template-like decls whose associated constraints were
14856 /// checked for subsumption and whether or not the first's constraints did in
14857 /// fact subsume the second's.
14858 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
14859 SubsumptionCache;
14860 /// Caches the normalized associated constraints of declarations (concepts or
14861 /// constrained declarations). If an error occurred while normalizing the
14862 /// associated constraints of the template or concept, nullptr will be cached
14863 /// here.
14864 llvm::DenseMap<const NamedDecl *, NormalizedConstraint *> NormalizationCache;
14865
14866 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
14867 SatisfactionCache;
14868
14869 // The current stack of constraint satisfactions, so we can exit-early.
14871
14872 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
14873 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
14874 /// use LambdaScopeForCallOperatorInstantiationRAII.
14875 bool
14876 SetupConstraintScope(FunctionDecl *FD,
14877 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14878 const MultiLevelTemplateArgumentList &MLTAL,
14880
14881 /// Used during constraint checking, sets up the constraint template argument
14882 /// lists, and calls SetupConstraintScope to set up the
14883 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
14884 std::optional<MultiLevelTemplateArgumentList>
14885 SetupConstraintCheckingTemplateArgumentsAndScope(
14886 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14888
14889 ///@}
14890
14891 //
14892 //
14893 // -------------------------------------------------------------------------
14894 //
14895 //
14896
14897 /// \name Types
14898 /// Implementations are in SemaType.cpp
14899 ///@{
14900
14901public:
14902 /// A mapping that describes the nullability we've seen in each header file.
14904
14905 static int getPrintable(int I) { return I; }
14906 static unsigned getPrintable(unsigned I) { return I; }
14907 static bool getPrintable(bool B) { return B; }
14908 static const char *getPrintable(const char *S) { return S; }
14909 static StringRef getPrintable(StringRef S) { return S; }
14910 static const std::string &getPrintable(const std::string &S) { return S; }
14911 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
14912 return II;
14913 }
14915 static QualType getPrintable(QualType T) { return T; }
14916 static SourceRange getPrintable(SourceRange R) { return R; }
14918 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
14920
14921 enum class CompleteTypeKind {
14922 /// Apply the normal rules for complete types. In particular,
14923 /// treat all sizeless types as incomplete.
14925
14926 /// Relax the normal rules for complete types so that they include
14927 /// sizeless built-in types.
14929
14930 // FIXME: Eventually we should flip the default to Normal and opt in
14931 // to AcceptSizeless rather than opt out of it.
14933 };
14934
14936 const DeclSpec *DS = nullptr);
14938 const DeclSpec *DS = nullptr);
14939
14940 /// Build a pointer type.
14941 ///
14942 /// \param T The type to which we'll be building a pointer.
14943 ///
14944 /// \param Loc The location of the entity whose type involves this
14945 /// pointer type or, if there is no such entity, the location of the
14946 /// type that will have pointer type.
14947 ///
14948 /// \param Entity The name of the entity that involves the pointer
14949 /// type, if known.
14950 ///
14951 /// \returns A suitable pointer type, if there are no
14952 /// errors. Otherwise, returns a NULL type.
14954 DeclarationName Entity);
14955
14956 /// Build a reference type.
14957 ///
14958 /// \param T The type to which we'll be building a reference.
14959 ///
14960 /// \param Loc The location of the entity whose type involves this
14961 /// reference type or, if there is no such entity, the location of the
14962 /// type that will have reference type.
14963 ///
14964 /// \param Entity The name of the entity that involves the reference
14965 /// type, if known.
14966 ///
14967 /// \returns A suitable reference type, if there are no
14968 /// errors. Otherwise, returns a NULL type.
14970 DeclarationName Entity);
14971
14972 /// Build an array type.
14973 ///
14974 /// \param T The type of each element in the array.
14975 ///
14976 /// \param ASM C99 array size modifier (e.g., '*', 'static').
14977 ///
14978 /// \param ArraySize Expression describing the size of the array.
14979 ///
14980 /// \param Brackets The range from the opening '[' to the closing ']'.
14981 ///
14982 /// \param Entity The name of the entity that involves the array
14983 /// type, if known.
14984 ///
14985 /// \returns A suitable array type, if there are no errors. Otherwise,
14986 /// returns a NULL type.
14988 unsigned Quals, SourceRange Brackets,
14989 DeclarationName Entity);
14991
14992 /// Build an ext-vector type.
14993 ///
14994 /// Run the required checks for the extended vector type.
14996 SourceLocation AttrLoc);
14997 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
14998 SourceLocation AttrLoc);
14999
15001 Expr *CountExpr,
15002 bool CountInBytes,
15003 bool OrNull);
15004
15005 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15006 /// expression is uninstantiated. If instantiated it will apply the
15007 /// appropriate address space to the type. This function allows dependent
15008 /// template variables to be used in conjunction with the address_space
15009 /// attribute
15010 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15011 SourceLocation AttrLoc);
15012
15013 /// Same as above, but constructs the AddressSpace index if not provided.
15015 SourceLocation AttrLoc);
15016
15018
15020
15021 /// Build a function type.
15022 ///
15023 /// This routine checks the function type according to C++ rules and
15024 /// under the assumption that the result type and parameter types have
15025 /// just been instantiated from a template. It therefore duplicates
15026 /// some of the behavior of GetTypeForDeclarator, but in a much
15027 /// simpler form that is only suitable for this narrow use case.
15028 ///
15029 /// \param T The return type of the function.
15030 ///
15031 /// \param ParamTypes The parameter types of the function. This array
15032 /// will be modified to account for adjustments to the types of the
15033 /// function parameters.
15034 ///
15035 /// \param Loc The location of the entity whose type involves this
15036 /// function type or, if there is no such entity, the location of the
15037 /// type that will have function type.
15038 ///
15039 /// \param Entity The name of the entity that involves the function
15040 /// type, if known.
15041 ///
15042 /// \param EPI Extra information about the function type. Usually this will
15043 /// be taken from an existing function with the same prototype.
15044 ///
15045 /// \returns A suitable function type, if there are no errors. The
15046 /// unqualified type will always be a FunctionProtoType.
15047 /// Otherwise, returns a NULL type.
15049 SourceLocation Loc, DeclarationName Entity,
15051
15052 /// Build a member pointer type \c T Class::*.
15053 ///
15054 /// \param T the type to which the member pointer refers.
15055 /// \param Class the class type into which the member pointer points.
15056 /// \param Loc the location where this type begins
15057 /// \param Entity the name of the entity that will have this member pointer
15058 /// type
15059 ///
15060 /// \returns a member pointer type, if successful, or a NULL type if there was
15061 /// an error.
15063 CXXRecordDecl *Cls, SourceLocation Loc,
15064 DeclarationName Entity);
15065
15066 /// Build a block pointer type.
15067 ///
15068 /// \param T The type to which we'll be building a block pointer.
15069 ///
15070 /// \param Loc The source location, used for diagnostics.
15071 ///
15072 /// \param Entity The name of the entity that involves the block pointer
15073 /// type, if known.
15074 ///
15075 /// \returns A suitable block pointer type, if there are no
15076 /// errors. Otherwise, returns a NULL type.
15078 DeclarationName Entity);
15079
15080 /// Build a paren type including \p T.
15083
15084 /// Build a Read-only Pipe type.
15085 ///
15086 /// \param T The type to which we'll be building a Pipe.
15087 ///
15088 /// \param Loc We do not use it for now.
15089 ///
15090 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15091 /// a NULL type.
15093
15094 /// Build a Write-only Pipe type.
15095 ///
15096 /// \param T The type to which we'll be building a Pipe.
15097 ///
15098 /// \param Loc We do not use it for now.
15099 ///
15100 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15101 /// a NULL type.
15103
15104 /// Build a bit-precise integer type.
15105 ///
15106 /// \param IsUnsigned Boolean representing the signedness of the type.
15107 ///
15108 /// \param BitWidth Size of this int type in bits, or an expression
15109 /// representing that.
15110 ///
15111 /// \param Loc Location of the keyword.
15112 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15113
15114 /// GetTypeForDeclarator - Convert the type for the specified
15115 /// declarator to Type instances.
15116 ///
15117 /// The result of this call will never be null, but the associated
15118 /// type may be a null type if there's an unrecoverable error.
15121
15122 /// Package the given type and TSI into a ParsedType.
15125 TypeSourceInfo **TInfo = nullptr);
15126
15128
15129 // Check whether the size of array element of type \p EltTy is a multiple of
15130 // its alignment and return false if it isn't.
15132
15133 void
15134 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15135 SourceLocation FallbackLoc,
15136 SourceLocation ConstQualLoc = SourceLocation(),
15137 SourceLocation VolatileQualLoc = SourceLocation(),
15138 SourceLocation RestrictQualLoc = SourceLocation(),
15139 SourceLocation AtomicQualLoc = SourceLocation(),
15140 SourceLocation UnalignedQualLoc = SourceLocation());
15141
15142 /// Retrieve the keyword associated
15144
15145 /// Adjust the calling convention of a method to be the ABI default if it
15146 /// wasn't specified explicitly. This handles method types formed from
15147 /// function type typedefs and typename template arguments.
15148 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15149 bool IsCtorOrDtor, SourceLocation Loc);
15150
15151 // Check if there is an explicit attribute, but only look through parens.
15152 // The intent is to look for an attribute on the current declarator, but not
15153 // one that came from a typedef.
15155
15156 /// Check whether a nullability type specifier can be added to the given
15157 /// type through some means not written in source (e.g. API notes).
15158 ///
15159 /// \param Type The type to which the nullability specifier will be
15160 /// added. On success, this type will be updated appropriately.
15161 ///
15162 /// \param Nullability The nullability specifier to add.
15163 ///
15164 /// \param DiagLoc The location to use for diagnostics.
15165 ///
15166 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15167 /// array type (e.g., because it will decay to a pointer).
15168 ///
15169 /// \param OverrideExisting Whether to override an existing, locally-specified
15170 /// nullability specifier rather than complaining about the conflict.
15171 ///
15172 /// \returns true if nullability cannot be applied, false otherwise.
15174 NullabilityKind Nullability,
15175 SourceLocation DiagLoc,
15176 bool AllowArrayTypes,
15177 bool OverrideExisting);
15178
15179 /// Get the type of expression E, triggering instantiation to complete the
15180 /// type if necessary -- that is, if the expression refers to a templated
15181 /// static data member of incomplete array type.
15182 ///
15183 /// May still return an incomplete type if instantiation was not possible or
15184 /// if the type is incomplete for a different reason. Use
15185 /// RequireCompleteExprType instead if a diagnostic is expected for an
15186 /// incomplete expression type.
15188
15190
15191 /// Ensure that the type of the given expression is complete.
15192 ///
15193 /// This routine checks whether the expression \p E has a complete type. If
15194 /// the expression refers to an instantiable construct, that instantiation is
15195 /// performed as needed to complete its type. Furthermore
15196 /// Sema::RequireCompleteType is called for the expression's type (or in the
15197 /// case of a reference type, the referred-to type).
15198 ///
15199 /// \param E The expression whose type is required to be complete.
15200 /// \param Kind Selects which completeness rules should be applied.
15201 /// \param Diagnoser The object that will emit a diagnostic if the type is
15202 /// incomplete.
15203 ///
15204 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15205 /// otherwise.
15207 TypeDiagnoser &Diagnoser);
15208 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15209
15210 template <typename... Ts>
15211 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15212 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15214 }
15215
15216 // Returns the underlying type of a decltype with the given expression.
15218
15220 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15221 /// context, such as when building a type for decltype(auto).
15222 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15223
15224 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15225 SourceLocation Loc,
15226 SourceLocation EllipsisLoc);
15227 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15228 SourceLocation Loc, SourceLocation EllipsisLoc,
15229 bool FullySubstituted = false,
15230 ArrayRef<QualType> Expansions = {});
15231
15232 using UTTKind = UnaryTransformType::UTTKind;
15234 SourceLocation Loc);
15240 SourceLocation Loc);
15242 SourceLocation Loc);
15244 SourceLocation Loc);
15245
15247 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15248 }
15249
15251 SourceLocation Loc);
15253 SourceLocation Loc);
15254
15255 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15256
15257 /// Ensure that the type T is a literal type.
15258 ///
15259 /// This routine checks whether the type @p T is a literal type. If @p T is an
15260 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15261 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15262 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15263 /// it the type @p T), along with notes explaining why the type is not a
15264 /// literal type, and returns true.
15265 ///
15266 /// @param Loc The location in the source that the non-literal type
15267 /// diagnostic should refer to.
15268 ///
15269 /// @param T The type that this routine is examining for literalness.
15270 ///
15271 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15272 ///
15273 /// @returns @c true if @p T is not a literal type and a diagnostic was
15274 /// emitted, @c false otherwise.
15276 TypeDiagnoser &Diagnoser);
15277 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15278
15279 template <typename... Ts>
15280 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15281 const Ts &...Args) {
15282 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15283 return RequireLiteralType(Loc, T, Diagnoser);
15284 }
15285
15288 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15289 }
15290
15291 /// Ensure that the type T is a complete type.
15292 ///
15293 /// This routine checks whether the type @p T is complete in any
15294 /// context where a complete type is required. If @p T is a complete
15295 /// type, returns false. If @p T is a class template specialization,
15296 /// this routine then attempts to perform class template
15297 /// instantiation. If instantiation fails, or if @p T is incomplete
15298 /// and cannot be completed, issues the diagnostic @p diag (giving it
15299 /// the type @p T) and returns true.
15300 ///
15301 /// @param Loc The location in the source that the incomplete type
15302 /// diagnostic should refer to.
15303 ///
15304 /// @param T The type that this routine is examining for completeness.
15305 ///
15306 /// @param Kind Selects which completeness rules should be applied.
15307 ///
15308 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15309 /// @c false otherwise.
15311 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15313 CompleteTypeKind Kind, unsigned DiagID);
15314
15316 TypeDiagnoser &Diagnoser) {
15317 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15318 }
15319 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15320 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15321 }
15322
15323 template <typename... Ts>
15324 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15325 const Ts &...Args) {
15326 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15327 return RequireCompleteType(Loc, T, Diagnoser);
15328 }
15329
15330 /// Determine whether a declaration is visible to name lookup.
15331 bool isVisible(const NamedDecl *D) {
15332 return D->isUnconditionallyVisible() ||
15333 isAcceptableSlow(D, AcceptableKind::Visible);
15334 }
15335
15336 /// Determine whether a declaration is reachable.
15337 bool isReachable(const NamedDecl *D) {
15338 // All visible declarations are reachable.
15339 return D->isUnconditionallyVisible() ||
15340 isAcceptableSlow(D, AcceptableKind::Reachable);
15341 }
15342
15343 /// Determine whether a declaration is acceptable (visible/reachable).
15345 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15346 }
15347
15348 /// Determine if \p D and \p Suggested have a structurally compatible
15349 /// layout as described in C11 6.2.7/1.
15350 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15351
15352 /// Determine if \p D has a visible definition. If not, suggest a declaration
15353 /// that should be made visible to expose the definition.
15354 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15355 bool OnlyNeedComplete = false);
15357 NamedDecl *Hidden;
15358 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15359 }
15360 /// Determine if \p D has a definition which allows we redefine it in current
15361 /// TU. \p Suggested is the definition that should be made visible to expose
15362 /// the definition.
15363 bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested,
15364 bool &Visible);
15366 NamedDecl *Hidden;
15367 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), &Hidden,
15368 Visible);
15369 }
15370
15371 /// Determine if \p D has a reachable definition. If not, suggest a
15372 /// declaration that should be made reachable to expose the definition.
15373 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15374 bool OnlyNeedComplete = false);
15376 NamedDecl *Hidden;
15377 return hasReachableDefinition(D, &Hidden);
15378 }
15379
15380 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15381 AcceptableKind Kind,
15382 bool OnlyNeedComplete = false);
15384 NamedDecl *Hidden;
15385 return hasAcceptableDefinition(D, &Hidden, Kind);
15386 }
15387
15388 /// Try to parse the conditional expression attached to an effect attribute
15389 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15390 /// optional on error.
15391 std::optional<FunctionEffectMode>
15392 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15393
15394private:
15395 /// The implementation of RequireCompleteType
15396 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15397 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15398
15399 /// Nullability type specifiers.
15400 IdentifierInfo *Ident__Nonnull = nullptr;
15401 IdentifierInfo *Ident__Nullable = nullptr;
15402 IdentifierInfo *Ident__Nullable_result = nullptr;
15403 IdentifierInfo *Ident__Null_unspecified = nullptr;
15404
15405 ///@}
15406
15407 //
15408 //
15409 // -------------------------------------------------------------------------
15410 //
15411 //
15412
15413 /// \name FixIt Helpers
15414 /// Implementations are in SemaFixItUtils.cpp
15415 ///@{
15416
15417public:
15418 /// Get a string to suggest for zero-initialization of a type.
15420 SourceLocation Loc) const;
15421 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15422
15423 ///@}
15424
15425 //
15426 //
15427 // -------------------------------------------------------------------------
15428 //
15429 //
15430
15431 /// \name Function Effects
15432 /// Implementations are in SemaFunctionEffects.cpp
15433 ///@{
15434public:
15437
15440 std::optional<FunctionEffectWithCondition>
15441 Old; // Invalid when 'Kind' is 'Added'.
15442 std::optional<FunctionEffectWithCondition>
15443 New; // Invalid when 'Kind' is 'Removed'.
15444
15445 StringRef effectName() const {
15446 if (Old)
15447 return Old.value().Effect.name();
15448 return New.value().Effect.name();
15449 }
15450
15451 /// Describes the result of effects differing between a base class's virtual
15452 /// method and an overriding method in a subclass.
15453 enum class OverrideResult {
15456 Merge // Merge missing effect from base to derived.
15457 };
15458
15459 /// Return true if adding or removing the effect as part of a type
15460 /// conversion should generate a diagnostic.
15462 const FunctionEffectsRef &SrcFX,
15463 QualType DstType,
15464 const FunctionEffectsRef &DstFX) const;
15465
15466 /// Return true if adding or removing the effect in a redeclaration should
15467 /// generate a diagnostic.
15468 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15469 const FunctionEffectsRef &OldFX,
15470 const FunctionDecl &NewFunction,
15471 const FunctionEffectsRef &NewFX) const;
15472
15473 /// Return true if adding or removing the effect in a C++ virtual method
15474 /// override should generate a diagnostic.
15476 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15477 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15478 };
15479
15480 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15481 /// Caller should short-circuit by checking for equality first.
15483 const FunctionEffectsRef &New);
15484 };
15485
15486 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15487 /// FunctionEffectsRef to be verified.
15489
15490 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15491 /// are all null.
15493
15494public:
15495 /// Warn and return true if adding a function effect to a set would create a
15496 /// conflict.
15499 SourceLocation NewAttrLoc);
15500
15501 // Report a failure to merge function effects between declarations due to a
15502 // conflict.
15503 void
15505 SourceLocation NewLoc,
15506 SourceLocation OldLoc);
15507
15508 /// Inline checks from the start of maybeAddDeclWithEffects, to
15509 /// minimize performance impact on code not using effects.
15510 template <class FuncOrBlockDecl>
15511 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15512 if (Context.hasAnyFunctionEffects())
15513 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15515 }
15516
15517 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15518 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15519
15520 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15521 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15522
15524
15525 ///@}
15526};
15527
15528DeductionFailureInfo
15530 sema::TemplateDeductionInfo &Info);
15531
15532/// Contains a late templated function.
15533/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15536 /// The template function declaration to be late parsed.
15538 /// Floating-point options in the point of definition.
15540};
15541
15542template <>
15544 PragmaMsStackAction Action,
15545 llvm::StringRef StackSlotLabel,
15547
15548} // end namespace clang
15549
15550#endif
#define V(N, I)
Forward declaration of all AST node types.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Defines enumerations for expression traits intrinsics.
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
#define SM(sm)
Defines the clang::OpenCLOptions class.
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
AccessResult
A copy of Sema's enum without AR_delayed.
CastType
Definition SemaCast.cpp:49
static void CheckFormatString(Sema &S, const FormatStringLiteral *FExpr, const StringLiteral *ReferenceFormatString, const Expr *OrigFormatExpr, ArrayRef< const Expr * > Args, Sema::FormatArgumentPassingKind APK, unsigned format_idx, unsigned firstDataArg, FormatStringType Type, bool inFunctionCall, VariadicCallType CallType, llvm::SmallBitVector &CheckedVarArgs, UncoveredArgHandler &UncoveredArg, bool IgnoreStringsWithoutSpecifiers)
static void CheckBoolLikeConversion(Sema &S, Expr *E, SourceLocation CC)
Check conversion of given expression to boolean.
Sema::AllowedExplicit AllowedExplicit
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines a utilitiy for warning once when close to out of stack space.
Defines the clang::TemplateNameKind enum.
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
TypePropertyCache< Private > Cache
Definition Type.cpp:4792
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
Represents a member of a struct/union/class.
Definition Decl.h:3157
a trap message and trap category.
A class for storing results from argument-dependent lookup.
Definition Lookup.h:871
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:34
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:430
Writes an AST file containing the contents of a translation unit.
Definition ASTWriter.h:97
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2721
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3720
Attr - This represents one attribute.
Definition Attr.h:44
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3496
A binding in a decomposition declaration.
Definition DeclCXX.h:4185
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4651
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ constructor within a class.
Definition DeclCXX.h:2604
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2943
Represents a C++ base or member initializer.
Definition DeclCXX.h:2369
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2620
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:73
Represents the this expression in C++.
Definition ExprCXX.h:1155
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:69
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2877
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4923
CaseStmt - Represent a case statement.
Definition Stmt.h:1920
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3610
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Abstract interface for a consumer of code-completion information.
Declaration of a C++20 concept.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:37
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3677
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
The information about the darwin SDK that was used during this compilation.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
Definition DeclBase.h:1382
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
Captures information about "declaration specifiers".
Definition DeclSpec.h:217
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Definition DeclBase.h:859
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:842
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:779
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
A decomposition declaration.
Definition DeclCXX.h:4249
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:327
A dependently-generated diagnostic.
Designation - Represent a full designation, which is a sequence of designators.
Definition Designator.h:208
A little helper class used to produce diagnostics.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:231
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3420
Represents an enum.
Definition Decl.h:4004
Store information needed for an explicit specifier.
Definition DeclCXX.h:1924
The return type of classify().
Definition Expr.h:337
This represents one expression.
Definition Expr.h:112
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
Definition Expr.h:802
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:273
An abstract interface that should be implemented by external AST sources that also provide informatio...
virtual void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs)
Read the set of tentative definitions known to the external Sema source.
virtual void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls)
Read the set of unused file-scope declarations known to the external Sema source.
virtual void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls)
Read the set of ext_vector type declarations known to the external Sema source.
virtual void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls)
Read the set of delegating constructors known to the external Sema source.
Represents difference between two FPOptions values.
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
Represents a member of a struct/union/class.
Definition Decl.h:3157
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
A mapping from file IDs to a record of whether we've seen nullability information in that file.
Definition Sema.h:257
FileNullability & operator[](FileID file)
Definition Sema.h:268
FileNullability Nullability
Definition Sema.h:264
Represents a function declaration or definition.
Definition Decl.h:1999
A mutable set of FunctionEffect::Kind.
Definition TypeBase.h:5118
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5232
Kind
Identifies the particular effect.
Definition TypeBase.h:4880
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5064
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition ExprCXX.h:4835
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5264
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4486
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4460
One of these records is kept for each identifier that is lexed.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Definition Overload.h:615
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3464
Describes an C or C++ initializer list.
Definition Expr.h:5233
Describes the kind of initialization being performed, along with location information for tokens rela...
Describes the sequence of initializations required to initialize a given object or reference with a s...
Describes an entity that is being initialized.
Represents the declaration of a label.
Definition Decl.h:523
FPEvalMethodKind
Possible float expression evaluation method choices.
ComplexRangeKind
Controls the various implementations for complex multiplication and.
FPExceptionModeKind
Possible floating point exception behavior.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Represents a lazily-loaded vector of data.
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition Template.h:365
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4398
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4344
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4914
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3298
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3651
Abstract interface for a module loader.
Describes a module or submodule.
Definition Module.h:144
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
This represents a decl that may have a name.
Definition Decl.h:273
Represent a C++ namespace.
Definition Decl.h:591
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition TypeBase.h:7903
Wrapper for void* pointer.
Definition Ownership.h:51
static OpaquePtr make(QualType P)
Definition Ownership.h:61
OpenCL supported extensions and optional core features.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1153
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:290
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2182
Represents a parameter to a function.
Definition Decl.h:1789
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
ParsedAttributes - A collection of parsed attributes.
Definition ParsedAttr.h:937
Represents the parsed form of a C++ template argument.
void Emit(const DiagnosticBuilder &DB) const
PreferredTypeBuilder(ASTContext *Ctx, bool Enabled)
Definition Sema.h:291
void enterFunctionArgument(SourceLocation Tok, llvm::function_ref< QualType()> ComputeType)
Computing a type for the function argument may require running overloading, so we postpone its comput...
void enterCondition(Sema &S, SourceLocation Tok)
void enterTypeCast(SourceLocation Tok, QualType CastType)
Handles all type casts, including C-style cast, C++ casts, etc.
void enterMemAccess(Sema &S, SourceLocation Tok, Expr *Base)
void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS)
void enterUnary(Sema &S, SourceLocation Tok, tok::TokenKind OpKind, SourceLocation OpLoc)
void enterReturn(Sema &S, SourceLocation Tok)
void enterDesignatedInitializer(SourceLocation Tok, QualType BaseType, const Designation &D)
Handles e.g. BaseType{ .D = Tok...
void enterBinary(Sema &S, SourceLocation Tok, Expr *LHS, tok::TokenKind Op)
void enterParenExpr(SourceLocation Tok, SourceLocation LParLoc)
void enterVariableInit(SourceLocation Tok, Decl *D)
QualType get(SourceLocation Tok) const
Get the expected type associated with this location, if any.
Definition Sema.h:327
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Stores the type being destroyed by a pseudo-destructor expression.
Definition ExprCXX.h:2688
A (possibly-)qualified type.
Definition TypeBase.h:937
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
Represents a struct/union/class.
Definition Decl.h:4309
Represents the body of a requires-expression.
Definition DeclCXX.h:2098
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
Smart pointer class that efficiently represents Objective-C method names.
A generic diagnostic builder for errors which may or may not be deferred.
Definition SemaBase.h:111
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Definition SemaBase.cpp:61
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
SemaBase(Sema &S)
Definition SemaBase.cpp:7
Sema & SemaRef
Definition SemaBase.h:40
AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
Definition Sema.h:1845
bool operator==(const AlignPackInfo &Info) const
Definition Sema.h:1905
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1877
unsigned getPackNumber() const
Definition Sema.h:1895
bool IsXLStack() const
Definition Sema.h:1903
bool IsPackSet() const
Definition Sema.h:1897
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition Sema.h:1851
bool IsAlignAttr() const
Definition Sema.h:1891
bool IsPackAttr() const
Definition Sema.h:1889
bool operator!=(const AlignPackInfo &Info) const
Definition Sema.h:1911
AlignPackInfo(bool IsXL)
Definition Sema.h:1855
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition Sema.h:1862
Mode getAlignMode() const
Definition Sema.h:1893
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition Sema.h:13509
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8232
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8237
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8224
std::tuple< const Ts &... > Args
Definition Sema.h:8221
CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals, bool Enabled=true)
Introduce a new scope where 'this' may be allowed (when enabled), using the given declaration (which ...
CompoundScopeRAII(Sema &S, bool IsStmtExpr=false)
Definition Sema.h:1292
std::pair< VarDecl *, Expr * > get() const
Definition Sema.h:7777
std::optional< bool > getKnownValue() const
Definition Sema.h:7781
A RAII object to temporarily push a declaration context.
Definition Sema.h:3476
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3486
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
Definition Sema.h:10268
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
ContextualImplicitConverter(bool Suppress=false, bool SuppressConversion=false)
Definition Sema.h:10273
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
DefaultedComparisonKind asComparison() const
Definition Sema.h:6353
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition Sema.h:6330
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition Sema.h:6358
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition Sema.h:6333
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6350
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition Sema.h:10007
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition Sema.h:1359
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition Sema.h:1378
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition Sema.h:1402
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition Sema.h:1371
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1374
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
void popWithoutEmitting(DelayedDiagnosticsState state)
Leave a delayed-diagnostic state that was previously pushed.
Definition Sema.h:1388
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition Sema.h:1394
A helper class for building up ExtParameterInfos.
Definition Sema.h:12915
const FunctionProtoType::ExtParameterInfo * getPointerOrNull(unsigned numParams)
Return a pointer (suitable for setting in an ExtProtoInfo) to the ExtParameterInfo array we've built ...
Definition Sema.h:12934
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:12922
FPOptionsOverride getOverrides()
Definition Sema.h:13893
FullExprArg(Sema &actions)
Definition Sema.h:7721
ExprResult release()
Definition Sema.h:7723
friend class Sema
Definition Sema.h:7732
Expr * get() const
Definition Sema.h:7725
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:13905
SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T) override
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
Definition Sema.h:10332
virtual SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
bool match(QualType T) override
Match an integral or (possibly scoped) enumeration type.
ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress, bool SuppressConversion)
Definition Sema.h:10324
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5452
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5445
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5455
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
Definition Sema.h:5461
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5468
LambdaScopeForCallOperatorInstantiationRAII(Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL, LocalInstantiationScope &Scope, bool ShouldAddDeclsFromParentScope=true)
LocalEagerInstantiationScope(Sema &S, bool AtEndOfTU)
Definition Sema.h:13862
static NameClassification DependentNonType()
Definition Sema.h:3690
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3700
ExprResult getExpression() const
Definition Sema.h:3726
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3663
static NameClassification Unknown()
Definition Sema.h:3670
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3674
NameClassificationKind getKind() const
Definition Sema.h:3724
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3718
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3706
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3736
NameClassification(ParsedType Type)
Definition Sema.h:3660
TemplateName getTemplateName() const
Definition Sema.h:3741
ParsedType getType() const
Definition Sema.h:3731
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3750
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3680
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3712
static NameClassification UndeclaredNonType()
Definition Sema.h:3686
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3694
static NameClassification Error()
Definition Sema.h:3666
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2466
PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct)
Definition SemaAttr.cpp:29
RequiredTemplateKind(TemplateNameIsRequiredTag)
Template name is unconditionally required.
Definition Sema.h:11355
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11357
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11352
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12367
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12400
SFINAETrap(Sema &SemaRef, bool ForValidityCheck=false)
Definition Sema.h:12378
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition Sema.h:8249
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8254
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8251
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition Sema.h:9271
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9258
CXXMethodDecl * getMethod() const
Definition Sema.h:9261
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9262
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13410
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13398
SourceLocation getLocation() const
Definition Sema.h:12141
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12131
const DeclContext * getDeclContext() const
Definition Sema.h:12137
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12115
const NamedDecl * getDecl() const
Definition Sema.h:12129
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12114
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12133
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12416
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7680
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
const FieldDecl * getSelfAssignmentClassMemberCandidate(const ValueDecl *SelfAssigned)
Returns a field in a CXXRecordDecl that has the same name as the decl SelfAssigned when inside a CXXM...
void DeclareGlobalNewDelete()
DeclareGlobalNewDelete - Declare the global forms of operator new and delete.
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
IfExistsResult CheckMicrosoftIfExistsSymbol(Scope *S, CXXScopeSpec &SS, const DeclarationNameInfo &TargetNameInfo)
QualType CheckSizelessVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const
Returns true if From is a function or pointer to a function with the cfi_unchecked_callee attribute b...
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
QualType BuildParenType(QualType T)
Build a paren type including T.
SemaAMDGPU & AMDGPU()
Definition Sema.h:1420
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition Sema.h:3568
FunctionDecl * FindUsualDeallocationFunction(SourceLocation StartLoc, ImplicitDeallocationParameters, DeclarationName Name, bool Diagnose=true)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
ExprResult ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXTypeid - Parse typeid( something ).
llvm::DenseSet< Module * > LookupModulesCache
Cache of additional modules that should be used for name lookup within the current template instantia...
Definition Sema.h:13454
ExprResult ActOnCXXParenListInitExpr(ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn)
pragma optimize("[optimization-list]", on | off).
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraint)
DeclResult ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, SourceLocation ModulePrivateLoc, CXXScopeSpec &SS, TemplateIdAnnotation &TemplateId, const ParsedAttributesView &Attr, MultiTemplateParamsArg TemplateParameterLists, SkipBodyInfo *SkipBody=nullptr)
ExprResult ActOnCXXUuidof(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXUuidof - Parse __uuidof( something ).
bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits)
BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is a constant expression represen...
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildOperatorCoawaitCall(SourceLocation Loc, Expr *E, UnresolvedLookupExpr *Lookup)
Build a call to 'operator co_await' if there is a suitable operator for the given expression.
ConceptDecl * ActOnStartConceptDefinition(Scope *S, MultiTemplateParamsArg TemplateParameterLists, const IdentifierInfo *Name, SourceLocation NameLoc)
std::optional< ExpressionEvaluationContextRecord::InitializationContext > InnermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8154
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:503
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13438
bool IsPointerInterconvertibleBaseOf(const TypeSourceInfo *Base, const TypeSourceInfo *Derived)
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum, unsigned Multiple)
BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr TheCall is a constant expr...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
SmallVector< Scope *, 2 > CurrentSEHFinally
Stack of active SEH __finally scopes. Can be empty.
Definition Sema.h:10916
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:12944
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2539
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1120
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
TemplateDeductionResult DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType, sema::TemplateDeductionInfo &Info)
Deduce the template arguments of the given template from FromType.
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
friend class ASTWriter
Definition Sema.h:1563
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
SmallVector< SmallVector< VTableUse, 16 >, 8 > SavedVTableUses
Definition Sema.h:13847
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6521
void DiagnoseAbstractType(const CXXRecordDecl *RD)
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
Definition Sema.h:10018
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1061
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
std::optional< QualType > BuiltinVectorMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::None)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
Definition Sema.h:6510
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs, SmallVectorImpl< const Attr * > &OutAttrs)
Process the attributes before creating an attributed statement.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8204
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
llvm::DenseSet< Module * > & getLookupModules()
Get the set of additional modules that should be checked during name lookup.
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
bool isAlwaysConstantEvaluatedContext() const
Definition Sema.h:8122
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
Definition Sema.cpp:935
bool isAttrContext() const
Definition Sema.h:6912
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
void ActOnPragmaAttributeEmptyPush(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8197
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2639
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6272
LookupNameKind
Describes the kind of name lookup to perform.
Definition Sema.h:9287
@ LookupLabel
Label name lookup.
Definition Sema.h:9296
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9291
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9318
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9310
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9332
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9326
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9328
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9323
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9303
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9330
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9314
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9299
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9306
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9294
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9334
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9336
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
Definition SemaExpr.cpp:405
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition Sema.h:9237
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition Sema.h:4871
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15232
bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend)
Check that the expression co_await promise.final_suspend() shall not be potentially-throwing.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
void ActOnPragmaAttributePop(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Called on well-formed '#pragma clang attribute pop'.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
ExprResult ActOnConstantExpression(ExprResult Res)
void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, StringRef Value)
ActOnPragmaDetectMismatch - Call on well-formed #pragma detect_mismatch.
Definition SemaAttr.cpp:628
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:6209
SemaM68k & M68k()
Definition Sema.h:1470
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD)
Evaluate the implicit exception specification for a defaulted special member function.
bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount)
Checks that a call expression's argument count is at most the desired number.
void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod)
The parsed has entered a submodule.
bool checkPointerAuthDiscriminatorArg(Expr *Arg, PointerAuthDiscArgKind Kind, unsigned &IntVal)
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
Definition Sema.h:13519
StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef< Token > AsmToks, StringRef AsmString, unsigned NumOutputs, unsigned NumInputs, ArrayRef< StringRef > Constraints, ArrayRef< StringRef > Clobbers, ArrayRef< Expr * > Exprs, SourceLocation EndLoc)
ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E)
ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression found in an explicit(bool)...
bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum)
Returns true if the argument consists of one contiguous run of 1s with any number of 0s on either sid...
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
VarDecl * createLambdaInitCaptureVarDecl(SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc, IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx)
Create a dummy variable within the declcontext of the lambda's call operator, for name lookup purpose...
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
void ActOnFinishCXXNonNestedClass()
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed.
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
DelayedDiagnosticsState ParsingDeclState
Definition Sema.h:1354
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2110
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
StmtResult BuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn)
MergeFunctionDecl - We just parsed a function 'New' from declarator D which has the same name and sco...
void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind, uint64_t MagicValue, QualType Type, bool LayoutCompatible, bool MustBeNull)
Register a magic integral constant to be used as a type tag.
NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)
Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...
bool hasReachableDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
MissingImportKind
Kinds of missing import.
Definition Sema.h:9725
bool isValidPointerAttrType(QualType T, bool RefOkay=false)
Determine if type T is a valid subject for a nonnull and similar attributes.
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
ExprResult BuildCoyieldExpr(SourceLocation KwLoc, Expr *E)
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc, Expr *DefaultArg)
ActOnParamDefaultArgumentError - Parsing or semantic analysis of the default argument for the paramet...
bool areVectorTypesSameSize(QualType srcType, QualType destType)
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val, SkipBodyInfo *SkipBody=nullptr)
bool hasVisibleDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules)
TemplateParameterList * ActOnTemplateParameterList(unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
ActOnTemplateParameterList - Builds a TemplateParameterList, optionally constrained by RequiresClause...
static std::enable_if_t< std::is_base_of_v< Attr, AttrInfo >, SourceLocation > getAttrLoc(const AttrInfo &AL)
A helper function to provide Attribute Location for the Attr types AND the ParsedAttr.
Definition Sema.h:4816
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
void DiagnoseStaticAssertDetails(const Expr *E)
Try to print more useful information about a failed static_assert with expression \E.
void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
The parser has processed a module import translated from a include or similar preprocessing directive...
RetainOwnershipKind
Definition Sema.h:5013
OpaquePtr< QualType > TypeTy
Definition Sema.h:1276
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
void DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullType, bool IsEqual, SourceRange Range)
Diagnose pointers that are always non-null.
bool IsStringInit(Expr *Init, const ArrayType *AT)
Definition SemaInit.cpp:167
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
bool CheckCXXThisType(SourceLocation Loc, QualType Type)
Check whether the type of 'this' is valid in the current context.
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
bool LookupInSuper(LookupResult &R, CXXRecordDecl *Class)
Perform qualified name lookup into all base classes of the given class.
void addImplicitTypedef(StringRef Name, QualType T)
Definition Sema.cpp:367
void PrintContextStack()
Definition Sema.h:13528
void DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *&TemplateArgs)
Decomposes the given name into a DeclarationNameInfo, its location, and possibly a list of template a...
bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc, StringRef Keyword)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition SemaStmt.cpp:631
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
SemaOpenMP & OpenMP()
Definition Sema.h:1505
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition Sema.h:9236
void ActOnStartStmtExpr()
bool ActOnTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
llvm::function_ref< void(SourceLocation, PartialDiagnostic)> InstantiationContextDiagFuncRef
Definition Sema.h:2285
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6247
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9601
bool FormatStringHasSArg(const StringLiteral *FExpr)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void ActOnStmtExprError()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
bool IsLastErrorImmediate
Is the last error level diagnostic immediate.
Definition Sema.h:1346
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode)
Called to set constant rounding mode for floating point operations.
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
static const IdentifierInfo * getPrintable(const IdentifierInfo *II)
Definition Sema.h:14911
StmtResult ActOnForEachLValueExpr(Expr *E)
In an Objective C collection iteration statement: for (x in y) x can be an arbitrary l-value expressi...
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1241
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
Definition Sema.h:4729
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition Sema.h:3550
PragmaClangSection PragmaClangRodataSection
Definition Sema.h:1817
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
std::optional< FunctionEffectMode > ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName)
Try to parse the conditional expression attached to an effect attribute (e.g.
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
void NoteAllFoundTemplates(TemplateName Name)
CXXRecordDecl * createLambdaClosureType(SourceRange IntroducerRange, TypeSourceInfo *Info, unsigned LambdaDependencyKind, LambdaCaptureDefault CaptureDefault)
Create a new lambda closure type.
bool hasVisibleDefinition(const NamedDecl *D)
Definition Sema.h:15356
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
Definition Sema.h:6483
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false, bool CanIndexVariadicArguments=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
Definition Sema.h:5107
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1152
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6464
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition SemaStmt.cpp:85
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
TemplateName SubstTemplateName(SourceLocation TemplateKWLoc, NestedNameSpecifierLoc &QualifierLoc, TemplateName Name, SourceLocation NameLoc, const MultiLevelTemplateArgumentList &TemplateArgs)
TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK, const CXXScopeSpec &SS, const IdentifierInfo *Name, SourceLocation TagLoc, SourceLocation NameLoc)
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool checkSectionName(SourceLocation LiteralLoc, StringRef Str)
VarDecl * buildCoroutinePromise(SourceLocation Loc)
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
Definition Sema.h:1230
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, UnsignedOrNone NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
ActOnExpressionTrait - Parsed one of the unary type trait support pseudo-functions.
SemaCUDA & CUDA()
Definition Sema.h:1445
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A, bool SkipArgCountCheck=false)
Handles semantic checking for features that are common to all attributes, such as checking whether a ...
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Instantiate the definitions of all of the members of the given class template specialization,...
void Initialize()
Perform initialization that occurs after the parser has been initialized but before it parses anythin...
Definition Sema.cpp:373
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7797
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7799
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7798
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition Sema.h:1323
void AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, SourceLocation Loc)
Adds the 'optnone' attribute to the function declaration if there are no conflicts; Loc represents th...
bool RequireCompleteType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Definition Sema.h:15315
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:14917
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
bool needsRebuildOfDefaultArgOrInit() const
Definition Sema.h:8142
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
@ PartitionImplementation
'module X:Y;'
Definition Sema.h:9838
@ Interface
'export module X;'
Definition Sema.h:9835
@ Implementation
'module X;'
Definition Sema.h:9836
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9837
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8284
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1223
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
bool ActOnDuplicateODRHashDefinition(T *Duplicate, T *Previous)
Check ODR hashes for C/ObjC when merging types from modules.
Definition Sema.h:9548
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10351
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10354
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10360
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10358
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
Definition SemaAttr.cpp:277
void RefersToMemberWithReducedAlignment(Expr *E, llvm::function_ref< void(Expr *, RecordDecl *, FieldDecl *, CharUnits)> Action)
This function calls Action when it determines that E designates a misaligned member due to the packed...
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType)
Definition Sema.h:1775
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
@ AR_dependent
Definition Sema.h:1660
@ AR_accessible
Definition Sema.h:1658
@ AR_inaccessible
Definition Sema.h:1659
@ AR_delayed
Definition Sema.h:1661
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2442
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
@ Normal
Apply the normal rules for complete types.
Definition Sema.h:14924
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:14928
bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA)
Check whether the given statement can have musttail applied to it, issuing a diagnostic and returning...
Definition SemaStmt.cpp:660
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists)
Handle a friend tag declaration where the scope specifier was templated.
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
Preprocessor & getPreprocessor() const
Definition Sema.h:924
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:6890
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2311
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
QualType GetSignedSizelessVectorType(QualType V)
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition Sema.h:13441
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
FunctionTemplateDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:438
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
Definition Sema.h:8273
void deduceOpenCLAddressSpace(ValueDecl *decl)
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2048
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
Definition Sema.h:8185
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition Sema.h:14918
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2042
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, Scope *CurScope)
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
void referenceDLLExportedClassMethods()
StmtResult BuildCoreturnStmt(SourceLocation KwLoc, Expr *E, bool IsImplicit=false)
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
NamedDecl * ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BitfieldWidth, const VirtSpecifiers &VS, InClassInitStyle InitStyle)
ActOnCXXMemberDeclarator - This is invoked when a C++ class member declarator is parsed.
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
static NamedDecl * getAsTemplateNameDecl(NamedDecl *D, bool AllowFunctionTemplates=true, bool AllowDependent=true)
Try to interpret the lookup result D as a template-name.
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX)
Unconditionally add a Decl to DeclsWithEfffectsToVerify.
FunctionEffectKindSet AllEffectsToVerify
The union of all effects present on DeclsWithEffectsToVerify.
Definition Sema.h:15492
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2492
ExprResult ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor)
ExprResult BuildCXXAssumeExpr(Expr *Assumption, const IdentifierInfo *AttrName, SourceRange Range)
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
Definition Sema.h:4876
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition SemaStmt.cpp:485
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimizeoff". If this location is invalid,...
Definition Sema.h:2119
llvm::SmallSetVector< Expr *, 4 > MaybeODRUseExprSet
Store a set of either DeclRefExprs or MemberExprs that contain a reference to a variable (constant) t...
Definition Sema.h:6724
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind, StringRef Arg)
ActOnPragmaMSComment - Called on well formed #pragma comment(kind, "arg").
Definition SemaAttr.cpp:620
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
Definition Sema.h:2037
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
SimplerImplicitMoveMode
Definition Sema.h:11073
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
void AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
Definition SemaAttr.cpp:54
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool CheckFormatStringsCompatible(FormatStringType FST, const StringLiteral *AuthoritativeFormatString, const StringLiteral *TestedFormatString, const Expr *FunctionCallArg=nullptr)
Verify that two format strings (as understood by attribute(format) and attribute(format_matches) are ...
void CheckMain(FunctionDecl *FD, const DeclSpec &D)
void AddKnownFunctionAttributes(FunctionDecl *FD)
Adds any function attributes that we know a priori based on the declaration of this function.
void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver)
If VD is set but not otherwise used, diagnose, for a parameter or a variable.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
ExprResult LookupInlineAsmIdentifier(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool IsUnevaluatedContext)
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid)
type checking for vector binary operators.
void ActOnComment(SourceRange Comment)
Definition Sema.cpp:2591
bool IsCXXTriviallyRelocatableType(QualType T)
Determines if a type is trivially relocatable according to the C++26 rules.
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
Definition Sema.h:4132
@ Default
= default ;
Definition Sema.h:4134
@ Delete
deleted-function-body
Definition Sema.h:4140
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
bool RequireStructuralType(QualType T, SourceLocation Loc)
Require the given type to be a structural type, and diagnose if it is not.
ExprResult VerifyBitField(SourceLocation FieldLoc, const IdentifierInfo *FieldName, QualType FieldTy, bool IsMsStruct, Expr *BitWidth)
VerifyBitField - verifies that a bit field expression is an ICE and has the correct width,...
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition Sema.h:13809
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition SemaStmt.cpp:48
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs, bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref< bool(bool)> CheckNonDependent=[](bool) { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition Sema.cpp:1231
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
ConceptDecl * ActOnFinishConceptDefinition(Scope *S, ConceptDecl *C, Expr *ConstraintExpr, const ParsedAttributesView &Attrs)
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2049
void redelayDiagnostics(sema::DelayedDiagnosticPool &pool)
Given a set of delayed diagnostics, re-emit them as if they had been delayed in the current context i...
void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD)
Diagnose methods which overload virtual methods in a base class without overriding any.
SemaHexagon & Hexagon()
Definition Sema.h:1460
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types?
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef)
Add an init-capture to a lambda scope.
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
void ActOnPragmaMSSeg(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, StringLiteral *SegmentName, llvm::StringRef PragmaName)
Called on well formed #pragma bss_seg/data_seg/const_seg/code_seg.
Definition SemaAttr.cpp:847
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is an explicit specialization declaration for a...
bool IsInsideALocalClassWithinATemplateFunction()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:172
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
void ActOnReenterFunctionContext(Scope *S, Decl *D)
Push the parameters of D, which must be a function, into scope.
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
SemaSYCL & SYCL()
Definition Sema.h:1530
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
concepts::Requirement::SubstitutionDiagnostic * createSubstDiagAt(SourceLocation Location, EntityPrinter Printer)
create a Requirement::SubstitutionDiagnostic with only a SubstitutedEntity and DiagLoc using ASTConte...
sema::LambdaScopeInfo * RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator)
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
IdentifierInfo * getSuperIdentifier() const
Definition Sema.cpp:2866
StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
ExpressionEvaluationContextRecord & parentEvaluationContext()
Definition Sema.h:6902
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
Definition Sema.cpp:1647
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
Definition SemaAttr.cpp:663
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition SemaExpr.cpp:827
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11320
void UnmarkAsLateParsedTemplate(FunctionDecl *FD)
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT)
CheckTemplateArgumentKind
Specifies the context in which a particular template argument is being checked.
Definition Sema.h:11900
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:11911
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:11903
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:11907
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
TypeSpecifierType isTagName(IdentifierInfo &II, Scope *S)
isTagName() - This method is called for error recovery purposes only to determine if the specified na...
Definition SemaDecl.cpp:671
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnPragmaMSPointersToMembers(LangOptions::PragmaMSPointersToMembersKind Kind, SourceLocation PragmaLoc)
ActOnPragmaMSPointersToMembers - called on well formed #pragma pointers_to_members(representation met...
Definition SemaAttr.cpp:717
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
void DiagnosePrecisionLossInComplexDivision()
ExprResult CheckUnevaluatedOperand(Expr *E)
void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9231
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition Sema.h:1550
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
llvm::DenseMap< NamedDecl *, NamedDecl * > VisibleNamespaceCache
Map from the most recent declaration of a namespace to the most recent visible declaration of that na...
Definition Sema.h:13458
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
ParsedTemplateArgument ActOnTemplateTypeArgument(TypeResult ParsedType)
Convert a parsed type into a parsed template argument.
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)
ASTContext & Context
Definition Sema.h:1283
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
Definition Sema.h:8109
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:680
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION()
This virtual key function only exists to limit the emission of debug info describing the Sema class.
bool ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend, unsigned TemplateDepth, const Expr *Constraint)
bool BoundsSafetyCheckUseOfCountAttrPtr(const Expr *E)
Perform Bounds Safety semantic checks for uses of invalid uses counted_by or counted_by_or_null point...
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc, TemplateDecl *PrimaryTemplate, unsigned NumExplicitArgs, ArrayRef< TemplateArgument > Args)
Check the non-type template arguments of a class template partial specialization according to C++ [te...
ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc)
ActOnCXXNullPtrLiteral - Parse 'nullptr'.
void ActOnCapturedRegionError()
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a C++ typeid expression with a type operand.
IdentifierSourceLocations TypoCorrectionFailures
A cache containing identifiers for which typo correction failed and their locations,...
Definition Sema.h:9242
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7742
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
void ActOnPragmaUnused(const Token &Identifier, Scope *curScope, SourceLocation PragmaLoc)
ActOnPragmaUnused - Called on well-formed '#pragma unused'.
Definition SemaAttr.cpp:935
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
bool InNonInstantiationSFINAEContext
Whether we are in a SFINAE context that is not associated with template instantiation.
Definition Sema.h:13465
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:922
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
concepts::TypeRequirement * BuildTypeRequirement(TypeSourceInfo *Type)
void DiagnoseTypeTraitDetails(const Expr *E)
If E represents a built-in type trait, or a known standard type trait, try to print more information ...
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod)
The parser has left a submodule.
void CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC, bool *ICContext=nullptr, bool IsListInit=false)
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, CheckNonDependentConversionsFlag UserConversionFlag, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
void * SkippedDefinitionContext
Definition Sema.h:4358
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15280
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
void resetFPOptions(FPOptions FPO)
Definition Sema.h:11298
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15383
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
bool currentModuleIsImplementation() const
Is the module scope we are an implementation unit?
Definition Sema.h:9822
DeclResult ActOnModuleImport(SourceLocation StartLoc, SourceLocation ExportLoc, SourceLocation ImportLoc, ModuleIdPath Path, bool IsPartition=false)
The parser has processed a module import declaration.
static bool getPrintable(bool B)
Definition Sema.h:14907
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
SemaObjC & ObjC()
Definition Sema.h:1490
std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const
ExprResult SubstConstraintExprWithoutSatisfaction(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
Definition Sema.cpp:2821
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags
Diagnostics that are emitted only if we discover that the given function must be codegen'ed.
Definition Sema.h:1415
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:75
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
ExprResult BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, Expr *IndexExpr, SourceLocation RSquareLoc, ArrayRef< Expr * > ExpandedExprs={}, bool FullySubstituted=false)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector< std::tuple< IdentifierInfo *, SourceLocation > > &Functions)
Called on well-formed #pragma alloc_text().
Definition SemaAttr.cpp:899
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3149
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition Sema.h:1641
PragmaStack< bool > StrictGuardStackCheckStack
Definition Sema.h:2045
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition Sema.h:13532
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
Definition Sema.h:3558
bool hasVisibleDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a visible default argument.
void CleanupVarDeclMarking()
bool CheckConstraintExpression(const Expr *CE, Token NextToken=Token(), bool *PossibleNonPrimary=nullptr, bool IsTrailingRequiresClause=false)
Check whether the given expression is a valid constraint expression.
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition SemaExpr.cpp:748
bool isImmediateFunctionContext() const
Definition Sema.h:8134
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
Definition Sema.h:925
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1059
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:657
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition SemaExpr.cpp:758
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void DeclareGlobalAllocationFunction(DeclarationName Name, QualType Return, ArrayRef< QualType > Params)
DeclareGlobalAllocationFunction - Declares a single implicit global allocation function if it doesn't...
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr *RE)
If the given requirees-expression contains an unexpanded reference to one of its own parameter packs,...
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
void CheckCoroutineWrapper(FunctionDecl *FD)
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
Definition Sema.h:6490
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
ASTContext::CXXRecordDeclRelocationInfo CheckCXX2CRelocatableAndReplaceable(const clang::CXXRecordDecl *D)
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
ParsingDeclState PushParsingDeclaration(sema::DelayedDiagnosticPool &pool)
Definition Sema.h:1408
void ActOnPragmaAttributeAttribute(ParsedAttr &Attribute, SourceLocation PragmaLoc, attr::ParsedSubjectMatchRuleSet Rules)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
Decl * ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc, SourceLocation LBraceLoc)
We have parsed the start of an export declaration, including the '{' (if present).
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
Definition Sema.h:6574
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
void PopExpressionEvaluationContext()
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N)
PragmaStack< StringLiteral * > ConstSegStack
Definition Sema.h:2041
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:756
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition SemaAttr.cpp:334
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
Definition SemaExpr.cpp:877
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
Definition SemaDecl.cpp:695
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition Sema.h:2589
ParsingClassState PushParsingClass()
Definition Sema.h:6517
@ FRS_Success
Definition Sema.h:10739
@ FRS_DiagnosticIssued
Definition Sema.h:10741
@ FRS_NoViableFunction
Definition Sema.h:10740
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
void ActOnPragmaCXLimitedRange(SourceLocation Loc, LangOptions::ComplexRangeKind Range)
ActOnPragmaCXLimitedRange - Called on well formed #pragma STDC CX_LIMITED_RANGE.
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
TemplateParameterList * GetTemplateParameterList(TemplateDecl *TD)
Returns the template parameter list with all default template argument information.
void ActOnPragmaFPExceptions(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called on well formed '#pragma clang fp' that has option 'exceptions'.
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
Definition SemaAttr.cpp:112
SmallVector< LateInstantiatedAttribute, 1 > LateInstantiatedAttrVec
Definition Sema.h:13971
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD, CachedTokens &Toks)
llvm::SmallVector< DeleteExprLoc, 4 > DeleteLocs
Definition Sema.h:967
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition Sema.h:9284
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
AccessResult CheckAllocationAccess(SourceLocation OperatorLoc, SourceRange PlacementRange, CXXRecordDecl *NamingClass, DeclAccessPair FoundDecl, bool Diagnose=true)
Checks access to an overloaded operator new or delete.
bool isTemplateTemplateParameterAtLeastAsSpecializedAs(TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg, const DefaultArguments &DefaultArgs, SourceLocation ArgLoc, bool PartialOrdering, bool *StrictPackMatch)
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
unsigned TyposCorrected
The number of typos corrected by CorrectTypo.
Definition Sema.h:9234
bool BuiltinVectorToScalarMath(CallExpr *TheCall)
bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn)
We've just determined that Old and New both appear to be definitions of the same variable.
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
Definition Sema.h:6042
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
Definition Sema.h:6056
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
Definition Sema.h:6053
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
Definition Sema.h:6050
@ None
This is not a defaultable comparison operator.
Definition Sema.h:6044
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
Definition Sema.h:6047
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, ParsedType LhsTy, Expr *DimExpr, SourceLocation RParen)
ActOnArrayTypeTrait - Parsed one of the binary type trait support pseudo-functions.
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
llvm::SmallVector< QualType, 4 > CurrentParameterCopyTypes
Stack of types that correspond to the parameter entities that are currently being copy-initialized.
Definition Sema.h:8973
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
SmallVector< const Decl * > DeclsWithEffectsToVerify
All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...
Definition Sema.h:15488
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10069
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10071
void ActOnFinishRequiresExpr()
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition Sema.h:1213
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6505
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
void * SaveNestedNameSpecifierAnnotation(CXXScopeSpec &SS)
Given a C++ nested-name-specifier, produce an annotation value that the parser can use later to recon...
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
void ProcessPragmaWeak(Scope *S, Decl *D)
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum, llvm::APSInt &Result)
BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr TheCall is a constant expression.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1191
std::string getFixItZeroInitializerForType(QualType T, SourceLocation Loc) const
Get a string to suggest for zero-initialization of a type.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
Decl * BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy)
BuildAnonymousStructOrUnion - Handle the declaration of an anonymous structure or union.
bool CheckDeclCompatibleWithTemplateTemplate(TemplateDecl *Template, TemplateTemplateParmDecl *Param, const TemplateArgumentLoc &Arg)
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
Definition SemaAttr.cpp:636
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition Sema.h:3581
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1652
bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)
Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition Sema.cpp:2582
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition Sema.h:3473
void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F)
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
void handleLambdaNumbering(CXXRecordDecl *Class, CXXMethodDecl *Method, std::optional< CXXRecordDecl::LambdaNumbering > NumberingOverride=std::nullopt)
Number lambda for linkage purposes if necessary.
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, UnsignedOrNone NumExpansions)
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
Definition Sema.h:11310
void setFunctionHasIndirectGoto()
Definition Sema.cpp:2502
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc)
Build a bit-precise integer type.
TemplateParameterListEqualKind
Enumeration describing how template parameter lists are compared for equality.
Definition Sema.h:12073
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12091
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12081
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12101
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
NamedDecl * ActOnTypeParameter(Scope *S, bool Typename, SourceLocation EllipsisLoc, SourceLocation KeyLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedType DefaultArg, bool HasTypeConstraint)
ActOnTypeParameter - Called when a C++ template type parameter (e.g., "typename T") has been parsed.
SmallVectorImpl< Decl * > & WeakTopLevelDecls()
WeakTopLevelDeclDecls - access to #pragma weak-generated Decls.
Definition Sema.h:4867
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
bool AddingCFIUncheckedCallee(QualType From, QualType To) const
Returns true if From is a function or pointer to a function without the cfi_unchecked_callee attribut...
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1666
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition Sema.h:8315
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition SemaAttr.cpp:389
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
AssumedTemplateKind
Definition Sema.h:11370
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11377
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11374
bool CheckParamExceptionSpec(const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const FunctionProtoType *Target, bool SkipTargetFirstParameter, SourceLocation TargetLoc, const FunctionProtoType *Source, bool SkipSourceFirstParameter, SourceLocation SourceLoc)
CheckParamExceptionSpec - Check if the parameter and return types of the two functions have equivalen...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
Definition SemaAttr.cpp:795
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
StmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *Body)
AtomicArgumentOrder
Definition Sema.h:2701
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2330
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:426
SourceRange getExprRange(Expr *E) const
Definition SemaExpr.cpp:500
bool ActOnCXXGlobalScopeSpecifier(SourceLocation CCLoc, CXXScopeSpec &SS)
The parser has parsed a global nested-name-specifier '::'.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
NamedReturnInfo getNamedReturnInfo(Expr *&E, SimplerImplicitMoveMode Mode=SimplerImplicitMoveMode::Normal)
Determine whether the given expression might be move-eligible or copy-elidable in either a (co_)retur...
void setExceptionMode(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called to set exception behavior for floating point operations.
bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
The parser has parsed a nested-name-specifier 'identifier::'.
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
bool CheckFunctionReturnType(QualType T, SourceLocation Loc)
ArrayRef< InventedTemplateParameterInfo > getInventedParameterInfos() const
Definition Sema.h:11303
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition SemaAttr.cpp:168
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
LazyVector< const DeclaratorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadUnusedFileScopedDecls, 2, 2 > UnusedFileScopedDeclsType
Definition Sema.h:3554
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8169
NamedDecl * ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind, bool TypenameKeyword, TemplateParameterList *Params, SourceLocation EllipsisLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg)
ActOnTemplateTemplateParameter - Called when a C++ template template parameter (e....
static DeclarationName getPrintable(DeclarationName N)
Definition Sema.h:14914
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4567
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id, bool IsUDSuffix)
friend class ASTReader
Definition Sema.h:1561
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
Definition SemaStmt.cpp:405
FPOptions & getCurFPFeatures()
Definition Sema.h:920
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8267
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
void SetLateTemplateParser(LateTemplateParserCB *LTP, LateTemplateParserCleanupCB *LTPCleanup, void *P)
Definition Sema.h:1329
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
sema::LambdaScopeInfo * PushLambdaScope()
Definition Sema.cpp:2348
StmtResult ActOnCoreturnStmt(Scope *S, SourceLocation KwLoc, Expr *E)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
void PopCompoundScope()
Definition Sema.cpp:2481
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15324
bool EnsureTemplateArgumentListConstraints(TemplateDecl *Template, const MultiLevelTemplateArgumentList &TemplateArgs, SourceRange TemplateIDRange)
Ensure that the given template arguments satisfy the constraints associated with the given template,...
SkipBodyInfo shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II, SourceLocation IILoc)
Determine whether the body of an anonymous enumeration should be skipped.
UnexpandedParameterPackContext
The context in which an unexpanded parameter pack is being diagnosed.
Definition Sema.h:14225
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14245
@ UPPC_RequiresClause
Definition Sema.h:14296
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14251
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14278
@ UPPC_Requirement
Definition Sema.h:14293
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14269
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14248
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14284
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14281
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14275
@ UPPC_Initializer
An initializer.
Definition Sema.h:14260
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14230
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14254
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14263
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14233
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14227
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14272
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14257
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14236
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14242
@ UPPC_Block
Block expression.
Definition Sema.h:14287
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14239
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14266
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14290
api_notes::APINotesManager APINotes
Definition Sema.h:1287
bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low, int High, bool RangeIsError=true)
BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr TheCall is a constant express...
CXXConstructorDecl * LookupDefaultConstructor(CXXRecordDecl *Class)
Look up the default constructor for the given class.
bool IsLayoutCompatible(QualType T1, QualType T2) const
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
llvm::DenseMap< Decl *, SmallVector< PartialDiagnosticAt, 1 > > SuppressedDiagnosticsMap
For each declaration that involved template argument deduction, the set of diagnostics that were supp...
Definition Sema.h:12432
void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool Mutable)
Endow the lambda scope info with the relevant properties.
const LangOptions & getLangOpts() const
Definition Sema.h:918
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
bool RequireCompleteExprType(Expr *E, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type of the given expression is complete.
bool RebuildTemplateParamsInCurrentInstantiation(TemplateParameterList *Params)
Rebuild the template parameters now that we know we're in a current instantiation.
void DiagnoseInvalidJumps(Stmt *Body)
bool CaptureHasSideEffects(const sema::Capture &From)
Does copying/destroying the captured variable have side effects?
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
Definition Sema.h:14716
void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
StmtResult ActOnFinishFullStmt(Stmt *Stmt)
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
Definition Sema.h:5821
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
void LookupVisibleDecls(Scope *S, LookupNameKind Kind, VisibleDeclConsumer &Consumer, bool IncludeGlobalScope=true, bool LoadExternal=true)
StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, ConditionResult Cond, SourceLocation RParenLoc, Stmt *Body)
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
SourceLocation CurInitSegLoc
Definition Sema.h:2081
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
Definition SemaAttr.cpp:724
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1440
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
Definition SemaAttr.cpp:220
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
Definition Sema.h:3575
void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, const DeclSpec &DS)
ActOnStartOfLambdaDefinition - This is called just before we start parsing the body of a lambda; it a...
SemaOpenACC & OpenACC()
Definition Sema.h:1495
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition Sema.h:14688
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
ReuseLambdaContextDecl_t
Definition Sema.h:6978
@ ReuseLambdaContextDecl
Definition Sema.h:6978
void ActOnBaseSpecifiers(Decl *ClassDecl, MutableArrayRef< CXXBaseSpecifier * > Bases)
ActOnBaseSpecifiers - Attach the given base specifiers to the class, after checking whether there are...
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr, ExceptionSpecificationType &EST)
Check the given noexcept-specifier, convert its expression, and compute the appropriate ExceptionSpec...
void MarkExpressionAsImmediateEscalating(Expr *E)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
NamedDecl * findLocallyScopedExternCDecl(DeclarationName Name)
Look for a locally scoped extern "C" declaration by the given name.
bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old)
We've determined that New is a redeclaration of Old.
void ActOnLambdaClosureParameters(Scope *LambdaScope, MutableArrayRef< DeclaratorChunk::ParamInfo > ParamInfo)
void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange)
CheckCastAlign - Implements -Wcast-align, which warns when a pointer cast increases the alignment req...
ASTConsumer & getASTConsumer() const
Definition Sema.h:926
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
bool isUnexpandedParameterPackPermitted()
Determine whether an unexpanded parameter pack might be permitted in this location.
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD, SourceLocation Loc)
Produce diagnostics if FD is an aligned allocation or deallocation function that is unavailable.
SemaBPF & BPF()
Definition Sema.h:1435
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E)
Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
void * OpaqueParser
Definition Sema.h:1327
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
Preprocessor & PP
Definition Sema.h:1282
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
bool MSPragmaOptimizeIsOn
The "on" or "off" argument passed by #pragma optimize, that denotes whether the optimizations in the ...
Definition Sema.h:2128
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
threadSafety::BeforeSet * ThreadSafetyDeclCache
Definition Sema.h:1320
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition Sema.h:2106
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived, const CXXBasePath &Path, unsigned DiagID, llvm::function_ref< void(PartialDiagnostic &PD)> SetupPDiag, bool ForceCheck=false, bool ForceUnprivileged=false)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
Definition Sema.cpp:2113
AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E, DeclAccessPair FoundDecl)
Perform access-control checking on a previously-unresolved member access which has now been resolved ...
bool hasVisibleMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is a member specialization declaration (as oppo...
bool areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy)
Are the two types matrix types and do they have the same dimensions i.e.
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
LazyVector< VarDecl *, ExternalSemaSource, &ExternalSemaSource::ReadTentativeDefinitions, 2, 2 > TentativeDefinitionsType
Definition Sema.h:3562
SemaDirectX & DirectX()
Definition Sema.h:1450
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition Sema.h:6466
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
ExprResult BuildCXXTypeConstructExpr(TypeSourceInfo *Type, SourceLocation LParenLoc, MultiExprArg Exprs, SourceLocation RParenLoc, bool ListInitialization)
SemaMSP430 & MSP430()
Definition Sema.h:1480
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
bool hasCStrMethod(const Expr *E)
Check to see if a given expression could have '.c_str()' called on it.
friend class ASTDeclReader
Definition Sema.h:1562
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
Definition Sema.h:1281
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
ActOnCXXExitDeclaratorScope - Called when a declarator that previously invoked ActOnCXXEnterDeclarato...
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
ExprResult PerformQualificationConversion(Expr *E, QualType Ty, ExprValueKind VK=VK_PRValue, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1219
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2557
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
static const uint64_t MaximumAlignment
Definition Sema.h:1214
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition Sema.h:8976
ExprResult CheckConditionVariable(VarDecl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
Check the use of the given variable as a C++ condition in an if, while, do-while, or switch statement...
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
Definition SemaExpr.cpp:946
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:416
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15337
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition Sema.h:6468
SemaHLSL & HLSL()
Definition Sema.h:1455
VarTemplateSpecializationDecl * CompleteVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiates a variable template specialization by completing it with appropriate type information an...
llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > LateParsedTemplateMapT
Definition Sema.h:11319
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1217
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9283
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition Sema.cpp:1171
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization)
ActOnCXXTypeConstructExpr - Parse construction of a specified type.
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
FieldDecl * CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D=nullptr)
Build a new FieldDecl and check its well-formedness.
ExpressionEvaluationContextRecord & currentEvaluationContext()
Definition Sema.h:6896
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst)
Update instantiation attributes after template was late parsed.
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
PragmaClangSection PragmaClangRelroSection
Definition Sema.h:1818
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition Sema.h:1475
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition Sema.cpp:139
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
SemaRISCV & RISCV()
Definition Sema.h:1520
bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass, QualType BaseType)
Checks access to Target from the given class.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
Definition Sema.h:15511
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition Sema.h:1807
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
Definition Sema.h:5827
bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT)
Deduce the return type for a function from a returned expression, per C++1y [dcl.spec....
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition SemaExpr.cpp:207
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
ComparisonCategoryUsage
Definition Sema.h:5201
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5204
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5208
MemberPointerConversionDirection
Definition Sema.h:10189
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:13845
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6461
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:75
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS)
checkUnsafeAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained type.
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
EltwiseBuiltinArgTyRestriction
Definition Sema.h:2767
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
bool CheckAllocatedType(QualType AllocType, SourceLocation Loc, SourceRange R)
Checks that a type is suitable as the allocated type in a new-expression.
QualType InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
Diagnose cases where a scalar was implicitly converted to a vector and diagnose the underlying types.
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
static StringRef getPrintable(StringRef S)
Definition Sema.h:14909
SemaSwift & Swift()
Definition Sema.h:1535
NamedDecl * BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED)
void AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based n...
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
PragmaStack< AlignPackInfo > AlignPackStack
Definition Sema.h:2030
bool canDelayFunctionBody(const Declarator &D)
Determine whether we can delay parsing the body of a function or function template until it is used,...
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
Definition Sema.h:6566
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:6923
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition Sema.h:13490
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6498
StmtResult ActOnExprStmtError()
Definition SemaStmt.cpp:65
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2040
ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc)
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
void completeExprArrayBound(Expr *E)
DeclContext * getCurLexicalContext() const
Definition Sema.h:1124
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition Sema.h:1338
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
llvm::StringMap< std::tuple< StringRef, SourceLocation > > FunctionToSectionMap
Sections used with pragma alloc_text.
Definition Sema.h:2084
bool ActOnSuperScopeSpecifier(SourceLocation SuperLoc, SourceLocation ColonColonLoc, CXXScopeSpec &SS)
The parser has parsed a '__super' nested-name-specifier.
bool CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous)
Perform semantic analysis for the given dependent function template specialization.
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition Sema.cpp:1659
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
ExprResult ActOnRequiresExpr(SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation ClosingBraceLoc)
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool hasExplicitCallingConv(QualType T)
NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc, const Token &NextToken, CorrectionCandidateCallback *CCC=nullptr)
Perform name lookup on the given name, classifying it based on the results of name lookup and the fol...
Definition SemaDecl.cpp:894
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition SemaStmt.cpp:70
const NormalizedConstraint * getNormalizedAssociatedConstraints(const NamedDecl *ConstrainedDecl, ArrayRef< AssociatedConstraint > AssociatedConstraints)
OpenCLOptions OpenCLFeatures
Definition Sema.h:1278
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:13849
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const CXXRecordDecl * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
llvm::SmallSetVector< StringRef, 4 > MSFunctionNoBuiltins
Set of no-builtin functions listed by #pragma function.
Definition Sema.h:2131
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
void ExitDeclaratorContext(Scope *S)
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition Sema.cpp:849
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
RecordDecl * CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, unsigned NumParams)
bool isLibstdcxxEagerExceptionSpecHack(const Declarator &D)
Determine if we're in a case where we need to (incorrectly) eagerly parse an exception specification ...
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
bool buildCoroutineParameterMoves(SourceLocation Loc)
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
Definition Sema.h:4744
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, const CXXScopeSpec &SS)
DeclGroupPtrTy ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc)
The parser has processed a global-module-fragment declaration that begins the definition of the globa...
bool CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted)
void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, CapturedRegionKind Kind, unsigned NumParams)
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
UnsignedOrNone getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
Definition Sema.h:10379
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:14903
ProcessingContextState ParsingClassState
Definition Sema.h:6516
void DiagnoseMisalignedMembers()
Diagnoses the current set of gathered accesses.
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a Microsoft __uuidof expression with a type operand.
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1314
void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS)
checkUnsafeExprAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained expressi...
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2476
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
MemberPointerConversionResult CheckMemberPointerConversion(QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
FunctionDecl * CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID, SourceLocation Loc)
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData, StringRef FileName)
Scope * getNonFieldDeclScope(Scope *S)
getNonFieldDeclScope - Retrieves the innermost scope, starting from S, where a non-field would be dec...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
void pushCodeSynthesisContext(CodeSynthesisContext Ctx)
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition Sema.cpp:2910
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
bool mightBeIntendedToBeTemplateName(ExprResult E, bool &Dependent)
Determine whether it's plausible that E was intended to be a template-name.
Definition Sema.h:3827
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition Sema.h:2669
void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc)
ActOnPragmaWeakID - Called on well formed #pragma weak ident.
QualType BuiltinRemoveCVRef(QualType BaseType, SourceLocation Loc)
Definition Sema.h:15246
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
bool CheckNontrivialField(FieldDecl *FD)
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition Sema.h:6920
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
bool CheckExceptionSpecSubset(const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID, const FunctionProtoType *Superset, bool SkipSupersetFirstParameter, SourceLocation SuperLoc, const FunctionProtoType *Subset, bool SkipSubsetFirstParameter, SourceLocation SubLoc)
CheckExceptionSpecSubset - Check whether the second function type's exception specification is a subs...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
TemplateDeductionResult SubstituteExplicitTemplateArguments(FunctionTemplateDecl *FunctionTemplate, TemplateArgumentListInfo &ExplicitTemplateArgs, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< QualType > &ParamTypes, QualType *FunctionType, sema::TemplateDeductionInfo &Info)
Substitute the explicitly-provided template arguments into the given function template according to C...
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
Definition Sema.cpp:2294
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType BuildMemberPointerType(QualType T, const CXXScopeSpec &SS, CXXRecordDecl *Cls, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
ExprResult ActOnMemberAccessExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Member, Decl *ObjCImpDecl)
The main callback when the parser finds something like expression .
ExprResult BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, bool IsDefiniteInstance, const Scope *S)
Builds an implicit member access expression.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
Definition Sema.h:12956
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val, unsigned Idx=UINT_MAX, bool StrictlyUnsigned=false)
If Expr is a valid integer constant, get the value of the integer expression and return success or fa...
Definition Sema.h:4827
bool SubstParmTypes(SourceLocation Loc, ArrayRef< ParmVarDecl * > Params, const FunctionProtoType::ExtParameterInfo *ExtParamInfos, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< QualType > &ParamTypes, SmallVectorImpl< ParmVarDecl * > *OutParams, ExtParameterInfoBuilder &ParamInfos)
Substitute the given template arguments into the given set of parameters, producing the set of parame...
void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body, unsigned DiagID)
Emit DiagID if statement located on StmtLoc has a suspicious null statement as a Body,...
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
void LateTemplateParserCleanupCB(void *P)
Definition Sema.h:1324
std::pair< CXXRecordDecl *, SourceLocation > VTableUse
The list of classes whose vtables have been used within this translation unit, and the source locatio...
Definition Sema.h:5817
DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc, SourceLocation ModuleLoc, ModuleDeclKind MDK, ModuleIdPath Path, ModuleIdPath Partition, ModuleImportState &ImportState, bool SeenNoTrivialPPDirective)
The parser has processed a module-declaration that begins the definition of a module interface or imp...
void MarkThisReferenced(CXXThisExpr *This)
void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody)
Warn if a for/while loop statement S, which is followed by PossibleBody, has a suspicious null statem...
ExprResult DefaultLvalueConversion(Expr *E)
Definition SemaExpr.cpp:633
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL, unsigned ByteNo) const
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
Definition Sema.h:15331
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8138
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2080
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9817
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD)
AddOverriddenMethods - See if a method overrides any in the base classes, and if so,...
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
void maybeExtendBlockObject(ExprResult &E)
Do an explicit extend of the given block pointer if we're in ARC.
static bool isCast(CheckedConversionKind CCK)
Definition Sema.h:2524
ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< ParsedType > ArgTypes, ArrayRef< Expr * > ArgExprs)
ControllingExprOrType is either an opaque pointer coming out of a ParsedType or an Expr *.
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockError - If there is an error parsing a block, this callback is invoked to pop the informati...
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal)
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
Definition Sema.h:8005
bool hasReachableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a reachable default argument.
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
Definition Sema.cpp:2512
ParsedTemplateArgument ActOnTemplateTemplateArgument(const ParsedTemplateArgument &Arg)
Invoked when parsing a template argument.
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition Sema.h:6935
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
Definition Sema.h:6475
void CheckTCBEnforcement(const SourceLocation CallExprLoc, const NamedDecl *Callee)
Enforce the bounds of a TCB CheckTCBEnforcement - Enforces that every function in a named TCB only di...
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1418
auto getDefaultDiagFunc()
Definition Sema.h:2287
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount)
Checks that a call expression's argument count is at least the desired number.
bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew, FunctionDecl *&OperatorDelete, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const,addrspace}_cast's.
Definition SemaCast.cpp:314
DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc, SourceLocation PrivateLoc)
The parser has processed a private-module-fragment declaration that begins the definition of the priv...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition Sema.h:12433
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6494
SemaOpenCL & OpenCL()
Definition Sema.h:1500
void ActOnPragmaMSFunction(SourceLocation Loc, const llvm::SmallVectorImpl< StringRef > &NoBuiltins)
Call on well formed #pragma function.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
Definition Sema.h:13858
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
void ActOnPragmaMSStruct(PragmaMSStructKind Kind)
ActOnPragmaMSStruct - Called on well formed #pragma ms_struct [on|off].
Definition SemaAttr.cpp:616
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition Sema.h:2211
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, SourceLocation EllipsisLoc, SourceLocation LSquareLoc, Expr *IndexExpr, SourceLocation RSquareLoc)
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation, StringLiteral *SegmentName)
Called on well-formed #pragma init_seg().
Definition SemaAttr.cpp:890
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
static SourceRange getPrintable(TypeLoc TL)
Definition Sema.h:14919
bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation QuestionLoc)
Emit a specialized diagnostic when one expression is a null pointer constant and the other is not a p...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)
ParsedType getDestructorTypeForDecltype(const DeclSpec &DS, ParsedType ObjectType)
FormatArgumentPassingKind
Definition Sema.h:2599
@ FAPK_Elsewhere
Definition Sema.h:2603
@ FAPK_Fixed
Definition Sema.h:2600
@ FAPK_Variadic
Definition Sema.h:2601
@ FAPK_VAList
Definition Sema.h:2602
void FillInlineAsmIdentifierInfo(Expr *Res, llvm::InlineAsmIdentifierInfo &Info)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
CXXMethodDecl * LookupMovingAssignment(CXXRecordDecl *Class, unsigned Quals, bool RValueThis, unsigned ThisQuals)
Look up the moving assignment operator for the given class.
void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T)
Mark all of the declarations referenced within a particular AST node as referenced.
bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
Build a new nested-name-specifier for "identifier::", as described by ActOnCXXNestedNameSpecifier.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8130
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:12947
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1627
StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, NamedReturnInfo &NRInfo, bool SupressSimplerImplicitMoves)
ActOnCapScopeReturnStmt - Utility routine to type-check return statements for capturing scopes.
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
Stmt * MaybeCreateStmtWithCleanups(Stmt *SubStmt)
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, Declarator &D, Expr *Initializer)
Parsed a C++ 'new' expression (C++ 5.3.4).
CXXConstructorDecl * LookupMovingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the moving constructor for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
StmtResult ActOnCapturedRegionEnd(Stmt *S)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
bool IsCXXReplaceableType(QualType T)
Determines if a type is replaceable according to the C++26 rules.
ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, SourceLocation RParen)
bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)
Diagnose cases where we have an explicit template specialization before/after an explicit template in...
bool isAcceptable(const NamedDecl *D, AcceptableKind Kind)
Determine whether a declaration is acceptable (visible/reachable).
Definition Sema.h:15344
void RestoreNestedNameSpecifierAnnotation(void *Annotation, SourceRange AnnotationRange, CXXScopeSpec &SS)
Given an annotation pointer for a nested-name-specifier, restore the nested-name-specifier structure.
QualType getDecltypeForExpr(Expr *E)
getDecltypeForExpr - Given an expr, will return the decltype for that expression, according to the ru...
NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, const IdentifierInfo *II, SourceLocation Loc)
DeclClonePragmaWeak - clone existing decl (maybe definition), #pragma weak needs a non-definition dec...
ExprResult BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI=nullptr)
BuildQualifiedDeclarationNameExpr - Build a C++ qualified declaration name, generally during template...
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
CXXMethodDecl * LookupCopyingAssignment(CXXRecordDecl *Class, unsigned Quals, bool RValueThis, unsigned ThisQuals)
Look up the copying assignment operator for the given class.
bool CheckTypeConstraint(TemplateIdAnnotation *TypeConstraint)
std::pair< const NamedDecl *, llvm::FoldingSetNodeID > SatisfactionStackEntryTy
Definition Sema.h:14668
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition Sema.h:8326
TemplateNameKind ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool AllowInjectedClassName=false)
Form a template name from a name that is syntactically required to name a template,...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition Sema.h:3572
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6727
bool MSStructPragmaOn
Definition Sema.h:1804
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
ExprResult TransformToPotentiallyEvaluated(Expr *E)
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
void deduceHLSLAddressSpace(VarDecl *decl)
unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref< Scope *()> EnterScope)
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
Definition Sema.h:13474
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13799
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15319
SourceManager & getSourceManager() const
Definition Sema.h:923
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition Sema.h:8397
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
CallingConventionIgnoredReason
Describes the reason a calling convention specification was ignored, used for diagnostics.
Definition Sema.h:4805
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Create a new AsTypeExpr node (bitcast) from the arguments.
bool CheckVecStepExpr(Expr *E)
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Definition Sema.cpp:632
bool isModuleVisible(const Module *M, bool ModulePrivate=false)
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
Definition Sema.h:3525
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
bool CheckRebuiltStmtAttributes(ArrayRef< const Attr * > Attrs)
void diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName, SourceLocation Less, SourceLocation Greater)
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
bool hasVisibleMergedDefinition(const NamedDecl *Def)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
Definition Sema.cpp:946
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void DeclareImplicitDeductionGuides(TemplateDecl *Template, SourceLocation Loc)
Declare implicit deduction guides for a class template if we've not already done so.
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
Definition Sema.cpp:696
ClassTemplateDecl * lookupCoroutineTraits(SourceLocation KwLoc, SourceLocation FuncLoc)
Lookup 'coroutine_traits' in std namespace and std::experimental namespace.
bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
bool TemplateParameterListsAreEqual(TemplateParameterList *New, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Definition Sema.h:12173
void PerformPendingInstantiations(bool LocalOnly=false, bool AtEndOfTU=true)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value, bool SupressSimplerImplicitMoves=false)
Perform the initialization of a potentially-movable value, which is the result of return value.
bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD, DefaultedComparisonKind DCK)
bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method)
Whether this' shows up in the exception specification of a static member function.
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
bool IsFunctionConversion(QualType FromType, QualType ToType, bool *DiscardingCFIUncheckedCallee=nullptr, bool *AddingCFIUncheckedCallee=nullptr) const
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckVectorCompareOperands - vector comparisons are a clang extension that operates on extended vecto...
ExprResult ActOnDependentMemberExpr(Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
void ActOnLambdaExplicitTemplateParameterList(LambdaIntroducer &Intro, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > TParams, SourceLocation RAngleLoc, ExprResult RequiresClause)
This is called after parsing the explicit template parameter list on a lambda (if it exists) in C++2a...
void PrintPragmaAttributeInstantiationPoint()
Definition Sema.h:2299
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
Definition Sema.h:9277
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
Definition SemaAttr.cpp:550
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount, unsigned MaxArgCount)
Checks that a call expression's argument count is in the desired range.
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
Definition Sema.h:13804
CanThrowResult canThrow(const Stmt *E)
Decl * SubstDecl(Decl *D, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs)
bool isThisOutsideMemberFunctionBody(QualType BaseType)
Determine whether the given type is the type of *this that is used outside of the body of a member fu...
bool ValidateFormatString(FormatStringType FST, const StringLiteral *Str)
Verify that one format string (as understood by attribute(format)) is self-consistent; for instance,...
bool AccessCheckingSFINAE
When true, access checking violations are treated as SFINAE failures rather than hard errors.
Definition Sema.h:12362
Decl * ActOnExceptionDeclarator(Scope *S, Declarator &D)
ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch handler.
bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
void DiscardMisalignedMemberAddress(const Type *T, Expr *E)
This function checks if the expression is in the sef of potentially misaligned members and it is conv...
StringEvaluationContext
Definition Sema.h:5937
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc)
PragmaClangSection PragmaClangTextSection
Definition Sema.h:1819
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver)
CallExpr::ADLCallKind ADLCallKind
Definition Sema.h:7430
bool BoundsSafetyCheckInitialization(const InitializedEntity &Entity, const InitializationKind &Kind, AssignmentAction Action, QualType LHSType, Expr *RHSExpr)
Perform Bounds Safety Semantic checks for initializing a Bounds Safety pointer.
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation())
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
NonTrivialCUnionKind
Definition Sema.h:4071
@ NTCUK_Destruct
Definition Sema.h:4073
@ NTCUK_Init
Definition Sema.h:4072
@ NTCUK_Copy
Definition Sema.h:4074
QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI, SourceLocation Loc)
Check that the type of a non-type template parameter is well-formed.
bool PrepareBuiltinElementwiseMathOneArgCall(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::None)
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
DelayedDiagnosticsState ProcessingContextState
Definition Sema.h:1355
void CheckLookupAccess(const LookupResult &R)
Checks access to all the declarations in the given result set.
concepts::ExprRequirement * BuildExprRequirement(Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc, concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement)
void ActOnPragmaFPValueChangingOption(SourceLocation Loc, PragmaFPKind Kind, bool IsEnabled)
Called on well formed #pragma clang fp reassociate or #pragma clang fp reciprocal.
QualType BuildAtomicType(QualType T, SourceLocation Loc)
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
Definition Sema.h:8283
PragmaClangSection PragmaClangDataSection
Definition Sema.h:1816
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
ParsedType actOnLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init)
Perform initialization analysis of the init-capture and perform any implicit conversions such as an l...
Definition Sema.h:9072
TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template, SourceLocation TemplateKWLoc, SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, bool &HasDefaultArg)
If the given template parameter has a default template argument, substitute into that default templat...
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
bool anyAltivecTypes(QualType srcType, QualType destType)
void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)
TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
ExprResult LookupInlineAsmVarDeclField(Expr *RefExpr, StringRef Member, SourceLocation AsmLoc)
std::pair< AvailabilityResult, const NamedDecl * > ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message, ObjCInterfaceDecl *ClassReceiver)
The diagnostic we should emit for D, and the declaration that originated it, or AR_Available.
ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name, SourceLocation NameLoc)
Act on the result of classifying a name as an undeclared (ADL-only) non-type declaration.
StmtResult ActOnCXXForRangeStmt(Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition Sema.cpp:2342
bool diagnoseConflictingFunctionEffect(const FunctionEffectsRef &FX, const FunctionEffectWithCondition &EC, SourceLocation NewAttrLoc)
Warn and return true if adding a function effect to a set would create a conflict.
sema::FunctionScopeInfo * getCurFunctionAvailabilityContext()
Retrieve the current function, if any, that should be analyzed for potential availability violations.
void ActOnDefaultCtorInitializers(Decl *CDtorDecl)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
void ActOnPragmaRedefineExtname(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaRedefineExtname - Called on well formed #pragma redefine_extname oldname newname.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
PragmaStack< MSVtorDispMode > VtorDispStack
Whether to insert vtordisps prior to virtual bases in the Microsoft C++ ABI.
Definition Sema.h:2029
TypeSourceInfo * ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
Definition SemaAttr.cpp:90
QualType CXXCheckConditionalOperands(ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc)
Check the operands of ?
ExprResult BuildAnonymousStructUnionMemberReference(const CXXScopeSpec &SS, SourceLocation nameLoc, IndirectFieldDecl *indirectField, DeclAccessPair FoundDecl=DeclAccessPair::make(nullptr, AS_none), Expr *baseObjectExpr=nullptr, SourceLocation opLoc=SourceLocation())
TypeResult ActOnTypeName(Declarator &D)
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
MaybeODRUseExprSet MaybeODRUseExprs
Definition Sema.h:6725
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition Sema.h:928
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an initializer for the declaration ...
unsigned FunctionScopesStart
The index of the first FunctionScope that corresponds to the current context.
Definition Sema.h:1227
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2087
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8757
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:218
static SourceRange getPrintable(SourceRange R)
Definition Sema.h:14916
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
void ActOnFinishCXXMemberSpecification(Scope *S, SourceLocation RLoc, Decl *TagDecl, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
TopLevelStmtDecl * ActOnStartTopLevelStmtDecl(Scope *S)
concepts::Requirement * ActOnTypeRequirement(SourceLocation TypenameKWLoc, CXXScopeSpec &SS, SourceLocation NameLoc, const IdentifierInfo *TypeName, TemplateIdAnnotation *TemplateId)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition Sema.h:13498
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.
void ActOnUndeclaredTypeTemplateName(Scope *S, TemplateTy &Name, TemplateNameKind &TNK, SourceLocation NameLoc, IdentifierInfo *&II)
Try to resolve an undeclared template name as a type template.
ParsedType getInheritingConstructorName(CXXScopeSpec &SS, SourceLocation NameLoc, const IdentifierInfo &Name)
Handle the result of the special case name lookup for inheriting constructor declarations.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
Decl * ActOnStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc)
ExprResult ActOnStringLiteral(ArrayRef< Token > StringToks, Scope *UDLScope=nullptr)
ActOnStringLiteral - The specified tokens were lexed as pasted string fragments (e....
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
void PushSatisfactionStackEntry(const NamedDecl *D, const llvm::FoldingSetNodeID &ID)
Definition Sema.h:14653
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15286
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition Sema.h:1130
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition Sema.cpp:2872
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void emitDeferredDiags()
Definition Sema.cpp:2006
void setFunctionHasMustTail()
Definition Sema.cpp:2507
ExprResult BuildPseudoDestructorExpr(Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool hasReachableMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is a member specialization declaration (as op...
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8322
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange, SourceRange FixItRange, const sema::Capture &From)
Diagnose if an explicit lambda capture is unused.
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void PopSatisfactionStackEntry()
Definition Sema.h:14659
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
Definition Sema.cpp:2497
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition Sema.h:15375
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
bool isConstantEvaluatedContext() const
Definition Sema.h:2591
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6486
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block)
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
Definition SemaDecl.cpp:623
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
bool BuiltinElementwiseTernaryMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::FloatTy)
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition Sema.cpp:1165
StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
friend class Parser
Definition Sema.h:1559
ExprResult ActOnCXXAssumeAttr(Stmt *St, const ParsedAttr &A, SourceRange Range)
StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body, SourceLocation WhileLoc, SourceLocation CondLParen, Expr *Cond, SourceLocation CondRParen)
CXXConstructorDecl * LookupCopyingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the copying constructor for the given class.
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
std::pair< StringRef, QualType > CapturedParamNameType
Definition Sema.h:11179
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
void ApplyNullability(Decl *D, NullabilityKind Nullability)
Apply the 'Nullability:' annotation to the specified declaration.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
Definition Sema.h:3546
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
Definition SemaDecl.cpp:270
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1556
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
ASTConsumer & Consumer
Definition Sema.h:1284
bool handlerCanCatch(QualType HandlerType, QualType ExceptionType)
RequiresExprBodyDecl * ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, ArrayRef< ParmVarDecl * > LocalParameters, Scope *BodyScope)
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, bool IsAddressOfOperand)
void ActOnFinishCXXMemberDecls()
Perform any semantic analysis which needs to be delayed until all pending class member declarations h...
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4630
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition Sema.h:2189
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
Definition Sema.h:6927
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:123
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1319
bool CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg, bool PartialOrdering, bool *StrictPackMatch)
Check a template argument against its corresponding template template parameter.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
Definition Sema.cpp:1772
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:13841
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
ExprResult BuiltinShuffleVector(CallExpr *TheCall)
BuiltinShuffleVector - Handle __builtin_shufflevector.
bool CheckImplicitNullabilityTypeSpecifier(QualType &Type, NullabilityKind Nullability, SourceLocation DiagLoc, bool AllowArrayTypes, bool OverrideExisting)
Check whether a nullability type specifier can be added to the given type through some means not writ...
Decl * ActOnFinishLinkageSpecification(Scope *S, Decl *LinkageSpec, SourceLocation RBraceLoc)
ActOnFinishLinkageSpecification - Complete the definition of the C++ linkage specification LinkageSpe...
ModuleImportState
An enumeration to represent the transition of states in parsing module fragments and imports.
Definition Sema.h:9844
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9851
@ ImportFinished
after any non-import decl.
Definition Sema.h:9848
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9849
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9845
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9846
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9853
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9847
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are used in a given expression.
static QualType getPrintable(QualType T)
Definition Sema.h:14915
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition Sema.cpp:109
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition Sema.h:1248
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
bool CheckDistantExceptionSpec(QualType T)
CheckDistantExceptionSpec - Check if the given type is a pointer or pointer to member to a function w...
bool isAcceptableNestedNameSpecifier(const NamedDecl *SD, bool *CanCorrect=nullptr)
Determines whether the given declaration is an valid acceptable result for name lookup of a nested-na...
DeclResult ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS, TemplateTy Template, SourceLocation TemplateNameLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, const ParsedAttributesView &Attr)
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
Definition Sema.h:6669
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6691
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6681
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6696
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6686
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6706
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6675
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6701
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6716
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
unsigned LastEmittedCodeSynthesisContextDepth
The depth of the context stack at the point when the most recent error or warning was produced.
Definition Sema.h:13482
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
QualType BuildUnaryTransformType(QualType BaseType, UTTKind UKind, SourceLocation Loc)
AvailabilityPriority
Describes the kind of priority given to an availability attribute.
Definition Sema.h:4790
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4796
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4800
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4793
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
ExprResult BuildOperatorCoawaitLookupExpr(Scope *S, SourceLocation Loc)
std::pair< SourceLocation, bool > DeleteExprLoc
Definition Sema.h:966
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
Decl * ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, RecordDecl *&AnonRecord)
ParsedFreeStandingDeclSpec - This method is invoked when a declspec with no declarator (e....
SemaPPC & PPC()
Definition Sema.h:1510
void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace)
ActOnFinishNamespaceDef - This callback is called after a namespace is exited.
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
Definition Sema.cpp:2355
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc)
Handle a C++ member initializer.
void ActOnAfterCompoundStatementLeadingPragmas()
Definition SemaStmt.cpp:420
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
Definition SemaStmt.cpp:75
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
Definition Sema.h:4864
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
void actOnDelayedExceptionSpecification(Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr)
Add an exception-specification to the given member or friend function (or function template).
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Definition Sema.h:1246
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context)
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
bool SatisfactionStackContains(const NamedDecl *D, const llvm::FoldingSetNodeID &ID) const
Definition Sema.h:14661
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
UnsignedOrNone getFullyPackExpandedSize(TemplateArgument Arg)
Given a template argument that contains an unexpanded parameter pack, but which has already been subs...
LateTemplateParserCB * LateTemplateParser
Definition Sema.h:1325
void DiagnoseAmbiguousLookup(LookupResult &Result)
Produce a diagnostic describing the ambiguity that resulted from name lookup.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC pragma optimize in scope, consider changing t...
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition Sema.h:8333
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition Sema.h:3565
static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx, unsigned FirstArg, FormatStringInfo *FSI)
Given a function and its FormatAttr or FormatMatchesAttr info, attempts to populate the FomatStringIn...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool DeferDiags
Whether deferrable diagnostics should be deferred.
Definition Sema.h:9999
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
QualType getLambdaConversionFunctionResultType(const FunctionProtoType *CallOpType, CallingConv CC)
Get the return type to use for a lambda's conversion function(s) to function pointer type,...
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
Definition Sema.h:8120
SemaSystemZ & SystemZ()
Definition Sema.h:1540
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:123
bool isRedefinitionAllowedFor(const NamedDecl *D, bool &Visible)
Definition Sema.h:15365
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.
Definition Sema.cpp:2894
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8270
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
MemberPointerConversionResult
Definition Sema.h:10181
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
void makeModuleVisible(Module *Mod, SourceLocation ImportLoc)
Definition Sema.h:9830
bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits)
BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of TheCall is a constant expression re...
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition SemaStmt.cpp:648
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition Sema.h:1286
DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs, bool SetWrittenArgs)
Get the specialization of the given variable template corresponding to the specified argument list,...
TemplateNameIsRequiredTag
Definition Sema.h:11347
@ TemplateNameIsRequired
Definition Sema.h:11347
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, SourceLocation EllipsisLoc)
Handle a C++ member initializer using parentheses syntax.
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
ExprResult ActOnSizeofParameterPackExpr(Scope *S, SourceLocation OpLoc, IdentifierInfo &Name, SourceLocation NameLoc, SourceLocation RParenLoc)
Called when an expression computing the size of a parameter pack is parsed.
ExprResult UsualUnaryFPConversions(Expr *E)
UsualUnaryFPConversions - Promotes floating-point types according to the current language semantics.
Definition SemaExpr.cpp:777
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is an explicit specialization declaration for...
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment)
ActOnPragmaPack - Called on well formed #pragma pack(...).
Definition SemaAttr.cpp:438
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
LazyVector< CXXConstructorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadDelegatingConstructors, 2, 2 > DelegatingCtorDeclsType
Definition Sema.h:6479
LabelDecl * GetOrCreateMSAsmLabel(StringRef ExternalLabelName, SourceLocation Location, bool AlwaysCreate)
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
Definition Sema.h:1285
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:589
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7746
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:919
FPOptions CurFPFeatures
Definition Sema.h:1279
void ActOnStartSEHFinallyBlock()
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
static bool CanBeGetReturnObject(const FunctionDecl *FD)
NamespaceDecl * getStdNamespace() const
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6470
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
Definition SemaExpr.cpp:509
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2039
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
LateTemplateParserCleanupCB * LateTemplateParserCleanup
Definition Sema.h:1326
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types?
NamedDecl * ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *DefaultArg)
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
Definition Sema.cpp:2933
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< ParsedType > Args, SourceLocation RParenLoc)
Parsed one of the type trait support pseudo-functions.
TemplateParamListContext
The context in which we are checking a template parameter list.
Definition Sema.h:11530
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11540
@ TPC_FriendFunctionTemplate
Definition Sema.h:11538
@ TPC_ClassTemplateMember
Definition Sema.h:11536
@ TPC_FunctionTemplate
Definition Sema.h:11535
@ TPC_FriendClassTemplate
Definition Sema.h:11537
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11539
void ActOnPragmaVisibility(const IdentifierInfo *VisType, SourceLocation PragmaLoc)
ActOnPragmaVisibility - Called on well formed #pragma GCC visibility... .
void ActOnAbortSEHFinallyBlock()
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc)
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
SemaAVR & AVR()
Definition Sema.h:1430
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
Definition Sema.h:1560
bool GloballyUniqueObjectMightBeAccidentallyDuplicated(const VarDecl *Dcl)
Certain globally-unique variables might be accidentally duplicated if built into multiple shared libr...
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
SourceLocation OptimizeOffPragmaLocation
This represents the last location of a "#pragma clang optimize off" directive if such a directive has...
Definition Sema.h:2115
void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)
We've found a use of a templated declaration that would trigger an implicit instantiation.
void DiagnoseUnusedDecl(const NamedDecl *ND)
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
bool hasAcceptableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
Determine if the template parameter D has a reachable default argument.
QualType BuildReadPipeType(QualType T, SourceLocation Loc)
Build a Read-only Pipe type.
void PopDeclContext()
ExprResult VerifyIntegerConstantExpression(Expr *E, AllowFoldKind CanFold=AllowFoldKind::No)
Definition Sema.h:7705
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
bool ActOnCXXEnterDeclaratorScope(Scope *S, CXXScopeSpec &SS)
ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global scope or nested-name-specifi...
TemplateArgumentLoc getIdentityTemplateArgumentLoc(NamedDecl *Param, SourceLocation Location)
Get a template argument mapping the given template parameter to itself, e.g.
bool CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD, SourceLocation Loc)
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc)
Complete a lambda-expression having processed and attached the lambda body.
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
AccessResult CheckMemberAccess(SourceLocation UseLoc, CXXRecordDecl *NamingClass, DeclAccessPair Found)
Checks access to a member.
QualType CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
concepts::NestedRequirement * BuildNestedRequirement(Expr *E)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition Sema.h:6502
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13449
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:672
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
static unsigned getPrintable(unsigned I)
Definition Sema.h:14906
void checkVariadicArgument(const Expr *E, VariadicCallType CT)
Check to see if the given expression is a valid argument to a variadic function, issuing a diagnostic...
ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS, tok::TokenKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc)
Handle a C++1z fold-expression: ( expr op ... op expr ).
void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param, const Expr *ArgExpr)
CheckStaticArrayArgument - If the given argument corresponds to a static array parameter,...
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
Definition Sema.h:1802
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
llvm::BumpPtrAllocator BumpAlloc
Definition Sema.h:1232
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
QualType BuildWritePipeType(QualType T, SourceLocation Loc)
Build a Write-only Pipe type.
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition Sema.cpp:88
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
BuildForRangeKind
Definition Sema.h:11006
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11014
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11008
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11011
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
SemaNVPTX & NVPTX()
Definition Sema.h:1485
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock)
ActOnCXXCatchBlock - Takes an exception declaration and a handler block and creates a proper catch ha...
void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation, PragmaMsStackAction Action, bool Value)
ActOnPragmaMSStrictGuardStackCheck - Called on well formed #pragma strict_gs_check.
Definition SemaAttr.cpp:874
void ActOnUninitializedDecl(Decl *dcl)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
void ApplyAPINotesType(Decl *D, StringRef TypeString)
Apply the 'Type:' annotation to the specified declaration.
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation, FunctionDecl *Decl, ArrayRef< TemplateArgument > TemplateArgs, ConstraintSatisfaction &Satisfaction)
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs)
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc)
void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction, const Expr *ThisArg, ArrayRef< const Expr * > Args)
void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt)
ActOnCaseStmtBody - This installs a statement as the body of a case.
Definition SemaStmt.cpp:563
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind)
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
PragmaSectionKind
Definition Sema.h:2059
@ PSK_ConstSeg
Definition Sema.h:2062
@ PSK_DataSeg
Definition Sema.h:2060
@ PSK_CodeSeg
Definition Sema.h:2063
@ PSK_BSSSeg
Definition Sema.h:2061
void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, TypeSourceInfo *TSInfo, Expr *DimExpr, SourceLocation RParen)
TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:627
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition SemaCast.cpp:337
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
Definition Sema.h:6246
Decl * ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth)
ActOnField - Each field of a C struct/union is passed into this in order to create a FieldDecl object...
bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum)
BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a constant expression representing ...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
CodeAlignAttr * BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E)
ExprResult ActOnStmtExprResult(ExprResult E)
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
void BuildVariableInstantiation(VarDecl *NewVar, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs, LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner, LocalInstantiationScope *StartingScope, bool InstantiatingVarTemplate=false, VarTemplateSpecializationDecl *PrevVTSD=nullptr)
BuildVariableInstantiation - Used after a new variable has been created.
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns, SourceLocation AttrLoc)
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
bool isMoreSpecializedThanPrimary(ClassTemplatePartialSpecializationDecl *T, sema::TemplateDeductionInfo &Info)
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
Definition Sema.h:3540
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2096
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested, AcceptableKind Kind, bool OnlyNeedComplete=false)
UnsignedOrNone GetDecompositionElementCount(QualType DecompType, SourceLocation Loc)
PragmaClangSection PragmaClangBSSSection
Definition Sema.h:1815
Decl * ActOnDeclarator(Scope *S, Declarator &D)
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition Sema.h:1342
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition Sema.h:6192
@ AbstractSynthesizedIvarType
Definition Sema.h:6199
@ AbstractVariableType
Definition Sema.h:6196
@ AbstractReturnType
Definition Sema.h:6194
@ AbstractNone
Definition Sema.h:6193
@ AbstractFieldType
Definition Sema.h:6197
@ AbstractArrayType
Definition Sema.h:6200
@ AbstractParamType
Definition Sema.h:6195
@ AbstractIvarType
Definition Sema.h:6198
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition SemaStmt.cpp:950
MSPropertyDecl * HandleMSProperty(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS, const ParsedAttr &MSPropertyAttr)
HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
bool InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
ExprResult CheckVarOrConceptTemplateTemplateId(const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, TemplateTemplateParmDecl *Template, SourceLocation TemplateLoc, const TemplateArgumentListInfo *TemplateArgs)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
ExprResult SubstCXXIdExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
Substitute an expression as if it is a address-of-operand, which makes it act like a CXXIdExpression ...
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
SemaSPIRV & SPIRV()
Definition Sema.h:1525
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition Sema.h:8319
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ExprResult BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, SourceLocation RParenLoc, MultiExprArg Args, AtomicExpr::AtomicOp Op, AtomicArgumentOrder ArgOrder=AtomicArgumentOrder::API)
Decl * ActOnFinishExportDecl(Scope *S, Decl *ExportDecl, SourceLocation RBraceLoc)
Complete the definition of an export declaration.
void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI)
Note that we have finished the explicit captures for the given lambda.
bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr)
Check that the given template arguments can be provided to the given template, converting the argumen...
QualType BuiltinChangeSignedness(QualType BaseType, UTTKind UKind, SourceLocation Loc)
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
void ActOnPragmaFPContract(SourceLocation Loc, LangOptions::FPModeKind FPC)
ActOnPragmaFPContract - Called on well formed #pragma {STDC,OPENCL} FP_CONTRACT and #pragma clang fp ...
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc)
Called on well formed #pragma clang optimize.
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
QualType PreferredConditionType(ConditionKind K) const
Definition Sema.h:7928
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
LiteralOperatorLookupResult
The possible outcomes of name lookup for a literal operator.
Definition Sema.h:9340
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9344
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9350
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9342
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9347
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9358
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9354
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition Sema.cpp:2527
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition Sema.h:6908
SemaLoongArch & LoongArch()
Definition Sema.h:1465
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
CheckConstexprKind
Definition Sema.h:6381
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6386
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6383
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
Definition Sema.h:13837
void CheckVariableDeclarationType(VarDecl *NewVD)
sema::CompoundScopeInfo & getCurCompoundScope() const
Definition SemaStmt.cpp:432
DeclContext * FindInstantiatedContext(SourceLocation Loc, DeclContext *DC, const MultiLevelTemplateArgumentList &TemplateArgs)
Finds the instantiation of the given declaration context within the current instantiation.
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
Definition Sema.cpp:2886
OpaquePtr< TemplateName > TemplateTy
Definition Sema.h:1275
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
Definition Sema.cpp:708
bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E)
CheckCXXThrowOperand - Validate the operand of a throw.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
void ActOnPragmaDump(Scope *S, SourceLocation Loc, IdentifierInfo *II)
Called on pragma clang __debug dump II.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled)
ActOnPragmaFenvAccess - Called on well formed #pragma STDC FENV_ACCESS.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
void checkEnumArithmeticConversions(Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Perform substitution on the base class specifiers of the given class template specialization.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
llvm::SmallPtrSet< const NamedDecl *, 4 > TypoCorrectedFunctionDefinitions
The function definitions which were renamed as part of typo-correction to match their respective decl...
Definition Sema.h:3521
void ActOnFinishOfCompoundStmt()
Definition SemaStmt.cpp:428
concepts::Requirement * ActOnNestedRequirement(Expr *Constraint)
void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB)
Cause the built diagnostic to be emitted on the DiagosticsEngine.
Definition Sema.cpp:1672
QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType, bool AdjustExceptionSpec=false)
Adjust the type ArgFunctionType to match the calling convention, noreturn, and optionally the excepti...
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
Decl * ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, const ParsedAttributesView &AttrList)
bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType)
void AddSectionMSAllocText(FunctionDecl *FD)
Only called on function definitions; if there is a #pragma alloc_text that decides which code section...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15211
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
UnsignedOrNone getNumArgumentsInExpansionFromUnexpanded(llvm::ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs)
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
static ConditionResult ConditionError()
Definition Sema.h:7783
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition SemaStmt.cpp:436
void NoteTemplateParameterLocation(const NamedDecl &Decl)
SemaWasm & Wasm()
Definition Sema.h:1545
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
void FindHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
Check if a method overloads virtual methods in a base class without overriding any.
IdentifierResolver IdResolver
Definition Sema.h:3469
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, NestedNameSpecInfo &IdInfo, bool EnteringContext)
IsInvalidUnlessNestedName - This method is used for error recovery purposes to determine whether the ...
llvm::DenseSet< QualType > InstantiatedNonDependentTypes
Non-dependent types used in templates that have already been instantiated by some template instantiat...
Definition Sema.h:13445
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType &paramType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
LifetimeCaptureByAttr * ParseLifetimeCaptureByAttr(const ParsedAttr &AL, StringRef ParamName)
bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val, bool AllowMask) const
IsValueInFlagEnum - Determine if a value is allowed as part of a flag enum.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
SemaPseudoObject & PseudoObject()
Definition Sema.h:1515
LabelDecl * LookupExistingLabel(IdentifierInfo *II, SourceLocation IdentLoc)
Perform a name lookup for a label with the specified name; this does not create a new label if the lo...
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
Definition Sema.cpp:2488
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition SemaStmt.cpp:588
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition Sema.h:11312
StmtResult ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock, ArrayRef< Stmt * > Handlers)
ActOnCXXTryBlock - Takes a try compound-statement and a number of handlers and creates a try statemen...
FullExprArg MakeFullExpr(Expr *Arg)
Definition Sema.h:7739
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
Definition SemaDecl.cpp:714
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
Definition SemaDecl.cpp:143
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
Definition Sema.h:8278
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1274
static int getPrintable(int I)
Definition Sema.h:14905
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags, StringLiteral *SegmentName)
Called on well formed #pragma section().
Definition SemaAttr.cpp:885
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition Sema.h:9610
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:12787
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
Definition SemaStmt.cpp:568
ExprResult ActOnCXXThis(SourceLocation Loc)
bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)
Diagnose unexpanded parameter packs.
TemplateNameKindForDiagnostics
Describes the detailed kind of a template name. Used in diagnostics.
Definition Sema.h:3813
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
ExprResult HandleExprEvaluationContextForTypeof(Expr *E)
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
static const std::string & getPrintable(const std::string &S)
Definition Sema.h:14910
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
void warnOnReservedIdentifier(const NamedDecl *D)
StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS, SourceLocation DotDotDotLoc, ExprResult RHS, SourceLocation ColonLoc)
Definition SemaStmt.cpp:532
TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis, UnsignedOrNone &NumExpansions) const
Returns the pattern of the pack expansion for a template argument.
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
bool isCheckingDefaultArgumentOrInitializer() const
Definition Sema.h:8146
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
SemaARM & ARM()
Definition Sema.h:1425
bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, SourceLocation DefaultLoc)
bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS)
Determine whether the identifier II is a typo for the name of the class type currently being defined.
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition SemaAttr.cpp:322
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation TriviallyRelocatable, SourceLocation Replaceable, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
static const char * getPrintable(const char *S)
Definition Sema.h:14908
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
bool isAbstractType(SourceLocation Loc, QualType T)
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:653
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
PragmaMsStackAction
Definition Sema.h:1821
@ PSK_Push_Set
Definition Sema.h:1827
@ PSK_Reset
Definition Sema.h:1822
@ PSK_Pop_Set
Definition Sema.h:1828
StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body)
FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D, SourceLocation Loc=SourceLocation())
Determine whether the callee of a particular function call can throw.
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc)
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8609
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
TypeSourceInfo * SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext, Qualifiers ThisTypeQuals, bool EvaluateConstraints=true)
A form of SubstType intended specifically for instantiating the type of a FunctionDecl.
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, Expr *AsmString, MultiExprArg Clobbers, unsigned NumLabels, SourceLocation RParenLoc)
void createImplicitModuleImportForErrorRecovery(SourceLocation Loc, Module *Mod)
Create an implicit import of the given module at the given source location, for error recovery,...
void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, const Expr *ThisArg, ArrayRef< const Expr * > Args, bool IsMemberFunction, SourceLocation Loc, SourceRange Range, VariadicCallType CallType)
Handles the checks for format strings, non-POD arguments to vararg functions, NULL arguments passed t...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
Definition Overload.h:292
Stmt - This represents one statement.
Definition Stmt.h:85
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:334
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3714
Exposes information about the current target.
Definition TargetInfo.h:226
A convenient class for passing around template argument information.
A template argument list.
Location wrapper for a TemplateArgument.
Represents a template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
This is a base class for callbacks that will be notified at every template instantiation.
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
Token - This structure provides full information about a lexed token.
Definition Token.h:36
A declaration that models statements at global scope.
Definition Decl.h:4614
The top declaration context.
Definition Decl.h:104
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:223
Represents a declaration of a type.
Definition Decl.h:3510
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
A container of type source information.
Definition TypeBase.h:8256
The base class of the type hierarchy.
Definition TypeBase.h:1833
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3664
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3559
Simple class containing the result of Sema::CorrectTypo.
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:998
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3384
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition ExprCXX.h:4120
A set of unresolved declarations.
The iterator over UnresolvedSets.
Represents a C++ using-declaration.
Definition DeclCXX.h:3591
Represents C++ using-directive.
Definition DeclCXX.h:3096
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3399
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:711
Represents a variable declaration or definition.
Definition Decl.h:925
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
Represents a GCC generic vector type.
Definition TypeBase.h:4173
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2754
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Definition Lookup.h:838
Captures information about a #pragma weak directive.
Definition Weak.h:25
The API notes manager helps find API notes associated with declarations.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
A static requirement that can be used in a requires-expression to check properties of types and expre...
A requires-expression requirement which queries the existence of a type name or type template special...
Retains information about a block that is currently being parsed.
Definition ScopeInfo.h:790
Retains information about a captured region.
Definition ScopeInfo.h:816
Contains information about the compound statement currently being parsed.
Definition ScopeInfo.h:67
A collection of diagnostics which were delayed.
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
Provides information about an attempted template argument deduction, whose success or failure was des...
#define bool
Definition gpuintrin.h:32
#define UINT_MAX
Definition limits.h:64
Definition SPIR.cpp:47
Enums for the diagnostics of target, target_version and target_clones.
Definition Sema.h:840
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
void threadSafetyCleanup(BeforeSet *Cache)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:25
The JSON file list parser is used to communicate input to InstallAPI.
PragmaClangSectionAction
Definition Sema.h:473
TypeSpecifierType
Specifies the kind of type.
Definition Specifiers.h:55
ImplicitTypenameContext
Definition DeclSpec.h:1857
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OverloadKind
Definition Sema.h:809
@ NonFunction
This is not an overload because the lookup results contain a non-function.
Definition Sema.h:820
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:816
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition Sema.h:812
bool isa(CodeGen::Address addr)
Definition Address.h:330
OpaquePtr< TemplateName > ParsedTemplateTy
Definition Ownership.h:256
ArrayTypeTrait
Names for the array type traits.
Definition TypeTraits.h:42
@ CPlusPlus
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition Ownership.h:263
VariadicCallType
Definition Sema.h:511
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition Sema.h:456
CUDAFunctionTarget
Definition Cuda.h:60
CanThrowResult
Possible results from evaluation of a noexcept expression.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Definition Template.h:50
AllocationFunctionScope
The scope in which to find allocation functions.
Definition Sema.h:777
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:785
PragmaMSCommentKind
Definition PragmaKinds.h:14
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:35
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
TryCaptureKind
Definition Sema.h:651
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition Specifiers.h:39
bool isInstanceMethod(const Decl *D)
Definition Attr.h:120
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition Sema.h:659
@ BitwiseOp
A bitwise operation.
Definition Sema.h:663
@ Arithmetic
An arithmetic operation.
Definition Sema.h:661
@ Conditional
A conditional (?:) operator.
Definition Sema.h:667
@ CompAssign
A compound assignment expression.
Definition Sema.h:669
@ Comparison
A comparison.
Definition Sema.h:665
NullabilityKind
Describes the nullability of a particular type.
Definition Specifiers.h:348
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:271
@ Success
Annotation was successful.
Definition Parser.h:65
CXXConstructionKind
Definition ExprCXX.h:1541
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:149
PointerAuthDiscArgKind
Definition Sema.h:592
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition Sema.h:602
@ TemplateTemplateArgument
Definition Sema.h:611
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition Overload.h:84
NonTrivialCUnionContext
Definition Sema.h:530
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition Sema.h:626
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:634
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition Sema.h:640
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:631
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition Sema.h:637
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:235
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
void inferNoReturnAttr(Sema &S, const Decl *D)
TypeOfKind
The kind of 'typeof' expression we're after.
Definition TypeBase.h:918
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition CallGraph.h:204
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:123
@ AS_none
Definition Specifiers.h:127
LazyOffsetPtr< Decl, GlobalDeclID, &ExternalASTSource::GetExternalDecl > LazyDeclPtr
A lazy pointer to a declaration.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
Definition Ownership.h:255
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
StorageClass
Storage classes.
Definition Specifiers.h:248
Expr * Cond
};
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
Definition Overload.h:922
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
Definition Parser.h:142
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Definition TypeTraits.h:51
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
Definition Attr.h:40
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
Definition Overload.h:89
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
LambdaCaptureInitKind
Definition DeclSpec.h:2798
@ CopyInit
[a = b], [a = {b}]
Definition DeclSpec.h:2800
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ AANT_ArgumentIntegerConstant
PragmaOptionsAlignKind
Definition Sema.h:475
@ Result
The result type of a method or function.
Definition TypeBase.h:905
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
OffsetOfKind
Definition Sema.h:614
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition TypeBase.h:3717
CorrectTypoKind
Definition Sema.h:804
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isFunctionOrMethodVariadic(const Decl *D)
Definition Attr.h:112
@ Template
We are parsing a template declaration.
Definition Parser.h:81
ActionResult< CXXBaseSpecifier * > BaseResult
Definition Ownership.h:252
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition Sema.h:687
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
Definition Sema.h:710
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition Sema.h:773
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
Definition Sema.h:702
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
Definition Sema.h:752
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
Definition Sema.h:742
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
Definition Sema.h:769
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
Definition Sema.h:756
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
Definition Sema.h:694
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
Definition Sema.h:736
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
Definition Sema.h:731
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
Definition Sema.h:765
@ Compatible
Compatible - the types are compatible according to the standard.
Definition Sema.h:689
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
Definition Sema.h:721
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
Definition Sema.h:698
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
Definition Sema.h:706
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
Definition Sema.h:748
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
Definition Sema.h:715
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
Definition Sema.h:727
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
Definition Sema.h:760
TagUseKind
Definition Sema.h:448
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition LangOptions.h:37
PragmaClangSectionKind
pragma clang section kind
Definition Sema.h:464
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5888
TUFragmentKind
Definition Sema.h:484
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
NameClassificationKind
Describes the result of the name lookup and resolution performed by Sema::ClassifyName().
Definition Sema.h:553
@ FunctionTemplate
The name was classified as a function template name.
Definition Sema.h:585
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:560
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
Definition Sema.h:574
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
Definition Sema.h:587
@ NonType
The name was classified as a specific non-type, non-template declaration.
Definition Sema.h:566
@ Unknown
This name is not a type or template in this context, but might be something else.
Definition Sema.h:556
@ Error
Classification failed; an error has been produced.
Definition Sema.h:558
@ Type
The name was classified as a type.
Definition Sema.h:562
@ TypeTemplate
The name was classified as a template whose specializations are types.
Definition Sema.h:581
@ Concept
The name was classified as a concept name.
Definition Sema.h:589
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:579
@ UndeclaredNonType
The name was classified as an ADL-only function name.
Definition Sema.h:570
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:583
LangAS
Defines the address space values used by the address space qualifier of QualType.
FormatStringType
Definition Sema.h:496
CastKind
CastKind - The kind of operation required for a conversion.
AllowFoldKind
Definition Sema.h:653
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Complete
The translation unit is a complete translation unit.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
Definition Ownership.h:261
VarArgKind
Definition Sema.h:674
PragmaMSStructKind
Definition PragmaKinds.h:23
AssignmentAction
Definition Sema.h:213
CXXSpecialMemberKind
Kinds of C++ special members.
Definition Sema.h:424
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
@ TNK_Function_template
The name refers to a function template or a set of overloaded functions that includes at least one fu...
@ TNK_Concept_template
The name refers to a concept.
@ TNK_Undeclared_template
Lookup for the name failed, but we're assuming it was a template name anyway.
BuiltinCountedByRefKind
Definition Sema.h:519
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition Lambda.h:22
PragmaFloatControlKind
Definition PragmaKinds.h:28
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:117
TypeAwareAllocationMode
Definition ExprCXX.h:2253
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition Sema.h:789
@ Exists
The symbol exists.
Definition Sema.h:791
@ DoesNotExist
The symbol does not exist.
Definition Sema.h:794
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition Specifiers.h:410
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition Attr.h:55
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
Definition Attr.h:64
TPOC
The context in which partial ordering of function templates occurs.
Definition Template.h:298
TrivialABIHandling
Definition Sema.h:643
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition Sema.h:648
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition Sema.h:645
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:366
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
Definition Sema.h:416
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
Definition Sema.h:411
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
Definition Sema.h:414
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
Definition Sema.h:387
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
Definition Sema.h:373
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
Definition Sema.h:409
@ CUDATargetMismatch
CUDA Target attributes do not match.
Definition Sema.h:418
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
Definition Sema.h:406
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:376
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
Definition Sema.h:390
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
Definition Sema.h:379
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
Definition Sema.h:393
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:382
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
Definition Sema.h:403
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:420
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
Definition Sema.h:397
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
Definition Sema.h:400
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
U cast(CodeGen::Address addr)
Definition Address.h:327
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
Definition DeclSpec.h:1215
@ None
The alignment was not explicit in code.
Definition ASTContext.h:146
CCEKind
Contexts in which a converted constant expression is required.
Definition Sema.h:824
@ CaseValue
Expression in a case label.
Definition Sema.h:825
@ StaticAssertMessageData
Call to data() in a static assert message.
Definition Sema.h:835
@ Enumerator
Enumerator value with fixed underlying type.
Definition Sema.h:826
@ StaticAssertMessageSize
Call to size() in a static assert message.
Definition Sema.h:833
@ Noexcept
Condition in a noexcept(bool) specifier.
Definition Sema.h:832
@ ArrayBound
Array bound in array declarator or new-expression.
Definition Sema.h:830
@ TempArgStrict
As above, but applies strict template checking rules.
Definition Sema.h:828
@ ExplicitBool
Condition in an explicit(bool) specifier.
Definition Sema.h:831
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
SourceLocIdentKind
Definition Expr.h:4938
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5863
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5874
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5877
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:5881
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
TypeTrait
Names for traits that operate specifically on types.
Definition TypeTraits.h:21
@ Parens
New-expression has a C++98 paren-delimited initializer.
Definition ExprCXX.h:2247
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Dynamic
throw(T1, T2)
PredefinedIdentKind
Definition Expr.h:1989
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:435
@ Implicit
An implicit conversion.
Definition Sema.h:437
@ CStyleCast
A C-style cast.
Definition Sema.h:439
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
Definition Sema.h:445
@ OtherCast
A cast other than a C-style cast.
Definition Sema.h:443
@ FunctionalCast
A functional-style cast.
Definition Sema.h:441
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
Definition Specifiers.h:173
unsigned int uint32_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
int const char * function
Definition c++config.h:31
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:91
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
A structure used to record information about a failed template argument deduction,...
Describes whether we've seen any nullability information for the given file.
Definition Sema.h:239
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition Sema.h:246
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition Sema.h:242
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition Sema.h:252
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition Sema.h:249
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition TypeBase.h:5001
Holds information about the various types of exception specification.
Definition TypeBase.h:5321
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5323
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5326
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5329
Extra information about a function prototype.
Definition TypeBase.h:5349
Represents a complete lambda introducer.
Definition DeclSpec.h:2806
Contains a late templated function.
Definition Sema.h:15534
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15539
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15537
A normalized constraint, as defined in C++ [temp.constr.normal], is either an atomic constraint,...
Definition SemaConcept.h:68
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Definition Overload.h:926
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Definition Sema.h:2034
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition Sema.h:10471
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10478
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10480
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:11938
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:11934
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:11915
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:11927
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:11924
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:11924
CheckTemplateArgumentInfo & operator=(const CheckTemplateArgumentInfo &)=delete
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition Sema.h:12961
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13128
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool SavedInNonInstantiationSFINAEContext
Was the enclosing context a non-instantiation SFINAE context?
Definition Sema.h:13078
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13097
sema::TemplateDeductionInfo * DeductionInfo
The template deduction info object associated with the substitution or checking of explicit or deduce...
Definition Sema.h:13123
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13116
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13092
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13084
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13110
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13081
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13100
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13107
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:12963
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13055
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:12973
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:12982
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13001
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13052
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13009
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13016
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13059
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13027
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13065
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:12992
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13071
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13068
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13074
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:12989
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:12997
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13005
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:12966
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13019
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13023
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:12978
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13049
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13012
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13087
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13113
bool isInstantiationRecord() const
Determines whether this template is an actual instantiation that should be counted toward the maximum...
InitializationContext(SourceLocation Loc, ValueDecl *Decl, DeclContext *Context)
Definition Sema.h:6825
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6731
SmallVector< CXXBindTemporaryExpr *, 8 > DelayedDecltypeBinds
If we are processing a decltype type, a set of temporary binding expressions for which we have deferr...
Definition Sema.h:6759
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6761
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6812
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6751
SmallVector< CallExpr *, 8 > DelayedDecltypeCalls
If we are processing a decltype type, a set of call expressions for which we have deferred checking t...
Definition Sema.h:6755
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6766
llvm::SmallPtrSet< DeclRefExpr *, 4 > ReferenceToConsteval
Set of DeclRefExprs referencing a consteval function when used in a context not already known to be i...
Definition Sema.h:6774
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6770
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6815
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6780
enum clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind ExprContext
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
Definition Sema.h:6746
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6788
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6818
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6784
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6736
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6835
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6837
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6733
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6740
FormatArgumentPassingKind ArgPassingKind
Definition Sema.h:2611
FunctionEffectDiffVector(const FunctionEffectsRef &Old, const FunctionEffectsRef &New)
Caller should short-circuit by checking for equality first.
std::optional< FunctionEffectWithCondition > Old
Definition Sema.h:15441
bool shouldDiagnoseConversion(QualType SrcType, const FunctionEffectsRef &SrcFX, QualType DstType, const FunctionEffectsRef &DstFX) const
Return true if adding or removing the effect as part of a type conversion should generate a diagnosti...
bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction, const FunctionEffectsRef &OldFX, const FunctionDecl &NewFunction, const FunctionEffectsRef &NewFX) const
Return true if adding or removing the effect in a redeclaration should generate a diagnostic.
StringRef effectName() const
Definition Sema.h:15445
OverrideResult shouldDiagnoseMethodOverride(const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX, const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const
Return true if adding or removing the effect in a C++ virtual method override should generate a diagn...
OverrideResult
Describes the result of effects differing between a base class's virtual method and an overriding met...
Definition Sema.h:15453
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15443
FunctionEffect::Kind EffectKind
Definition Sema.h:15438
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13312
InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, Decl *Entity, SourceRange InstantiationRange=SourceRange())
Note that we are instantiating a class template, function template, variable template,...
void Clear()
Note that we have finished instantiating this template.
bool isAlreadyInstantiating() const
Determine whether we are already instantiating this specialization in some surrounding active instant...
Definition Sema.h:13316
LocalInstantiationScope * Scope
Definition Sema.h:13964
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:13967
bool isMoveEligible() const
Definition Sema.h:11070
bool isCopyElidable() const
Definition Sema.h:11071
const VarDecl * Candidate
Definition Sema.h:11065
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3282
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3291
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3285
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3288
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3279
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3297
SourceLocation LocStart
Definition Sema.h:7517
IdentifierInfo * IdentInfo
Definition Sema.h:7520
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12534
This an attribute introduced by #pragma clang attribute.
Definition Sema.h:2090
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition Sema.h:2093
A push'd group of PragmaAttributeEntries.
Definition Sema.h:2098
SourceLocation Loc
The location of the push attribute.
Definition Sema.h:2100
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition Sema.h:2103
const IdentifierInfo * Namespace
The namespace of this push group.
Definition Sema.h:2102
SourceLocation PragmaLocation
Definition Sema.h:1812
PragmaMsStackAction Action
Definition Sema.h:1832
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition Sema.h:1945
llvm::StringRef StackSlotLabel
Definition Sema.h:1941
SourceLocation PragmaLocation
Definition Sema.h:1943
SourceLocation PragmaPushLocation
Definition Sema.h:1944
ValueType CurrentValue
Definition Sema.h:2015
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition Sema.h:2001
bool hasValue() const
Definition Sema.h:2011
SmallVector< Slot, 2 > Stack
Definition Sema.h:2013
ValueType DefaultValue
Definition Sema.h:2014
SourceLocation CurrentPragmaLocation
Definition Sema.h:2016
PragmaStack(const ValueType &Default)
Definition Sema.h:2008
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition Sema.h:1952
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition Sema.h:5047
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5041
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Definition Sema.h:10368
Abstract class used to diagnose incomplete types.
Definition Sema.h:8211
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition Sema.h:2653
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition Sema.h:2662
bool CheckSameAsPrevious
Definition Sema.h:352
NamedDecl * Previous
Definition Sema.h:353
SkipBodyInfo()=default
NamedDecl * New
Definition Sema.h:354
Information about a template-id annotation token.