clang 23.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"
40#include "clang/Basic/Cuda.h"
44#include "clang/Basic/LLVM.h"
45#include "clang/Basic/Lambda.h"
47#include "clang/Basic/Module.h"
59#include "clang/Sema/Attr.h"
61#include "clang/Sema/DeclSpec.h"
67#include "clang/Sema/Scope.h"
68#include "clang/Sema/SemaBase.h"
72#include "clang/Sema/Weak.h"
73#include "llvm/ADT/APInt.h"
74#include "llvm/ADT/ArrayRef.h"
75#include "llvm/ADT/BitmaskEnum.h"
76#include "llvm/ADT/DenseMap.h"
77#include "llvm/ADT/DenseSet.h"
78#include "llvm/ADT/FloatingPointMode.h"
79#include "llvm/ADT/FoldingSet.h"
80#include "llvm/ADT/MapVector.h"
81#include "llvm/ADT/PointerIntPair.h"
82#include "llvm/ADT/PointerUnion.h"
83#include "llvm/ADT/STLExtras.h"
84#include "llvm/ADT/STLForwardCompat.h"
85#include "llvm/ADT/STLFunctionalExtras.h"
86#include "llvm/ADT/SetVector.h"
87#include "llvm/ADT/SmallBitVector.h"
88#include "llvm/ADT/SmallPtrSet.h"
89#include "llvm/ADT/SmallSet.h"
90#include "llvm/ADT/SmallVector.h"
91#include "llvm/ADT/StringExtras.h"
92#include "llvm/ADT/StringMap.h"
93#include "llvm/ADT/TinyPtrVector.h"
94#include "llvm/Support/Allocator.h"
95#include "llvm/Support/Compiler.h"
96#include "llvm/Support/Error.h"
97#include "llvm/Support/ErrorHandling.h"
98#include <cassert>
99#include <climits>
100#include <cstddef>
101#include <cstdint>
102#include <deque>
103#include <functional>
104#include <iterator>
105#include <memory>
106#include <optional>
107#include <string>
108#include <tuple>
109#include <type_traits>
110#include <utility>
111#include <vector>
112
113namespace llvm {
114struct InlineAsmIdentifierInfo;
115} // namespace llvm
116
117namespace clang {
118class ADLResult;
119class APValue;
121class ASTConsumer;
122class ASTContext;
123class ASTDeclReader;
125class ASTReader;
126class ASTWriter;
127class CXXBasePath;
128class CXXBasePaths;
131enum class ComparisonCategoryType : unsigned char;
133class DarwinSDKInfo;
134class DeclGroupRef;
138class Designation;
139class IdentifierInfo;
145enum class LangAS : unsigned int;
147class LookupResult;
150class ModuleLoader;
154class ObjCMethodDecl;
155struct OverloadCandidate;
156enum class OverloadCandidateParamOrder : char;
157enum OverloadCandidateRewriteKind : unsigned;
159class Preprocessor;
160class SemaAMDGPU;
161class SemaARM;
162class SemaAVR;
163class SemaBPF;
165class SemaCUDA;
166class SemaDirectX;
167class SemaHLSL;
168class SemaHexagon;
169class SemaLoongArch;
170class SemaM68k;
171class SemaMIPS;
172class SemaMSP430;
173class SemaNVPTX;
174class SemaObjC;
175class SemaOpenACC;
176class SemaOpenCL;
177class SemaOpenMP;
178class SemaPPC;
179class SemaPseudoObject;
180class SemaRISCV;
181class SemaSPIRV;
182class SemaSYCL;
183class SemaSwift;
184class SemaSystemZ;
185class SemaWasm;
186class SemaX86;
188class TemplateArgument;
193class Token;
194class TypeConstraint;
199
200namespace sema {
201class BlockScopeInfo;
202class Capture;
209class LambdaScopeInfo;
210class SemaPPCallbacks;
212} // namespace sema
213
214// AssignmentAction - This is used by all the assignment diagnostic functions
215// to represent what is actually causing the operation
226
227namespace threadSafety {
228class BeforeSet;
229void threadSafetyCleanup(BeforeSet *Cache);
230} // namespace threadSafety
231
232// FIXME: No way to easily map from TemplateTypeParmTypes to
233// TemplateTypeParmDecls, so we have this horrible PointerUnion.
234typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
235 const TemplateSpecializationType *,
236 const SubstBuiltinTemplatePackType *>,
239
240/// Describes whether we've seen any nullability information for the given
241/// file.
243 /// The first pointer declarator (of any pointer kind) in the file that does
244 /// not have a corresponding nullability annotation.
246
247 /// The end location for the first pointer declarator in the file. Used for
248 /// placing fix-its.
250
251 /// Which kind of pointer declarator we saw.
252 uint8_t PointerKind;
253
254 /// Whether we saw any type nullability annotations in the given file.
255 bool SawTypeNullability = false;
256};
257
258/// A mapping from file IDs to a record of whether we've seen nullability
259/// information in that file.
261 /// A mapping from file IDs to the nullability information for each file ID.
262 llvm::DenseMap<FileID, FileNullability> Map;
263
264 /// A single-element cache based on the file ID.
265 struct {
268 } Cache;
269
270public:
272 // Check the single-element cache.
273 if (file == Cache.File)
274 return Cache.Nullability;
275
276 // It's not in the single-element cache; flush the cache if we have one.
277 if (!Cache.File.isInvalid()) {
278 Map[Cache.File] = Cache.Nullability;
279 }
280
281 // Pull this entry into the cache.
282 Cache.File = file;
283 Cache.Nullability = Map[file];
284 return Cache.Nullability;
285 }
286};
287
288/// Tracks expected type during expression parsing, for use in code completion.
289/// The type is tied to a particular token, all functions that update or consume
290/// the type take a start location of the token they are looking at as a
291/// parameter. This avoids updating the type on hot paths in the parser.
293public:
295 : Ctx(Ctx), Enabled(Enabled) {}
296
300 /// Handles e.g. BaseType{ .D = Tok...
302 const Designation &D);
303 /// Computing a type for the function argument may require running
304 /// overloading, so we postpone its computation until it is actually needed.
305 ///
306 /// Clients should be very careful when using this function, as it stores a
307 /// function_ref, clients should make sure all calls to get() with the same
308 /// location happen while function_ref is alive.
309 ///
310 /// The callback should also emit signature help as a side-effect, but only
311 /// if the completion point has been reached.
313 llvm::function_ref<QualType()> ComputeType);
314
317 SourceLocation OpLoc);
320 void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
321 /// Handles all type casts, including C-style cast, C++ casts, etc.
323
324 /// Get the expected type associated with this location, if any.
325 ///
326 /// If the location is a function argument, determining the expected type
327 /// involves considering all function overloads and the arguments so far.
328 /// In this case, signature help for these function overloads will be reported
329 /// as a side-effect (only if the completion point has been reached).
331 if (!Enabled || Tok != ExpectedLoc)
332 return QualType();
333 if (!Type.isNull())
334 return Type;
335 if (ComputeType)
336 return ComputeType();
337 return QualType();
338 }
339
340private:
341 ASTContext *Ctx;
342 bool Enabled;
343 /// Start position of a token for which we store expected type.
344 SourceLocation ExpectedLoc;
345 /// Expected type for a token starting at ExpectedLoc.
347 /// A function to compute expected type at ExpectedLoc. It is only considered
348 /// if Type is null.
349 llvm::function_ref<QualType()> ComputeType;
350};
351
353 SkipBodyInfo() = default;
354 bool ShouldSkip = false;
356 NamedDecl *Previous = nullptr;
357 NamedDecl *New = nullptr;
358};
359
360/// Describes the result of template argument deduction.
361///
362/// The TemplateDeductionResult enumeration describes the result of
363/// template argument deduction, as returned from
364/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
365/// structure provides additional information about the results of
366/// template argument deduction, e.g., the deduced template argument
367/// list (if successful) or the specific template parameters or
368/// deduced arguments that were involved in the failure.
370 /// Template argument deduction was successful.
372 /// The declaration was invalid; do nothing.
374 /// Template argument deduction exceeded the maximum template
375 /// instantiation depth (which has already been diagnosed).
377 /// Template argument deduction did not deduce a value
378 /// for every template parameter.
380 /// Template argument deduction did not deduce a value for every
381 /// expansion of an expanded template parameter pack.
383 /// Template argument deduction produced inconsistent
384 /// deduced values for the given template parameter.
386 /// Template argument deduction failed due to inconsistent
387 /// cv-qualifiers on a template parameter type that would
388 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
389 /// but were given a non-const "X".
391 /// Substitution of the deduced template argument values
392 /// resulted in an error.
394 /// After substituting deduced template arguments, a dependent
395 /// parameter type did not match the corresponding argument.
397 /// After substituting deduced template arguments, an element of
398 /// a dependent parameter type did not match the corresponding element
399 /// of the corresponding argument (when deducing from an initializer list).
401 /// A non-depnedent component of the parameter did not match the
402 /// corresponding component of the argument.
404 /// When performing template argument deduction for a function
405 /// template, there were too many call arguments.
407 /// When performing template argument deduction for a function
408 /// template, there were too few call arguments.
410 /// The explicitly-specified template arguments were not valid
411 /// template arguments for the given template.
413 /// Checking non-dependent argument conversions failed.
415 /// The deduced arguments did not satisfy the constraints associated
416 /// with the template.
418 /// Deduction failed; that's all we know.
420 /// CUDA Target attributes do not match.
422 /// Some error which was already diagnosed.
424};
425
426/// Kinds of C++ special members.
436
437/// The kind of conversion being performed.
439 /// An implicit conversion.
441 /// A C-style cast.
443 /// A functional-style cast.
445 /// A cast other than a C-style cast.
447 /// A conversion for an operand of a builtin overloaded operator.
449};
450
451enum class TagUseKind {
452 Reference, // Reference to a tag: 'struct foo *X;'
453 Declaration, // Fwd decl of a tag: 'struct foo;'
454 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
455 Friend // Friend declaration: 'friend struct foo;'
456};
457
458/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
459enum class FunctionEffectMode : uint8_t {
460 None, // effect is not present.
461 False, // effect(false).
462 True, // effect(true).
463 Dependent // effect(expr) where expr is dependent.
464};
465
466/// pragma clang section kind
469 BSS = 1,
470 Data = 2,
472 Text = 4,
474};
475
476enum class PragmaClangSectionAction { Set = 0, Clear = 1 };
477
479 Native, // #pragma options align=native
480 Natural, // #pragma options align=natural
481 Packed, // #pragma options align=packed
482 Power, // #pragma options align=power
483 Mac68k, // #pragma options align=mac68k
484 Reset // #pragma options align=reset
485};
486
487enum class TUFragmentKind {
488 /// The global module fragment, between 'module;' and a module-declaration.
490 /// A normal translation unit fragment. For a non-module unit, this is the
491 /// entire translation unit. Otherwise, it runs from the module-declaration
492 /// to the private-module-fragment (if any) or the end of the TU (if not).
494 /// The private module fragment, between 'module :private;' and the end of
495 /// the translation unit.
497};
498
511
512// Used for emitting the right warning by DefaultVariadicArgumentPromotion
520
529
530// Contexts where using non-trivial C union types can be disallowed. This is
531// passed to err_non_trivial_c_union_in_invalid_context.
533 // Function parameter.
535 // Function return.
537 // Default-initialized object.
539 // Variable with automatic storage duration.
541 // Initializer expression that might copy from another object.
543 // Assignment.
545 // Compound literal.
547 // Block capture.
549 // lvalue-to-rvalue conversion of volatile type.
551};
552
553/// Describes the result of the name lookup and resolution performed
554/// by \c Sema::ClassifyName().
556 /// This name is not a type or template in this context, but might be
557 /// something else.
559 /// Classification failed; an error has been produced.
561 /// The name has been typo-corrected to a keyword.
563 /// The name was classified as a type.
565 /// The name was classified as a specific non-type, non-template
566 /// declaration. ActOnNameClassifiedAsNonType should be called to
567 /// convert the declaration to an expression.
569 /// The name was classified as an ADL-only function name.
570 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
571 /// result to an expression.
573 /// The name denotes a member of a dependent type that could not be
574 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
575 /// convert the result to an expression.
577 /// The name was classified as an overload set, and an expression
578 /// representing that overload set has been formed.
579 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
580 /// expression referencing the overload set.
582 /// The name was classified as a template whose specializations are types.
584 /// The name was classified as a variable template name.
586 /// The name was classified as a function template name.
588 /// The name was classified as an ADL-only function template name.
590 /// The name was classified as a concept name.
592};
593
595 // Address discrimination argument of __ptrauth.
597
598 // Extra discriminator argument of __ptrauth.
600};
601
602/// Common ways to introduce type names without a tag for use in diagnostics.
603/// Keep in sync with err_tag_reference_non_tag.
615
616enum class OffsetOfKind {
617 // Not parsing a type within __builtin_offsetof.
619 // Parsing a type within __builtin_offsetof.
621 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
622 // To improve our diagnostic message.
624};
625
626/// Describes the kind of merge to perform for availability
627/// attributes (including "deprecated", "unavailable", and "availability").
629 /// Don't merge availability attributes at all.
631 /// Merge availability attributes for a redeclaration, which requires
632 /// an exact match.
634 /// Merge availability attributes for an override, which requires
635 /// an exact match or a weakening of constraints.
637 /// Merge availability attributes for an implementation of
638 /// a protocol requirement.
640 /// Merge availability attributes for an implementation of
641 /// an optional protocol requirement.
643};
644
646 /// The triviality of a method unaffected by "trivial_abi".
648
649 /// The triviality of a method affected by "trivial_abi".
651};
652
654
655enum class AllowFoldKind {
658};
659
660/// Context in which we're performing a usual arithmetic conversion.
661enum class ArithConvKind {
662 /// An arithmetic operation.
664 /// A bitwise operation.
666 /// A comparison.
668 /// A conditional (?:) operator.
670 /// A compound assignment expression.
672};
673
674// Used for determining in which context a type is allowed to be passed to a
675// vararg function.
683
684/// AssignConvertType - All of the 'assignment' semantic checks return this
685/// enum to indicate whether the assignment was allowed. These checks are
686/// done for simple assignments, as well as initialization, return from
687/// function, argument passing, etc. The query is phrased in terms of a
688/// source and destination type.
690 /// Compatible - the types are compatible according to the standard.
692
693 /// CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because
694 /// a void * can implicitly convert to another pointer type, which we
695 /// differentiate for better diagnostic behavior.
697
698 /// PointerToInt - The assignment converts a pointer to an int, which we
699 /// accept as an extension.
701
702 /// IntToPointer - The assignment converts an int to a pointer, which we
703 /// accept as an extension.
705
706 /// FunctionVoidPointer - The assignment is between a function pointer and
707 /// void*, which the standard doesn't allow, but we accept as an extension.
709
710 /// IncompatiblePointer - The assignment is between two pointers types that
711 /// are not compatible, but we accept them as an extension.
713
714 /// IncompatibleFunctionPointer - The assignment is between two function
715 /// pointers types that are not compatible, but we accept them as an
716 /// extension.
718
719 /// IncompatibleFunctionPointerStrict - The assignment is between two
720 /// function pointer types that are not identical, but are compatible,
721 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
722 /// may trip an indirect call runtime check.
724
725 /// IncompatiblePointerSign - The assignment is between two pointers types
726 /// which point to integers which have a different sign, but are otherwise
727 /// identical. This is a subset of the above, but broken out because it's by
728 /// far the most common case of incompatible pointers.
730
731 /// CompatiblePointerDiscardsQualifiers - The assignment discards
732 /// c/v/r qualifiers, which we accept as an extension.
734
735 /// IncompatiblePointerDiscardsQualifiers - The assignment
736 /// discards qualifiers that we don't permit to be discarded,
737 /// like address spaces.
739
740 /// IncompatiblePointerDiscardsOverflowBehavior - The assignment
741 /// discards overflow behavior annotations between otherwise compatible
742 /// pointer types.
744
745 /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
746 /// changes address spaces in nested pointer types which is not allowed.
747 /// For instance, converting __private int ** to __generic int ** is
748 /// illegal even though __private could be converted to __generic.
750
751 /// IncompatibleNestedPointerQualifiers - The assignment is between two
752 /// nested pointer types, and the qualifiers other than the first two
753 /// levels differ e.g. char ** -> const char **, but we accept them as an
754 /// extension.
756
757 /// IncompatibleVectors - The assignment is between two vector types that
758 /// have the same size, which we accept as an extension.
760
761 /// IntToBlockPointer - The assignment converts an int to a block
762 /// pointer. We disallow this.
764
765 /// IncompatibleBlockPointer - The assignment is between two block
766 /// pointers types that are not compatible.
768
769 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
770 /// id type and something else (that is incompatible with it). For example,
771 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
773
774 /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
775 /// object with __weak qualifier.
777
778 /// IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType
779 /// kinds, e.g., from __ob_trap to __ob_wrap or vice versa.
781
782 /// CompatibleOBTDiscards - Assignment discards overflow behavior
784
785 /// Incompatible - We reject this conversion outright, it is invalid to
786 /// represent it in the AST.
788};
789
790/// The scope in which to find allocation functions.
792 /// Only look for allocation functions in the global scope.
794 /// Only look for allocation functions in the scope of the
795 /// allocated class.
797 /// Look for allocation functions in both the global scope
798 /// and in the scope of the allocated class.
800};
801
802/// Describes the result of an "if-exists" condition check.
803enum class IfExistsResult {
804 /// The symbol exists.
806
807 /// The symbol does not exist.
809
810 /// The name is a dependent name, so the results will differ
811 /// from one instantiation to the next.
813
814 /// An error occurred.
816};
817
818enum class CorrectTypoKind {
819 NonError, // CorrectTypo used in a non error recovery situation.
820 ErrorRecovery // CorrectTypo used in normal error recovery.
821};
822
823enum class OverloadKind {
824 /// This is a legitimate overload: the existing declarations are
825 /// functions or function templates with different signatures.
827
828 /// This is not an overload because the signature exactly matches
829 /// an existing declaration.
831
832 /// This is not an overload because the lookup results contain a
833 /// non-function.
835};
836
837/// Contexts in which a converted constant expression is required.
838enum class CCEKind {
839 CaseValue, ///< Expression in a case label.
840 Enumerator, ///< Enumerator value with fixed underlying type.
841 TemplateArg, ///< Value of a non-type template parameter.
842 TempArgStrict, ///< As above, but applies strict template checking
843 ///< rules.
844 ArrayBound, ///< Array bound in array declarator or new-expression.
845 ExplicitBool, ///< Condition in an explicit(bool) specifier.
846 Noexcept, ///< Condition in a noexcept(bool) specifier.
847 StaticAssertMessageSize, ///< Call to size() in a static assert
848 ///< message.
849 StaticAssertMessageData, ///< Call to data() in a static assert
850 ///< message.
851};
852
853/// Enums for the diagnostics of target, target_version and target_clones.
854namespace DiagAttrParams {
858} // end namespace DiagAttrParams
859
860void inferNoReturnAttr(Sema &S, Decl *D);
861
862#ifdef __GNUC__
863#pragma GCC diagnostic push
864#pragma GCC diagnostic ignored "-Wattributes"
865#endif
866/// Sema - This implements semantic analysis and AST building for C.
867/// \nosubgrouping
868class Sema final : public SemaBase {
869#ifdef __GNUC__
870#pragma GCC diagnostic pop
871#endif
872 // Table of Contents
873 // -----------------
874 // 1. Semantic Analysis (Sema.cpp)
875 // 2. API Notes (SemaAPINotes.cpp)
876 // 3. C++ Access Control (SemaAccess.cpp)
877 // 4. Attributes (SemaAttr.cpp)
878 // 5. Availability Attribute Handling (SemaAvailability.cpp)
879 // 6. Bounds Safety (SemaBoundsSafety.cpp)
880 // 7. Casts (SemaCast.cpp)
881 // 8. Extra Semantic Checking (SemaChecking.cpp)
882 // 9. C++ Coroutines (SemaCoroutine.cpp)
883 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
884 // 11. Declarations (SemaDecl.cpp)
885 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
886 // 13. C++ Declarations (SemaDeclCXX.cpp)
887 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
888 // 15. Expressions (SemaExpr.cpp)
889 // 16. C++ Expressions (SemaExprCXX.cpp)
890 // 17. Member Access Expressions (SemaExprMember.cpp)
891 // 18. Initializers (SemaInit.cpp)
892 // 19. C++ Lambda Expressions (SemaLambda.cpp)
893 // 20. Name Lookup (SemaLookup.cpp)
894 // 21. Modules (SemaModule.cpp)
895 // 22. C++ Overloading (SemaOverload.cpp)
896 // 23. Statements (SemaStmt.cpp)
897 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
898 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
899 // 26. C++ Templates (SemaTemplate.cpp)
900 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
901 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
902 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
903 // 30. C++ Template Declaration Instantiation
904 // (SemaTemplateInstantiateDecl.cpp)
905 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
906 // 32. Constraints and Concepts (SemaConcept.cpp)
907 // 33. Types (SemaType.cpp)
908 // 34. FixIt Helpers (SemaFixItUtils.cpp)
909 // 35. Function Effects (SemaFunctionEffects.cpp)
910
911 /// \name Semantic Analysis
912 /// Implementations are in Sema.cpp
913 ///@{
914
915public:
916 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
918 CodeCompleteConsumer *CompletionConsumer = nullptr);
919 ~Sema();
920
921 /// Perform initialization that occurs after the parser has been
922 /// initialized but before it parses anything.
923 void Initialize();
924
925 /// This virtual key function only exists to limit the emission of debug info
926 /// describing the Sema class. GCC and Clang only emit debug info for a class
927 /// with a vtable when the vtable is emitted. Sema is final and not
928 /// polymorphic, but the debug info size savings are so significant that it is
929 /// worth adding a vtable just to take advantage of this optimization.
931
932 const LangOptions &getLangOpts() const { return LangOpts; }
935
938 Preprocessor &getPreprocessor() const { return PP; }
939 ASTContext &getASTContext() const { return Context; }
943
945 StringRef Platform);
947
948 /// Registers an external source. If an external source already exists,
949 /// creates a multiplex external source and appends to it.
950 ///
951 ///\param[in] E - A non-null external sema source.
952 ///
954
955 /// Print out statistics about the semantic analysis.
956 void PrintStats() const;
957
958 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
959 /// guaranteed). Produces a warning if we're low on stack space and allocates
960 /// more in that case. Use this in code that may recurse deeply (for example,
961 /// in template instantiation) to avoid stack overflow.
963 llvm::function_ref<void()> Fn);
964
965 /// Returns default addr space for method qualifiers.
967
968 /// Load weak undeclared identifiers from the external source.
970
971 /// Determine if VD, which must be a variable or function, is an external
972 /// symbol that nonetheless can't be referenced from outside this translation
973 /// unit because its type has no linkage and it's not extern "C".
974 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
975
976 /// Obtain a sorted list of functions that are undefined but ODR-used.
978 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
979
980 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
982 /// Retrieves list of suspicious delete-expressions that will be checked at
983 /// the end of translation unit.
984 const llvm::MapVector<FieldDecl *, DeleteLocs> &
986
987 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
988 /// This is closely coupled to the SemaDiagnosticBuilder class and
989 /// should not be used elsewhere.
990 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
991
992 void addImplicitTypedef(StringRef Name, QualType T);
993
994 /// Whether uncompilable error has occurred. This includes error happens
995 /// in deferred diagnostics.
996 bool hasUncompilableErrorOccurred() const;
997
998 /// Looks through the macro-expansion chain for the given
999 /// location, looking for a macro expansion with the given name.
1000 /// If one is found, returns true and sets the location to that
1001 /// expansion loc.
1002 bool findMacroSpelling(SourceLocation &loc, StringRef name);
1003
1004 /// Calls \c Lexer::getLocForEndOfToken()
1005 SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
1006
1007 /// Calls \c Lexer::findNextToken() to find the next token, and if the
1008 /// locations of both ends of the token can be resolved it return that
1009 /// range; Otherwise it returns an invalid SourceRange.
1011 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
1012 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
1013
1014 /// Retrieve the module loader associated with the preprocessor.
1016
1017 /// Invent a new identifier for parameters of abbreviated templates.
1020 unsigned Index);
1021
1023
1024 // Emit all deferred diagnostics.
1025 void emitDeferredDiags();
1026
1027 /// This is called before the very first declaration in the translation unit
1028 /// is parsed. Note that the ASTContext may have already injected some
1029 /// declarations.
1031 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1032 /// translation unit when EOF is reached and all but the top-level scope is
1033 /// popped.
1036
1037 /// Determines the active Scope associated with the given declaration
1038 /// context.
1039 ///
1040 /// This routine maps a declaration context to the active Scope object that
1041 /// represents that declaration context in the parser. It is typically used
1042 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1043 /// declarations) that injects a name for name-lookup purposes and, therefore,
1044 /// must update the Scope.
1045 ///
1046 /// \returns The scope corresponding to the given declaraion context, or NULL
1047 /// if no such scope is open.
1049
1050 void PushFunctionScope();
1051 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1053
1054 /// This is used to inform Sema what the current TemplateParameterDepth
1055 /// is during Parsing. Currently it is used to pass on the depth
1056 /// when parsing generic lambda 'auto' parameters.
1057 void RecordParsingTemplateParameterDepth(unsigned Depth);
1058
1059 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1061 unsigned OpenMPCaptureLevel = 0);
1062
1063 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1064 /// time after they've been popped.
1066 Sema *Self;
1067
1068 public:
1069 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1071 };
1072
1074 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1075
1076 /// Pop a function (or block or lambda or captured region) scope from the
1077 /// stack.
1078 ///
1079 /// \param WP The warning policy to use for CFG-based warnings, or null if
1080 /// such warnings should not be produced.
1081 /// \param D The declaration corresponding to this function scope, if
1082 /// producing CFG-based warnings.
1083 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1086 Decl *D = nullptr, QualType BlockType = QualType());
1087
1089
1094
1095 void PushCompoundScope(bool IsStmtExpr);
1096 void PopCompoundScope();
1097
1098 /// Determine whether any errors occurred within this function/method/
1099 /// block.
1101
1102 /// Retrieve the current block, if any.
1104
1105 /// Get the innermost lambda or block enclosing the current location, if any.
1106 /// This looks through intervening non-lambda, non-block scopes such as local
1107 /// functions.
1109
1110 /// Retrieve the current lambda scope info, if any.
1111 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1112 /// lambda scope info ignoring all inner capturing scopes that are not
1113 /// lambda scopes.
1115 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1116
1117 /// Retrieve the current generic lambda info, if any.
1119
1120 /// Retrieve the current captured region, if any.
1122
1123 void ActOnComment(SourceRange Comment);
1124
1125 /// Retrieve the parser's current scope.
1126 ///
1127 /// This routine must only be used when it is certain that semantic analysis
1128 /// and the parser are in precisely the same context, which is not the case
1129 /// when, e.g., we are performing any kind of template instantiation.
1130 /// Therefore, the only safe places to use this scope are in the parser
1131 /// itself and in routines directly invoked from the parser and *never* from
1132 /// template substitution or instantiation.
1133 Scope *getCurScope() const { return CurScope; }
1134
1136
1140
1141 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1142 const FunctionDecl *FD = nullptr);
1144 const PartialDiagnostic &PD,
1145 const FunctionDecl *FD = nullptr) {
1146 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1147 }
1148
1149 /// Check if the type is allowed to be used for the current target.
1151 ValueDecl *D = nullptr);
1152
1153 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1154 /// cast. If there is already an implicit cast, merge into the existing one.
1155 /// If isLvalue, the result of the cast is an lvalue.
1158 const CXXCastPath *BasePath = nullptr,
1160
1161 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1162 /// to the conversion from scalar type ScalarTy to the Boolean type.
1164
1165 /// If \p AllowLambda is true, treat lambda as function.
1166 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1167
1168 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1169 /// current context is not inside a function. If \p AllowLambda is true,
1170 /// this can return the call operator of an enclosing lambda, otherwise
1171 /// lambdas are skipped when looking for an enclosing function.
1172 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1173
1174 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1175 /// the method decl for the method being parsed. If we're currently
1176 /// in a 'block', this returns the containing context.
1178
1179 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1180 /// or C function we're in, otherwise return null. If we're currently
1181 /// in a 'block', this returns the containing context.
1183
1184 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1185 /// _Nonnull one.
1187 SourceLocation Loc);
1188
1189 /// Warn when implicitly casting 0 to nullptr.
1190 void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
1191
1192 /// Warn when implicitly changing function effects.
1194 SourceLocation Loc);
1195
1196 /// makeUnavailableInSystemHeader - There is an error in the current
1197 /// context. If we're still in a system header, and we can plausibly
1198 /// make the relevant declaration unavailable instead of erroring, do
1199 /// so and return true.
1201 UnavailableAttr::ImplicitReason reason);
1202
1203 /// Retrieve a suitable printing policy for diagnostics.
1207
1208 /// Retrieve a suitable printing policy for diagnostics.
1210 const Preprocessor &PP);
1211
1212 /// Scope actions.
1214
1215 /// Determine whether \param D is function like (function or function
1216 /// template) for parsing.
1218
1219 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1220 /// because that allows us not to duplicate the constants in clang code,
1221 /// which we must to since we can't directly use the llvm constants.
1222 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1223 ///
1224 /// This is the greatest alignment value supported by load, store, and alloca
1225 /// instructions, and global values.
1226 static const unsigned MaxAlignmentExponent = 32;
1227 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1228
1229 /// Flag indicating whether or not to collect detailed statistics.
1231
1232 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1233
1234 /// Stack containing information about each of the nested
1235 /// function, block, and method scopes that are currently active.
1237
1238 /// The index of the first FunctionScope that corresponds to the current
1239 /// context.
1241
1242 /// Track the number of currently active capturing scopes.
1244
1245 llvm::BumpPtrAllocator BumpAlloc;
1246
1247 /// The kind of translation unit we are processing.
1248 ///
1249 /// When we're processing a complete translation unit, Sema will perform
1250 /// end-of-translation-unit semantic tasks (such as creating
1251 /// initializers for tentative definitions in C) once parsing has
1252 /// completed. Modules and precompiled headers perform different kinds of
1253 /// checks.
1255
1256 /// Translation Unit Scope - useful to Objective-C actions that need
1257 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1258 /// For example, user-defined classes, built-in "id" type, etc.
1260
1262 return CurScope->incrementMSManglingNumber();
1263 }
1264
1265 /// Try to recover by turning the given expression into a
1266 /// call. Returns true if recovery was attempted or an error was
1267 /// emitted; this may also leave the ExprResult invalid.
1269 bool ForceComplain = false,
1270 bool (*IsPlausibleResult)(QualType) = nullptr);
1271
1272 // Adds implicit lifetime bound attribute for implicit this to its
1273 // TypeSourceInfo.
1275
1276 /// Figure out if an expression could be turned into a call.
1277 ///
1278 /// Use this when trying to recover from an error where the programmer may
1279 /// have written just the name of a function instead of actually calling it.
1280 ///
1281 /// \param E - The expression to examine.
1282 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1283 /// with no arguments, this parameter is set to the type returned by such a
1284 /// call; otherwise, it is set to an empty QualType.
1285 /// \param OverloadSet - If the expression is an overloaded function
1286 /// name, this parameter is populated with the decls of the various
1287 /// overloads.
1288 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1289 UnresolvedSetImpl &NonTemplateOverloads);
1290
1294
1297
1305
1306 /// A RAII object to enter scope of a compound statement.
1308 public:
1309 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1310 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1311 }
1312
1313 ~CompoundScopeRAII() { S.ActOnFinishOfCompoundStmt(); }
1316
1317 private:
1318 Sema &S;
1319 };
1320
1321 /// An RAII helper that pops function a function scope on exit.
1327 if (Active)
1328 S.PopFunctionScopeInfo();
1329 }
1330 void disable() { Active = false; }
1331 };
1332
1334 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1335 }
1336
1337 /// Worker object for performing CFG-based warnings.
1340
1341 /// Callback to the parser to parse templated functions when needed.
1342 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1345
1347 LateTemplateParser = LTP;
1348 OpaqueParser = P;
1349 }
1350
1351 /// Callback to the parser to parse a type expressed as a string.
1352 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1354
1355 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1356 /// This is used as part of a hack to omit that class from ADL results.
1358
1359 /// Is the last error level diagnostic immediate. This is used to determined
1360 /// whether the next info diagnostic should be immediate.
1362
1363 /// Track if we're currently analyzing overflow behavior types in assignment
1364 /// context.
1366
1367 class DelayedDiagnostics;
1368
1370 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1372 };
1375
1376 /// A class which encapsulates the logic for delaying diagnostics
1377 /// during parsing and other processing.
1379 /// The current pool of diagnostics into which delayed
1380 /// diagnostics should go.
1381 sema::DelayedDiagnosticPool *CurPool = nullptr;
1382
1383 public:
1385
1386 /// Adds a delayed diagnostic.
1387 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1388
1389 /// Determines whether diagnostics should be delayed.
1390 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1391
1392 /// Returns the current delayed-diagnostics pool.
1393 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1394
1395 /// Enter a new scope. Access and deprecation diagnostics will be
1396 /// collected in this pool.
1399 state.SavedPool = CurPool;
1400 CurPool = &pool;
1401 return state;
1402 }
1403
1404 /// Leave a delayed-diagnostic state that was previously pushed.
1405 /// Do not emit any of the diagnostics. This is performed as part
1406 /// of the bookkeeping of popping a pool "properly".
1408 CurPool = state.SavedPool;
1409 }
1410
1411 /// Enter a new scope where access and deprecation diagnostics are
1412 /// not delayed.
1415 state.SavedPool = CurPool;
1416 CurPool = nullptr;
1417 return state;
1418 }
1419
1420 /// Undo a previous pushUndelayed().
1422 assert(CurPool == nullptr);
1423 CurPool = state.SavedPool;
1424 }
1426
1430
1431 /// Diagnostics that are emitted only if we discover that the given function
1432 /// must be codegen'ed. Because handling these correctly adds overhead to
1433 /// compilation, this is currently only used for offload languages like CUDA,
1434 /// OpenMP, and SYCL.
1435 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1436
1437 /// CurContext - This is the current declaration context of parsing.
1439
1441 assert(AMDGPUPtr);
1442 return *AMDGPUPtr;
1443 }
1444
1446 assert(ARMPtr);
1447 return *ARMPtr;
1448 }
1449
1451 assert(AVRPtr);
1452 return *AVRPtr;
1453 }
1454
1456 assert(BPFPtr);
1457 return *BPFPtr;
1458 }
1459
1461 assert(CodeCompletionPtr);
1462 return *CodeCompletionPtr;
1463 }
1464
1466 assert(CUDAPtr);
1467 return *CUDAPtr;
1468 }
1469
1471 assert(DirectXPtr);
1472 return *DirectXPtr;
1473 }
1474
1476 assert(HLSLPtr);
1477 return *HLSLPtr;
1478 }
1479
1481 assert(HexagonPtr);
1482 return *HexagonPtr;
1483 }
1484
1486 assert(LoongArchPtr);
1487 return *LoongArchPtr;
1488 }
1489
1491 assert(M68kPtr);
1492 return *M68kPtr;
1493 }
1494
1496 assert(MIPSPtr);
1497 return *MIPSPtr;
1498 }
1499
1501 assert(MSP430Ptr);
1502 return *MSP430Ptr;
1503 }
1504
1506 assert(NVPTXPtr);
1507 return *NVPTXPtr;
1508 }
1509
1511 assert(ObjCPtr);
1512 return *ObjCPtr;
1513 }
1514
1516 assert(OpenACCPtr);
1517 return *OpenACCPtr;
1518 }
1519
1521 assert(OpenCLPtr);
1522 return *OpenCLPtr;
1523 }
1524
1526 assert(OpenMPPtr && "SemaOpenMP is dead");
1527 return *OpenMPPtr;
1528 }
1529
1531 assert(PPCPtr);
1532 return *PPCPtr;
1533 }
1534
1536 assert(PseudoObjectPtr);
1537 return *PseudoObjectPtr;
1538 }
1539
1541 assert(RISCVPtr);
1542 return *RISCVPtr;
1543 }
1544
1546 assert(SPIRVPtr);
1547 return *SPIRVPtr;
1548 }
1549
1551 assert(SYCLPtr);
1552 return *SYCLPtr;
1553 }
1554
1556 assert(SwiftPtr);
1557 return *SwiftPtr;
1558 }
1559
1561 assert(SystemZPtr);
1562 return *SystemZPtr;
1563 }
1564
1566 assert(WasmPtr);
1567 return *WasmPtr;
1568 }
1569
1571 assert(X86Ptr);
1572 return *X86Ptr;
1573 }
1574
1575 /// Source of additional semantic information.
1577
1578protected:
1579 friend class Parser;
1581 friend class ASTReader;
1582 friend class ASTDeclReader;
1583 friend class ASTWriter;
1584
1585private:
1586 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1587 bool WarnedDarwinSDKInfoMissing = false;
1588
1589 StackExhaustionHandler StackHandler;
1590
1591 Sema(const Sema &) = delete;
1592 void operator=(const Sema &) = delete;
1593
1594 /// The handler for the FileChanged preprocessor events.
1595 ///
1596 /// Used for diagnostics that implement custom semantic analysis for #include
1597 /// directives, like -Wpragma-pack.
1598 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1599
1600 /// The parser's current scope.
1601 ///
1602 /// The parser maintains this state here.
1603 Scope *CurScope;
1604
1605 mutable IdentifierInfo *Ident_super;
1606
1607 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1608 std::unique_ptr<SemaARM> ARMPtr;
1609 std::unique_ptr<SemaAVR> AVRPtr;
1610 std::unique_ptr<SemaBPF> BPFPtr;
1611 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1612 std::unique_ptr<SemaCUDA> CUDAPtr;
1613 std::unique_ptr<SemaDirectX> DirectXPtr;
1614 std::unique_ptr<SemaHLSL> HLSLPtr;
1615 std::unique_ptr<SemaHexagon> HexagonPtr;
1616 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1617 std::unique_ptr<SemaM68k> M68kPtr;
1618 std::unique_ptr<SemaMIPS> MIPSPtr;
1619 std::unique_ptr<SemaMSP430> MSP430Ptr;
1620 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1621 std::unique_ptr<SemaObjC> ObjCPtr;
1622 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1623 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1624 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1625 std::unique_ptr<SemaPPC> PPCPtr;
1626 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1627 std::unique_ptr<SemaRISCV> RISCVPtr;
1628 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1629 std::unique_ptr<SemaSYCL> SYCLPtr;
1630 std::unique_ptr<SemaSwift> SwiftPtr;
1631 std::unique_ptr<SemaSystemZ> SystemZPtr;
1632 std::unique_ptr<SemaWasm> WasmPtr;
1633 std::unique_ptr<SemaX86> X86Ptr;
1634
1635 ///@}
1636
1637 //
1638 //
1639 // -------------------------------------------------------------------------
1640 //
1641 //
1642
1643 /// \name API Notes
1644 /// Implementations are in SemaAPINotes.cpp
1645 ///@{
1646
1647public:
1648 /// Map any API notes provided for this declaration to attributes on the
1649 /// declaration.
1650 ///
1651 /// Triggered by declaration-attribute processing.
1652 void ProcessAPINotes(Decl *D);
1653 /// Apply the 'Nullability:' annotation to the specified declaration
1654 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1655 /// Apply the 'Type:' annotation to the specified declaration
1656 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1657
1658 /// Whether APINotes should be gathered for all applicable Swift language
1659 /// versions, without being applied. Leaving clients of the current module
1660 /// to select and apply the correct version.
1662 return APINotes.captureVersionIndependentSwift();
1663 }
1664 ///@}
1665
1666 //
1667 //
1668 // -------------------------------------------------------------------------
1669 //
1670 //
1671
1672 /// \name C++ Access Control
1673 /// Implementations are in SemaAccess.cpp
1674 ///@{
1675
1676public:
1683
1684 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1685 /// Returns true on error (when the previous member decl access specifier
1686 /// is different from the new member decl access specifier).
1687 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1688 NamedDecl *PrevMemberDecl,
1689 AccessSpecifier LexicalAS);
1690
1691 /// Perform access-control checking on a previously-unresolved member
1692 /// access which has now been resolved to a member.
1694 DeclAccessPair FoundDecl);
1696 DeclAccessPair FoundDecl);
1697
1698 /// Checks access to an overloaded operator new or delete.
1700 SourceRange PlacementRange,
1701 CXXRecordDecl *NamingClass,
1702 DeclAccessPair FoundDecl,
1703 bool Diagnose = true);
1704
1705 /// Checks access to a constructor.
1707 DeclAccessPair FoundDecl,
1708 const InitializedEntity &Entity,
1709 bool IsCopyBindingRefToTemp = false);
1710
1711 /// Checks access to a constructor.
1713 DeclAccessPair FoundDecl,
1714 const InitializedEntity &Entity,
1715 const PartialDiagnostic &PDiag);
1717 CXXDestructorDecl *Dtor,
1718 const PartialDiagnostic &PDiag,
1719 QualType objectType = QualType());
1720
1721 /// Checks access to the target of a friend declaration.
1723
1724 /// Checks access to a member.
1726 CXXRecordDecl *NamingClass,
1728
1729 /// Checks implicit access to a member in a structured binding.
1732 CXXRecordDecl *DecomposedClass,
1733 DeclAccessPair Field);
1735 const SourceRange &,
1736 DeclAccessPair FoundDecl);
1737
1738 /// Checks access to an overloaded member operator, including
1739 /// conversion operators.
1741 Expr *ArgExpr,
1742 DeclAccessPair FoundDecl);
1744 ArrayRef<Expr *> ArgExprs,
1745 DeclAccessPair FoundDecl);
1747 DeclAccessPair FoundDecl);
1748
1749 /// Checks access for a hierarchy conversion.
1750 ///
1751 /// \param ForceCheck true if this check should be performed even if access
1752 /// control is disabled; some things rely on this for semantics
1753 /// \param ForceUnprivileged true if this check should proceed as if the
1754 /// context had no special privileges
1756 QualType Derived, const CXXBasePath &Path,
1757 unsigned DiagID, bool ForceCheck = false,
1758 bool ForceUnprivileged = false);
1759
1761 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1762 const CXXBasePath &Path, unsigned DiagID,
1763 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1764 bool ForceCheck = false, bool ForceUnprivileged = false);
1765
1766 /// Checks access to all the declarations in the given result set.
1767 void CheckLookupAccess(const LookupResult &R);
1768
1769 /// Checks access to Target from the given class. The check will take access
1770 /// specifiers into account, but no member access expressions and such.
1771 ///
1772 /// \param Target the declaration to check if it can be accessed
1773 /// \param NamingClass the class in which the lookup was started.
1774 /// \param BaseType type of the left side of member access expression.
1775 /// \p BaseType and \p NamingClass are used for C++ access control.
1776 /// Depending on the lookup case, they should be set to the following:
1777 /// - lhs.target (member access without a qualifier):
1778 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1779 /// - lhs.X::target (member access with a qualifier):
1780 /// BaseType is the type of 'lhs', NamingClass is 'X'
1781 /// - X::target (qualified lookup without member access):
1782 /// BaseType is null, NamingClass is 'X'.
1783 /// - target (unqualified lookup).
1784 /// BaseType is null, NamingClass is the parent class of 'target'.
1785 /// \return true if the Target is accessible from the Class, false otherwise.
1786 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1787 QualType BaseType);
1788
1789 /// Is the given member accessible for the purposes of deciding whether to
1790 /// define a special member function as deleted?
1792 DeclAccessPair Found, QualType ObjectType,
1793 SourceLocation Loc,
1794 const PartialDiagnostic &Diag);
1797 QualType ObjectType) {
1798 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1799 SourceLocation(), PDiag());
1800 }
1801
1803 const DependentDiagnostic &DD,
1804 const MultiLevelTemplateArgumentList &TemplateArgs);
1806
1807 ///@}
1808
1809 //
1810 //
1811 // -------------------------------------------------------------------------
1812 //
1813 //
1814
1815 /// \name Attributes
1816 /// Implementations are in SemaAttr.cpp
1817 ///@{
1818
1819public:
1820 /// Controls member pointer representation format under the MS ABI.
1823
1824 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1825
1826 /// Source location for newly created implicit MSInheritanceAttrs
1828
1834
1840
1842 PSK_Reset = 0x0, // #pragma ()
1843 PSK_Set = 0x1, // #pragma (value)
1844 PSK_Push = 0x2, // #pragma (push[, id])
1845 PSK_Pop = 0x4, // #pragma (pop[, id])
1846 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1847 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1848 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1849 };
1850
1856
1857 // #pragma pack and align.
1859 public:
1860 // `Native` represents default align mode, which may vary based on the
1861 // platform.
1862 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1863
1864 // #pragma pack info constructor
1865 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1866 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1867 assert(Num == PackNumber && "The pack number has been truncated.");
1868 }
1869
1870 // #pragma align info constructor
1872 : PackAttr(false), AlignMode(M),
1873 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1874
1875 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1876
1878
1879 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1880 // integer encoding for it. This should only be passed to
1881 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1882 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1883 std::uint32_t Encoding{};
1884 if (Info.IsXLStack())
1885 Encoding |= IsXLMask;
1886
1887 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1888
1889 if (Info.IsPackAttr())
1890 Encoding |= PackAttrMask;
1891
1892 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1893
1894 return Encoding;
1895 }
1896
1897 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1898 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1900 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1901 int PackNumber = (Encoding & PackNumMask) >> 4;
1902
1903 if (Encoding & PackAttrMask)
1904 return AlignPackInfo(M, PackNumber, IsXL);
1905
1906 return AlignPackInfo(M, IsXL);
1907 }
1908
1909 bool IsPackAttr() const { return PackAttr; }
1910
1911 bool IsAlignAttr() const { return !PackAttr; }
1912
1913 Mode getAlignMode() const { return AlignMode; }
1914
1915 unsigned getPackNumber() const { return PackNumber; }
1916
1917 bool IsPackSet() const {
1918 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1919 // attriute on a decl.
1920 return PackNumber != UninitPackVal && PackNumber != 0;
1921 }
1922
1923 bool IsXLStack() const { return XLStack; }
1924
1925 bool operator==(const AlignPackInfo &Info) const {
1926 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1927 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1928 Info.XLStack);
1929 }
1930
1931 bool operator!=(const AlignPackInfo &Info) const {
1932 return !(*this == Info);
1933 }
1934
1935 private:
1936 /// \brief True if this is a pragma pack attribute,
1937 /// not a pragma align attribute.
1938 bool PackAttr;
1939
1940 /// \brief The alignment mode that is in effect.
1941 Mode AlignMode;
1942
1943 /// \brief The pack number of the stack.
1944 unsigned char PackNumber;
1945
1946 /// \brief True if it is a XL #pragma align/pack stack.
1947 bool XLStack;
1948
1949 /// \brief Uninitialized pack value.
1950 static constexpr unsigned char UninitPackVal = -1;
1951
1952 // Masks to encode and decode an AlignPackInfo.
1953 static constexpr uint32_t IsXLMask{0x0000'0001};
1954 static constexpr uint32_t AlignModeMask{0x0000'0006};
1955 static constexpr uint32_t PackAttrMask{0x00000'0008};
1956 static constexpr uint32_t PackNumMask{0x0000'01F0};
1957 };
1958
1959 template <typename ValueType> struct PragmaStack {
1971
1972 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1973 llvm::StringRef StackSlotLabel, ValueType Value) {
1974 if (Action == PSK_Reset) {
1976 CurrentPragmaLocation = PragmaLocation;
1977 return;
1978 }
1979 if (Action & PSK_Push)
1980 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1981 PragmaLocation);
1982 else if (Action & PSK_Pop) {
1983 if (!StackSlotLabel.empty()) {
1984 // If we've got a label, try to find it and jump there.
1985 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1986 return x.StackSlotLabel == StackSlotLabel;
1987 });
1988 // If we found the label so pop from there.
1989 if (I != Stack.rend()) {
1990 CurrentValue = I->Value;
1991 CurrentPragmaLocation = I->PragmaLocation;
1992 Stack.erase(std::prev(I.base()), Stack.end());
1993 }
1994 } else if (!Stack.empty()) {
1995 // We do not have a label, just pop the last entry.
1996 CurrentValue = Stack.back().Value;
1997 CurrentPragmaLocation = Stack.back().PragmaLocation;
1998 Stack.pop_back();
1999 }
2000 }
2001 if (Action & PSK_Set) {
2003 CurrentPragmaLocation = PragmaLocation;
2004 }
2005 }
2006
2007 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
2008 // method body to restore the stacks on exit, so it works like this:
2009 //
2010 // struct S {
2011 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
2012 // void Method {}
2013 // #pragma <name>(pop, InternalPragmaSlot)
2014 // };
2015 //
2016 // It works even with #pragma vtordisp, although MSVC doesn't support
2017 // #pragma vtordisp(push [, id], n)
2018 // syntax.
2019 //
2020 // Push / pop a named sentinel slot.
2021 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
2022 assert((Action == PSK_Push || Action == PSK_Pop) &&
2023 "Can only push / pop #pragma stack sentinels!");
2024 Act(CurrentPragmaLocation, Action, Label, CurrentValue);
2025 }
2026
2027 // Constructors.
2028 explicit PragmaStack(const ValueType &Default)
2030
2031 bool hasValue() const { return CurrentValue != DefaultValue; }
2032
2034 ValueType DefaultValue; // Value used for PSK_Reset action.
2035 ValueType CurrentValue;
2037 };
2038 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2039 // we shouldn't do so if they're in a module).
2040
2041 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2042 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2043 ///
2044 /// 0: Suppress all vtordisps
2045 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2046 /// structors
2047 /// 2: Always insert vtordisps to support RTTI on partially constructed
2048 /// objects
2051 // The current #pragma align/pack values and locations at each #include.
2058 // Segment #pragmas.
2063
2064 // #pragma strict_gs_check.
2066
2067 // This stack tracks the current state of Sema.CurFPFeatures.
2070 FPOptionsOverride result;
2071 if (!FpPragmaStack.hasValue()) {
2072 result = FPOptionsOverride();
2073 } else {
2074 result = FpPragmaStack.CurrentValue;
2075 }
2076 return result;
2077 }
2078
2085
2086 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2087 // Actions should be performed only if we enter / exit a C++ method body.
2089 public:
2090 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2095
2096 private:
2097 Sema &S;
2098 StringRef SlotLabel;
2099 bool ShouldAct;
2100 };
2101
2102 /// Last section used with #pragma init_seg.
2105
2106 /// Sections used with #pragma alloc_text.
2107 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2108
2109 /// VisContext - Manages the stack for \#pragma GCC visibility.
2110 void *VisContext; // Really a "PragmaVisStack*"
2111
2112 /// This an attribute introduced by \#pragma clang attribute.
2119
2120 /// A push'd group of PragmaAttributeEntries.
2122 /// The location of the push attribute.
2124 /// The namespace of this push group.
2127 };
2128
2130
2131 /// The declaration that is currently receiving an attribute from the
2132 /// #pragma attribute stack.
2134
2135 /// This represents the last location of a "#pragma clang optimize off"
2136 /// directive if such a directive has not been closed by an "on" yet. If
2137 /// optimizations are currently "on", this is set to an invalid location.
2139
2140 /// Get the location for the currently active "\#pragma clang optimize
2141 /// off". If this location is invalid, then the state of the pragma is "on".
2145
2146 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2147 /// whether the optimizations in the list passed to the pragma should be
2148 /// turned off or on. This boolean is true by default because command line
2149 /// options are honored when `#pragma optimize("", on)`.
2150 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2152
2153 /// Set of no-builtin functions listed by \#pragma function.
2155
2156 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2157 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2159
2160 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2162
2163 /// Add gsl::Pointer attribute to std::container::iterator
2164 /// \param ND The declaration that introduces the name
2165 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2166 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2167
2168 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2170
2171 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2173
2174 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2176
2177 /// Add [[gsl::Pointer]] attributes for std:: types.
2179
2180 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2181 StringRef ParamName);
2182 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2183 // can be the name of a function parameter, we need to parse the function
2184 // declaration and rest of the parameters before processesing 'X'. Therefore
2185 // do this lazily instead of processing while parsing the annotation itself.
2187
2188 /// Add _Nullable attributes for std:: types.
2190
2191 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2194 PragmaClangSectionKind SecKind,
2195 StringRef SecName);
2196
2197 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2199 SourceLocation PragmaLoc);
2200
2201 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2202 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2203 StringRef SlotLabel, Expr *Alignment);
2204
2205 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2206 /// (unless they are value dependent or type dependent). Returns false
2207 /// and emits a diagnostic if one or more of the arguments could not be
2208 /// folded into a constant.
2211
2216
2218 SourceLocation IncludeLoc);
2220
2221 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2223
2224 /// ActOnPragmaMSComment - Called on well formed
2225 /// \#pragma comment(kind, "arg").
2227 StringRef Arg);
2228
2229 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2230 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2231 StringRef Value);
2232
2233 /// Are precise floating point semantics currently enabled?
2235 return !CurFPFeatures.getAllowFPReassociate() &&
2236 !CurFPFeatures.getNoSignedZero() &&
2237 !CurFPFeatures.getAllowReciprocal() &&
2238 !CurFPFeatures.getAllowApproxFunc();
2239 }
2240
2243
2244 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2245 void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
2247
2248 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2249 /// pointers_to_members(representation method[, general purpose
2250 /// representation]).
2253 SourceLocation PragmaLoc);
2254
2255 /// Called on well formed \#pragma vtordisp().
2256 void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
2258
2259 bool UnifySection(StringRef SectionName, int SectionFlags,
2260 NamedDecl *TheDecl);
2261 bool UnifySection(StringRef SectionName, int SectionFlags,
2262 SourceLocation PragmaSectionLocation);
2263
2264 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2265 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2266 PragmaMsStackAction Action,
2267 llvm::StringRef StackSlotLabel,
2268 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2269
2270 /// Called on well formed \#pragma section().
2271 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2272 StringLiteral *SegmentName);
2273
2274 /// Called on well-formed \#pragma init_seg().
2275 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2276 StringLiteral *SegmentName);
2277
2278 /// Called on well-formed \#pragma alloc_text().
2280 SourceLocation PragmaLocation, StringRef Section,
2281 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2282 &Functions);
2283
2284 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2285 /// strict_gs_check.
2287 PragmaMsStackAction Action,
2288 bool Value);
2289
2290 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2291 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2292 SourceLocation PragmaLoc);
2293
2295 SourceLocation PragmaLoc,
2298 const IdentifierInfo *Namespace);
2299
2300 /// Called on well-formed '\#pragma clang attribute pop'.
2302 const IdentifierInfo *Namespace);
2303
2304 /// Adds the attributes that have been specified using the
2305 /// '\#pragma clang attribute push' directives to the given declaration.
2306 void AddPragmaAttributes(Scope *S, Decl *D);
2307
2309 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2311 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2312 // This bypasses a lot of the filters in the diag engine, as it's
2313 // to be used to attach notes to diagnostics which have already
2314 // been filtered through.
2315 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2316 PD.Emit(Builder);
2317 };
2318 }
2319
2325
2327
2328 /// Called on well formed \#pragma clang optimize.
2329 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2330
2331 /// #pragma optimize("[optimization-list]", on | off).
2332 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2333
2334 /// Call on well formed \#pragma function.
2335 void
2337 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2338
2340 SourceLocation NameLoc,
2341 Scope *curScope);
2342
2343 /// Information from a C++ #pragma export, for a symbol that we
2344 /// haven't seen the declaration for yet.
2349
2350 llvm::DenseMap<IdentifierInfo *, PendingPragmaInfo> PendingExportedNames;
2351
2352 /// ActonPragmaExport - called on well-formed '\#pragma export'.
2353 void ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation ExportNameLoc,
2354 Scope *curScope);
2355
2356 /// Only called on function definitions; if there is a pragma in scope
2357 /// with the effect of a range-based optnone, consider marking the function
2358 /// with attribute optnone.
2360
2361 /// Only called on function definitions; if there is a `#pragma alloc_text`
2362 /// that decides which code section the function should be in, add
2363 /// attribute section to the function.
2365
2366 /// Adds the 'optnone' attribute to the function declaration if there
2367 /// are no conflicts; Loc represents the location causing the 'optnone'
2368 /// attribute to be added (usually because of a pragma).
2370
2371 /// Only called on function definitions; if there is a MSVC #pragma optimize
2372 /// in scope, consider changing the function's attributes based on the
2373 /// optimization list passed to the pragma.
2375
2376 /// Only called on function definitions; if there is a pragma in scope
2377 /// with the effect of a range-based no_builtin, consider marking the function
2378 /// with attribute no_builtin.
2380
2381 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2382 /// add an appropriate visibility attribute.
2384
2385 /// FreeVisContext - Deallocate and null out VisContext.
2386 void FreeVisContext();
2387
2388 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2389 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2390 SourceLocation PragmaLoc);
2391
2392 /// ActOnPragmaFPContract - Called on well formed
2393 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2394 /// \#pragma clang fp contract
2396
2397 /// Called on well formed
2398 /// \#pragma clang fp reassociate
2399 /// or
2400 /// \#pragma clang fp reciprocal
2402 bool IsEnabled);
2403
2404 /// ActOnPragmaFenvAccess - Called on well formed
2405 /// \#pragma STDC FENV_ACCESS
2406 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2407
2408 /// ActOnPragmaCXLimitedRange - Called on well formed
2409 /// \#pragma STDC CX_LIMITED_RANGE
2412
2413 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2416
2417 /// Called to set constant rounding mode for floating point operations.
2418 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2419
2420 /// Called to set exception behavior for floating point operations.
2422
2423 /// PushNamespaceVisibilityAttr - Note that we've entered a
2424 /// namespace with a visibility attribute.
2425 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2426 SourceLocation Loc);
2427
2428 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2429 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2430 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2431
2432 /// Handles semantic checking for features that are common to all attributes,
2433 /// such as checking whether a parameter was properly specified, or the
2434 /// correct number of arguments were passed, etc. Returns true if the
2435 /// attribute has been diagnosed.
2436 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2437 bool SkipArgCountCheck = false);
2438 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2439 bool SkipArgCountCheck = false);
2440
2441 ///@}
2442
2443 //
2444 //
2445 // -------------------------------------------------------------------------
2446 //
2447 //
2448
2449 /// \name Availability Attribute Handling
2450 /// Implementations are in SemaAvailability.cpp
2451 ///@{
2452
2453public:
2454 /// Issue any -Wunguarded-availability warnings in \c FD
2456
2458
2459 /// Retrieve the current function, if any, that should be analyzed for
2460 /// potential availability violations.
2462
2464 const ObjCInterfaceDecl *UnknownObjCClass,
2465 bool ObjCPropertyAccess,
2466 bool AvoidPartialAvailabilityChecks,
2467 ObjCInterfaceDecl *ClassReceiver);
2468
2470
2471 std::pair<AvailabilityResult, const NamedDecl *>
2472 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2473 ObjCInterfaceDecl *ClassReceiver);
2474 ///@}
2475
2476 //
2477 //
2478 // -------------------------------------------------------------------------
2479 //
2480 //
2481
2482 /// \name Bounds Safety
2483 /// Implementations are in SemaBoundsSafety.cpp
2484 ///@{
2485public:
2486 /// Check if applying the specified attribute variant from the "counted by"
2487 /// family of attributes to FieldDecl \p FD is semantically valid. If
2488 /// semantically invalid diagnostics will be emitted explaining the problems.
2489 ///
2490 /// \param FD The FieldDecl to apply the attribute to
2491 /// \param E The count expression on the attribute
2492 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2493 /// attributes. If the false the attribute is from
2494 /// "counted_by" family of attributes.
2495 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2496 /// of attributes. If false the attribute does not have the
2497 /// suffix.
2498 ///
2499 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2500 /// \p CountInBytes and \p OrNull both being true indicates the
2501 /// `counted_by_or_null` attribute.
2502 ///
2503 /// \returns false iff semantically valid.
2504 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2505 bool OrNull);
2506
2507 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2508 /// `__counted_by_or_null` pointer type \param LHSTy.
2509 ///
2510 /// \param LHSTy The type being assigned to. Checks will only be performed if
2511 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2512 /// \param RHSExpr The expression being assigned from.
2513 /// \param Action The type assignment being performed
2514 /// \param Loc The SourceLocation to use for error diagnostics
2515 /// \param Assignee The ValueDecl being assigned. This is used to compute
2516 /// the name of the assignee. If the assignee isn't known this can
2517 /// be set to nullptr.
2518 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2519 /// Assignee to compute the name of the assignee use the fully
2520 /// qualified name, otherwise use the unqualified name.
2521 ///
2522 /// \returns True iff no diagnostic where emitted, false otherwise.
2524 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2525 SourceLocation Loc, const ValueDecl *Assignee,
2526 bool ShowFullyQualifiedAssigneeName);
2527
2528 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2529 /// pointer.
2530 ///
2531 /// \param Entity The entity being initialized
2532 /// \param Kind The kind of initialization being performed
2533 /// \param Action The type assignment being performed
2534 /// \param LHSTy The type being assigned to. Checks will only be performed if
2535 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2536 /// \param RHSExpr The expression being used for initialization.
2537 ///
2538 /// \returns True iff no diagnostic where emitted, false otherwise.
2540 const InitializationKind &Kind,
2541 AssignmentAction Action,
2542 QualType LHSType, Expr *RHSExpr);
2543
2544 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2545 /// or counted_by_or_null pointers in \param E.
2546 ///
2547 /// \param E the expression to check
2548 ///
2549 /// \returns True iff no diagnostic where emitted, false otherwise.
2551 ///@}
2552
2553 //
2554 //
2555 // -------------------------------------------------------------------------
2556 //
2557 //
2558
2559 /// \name Casts
2560 /// Implementations are in SemaCast.cpp
2561 ///@{
2562
2563public:
2569
2570 /// ActOnCXXNamedCast - Parse
2571 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2573 SourceLocation LAngleBracketLoc, Declarator &D,
2574 SourceLocation RAngleBracketLoc,
2575 SourceLocation LParenLoc, Expr *E,
2576 SourceLocation RParenLoc);
2577
2579 TypeSourceInfo *Ty, Expr *E,
2580 SourceRange AngleBrackets, SourceRange Parens);
2581
2583 ExprResult Operand,
2584 SourceLocation RParenLoc);
2585
2587 Expr *Operand, SourceLocation RParenLoc);
2588
2589 // Checks that reinterpret casts don't have undefined behavior.
2590 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2591 bool IsDereference, SourceRange Range);
2592
2593 // Checks that the vector type should be initialized from a scalar
2594 // by splatting the value rather than populating a single element.
2595 // This is the case for AltiVecVector types as well as with
2596 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2597 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2598
2599 // Checks if the -faltivec-src-compat=gcc option is specified.
2600 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2601 // treated the same way as they are when trying to initialize
2602 // these vectors on gcc (an error is emitted).
2604 QualType SrcTy);
2605
2607 SourceLocation RParenLoc, Expr *Op);
2608
2610 SourceLocation LParenLoc,
2611 Expr *CastExpr,
2612 SourceLocation RParenLoc);
2613
2614 ///@}
2615
2616 //
2617 //
2618 // -------------------------------------------------------------------------
2619 //
2620 //
2621
2622 /// \name Extra Semantic Checking
2623 /// Implementations are in SemaChecking.cpp
2624 ///@{
2625
2626public:
2627 /// Used to change context to isConstantEvaluated without pushing a heavy
2628 /// ExpressionEvaluationContextRecord object.
2630
2635
2637 unsigned ByteNo) const;
2638
2640 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2641 FAPK_Variadic, // values to format are passed as variadic arguments
2642 FAPK_VAList, // values to format are passed in a va_list
2643 FAPK_Elsewhere, // values to format are not passed to this function
2644 };
2645
2646 // Used to grab the relevant information from a FormatAttr and a
2647 // FunctionDeclaration.
2653
2654 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2655 /// populate the FormatStringInfo parameter with the attribute's correct
2656 /// format_idx and firstDataArg. Returns true when the format fits the
2657 /// function and the FormatStringInfo has been populated.
2658 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2659 unsigned FirstArg, FormatStringInfo *FSI);
2660 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2661 bool HasImplicitThisParam, bool IsVariadic,
2662 FormatStringInfo *FSI);
2663
2664 // Used by C++ template instantiation.
2666
2667 /// ConvertVectorExpr - Handle __builtin_convertvector
2669 SourceLocation BuiltinLoc,
2670 SourceLocation RParenLoc);
2671
2672 static StringRef GetFormatStringTypeName(FormatStringType FST);
2673 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2674 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2675 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2676
2677 bool FormatStringHasSArg(const StringLiteral *FExpr);
2678
2679 /// Check for comparisons of floating-point values using == and !=. Issue a
2680 /// warning if the comparison is not likely to do what the programmer
2681 /// intended.
2682 void CheckFloatComparison(SourceLocation Loc, const Expr *LHS,
2683 const Expr *RHS, BinaryOperatorKind Opcode);
2684
2685 /// Register a magic integral constant to be used as a type tag.
2686 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2687 uint64_t MagicValue, QualType Type,
2688 bool LayoutCompatible, bool MustBeNull);
2689
2692
2696
2698
2699 /// If true, \c Type should be compared with other expression's types for
2700 /// layout-compatibility.
2701 LLVM_PREFERRED_TYPE(bool)
2703 LLVM_PREFERRED_TYPE(bool)
2704 unsigned MustBeNull : 1;
2705 };
2706
2707 /// A pair of ArgumentKind identifier and magic value. This uniquely
2708 /// identifies the magic value.
2709 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2710
2711 /// Diagnoses the current set of gathered accesses. This happens at the end of
2712 /// each expression evaluation context. Diagnostics are emitted only for
2713 /// accesses gathered in the current evaluation context.
2715
2716 /// This function checks if the expression is in the sef of potentially
2717 /// misaligned members and it is converted to some pointer type T with lower
2718 /// or equal alignment requirements. If so it removes it. This is used when
2719 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2720 /// void*).
2721 void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
2722
2723 /// Returns true if `From` is a function or pointer to a function with the
2724 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2725 /// function without this attribute.
2726 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2727
2728 /// This function calls Action when it determines that E designates a
2729 /// misaligned member due to the packed attribute. This is used to emit
2730 /// local diagnostics like in reference binding.
2732 Expr *E,
2733 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2734 Action);
2735
2736 enum class AtomicArgumentOrder { API, AST };
2738 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2739 SourceLocation RParenLoc, MultiExprArg Args,
2742
2743 /// Check to see if a given expression could have '.c_str()' called on it.
2744 bool hasCStrMethod(const Expr *E);
2745
2746 /// Diagnose pointers that are always non-null.
2747 /// \param E the expression containing the pointer
2748 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2749 /// compared to a null pointer
2750 /// \param IsEqual True when the comparison is equal to a null pointer
2751 /// \param Range Extra SourceRange to highlight in the diagnostic
2754 bool IsEqual, SourceRange Range);
2755
2756 /// CheckParmsForFunctionDef - Check that the parameters of the given
2757 /// function are appropriate for the definition of a function. This
2758 /// takes care of any checks that cannot be performed on the
2759 /// declaration itself, e.g., that the types of each of the function
2760 /// parameters are complete.
2762 bool CheckParameterNames);
2763
2764 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2765 /// pointer cast increases the alignment requirements.
2766 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2767
2768 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2769 /// to weak/__unsafe_unretained type.
2770 bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
2771
2772 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2773 /// to weak/__unsafe_unretained expression.
2774 void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
2775
2776 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2777 /// statement as a \p Body, and it is located on the same line.
2778 ///
2779 /// This helps prevent bugs due to typos, such as:
2780 /// if (condition);
2781 /// do_stuff();
2782 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2783 unsigned DiagID);
2784
2785 /// Warn if a for/while loop statement \p S, which is followed by
2786 /// \p PossibleBody, has a suspicious null statement as a body.
2787 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2788
2789 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2790 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2791 SourceLocation OpLoc);
2792
2793 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2795 const TypeSourceInfo *Derived);
2796
2797 /// CheckFunctionCall - Check a direct function call for various correctness
2798 /// and safety properties not strictly enforced by the C type system.
2799 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2800 const FunctionProtoType *Proto);
2801
2808
2809 /// \param FPOnly restricts the arguments to floating-point types.
2810 std::optional<QualType>
2811 BuiltinVectorMath(CallExpr *TheCall,
2814 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2815
2816 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2817 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2818
2819 /// Handles the checks for format strings, non-POD arguments to vararg
2820 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2821 /// attributes and AArch64 SME attributes.
2822 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2823 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2824 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2825 VariadicCallType CallType);
2826
2827 /// Verify that two format strings (as understood by attribute(format) and
2828 /// attribute(format_matches) are compatible. If they are incompatible,
2829 /// diagnostics are emitted with the assumption that \c
2830 /// AuthoritativeFormatString is correct and
2831 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2832 /// diagnostics will point to it and a note will refer to \c
2833 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2834 bool
2836 const StringLiteral *AuthoritativeFormatString,
2837 const StringLiteral *TestedFormatString,
2838 const Expr *FunctionCallArg = nullptr);
2839
2840 /// Verify that one format string (as understood by attribute(format)) is
2841 /// self-consistent; for instance, that it doesn't have multiple positional
2842 /// arguments referring to the same argument in incompatible ways. Diagnose
2843 /// if it isn't.
2845
2846 /// \brief Enforce the bounds of a TCB
2847 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2848 /// directly calls other functions in the same TCB as marked by the
2849 /// enforce_tcb and enforce_tcb_leaf attributes.
2850 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2851 const NamedDecl *Callee);
2852
2853 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2854
2855 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2856 /// TheCall is a constant expression.
2857 bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum,
2858 llvm::APSInt &Result);
2859
2860 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2861 /// TheCall is a constant expression in the range [Low, High].
2862 bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low,
2863 int High, bool RangeIsError = true);
2864
2865 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2866 /// TheCall is a constant expression is a multiple of Num..
2867 bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum,
2868 unsigned Multiple);
2869
2870 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2871 /// constant expression representing a power of 2.
2872 bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum);
2873
2874 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2875 /// a constant expression representing an arbitrary byte value shifted left by
2876 /// a multiple of 8 bits.
2877 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum,
2878 unsigned ArgBits);
2879
2880 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2881 /// TheCall is a constant expression representing either a shifted byte value,
2882 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2883 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2884 /// Arm MVE intrinsics.
2885 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum,
2886 unsigned ArgBits);
2887
2888 /// Checks that a call expression's argument count is at least the desired
2889 /// number. This is useful when doing custom type-checking on a variadic
2890 /// function. Returns true on error.
2891 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2892
2893 /// Checks that a call expression's argument count is at most the desired
2894 /// number. This is useful when doing custom type-checking on a variadic
2895 /// function. Returns true on error.
2896 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2897
2898 /// Checks that a call expression's argument count is in the desired range.
2899 /// This is useful when doing custom type-checking on a variadic function.
2900 /// Returns true on error.
2901 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2902 unsigned MaxArgCount);
2903
2904 /// Checks that a call expression's argument count is the desired number.
2905 /// This is useful when doing custom type-checking. Returns true on error.
2906 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2907
2908 /// Returns true if the argument consists of one contiguous run of 1s with any
2909 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2910 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2911 /// since all 1s are not contiguous.
2912 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2913
2915 bool *ICContext = nullptr,
2916 bool IsListInit = false);
2917
2918 /// Check for overflow behavior type related implicit conversion diagnostics.
2919 /// Returns true if OBT-related diagnostic was issued, false otherwise.
2921 SourceLocation CC);
2922
2923 bool
2928 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2930
2931private:
2932 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2933 const ArraySubscriptExpr *ASE = nullptr,
2934 bool AllowOnePastEnd = true, bool IndexNegated = false);
2935 void CheckArrayAccess(const Expr *E);
2936
2937 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2938 const FunctionProtoType *Proto);
2939
2940 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2941 /// such as function pointers returned from functions.
2942 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2943
2944 /// CheckConstructorCall - Check a constructor call for correctness and safety
2945 /// properties not enforced by the C type system.
2946 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2948 const FunctionProtoType *Proto, SourceLocation Loc);
2949
2950 /// Warn if a pointer or reference argument passed to a function points to an
2951 /// object that is less aligned than the parameter. This can happen when
2952 /// creating a typedef with a lower alignment than the original type and then
2953 /// calling functions defined in terms of the original type.
2954 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2955 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2956
2957 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2958
2959 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2960 CallExpr *TheCall);
2961
2962 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2963 CallExpr *TheCall);
2964
2965 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2966
2967 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2968 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2969 /// on failure; return false on success.
2970 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2971 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2972
2973 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2974 /// friends. This is declared to take (...), so we have to check everything.
2975 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2976
2977 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2978 /// __builtin_isnan and friends. This is declared to take (...), so we have
2979 /// to check everything.
2980 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2981 unsigned BuiltinID);
2982
2983 /// Perform semantic analysis for a call to __builtin_complex.
2984 bool BuiltinComplex(CallExpr *TheCall);
2985 bool BuiltinOSLogFormat(CallExpr *TheCall);
2986
2987 /// BuiltinPrefetch - Handle __builtin_prefetch.
2988 /// This is declared to take (const void*, ...) and can take two
2989 /// optional constant int args.
2990 bool BuiltinPrefetch(CallExpr *TheCall);
2991
2992 /// Handle __builtin_alloca_with_align. This is declared
2993 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
2994 /// than 8.
2995 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
2996
2997 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
2998 bool BuiltinArithmeticFence(CallExpr *TheCall);
2999
3000 /// BuiltinAssume - Handle __assume (MS Extension).
3001 /// __assume does not evaluate its arguments, and should warn if its argument
3002 /// has side effects.
3003 bool BuiltinAssume(CallExpr *TheCall);
3004
3005 /// Handle __builtin_assume_aligned. This is declared
3006 /// as (const void*, size_t, ...) and can take one optional constant int arg.
3007 bool BuiltinAssumeAligned(CallExpr *TheCall);
3008
3009 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
3010 /// This checks that the target supports __builtin_longjmp and
3011 /// that val is a constant 1.
3012 bool BuiltinLongjmp(CallExpr *TheCall);
3013
3014 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
3015 /// This checks that the target supports __builtin_setjmp.
3016 bool BuiltinSetjmp(CallExpr *TheCall);
3017
3018 /// We have a call to a function like __sync_fetch_and_add, which is an
3019 /// overloaded function based on the pointer type of its first argument.
3020 /// The main BuildCallExpr routines have already promoted the types of
3021 /// arguments because all of these calls are prototyped as void(...).
3022 ///
3023 /// This function goes through and does final semantic checking for these
3024 /// builtins, as well as generating any warnings.
3025 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
3026
3027 /// BuiltinNontemporalOverloaded - We have a call to
3028 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
3029 /// overloaded function based on the pointer type of its last argument.
3030 ///
3031 /// This function goes through and does final semantic checking for these
3032 /// builtins.
3033 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
3034 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
3036
3037 /// \param FPOnly restricts the arguments to floating-point types.
3038 bool BuiltinElementwiseMath(CallExpr *TheCall,
3041 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
3042
3043 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3044
3045 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3047 bool BuiltinCountedByRef(CallExpr *TheCall);
3048
3049 // Matrix builtin handling.
3050 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3051 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3052 ExprResult CallResult);
3053 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3054 ExprResult CallResult);
3055
3056 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3057 /// functions) for correct use of format strings.
3058 /// Returns true if a format string has been fully checked.
3059 bool CheckFormatArguments(const FormatAttr *Format,
3060 ArrayRef<const Expr *> Args, bool IsCXXMember,
3061 VariadicCallType CallType, SourceLocation Loc,
3062 SourceRange Range,
3063 llvm::SmallBitVector &CheckedVarArgs);
3064 bool CheckFormatString(const FormatMatchesAttr *Format,
3065 ArrayRef<const Expr *> Args, bool IsCXXMember,
3066 VariadicCallType CallType, SourceLocation Loc,
3067 SourceRange Range,
3068 llvm::SmallBitVector &CheckedVarArgs);
3069 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3070 FormatArgumentPassingKind FAPK,
3071 StringLiteral *ReferenceFormatString,
3072 unsigned format_idx, unsigned firstDataArg,
3074 SourceLocation Loc, SourceRange range,
3075 llvm::SmallBitVector &CheckedVarArgs);
3076
3077 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3078
3079 /// Warn when using the wrong abs() function.
3080 void CheckAbsoluteValueFunction(const CallExpr *Call,
3081 const FunctionDecl *FDecl);
3082
3083 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3084
3085 /// Check for dangerous or invalid arguments to memset().
3086 ///
3087 /// This issues warnings on known problematic, dangerous or unspecified
3088 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3089 /// function calls.
3090 ///
3091 /// \param Call The call expression to diagnose.
3092 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3093 IdentifierInfo *FnName);
3094
3095 bool CheckSizeofMemaccessArgument(const Expr *SizeOfArg, const Expr *Dest,
3096 IdentifierInfo *FnName);
3097 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3098 // be the size of the source, instead of the destination.
3099 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3100
3101 // Warn on anti-patterns as the 'size' argument to strncat.
3102 // The correct size argument should look like following:
3103 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3104 void CheckStrncatArguments(const CallExpr *Call,
3105 const IdentifierInfo *FnName);
3106
3107 /// Alerts the user that they are attempting to free a non-malloc'd object.
3108 void CheckFreeArguments(const CallExpr *E);
3109
3110 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3111 SourceLocation ReturnLoc, bool isObjCMethod = false,
3112 const AttrVec *Attrs = nullptr,
3113 const FunctionDecl *FD = nullptr);
3114
3115 /// Diagnoses "dangerous" implicit conversions within the given
3116 /// expression (which is a full expression). Implements -Wconversion
3117 /// and -Wsign-compare.
3118 ///
3119 /// \param CC the "context" location of the implicit conversion, i.e.
3120 /// the most location of the syntactic entity requiring the implicit
3121 /// conversion
3122 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3123
3124 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3125 /// Input argument E is a logical expression.
3127
3128 /// Diagnose when expression is an integer constant expression and its
3129 /// evaluation results in integer overflow
3130 void CheckForIntOverflow(const Expr *E);
3131 void CheckUnsequencedOperations(const Expr *E);
3132
3133 /// Perform semantic checks on a completed expression. This will either
3134 /// be a full-expression or a default argument expression.
3135 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3136 bool IsConstexpr = false);
3137
3138 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3139 Expr *Init);
3140
3141 /// A map from magic value to type information.
3142 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3143 TypeTagForDatatypeMagicValues;
3144
3145 /// Peform checks on a call of a function with argument_with_type_tag
3146 /// or pointer_with_type_tag attributes.
3147 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3148 const ArrayRef<const Expr *> ExprArgs,
3149 SourceLocation CallSiteLoc);
3150
3151 /// Check if we are taking the address of a packed field
3152 /// as this may be a problem if the pointer value is dereferenced.
3153 void CheckAddressOfPackedMember(Expr *rhs);
3154
3155 /// Helper class that collects misaligned member designations and
3156 /// their location info for delayed diagnostics.
3157 struct MisalignedMember {
3158 Expr *E;
3159 RecordDecl *RD;
3160 ValueDecl *MD;
3161 CharUnits Alignment;
3162
3163 MisalignedMember() : E(), RD(), MD() {}
3164 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3165 CharUnits Alignment)
3166 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3167 explicit MisalignedMember(Expr *E)
3168 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3169
3170 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3171 };
3172
3173 /// Adds an expression to the set of gathered misaligned members.
3174 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3175 CharUnits Alignment);
3176 ///@}
3177
3178 //
3179 //
3180 // -------------------------------------------------------------------------
3181 //
3182 //
3183
3184 /// \name C++ Coroutines
3185 /// Implementations are in SemaCoroutine.cpp
3186 ///@{
3187
3188public:
3189 /// The C++ "std::coroutine_traits" template, which is defined in
3190 /// <coroutine_traits>
3192
3194 StringRef Keyword);
3198
3201 UnresolvedLookupExpr *Lookup);
3203 Expr *Awaiter, bool IsImplicit = false);
3205 UnresolvedLookupExpr *Lookup);
3208 bool IsImplicit = false);
3213
3214 // As a clang extension, enforces that a non-coroutine function must be marked
3215 // with [[clang::coro_wrapper]] if it returns a type marked with
3216 // [[clang::coro_return_type]].
3217 // Expects that FD is not a coroutine.
3219 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3220 /// namespace. The namespace found is recorded in Namespace.
3222 SourceLocation FuncLoc);
3223 /// Check that the expression co_await promise.final_suspend() shall not be
3224 /// potentially-throwing.
3225 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3226
3227 ///@}
3228
3229 //
3230 //
3231 // -------------------------------------------------------------------------
3232 //
3233 //
3234
3235 /// \name C++ Scope Specifiers
3236 /// Implementations are in SemaCXXScopeSpec.cpp
3237 ///@{
3238
3239public:
3240 // Marks SS invalid if it represents an incomplete type.
3242 // Complete an enum decl, maybe without a scope spec.
3244 CXXScopeSpec *SS = nullptr);
3245
3246 /// Compute the DeclContext that is associated with the given type.
3247 ///
3248 /// \param T the type for which we are attempting to find a DeclContext.
3249 ///
3250 /// \returns the declaration context represented by the type T,
3251 /// or NULL if the declaration context cannot be computed (e.g., because it is
3252 /// dependent and not the current instantiation).
3254
3255 /// Compute the DeclContext that is associated with the given
3256 /// scope specifier.
3257 ///
3258 /// \param SS the C++ scope specifier as it appears in the source
3259 ///
3260 /// \param EnteringContext when true, we will be entering the context of
3261 /// this scope specifier, so we can retrieve the declaration context of a
3262 /// class template or class template partial specialization even if it is
3263 /// not the current instantiation.
3264 ///
3265 /// \returns the declaration context represented by the scope specifier @p SS,
3266 /// or NULL if the declaration context cannot be computed (e.g., because it is
3267 /// dependent and not the current instantiation).
3269 bool EnteringContext = false);
3271
3272 /// If the given nested name specifier refers to the current
3273 /// instantiation, return the declaration that corresponds to that
3274 /// current instantiation (C++0x [temp.dep.type]p1).
3275 ///
3276 /// \param NNS a dependent nested name specifier.
3278
3279 /// The parser has parsed a global nested-name-specifier '::'.
3280 ///
3281 /// \param CCLoc The location of the '::'.
3282 ///
3283 /// \param SS The nested-name-specifier, which will be updated in-place
3284 /// to reflect the parsed nested-name-specifier.
3285 ///
3286 /// \returns true if an error occurred, false otherwise.
3288
3289 /// The parser has parsed a '__super' nested-name-specifier.
3290 ///
3291 /// \param SuperLoc The location of the '__super' keyword.
3292 ///
3293 /// \param ColonColonLoc The location of the '::'.
3294 ///
3295 /// \param SS The nested-name-specifier, which will be updated in-place
3296 /// to reflect the parsed nested-name-specifier.
3297 ///
3298 /// \returns true if an error occurred, false otherwise.
3300 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3301
3302 /// Determines whether the given declaration is an valid acceptable
3303 /// result for name lookup of a nested-name-specifier.
3304 /// \param SD Declaration checked for nested-name-specifier.
3305 /// \param IsExtension If not null and the declaration is accepted as an
3306 /// extension, the pointed variable is assigned true.
3308 bool *CanCorrect = nullptr);
3309
3310 /// If the given nested-name-specifier begins with a bare identifier
3311 /// (e.g., Base::), perform name lookup for that identifier as a
3312 /// nested-name-specifier within the given scope, and return the result of
3313 /// that name lookup.
3315
3316 /// Keeps information about an identifier in a nested-name-spec.
3317 ///
3319 /// The type of the object, if we're parsing nested-name-specifier in
3320 /// a member access expression.
3322
3323 /// The identifier preceding the '::'.
3325
3326 /// The location of the identifier.
3328
3329 /// The location of the '::'.
3331
3332 /// Creates info object for the most typical case.
3334 SourceLocation ColonColonLoc,
3337 CCLoc(ColonColonLoc) {}
3338
3340 SourceLocation ColonColonLoc, QualType ObjectType)
3342 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3343 };
3344
3345 /// Build a new nested-name-specifier for "identifier::", as described
3346 /// by ActOnCXXNestedNameSpecifier.
3347 ///
3348 /// \param S Scope in which the nested-name-specifier occurs.
3349 /// \param IdInfo Parser information about an identifier in the
3350 /// nested-name-spec.
3351 /// \param EnteringContext If true, enter the context specified by the
3352 /// nested-name-specifier.
3353 /// \param SS Optional nested name specifier preceding the identifier.
3354 /// \param ScopeLookupResult Provides the result of name lookup within the
3355 /// scope of the nested-name-specifier that was computed at template
3356 /// definition time.
3357 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3358 /// error recovery and what kind of recovery is performed.
3359 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3360 /// are allowed. The bool value pointed by this parameter is set to
3361 /// 'true' if the identifier is treated as if it was followed by ':',
3362 /// not '::'.
3363 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3364 ///
3365 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3366 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3367 /// the result of name lookup within the scope of the nested-name-specifier
3368 /// that was computed at template definition time.
3369 ///
3370 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3371 /// recovery. This means that it should not emit diagnostics, it should
3372 /// just return true on failure. It also means it should only return a valid
3373 /// scope if it *knows* that the result is correct. It should not return in a
3374 /// dependent context, for example. Nor will it extend \p SS with the scope
3375 /// specifier.
3376 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3377 bool EnteringContext, CXXScopeSpec &SS,
3378 NamedDecl *ScopeLookupResult,
3379 bool ErrorRecoveryLookup,
3380 bool *IsCorrectedToColon = nullptr,
3381 bool OnlyNamespace = false);
3382
3383 /// The parser has parsed a nested-name-specifier 'identifier::'.
3384 ///
3385 /// \param S The scope in which this nested-name-specifier occurs.
3386 ///
3387 /// \param IdInfo Parser information about an identifier in the
3388 /// nested-name-spec.
3389 ///
3390 /// \param EnteringContext Whether we're entering the context nominated by
3391 /// this nested-name-specifier.
3392 ///
3393 /// \param SS The nested-name-specifier, which is both an input
3394 /// parameter (the nested-name-specifier before this type) and an
3395 /// output parameter (containing the full nested-name-specifier,
3396 /// including this new type).
3397 ///
3398 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3399 /// are allowed. The bool value pointed by this parameter is set to 'true'
3400 /// if the identifier is treated as if it was followed by ':', not '::'.
3401 ///
3402 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3403 ///
3404 /// \returns true if an error occurred, false otherwise.
3405 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3406 bool EnteringContext, CXXScopeSpec &SS,
3407 bool *IsCorrectedToColon = nullptr,
3408 bool OnlyNamespace = false);
3409
3410 /// The parser has parsed a nested-name-specifier
3411 /// 'template[opt] template-name < template-args >::'.
3412 ///
3413 /// \param S The scope in which this nested-name-specifier occurs.
3414 ///
3415 /// \param SS The nested-name-specifier, which is both an input
3416 /// parameter (the nested-name-specifier before this type) and an
3417 /// output parameter (containing the full nested-name-specifier,
3418 /// including this new type).
3419 ///
3420 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3421 /// \param TemplateName the template name.
3422 /// \param TemplateNameLoc The location of the template name.
3423 /// \param LAngleLoc The location of the opening angle bracket ('<').
3424 /// \param TemplateArgs The template arguments.
3425 /// \param RAngleLoc The location of the closing angle bracket ('>').
3426 /// \param CCLoc The location of the '::'.
3427 ///
3428 /// \param EnteringContext Whether we're entering the context of the
3429 /// nested-name-specifier.
3430 ///
3431 ///
3432 /// \returns true if an error occurred, false otherwise.
3434 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3435 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3436 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3437 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3438
3440 SourceLocation ColonColonLoc);
3441
3443 const DeclSpec &DS,
3444 SourceLocation ColonColonLoc,
3445 QualType Type);
3446
3447 /// IsInvalidUnlessNestedName - This method is used for error recovery
3448 /// purposes to determine whether the specified identifier is only valid as
3449 /// a nested name specifier, for example a namespace name. It is
3450 /// conservatively correct to always return false from this method.
3451 ///
3452 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3454 NestedNameSpecInfo &IdInfo,
3455 bool EnteringContext);
3456
3457 /// Given a C++ nested-name-specifier, produce an annotation value
3458 /// that the parser can use later to reconstruct the given
3459 /// nested-name-specifier.
3460 ///
3461 /// \param SS A nested-name-specifier.
3462 ///
3463 /// \returns A pointer containing all of the information in the
3464 /// nested-name-specifier \p SS.
3466
3467 /// Given an annotation pointer for a nested-name-specifier, restore
3468 /// the nested-name-specifier structure.
3469 ///
3470 /// \param Annotation The annotation pointer, produced by
3471 /// \c SaveNestedNameSpecifierAnnotation().
3472 ///
3473 /// \param AnnotationRange The source range corresponding to the annotation.
3474 ///
3475 /// \param SS The nested-name-specifier that will be updated with the contents
3476 /// of the annotation pointer.
3477 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3478 SourceRange AnnotationRange,
3479 CXXScopeSpec &SS);
3480
3481 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3482
3483 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3484 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3485 /// After this method is called, according to [C++ 3.4.3p3], names should be
3486 /// looked up in the declarator-id's scope, until the declarator is parsed and
3487 /// ActOnCXXExitDeclaratorScope is called.
3488 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3490
3491 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3492 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3493 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3494 /// Used to indicate that names should revert to being looked up in the
3495 /// defining scope.
3497
3498 ///@}
3499
3500 //
3501 //
3502 // -------------------------------------------------------------------------
3503 //
3504 //
3505
3506 /// \name Declarations
3507 /// Implementations are in SemaDecl.cpp
3508 ///@{
3509
3510public:
3512
3513 /// The index of the first InventedParameterInfo that refers to the current
3514 /// context.
3516
3517 /// A RAII object to temporarily push a declaration context.
3519 private:
3520 Sema &S;
3521 DeclContext *SavedContext;
3522 ProcessingContextState SavedContextState;
3523 QualType SavedCXXThisTypeOverride;
3524 unsigned SavedFunctionScopesStart;
3525 unsigned SavedInventedParameterInfosStart;
3526
3527 public:
3528 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3529 : S(S), SavedContext(S.CurContext),
3530 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3531 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3532 SavedFunctionScopesStart(S.FunctionScopesStart),
3533 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3534 assert(ContextToPush && "pushing null context");
3535 S.CurContext = ContextToPush;
3536 if (NewThisContext)
3537 S.CXXThisTypeOverride = QualType();
3538 // Any saved FunctionScopes do not refer to this context.
3539 S.FunctionScopesStart = S.FunctionScopes.size();
3540 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3541 }
3542
3543 void pop() {
3544 if (!SavedContext)
3545 return;
3546 S.CurContext = SavedContext;
3547 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3548 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3549 S.FunctionScopesStart = SavedFunctionScopesStart;
3550 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3551 SavedContext = nullptr;
3552 }
3553
3555 ContextRAII(const ContextRAII &) = delete;
3557 };
3558
3559 void DiagnoseInvalidJumps(Stmt *Body);
3560
3561 /// The function definitions which were renamed as part of typo-correction
3562 /// to match their respective declarations. We want to keep track of them
3563 /// to ensure that we don't emit a "redefinition" error if we encounter a
3564 /// correctly named definition after the renamed definition.
3566
3567 /// A cache of the flags available in enumerations with the flag_bits
3568 /// attribute.
3569 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3570
3571 /// A cache of enumerator values for enums checked by -Wassign-enum.
3572 llvm::DenseMap<const EnumDecl *, llvm::SmallVector<llvm::APSInt>>
3574
3575 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3576 /// declared. Rare. May alias another identifier, declared or undeclared.
3577 ///
3578 /// For aliases, the target identifier is used as a key for eventual
3579 /// processing when the target is declared. For the single-identifier form,
3580 /// the sole identifier is used as the key. Each entry is a `SetVector`
3581 /// (ordered by parse order) of aliases (identified by the alias name) in case
3582 /// of multiple aliases to the same undeclared identifier.
3583 llvm::MapVector<
3585 llvm::SetVector<
3587 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3589
3590 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3591 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3592 /// to define functions that occur in multiple standards to call the version
3593 /// in the currently selected standard.
3594 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3595
3596 /// Set containing all typedefs that are likely unused.
3599
3603
3604 /// The set of file scoped decls seen so far that have not been used
3605 /// and must warn if not used. Only contains the first declaration.
3607
3611
3612 /// All the tentative definitions encountered in the TU.
3614
3615 /// All the external declarations encoutered and used in the TU.
3617
3618 /// Generally null except when we temporarily switch decl contexts,
3619 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3621
3622 /// Is the module scope we are in a C++ Header Unit?
3624 return ModuleScopes.empty() ? false
3625 : ModuleScopes.back().Module->isHeaderUnit();
3626 }
3627
3628 /// Get the module owning an entity.
3629 Module *getOwningModule(const Decl *Entity) {
3630 return Entity->getOwningModule();
3631 }
3632
3633 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3634
3636 /// Returns the TypeDeclType for the given type declaration,
3637 /// as ASTContext::getTypeDeclType would, but
3638 /// performs the required semantic checks for name lookup of said entity.
3639 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3640 SourceLocation NameLoc);
3641
3642 /// If the identifier refers to a type name within this scope,
3643 /// return the declaration of that type.
3644 ///
3645 /// This routine performs ordinary name lookup of the identifier II
3646 /// within the given scope, with optional C++ scope specifier SS, to
3647 /// determine whether the name refers to a type. If so, returns an
3648 /// opaque pointer (actually a QualType) corresponding to that
3649 /// type. Otherwise, returns NULL.
3651 Scope *S, CXXScopeSpec *SS = nullptr,
3652 bool isClassName = false, bool HasTrailingDot = false,
3653 ParsedType ObjectType = nullptr,
3654 bool IsCtorOrDtorName = false,
3655 bool WantNontrivialTypeSourceInfo = false,
3656 bool IsClassTemplateDeductionContext = true,
3657 ImplicitTypenameContext AllowImplicitTypename =
3659 IdentifierInfo **CorrectedII = nullptr);
3660
3661 /// isTagName() - This method is called *for error recovery purposes only*
3662 /// to determine if the specified name is a valid tag name ("struct foo"). If
3663 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3664 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3665 /// diagnose cases in C where the user forgot to specify the tag.
3667
3668 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3669 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3670 /// then downgrade the missing typename error to a warning.
3671 /// This is needed for MSVC compatibility; Example:
3672 /// @code
3673 /// template<class T> class A {
3674 /// public:
3675 /// typedef int TYPE;
3676 /// };
3677 /// template<class T> class B : public A<T> {
3678 /// public:
3679 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3680 /// };
3681 /// @endcode
3682 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3684 Scope *S, CXXScopeSpec *SS,
3685 ParsedType &SuggestedType,
3686 bool IsTemplateName = false);
3687
3688 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3689 /// type name has failed in a dependent context. In these situations, we
3690 /// automatically form a DependentTypeName that will retry lookup in a related
3691 /// scope during instantiation.
3693 SourceLocation NameLoc,
3694 bool IsTemplateTypeArg);
3695
3696 class NameClassification {
3698 union {
3703 };
3704
3705 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3706
3707 public:
3710
3713
3714 static NameClassification Error() {
3715 return NameClassification(NameClassificationKind::Error);
3716 }
3717
3718 static NameClassification Unknown() {
3719 return NameClassification(NameClassificationKind::Unknown);
3720 }
3721
3722 static NameClassification OverloadSet(ExprResult E) {
3723 NameClassification Result(NameClassificationKind::OverloadSet);
3724 Result.Expr = E;
3725 return Result;
3726 }
3727
3728 static NameClassification NonType(NamedDecl *D) {
3729 NameClassification Result(NameClassificationKind::NonType);
3730 Result.NonTypeDecl = D;
3731 return Result;
3732 }
3733
3734 static NameClassification UndeclaredNonType() {
3735 return NameClassification(NameClassificationKind::UndeclaredNonType);
3736 }
3737
3738 static NameClassification DependentNonType() {
3739 return NameClassification(NameClassificationKind::DependentNonType);
3740 }
3741
3742 static NameClassification TypeTemplate(TemplateName Name) {
3743 NameClassification Result(NameClassificationKind::TypeTemplate);
3744 Result.Template = Name;
3745 return Result;
3746 }
3747
3748 static NameClassification VarTemplate(TemplateName Name) {
3749 NameClassification Result(NameClassificationKind::VarTemplate);
3750 Result.Template = Name;
3751 return Result;
3752 }
3753
3754 static NameClassification FunctionTemplate(TemplateName Name) {
3756 Result.Template = Name;
3757 return Result;
3758 }
3759
3760 static NameClassification Concept(TemplateName Name) {
3761 NameClassification Result(NameClassificationKind::Concept);
3762 Result.Template = Name;
3763 return Result;
3764 }
3765
3766 static NameClassification UndeclaredTemplate(TemplateName Name) {
3768 Result.Template = Name;
3769 return Result;
3770 }
3771
3772 NameClassificationKind getKind() const { return Kind; }
3773
3776 return Expr;
3777 }
3778
3780 assert(Kind == NameClassificationKind::Type);
3781 return Type;
3782 }
3783
3785 assert(Kind == NameClassificationKind::NonType);
3786 return NonTypeDecl;
3787 }
3788
3797
3799 switch (Kind) {
3801 return TNK_Type_template;
3803 return TNK_Function_template;
3805 return TNK_Var_template;
3807 return TNK_Concept_template;
3810 default:
3811 llvm_unreachable("unsupported name classification.");
3812 }
3813 }
3814 };
3815
3816 /// Perform name lookup on the given name, classifying it based on
3817 /// the results of name lookup and the following token.
3818 ///
3819 /// This routine is used by the parser to resolve identifiers and help direct
3820 /// parsing. When the identifier cannot be found, this routine will attempt
3821 /// to correct the typo and classify based on the resulting name.
3822 ///
3823 /// \param S The scope in which we're performing name lookup.
3824 ///
3825 /// \param SS The nested-name-specifier that precedes the name.
3826 ///
3827 /// \param Name The identifier. If typo correction finds an alternative name,
3828 /// this pointer parameter will be updated accordingly.
3829 ///
3830 /// \param NameLoc The location of the identifier.
3831 ///
3832 /// \param NextToken The token following the identifier. Used to help
3833 /// disambiguate the name.
3834 ///
3835 /// \param CCC The correction callback, if typo correction is desired.
3836 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3837 IdentifierInfo *&Name, SourceLocation NameLoc,
3838 const Token &NextToken,
3839 CorrectionCandidateCallback *CCC = nullptr);
3840
3841 /// Act on the result of classifying a name as an undeclared (ADL-only)
3842 /// non-type declaration.
3844 SourceLocation NameLoc);
3845 /// Act on the result of classifying a name as an undeclared member of a
3846 /// dependent base class.
3848 IdentifierInfo *Name,
3849 SourceLocation NameLoc,
3850 bool IsAddressOfOperand);
3851 /// Act on the result of classifying a name as a specific non-type
3852 /// declaration.
3855 SourceLocation NameLoc,
3856 const Token &NextToken);
3857 /// Act on the result of classifying a name as an overload set.
3859
3860 /// Describes the detailed kind of a template name. Used in diagnostics.
3872
3873 /// Determine whether it's plausible that E was intended to be a
3874 /// template-name.
3876 if (!getLangOpts().CPlusPlus || E.isInvalid())
3877 return false;
3878 Dependent = false;
3879 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3880 return !DRE->hasExplicitTemplateArgs();
3881 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3882 return !ME->hasExplicitTemplateArgs();
3883 Dependent = true;
3884 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3885 return !DSDRE->hasExplicitTemplateArgs();
3886 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3887 return !DSME->hasExplicitTemplateArgs();
3888 // Any additional cases recognized here should also be handled by
3889 // diagnoseExprIntendedAsTemplateName.
3890 return false;
3891 }
3892
3893 void warnOnReservedIdentifier(const NamedDecl *D);
3895
3896 void ProcessPragmaExport(DeclaratorDecl *newDecl);
3897
3899
3901 MultiTemplateParamsArg TemplateParameterLists);
3902
3903 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3904 /// true if we were successful.
3906 SourceLocation Loc,
3907 unsigned FailedFoldDiagID);
3908
3909 /// Register the given locally-scoped extern "C" declaration so
3910 /// that it can be found later for redeclarations. We include any extern "C"
3911 /// declaration that is not visible in the translation unit here, not just
3912 /// function-scope declarations.
3914
3915 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3916 /// If T is the name of a class, then each of the following shall have a
3917 /// name different from T:
3918 /// - every static data member of class T;
3919 /// - every member function of class T
3920 /// - every member of class T that is itself a type;
3921 /// \returns true if the declaration name violates these rules.
3923
3924 /// Diagnose a declaration whose declarator-id has the given
3925 /// nested-name-specifier.
3926 ///
3927 /// \param SS The nested-name-specifier of the declarator-id.
3928 ///
3929 /// \param DC The declaration context to which the nested-name-specifier
3930 /// resolves.
3931 ///
3932 /// \param Name The name of the entity being declared.
3933 ///
3934 /// \param Loc The location of the name of the entity being declared.
3935 ///
3936 /// \param IsMemberSpecialization Whether we are declaring a member
3937 /// specialization.
3938 ///
3939 /// \param TemplateId The template-id, if any.
3940 ///
3941 /// \returns true if we cannot safely recover from this error, false
3942 /// otherwise.
3945 TemplateIdAnnotation *TemplateId,
3946 bool IsMemberSpecialization);
3947
3949
3950 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3951
3953 unsigned &IntVal);
3954
3955 /// Diagnose function specifiers on a declaration of an identifier that
3956 /// does not identify a function.
3957 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3958
3959 /// Return the declaration shadowed by the given typedef \p D, or null
3960 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3962 const LookupResult &R);
3963
3964 /// Return the declaration shadowed by the given variable \p D, or null
3965 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3967
3968 /// Return the declaration shadowed by the given variable \p D, or null
3969 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3971 const LookupResult &R);
3972 /// Diagnose variable or built-in function shadowing. Implements
3973 /// -Wshadow.
3974 ///
3975 /// This method is called whenever a VarDecl is added to a "useful"
3976 /// scope.
3977 ///
3978 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3979 /// \param R the lookup of the name
3980 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3981 const LookupResult &R);
3982
3983 /// Check -Wshadow without the advantage of a previous lookup.
3984 void CheckShadow(Scope *S, VarDecl *D);
3985
3986 /// Warn if 'E', which is an expression that is about to be modified, refers
3987 /// to a shadowing declaration.
3989
3990 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3991 /// when these variables are captured by the lambda.
3993
3994 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
3995 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
3996 TypedefNameDecl *NewTD);
3999 TypeSourceInfo *TInfo,
4001
4002 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
4003 /// declares a typedef-name, either using the 'typedef' type specifier or via
4004 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
4008 TypeSourceInfo *TInfo,
4010 MultiTemplateParamsArg TemplateParamLists,
4011 bool &AddToScope,
4013
4014private:
4015 // Perform a check on an AsmLabel to verify its consistency and emit
4016 // diagnostics in case of an error.
4017 void CheckAsmLabel(Scope *S, Expr *AsmLabelExpr, StorageClass SC,
4018 TypeSourceInfo *TInfo, VarDecl *);
4019
4020public:
4021 /// Perform semantic checking on a newly-created variable
4022 /// declaration.
4023 ///
4024 /// This routine performs all of the type-checking required for a
4025 /// variable declaration once it has been built. It is used both to
4026 /// check variables after they have been parsed and their declarators
4027 /// have been translated into a declaration, and to check variables
4028 /// that have been instantiated from a template.
4029 ///
4030 /// Sets NewVD->isInvalidDecl() if an error was encountered.
4031 ///
4032 /// Returns true if the variable declaration is a redeclaration.
4033 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
4034 void CheckVariableDeclarationType(VarDecl *NewVD);
4035 void CheckCompleteVariableDeclaration(VarDecl *VD);
4036
4037 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
4038 TypeSourceInfo *TInfo,
4039 LookupResult &Previous,
4040 MultiTemplateParamsArg TemplateParamLists,
4041 bool &AddToScope);
4042
4043 /// AddOverriddenMethods - See if a method overrides any in the base classes,
4044 /// and if so, check that it's a valid override and remember it.
4045 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
4046
4047 /// Perform semantic checking of a new function declaration.
4048 ///
4049 /// Performs semantic analysis of the new function declaration
4050 /// NewFD. This routine performs all semantic checking that does not
4051 /// require the actual declarator involved in the declaration, and is
4052 /// used both for the declaration of functions as they are parsed
4053 /// (called via ActOnDeclarator) and for the declaration of functions
4054 /// that have been instantiated via C++ template instantiation (called
4055 /// via InstantiateDecl).
4056 ///
4057 /// \param IsMemberSpecialization whether this new function declaration is
4058 /// a member specialization (that replaces any definition provided by the
4059 /// previous declaration).
4060 ///
4061 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4062 ///
4063 /// \returns true if the function declaration is a redeclaration.
4064 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4065 LookupResult &Previous,
4066 bool IsMemberSpecialization, bool DeclIsDefn);
4067
4068 /// Checks if the new declaration declared in dependent context must be
4069 /// put in the same redeclaration chain as the specified declaration.
4070 ///
4071 /// \param D Declaration that is checked.
4072 /// \param PrevDecl Previous declaration found with proper lookup method for
4073 /// the same declaration name.
4074 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4075 /// belongs to.
4076 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4077
4078 /// Determines if we can perform a correct type check for \p D as a
4079 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4080 /// best-effort check.
4081 ///
4082 /// \param NewD The new declaration.
4083 /// \param OldD The old declaration.
4084 /// \param NewT The portion of the type of the new declaration to check.
4085 /// \param OldT The portion of the type of the old declaration to check.
4086 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4087 QualType NewT, QualType OldT);
4088 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4089 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4090
4091 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4092 /// containing class. Otherwise it will return implicit SectionAttr if the
4093 /// function is a definition and there is an active value on CodeSegStack
4094 /// (from the current #pragma code-seg value).
4095 ///
4096 /// \param FD Function being declared.
4097 /// \param IsDefinition Whether it is a definition or just a declaration.
4098 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4099 /// nullptr if no attribute should be added.
4100 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4101 bool IsDefinition);
4102
4103 /// Common checks for a parameter-declaration that should apply to both
4104 /// function parameters and non-type template parameters.
4105 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4106
4107 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4108 /// to introduce parameters into function prototype scope.
4109 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4110 SourceLocation ExplicitThisLoc = {});
4111
4112 /// Synthesizes a variable for a parameter arising from a
4113 /// typedef.
4114 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4115 QualType T);
4116 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4117 SourceLocation NameLoc,
4118 const IdentifierInfo *Name, QualType T,
4119 TypeSourceInfo *TSInfo, StorageClass SC);
4120
4121 /// Emit diagnostics if the initializer or any of its explicit or
4122 /// implicitly-generated subexpressions require copying or
4123 /// default-initializing a type that is or contains a C union type that is
4124 /// non-trivial to copy or default-initialize.
4125 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4126
4127 // These flags are passed to checkNonTrivialCUnion.
4133
4134 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4135 /// a non-trivial C union is used in an invalid context.
4137 NonTrivialCUnionContext UseContext,
4138 unsigned NonTrivialKind);
4139
4140 /// Certain globally-unique variables might be accidentally duplicated if
4141 /// built into multiple shared libraries with hidden visibility. This can
4142 /// cause problems if the variable is mutable, its initialization is
4143 /// effectful, or its address is taken.
4146
4147 /// AddInitializerToDecl - Adds the initializer Init to the
4148 /// declaration dcl. If DirectInit is true, this is C++ direct
4149 /// initialization rather than copy initialization.
4150 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4151 void ActOnUninitializedDecl(Decl *dcl);
4152
4153 /// ActOnInitializerError - Given that there was an error parsing an
4154 /// initializer for the given declaration, try to at least re-establish
4155 /// invariants such as whether a variable's type is either dependent or
4156 /// complete.
4157 void ActOnInitializerError(Decl *Dcl);
4158
4159 void ActOnCXXForRangeDecl(Decl *D);
4161 IdentifierInfo *Ident,
4162 ParsedAttributes &Attrs);
4163
4164 /// Check if VD needs to be dllexport/dllimport due to being in a
4165 /// dllexport/import function.
4168
4169 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4170 /// any semantic actions necessary after any initializer has been attached.
4171 void FinalizeDeclaration(Decl *D);
4173 ArrayRef<Decl *> Group);
4174
4175 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4176 /// group, performing any necessary semantic checking.
4178
4179 /// Should be called on all declarations that might have attached
4180 /// documentation comments.
4181 void ActOnDocumentableDecl(Decl *D);
4183
4184 enum class FnBodyKind {
4185 /// C++26 [dcl.fct.def.general]p1
4186 /// function-body:
4187 /// ctor-initializer[opt] compound-statement
4188 /// function-try-block
4190 /// = default ;
4192 /// deleted-function-body
4193 ///
4194 /// deleted-function-body:
4195 /// = delete ;
4196 /// = delete ( unevaluated-string ) ;
4198 };
4199
4201 SourceLocation LocAfterDecls);
4203 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4204 SkipBodyInfo *SkipBody = nullptr);
4206 MultiTemplateParamsArg TemplateParamLists,
4207 SkipBodyInfo *SkipBody = nullptr,
4208 FnBodyKind BodyKind = FnBodyKind::Other);
4210 SkipBodyInfo *SkipBody = nullptr,
4211 FnBodyKind BodyKind = FnBodyKind::Other);
4213
4214 /// Determine whether we can delay parsing the body of a function or
4215 /// function template until it is used, assuming we don't care about emitting
4216 /// code for that function.
4217 ///
4218 /// This will be \c false if we may need the body of the function in the
4219 /// middle of parsing an expression (where it's impractical to switch to
4220 /// parsing a different function), for instance, if it's constexpr in C++11
4221 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4222 bool canDelayFunctionBody(const Declarator &D);
4223
4224 /// Determine whether we can skip parsing the body of a function
4225 /// definition, assuming we don't care about analyzing its body or emitting
4226 /// code for that function.
4227 ///
4228 /// This will be \c false only if we may need the body of the function in
4229 /// order to parse the rest of the program (for instance, if it is
4230 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4231 bool canSkipFunctionBody(Decl *D);
4232
4233 /// Given the set of return statements within a function body,
4234 /// compute the variables that are subject to the named return value
4235 /// optimization.
4236 ///
4237 /// Each of the variables that is subject to the named return value
4238 /// optimization will be marked as NRVO variables in the AST, and any
4239 /// return statement that has a marked NRVO variable as its NRVO candidate can
4240 /// use the named return value optimization.
4241 ///
4242 /// This function applies a very simplistic algorithm for NRVO: if every
4243 /// return statement in the scope of a variable has the same NRVO candidate,
4244 /// that candidate is an NRVO variable.
4246
4247 /// Performs semantic analysis at the end of a function body.
4248 ///
4249 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4250 /// releasing the associated \p FunctionScopeInfo. This is useful when
4251 /// building e.g. LambdaExprs.
4253 bool IsInstantiation = false,
4254 bool RetainFunctionScopeInfo = false);
4257
4258 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4259 /// attribute for which parsing is delayed.
4261
4262 /// Diagnose any unused parameters in the given sequence of
4263 /// ParmVarDecl pointers.
4265
4266 /// Diagnose whether the size of parameters or return value of a
4267 /// function or obj-c method definition is pass-by-value and larger than a
4268 /// specified threshold.
4269 void
4271 QualType ReturnTy, NamedDecl *D);
4272
4274 SourceLocation RParenLoc);
4275
4278
4279 void ActOnPopScope(SourceLocation Loc, Scope *S);
4280
4281 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4282 /// no declarator (e.g. "struct foo;") is parsed.
4284 const ParsedAttributesView &DeclAttrs,
4285 RecordDecl *&AnonRecord);
4286
4287 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4288 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4289 /// parameters to cope with template friend declarations.
4291 const ParsedAttributesView &DeclAttrs,
4292 MultiTemplateParamsArg TemplateParams,
4293 bool IsExplicitInstantiation,
4294 RecordDecl *&AnonRecord,
4295 SourceLocation EllipsisLoc = {});
4296
4297 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4298 /// anonymous structure or union. Anonymous unions are a C++ feature
4299 /// (C++ [class.union]) and a C11 feature; anonymous structures
4300 /// are a C11 feature and GNU C++ extension.
4301 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4302 RecordDecl *Record,
4303 const PrintingPolicy &Policy);
4304
4305 /// Called once it is known whether
4306 /// a tag declaration is an anonymous union or struct.
4308
4309 /// Emit diagnostic warnings for placeholder members.
4310 /// We can only do that after the class is fully constructed,
4311 /// as anonymous union/structs can insert placeholders
4312 /// in their parent scope (which might be a Record).
4314
4315 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4316 /// Microsoft C anonymous structure.
4317 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4318 /// Example:
4319 ///
4320 /// struct A { int a; };
4321 /// struct B { struct A; int b; };
4322 ///
4323 /// void foo() {
4324 /// B var;
4325 /// var.a = 3;
4326 /// }
4327 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4328 RecordDecl *Record);
4329
4330 /// Given a non-tag type declaration, returns an enum useful for indicating
4331 /// what kind of non-tag type this is.
4332 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4333
4334 /// Determine whether a tag with a given kind is acceptable
4335 /// as a redeclaration of the given tag declaration.
4336 ///
4337 /// \returns true if the new tag kind is acceptable, false otherwise.
4339 bool isDefinition, SourceLocation NewTagLoc,
4340 const IdentifierInfo *Name);
4341
4342 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4343 /// former case, Name will be non-null. In the later case, Name will be null.
4344 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4345 /// a reference/declaration/definition of a tag.
4346 ///
4347 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4348 /// trailing-type-specifier) other than one in an alias-declaration.
4349 ///
4350 /// \param SkipBody If non-null, will be set to indicate if the caller should
4351 /// skip the definition of this tag and treat it as if it were a declaration.
4352 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4353 SourceLocation KWLoc, CXXScopeSpec &SS,
4354 IdentifierInfo *Name, SourceLocation NameLoc,
4355 const ParsedAttributesView &Attr, AccessSpecifier AS,
4356 SourceLocation ModulePrivateLoc,
4357 MultiTemplateParamsArg TemplateParameterLists,
4358 bool &OwnedDecl, bool &IsDependent,
4359 SourceLocation ScopedEnumKWLoc,
4360 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4361 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4362 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4363
4364 /// ActOnField - Each field of a C struct/union is passed into this in order
4365 /// to create a FieldDecl object for it.
4366 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4367 Declarator &D, Expr *BitfieldWidth);
4368
4369 /// HandleField - Analyze a field of a C struct or a C++ data member.
4370 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4371 Declarator &D, Expr *BitfieldWidth,
4372 InClassInitStyle InitStyle, AccessSpecifier AS);
4373
4374 /// Build a new FieldDecl and check its well-formedness.
4375 ///
4376 /// This routine builds a new FieldDecl given the fields name, type,
4377 /// record, etc. \p PrevDecl should refer to any previous declaration
4378 /// with the same name and in the same scope as the field to be
4379 /// created.
4380 ///
4381 /// \returns a new FieldDecl.
4382 ///
4383 /// \todo The Declarator argument is a hack. It will be removed once
4384 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4385 TypeSourceInfo *TInfo, RecordDecl *Record,
4386 SourceLocation Loc, bool Mutable,
4387 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4388 SourceLocation TSSL, AccessSpecifier AS,
4389 NamedDecl *PrevDecl, Declarator *D = nullptr);
4390
4392
4393 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4394 /// class and class extensions. For every class \@interface and class
4395 /// extension \@interface, if the last ivar is a bitfield of any type,
4396 /// then add an implicit `char :0` ivar to the end of that interface.
4397 void ActOnLastBitfield(SourceLocation DeclStart,
4398 SmallVectorImpl<Decl *> &AllIvarDecls);
4399
4400 // This is used for both record definitions and ObjC interface declarations.
4401 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4402 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4403 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4404
4405 /// ActOnTagStartDefinition - Invoked when we have entered the
4406 /// scope of a tag's definition (e.g., for an enumeration, class,
4407 /// struct, or union).
4408 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4409
4410 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4411 /// Differently from C++, actually parse the body and reject / error out
4412 /// in case of a structural mismatch.
4413 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4414
4416
4417 /// Invoked when we enter a tag definition that we're skipping.
4419
4420 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4421 /// C++ record definition's base-specifiers clause and are starting its
4422 /// member declarations.
4424 SourceLocation FinalLoc,
4425 bool IsFinalSpelledSealed,
4426 bool IsAbstract,
4427 SourceLocation LBraceLoc);
4428
4429 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4430 /// the definition of a tag (enumeration, class, struct, or union).
4432 SourceRange BraceRange);
4433
4436
4438
4439 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4440 /// error parsing the definition of a tag.
4442
4444 EnumConstantDecl *LastEnumConst,
4445 SourceLocation IdLoc, IdentifierInfo *Id,
4446 Expr *val);
4447
4448 /// Check that this is a valid underlying type for an enum declaration.
4450
4451 /// Check whether this is a valid redeclaration of a previous enumeration.
4452 /// \return true if the redeclaration was invalid.
4453 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4454 QualType EnumUnderlyingTy, bool IsFixed,
4455 const EnumDecl *Prev);
4456
4457 /// Determine whether the body of an anonymous enumeration should be skipped.
4458 /// \param II The name of the first enumerator.
4460 SourceLocation IILoc);
4461
4462 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4463 SourceLocation IdLoc, IdentifierInfo *Id,
4464 const ParsedAttributesView &Attrs,
4465 SourceLocation EqualLoc, Expr *Val,
4466 SkipBodyInfo *SkipBody = nullptr);
4467 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4468 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4469 const ParsedAttributesView &Attr);
4470
4471 /// Set the current declaration context until it gets popped.
4472 void PushDeclContext(Scope *S, DeclContext *DC);
4473 void PopDeclContext();
4474
4475 /// EnterDeclaratorContext - Used when we must lookup names in the context
4476 /// of a declarator's nested name specifier.
4479
4480 /// Enter a template parameter scope, after it's been associated with a
4481 /// particular DeclContext. Causes lookup within the scope to chain through
4482 /// enclosing contexts in the correct order.
4484
4485 /// Push the parameters of D, which must be a function, into scope.
4488
4489 /// Add this decl to the scope shadowed decl chains.
4490 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4491
4492 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4493 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4494 /// true if 'D' belongs to the given declaration context.
4495 ///
4496 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4497 /// enclosing namespace set of the context, rather than contained
4498 /// directly within it.
4499 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4500 bool AllowInlineNamespace = false) const;
4501
4502 /// Finds the scope corresponding to the given decl context, if it
4503 /// happens to be an enclosing scope. Otherwise return NULL.
4505
4506 /// Subroutines of ActOnDeclarator().
4508 TypeSourceInfo *TInfo);
4510
4511 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4513 NamedDecl *New, Decl *Old,
4515
4516 /// CheckAttributesOnDeducedType - Calls Sema functions for attributes that
4517 /// requires the type to be deduced.
4519
4520 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4521 /// same name and scope as a previous declaration 'Old'. Figure out
4522 /// how to resolve this situation, merging decls or emitting
4523 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4525 LookupResult &OldDecls);
4526
4527 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4528 /// definition visible.
4529 /// This method performs any necessary cleanup on the parser state to discard
4530 /// child nodes from newly parsed decl we are retiring.
4531 void CleanupMergedEnum(Scope *S, Decl *New);
4532
4533 /// MergeFunctionDecl - We just parsed a function 'New' from
4534 /// declarator D which has the same name and scope as a previous
4535 /// declaration 'Old'. Figure out how to resolve this situation,
4536 /// merging decls or emitting diagnostics as appropriate.
4537 ///
4538 /// In C++, New and Old must be declarations that are not
4539 /// overloaded. Use IsOverload to determine whether New and Old are
4540 /// overloaded, and to select the Old declaration that New should be
4541 /// merged with.
4542 ///
4543 /// Returns true if there was an error, false otherwise.
4545 bool MergeTypeWithOld, bool NewDeclIsDefn);
4546
4547 /// Completes the merge of two function declarations that are
4548 /// known to be compatible.
4549 ///
4550 /// This routine handles the merging of attributes and other
4551 /// properties of function declarations from the old declaration to
4552 /// the new declaration, once we know that New is in fact a
4553 /// redeclaration of Old.
4554 ///
4555 /// \returns false
4557 Scope *S, bool MergeTypeWithOld);
4559
4560 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4561 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4562 /// situation, merging decls or emitting diagnostics as appropriate.
4563 ///
4564 /// Tentative definition rules (C99 6.9.2p2) are checked by
4565 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4566 /// definitions here, since the initializer hasn't been attached.
4568
4569 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4570 /// scope as a previous declaration 'Old'. Figure out how to merge their
4571 /// types, emitting diagnostics as appropriate.
4572 ///
4573 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4574 /// back to here in AddInitializerToDecl. We can't check them before the
4575 /// initializer is attached.
4576 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4577
4578 /// We've just determined that \p Old and \p New both appear to be definitions
4579 /// of the same variable. Either diagnose or fix the problem.
4580 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4582
4583 /// Filters out lookup results that don't fall within the given scope
4584 /// as determined by isDeclInScope.
4586 bool ConsiderLinkage, bool AllowInlineNamespace);
4587
4588 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4589 /// have compatible owning modules.
4591
4592 /// [module.interface]p6:
4593 /// A redeclaration of an entity X is implicitly exported if X was introduced
4594 /// by an exported declaration; otherwise it shall not be exported.
4596
4597 /// A wrapper function for checking the semantic restrictions of
4598 /// a redeclaration within a module.
4600
4601 /// Check the redefinition in C++20 Modules.
4602 ///
4603 /// [basic.def.odr]p14:
4604 /// For any definable item D with definitions in multiple translation units,
4605 /// - if D is a non-inline non-templated function or variable, or
4606 /// - if the definitions in different translation units do not satisfy the
4607 /// following requirements,
4608 /// the program is ill-formed; a diagnostic is required only if the
4609 /// definable item is attached to a named module and a prior definition is
4610 /// reachable at the point where a later definition occurs.
4611 /// - Each such definition shall not be attached to a named module
4612 /// ([module.unit]).
4613 /// - Each such definition shall consist of the same sequence of tokens, ...
4614 /// ...
4615 ///
4616 /// Return true if the redefinition is not allowed. Return false otherwise.
4617 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4618
4620
4621 /// If it's a file scoped decl that must warn if not used, keep track
4622 /// of it.
4624
4625 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4627
4630 DiagReceiverTy DiagReceiver);
4631 void DiagnoseUnusedDecl(const NamedDecl *ND);
4632
4633 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4634 /// unless they are marked attr(unused).
4635 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4636
4637 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4638 /// variable.
4639 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4640
4641 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4642 /// from S, where a non-field would be declared. This routine copes
4643 /// with the difference between C and C++ scoping rules in structs and
4644 /// unions. For example, the following code is well-formed in C but
4645 /// ill-formed in C++:
4646 /// @code
4647 /// struct S6 {
4648 /// enum { BAR } e;
4649 /// };
4650 ///
4651 /// void test_S6() {
4652 /// struct S6 a;
4653 /// a.e = BAR;
4654 /// }
4655 /// @endcode
4656 /// For the declaration of BAR, this routine will return a different
4657 /// scope. The scope S will be the scope of the unnamed enumeration
4658 /// within S6. In C++, this routine will return the scope associated
4659 /// with S6, because the enumeration's scope is a transparent
4660 /// context but structures can contain non-field names. In C, this
4661 /// routine will return the translation unit scope, since the
4662 /// enumeration's scope is a transparent context and structures cannot
4663 /// contain non-field names.
4665
4667 SourceLocation Loc);
4668
4669 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4670 /// file scope. lazily create a decl for it. ForRedeclaration is true
4671 /// if we're creating this built-in in anticipation of redeclaring the
4672 /// built-in.
4673 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4674 bool ForRedeclaration, SourceLocation Loc);
4675
4676 /// Get the outermost AttributedType node that sets a calling convention.
4677 /// Valid types should not have multiple attributes with different CCs.
4678 const AttributedType *getCallingConvAttributedType(QualType T) const;
4679
4680 /// GetNameForDeclarator - Determine the full declaration name for the
4681 /// given Declarator.
4683
4684 /// Retrieves the declaration name from a parsed unqualified-id.
4686
4687 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4688 /// we are currently parsing the initializer.
4690
4691 /// Look for a locally scoped extern "C" declaration by the given name.
4693
4696
4697 /// Adjust the \c DeclContext for a function or variable that might be a
4698 /// function-local external declaration.
4700
4702
4703 /// Checks if the variant/multiversion functions are compatible.
4705 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4706 const PartialDiagnostic &NoProtoDiagID,
4707 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4708 const PartialDiagnosticAt &NoSupportDiagIDAt,
4709 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4710 bool ConstexprSupported, bool CLinkageMayDiffer);
4711
4712 /// type checking declaration initializers (C99 6.7.8)
4714 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4715
4718 SourceRange Range, bool DirectInit,
4719 Expr *Init);
4720
4722 Expr *Init);
4723
4725
4726 // Heuristically tells if the function is `get_return_object` member of a
4727 // coroutine promise_type by matching the function name.
4728 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4729 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4730
4731 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4732 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4734 Scope *S);
4735
4736 /// If this function is a C++ replaceable global allocation function
4737 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4738 /// adds any function attributes that we know a priori based on the standard.
4739 ///
4740 /// We need to check for duplicate attributes both here and where user-written
4741 /// attributes are applied to declarations.
4743 FunctionDecl *FD);
4744
4745 /// Adds any function attributes that we know a priori based on
4746 /// the declaration of this function.
4747 ///
4748 /// These attributes can apply both to implicitly-declared builtins
4749 /// (like __builtin___printf_chk) or to library-declared functions
4750 /// like NSLog or printf.
4751 ///
4752 /// We need to check for duplicate attributes both here and where user-written
4753 /// attributes are applied to declarations.
4755
4756 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4757 /// the correct width, and that the field type is valid.
4758 /// Returns false on success.
4760 const IdentifierInfo *FieldName, QualType FieldTy,
4761 bool IsMsStruct, Expr *BitWidth);
4762
4763 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4764 /// enum. If AllowMask is true, then we also allow the complement of a valid
4765 /// value, to be used as a mask.
4766 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4767 bool AllowMask) const;
4768
4769 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4770 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4771 SourceLocation WeakNameLoc);
4772
4773 /// ActOnPragmaRedefineExtname - Called on well formed
4774 /// \#pragma redefine_extname oldname newname.
4776 IdentifierInfo *AliasName,
4777 SourceLocation PragmaLoc,
4778 SourceLocation WeakNameLoc,
4779 SourceLocation AliasNameLoc);
4780
4781 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4782 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4783 SourceLocation PragmaLoc,
4784 SourceLocation WeakNameLoc,
4785 SourceLocation AliasNameLoc);
4786
4787 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4790 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4791 OMPDiscarded, // Discarded due to OpenMP hostness
4792 TemplateDiscarded, // Discarded due to uninstantiated templates
4794 };
4795 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4796 bool Final = false);
4797
4798 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4800
4801 /// Function or variable declarations to be checked for whether the deferred
4802 /// diagnostics should be emitted.
4804
4805private:
4806 /// Map of current shadowing declarations to shadowed declarations. Warn if
4807 /// it looks like the user is trying to modify the shadowing declaration.
4808 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4809
4810 // We need this to handle
4811 //
4812 // typedef struct {
4813 // void *foo() { return 0; }
4814 // } A;
4815 //
4816 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4817 // for example. If 'A', foo will have external linkage. If we have '*A',
4818 // foo will have no linkage. Since we can't know until we get to the end
4819 // of the typedef, this function finds out if D might have non-external
4820 // linkage. Callers should verify at the end of the TU if it D has external
4821 // linkage or not.
4822 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4823
4824#include "clang/Sema/AttrIsTypeDependent.inc"
4825
4826 ///@}
4827
4828 //
4829 //
4830 // -------------------------------------------------------------------------
4831 //
4832 //
4833
4834 /// \name Declaration Attribute Handling
4835 /// Implementations are in SemaDeclAttr.cpp
4836 ///@{
4837
4838public:
4839 /// Describes the kind of priority given to an availability attribute.
4840 ///
4841 /// The sum of priorities deteremines the final priority of the attribute.
4842 /// The final priority determines how the attribute will be merged.
4843 /// An attribute with a lower priority will always remove higher priority
4844 /// attributes for the specified platform when it is being applied. An
4845 /// attribute with a higher priority will not be applied if the declaration
4846 /// already has an availability attribute with a lower priority for the
4847 /// specified platform. The final prirority values are not expected to match
4848 /// the values in this enumeration, but instead should be treated as a plain
4849 /// integer value. This enumeration just names the priority weights that are
4850 /// used to calculate that final vaue.
4852 /// The availability attribute was specified explicitly next to the
4853 /// declaration.
4855
4856 /// The availability attribute was applied using '#pragma clang attribute'.
4858
4859 /// The availability attribute for a specific platform was inferred from
4860 /// an availability attribute for another platform.
4862 };
4863
4864 /// Describes the reason a calling convention specification was ignored, used
4865 /// for diagnostics.
4872
4873 /// A helper function to provide Attribute Location for the Attr types
4874 /// AND the ParsedAttr.
4875 template <typename AttrInfo>
4876 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4877 getAttrLoc(const AttrInfo &AL) {
4878 return AL.getLocation();
4879 }
4881
4882 /// If Expr is a valid integer constant, get the value of the integer
4883 /// expression and return success or failure. May output an error.
4884 ///
4885 /// Negative argument is implicitly converted to unsigned, unless
4886 /// \p StrictlyUnsigned is true.
4887 template <typename AttrInfo>
4888 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4889 unsigned Idx = UINT_MAX,
4890 bool StrictlyUnsigned = false) {
4891 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4892 if (Expr->isTypeDependent() ||
4894 if (Idx != UINT_MAX)
4895 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4896 << &AI << Idx << AANT_ArgumentIntegerConstant
4897 << Expr->getSourceRange();
4898 else
4899 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4901 return false;
4902 }
4903
4904 if (!I->isIntN(32)) {
4905 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4906 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4907 return false;
4908 }
4909
4910 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4911 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4912 << &AI << /*non-negative*/ 1;
4913 return false;
4914 }
4915
4916 Val = (uint32_t)I->getZExtValue();
4917 return true;
4918 }
4919
4920 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4921 /// \#pragma weak during processing of other Decls.
4922 /// I couldn't figure out a clean way to generate these in-line, so
4923 /// we store them here and handle separately -- which is a hack.
4924 /// It would be best to refactor this.
4926
4927 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4929
4933
4934 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4935 /// us to associate a raw vector type with one of the ext_vector type names.
4936 /// This is only necessary for issuing pretty diagnostics.
4938
4939 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4940 /// and return false, otherwise set \p Str to the value of the string literal
4941 /// and return true.
4943 const Expr *E, StringRef &Str,
4944 SourceLocation *ArgLocation = nullptr);
4945
4946 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4947 /// If not emit an error and return false. If the argument is an identifier it
4948 /// will emit an error with a fixit hint and treat it as if it was a string
4949 /// literal.
4950 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4951 StringRef &Str,
4952 SourceLocation *ArgLocation = nullptr);
4953
4954 /// Determine if type T is a valid subject for a nonnull and similar
4955 /// attributes. Dependent types are considered valid so they can be checked
4956 /// during instantiation time. By default, we look through references (the
4957 /// behavior used by nonnull), but if the second parameter is true, then we
4958 /// treat a reference type as valid.
4959 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4960
4961 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4962 /// declaration.
4963 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4964 Expr *OE);
4965
4966 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4967 /// declaration.
4968 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
4969 Expr *ParamExpr);
4970
4971 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4972 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4973
4974 AvailabilityAttr *
4976 const IdentifierInfo *Platform, bool Implicit,
4977 VersionTuple Introduced, VersionTuple Deprecated,
4978 VersionTuple Obsoleted, bool IsUnavailable,
4979 StringRef Message, bool IsStrict, StringRef Replacement,
4980 AvailabilityMergeKind AMK, int Priority,
4981 const IdentifierInfo *IIEnvironment);
4982
4983 TypeVisibilityAttr *
4985 TypeVisibilityAttr::VisibilityType Vis);
4986 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
4987 VisibilityAttr::VisibilityType Vis);
4989 VisibilityAttr::VisibilityType Type);
4990 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
4991 StringRef Name);
4992
4993 /// Used to implement to perform semantic checking on
4994 /// attribute((section("foo"))) specifiers.
4995 ///
4996 /// In this case, "foo" is passed in to be checked. If the section
4997 /// specifier is invalid, return an Error that indicates the problem.
4998 ///
4999 /// This is a simple quality of implementation feature to catch errors
5000 /// and give good diagnostics in cases when the assembler or code generator
5001 /// would otherwise reject the section specifier.
5002 llvm::Error isValidSectionSpecifier(StringRef Str);
5003 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
5004 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
5005 StringRef Name);
5006
5007 // Check for things we'd like to warn about. Multiversioning issues are
5008 // handled later in the process, once we know how many exist.
5009 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
5010
5011 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
5012 StringRef NewUserDiagnostic);
5013 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
5014 const IdentifierInfo *Format, int FormatIdx,
5015 int FirstArg);
5016 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
5017 const AttributeCommonInfo &CI,
5018 const IdentifierInfo *Format,
5019 int FormatIdx,
5020 StringLiteral *FormatStr);
5021 ModularFormatAttr *mergeModularFormatAttr(Decl *D,
5022 const AttributeCommonInfo &CI,
5023 const IdentifierInfo *ModularImplFn,
5024 StringRef ImplName,
5026
5027 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
5028 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5029 bool IsPackExpansion);
5031 bool IsPackExpansion);
5032
5033 /// AddAlignValueAttr - Adds an align_value attribute to a particular
5034 /// declaration.
5035 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
5036
5037 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
5038 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
5041
5043 bool BestCase,
5044 MSInheritanceModel SemanticSpelling);
5045
5047
5048 /// AddModeAttr - Adds a mode attribute to a particular declaration.
5049 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
5050 const IdentifierInfo *Name, bool InInstantiation = false);
5051 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
5052 const AttributeCommonInfo &CI,
5053 const IdentifierInfo *Ident);
5054 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
5055 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
5056 const AttributeCommonInfo &CI);
5057 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
5058 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
5059 const InternalLinkageAttr &AL);
5060
5061 /// Check validaty of calling convention attribute \p attr. If \p FD
5062 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
5063 /// target. Otherwise, it is specified by \p CFT.
5065 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
5067
5068 /// Checks a regparm attribute, returning true if it is ill-formed and
5069 /// otherwise setting numParams to the appropriate value.
5070 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5071
5072 /// Create an CUDALaunchBoundsAttr attribute.
5073 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5074 Expr *MaxThreads,
5075 Expr *MinBlocks,
5076 Expr *MaxBlocks);
5077
5078 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5079 /// declaration.
5080 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5081 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5082
5083 /// Add a cluster_dims attribute to a particular declaration.
5084 CUDAClusterDimsAttr *createClusterDimsAttr(const AttributeCommonInfo &CI,
5085 Expr *X, Expr *Y, Expr *Z);
5086 void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X,
5087 Expr *Y, Expr *Z);
5088 /// Add a no_cluster attribute to a particular declaration.
5089 void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI);
5090
5091 enum class RetainOwnershipKind { NS, CF, OS };
5092
5093 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5094 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5095
5096 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5097
5098 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5099 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5100 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5101 const AttributeCommonInfo &CI,
5102 bool BestCase,
5103 MSInheritanceModel Model);
5104
5105 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5106 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5107 const EnforceTCBLeafAttr &AL);
5108
5109 /// Helper for delayed processing TransparentUnion or
5110 /// BPFPreserveAccessIndexAttr attribute.
5112 const ParsedAttributesView &AttrList);
5113
5114 // Options for ProcessDeclAttributeList().
5118
5121 Result.IncludeCXX11Attributes = Val;
5122 return Result;
5123 }
5124
5127 Result.IgnoreTypeAttributes = Val;
5128 return Result;
5129 }
5130
5131 // Should C++11 attributes be processed?
5133
5134 // Should any type attributes encountered be ignored?
5135 // If this option is false, a diagnostic will be emitted for any type
5136 // attributes of a kind that does not "slide" from the declaration to
5137 // the decl-specifier-seq.
5139 };
5140
5141 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5142 /// attribute list to the specified decl, ignoring any type attributes.
5144 const ParsedAttributesView &AttrList,
5145 const ProcessDeclAttributeOptions &Options =
5147
5148 /// Annotation attributes are the only attributes allowed after an access
5149 /// specifier.
5151 const ParsedAttributesView &AttrList);
5152
5153 /// checkUnusedDeclAttributes - Given a declarator which is not being
5154 /// used to build a declaration, complain about any decl attributes
5155 /// which might be lying around on it.
5157
5158 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5159
5160 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5161 /// \#pragma weak needs a non-definition decl and source may not have one.
5163 SourceLocation Loc);
5164
5165 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5166 /// applied to it, possibly with an alias.
5167 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5168
5169 void ProcessPragmaWeak(Scope *S, Decl *D);
5170 // Decl attributes - this routine is the top level dispatcher.
5171 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5172
5174
5175 /// Given a set of delayed diagnostics, re-emit them as if they had
5176 /// been delayed in the current context instead of in the given pool.
5177 /// Essentially, this just moves them to the current pool.
5179
5180 /// Check that the type is a plain record with one field being a pointer
5181 /// type and the other field being an integer. This matches the common
5182 /// implementation of std::span or sized_allocation_t in P0901R11.
5183 bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty);
5184
5185 /// Check if IdxExpr is a valid parameter index for a function or
5186 /// instance method D. May output an error.
5187 ///
5188 /// \returns true if IdxExpr is a valid index.
5189 template <typename AttrInfo>
5191 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5192 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5193 bool CanIndexVariadicArguments = false) {
5195
5196 // In C++ the implicit 'this' function parameter also counts.
5197 // Parameters are counted from one.
5198 bool HP = hasFunctionProto(D);
5199 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
5200 bool IV = HP && isFunctionOrMethodVariadic(D);
5201 unsigned NumParams =
5202 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5203
5204 std::optional<llvm::APSInt> IdxInt;
5205 if (IdxExpr->isTypeDependent() ||
5206 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5207 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5208 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5209 << IdxExpr->getSourceRange();
5210 return false;
5211 }
5212
5213 constexpr unsigned Limit = 1 << ParamIdx::IdxBitWidth;
5214 unsigned IdxSource = IdxInt->getLimitedValue(Limit);
5215 if (IdxSource < 1 || IdxSource == Limit ||
5216 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5217 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5218 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5219 return false;
5220 }
5221 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5222 if (IdxSource == 1) {
5223 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5224 << &AI << IdxExpr->getSourceRange();
5225 return false;
5226 }
5227 }
5228
5229 Idx = ParamIdx(IdxSource, D);
5230 return true;
5231 }
5232
5233 ///@}
5234
5235 //
5236 //
5237 // -------------------------------------------------------------------------
5238 //
5239 //
5240
5241 /// \name C++ Declarations
5242 /// Implementations are in SemaDeclCXX.cpp
5243 ///@{
5244
5245public:
5247
5248 /// Called before parsing a function declarator belonging to a function
5249 /// declaration.
5251 unsigned TemplateParameterDepth);
5252
5253 /// Called after parsing a function declarator belonging to a function
5254 /// declaration.
5256
5257 // Act on C++ namespaces
5259 SourceLocation NamespaceLoc,
5260 SourceLocation IdentLoc, IdentifierInfo *Ident,
5261 SourceLocation LBrace,
5262 const ParsedAttributesView &AttrList,
5263 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5264
5265 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5266 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5267 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5268
5270
5271 /// Retrieve the special "std" namespace, which may require us to
5272 /// implicitly define the namespace.
5274
5276 EnumDecl *getStdAlignValT() const;
5277
5280 QualType AllocType, SourceLocation);
5281
5283 const IdentifierInfo *MemberOrBase);
5284
5286 /// The '<=>' operator was used in an expression and a builtin operator
5287 /// was selected.
5289 /// A defaulted 'operator<=>' needed the comparison category. This
5290 /// typically only applies to 'std::strong_ordering', due to the implicit
5291 /// fallback return value.
5293 };
5294
5295 /// Lookup the specified comparison category types in the standard
5296 /// library, an check the VarDecls possibly returned by the operator<=>
5297 /// builtins for that type.
5298 ///
5299 /// \return The type of the comparison category type corresponding to the
5300 /// specified Kind, or a null type if an error occurs
5302 SourceLocation Loc,
5304
5305 /// Tests whether Ty is an instance of std::initializer_list and, if
5306 /// it is and Element is not NULL, assigns the element type to Element.
5307 bool isStdInitializerList(QualType Ty, QualType *Element);
5308
5309 /// Tests whether Ty is an instance of std::type_identity and, if
5310 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5311 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5312 /// incorrectly structured despite having the correct name, the faulty Decl
5313 /// will be assigned to MalformedDecl.
5314 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5315 const Decl **MalformedDecl = nullptr);
5316
5317 /// Looks for the std::initializer_list template and instantiates it
5318 /// with Element, or emits an error if it's not found.
5319 ///
5320 /// \returns The instantiated template, or null on error.
5322
5323 /// Looks for the std::type_identity template and instantiates it
5324 /// with Type, or returns a null type if type_identity has not been declared
5325 ///
5326 /// \returns The instantiated template, or null if std::type_identity is not
5327 /// declared
5329
5330 /// Determine whether Ctor is an initializer-list constructor, as
5331 /// defined in [dcl.init.list]p2.
5332 bool isInitListConstructor(const FunctionDecl *Ctor);
5333
5334 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5335 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5336 SourceLocation IdentLoc,
5337 IdentifierInfo *NamespcName,
5338 const ParsedAttributesView &AttrList);
5339
5341
5342 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5343 SourceLocation AliasLoc, IdentifierInfo *Alias,
5344 CXXScopeSpec &SS, SourceLocation IdentLoc,
5345 IdentifierInfo *Ident);
5346
5347 /// Remove decls we can't actually see from a lookup being used to declare
5348 /// shadow using decls.
5349 ///
5350 /// \param S - The scope of the potential shadow decl
5351 /// \param Previous - The lookup of a potential shadow decl's name.
5352 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5353
5354 /// Hides a using shadow declaration. This is required by the current
5355 /// using-decl implementation when a resolvable using declaration in a
5356 /// class is followed by a declaration which would hide or override
5357 /// one or more of the using decl's targets; for example:
5358 ///
5359 /// struct Base { void foo(int); };
5360 /// struct Derived : Base {
5361 /// using Base::foo;
5362 /// void foo(int);
5363 /// };
5364 ///
5365 /// The governing language is C++03 [namespace.udecl]p12:
5366 ///
5367 /// When a using-declaration brings names from a base class into a
5368 /// derived class scope, member functions in the derived class
5369 /// override and/or hide member functions with the same name and
5370 /// parameter types in a base class (rather than conflicting).
5371 ///
5372 /// There are two ways to implement this:
5373 /// (1) optimistically create shadow decls when they're not hidden
5374 /// by existing declarations, or
5375 /// (2) don't create any shadow decls (or at least don't make them
5376 /// visible) until we've fully parsed/instantiated the class.
5377 /// The problem with (1) is that we might have to retroactively remove
5378 /// a shadow decl, which requires several O(n) operations because the
5379 /// decl structures are (very reasonably) not designed for removal.
5380 /// (2) avoids this but is very fiddly and phase-dependent.
5381 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5382
5383 /// Determines whether to create a using shadow decl for a particular
5384 /// decl, given the set of decls existing prior to this using lookup.
5386 const LookupResult &PreviousDecls,
5387 UsingShadowDecl *&PrevShadow);
5388
5389 /// Builds a shadow declaration corresponding to a 'using' declaration.
5392 UsingShadowDecl *PrevDecl);
5393
5394 /// Checks that the given using declaration is not an invalid
5395 /// redeclaration. Note that this is checking only for the using decl
5396 /// itself, not for any ill-formedness among the UsingShadowDecls.
5398 bool HasTypenameKeyword,
5399 const CXXScopeSpec &SS,
5400 SourceLocation NameLoc,
5401 const LookupResult &Previous);
5402
5403 /// Checks that the given nested-name qualifier used in a using decl
5404 /// in the current context is appropriately related to the current
5405 /// scope. If an error is found, diagnoses it and returns true.
5406 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5407 /// the result of that lookup. UD is likewise nullptr, except when we have an
5408 /// already-populated UsingDecl whose shadow decls contain the same
5409 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5410 /// scope).
5411 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5412 const CXXScopeSpec &SS,
5413 const DeclarationNameInfo &NameInfo,
5414 SourceLocation NameLoc,
5415 const LookupResult *R = nullptr,
5416 const UsingDecl *UD = nullptr);
5417
5418 /// Builds a using declaration.
5419 ///
5420 /// \param IsInstantiation - Whether this call arises from an
5421 /// instantiation of an unresolved using declaration. We treat
5422 /// the lookup differently for these declarations.
5424 SourceLocation UsingLoc,
5425 bool HasTypenameKeyword,
5426 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5427 DeclarationNameInfo NameInfo,
5428 SourceLocation EllipsisLoc,
5429 const ParsedAttributesView &AttrList,
5430 bool IsInstantiation, bool IsUsingIfExists);
5432 SourceLocation UsingLoc,
5433 SourceLocation EnumLoc,
5434 SourceLocation NameLoc,
5435 TypeSourceInfo *EnumType, EnumDecl *ED);
5436 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5437 ArrayRef<NamedDecl *> Expansions);
5438
5439 /// Additional checks for a using declaration referring to a constructor name.
5441
5442 /// Given a derived-class using shadow declaration for a constructor and the
5443 /// correspnding base class constructor, find or create the implicit
5444 /// synthesized derived class constructor to use for this initialization.
5447 ConstructorUsingShadowDecl *DerivedShadow);
5448
5450 SourceLocation UsingLoc,
5451 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5452 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5453 const ParsedAttributesView &AttrList);
5455 SourceLocation UsingLoc,
5456 SourceLocation EnumLoc, SourceRange TyLoc,
5457 const IdentifierInfo &II, ParsedType Ty,
5458 const CXXScopeSpec &SS);
5460 MultiTemplateParamsArg TemplateParams,
5461 SourceLocation UsingLoc, UnqualifiedId &Name,
5462 const ParsedAttributesView &AttrList,
5463 TypeResult Type, Decl *DeclFromDeclSpec);
5464
5465 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5466 /// including handling of its default argument expressions.
5467 ///
5468 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5470 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5472 bool HadMultipleCandidates, bool IsListInitialization,
5473 bool IsStdInitListInitialization, bool RequiresZeroInit,
5474 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5475
5476 /// Build a CXXConstructExpr whose constructor has already been resolved if
5477 /// it denotes an inherited constructor.
5479 SourceLocation ConstructLoc, QualType DeclInitType,
5480 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5481 bool HadMultipleCandidates, bool IsListInitialization,
5482 bool IsStdInitListInitialization, bool RequiresZeroInit,
5483 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5484
5485 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5486 // the constructor can be elidable?
5488 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5489 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5490 bool HadMultipleCandidates, bool IsListInitialization,
5491 bool IsStdInitListInitialization, bool RequiresZeroInit,
5492 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5493
5495 SourceLocation InitLoc);
5496
5497 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5498 /// constructed variable.
5499 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5500
5501 /// Helper class that collects exception specifications for
5502 /// implicitly-declared special member functions.
5504 // Pointer to allow copying
5505 Sema *Self;
5506 // We order exception specifications thus:
5507 // noexcept is the most restrictive, but is only used in C++11.
5508 // throw() comes next.
5509 // Then a throw(collected exceptions)
5510 // Finally no specification, which is expressed as noexcept(false).
5511 // throw(...) is used instead if any called function uses it.
5512 ExceptionSpecificationType ComputedEST;
5513 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5514 SmallVector<QualType, 4> Exceptions;
5515
5516 void ClearExceptions() {
5517 ExceptionsSeen.clear();
5518 Exceptions.clear();
5519 }
5520
5521 public:
5523 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5524 if (!Self.getLangOpts().CPlusPlus11)
5525 ComputedEST = EST_DynamicNone;
5526 }
5527
5528 /// Get the computed exception specification type.
5530 assert(!isComputedNoexcept(ComputedEST) &&
5531 "noexcept(expr) should not be a possible result");
5532 return ComputedEST;
5533 }
5534
5535 /// The number of exceptions in the exception specification.
5536 unsigned size() const { return Exceptions.size(); }
5537
5538 /// The set of exceptions in the exception specification.
5539 const QualType *data() const { return Exceptions.data(); }
5540
5541 /// Integrate another called method into the collected data.
5542 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5543
5544 /// Integrate an invoked expression into the collected data.
5545 void CalledExpr(Expr *E) { CalledStmt(E); }
5546
5547 /// Integrate an invoked statement into the collected data.
5548 void CalledStmt(Stmt *S);
5549
5550 /// Overwrite an EPI's exception specification with this
5551 /// computed exception specification.
5554 ESI.Type = getExceptionSpecType();
5555 if (ESI.Type == EST_Dynamic) {
5556 ESI.Exceptions = Exceptions;
5557 } else if (ESI.Type == EST_None) {
5558 /// C++11 [except.spec]p14:
5559 /// The exception-specification is noexcept(false) if the set of
5560 /// potential exceptions of the special member function contains "any"
5561 ESI.Type = EST_NoexceptFalse;
5562 ESI.NoexceptExpr =
5563 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5564 }
5565 return ESI;
5566 }
5567 };
5568
5569 /// Evaluate the implicit exception specification for a defaulted
5570 /// special member function.
5572
5573 /// Check the given exception-specification and update the
5574 /// exception specification information with the results.
5575 void checkExceptionSpecification(bool IsTopLevel,
5577 ArrayRef<ParsedType> DynamicExceptions,
5578 ArrayRef<SourceRange> DynamicExceptionRanges,
5579 Expr *NoexceptExpr,
5580 SmallVectorImpl<QualType> &Exceptions,
5582
5583 /// Add an exception-specification to the given member or friend function
5584 /// (or function template). The exception-specification was parsed
5585 /// after the function itself was declared.
5587 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5588 ArrayRef<ParsedType> DynamicExceptions,
5589 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5590
5591 class InheritedConstructorInfo;
5592
5593 /// Determine if a special member function should have a deleted
5594 /// definition when it is defaulted.
5596 InheritedConstructorInfo *ICI = nullptr,
5597 bool Diagnose = false);
5598
5599 /// Produce notes explaining why a defaulted function was defined as deleted.
5601
5602 /// Declare the implicit default constructor for the given class.
5603 ///
5604 /// \param ClassDecl The class declaration into which the implicit
5605 /// default constructor will be added.
5606 ///
5607 /// \returns The implicitly-declared default constructor.
5610
5611 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5612 /// defining this constructor as the default constructor.
5615
5616 /// Declare the implicit destructor for the given class.
5617 ///
5618 /// \param ClassDecl The class declaration into which the implicit
5619 /// destructor will be added.
5620 ///
5621 /// \returns The implicitly-declared destructor.
5623
5624 /// DefineImplicitDestructor - Checks for feasibility of
5625 /// defining this destructor as the default destructor.
5626 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5628
5629 /// Build an exception spec for destructors that don't have one.
5630 ///
5631 /// C++11 says that user-defined destructors with no exception spec get one
5632 /// that looks as if the destructor was implicitly declared.
5634
5635 /// Define the specified inheriting constructor.
5638
5639 /// Declare the implicit copy constructor for the given class.
5640 ///
5641 /// \param ClassDecl The class declaration into which the implicit
5642 /// copy constructor will be added.
5643 ///
5644 /// \returns The implicitly-declared copy constructor.
5646
5647 /// DefineImplicitCopyConstructor - Checks for feasibility of
5648 /// defining this constructor as the copy constructor.
5649 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5651
5652 /// Declare the implicit move constructor for the given class.
5653 ///
5654 /// \param ClassDecl The Class declaration into which the implicit
5655 /// move constructor will be added.
5656 ///
5657 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5658 /// declared.
5660
5661 /// DefineImplicitMoveConstructor - Checks for feasibility of
5662 /// defining this constructor as the move constructor.
5663 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5665
5666 /// Declare the implicit copy assignment operator for the given class.
5667 ///
5668 /// \param ClassDecl The class declaration into which the implicit
5669 /// copy assignment operator will be added.
5670 ///
5671 /// \returns The implicitly-declared copy assignment operator.
5673
5674 /// Defines an implicitly-declared copy assignment operator.
5675 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5676 CXXMethodDecl *MethodDecl);
5677
5678 /// Declare the implicit move assignment operator for the given class.
5679 ///
5680 /// \param ClassDecl The Class declaration into which the implicit
5681 /// move assignment operator will be added.
5682 ///
5683 /// \returns The implicitly-declared move assignment operator, or NULL if it
5684 /// wasn't declared.
5686
5687 /// Defines an implicitly-declared move assignment operator.
5688 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5689 CXXMethodDecl *MethodDecl);
5690
5691 /// Check a completed declaration of an implicit special member.
5693
5694 /// Determine whether the given function is an implicitly-deleted
5695 /// special member function.
5697
5698 /// Check whether 'this' shows up in the type of a static member
5699 /// function after the (naturally empty) cv-qualifier-seq would be.
5700 ///
5701 /// \returns true if an error occurred.
5703
5704 /// Whether this' shows up in the exception specification of a static
5705 /// member function.
5707
5708 /// Check whether 'this' shows up in the attributes of the given
5709 /// static member function.
5710 ///
5711 /// \returns true if an error occurred.
5713
5715 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5716
5718
5719 /// Given a constructor and the set of arguments provided for the
5720 /// constructor, convert the arguments and add any required default arguments
5721 /// to form a proper call to this constructor.
5722 ///
5723 /// \returns true if an error occurred, false otherwise.
5725 QualType DeclInitType, MultiExprArg ArgsPtr,
5726 SourceLocation Loc,
5727 SmallVectorImpl<Expr *> &ConvertedArgs,
5728 bool AllowExplicit = false,
5729 bool IsListInitialization = false);
5730
5731 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5732 /// initializer for the declaration 'Dcl'.
5733 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5734 /// static data member of class X, names should be looked up in the scope of
5735 /// class X.
5737
5738 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5739 /// initializer for the declaration 'Dcl'.
5740 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5741
5742 /// Define the "body" of the conversion from a lambda object to a
5743 /// function pointer.
5744 ///
5745 /// This routine doesn't actually define a sensible body; rather, it fills
5746 /// in the initialization expression needed to copy the lambda object into
5747 /// the block, and IR generation actually generates the real body of the
5748 /// block pointer conversion.
5749 void
5751 CXXConversionDecl *Conv);
5752
5753 /// Define the "body" of the conversion from a lambda object to a
5754 /// block pointer.
5755 ///
5756 /// This routine doesn't actually define a sensible body; rather, it fills
5757 /// in the initialization expression needed to copy the lambda object into
5758 /// the block, and IR generation actually generates the real body of the
5759 /// block pointer conversion.
5761 CXXConversionDecl *Conv);
5762
5763 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5764 /// linkage specification, including the language and (if present)
5765 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5766 /// language string literal. LBraceLoc, if valid, provides the location of
5767 /// the '{' brace. Otherwise, this linkage specification does not
5768 /// have any braces.
5770 Expr *LangStr, SourceLocation LBraceLoc);
5771
5772 /// ActOnFinishLinkageSpecification - Complete the definition of
5773 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5774 /// valid, it's the position of the closing '}' brace in a linkage
5775 /// specification that uses braces.
5777 SourceLocation RBraceLoc);
5778
5779 //===--------------------------------------------------------------------===//
5780 // C++ Classes
5781 //
5782
5783 /// Get the class that is directly named by the current context. This is the
5784 /// class for which an unqualified-id in this scope could name a constructor
5785 /// or destructor.
5786 ///
5787 /// If the scope specifier denotes a class, this will be that class.
5788 /// If the scope specifier is empty, this will be the class whose
5789 /// member-specification we are currently within. Otherwise, there
5790 /// is no such class.
5792
5793 /// isCurrentClassName - Determine whether the identifier II is the
5794 /// name of the class type currently being defined. In the case of
5795 /// nested classes, this will only return true if II is the name of
5796 /// the innermost class.
5797 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5798 const CXXScopeSpec *SS = nullptr);
5799
5800 /// Determine whether the identifier II is a typo for the name of
5801 /// the class type currently being defined. If so, update it to the identifier
5802 /// that should have been used.
5804
5805 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5807 SourceLocation ColonLoc,
5808 const ParsedAttributesView &Attrs);
5809
5810 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5811 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5812 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5813 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5814 /// present (but parsing it has been deferred).
5815 NamedDecl *
5817 MultiTemplateParamsArg TemplateParameterLists,
5818 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5819 InClassInitStyle InitStyle);
5820
5821 /// Enter a new C++ default initializer scope. After calling this, the
5822 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5823 /// parsing or instantiating the initializer failed.
5825
5826 /// This is invoked after parsing an in-class initializer for a
5827 /// non-static C++ class member, and after instantiating an in-class
5828 /// initializer in a class template. Such actions are deferred until the class
5829 /// is complete.
5831 SourceLocation EqualLoc,
5833
5834 /// Handle a C++ member initializer using parentheses syntax.
5836 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5837 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5838 const DeclSpec &DS, SourceLocation IdLoc,
5839 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5840 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5841
5842 /// Handle a C++ member initializer using braced-init-list syntax.
5843 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5844 CXXScopeSpec &SS,
5845 IdentifierInfo *MemberOrBase,
5846 ParsedType TemplateTypeTy,
5847 const DeclSpec &DS, SourceLocation IdLoc,
5848 Expr *InitList, SourceLocation EllipsisLoc);
5849
5850 /// Handle a C++ member initializer.
5851 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5852 CXXScopeSpec &SS,
5853 IdentifierInfo *MemberOrBase,
5854 ParsedType TemplateTypeTy,
5855 const DeclSpec &DS, SourceLocation IdLoc,
5856 Expr *Init, SourceLocation EllipsisLoc);
5857
5859 SourceLocation IdLoc);
5860
5862 TypeSourceInfo *BaseTInfo, Expr *Init,
5863 CXXRecordDecl *ClassDecl,
5864 SourceLocation EllipsisLoc);
5865
5867 CXXRecordDecl *ClassDecl);
5868
5871
5873 ArrayRef<CXXCtorInitializer *> Initializers = {});
5874
5875 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5876 /// mark all the non-trivial destructors of its members and bases as
5877 /// referenced.
5878 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5879 CXXRecordDecl *Record);
5880
5881 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5882 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5883 /// class. In the Microsoft C++ ABI, this is done any time a class's
5884 /// destructor is referenced.
5886 SourceLocation Location, CXXRecordDecl *ClassDecl,
5887 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5888 nullptr);
5889
5890 /// Do semantic checks to allow the complete destructor variant to be emitted
5891 /// when the destructor is defined in another translation unit. In the Itanium
5892 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5893 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5894 /// of the checks performed when emitting a regular destructor.
5895 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5896 CXXDestructorDecl *Dtor);
5897
5898 /// The list of classes whose vtables have been used within
5899 /// this translation unit, and the source locations at which the
5900 /// first use occurred.
5901 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5902
5903 /// The list of vtables that are required but have not yet been
5904 /// materialized.
5906
5907 /// The set of classes whose vtables have been used within
5908 /// this translation unit, and a bit that will be true if the vtable is
5909 /// required to be emitted (otherwise, it should be emitted only if needed
5910 /// by code generation).
5911 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5912
5913 /// Load any externally-stored vtable uses.
5915
5916 /// Note that the vtable for the given class was used at the
5917 /// given location.
5919 bool DefinitionRequired = false);
5920
5921 /// Mark the exception specifications of all virtual member functions
5922 /// in the given class as needed.
5924 const CXXRecordDecl *RD);
5925
5926 /// MarkVirtualMembersReferenced - Will mark all members of the given
5927 /// CXXRecordDecl referenced.
5929 bool ConstexprOnly = false);
5930
5931 /// Define all of the vtables that have been used in this
5932 /// translation unit and reference any virtual members used by those
5933 /// vtables.
5934 ///
5935 /// \returns true if any work was done, false otherwise.
5936 bool DefineUsedVTables();
5937
5938 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5939 /// special functions, such as the default constructor, copy
5940 /// constructor, or destructor, to the given C++ class (C++
5941 /// [special]p1). This routine can only be executed just before the
5942 /// definition of the class is complete.
5944
5945 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5946 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5948 bool AnyErrors);
5949
5950 /// Check class-level dllimport/dllexport attribute. The caller must
5951 /// ensure that referenceDLLExportedClassMethods is called some point later
5952 /// when all outer classes of Class are complete.
5955
5957
5958 /// Perform propagation of DLL attributes from a derived class to a
5959 /// templated base class for MS compatibility.
5961 CXXRecordDecl *Class, Attr *ClassAttr,
5962 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5963 SourceLocation BaseLoc);
5964
5965 /// Perform semantic checks on a class definition that has been
5966 /// completing, introducing implicitly-declared members, checking for
5967 /// abstract types, etc.
5968 ///
5969 /// \param S The scope in which the class was parsed. Null if we didn't just
5970 /// parse a class definition.
5971 /// \param Record The completed class.
5973
5974 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
5975 /// conditions that are needed for the attribute to have an effect.
5977
5978 /// Check that VTable Pointer authentication is only being set on the first
5979 /// first instantiation of the vtable
5981
5983 Decl *TagDecl, SourceLocation LBrac,
5984 SourceLocation RBrac,
5985 const ParsedAttributesView &AttrList);
5986
5987 /// Perform any semantic analysis which needs to be delayed until all
5988 /// pending class member declarations have been parsed.
5991
5992 /// This is used to implement the constant expression evaluation part of the
5993 /// attribute enable_if extension. There is nothing in standard C++ which
5994 /// would require reentering parameters.
5997 llvm::function_ref<Scope *()> EnterScope);
5999
6000 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
6001 /// parsing a top-level (non-nested) C++ class, and we are now
6002 /// parsing those parts of the given Method declaration that could
6003 /// not be parsed earlier (C++ [class.mem]p2), such as default
6004 /// arguments. This action should enter the scope of the given
6005 /// Method declaration as if we had just parsed the qualified method
6006 /// name. However, it should not bring the parameters into scope;
6007 /// that will be performed by ActOnDelayedCXXMethodParameter.
6009 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
6011
6012 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
6013 /// processing the delayed method declaration for Method. The method
6014 /// declaration is now considered finished. There may be a separate
6015 /// ActOnStartOfFunctionDef action later (not necessarily
6016 /// immediately!) for this method, if it was also defined inside the
6017 /// class body.
6020
6022
6023 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
6024 StringEvaluationContext EvalContext,
6025 bool ErrorOnInvalidMessage);
6026 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
6027 StringEvaluationContext EvalContext,
6028 bool ErrorOnInvalidMessage);
6029
6031 Expr *AssertExpr, Expr *AssertMessageExpr,
6032 SourceLocation RParenLoc);
6034 Expr *AssertExpr, Expr *AssertMessageExpr,
6035 SourceLocation RParenLoc, bool Failed);
6036
6037 /// Try to print more useful information about a failed static_assert
6038 /// with expression \E
6039 void DiagnoseStaticAssertDetails(const Expr *E);
6040
6041 /// If E represents a built-in type trait, or a known standard type trait,
6042 /// try to print more information about why the type type-trait failed.
6043 /// This assumes we already evaluated the expression to a false boolean value.
6044 void DiagnoseTypeTraitDetails(const Expr *E);
6045
6046 /// Handle a friend type declaration. This works in tandem with
6047 /// ActOnTag.
6048 ///
6049 /// Notes on friend class templates:
6050 ///
6051 /// We generally treat friend class declarations as if they were
6052 /// declaring a class. So, for example, the elaborated type specifier
6053 /// in a friend declaration is required to obey the restrictions of a
6054 /// class-head (i.e. no typedefs in the scope chain), template
6055 /// parameters are required to match up with simple template-ids, &c.
6056 /// However, unlike when declaring a template specialization, it's
6057 /// okay to refer to a template specialization without an empty
6058 /// template parameter declaration, e.g.
6059 /// friend class A<T>::B<unsigned>;
6060 /// We permit this as a special case; if there are any template
6061 /// parameters present at all, require proper matching, i.e.
6062 /// template <> template <class T> friend class A<int>::B;
6063 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
6064 MultiTemplateParamsArg TemplateParams,
6065 SourceLocation EllipsisLoc);
6067 MultiTemplateParamsArg TemplateParams);
6068
6069 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
6070 /// the well-formedness of the constructor declarator @p D with type @p
6071 /// R. If there are any errors in the declarator, this routine will
6072 /// emit diagnostics and set the invalid bit to true. In any case, the type
6073 /// will be updated to reflect a well-formed type for the constructor and
6074 /// returned.
6076 StorageClass &SC);
6077
6078 /// CheckConstructor - Checks a fully-formed constructor for
6079 /// well-formedness, issuing any diagnostics required. Returns true if
6080 /// the constructor declarator is invalid.
6082
6083 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6084 /// the well-formednes of the destructor declarator @p D with type @p
6085 /// R. If there are any errors in the declarator, this routine will
6086 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6087 /// will be updated to reflect a well-formed type for the destructor and
6088 /// returned.
6090 StorageClass &SC);
6091
6092 /// CheckDestructor - Checks a fully-formed destructor definition for
6093 /// well-formedness, issuing any diagnostics required. Returns true
6094 /// on error.
6096
6097 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6098 /// well-formednes of the conversion function declarator @p D with
6099 /// type @p R. If there are any errors in the declarator, this routine
6100 /// will emit diagnostics and return true. Otherwise, it will return
6101 /// false. Either way, the type @p R will be updated to reflect a
6102 /// well-formed type for the conversion operator.
6104
6105 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6106 /// the declaration of the given C++ conversion function. This routine
6107 /// is responsible for recording the conversion function in the C++
6108 /// class, if possible.
6110
6111 /// Check the validity of a declarator that we parsed for a deduction-guide.
6112 /// These aren't actually declarators in the grammar, so we need to check that
6113 /// the user didn't specify any pieces that are not part of the
6114 /// deduction-guide grammar. Return true on invalid deduction-guide.
6116 StorageClass &SC);
6117
6119
6122 SourceLocation DefaultLoc);
6124
6125 /// Kinds of defaulted comparison operator functions.
6126 enum class DefaultedComparisonKind : unsigned char {
6127 /// This is not a defaultable comparison operator.
6129 /// This is an operator== that should be implemented as a series of
6130 /// subobject comparisons.
6132 /// This is an operator<=> that should be implemented as a series of
6133 /// subobject comparisons.
6135 /// This is an operator!= that should be implemented as a rewrite in terms
6136 /// of a == comparison.
6138 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
6139 /// terms of a <=> comparison.
6141 };
6142
6146 FunctionDecl *Spaceship);
6149
6151 QualType R, bool IsLambda,
6152 DeclContext *DC = nullptr);
6154 DeclarationName Name, QualType R);
6156
6157 //===--------------------------------------------------------------------===//
6158 // C++ Derived Classes
6159 //
6160
6161 /// Check the validity of a C++ base class specifier.
6162 ///
6163 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6164 /// and returns NULL otherwise.
6166 SourceRange SpecifierRange, bool Virtual,
6167 AccessSpecifier Access,
6168 TypeSourceInfo *TInfo,
6169 SourceLocation EllipsisLoc);
6170
6171 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6172 /// one entry in the base class list of a class specifier, for
6173 /// example:
6174 /// class foo : public bar, virtual private baz {
6175 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6176 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6177 const ParsedAttributesView &Attrs, bool Virtual,
6178 AccessSpecifier Access, ParsedType basetype,
6179 SourceLocation BaseLoc,
6180 SourceLocation EllipsisLoc);
6181
6182 /// Performs the actual work of attaching the given base class
6183 /// specifiers to a C++ class.
6186
6187 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6188 /// class, after checking whether there are any duplicate base
6189 /// classes.
6190 void ActOnBaseSpecifiers(Decl *ClassDecl,
6192
6193 /// Determine whether the type \p Derived is a C++ class that is
6194 /// derived from the type \p Base.
6195 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6197 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6201 CXXBasePaths &Paths);
6202
6203 // FIXME: I don't like this name.
6204 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6205
6207 SourceLocation Loc, SourceRange Range,
6208 CXXCastPath *BasePath = nullptr,
6209 bool IgnoreAccess = false);
6210
6211 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6212 /// conversion (where Derived and Base are class types) is
6213 /// well-formed, meaning that the conversion is unambiguous (and
6214 /// that all of the base classes are accessible). Returns true
6215 /// and emits a diagnostic if the code is ill-formed, returns false
6216 /// otherwise. Loc is the location where this routine should point to
6217 /// if there is an error, and Range is the source range to highlight
6218 /// if there is an error.
6219 ///
6220 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6221 /// diagnostic for the respective type of error will be suppressed, but the
6222 /// check for ill-formed code will still be performed.
6224 unsigned InaccessibleBaseID,
6225 unsigned AmbiguousBaseConvID,
6226 SourceLocation Loc, SourceRange Range,
6227 DeclarationName Name, CXXCastPath *BasePath,
6228 bool IgnoreAccess = false);
6229
6230 /// Builds a string representing ambiguous paths from a
6231 /// specific derived class to different subobjects of the same base
6232 /// class.
6233 ///
6234 /// This function builds a string that can be used in error messages
6235 /// to show the different paths that one can take through the
6236 /// inheritance hierarchy to go from the derived class to different
6237 /// subobjects of a base class. The result looks something like this:
6238 /// @code
6239 /// struct D -> struct B -> struct A
6240 /// struct D -> struct C -> struct A
6241 /// @endcode
6242 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6243
6245 const CXXMethodDecl *Old);
6246
6247 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6248 /// covariant, according to C++ [class.virtual]p5.
6250 const CXXMethodDecl *Old);
6251
6252 // Check that the overriding method has no explicit object parameter.
6254 const CXXMethodDecl *Old);
6255
6256 /// Mark the given method pure.
6257 ///
6258 /// \param Method the method to be marked pure.
6259 ///
6260 /// \param InitRange the source range that covers the "0" initializer.
6262
6263 /// CheckOverrideControl - Check C++11 override control semantics.
6265
6266 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6267 /// not used in the declaration of an overriding method.
6269
6270 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6271 /// function overrides a virtual member function marked 'final', according to
6272 /// C++11 [class.virtual]p4.
6274 const CXXMethodDecl *Old);
6275
6286
6287 struct TypeDiagnoser;
6288
6291 TypeDiagnoser &Diagnoser);
6292 template <typename... Ts>
6293 bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID,
6294 const Ts &...Args) {
6295 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6296 return RequireNonAbstractType(Loc, T, Diagnoser);
6297 }
6298
6299 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6300
6301 //===--------------------------------------------------------------------===//
6302 // C++ Overloaded Operators [C++ 13.5]
6303 //
6304
6305 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6306 /// of this overloaded operator is well-formed. If so, returns false;
6307 /// otherwise, emits appropriate diagnostics and returns true.
6309
6310 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6311 /// of this literal operator function is well-formed. If so, returns
6312 /// false; otherwise, emits appropriate diagnostics and returns true.
6314
6315 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6316 /// found in an explicit(bool) specifier.
6318
6319 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6320 /// Returns true if the explicit specifier is now resolved.
6322
6323 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6324 /// C++ if/switch/while/for statement.
6325 /// e.g: "if (int x = f()) {...}"
6327
6328 // Emitting members of dllexported classes is delayed until the class
6329 // (including field initializers) is fully parsed.
6332
6333 /// Merge the exception specifications of two variable declarations.
6334 ///
6335 /// This is called when there's a redeclaration of a VarDecl. The function
6336 /// checks if the redeclaration might have an exception specification and
6337 /// validates compatibility and merges the specs if necessary.
6339
6340 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6341 /// function, once we already know that they have the same
6342 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6343 /// error, false otherwise.
6345
6346 /// Helpers for dealing with blocks and functions.
6348
6349 /// CheckExtraCXXDefaultArguments - Check for any extra default
6350 /// arguments in the declarator, which is not a function declaration
6351 /// or definition and therefore is not permitted to have default
6352 /// arguments. This routine should be invoked for every declarator
6353 /// that is not a function declaration or definition.
6355
6359
6360 /// Perform semantic analysis for the variable declaration that
6361 /// occurs within a C++ catch clause, returning the newly-created
6362 /// variable.
6364 SourceLocation StartLoc,
6365 SourceLocation IdLoc,
6366 const IdentifierInfo *Id);
6367
6368 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6369 /// handler.
6371
6373
6374 /// Handle a friend tag declaration where the scope specifier was
6375 /// templated.
6377 unsigned TagSpec, SourceLocation TagLoc,
6378 CXXScopeSpec &SS, IdentifierInfo *Name,
6379 SourceLocation NameLoc,
6380 SourceLocation EllipsisLoc,
6382 MultiTemplateParamsArg TempParamLists);
6383
6385 SourceLocation DeclStart, Declarator &D,
6386 Expr *BitfieldWidth,
6387 InClassInitStyle InitStyle,
6388 AccessSpecifier AS,
6389 const ParsedAttr &MSPropertyAttr);
6390
6391 /// Diagnose why the specified class does not have a trivial special member of
6392 /// the given kind.
6395
6396 /// Determine whether a defaulted or deleted special member function is
6397 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6398 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6402 bool Diagnose = false);
6403
6404 /// For a defaulted function, the kind of defaulted function that it is.
6406 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
6407 unsigned SpecialMember : 8;
6408 unsigned Comparison : 8;
6409
6410 public:
6412 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6413 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6415 : SpecialMember(llvm::to_underlying(CSM)),
6416 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6418 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6419 Comparison(llvm::to_underlying(Comp)) {}
6420
6421 bool isSpecialMember() const {
6422 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
6424 }
6425 bool isComparison() const {
6426 return static_cast<DefaultedComparisonKind>(Comparison) !=
6428 }
6429
6430 explicit operator bool() const {
6431 return isSpecialMember() || isComparison();
6432 }
6433
6435 return static_cast<CXXSpecialMemberKind>(SpecialMember);
6436 }
6438 return static_cast<DefaultedComparisonKind>(Comparison);
6439 }
6440
6441 /// Get the index of this function kind for use in diagnostics.
6442 unsigned getDiagnosticIndex() const {
6443 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
6444 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
6445 "invalid should have highest index");
6446 static_assert((unsigned)DefaultedComparisonKind::None == 0,
6447 "none should be equal to zero");
6448 return SpecialMember + Comparison;
6449 }
6450 };
6451
6452 /// Determine the kind of defaulting that would be done for a given function.
6453 ///
6454 /// If the function is both a default constructor and a copy / move
6455 /// constructor (due to having a default argument for the first parameter),
6456 /// this picks CXXSpecialMemberKind::DefaultConstructor.
6457 ///
6458 /// FIXME: Check that case is properly handled by all callers.
6459 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
6460
6461 /// Handle a C++11 empty-declaration and attribute-declaration.
6463 SourceLocation SemiLoc);
6464
6466 /// Diagnose issues that are non-constant or that are extensions.
6468 /// Identify whether this function satisfies the formal rules for constexpr
6469 /// functions in the current lanugage mode (with no extensions).
6471 };
6472
6473 // Check whether a function declaration satisfies the requirements of a
6474 // constexpr function definition or a constexpr constructor definition. If so,
6475 // return true. If not, produce appropriate diagnostics (unless asked not to
6476 // by Kind) and return false.
6477 //
6478 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6480 CheckConstexprKind Kind);
6481
6482 /// Diagnose methods which overload virtual methods in a base class
6483 /// without overriding any.
6485
6486 /// Check if a method overloads virtual methods in a base class without
6487 /// overriding any.
6488 void
6490 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6491 void
6493 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6494
6495 /// ActOnParamDefaultArgument - Check whether the default argument
6496 /// provided for a function parameter is well-formed. If so, attach it
6497 /// to the parameter declaration.
6498 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6499 Expr *defarg);
6500
6501 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6502 /// argument for a function parameter, but we can't parse it yet
6503 /// because we're inside a class definition. Note that this default
6504 /// argument will be parsed later.
6506 SourceLocation ArgLoc);
6507
6508 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6509 /// the default argument for the parameter param failed.
6511 Expr *DefaultArg);
6513 SourceLocation EqualLoc);
6514 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6515 SourceLocation EqualLoc);
6516
6517 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6518 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6519 StringLiteral *Message = nullptr);
6520 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6521
6522 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6523 StringLiteral *DeletedMessage = nullptr);
6527
6528 NamedDecl *
6530 MultiTemplateParamsArg TemplateParamLists);
6533 RecordDecl *ClassDecl,
6534 const IdentifierInfo *Name);
6535
6537 SourceLocation Loc);
6539
6540 /// Stack containing information needed when in C++2a an 'auto' is encountered
6541 /// in a function declaration parameter type specifier in order to invent a
6542 /// corresponding template parameter in the enclosing abbreviated function
6543 /// template. This information is also present in LambdaScopeInfo, stored in
6544 /// the FunctionScopes stack.
6546
6547 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6548 std::unique_ptr<CXXFieldCollector> FieldCollector;
6549
6551 /// Set containing all declared private fields that are not used.
6553
6555
6556 /// PureVirtualClassDiagSet - a set of class declarations which we have
6557 /// emitted a list of pure virtual functions. Used to prevent emitting the
6558 /// same list more than once.
6559 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6560
6564
6565 /// All the delegating constructors seen so far in the file, used for
6566 /// cycle detection at the end of the TU.
6568
6569 /// The C++ "std" namespace, where the standard library resides.
6571
6572 /// The C++ "std::initializer_list" template, which is defined in
6573 /// <initializer_list>.
6575
6576 /// The C++ "std::type_identity" template, which is defined in
6577 /// <type_traits>.
6579
6580 // Contains the locations of the beginning of unparsed default
6581 // argument locations.
6582 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6583
6584 /// UndefinedInternals - all the used, undefined objects which require a
6585 /// definition in this translation unit.
6586 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6587
6588 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6590
6591 /// The C++ special members which we are currently in the process of
6592 /// declaring. If this process recursively triggers the declaration of the
6593 /// same special member, we should act as if it is not yet declared.
6595
6597
6598 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6599
6602 ParsingClassDepth++;
6604 }
6606 ParsingClassDepth--;
6608 }
6609
6611 CXXScopeSpec &SS,
6612 ParsedType TemplateTypeTy,
6613 IdentifierInfo *MemberOrBase);
6614
6615private:
6616 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6617 QualType ResultTy,
6618 ArrayRef<QualType> Args);
6619 // Helper for ActOnFields to check for all function pointer members.
6620 bool EntirelyFunctionPointers(const RecordDecl *Record);
6621
6622 // A cache representing if we've fully checked the various comparison category
6623 // types stored in ASTContext. The bit-index corresponds to the integer value
6624 // of a ComparisonCategoryType enumerator.
6625 llvm::SmallBitVector FullyCheckedComparisonCategories;
6626
6627 /// Check if there is a field shadowing.
6628 void CheckShadowInheritedFields(const SourceLocation &Loc,
6629 DeclarationName FieldName,
6630 const CXXRecordDecl *RD,
6631 bool DeclIsField = true);
6632
6633 ///@}
6634
6635 //
6636 //
6637 // -------------------------------------------------------------------------
6638 //
6639 //
6640
6641 /// \name C++ Exception Specifications
6642 /// Implementations are in SemaExceptionSpec.cpp
6643 ///@{
6644
6645public:
6646 /// All the overriding functions seen during a class definition
6647 /// that had their exception spec checks delayed, plus the overridden
6648 /// function.
6651
6652 /// All the function redeclarations seen during a class definition that had
6653 /// their exception spec checks delayed, plus the prior declaration they
6654 /// should be checked against. Except during error recovery, the new decl
6655 /// should always be a friend declaration, as that's the only valid way to
6656 /// redeclare a special member before its class is complete.
6659
6660 /// Determine if we're in a case where we need to (incorrectly) eagerly
6661 /// parse an exception specification to work around a libstdc++ bug.
6663
6664 /// Check the given noexcept-specifier, convert its expression, and compute
6665 /// the appropriate ExceptionSpecificationType.
6666 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6668
6669 CanThrowResult canThrow(const Stmt *E);
6670 /// Determine whether the callee of a particular function call can throw.
6671 /// E, D and Loc are all optional.
6672 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6675 const FunctionProtoType *FPT);
6678
6679 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6680 /// exception specification. Incomplete types, or pointers to incomplete types
6681 /// other than void are not allowed.
6682 ///
6683 /// \param[in,out] T The exception type. This will be decayed to a pointer
6684 /// type
6685 /// when the input is an array or a function type.
6687
6688 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6689 /// pointer to member to a function with an exception specification. This
6690 /// means that it is invalid to add another level of indirection.
6693
6694 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6695 /// exception specifications. Exception specifications are equivalent if
6696 /// they allow exactly the same set of exception types. It does not matter how
6697 /// that is achieved. See C++ [except.spec]p2.
6699 SourceLocation OldLoc,
6700 const FunctionProtoType *New,
6701 SourceLocation NewLoc);
6703 const PartialDiagnostic &NoteID,
6704 const FunctionProtoType *Old,
6705 SourceLocation OldLoc,
6706 const FunctionProtoType *New,
6707 SourceLocation NewLoc);
6708 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6709
6710 /// CheckExceptionSpecSubset - Check whether the second function type's
6711 /// exception specification is a subset (or equivalent) of the first function
6712 /// type. This is used by override and pointer assignment checks.
6714 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6715 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6716 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6717 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6718 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6719
6720 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6721 /// two functions have equivalent exception specs. This is part of the
6722 /// assignment and override compatibility check. We do not check the
6723 /// parameters of parameter function pointers recursively, as no sane
6724 /// programmer would even be able to write such a function type.
6726 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6727 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6728 SourceLocation TargetLoc, const FunctionProtoType *Source,
6729 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6730
6731 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6732
6733 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6734 /// spec is a subset of base spec.
6736 const CXXMethodDecl *Old);
6737
6738 ///@}
6739
6740 //
6741 //
6742 // -------------------------------------------------------------------------
6743 //
6744 //
6745
6746 /// \name Expressions
6747 /// Implementations are in SemaExpr.cpp
6748 ///@{
6749
6750public:
6751 /// Describes how the expressions currently being parsed are
6752 /// evaluated at run-time, if at all.
6754 /// The current expression and its subexpressions occur within an
6755 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6756 /// \c sizeof, where the type of the expression may be significant but
6757 /// no code will be generated to evaluate the value of the expression at
6758 /// run time.
6760
6761 /// The current expression occurs within a braced-init-list within
6762 /// an unevaluated operand. This is mostly like a regular unevaluated
6763 /// context, except that we still instantiate constexpr functions that are
6764 /// referenced here so that we can perform narrowing checks correctly.
6766
6767 /// The current expression occurs within a discarded statement.
6768 /// This behaves largely similarly to an unevaluated operand in preventing
6769 /// definitions from being required, but not in other ways.
6771
6772 /// The current expression occurs within an unevaluated
6773 /// operand that unconditionally permits abstract references to
6774 /// fields, such as a SIZE operator in MS-style inline assembly.
6776
6777 /// The current context is "potentially evaluated" in C++11 terms,
6778 /// but the expression is evaluated at compile-time (like the values of
6779 /// cases in a switch statement).
6781
6782 /// In addition of being constant evaluated, the current expression
6783 /// occurs in an immediate function context - either a consteval function
6784 /// or a consteval if statement.
6786
6787 /// The current expression is potentially evaluated at run time,
6788 /// which means that code may be generated to evaluate the value of the
6789 /// expression at run time.
6791
6792 /// The current expression is potentially evaluated, but any
6793 /// declarations referenced inside that expression are only used if
6794 /// in fact the current expression is used.
6795 ///
6796 /// This value is used when parsing default function arguments, for which
6797 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6798 /// through varargs) but do not want to mark declarations as "referenced"
6799 /// until the default argument is used.
6801 };
6802
6803 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6804 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6805 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6806 /// have been applied to all subexpressions of the enclosing full expression.
6807 /// This is cleared at the end of each full expression.
6810
6811 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6812
6813 /// Data structure used to record current or nested
6814 /// expression evaluation contexts.
6816 /// The expression evaluation context.
6818
6819 /// Whether the enclosing context needed a cleanup.
6821
6822 /// The number of active cleanup objects when we entered
6823 /// this expression evaluation context.
6825
6827
6828 /// The lambdas that are present within this context, if it
6829 /// is indeed an unevaluated context.
6831
6832 /// The declaration that provides context for lambda expressions
6833 /// and block literals if the normal declaration context does not
6834 /// suffice, e.g., in a default function argument.
6836
6837 /// Declaration for initializer if one is currently being
6838 /// parsed. Used when an expression has a possibly unreachable
6839 /// diagnostic to reference the declaration as a whole.
6841
6842 /// If we are processing a decltype type, a set of call expressions
6843 /// for which we have deferred checking the completeness of the return type.
6845
6846 /// If we are processing a decltype type, a set of temporary binding
6847 /// expressions for which we have deferred checking the destructor.
6849
6851
6852 /// Expressions appearing as the LHS of a volatile assignment in this
6853 /// context. We produce a warning for these when popping the context if
6854 /// they are not discarded-value expressions nor unevaluated operands.
6856
6857 /// Set of candidates for starting an immediate invocation.
6860
6861 /// Set of DeclRefExprs referencing a consteval function when used in a
6862 /// context not already known to be immediately invoked.
6864
6865 /// P2718R0 - Lifetime extension in range-based for loops.
6866 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6867 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6868 /// InLifetimeExtendingContext is true.
6870
6871 /// Small set of gathered accesses to potentially misaligned members
6872 /// due to the packed attribute.
6874
6875 /// \brief Describes whether we are in an expression constext which we have
6876 /// to handle differently.
6884
6885 // A context can be nested in both a discarded statement context and
6886 // an immediate function context, so they need to be tracked independently.
6890
6892
6893 // We are in a constant context, but we also allow
6894 // non constant expressions, for example for array bounds (which may be
6895 // VLAs).
6897
6898 /// Whether we are currently in a context in which all temporaries must be
6899 /// lifetime-extended, even if they're not bound to a reference (for
6900 /// example, in a for-range initializer).
6902
6903 /// Whether evaluating an expression for a switch case label.
6904 bool IsCaseExpr = false;
6905
6906 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6908
6909 // When evaluating immediate functions in the initializer of a default
6910 // argument or default member initializer, this is the declaration whose
6911 // default initializer is being evaluated and the location of the call
6912 // or constructor definition.
6916 : Loc(Loc), Decl(Decl), Context(Context) {
6917 assert(Decl && Context && "invalid initialization context");
6918 }
6919
6921 ValueDecl *Decl = nullptr;
6923 };
6924 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6925
6936
6942
6949
6954
6959 // C++23 [expr.const]p14:
6960 // An expression or conversion is in an immediate function
6961 // context if it is potentially evaluated and either:
6962 // * its innermost enclosing non-block scope is a function
6963 // parameter scope of an immediate function, or
6964 // * its enclosing statement is enclosed by the compound-
6965 // statement of a consteval if statement.
6968 }
6969
6977 };
6978
6980 assert(!ExprEvalContexts.empty() &&
6981 "Must be in an expression evaluation context");
6982 return ExprEvalContexts.back();
6983 }
6984
6986 assert(!ExprEvalContexts.empty() &&
6987 "Must be in an expression evaluation context");
6988 return ExprEvalContexts.back();
6989 }
6990
6992 assert(ExprEvalContexts.size() >= 2 &&
6993 "Must be in an expression evaluation context");
6994 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6995 }
6996
6998 return const_cast<Sema *>(this)->parentEvaluationContext();
6999 }
7000
7005
7006 /// Increment when we find a reference; decrement when we find an ignored
7007 /// assignment. Ultimately the value is 0 if every reference is an ignored
7008 /// assignment.
7009 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
7010
7011 /// Used to control the generation of ExprWithCleanups.
7013
7014 /// ExprCleanupObjects - This is the stack of objects requiring
7015 /// cleanup that are created by the current full expression.
7017
7018 /// Determine whether the use of this declaration is valid, without
7019 /// emitting diagnostics.
7020 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
7021 // A version of DiagnoseUseOfDecl that should be used if overload resolution
7022 // has been used to find this declaration, which means we don't have to bother
7023 // checking the trailing requires clause.
7025 return DiagnoseUseOfDecl(
7026 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
7027 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
7028 /*SkipTrailingRequiresClause=*/true);
7029 }
7030
7031 /// Determine whether the use of this declaration is valid, and
7032 /// emit any corresponding diagnostics.
7033 ///
7034 /// This routine diagnoses various problems with referencing
7035 /// declarations that can occur when using a declaration. For example,
7036 /// it might warn if a deprecated or unavailable declaration is being
7037 /// used, or produce an error (and return true) if a C++0x deleted
7038 /// function is being used.
7039 ///
7040 /// \returns true if there was an error (this declaration cannot be
7041 /// referenced), false otherwise.
7043 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
7044 bool ObjCPropertyAccess = false,
7045 bool AvoidPartialAvailabilityChecks = false,
7046 ObjCInterfaceDecl *ClassReceiver = nullptr,
7047 bool SkipTrailingRequiresClause = false);
7048
7049 /// Emit a note explaining that this function is deleted.
7051
7052 /// DiagnoseSentinelCalls - This routine checks whether a call or
7053 /// message-send is to a declaration with the sentinel attribute, and
7054 /// if so, it checks that the requirements of the sentinel are
7055 /// satisfied.
7057 ArrayRef<Expr *> Args);
7058
7060 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
7063
7065 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
7066
7069 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
7073
7075
7079
7080 /// Check whether E, which is either a discarded-value expression or an
7081 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
7082 /// lvalue, and if so, remove it from the list of volatile-qualified
7083 /// assignments that we are going to warn are deprecated.
7085
7087
7088 // Functions for marking a declaration referenced. These functions also
7089 // contain the relevant logic for marking if a reference to a function or
7090 // variable is an odr-use (in the C++11 sense). There are separate variants
7091 // for expressions referring to a decl; these exist because odr-use marking
7092 // needs to be delayed for some constant variables when we build one of the
7093 // named expressions.
7094 //
7095 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7096 // should usually be true. This only needs to be set to false if the lack of
7097 // odr-use cannot be determined from the current context (for instance,
7098 // because the name denotes a virtual function and was written without an
7099 // explicit nested-name-specifier).
7100 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7101
7102 /// Mark a function referenced, and check whether it is odr-used
7103 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7105 bool MightBeOdrUse = true);
7106
7107 /// Mark a variable referenced, and check whether it is odr-used
7108 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7109 /// used directly for normal expressions referring to VarDecl.
7111
7112 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7113 ///
7114 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7115 /// be handled with care if the DeclRefExpr is not newly-created.
7116 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7117
7118 /// Perform reference-marking and odr-use handling for a MemberExpr.
7120
7121 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7124 unsigned CapturingScopeIndex);
7125
7127 void CleanupVarDeclMarking();
7128
7129 /// Try to capture the given variable.
7130 ///
7131 /// \param Var The variable to capture.
7132 ///
7133 /// \param Loc The location at which the capture occurs.
7134 ///
7135 /// \param Kind The kind of capture, which may be implicit (for either a
7136 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7137 ///
7138 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7139 /// an explicit lambda capture.
7140 ///
7141 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7142 /// captures or diagnose errors. If false, this routine merely check whether
7143 /// the capture can occur without performing the capture itself or complaining
7144 /// if the variable cannot be captured.
7145 ///
7146 /// \param CaptureType Will be set to the type of the field used to capture
7147 /// this variable in the innermost block or lambda. Only valid when the
7148 /// variable can be captured.
7149 ///
7150 /// \param DeclRefType Will be set to the type of a reference to the capture
7151 /// from within the current scope. Only valid when the variable can be
7152 /// captured.
7153 ///
7154 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7155 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7156 /// This is useful when enclosing lambdas must speculatively capture
7157 /// variables that may or may not be used in certain specializations of
7158 /// a nested generic lambda.
7159 ///
7160 /// \returns true if an error occurred (i.e., the variable cannot be
7161 /// captured) and false if the capture succeeded.
7163 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7164 bool BuildAndDiagnose, QualType &CaptureType,
7165 QualType &DeclRefType,
7166 const unsigned *const FunctionScopeIndexToStopAt);
7167
7168 /// Try to capture the given variable.
7171 SourceLocation EllipsisLoc = SourceLocation());
7172
7173 /// Checks if the variable must be captured.
7175
7176 /// Given a variable, determine the type that a reference to that
7177 /// variable will have in the given scope.
7179
7180 /// Mark all of the declarations referenced within a particular AST node as
7181 /// referenced. Used when template instantiation instantiates a non-dependent
7182 /// type -- entities referenced by the type are now referenced.
7184
7185 /// Mark any declarations that appear within this expression or any
7186 /// potentially-evaluated subexpressions as "referenced".
7187 ///
7188 /// \param SkipLocalVariables If true, don't mark local variables as
7189 /// 'referenced'.
7190 /// \param StopAt Subexpressions that we shouldn't recurse into.
7192 bool SkipLocalVariables = false,
7193 ArrayRef<const Expr *> StopAt = {});
7194
7195 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7196 /// conversion.
7197 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7198
7199 /// Conditionally issue a diagnostic based on the statements's reachability
7200 /// analysis.
7201 ///
7202 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7203 /// the function body is parsed, and then do a basic reachability analysis to
7204 /// determine if the statement is reachable. If it is unreachable, the
7205 /// diagnostic will not be emitted.
7206 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7207 const PartialDiagnostic &PD);
7208
7209 /// Conditionally issue a diagnostic based on the current
7210 /// evaluation context.
7211 ///
7212 /// \param Statement If Statement is non-null, delay reporting the
7213 /// diagnostic until the function body is parsed, and then do a basic
7214 /// reachability analysis to determine if the statement is reachable.
7215 /// If it is unreachable, the diagnostic will not be emitted.
7216 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7217 const PartialDiagnostic &PD);
7218 /// Similar, but diagnostic is only produced if all the specified statements
7219 /// are reachable.
7220 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7221 const PartialDiagnostic &PD);
7222
7223 // Primary Expressions.
7224 SourceRange getExprRange(Expr *E) const;
7225
7226 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7227 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7228 bool HasTrailingLParen, bool IsAddressOfOperand,
7229 CorrectionCandidateCallback *CCC = nullptr,
7230 bool IsInlineAsmIdentifier = false,
7231 Token *KeywordReplacement = nullptr);
7232
7233 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7234 /// possibly a list of template arguments.
7235 ///
7236 /// If this produces template arguments, it is permitted to call
7237 /// DecomposeTemplateName.
7238 ///
7239 /// This actually loses a lot of source location information for
7240 /// non-standard name kinds; we should consider preserving that in
7241 /// some way.
7242 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7243 TemplateArgumentListInfo &Buffer,
7244 DeclarationNameInfo &NameInfo,
7245 const TemplateArgumentListInfo *&TemplateArgs);
7246
7247 /// Diagnose a lookup that found results in an enclosing class during error
7248 /// recovery. This usually indicates that the results were found in a
7249 /// dependent base class that could not be searched as part of a template
7250 /// definition. Always issues a diagnostic (though this may be only a warning
7251 /// in MS compatibility mode).
7252 ///
7253 /// Return \c true if the error is unrecoverable, or \c false if the caller
7254 /// should attempt to recover using these lookup results.
7255 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7256
7257 /// Diagnose an empty lookup.
7258 ///
7259 /// \return false if new lookup candidates were found
7260 bool
7261 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7262 CorrectionCandidateCallback &CCC,
7263 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7264 ArrayRef<Expr *> Args = {},
7265 DeclContext *LookupCtx = nullptr);
7266
7267 /// If \p D cannot be odr-used in the current expression evaluation context,
7268 /// return a reason explaining why. Otherwise, return NOUR_None.
7270
7271 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7272 SourceLocation Loc,
7273 const CXXScopeSpec *SS = nullptr);
7274 DeclRefExpr *
7275 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7276 const DeclarationNameInfo &NameInfo,
7277 const CXXScopeSpec *SS = nullptr,
7278 NamedDecl *FoundD = nullptr,
7279 SourceLocation TemplateKWLoc = SourceLocation(),
7280 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7281
7282 /// BuildDeclRefExpr - Build an expression that references a
7283 /// declaration that does not require a closure capture.
7284 DeclRefExpr *
7285 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7286 const DeclarationNameInfo &NameInfo,
7287 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7288 SourceLocation TemplateKWLoc = SourceLocation(),
7289 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7290
7291 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7292 bool HasTrailingLParen);
7293
7294 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7295 /// declaration name, generally during template instantiation.
7296 /// There's a large number of things which don't need to be done along
7297 /// this path.
7299 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7300 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7301
7302 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7303 bool NeedsADL,
7304 bool AcceptInvalidDecl = false);
7305
7306 /// Complete semantic analysis for a reference to the given declaration.
7308 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7309 NamedDecl *FoundD = nullptr,
7310 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7311 bool AcceptInvalidDecl = false);
7312
7313 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7314 // where Tokens representing function local predefined macros (such as
7315 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7316 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7317
7318 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7319 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7320 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7321
7322 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7323
7324 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7326 Scope *UDLScope = nullptr);
7327 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7328 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7329 MultiExprArg Val);
7330 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7331 unsigned NumUserSpecifiedExprs,
7332 SourceLocation InitLoc,
7333 SourceLocation LParenLoc,
7334 SourceLocation RParenLoc);
7335
7336 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7337 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7338 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7339 /// from multiple tokens. However, the common case is that StringToks points
7340 /// to one string.
7341 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7342 Scope *UDLScope = nullptr);
7343
7344 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7345
7346 /// ControllingExprOrType is either an opaque pointer coming out of a
7347 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7348 /// into two so we don't take a void *, but that's awkward because one of
7349 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7350 /// itself to generic code very well.
7351 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7352 SourceLocation DefaultLoc,
7353 SourceLocation RParenLoc,
7354 bool PredicateIsExpr,
7355 void *ControllingExprOrType,
7356 ArrayRef<ParsedType> ArgTypes,
7357 ArrayRef<Expr *> ArgExprs);
7358 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7359 /// it'd be better to split this interface into two so we don't take a
7360 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7361 /// isn't a trivial change.
7362 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7363 SourceLocation DefaultLoc,
7364 SourceLocation RParenLoc,
7365 bool PredicateIsExpr,
7366 void *ControllingExprOrType,
7367 ArrayRef<TypeSourceInfo *> Types,
7368 ArrayRef<Expr *> Exprs);
7369
7370 // Binary/Unary Operators. 'Tok' is the token for the operator.
7371 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7372 Expr *InputExpr, bool IsAfterAmp = false);
7373 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7374 Expr *Input, bool IsAfterAmp = false);
7375
7376 /// Unary Operators. 'Tok' is the token for the operator.
7377 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7378 Expr *Input, bool IsAfterAmp = false);
7379
7380 /// Determine whether the given expression is a qualified member
7381 /// access expression, of a form that could be turned into a pointer to member
7382 /// with the address-of operator.
7383 bool isQualifiedMemberAccess(Expr *E);
7384 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7385 const Expr *Op,
7386 const CXXMethodDecl *MD);
7387
7388 /// CheckAddressOfOperand - The operand of & must be either a function
7389 /// designator or an lvalue designating an object. If it is an lvalue, the
7390 /// object cannot be declared with storage class register or be a bit field.
7391 /// Note: The usual conversions are *not* applied to the operand of the &
7392 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7393 /// In C++, the operand might be an overloaded function name, in which case
7394 /// we allow the '&' but retain the overloaded-function type.
7395 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7396
7397 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7398 /// _Alignas(type-name) .
7399 /// [dcl.align] An alignment-specifier of the form
7400 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7401 ///
7402 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7403 /// _Alignas(_Alignof(type-name)).
7404 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7405 SourceLocation OpLoc, SourceRange R);
7406 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7407 SourceLocation OpLoc, SourceRange R);
7408
7409 /// Build a sizeof or alignof expression given a type operand.
7410 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7411 SourceLocation OpLoc,
7412 UnaryExprOrTypeTrait ExprKind,
7413 SourceRange R);
7414
7415 /// Build a sizeof or alignof expression given an expression
7416 /// operand.
7417 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7418 UnaryExprOrTypeTrait ExprKind);
7419
7420 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7421 /// expr and the same for @c alignof and @c __alignof
7422 /// Note that the ArgRange is invalid if isType is false.
7423 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7424 UnaryExprOrTypeTrait ExprKind,
7425 bool IsType, void *TyOrEx,
7426 SourceRange ArgRange);
7427
7428 /// Check for operands with placeholder types and complain if found.
7429 /// Returns ExprError() if there was an error and no recovery was possible.
7431 bool CheckVecStepExpr(Expr *E);
7432
7433 /// Check the constraints on expression operands to unary type expression
7434 /// and type traits.
7435 ///
7436 /// Completes any types necessary and validates the constraints on the operand
7437 /// expression. The logic mostly mirrors the type-based overload, but may
7438 /// modify the expression as it completes the type for that expression through
7439 /// template instantiation, etc.
7441
7442 /// Check the constraints on operands to unary expression and type
7443 /// traits.
7444 ///
7445 /// This will complete any types necessary, and validate the various
7446 /// constraints on those operands.
7447 ///
7448 /// The UsualUnaryConversions() function is *not* called by this routine.
7449 /// C99 6.3.2.1p[2-4] all state:
7450 /// Except when it is the operand of the sizeof operator ...
7451 ///
7452 /// C++ [expr.sizeof]p4
7453 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7454 /// standard conversions are not applied to the operand of sizeof.
7455 ///
7456 /// This policy is followed for all of the unary trait expressions.
7457 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7458 SourceRange ExprRange,
7459 UnaryExprOrTypeTrait ExprKind,
7460 StringRef KWName);
7461
7462 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7463 tok::TokenKind Kind, Expr *Input);
7464
7465 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7466 MultiExprArg ArgExprs,
7467 SourceLocation RLoc);
7468 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7469 Expr *Idx, SourceLocation RLoc);
7470
7471 ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx,
7472 SourceLocation RBLoc);
7473
7474 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7475 Expr *ColumnIdx,
7476 SourceLocation RBLoc);
7477
7478 /// ConvertArgumentsForCall - Converts the arguments specified in
7479 /// Args/NumArgs to the parameter types of the function FDecl with
7480 /// function prototype Proto. Call is the call expression itself, and
7481 /// Fn is the function expression. For a C++ member function, this
7482 /// routine does not attempt to convert the object argument. Returns
7483 /// true if the call is ill-formed.
7484 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7485 const FunctionProtoType *Proto,
7486 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7487 bool ExecConfig = false);
7488
7489 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7490 /// array parameter, check that it is non-null, and that if it is formed by
7491 /// array-to-pointer decay, the underlying array is sufficiently large.
7492 ///
7493 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7494 /// the array type derivation, then for each call to the function, the value
7495 /// of the corresponding actual argument shall provide access to the first
7496 /// element of an array with at least as many elements as specified by the
7497 /// size expression.
7498 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7499 const Expr *ArgExpr);
7500
7501 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7502 /// This provides the location of the left/right parens and a list of comma
7503 /// locations.
7504 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7505 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7506 Expr *ExecConfig = nullptr);
7507
7508 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7509 /// This provides the location of the left/right parens and a list of comma
7510 /// locations.
7511 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7512 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7513 Expr *ExecConfig = nullptr,
7514 bool IsExecConfig = false,
7515 bool AllowRecovery = false);
7516
7517 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7518 // with the specified CallArgs
7519 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7520 MultiExprArg CallArgs);
7521
7523
7524 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7525 /// i.e. an expression not of \p OverloadTy. The expression should
7526 /// unary-convert to an expression of function-pointer or
7527 /// block-pointer type.
7528 ///
7529 /// \param NDecl the declaration being called, if available
7531 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7532 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7533 Expr *Config = nullptr, bool IsExecConfig = false,
7534 ADLCallKind UsesADL = ADLCallKind::NotADL);
7535
7537 ParsedType &Ty, SourceLocation RParenLoc,
7538 Expr *CastExpr);
7539
7540 /// Prepares for a scalar cast, performing all the necessary stages
7541 /// except the final cast and returning the kind required.
7543
7544 /// Build an altivec or OpenCL literal.
7546 SourceLocation RParenLoc, Expr *E,
7547 TypeSourceInfo *TInfo);
7548
7549 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7550 /// the ParenListExpr into a sequence of comma binary operators.
7552
7554 SourceLocation RParenLoc, Expr *InitExpr);
7555
7557 TypeSourceInfo *TInfo,
7558 SourceLocation RParenLoc,
7559 Expr *LiteralExpr);
7560
7561 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7562 SourceLocation RBraceLoc);
7563
7564 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7565 SourceLocation RBraceLoc);
7566
7567 /// Binary Operators. 'Tok' is the token for the operator.
7569 Expr *LHSExpr, Expr *RHSExpr);
7571 Expr *LHSExpr, Expr *RHSExpr,
7572 bool ForFoldExpression = false);
7573
7574 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7575 /// operator @p Opc at location @c TokLoc. This routine only supports
7576 /// built-in operations; ActOnBinOp handles overloaded operators.
7578 Expr *LHSExpr, Expr *RHSExpr,
7579 bool ForFoldExpression = false);
7581 UnresolvedSetImpl &Functions);
7582
7583 /// Look for instances where it is likely the comma operator is confused with
7584 /// another operator. There is an explicit list of acceptable expressions for
7585 /// the left hand side of the comma operator, otherwise emit a warning.
7586 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7587
7588 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7589 /// in the case of a the GNU conditional expr extension.
7591 SourceLocation ColonLoc, Expr *CondExpr,
7592 Expr *LHSExpr, Expr *RHSExpr);
7593
7594 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7596 LabelDecl *TheDecl);
7597
7598 void ActOnStartStmtExpr();
7599 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7600 SourceLocation RPLoc);
7602 SourceLocation RPLoc, unsigned TemplateDepth);
7603 // Handle the final expression in a statement expression.
7605 void ActOnStmtExprError();
7606
7607 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7610 bool isBrackets; // true if [expr], false if .ident
7611 union {
7614 } U;
7615 };
7616
7617 /// __builtin_offsetof(type, a.b[123][456].c)
7619 TypeSourceInfo *TInfo,
7620 ArrayRef<OffsetOfComponent> Components,
7621 SourceLocation RParenLoc);
7624 ParsedType ParsedArgTy,
7625 ArrayRef<OffsetOfComponent> Components,
7626 SourceLocation RParenLoc);
7627
7628 // __builtin_choose_expr(constExpr, expr1, expr2)
7629 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7630 Expr *LHSExpr, Expr *RHSExpr,
7631 SourceLocation RPLoc);
7632
7633 // __builtin_va_arg(expr, type)
7635 SourceLocation RPLoc);
7637 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7638
7639 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7640 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7642 SourceLocation BuiltinLoc,
7643 SourceLocation RPLoc);
7644
7645 // #embed
7647 StringLiteral *BinaryData, StringRef FileName);
7648
7649 // Build a potentially resolved SourceLocExpr.
7651 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7652 DeclContext *ParentContext);
7653
7654 // __null
7656
7657 bool CheckCaseExpression(Expr *E);
7658
7659 //===------------------------- "Block" Extension ------------------------===//
7660
7661 /// ActOnBlockStart - This callback is invoked when a block literal is
7662 /// started.
7663 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7664
7665 /// ActOnBlockArguments - This callback allows processing of block arguments.
7666 /// If there are no arguments, this is still invoked.
7667 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7668 Scope *CurScope);
7669
7670 /// ActOnBlockError - If there is an error parsing a block, this callback
7671 /// is invoked to pop the information about the block from the action impl.
7672 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7673
7674 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7675 /// literal was successfully completed. ^(int x){...}
7677 Scope *CurScope);
7678
7679 //===---------------------------- Clang Extensions ----------------------===//
7680
7681 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7682 /// provided arguments.
7683 ///
7684 /// __builtin_convertvector( value, dst type )
7685 ///
7687 SourceLocation BuiltinLoc,
7688 SourceLocation RParenLoc);
7689
7690 //===---------------------------- OpenCL Features -----------------------===//
7691
7692 /// Parse a __builtin_astype expression.
7693 ///
7694 /// __builtin_astype( value, dst type )
7695 ///
7696 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7697 SourceLocation BuiltinLoc,
7698 SourceLocation RParenLoc);
7699
7700 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7702 SourceLocation BuiltinLoc,
7703 SourceLocation RParenLoc);
7704
7705 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7707 ArrayRef<Expr *> SubExprs,
7708 QualType T = QualType());
7709
7710 /// Cast a base object to a member's actual type.
7711 ///
7712 /// There are two relevant checks:
7713 ///
7714 /// C++ [class.access.base]p7:
7715 ///
7716 /// If a class member access operator [...] is used to access a non-static
7717 /// data member or non-static member function, the reference is ill-formed
7718 /// if the left operand [...] cannot be implicitly converted to a pointer to
7719 /// the naming class of the right operand.
7720 ///
7721 /// C++ [expr.ref]p7:
7722 ///
7723 /// If E2 is a non-static data member or a non-static member function, the
7724 /// program is ill-formed if the class of which E2 is directly a member is
7725 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7726 ///
7727 /// Note that the latter check does not consider access; the access of the
7728 /// "real" base class is checked as appropriate when checking the access of
7729 /// the member name.
7731 NestedNameSpecifier Qualifier,
7732 NamedDecl *FoundDecl,
7733 NamedDecl *Member);
7734
7735 /// CheckCallReturnType - Checks that a call expression's return type is
7736 /// complete. Returns true on failure. The location passed in is the location
7737 /// that best represents the call.
7738 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7739 CallExpr *CE, FunctionDecl *FD);
7740
7741 /// Emit a warning for all pending noderef expressions that we recorded.
7742 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7743
7745
7746 /// Instantiate or parse a C++ default argument expression as necessary.
7747 /// Return true on error.
7749 ParmVarDecl *Param, Expr *Init = nullptr,
7750 bool SkipImmediateInvocations = true);
7751
7752 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7753 /// the default expr if needed.
7755 ParmVarDecl *Param, Expr *Init = nullptr);
7756
7757 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7758 /// invocation.
7760
7762
7763 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7764 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7765
7766 /// Abstract base class used for diagnosing integer constant
7767 /// expression violations.
7769 public:
7771
7773
7774 virtual SemaDiagnosticBuilder
7775 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7777 SourceLocation Loc) = 0;
7780 };
7781
7782 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7783 /// and reports the appropriate diagnostics. Returns false on success.
7784 /// Can optionally return the value of the expression.
7787 VerifyICEDiagnoser &Diagnoser,
7791 unsigned DiagID,
7794 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7798 AllowFoldKind CanFold = AllowFoldKind::No) {
7799 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7800 }
7801
7802 /// DiagnoseAssignmentAsCondition - Given that an expression is
7803 /// being used as a boolean condition, warn if it's an assignment.
7805
7806 /// Redundant parentheses over an equality comparison can indicate
7807 /// that the user intended an assignment used as condition.
7809
7811 public:
7813 FullExprArg(Sema &actions) : E(nullptr) {}
7814
7815 ExprResult release() { return E; }
7816
7817 Expr *get() const { return E; }
7818
7819 Expr *operator->() { return E; }
7820
7821 private:
7822 // FIXME: No need to make the entire Sema class a friend when it's just
7823 // Sema::MakeFullExpr that needs access to the constructor below.
7824 friend class Sema;
7825
7826 explicit FullExprArg(Expr *expr) : E(expr) {}
7827
7828 Expr *E;
7829 };
7830
7832 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7833 }
7835 return FullExprArg(
7836 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7837 }
7839 ExprResult FE =
7840 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7841 /*DiscardedValue*/ true);
7842 return FullExprArg(FE.get());
7843 }
7844
7845 class ConditionResult {
7846 Decl *ConditionVar;
7847 ExprResult Condition;
7848 bool Invalid;
7849 std::optional<bool> KnownValue;
7850
7851 friend class Sema;
7852 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7853 bool IsConstexpr)
7854 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7855 if (IsConstexpr && Condition.get()) {
7856 if (std::optional<llvm::APSInt> Val =
7857 Condition.get()->getIntegerConstantExpr(S.Context)) {
7858 KnownValue = !!(*Val);
7859 }
7860 }
7861 }
7862 explicit ConditionResult(bool Invalid)
7863 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7864 KnownValue(std::nullopt) {}
7865
7866 public:
7867 ConditionResult() : ConditionResult(false) {}
7868 bool isInvalid() const { return Invalid; }
7869 std::pair<VarDecl *, Expr *> get() const {
7870 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7871 Condition.get());
7872 }
7873 std::optional<bool> getKnownValue() const { return KnownValue; }
7874 };
7876
7877 /// CheckBooleanCondition - Diagnose problems involving the use of
7878 /// the given expression as a boolean condition (e.g. in an if
7879 /// statement). Also performs the standard function and array
7880 /// decays, possibly changing the input variable.
7881 ///
7882 /// \param Loc - A location associated with the condition, e.g. the
7883 /// 'if' keyword.
7884 /// \return true iff there were any errors
7886 bool IsConstexpr = false);
7887
7888 enum class ConditionKind {
7889 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7890 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7891 Switch ///< An integral condition for a 'switch' statement.
7892 };
7893
7894 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7895 ConditionKind CK, bool MissingOK = false);
7896
7897 QualType CheckConditionalOperands( // C99 6.5.15
7899 ExprObjectKind &OK, SourceLocation QuestionLoc);
7900
7901 /// Emit a specialized diagnostic when one expression is a null pointer
7902 /// constant and the other is not a pointer. Returns true if a diagnostic is
7903 /// emitted.
7904 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7905 SourceLocation QuestionLoc);
7906
7907 /// type checking for vector binary operators.
7909 SourceLocation Loc, bool IsCompAssign,
7910 bool AllowBothBool, bool AllowBoolConversion,
7911 bool AllowBoolOperation, bool ReportInvalid);
7912
7913 /// Return a signed ext_vector_type that is of identical size and number of
7914 /// elements. For floating point vectors, return an integer type of identical
7915 /// size and number of elements. In the non ext_vector_type case, search from
7916 /// the largest type to the smallest type to avoid cases where long long ==
7917 /// long, where long gets picked over long long.
7920
7921 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7922 /// operates on extended vector types. Instead of producing an IntTy result,
7923 /// like a scalar comparison, a vector comparison produces a vector of integer
7924 /// types.
7926 SourceLocation Loc,
7927 BinaryOperatorKind Opc);
7929 SourceLocation Loc,
7930 BinaryOperatorKind Opc);
7932 SourceLocation Loc,
7933 BinaryOperatorKind Opc);
7935 SourceLocation Loc,
7936 BinaryOperatorKind Opc);
7937 // type checking for sizeless vector binary operators.
7939 SourceLocation Loc, bool IsCompAssign,
7940 ArithConvKind OperationKind);
7941
7942 /// Type checking for matrix binary operators.
7944 SourceLocation Loc,
7945 bool IsCompAssign);
7947 SourceLocation Loc, bool IsCompAssign);
7948
7949 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7950 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7951 /// VLST) allowed?
7952 ///
7953 /// This will also return false if the two given types do not make sense from
7954 /// the perspective of SVE bitcasts.
7955 bool isValidSveBitcast(QualType srcType, QualType destType);
7956
7957 /// Are the two types matrix types and do they have the same dimensions i.e.
7958 /// do they have the same number of rows and the same number of columns?
7960
7961 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7962
7963 /// Are the two types lax-compatible vector types? That is, given
7964 /// that one of them is a vector, do they have equal storage sizes,
7965 /// where the storage size is the number of elements times the element
7966 /// size?
7967 ///
7968 /// This will also return false if either of the types is neither a
7969 /// vector nor a real type.
7970 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7971
7972 /// Is this a legal conversion between two types, one of which is
7973 /// known to be a vector type?
7974 bool isLaxVectorConversion(QualType srcType, QualType destType);
7975
7976 // This returns true if at least one of the types is an altivec vector.
7977 bool anyAltivecTypes(QualType srcType, QualType destType);
7978
7979 // type checking C++ declaration initializers (C++ [dcl.init]).
7980
7981 /// Check a cast of an unknown-any type. We intentionally only
7982 /// trigger this for C-style casts.
7985 ExprValueKind &VK, CXXCastPath &Path);
7986
7987 /// Force an expression with unknown-type to an expression of the
7988 /// given type.
7990
7991 /// Type-check an expression that's being passed to an
7992 /// __unknown_anytype parameter.
7994 QualType &paramType);
7995
7996 // CheckMatrixCast - Check type constraints for matrix casts.
7997 // We allow casting between matrixes of the same dimensions i.e. when they
7998 // have the same number of rows and column. Returns true if the cast is
7999 // invalid.
8000 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
8001 CastKind &Kind);
8002
8003 // CheckVectorCast - check type constraints for vectors.
8004 // Since vectors are an extension, there are no C standard reference for this.
8005 // We allow casting between vectors and integer datatypes of the same size.
8006 // returns true if the cast is invalid
8007 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
8008 CastKind &Kind);
8009
8010 /// Prepare `SplattedExpr` for a vector splat operation, adding
8011 /// implicit casts if necessary.
8012 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
8013
8014 /// Prepare `SplattedExpr` for a matrix splat operation, adding
8015 /// implicit casts if necessary.
8016 ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr);
8017
8018 // CheckExtVectorCast - check type constraints for extended vectors.
8019 // Since vectors are an extension, there are no C standard reference for this.
8020 // We allow casting between vectors and integer datatypes of the same size,
8021 // or vectors and the element type of that vector.
8022 // returns the cast expr
8024 CastKind &Kind);
8025
8027 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
8028 }
8029
8030 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
8031 // functions and arrays to their respective pointers (C99 6.3.2.1), and
8032 // promotes floating-piont types according to the language semantics.
8034
8035 // UsualUnaryFPConversions - promotes floating-point types according to the
8036 // current language semantics.
8038
8039 /// CallExprUnaryConversions - a special case of an unary conversion
8040 /// performed on a function designator of a call expression.
8042
8043 // DefaultFunctionArrayConversion - converts functions and arrays
8044 // to their respective pointers (C99 6.3.2.1).
8046
8047 // DefaultFunctionArrayLvalueConversion - converts functions and
8048 // arrays to their respective pointers and performs the
8049 // lvalue-to-rvalue conversion.
8051 bool Diagnose = true);
8052
8053 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
8054 // the operand. This function is a no-op if the operand has a function type
8055 // or an array type.
8057
8058 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
8059 // do not have a prototype. Integer promotions are performed on each
8060 // argument, and arguments that have type float are promoted to double.
8062
8064 const FunctionProtoType *Proto,
8065 Expr *Fn);
8066
8067 /// Determine the degree of POD-ness for an expression.
8068 /// Incomplete types are considered POD, since this check can be performed
8069 /// when we're in an unevaluated context.
8071
8072 /// Check to see if the given expression is a valid argument to a variadic
8073 /// function, issuing a diagnostic if not.
8074 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
8075
8076 /// GatherArgumentsForCall - Collector argument expressions for various
8077 /// form of call prototypes.
8079 SourceLocation CallLoc, FunctionDecl *FDecl,
8080 const FunctionProtoType *Proto, unsigned FirstParam,
8083 bool AllowExplicit = false, bool IsListInitialization = false);
8084
8085 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
8086 // will create a runtime trap if the resulting type is not a POD type.
8088 FunctionDecl *FDecl);
8089
8090 // Check that the usual arithmetic conversions can be performed on this pair
8091 // of expressions that might be of enumeration type.
8093 ArithConvKind ACK);
8094
8095 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
8096 // operands and then handles various conversions that are common to binary
8097 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8098 // routine returns the first non-arithmetic type found. The client is
8099 // responsible for emitting appropriate error diagnostics.
8101 SourceLocation Loc, ArithConvKind ACK);
8102
8104 switch (ConvTy) {
8105 default:
8106 return false;
8110 return true;
8111 }
8112 llvm_unreachable("impossible");
8113 }
8114
8115 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8116 /// assignment conversion type specified by ConvTy. This returns true if the
8117 /// conversion was invalid or false if the conversion was accepted.
8119 QualType DstType, QualType SrcType,
8120 Expr *SrcExpr, AssignmentAction Action,
8121 bool *Complained = nullptr);
8122
8123 /// CheckAssignmentConstraints - Perform type checking for assignment,
8124 /// argument passing, variable initialization, and function return values.
8125 /// C99 6.5.16.
8127 QualType LHSType,
8128 QualType RHSType);
8129
8130 /// Check assignment constraints and optionally prepare for a conversion of
8131 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8132 /// is true.
8134 ExprResult &RHS, CastKind &Kind,
8135 bool ConvertRHS = true);
8136
8137 /// Check assignment constraints for an assignment of RHS to LHSType.
8138 ///
8139 /// \param LHSType The destination type for the assignment.
8140 /// \param RHS The source expression for the assignment.
8141 /// \param Diagnose If \c true, diagnostics may be produced when checking
8142 /// for assignability. If a diagnostic is produced, \p RHS will be
8143 /// set to ExprError(). Note that this function may still return
8144 /// without producing a diagnostic, even for an invalid assignment.
8145 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8146 /// in an audited Core Foundation API and does not need to be checked
8147 /// for ARC retain issues.
8148 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8149 /// conversions necessary to perform the assignment. If \c false,
8150 /// \p Diagnose must also be \c false.
8152 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8153 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8154
8155 // If the lhs type is a transparent union, check whether we
8156 // can initialize the transparent union with the given expression.
8158 ExprResult &RHS);
8159
8160 /// the following "Check" methods will return a valid/converted QualType
8161 /// or a null QualType (indicating an error diagnostic was issued).
8162
8163 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8165 ExprResult &RHS);
8166
8167 /// Diagnose cases where a scalar was implicitly converted to a vector and
8168 /// diagnose the underlying types. Otherwise, diagnose the error
8169 /// as invalid vector logical operands for non-C++ cases.
8171 ExprResult &RHS);
8172
8174 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8175 BinaryOperatorKind Opc);
8176 QualType CheckRemainderOperands( // C99 6.5.5
8177 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8178 bool IsCompAssign = false);
8179 QualType CheckAdditionOperands( // C99 6.5.6
8180 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8181 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8183 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8184 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8185 QualType CheckShiftOperands( // C99 6.5.7
8186 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8187 BinaryOperatorKind Opc, bool IsCompAssign = false);
8189 QualType CheckCompareOperands( // C99 6.5.8/9
8190 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8191 BinaryOperatorKind Opc);
8192 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8193 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8194 BinaryOperatorKind Opc);
8195 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8196 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8197 BinaryOperatorKind Opc);
8198 // CheckAssignmentOperands is used for both simple and compound assignment.
8199 // For simple assignment, pass both expressions and a null converted type.
8200 // For compound assignment, pass both expressions and the converted type.
8201 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8202 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8203 BinaryOperatorKind Opc);
8204
8205 /// To be used for checking whether the arguments being passed to
8206 /// function exceeds the number of parameters expected for it.
8207 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8208 bool PartialOverloading = false) {
8209 // We check whether we're just after a comma in code-completion.
8210 if (NumArgs > 0 && PartialOverloading)
8211 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8212 return NumArgs > NumParams;
8213 }
8214
8215 /// Whether the AST is currently being rebuilt to correct immediate
8216 /// invocations. Immediate invocation candidates and references to consteval
8217 /// functions aren't tracked when this is set.
8219
8225
8226 /// Determines whether we are currently in a context that
8227 /// is not evaluated as per C++ [expr] p5.
8230 }
8231
8235
8239
8243
8250
8251 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8253 assert(!ExprEvalContexts.empty() &&
8254 "Must be in an expression evaluation context");
8255 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8257 Ctx.DelayedDefaultInitializationContext)
8258 return Ctx.DelayedDefaultInitializationContext;
8259 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8260 Ctx.isUnevaluated())
8261 break;
8262 }
8263 return std::nullopt;
8264 }
8265
8266 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8268 assert(!ExprEvalContexts.empty() &&
8269 "Must be in an expression evaluation context");
8270 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8271 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8273 !Ctx.DelayedDefaultInitializationContext && Res)
8274 break;
8275 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8276 Ctx.isUnevaluated())
8277 break;
8278 Res = Ctx.DelayedDefaultInitializationContext;
8279 }
8280 return Res;
8281 }
8282
8286
8287 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8288 /// SelfAssigned when inside a CXXMethodDecl.
8289 const FieldDecl *
8291
8293
8294 template <typename... Ts>
8296 const Ts &...Args) {
8297 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8298 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8299 }
8300
8301 template <typename... Ts>
8302 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8303 const Ts &...Args) {
8304 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8306 }
8307
8308 /// Abstract class used to diagnose incomplete types.
8311
8312 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8313 virtual ~TypeDiagnoser() {}
8314 };
8315
8316 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8317 protected:
8318 unsigned DiagID;
8319 std::tuple<const Ts &...> Args;
8320
8321 template <std::size_t... Is>
8323 std::index_sequence<Is...>) const {
8324 // Apply all tuple elements to the builder in order.
8325 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8326 (void)Dummy;
8327 }
8328
8329 public:
8330 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8331 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8332 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8333 }
8334
8335 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8336 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8337 emit(DB, std::index_sequence_for<Ts...>());
8338 DB << T;
8339 }
8340 };
8341
8342 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8343 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8344 /// For example, a diagnostic with no other parameters would generally have
8345 /// the form "...%select{incomplete|sizeless}0 type %1...".
8346 template <typename... Ts>
8348 public:
8349 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8350 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8351
8352 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8353 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8354 this->emit(DB, std::index_sequence_for<Ts...>());
8355 DB << T->isSizelessType() << T;
8356 }
8357 };
8358
8359 /// Check an argument list for placeholders that we won't try to
8360 /// handle later.
8362
8363 /// The C++ "std::source_location::__impl" struct, defined in
8364 /// <source_location>.
8366
8367 /// A stack of expression evaluation contexts.
8369
8370 // Set of failed immediate invocations to avoid double diagnosing.
8372
8373 /// List of SourceLocations where 'self' is implicitly retained inside a
8374 /// block.
8377
8378 /// Do an explicit extend of the given block pointer if we're in ARC.
8380
8381 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8384
8385private:
8386 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8387
8388 /// Methods for marking which expressions involve dereferencing a pointer
8389 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8390 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8391 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8392 /// `*p`, but need to check that `address of` is called on it. This requires
8393 /// keeping a container of all pending expressions and checking if the address
8394 /// of them are eventually taken.
8395 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8396 void CheckAddressOfNoDeref(const Expr *E);
8397
8398 ///@}
8399
8400 //
8401 //
8402 // -------------------------------------------------------------------------
8403 //
8404 //
8405
8406 /// \name C++ Expressions
8407 /// Implementations are in SemaExprCXX.cpp
8408 ///@{
8409
8410public:
8411 /// The C++ "std::bad_alloc" class, which is defined by the C++
8412 /// standard library.
8414
8415 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8416 /// standard library.
8418
8419 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8421
8422 /// A flag to remember whether the implicit forms of operator new and delete
8423 /// have been declared.
8425
8426 /// Delete-expressions to be analyzed at the end of translation unit
8427 ///
8428 /// This list contains class members, and locations of delete-expressions
8429 /// that could not be proven as to whether they mismatch with new-expression
8430 /// used in initializer of the field.
8431 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8432
8433 /// Handle the result of the special case name lookup for inheriting
8434 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8435 /// constructor names in member using declarations, even if 'X' is not the
8436 /// name of the corresponding type.
8438 SourceLocation NameLoc,
8439 const IdentifierInfo &Name);
8440
8442 SourceLocation NameLoc, Scope *S,
8443 CXXScopeSpec &SS, bool EnteringContext);
8445 Scope *S, CXXScopeSpec &SS,
8446 ParsedType ObjectType, bool EnteringContext);
8447
8449 ParsedType ObjectType);
8450
8451 /// Build a C++ typeid expression with a type operand.
8452 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8453 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8454
8455 /// Build a C++ typeid expression with an expression operand.
8456 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8457 Expr *Operand, SourceLocation RParenLoc);
8458
8459 /// ActOnCXXTypeid - Parse typeid( something ).
8461 bool isType, void *TyOrExpr,
8462 SourceLocation RParenLoc);
8463
8464 /// Build a Microsoft __uuidof expression with a type operand.
8465 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8466 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8467
8468 /// Build a Microsoft __uuidof expression with an expression operand.
8469 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8470 Expr *Operand, SourceLocation RParenLoc);
8471
8472 /// ActOnCXXUuidof - Parse __uuidof( something ).
8474 bool isType, void *TyOrExpr,
8475 SourceLocation RParenLoc);
8476
8477 //// ActOnCXXThis - Parse 'this' pointer.
8479
8480 /// Check whether the type of 'this' is valid in the current context.
8482
8483 /// Build a CXXThisExpr and mark it referenced in the current context.
8484 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8486
8487 /// Try to retrieve the type of the 'this' pointer.
8488 ///
8489 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8491
8492 /// When non-NULL, the C++ 'this' expression is allowed despite the
8493 /// current context not being a non-static member function. In such cases,
8494 /// this provides the type used for 'this'.
8496
8497 /// RAII object used to temporarily allow the C++ 'this' expression
8498 /// to be used, with the given qualifiers on the current class type.
8500 Sema &S;
8501 QualType OldCXXThisTypeOverride;
8502 bool Enabled;
8503
8504 public:
8505 /// Introduce a new scope where 'this' may be allowed (when enabled),
8506 /// using the given declaration (which is either a class template or a
8507 /// class) along with the given qualifiers.
8508 /// along with the qualifiers placed on '*this'.
8509 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8510 bool Enabled = true);
8511
8515 };
8516
8517 /// Make sure the value of 'this' is actually available in the current
8518 /// context, if it is a potentially evaluated context.
8519 ///
8520 /// \param Loc The location at which the capture of 'this' occurs.
8521 ///
8522 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8523 /// capture list.
8524 ///
8525 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8526 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8527 /// This is useful when enclosing lambdas must speculatively capture
8528 /// 'this' that may or may not be used in certain specializations of
8529 /// a nested generic lambda (depending on whether the name resolves to
8530 /// a non-static member function or a static function).
8531 /// \return returns 'true' if failed, 'false' if success.
8533 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8534 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8535 bool ByCopy = false);
8536
8537 /// Determine whether the given type is the type of *this that is used
8538 /// outside of the body of a member function for a type that is currently
8539 /// being defined.
8541
8542 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8544
8545 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8547
8548 //// ActOnCXXThrow - Parse throw expressions.
8551 bool IsThrownVarInScope);
8552
8553 /// CheckCXXThrowOperand - Validate the operand of a throw.
8554 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8555
8556 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8557 /// Can be interpreted either as function-style casting ("int(x)")
8558 /// or class type construction ("ClassType(x,y,z)")
8559 /// or creation of a value-initialized type ("int()").
8561 SourceLocation LParenOrBraceLoc,
8562 MultiExprArg Exprs,
8563 SourceLocation RParenOrBraceLoc,
8564 bool ListInitialization);
8565
8567 SourceLocation LParenLoc,
8568 MultiExprArg Exprs,
8569 SourceLocation RParenLoc,
8570 bool ListInitialization);
8571
8572 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8573 ///
8574 /// E.g.:
8575 /// @code new (memory) int[size][4] @endcode
8576 /// or
8577 /// @code ::new Foo(23, "hello") @endcode
8578 ///
8579 /// \param StartLoc The first location of the expression.
8580 /// \param UseGlobal True if 'new' was prefixed with '::'.
8581 /// \param PlacementLParen Opening paren of the placement arguments.
8582 /// \param PlacementArgs Placement new arguments.
8583 /// \param PlacementRParen Closing paren of the placement arguments.
8584 /// \param TypeIdParens If the type is in parens, the source range.
8585 /// \param D The type to be allocated, as well as array dimensions.
8586 /// \param Initializer The initializing expression or initializer-list, or
8587 /// null if there is none.
8588 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8589 SourceLocation PlacementLParen,
8590 MultiExprArg PlacementArgs,
8591 SourceLocation PlacementRParen,
8592 SourceRange TypeIdParens, Declarator &D,
8593 Expr *Initializer);
8595 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8596 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8597 SourceRange TypeIdParens, QualType AllocType,
8598 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8599 SourceRange DirectInitRange, Expr *Initializer);
8600
8601 /// Determine whether \p FD is an aligned allocation or deallocation
8602 /// function that is unavailable.
8604
8605 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8606 /// function that is unavailable.
8608 SourceLocation Loc);
8609
8610 /// Checks that a type is suitable as the allocated type
8611 /// in a new-expression.
8612 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8613 SourceRange R);
8614
8615 /// Finds the overloads of operator new and delete that are appropriate
8616 /// for the allocation.
8618 SourceLocation StartLoc, SourceRange Range,
8620 QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
8621 MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
8622 FunctionDecl *&OperatorDelete, bool Diagnose = true);
8623
8624 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8625 /// delete. These are:
8626 /// @code
8627 /// // C++03:
8628 /// void* operator new(std::size_t) throw(std::bad_alloc);
8629 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8630 /// void operator delete(void *) throw();
8631 /// void operator delete[](void *) throw();
8632 /// // C++11:
8633 /// void* operator new(std::size_t);
8634 /// void* operator new[](std::size_t);
8635 /// void operator delete(void *) noexcept;
8636 /// void operator delete[](void *) noexcept;
8637 /// // C++1y:
8638 /// void* operator new(std::size_t);
8639 /// void* operator new[](std::size_t);
8640 /// void operator delete(void *) noexcept;
8641 /// void operator delete[](void *) noexcept;
8642 /// void operator delete(void *, std::size_t) noexcept;
8643 /// void operator delete[](void *, std::size_t) noexcept;
8644 /// @endcode
8645 /// Note that the placement and nothrow forms of new are *not* implicitly
8646 /// declared. Their use requires including <new>.
8649 ArrayRef<QualType> Params);
8650
8652 DeclarationName Name, FunctionDecl *&Operator,
8654 bool Diagnose = true);
8657 DeclarationName Name,
8658 bool Diagnose = true);
8660 CXXRecordDecl *RD,
8661 bool Diagnose,
8662 bool LookForGlobal,
8663 DeclarationName Name);
8664
8665 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8666 /// @code ::delete ptr; @endcode
8667 /// or
8668 /// @code delete [] ptr; @endcode
8669 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8670 bool ArrayForm, Expr *Operand);
8672 bool IsDelete, bool CallCanBeVirtual,
8673 bool WarnOnNonAbstractTypes,
8674 SourceLocation DtorLoc);
8675
8677 Expr *Operand, SourceLocation RParen);
8679 SourceLocation RParen);
8680
8682 SourceLocation OpLoc,
8683 tok::TokenKind OpKind,
8684 ParsedType &ObjectType,
8685 bool &MayBePseudoDestructor);
8686
8688 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8689 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8690 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8691
8693 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8694 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8695 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8696
8698 SourceLocation OpLoc,
8699 tok::TokenKind OpKind,
8700 SourceLocation TildeLoc,
8701 const DeclSpec &DS);
8702
8703 /// MaybeCreateExprWithCleanups - If the current full-expression
8704 /// requires any cleanups, surround it with a ExprWithCleanups node.
8705 /// Otherwise, just returns the passed-in expression.
8709
8710 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8711 return ActOnFinishFullExpr(
8712 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8713 }
8715 bool DiscardedValue, bool IsConstexpr = false,
8716 bool IsTemplateArgument = false);
8718
8719 /// Process the expression contained within a decltype. For such expressions,
8720 /// certain semantic checks on temporaries are delayed until this point, and
8721 /// are omitted for the 'topmost' call in the decltype expression. If the
8722 /// topmost call bound a temporary, strip that temporary off the expression.
8724
8725 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8726 bool IsUDSuffix);
8727
8729
8730 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8731 SourceLocation StmtLoc,
8732 ConditionKind CK);
8733
8734 /// Check the use of the given variable as a C++ condition in an if,
8735 /// while, do-while, or switch statement.
8737 SourceLocation StmtLoc, ConditionKind CK);
8738
8739 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8740 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8741
8742 /// Helper function to determine whether this is the (deprecated) C++
8743 /// conversion from a string literal to a pointer to non-const char or
8744 /// non-const wchar_t (for narrow and wide string literals,
8745 /// respectively).
8747
8748 /// PerformImplicitConversion - Perform an implicit conversion of the
8749 /// expression From to the type ToType using the pre-computed implicit
8750 /// conversion sequence ICS. Returns the converted
8751 /// expression. Action is the kind of conversion we're performing,
8752 /// used in the error message.
8754 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8755 AssignmentAction Action,
8757
8758 /// PerformImplicitConversion - Perform an implicit conversion of the
8759 /// expression From to the type ToType by following the standard
8760 /// conversion sequence SCS. Returns the converted
8761 /// expression. Flavor is the context in which we're performing this
8762 /// conversion, for use in error messages.
8764 const StandardConversionSequence &SCS,
8765 AssignmentAction Action,
8767
8768 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8769
8770 /// Parsed one of the type trait support pseudo-functions.
8773 SourceLocation RParenLoc);
8776 SourceLocation RParenLoc);
8777
8778 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8779 /// pseudo-functions.
8781 ParsedType LhsTy, Expr *DimExpr,
8782 SourceLocation RParen);
8783
8785 TypeSourceInfo *TSInfo, Expr *DimExpr,
8786 SourceLocation RParen);
8787
8788 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8789 /// pseudo-functions.
8791 Expr *Queried, SourceLocation RParen);
8792
8794 Expr *Queried, SourceLocation RParen);
8795
8798 bool isIndirect);
8800 ExprResult &RHS,
8801 SourceLocation QuestionLoc);
8802
8803 //// Determines if a type is trivially relocatable
8804 /// according to the C++26 rules.
8805 // FIXME: This is in Sema because it requires
8806 // overload resolution, can we move to ASTContext?
8809
8810 /// Check the operands of ?: under C++ semantics.
8811 ///
8812 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8813 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8814 ///
8815 /// This function also implements GCC's vector extension and the
8816 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8817 /// permit the use of a?b:c where the type of a is that of a integer vector
8818 /// with the same number of elements and size as the vectors of b and c. If
8819 /// one of either b or c is a scalar it is implicitly converted to match the
8820 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8821 /// c are scalars, then b and c are checked and converted to the type of a if
8822 /// possible.
8823 ///
8824 /// The expressions are evaluated differently for GCC's and OpenCL's
8825 /// extensions. For the GCC extension, the ?: operator is evaluated as
8826 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8827 /// For the OpenCL extensions, the ?: operator is evaluated as
8828 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8829 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8831 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8832 ExprObjectKind &OK, SourceLocation questionLoc);
8833
8834 /// Find a merged pointer type and convert the two expressions to it.
8835 ///
8836 /// This finds the composite pointer type for \p E1 and \p E2 according to
8837 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8838 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8839 /// ConvertArgs is \c true).
8840 ///
8841 /// \param Loc The location of the operator requiring these two expressions to
8842 /// be converted to the composite pointer type.
8843 ///
8844 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8845 /// type.
8847 bool ConvertArgs = true);
8849 ExprResult &E2, bool ConvertArgs = true) {
8850 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8851 QualType Composite =
8852 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8853 E1 = E1Tmp;
8854 E2 = E2Tmp;
8855 return Composite;
8856 }
8857
8858 /// MaybeBindToTemporary - If the passed in expression has a record type with
8859 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8860 /// it simply returns the passed in expression.
8862
8863 /// IgnoredValueConversions - Given that an expression's result is
8864 /// syntactically ignored, perform any conversions that are
8865 /// required.
8867
8869
8872 const DeclarationNameInfo &TargetNameInfo);
8873
8875 SourceLocation KeywordLoc,
8876 bool IsIfExists, CXXScopeSpec &SS,
8877 UnqualifiedId &Name);
8878
8881 ArrayRef<ParmVarDecl *> LocalParameters,
8882 Scope *BodyScope);
8886 CXXScopeSpec &SS,
8887 SourceLocation NameLoc,
8888 const IdentifierInfo *TypeName,
8889 TemplateIdAnnotation *TemplateId);
8891 SourceLocation NoexceptLoc);
8893 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8894 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8897 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8901 bool IsSatisfied, SourceLocation NoexceptLoc,
8908 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8909 const ASTConstraintSatisfaction &Satisfaction);
8912 SourceLocation LParenLoc,
8913 ArrayRef<ParmVarDecl *> LocalParameters,
8914 SourceLocation RParenLoc,
8916 SourceLocation ClosingBraceLoc);
8917
8918private:
8919 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8920 bool IsDelete);
8921
8922 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8923 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8924 bool DeleteWasArrayForm);
8925
8926 ///@}
8927
8928 //
8929 //
8930 // -------------------------------------------------------------------------
8931 //
8932 //
8933
8934 /// \name Member Access Expressions
8935 /// Implementations are in SemaExprMember.cpp
8936 ///@{
8937
8938public:
8939 /// Check whether an expression might be an implicit class member access.
8941 bool IsAddressOfOperand);
8942
8943 /// Builds an expression which might be an implicit member expression.
8945 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8946 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8947
8948 /// Builds an implicit member access expression. The current context
8949 /// is known to be an instance method, and the given unqualified lookup
8950 /// set is known to contain only instance members, at least one of which
8951 /// is from an appropriate type.
8953 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8954 LookupResult &R,
8955 const TemplateArgumentListInfo *TemplateArgs,
8956 bool IsDefiniteInstance, const Scope *S);
8957
8959 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8960 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8961 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8962 const TemplateArgumentListInfo *TemplateArgs);
8963
8964 /// The main callback when the parser finds something like
8965 /// expression . [nested-name-specifier] identifier
8966 /// expression -> [nested-name-specifier] identifier
8967 /// where 'identifier' encompasses a fairly broad spectrum of
8968 /// possibilities, including destructor and operator references.
8969 ///
8970 /// \param OpKind either tok::arrow or tok::period
8971 /// \param ObjCImpDecl the current Objective-C \@implementation
8972 /// decl; this is an ugly hack around the fact that Objective-C
8973 /// \@implementations aren't properly put in the context chain
8975 tok::TokenKind OpKind, CXXScopeSpec &SS,
8976 SourceLocation TemplateKWLoc,
8977 UnqualifiedId &Member, Decl *ObjCImpDecl);
8978
8979 MemberExpr *
8980 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8981 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8982 ValueDecl *Member, DeclAccessPair FoundDecl,
8983 bool HadMultipleCandidates,
8984 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8986 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8987
8988 // Check whether the declarations we found through a nested-name
8989 // specifier in a member expression are actually members of the base
8990 // type. The restriction here is:
8991 //
8992 // C++ [expr.ref]p2:
8993 // ... In these cases, the id-expression shall name a
8994 // member of the class or of one of its base classes.
8995 //
8996 // So it's perfectly legitimate for the nested-name specifier to name
8997 // an unrelated class, and for us to find an overload set including
8998 // decls from classes which are not superclasses, as long as the decl
8999 // we actually pick through overload resolution is from a superclass.
9000 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
9001 const CXXScopeSpec &SS,
9002 const LookupResult &R);
9003
9004 // This struct is for use by ActOnMemberAccess to allow
9005 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
9006 // changing the access operator from a '.' to a '->' (to see if that is the
9007 // change needed to fix an error about an unknown member, e.g. when the class
9008 // defines a custom operator->).
9014
9016 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
9017 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
9018 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
9019 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
9020 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9021
9024 bool IsArrow, const CXXScopeSpec &SS,
9025 SourceLocation TemplateKWLoc,
9026 NamedDecl *FirstQualifierInScope, LookupResult &R,
9027 const TemplateArgumentListInfo *TemplateArgs,
9028 const Scope *S, bool SuppressQualifierCheck = false,
9029 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9030
9031 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
9032 SourceLocation OpLoc,
9033 const CXXScopeSpec &SS, FieldDecl *Field,
9034 DeclAccessPair FoundDecl,
9035 const DeclarationNameInfo &MemberNameInfo);
9036
9037 /// Perform conversions on the LHS of a member access expression.
9039
9041 const CXXScopeSpec &SS, SourceLocation nameLoc,
9042 IndirectFieldDecl *indirectField,
9043 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
9044 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
9045
9046private:
9047 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
9048
9049 ///@}
9050
9051 //
9052 //
9053 // -------------------------------------------------------------------------
9054 //
9055 //
9056
9057 /// \name Initializers
9058 /// Implementations are in SemaInit.cpp
9059 ///@{
9060
9061public:
9062 /// Stack of types that correspond to the parameter entities that are
9063 /// currently being copy-initialized. Can be empty.
9065
9066 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9068
9069 bool IsStringInit(Expr *Init, const ArrayType *AT);
9070
9071 /// Determine whether we can perform aggregate initialization for the purposes
9072 /// of overload resolution.
9074 const InitializedEntity &Entity, InitListExpr *From);
9075
9077 SourceLocation EqualOrColonLoc,
9078 bool GNUSyntax, ExprResult Init);
9079
9080 /// Check that the lifetime of the initializer (and its subobjects) is
9081 /// sufficient for initializing the entity, and perform lifetime extension
9082 /// (when permitted) if not.
9084
9087 bool BoundToLvalueReference);
9088
9089 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
9090 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9091 /// we don't have xvalues there.
9093
9097
9101 SourceLocation EqualLoc, ExprResult Init,
9102 bool TopLevelOfInitList = false,
9103 bool AllowExplicit = false);
9104
9106 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9107 const InitializationKind &Kind, MultiExprArg Init);
9108
9109 ///@}
9110
9111 //
9112 //
9113 // -------------------------------------------------------------------------
9114 //
9115 //
9116
9117 /// \name C++ Lambda Expressions
9118 /// Implementations are in SemaLambda.cpp
9119 ///@{
9120
9121public:
9122 /// Create a new lambda closure type.
9124 TypeSourceInfo *Info,
9125 unsigned LambdaDependencyKind,
9126 LambdaCaptureDefault CaptureDefault);
9127
9128 /// Number lambda for linkage purposes if necessary.
9130 std::optional<CXXRecordDecl::LambdaNumbering>
9131 NumberingOverride = std::nullopt);
9132
9133 /// Endow the lambda scope info with the relevant properties.
9134 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9135 SourceRange IntroducerRange,
9136 LambdaCaptureDefault CaptureDefault,
9137 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9138 bool Mutable);
9139
9142
9144 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9145 TemplateParameterList *TemplateParams);
9146
9147 void
9149 SourceLocation CallOperatorLoc,
9150 const AssociatedConstraint &TrailingRequiresClause,
9151 TypeSourceInfo *MethodTyInfo,
9152 ConstexprSpecKind ConstexprKind, StorageClass SC,
9154 bool HasExplicitResultType);
9155
9156 /// Returns true if the explicit object parameter was invalid.
9158 SourceLocation CallLoc);
9159
9160 /// Perform initialization analysis of the init-capture and perform
9161 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9162 /// not being used to initialize a reference.
9164 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9165 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9167 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9169 }
9171 SourceLocation EllipsisLoc,
9172 UnsignedOrNone NumExpansions,
9173 IdentifierInfo *Id,
9174 bool DirectInit, Expr *&Init);
9175
9176 /// Create a dummy variable within the declcontext of the lambda's
9177 /// call operator, for name lookup purposes for a lambda init capture.
9178 ///
9179 /// CodeGen handles emission of lambda captures, ignoring these dummy
9180 /// variables appropriately.
9182 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9183 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9184
9185 /// Add an init-capture to a lambda scope.
9186 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9187
9188 /// Note that we have finished the explicit captures for the
9189 /// given lambda.
9191
9192 /// Deduce a block or lambda's return type based on the return
9193 /// statements present in the body.
9195
9196 /// Once the Lambdas capture are known, we can start to create the closure,
9197 /// call operator method, and keep track of the captures.
9198 /// We do the capture lookup here, but they are not actually captured until
9199 /// after we know what the qualifiers of the call operator are.
9201 Scope *CurContext);
9202
9203 /// This is called after parsing the explicit template parameter list
9204 /// on a lambda (if it exists) in C++2a.
9206 SourceLocation LAngleLoc,
9207 ArrayRef<NamedDecl *> TParams,
9208 SourceLocation RAngleLoc,
9209 ExprResult RequiresClause);
9210
9212 SourceLocation MutableLoc);
9213
9215 Scope *LambdaScope,
9217
9218 /// ActOnStartOfLambdaDefinition - This is called just before we start
9219 /// parsing the body of a lambda; it analyzes the explicit captures and
9220 /// arguments, and sets up various data-structures for the body of the
9221 /// lambda.
9223 Declarator &ParamInfo, const DeclSpec &DS);
9224
9225 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9226 /// is invoked to pop the information about the lambda.
9227 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9228 bool IsInstantiation = false);
9229
9230 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9231 /// was successfully completed.
9233
9234 /// Does copying/destroying the captured variable have side effects?
9235 bool CaptureHasSideEffects(const sema::Capture &From);
9236
9237 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9238 /// diagnostic is emitted.
9239 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9240 SourceRange FixItRange,
9241 const sema::Capture &From);
9242
9243 /// Build a FieldDecl suitable to hold the given capture.
9245
9246 /// Initialize the given capture with a suitable expression.
9248 SourceLocation ImplicitCaptureLoc,
9249 bool IsOpenMPMapping = false);
9250
9251 /// Complete a lambda-expression having processed and attached the
9252 /// lambda body.
9254
9255 /// Get the return type to use for a lambda's conversion function(s) to
9256 /// function pointer type, given the type of the call operator.
9257 QualType
9259 CallingConv CC);
9260
9262 SourceLocation ConvLocation,
9263 CXXConversionDecl *Conv, Expr *Src);
9264
9266 : private FunctionScopeRAII {
9267 public:
9269 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9271 bool ShouldAddDeclsFromParentScope = true);
9272 };
9273
9274 /// Compute the mangling number context for a lambda expression or
9275 /// block literal. Also return the extra mangling decl if any.
9276 ///
9277 /// \param DC - The DeclContext containing the lambda expression or
9278 /// block literal.
9279 std::tuple<MangleNumberingContext *, Decl *>
9281
9282 ///@}
9283
9284 //
9285 //
9286 // -------------------------------------------------------------------------
9287 //
9288 //
9289
9290 /// \name Name Lookup
9291 ///
9292 /// These routines provide name lookup that is used during semantic
9293 /// analysis to resolve the various kinds of names (identifiers,
9294 /// overloaded operator names, constructor names, etc.) into zero or
9295 /// more declarations within a particular scope. The major entry
9296 /// points are LookupName, which performs unqualified name lookup,
9297 /// and LookupQualifiedName, which performs qualified name lookup.
9298 ///
9299 /// All name lookup is performed based on some specific criteria,
9300 /// which specify what names will be visible to name lookup and how
9301 /// far name lookup should work. These criteria are important both
9302 /// for capturing language semantics (certain lookups will ignore
9303 /// certain names, for example) and for performance, since name
9304 /// lookup is often a bottleneck in the compilation of C++. Name
9305 /// lookup criteria is specified via the LookupCriteria enumeration.
9306 ///
9307 /// The results of name lookup can vary based on the kind of name
9308 /// lookup performed, the current language, and the translation
9309 /// unit. In C, for example, name lookup will either return nothing
9310 /// (no entity found) or a single declaration. In C++, name lookup
9311 /// can additionally refer to a set of overloaded functions or
9312 /// result in an ambiguity. All of the possible results of name
9313 /// lookup are captured by the LookupResult class, which provides
9314 /// the ability to distinguish among them.
9315 ///
9316 /// Implementations are in SemaLookup.cpp
9317 ///@{
9318
9319public:
9320 /// Tracks whether we are in a context where typo correction is
9321 /// disabled.
9323
9324 /// The number of typos corrected by CorrectTypo.
9326
9327 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9328 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9329
9330 /// A cache containing identifiers for which typo correction failed and
9331 /// their locations, so that repeated attempts to correct an identifier in a
9332 /// given location are ignored if typo correction already failed for it.
9334
9335 /// SpecialMemberOverloadResult - The overloading result for a special member
9336 /// function.
9337 ///
9338 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9339 /// integer are used to determine whether overload resolution succeeded.
9341 public:
9343
9344 private:
9345 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9346
9347 public:
9350 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9351
9352 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9353 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9354
9355 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9356 void setKind(Kind K) { Pair.setInt(K); }
9357 };
9358
9359 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
9361 public:
9362 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
9363 : FastFoldingSetNode(ID) {}
9364 };
9365
9366 /// A cache of special member function overload resolution results
9367 /// for C++ records.
9368 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
9369
9371
9372 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9373 // TODO: make this is a typesafe union.
9376
9377 /// Describes the kind of name lookup to perform.
9379 /// Ordinary name lookup, which finds ordinary names (functions,
9380 /// variables, typedefs, etc.) in C and most kinds of names
9381 /// (functions, variables, members, types, etc.) in C++.
9383 /// Tag name lookup, which finds the names of enums, classes,
9384 /// structs, and unions.
9386 /// Label name lookup.
9388 /// Member name lookup, which finds the names of
9389 /// class/struct/union members.
9391 /// Look up of an operator name (e.g., operator+) for use with
9392 /// operator overloading. This lookup is similar to ordinary name
9393 /// lookup, but will ignore any declarations that are class members.
9395 /// Look up a name following ~ in a destructor name. This is an ordinary
9396 /// lookup, but prefers tags to typedefs.
9398 /// Look up of a name that precedes the '::' scope resolution
9399 /// operator in C++. This lookup completely ignores operator, object,
9400 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9402 /// Look up a namespace name within a C++ using directive or
9403 /// namespace alias definition, ignoring non-namespace names (C++
9404 /// [basic.lookup.udir]p1).
9406 /// Look up all declarations in a scope with the given name,
9407 /// including resolved using declarations. This is appropriate
9408 /// for checking redeclarations for a using declaration.
9410 /// Look up an ordinary name that is going to be redeclared as a
9411 /// name with linkage. This lookup ignores any declarations that
9412 /// are outside of the current scope unless they have linkage. See
9413 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9415 /// Look up a friend of a local class. This lookup does not look
9416 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9418 /// Look up the name of an Objective-C protocol.
9420 /// Look up implicit 'self' parameter of an objective-c method.
9422 /// Look up the name of an OpenMP user-defined reduction operation.
9424 /// Look up the name of an OpenMP user-defined mapper.
9426 /// Look up any declaration with any name.
9428 };
9429
9430 /// The possible outcomes of name lookup for a literal operator.
9432 /// The lookup resulted in an error.
9434 /// The lookup found no match but no diagnostic was issued.
9436 /// The lookup found a single 'cooked' literal operator, which
9437 /// expects a normal literal to be built and passed to it.
9439 /// The lookup found a single 'raw' literal operator, which expects
9440 /// a string literal containing the spelling of the literal token.
9442 /// The lookup found an overload set of literal operator templates,
9443 /// which expect the characters of the spelling of the literal token to be
9444 /// passed as a non-type template argument pack.
9446 /// The lookup found an overload set of literal operator templates,
9447 /// which expect the character type and characters of the spelling of the
9448 /// string literal token to be passed as template arguments.
9450 };
9451
9452 SpecialMemberOverloadResult
9454 bool VolatileArg, bool RValueThis, bool ConstThis,
9455 bool VolatileThis);
9456
9458
9459 /// Look up a name, looking for a single declaration. Return
9460 /// null if the results were absent, ambiguous, or overloaded.
9461 ///
9462 /// It is preferable to use the elaborated form and explicitly handle
9463 /// ambiguity and overloaded.
9465 Scope *S, DeclarationName Name, SourceLocation Loc,
9466 LookupNameKind NameKind,
9468
9469 /// Lookup a builtin function, when name lookup would otherwise
9470 /// fail.
9471 bool LookupBuiltin(LookupResult &R);
9472 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9473
9474 /// Perform unqualified name lookup starting from a given
9475 /// scope.
9476 ///
9477 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9478 /// used to find names within the current scope. For example, 'x' in
9479 /// @code
9480 /// int x;
9481 /// int f() {
9482 /// return x; // unqualified name look finds 'x' in the global scope
9483 /// }
9484 /// @endcode
9485 ///
9486 /// Different lookup criteria can find different names. For example, a
9487 /// particular scope can have both a struct and a function of the same
9488 /// name, and each can be found by certain lookup criteria. For more
9489 /// information about lookup criteria, see the documentation for the
9490 /// class LookupCriteria.
9491 ///
9492 /// @param S The scope from which unqualified name lookup will
9493 /// begin. If the lookup criteria permits, name lookup may also search
9494 /// in the parent scopes.
9495 ///
9496 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9497 /// look up and the lookup kind), and is updated with the results of lookup
9498 /// including zero or more declarations and possibly additional information
9499 /// used to diagnose ambiguities.
9500 ///
9501 /// @returns \c true if lookup succeeded and false otherwise.
9502 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9503 bool ForceNoCPlusPlus = false);
9504
9505 /// Perform qualified name lookup into a given context.
9506 ///
9507 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9508 /// names when the context of those names is explicit specified, e.g.,
9509 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9510 ///
9511 /// Different lookup criteria can find different names. For example, a
9512 /// particular scope can have both a struct and a function of the same
9513 /// name, and each can be found by certain lookup criteria. For more
9514 /// information about lookup criteria, see the documentation for the
9515 /// class LookupCriteria.
9516 ///
9517 /// \param R captures both the lookup criteria and any lookup results found.
9518 ///
9519 /// \param LookupCtx The context in which qualified name lookup will
9520 /// search. If the lookup criteria permits, name lookup may also search
9521 /// in the parent contexts or (for C++ classes) base classes.
9522 ///
9523 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9524 /// occurs as part of unqualified name lookup.
9525 ///
9526 /// \returns true if lookup succeeded, false if it failed.
9527 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9528 bool InUnqualifiedLookup = false);
9529
9530 /// Performs qualified name lookup or special type of lookup for
9531 /// "__super::" scope specifier.
9532 ///
9533 /// This routine is a convenience overload meant to be called from contexts
9534 /// that need to perform a qualified name lookup with an optional C++ scope
9535 /// specifier that might require special kind of lookup.
9536 ///
9537 /// \param R captures both the lookup criteria and any lookup results found.
9538 ///
9539 /// \param LookupCtx The context in which qualified name lookup will
9540 /// search.
9541 ///
9542 /// \param SS An optional C++ scope-specifier.
9543 ///
9544 /// \returns true if lookup succeeded, false if it failed.
9545 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9546 CXXScopeSpec &SS);
9547
9548 /// Performs name lookup for a name that was parsed in the
9549 /// source code, and may contain a C++ scope specifier.
9550 ///
9551 /// This routine is a convenience routine meant to be called from
9552 /// contexts that receive a name and an optional C++ scope specifier
9553 /// (e.g., "N::M::x"). It will then perform either qualified or
9554 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9555 /// respectively) on the given name and return those results. It will
9556 /// perform a special type of lookup for "__super::" scope specifier.
9557 ///
9558 /// @param S The scope from which unqualified name lookup will
9559 /// begin.
9560 ///
9561 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9562 ///
9563 /// @param EnteringContext Indicates whether we are going to enter the
9564 /// context of the scope-specifier SS (if present).
9565 ///
9566 /// @returns True if any decls were found (but possibly ambiguous)
9568 QualType ObjectType, bool AllowBuiltinCreation = false,
9569 bool EnteringContext = false);
9570
9571 /// Perform qualified name lookup into all base classes of the given
9572 /// class.
9573 ///
9574 /// \param R captures both the lookup criteria and any lookup results found.
9575 ///
9576 /// \param Class The context in which qualified name lookup will
9577 /// search. Name lookup will search in all base classes merging the results.
9578 ///
9579 /// @returns True if any decls were found (but possibly ambiguous)
9581
9583 UnresolvedSetImpl &Functions);
9584
9585 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9586 /// If GnuLabelLoc is a valid source location, then this is a definition
9587 /// of an __label__ label name, otherwise it is a normal label definition
9588 /// or use.
9590 SourceLocation GnuLabelLoc = SourceLocation());
9591
9592 /// Perform a name lookup for a label with the specified name; this does not
9593 /// create a new label if the lookup fails.
9595
9596 /// Look up the constructors for the given class.
9598
9599 /// Look up the default constructor for the given class.
9601
9602 /// Look up the copying constructor for the given class.
9604 unsigned Quals);
9605
9606 /// Look up the copying assignment operator for the given class.
9608 bool RValueThis, unsigned ThisQuals);
9609
9610 /// Look up the moving constructor for the given class.
9612 unsigned Quals);
9613
9614 /// Look up the moving assignment operator for the given class.
9616 bool RValueThis, unsigned ThisQuals);
9617
9618 /// Look for the destructor of the given class.
9619 ///
9620 /// During semantic analysis, this routine should be used in lieu of
9621 /// CXXRecordDecl::getDestructor().
9622 ///
9623 /// \returns The destructor for this class.
9625
9626 /// Force the declaration of any implicitly-declared members of this
9627 /// class.
9629
9630 /// Make a merged definition of an existing hidden definition \p ND
9631 /// visible at the specified location.
9633
9634 /// Check ODR hashes for C/ObjC when merging types from modules.
9635 /// Differently from C++, actually parse the body and reject in case
9636 /// of a mismatch.
9637 template <typename T,
9638 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9640 if (Duplicate->getODRHash() != Previous->getODRHash())
9641 return false;
9642
9643 // Make the previous decl visible.
9645 return true;
9646 }
9647
9648 /// Get the set of additional modules that should be checked during
9649 /// name lookup. A module and its imports become visible when instanting a
9650 /// template defined within it.
9651 llvm::DenseSet<Module *> &getLookupModules();
9652
9653 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9655
9656 /// Determine if the template parameter \p D has a visible default argument.
9657 bool
9659 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9660 /// Determine if the template parameter \p D has a reachable default argument.
9662 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9663 /// Determine if the template parameter \p D has a reachable default argument.
9667
9668 /// Determine if there is a visible declaration of \p D that is an explicit
9669 /// specialization declaration for a specialization of a template. (For a
9670 /// member specialization, use hasVisibleMemberSpecialization.)
9672 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9673 /// Determine if there is a reachable declaration of \p D that is an explicit
9674 /// specialization declaration for a specialization of a template. (For a
9675 /// member specialization, use hasReachableMemberSpecialization.)
9677 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9678
9679 /// Determine if there is a visible declaration of \p D that is a member
9680 /// specialization declaration (as opposed to an instantiated declaration).
9682 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9683 /// Determine if there is a reachable declaration of \p D that is a member
9684 /// specialization declaration (as opposed to an instantiated declaration).
9686 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9687
9688 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9689
9690 /// Determine whether any declaration of an entity is visible.
9691 bool
9693 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9694 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9695 }
9696
9699 /// Determine whether any declaration of an entity is reachable.
9700 bool
9702 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9703 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9704 }
9706 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9707
9708 void diagnoseTypo(const TypoCorrection &Correction,
9709 const PartialDiagnostic &TypoDiag,
9710 bool ErrorRecovery = true);
9711
9712 /// Diagnose a successfully-corrected typo. Separated from the correction
9713 /// itself to allow external validation of the result, etc.
9714 ///
9715 /// \param Correction The result of performing typo correction.
9716 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9717 /// string added to it (and usually also a fixit).
9718 /// \param PrevNote A note to use when indicating the location of the entity
9719 /// to which we are correcting. Will have the correction string added
9720 /// to it.
9721 /// \param ErrorRecovery If \c true (the default), the caller is going to
9722 /// recover from the typo as if the corrected string had been typed.
9723 /// In this case, \c PDiag must be an error, and we will attach a fixit
9724 /// to it.
9725 void diagnoseTypo(const TypoCorrection &Correction,
9726 const PartialDiagnostic &TypoDiag,
9727 const PartialDiagnostic &PrevNote,
9728 bool ErrorRecovery = true);
9729
9730 /// Find the associated classes and namespaces for
9731 /// argument-dependent lookup for a call with the given set of
9732 /// arguments.
9733 ///
9734 /// This routine computes the sets of associated classes and associated
9735 /// namespaces searched by argument-dependent lookup
9736 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9738 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9739 AssociatedNamespaceSet &AssociatedNamespaces,
9740 AssociatedClassSet &AssociatedClasses);
9741
9742 /// Produce a diagnostic describing the ambiguity that resulted
9743 /// from name lookup.
9744 ///
9745 /// \param Result The result of the ambiguous lookup to be diagnosed.
9747
9748 /// LookupLiteralOperator - Determine which literal operator should be used
9749 /// for a user-defined literal, per C++11 [lex.ext].
9750 ///
9751 /// Normal overload resolution is not used to select which literal operator to
9752 /// call for a user-defined literal. Look up the provided literal operator
9753 /// name, and filter the results to the appropriate set for the given argument
9754 /// types.
9757 bool AllowRaw, bool AllowTemplate,
9758 bool AllowStringTemplate, bool DiagnoseMissing,
9759 StringLiteral *StringLit = nullptr);
9760
9762 ArrayRef<Expr *> Args, ADLResult &Functions);
9763
9764 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9766 bool IncludeGlobalScope = true,
9767 bool LoadExternal = true);
9768 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9770 bool IncludeGlobalScope = true,
9771 bool IncludeDependentBases = false,
9772 bool LoadExternal = true);
9773
9774 /// Try to "correct" a typo in the source code by finding
9775 /// visible declarations whose names are similar to the name that was
9776 /// present in the source code.
9777 ///
9778 /// \param TypoName the \c DeclarationNameInfo structure that contains
9779 /// the name that was present in the source code along with its location.
9780 ///
9781 /// \param LookupKind the name-lookup criteria used to search for the name.
9782 ///
9783 /// \param S the scope in which name lookup occurs.
9784 ///
9785 /// \param SS the nested-name-specifier that precedes the name we're
9786 /// looking for, if present.
9787 ///
9788 /// \param CCC A CorrectionCandidateCallback object that provides further
9789 /// validation of typo correction candidates. It also provides flags for
9790 /// determining the set of keywords permitted.
9791 ///
9792 /// \param MemberContext if non-NULL, the context in which to look for
9793 /// a member access expression.
9794 ///
9795 /// \param EnteringContext whether we're entering the context described by
9796 /// the nested-name-specifier SS.
9797 ///
9798 /// \param OPT when non-NULL, the search for visible declarations will
9799 /// also walk the protocols in the qualified interfaces of \p OPT.
9800 ///
9801 /// \returns a \c TypoCorrection containing the corrected name if the typo
9802 /// along with information such as the \c NamedDecl where the corrected name
9803 /// was declared, and any additional \c NestedNameSpecifier needed to access
9804 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9806 Sema::LookupNameKind LookupKind, Scope *S,
9808 CorrectTypoKind Mode,
9809 DeclContext *MemberContext = nullptr,
9810 bool EnteringContext = false,
9811 const ObjCObjectPointerType *OPT = nullptr,
9812 bool RecordFailure = true);
9813
9814 /// Kinds of missing import. Note, the values of these enumerators correspond
9815 /// to %select values in diagnostics.
9823
9824 /// Diagnose that the specified declaration needs to be visible but
9825 /// isn't, and suggest a module import that would resolve the problem.
9827 MissingImportKind MIK, bool Recover = true);
9829 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9830 MissingImportKind MIK, bool Recover);
9831
9832 /// Called on #pragma clang __debug dump II
9834
9835 /// Called on #pragma clang __debug dump E
9836 void ActOnPragmaDump(Expr *E);
9837
9838private:
9839 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9840 //
9841 // The boolean value will be true to indicate that the namespace was loaded
9842 // from an AST/PCH file, or false otherwise.
9843 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9844
9845 /// Whether we have already loaded known namespaces from an extenal
9846 /// source.
9847 bool LoadedExternalKnownNamespaces;
9848
9849 bool CppLookupName(LookupResult &R, Scope *S);
9850
9851 /// Determine if we could use all the declarations in the module.
9852 bool isUsableModule(const Module *M);
9853
9854 /// Helper for CorrectTypo used to create and populate a new
9855 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9856 /// skipped entirely.
9857 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9858 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9860 DeclContext *MemberContext, bool EnteringContext,
9861 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9862
9863 /// Cache for module units which is usable for current module.
9864 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9865
9866 /// Record the typo correction failure and return an empty correction.
9867 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9868 bool RecordFailure = true) {
9869 if (RecordFailure)
9870 TypoCorrectionFailures[Typo].insert(TypoLoc);
9871 return TypoCorrection();
9872 }
9873
9874 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9875
9876 /// Determine whether two declarations should be linked together, given that
9877 /// the old declaration might not be visible and the new declaration might
9878 /// not have external linkage.
9879 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9880 const NamedDecl *New) {
9881 if (isVisible(Old))
9882 return true;
9883 // See comment in below overload for why it's safe to compute the linkage
9884 // of the new declaration here.
9885 if (New->isExternallyDeclarable()) {
9886 assert(Old->isExternallyDeclarable() &&
9887 "should not have found a non-externally-declarable previous decl");
9888 return true;
9889 }
9890 return false;
9891 }
9892 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9893
9894 ///@}
9895
9896 //
9897 //
9898 // -------------------------------------------------------------------------
9899 //
9900 //
9901
9902 /// \name Modules
9903 /// Implementations are in SemaModule.cpp
9904 ///@{
9905
9906public:
9907 /// Get the module unit whose scope we are currently within.
9909 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9910 }
9911
9912 /// Is the module scope we are an implementation unit?
9914 return ModuleScopes.empty()
9915 ? false
9916 : ModuleScopes.back().Module->isModuleImplementation();
9917 }
9918
9919 // When loading a non-modular PCH files, this is used to restore module
9920 // visibility.
9922 VisibleModules.setVisible(Mod, ImportLoc);
9923 }
9924
9925 enum class ModuleDeclKind {
9926 Interface, ///< 'export module X;'
9927 Implementation, ///< 'module X;'
9928 PartitionInterface, ///< 'export module X:Y;'
9929 PartitionImplementation, ///< 'module X:Y;'
9930 };
9931
9932 /// An enumeration to represent the transition of states in parsing module
9933 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9934 /// an error in state transition, the state is set to NotACXX20Module.
9936 FirstDecl, ///< Parsing the first decl in a TU.
9937 GlobalFragment, ///< after 'module;' but before 'module X;'
9938 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9939 ImportFinished, ///< after any non-import decl.
9940 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9941 ///< non-import decl.
9942 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9943 ///< non-import decl has already been seen.
9944 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9945 };
9946
9947 /// The parser has processed a module-declaration that begins the definition
9948 /// of a module interface or implementation.
9950 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9951 ModuleIdPath Path, ModuleIdPath Partition,
9952 ModuleImportState &ImportState,
9953 bool SeenNoTrivialPPDirective);
9954
9955 /// The parser has processed a global-module-fragment declaration that begins
9956 /// the definition of the global module fragment of the current module unit.
9957 /// \param ModuleLoc The location of the 'module' keyword.
9959
9960 /// The parser has processed a private-module-fragment declaration that begins
9961 /// the definition of the private module fragment of the current module unit.
9962 /// \param ModuleLoc The location of the 'module' keyword.
9963 /// \param PrivateLoc The location of the 'private' keyword.
9965 SourceLocation PrivateLoc);
9966
9967 /// The parser has processed a module import declaration.
9968 ///
9969 /// \param StartLoc The location of the first token in the declaration. This
9970 /// could be the location of an '@', 'export', or 'import'.
9971 /// \param ExportLoc The location of the 'export' keyword, if any.
9972 /// \param ImportLoc The location of the 'import' keyword.
9973 /// \param Path The module toplevel name as an access path.
9974 /// \param IsPartition If the name is for a partition.
9976 SourceLocation ExportLoc,
9977 SourceLocation ImportLoc, ModuleIdPath Path,
9978 bool IsPartition = false);
9980 SourceLocation ExportLoc,
9981 SourceLocation ImportLoc, Module *M,
9982 ModuleIdPath Path = {});
9983
9984 /// The parser has processed a module import translated from a
9985 /// #include or similar preprocessing directive.
9986 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9987 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9988
9989 /// The parsed has entered a submodule.
9990 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9991 /// The parser has left a submodule.
9992 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9993
9994 /// Create an implicit import of the given module at the given
9995 /// source location, for error recovery, if possible.
9996 ///
9997 /// This routine is typically used when an entity found by name lookup
9998 /// is actually hidden within a module that we know about but the user
9999 /// has forgotten to import.
10000 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
10001 Module *Mod);
10002
10003 /// We have parsed the start of an export declaration, including the '{'
10004 /// (if present).
10005 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
10006 SourceLocation LBraceLoc);
10007
10008 /// Complete the definition of an export declaration.
10009 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
10010 SourceLocation RBraceLoc);
10011
10012private:
10013 /// The parser has begun a translation unit to be compiled as a C++20
10014 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
10015 void HandleStartOfHeaderUnit();
10016
10017 struct ModuleScope {
10018 SourceLocation BeginLoc;
10019 clang::Module *Module = nullptr;
10020 VisibleModuleSet OuterVisibleModules;
10021 };
10022 /// The modules we're currently parsing.
10023 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
10024
10025 /// For an interface unit, this is the implicitly imported interface unit.
10026 clang::Module *ThePrimaryInterface = nullptr;
10027
10028 /// The explicit global module fragment of the current translation unit.
10029 /// The explicit Global Module Fragment, as specified in C++
10030 /// [module.global.frag].
10031 clang::Module *TheGlobalModuleFragment = nullptr;
10032
10033 /// The implicit global module fragments of the current translation unit.
10034 ///
10035 /// The contents in the implicit global module fragment can't be discarded.
10036 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
10037
10038 /// Namespace definitions that we will export when they finish.
10039 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
10040
10041 /// In a C++ standard module, inline declarations require a definition to be
10042 /// present at the end of a definition domain. This set holds the decls to
10043 /// be checked at the end of the TU.
10044 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
10045
10046 /// Helper function to judge if we are in module purview.
10047 /// Return false if we are not in a module.
10048 bool isCurrentModulePurview() const;
10049
10050 /// Enter the scope of the explicit global module fragment.
10051 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
10052 /// Leave the scope of the explicit global module fragment.
10053 void PopGlobalModuleFragment();
10054
10055 /// Enter the scope of an implicit global module fragment.
10056 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
10057 /// Leave the scope of an implicit global module fragment.
10058 void PopImplicitGlobalModuleFragment();
10059
10060 VisibleModuleSet VisibleModules;
10061
10062 /// Whether we had imported any named modules.
10063 bool HadImportedNamedModules = false;
10064 /// The set of instantiations we need to check if they references TU-local
10065 /// entity from TUs. This only makes sense if we imported any named modules.
10066 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
10067 PendingCheckReferenceForTULocal;
10068 /// Implement [basic.link]p18, which requires that we can't use TU-local
10069 /// entities from other TUs (ignoring header units).
10070 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
10071 SourceLocation PointOfInstantiation);
10072 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
10073 /// module interface or module partition.
10074 void checkExposure(const TranslationUnitDecl *TU);
10075
10076 ///@}
10077
10078 //
10079 //
10080 // -------------------------------------------------------------------------
10081 //
10082 //
10083
10084 /// \name C++ Overloading
10085 /// Implementations are in SemaOverload.cpp
10086 ///@{
10087
10088public:
10089 /// Whether deferrable diagnostics should be deferred.
10090 bool DeferDiags = false;
10091
10092 /// RAII class to control scope of DeferDiags.
10094 Sema &S;
10095 bool SavedDeferDiags = false;
10096
10097 public:
10099 : S(S), SavedDeferDiags(S.DeferDiags) {
10100 S.DeferDiags = SavedDeferDiags || DeferDiags;
10101 }
10102 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10105 };
10106
10107 /// Flag indicating if Sema is building a recovery call expression.
10108 ///
10109 /// This flag is used to avoid building recovery call expressions
10110 /// if Sema is already doing so, which would cause infinite recursions.
10112
10113 /// Determine whether the given New declaration is an overload of the
10114 /// declarations in Old. This routine returns OverloadKind::Match or
10115 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10116 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10117 /// Old declarations aren't functions (or function templates) at all. When it
10118 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10119 /// will point to the decl that New cannot be overloaded with. This decl may
10120 /// be a UsingShadowDecl on top of the underlying declaration.
10121 ///
10122 /// Example: Given the following input:
10123 ///
10124 /// void f(int, float); // #1
10125 /// void f(int, int); // #2
10126 /// int f(int, int); // #3
10127 ///
10128 /// When we process #1, there is no previous declaration of "f", so IsOverload
10129 /// will not be used.
10130 ///
10131 /// When we process #2, Old contains only the FunctionDecl for #1. By
10132 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10133 /// they have different signatures), so this routine returns
10134 /// OverloadKind::Overload; MatchedDecl is unchanged.
10135 ///
10136 /// When we process #3, Old is an overload set containing #1 and #2. We
10137 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10138 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10139 /// types of functions are not part of the signature), IsOverload returns
10140 /// OverloadKind::Match and MatchedDecl will be set to point to the
10141 /// FunctionDecl for #2.
10142 ///
10143 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10144 /// class by a using declaration. The rules for whether to hide shadow
10145 /// declarations ignore some properties which otherwise figure into a function
10146 /// template's signature.
10148 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10149 bool UseMemberUsingDeclRules);
10151 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10152
10153 // Checks whether MD constitutes an override the base class method BaseMD.
10154 // When checking for overrides, the object object members are ignored.
10155 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10156 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10157
10158 enum class AllowedExplicit {
10159 /// Allow no explicit functions to be used.
10161 /// Allow explicit conversion functions but not explicit constructors.
10163 /// Allow both explicit conversion functions and explicit constructors.
10165 };
10166
10168 Expr *From, QualType ToType, bool SuppressUserConversions,
10169 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10170 bool AllowObjCWritebackConversion);
10171
10172 /// PerformImplicitConversion - Perform an implicit conversion of the
10173 /// expression From to the type ToType. Returns the
10174 /// converted expression. Flavor is the kind of conversion we're
10175 /// performing, used in the error message. If @p AllowExplicit,
10176 /// explicit user-defined conversions are permitted.
10178 AssignmentAction Action,
10179 bool AllowExplicit = false);
10180
10181 /// IsIntegralPromotion - Determines whether the conversion from the
10182 /// expression From (whose potentially-adjusted type is FromType) to
10183 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10184 /// sets PromotedType to the promoted type.
10185 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10186
10187 /// IsFloatingPointPromotion - Determines whether the conversion from
10188 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10189 /// returns true and sets PromotedType to the promoted type.
10190 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10191
10192 /// Determine if a conversion is a complex promotion.
10193 ///
10194 /// A complex promotion is defined as a complex -> complex conversion
10195 /// where the conversion between the underlying real types is a
10196 /// floating-point or integral promotion.
10197 bool IsComplexPromotion(QualType FromType, QualType ToType);
10198
10199 /// IsOverflowBehaviorTypePromotion - Determines whether the conversion from
10200 /// FromType to ToType involves an OverflowBehaviorType FromType being
10201 /// promoted to an OverflowBehaviorType ToType which has a larger bitwidth.
10202 /// If so, returns true and sets FromType to ToType.
10203 bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType);
10204
10205 /// IsOverflowBehaviorTypeConversion - Determines whether the conversion from
10206 /// FromType to ToType necessarily involves both an OverflowBehaviorType and
10207 /// a non-OverflowBehaviorType. If so, returns true and sets FromType to
10208 /// ToType.
10209 bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType);
10210
10211 /// IsPointerConversion - Determines whether the conversion of the
10212 /// expression From, which has the (possibly adjusted) type FromType,
10213 /// can be converted to the type ToType via a pointer conversion (C++
10214 /// 4.10). If so, returns true and places the converted type (that
10215 /// might differ from ToType in its cv-qualifiers at some level) into
10216 /// ConvertedType.
10217 ///
10218 /// This routine also supports conversions to and from block pointers
10219 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10220 /// pointers to interfaces. FIXME: Once we've determined the
10221 /// appropriate overloading rules for Objective-C, we may want to
10222 /// split the Objective-C checks into a different routine; however,
10223 /// GCC seems to consider all of these conversions to be pointer
10224 /// conversions, so for now they live here. IncompatibleObjC will be
10225 /// set if the conversion is an allowed Objective-C conversion that
10226 /// should result in a warning.
10227 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10228 bool InOverloadResolution, QualType &ConvertedType,
10229 bool &IncompatibleObjC);
10230
10231 /// isObjCPointerConversion - Determines whether this is an
10232 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10233 /// with the same arguments and return values.
10234 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10235 QualType &ConvertedType, bool &IncompatibleObjC);
10236 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10237 QualType &ConvertedType);
10238
10239 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10240 /// for equality of their parameter types. Caller has already checked that
10241 /// they have same number of parameters. If the parameters are different,
10242 /// ArgPos will have the parameter index of the first different parameter.
10243 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10244 /// reverse order. That's useful if one of the functions is being used as a
10245 /// C++20 synthesized operator overload with a reversed parameter order.
10248 unsigned *ArgPos = nullptr,
10249 bool Reversed = false);
10250
10252 const FunctionProtoType *NewType,
10253 unsigned *ArgPos = nullptr,
10254 bool Reversed = false);
10255
10256 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10257 const FunctionDecl *NewFunction,
10258 unsigned *ArgPos = nullptr,
10259 bool Reversed = false);
10260
10261 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10262 /// function types. Catches different number of parameter, mismatch in
10263 /// parameter types, and different return types.
10265 QualType ToType);
10266
10267 /// CheckPointerConversion - Check the pointer conversion from the
10268 /// expression From to the type ToType. This routine checks for
10269 /// ambiguous or inaccessible derived-to-base pointer
10270 /// conversions for which IsPointerConversion has already returned
10271 /// true. It returns true and produces a diagnostic if there was an
10272 /// error, or returns false otherwise.
10273 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10274 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10275 bool Diagnose = true);
10276
10277 /// IsMemberPointerConversion - Determines whether the conversion of the
10278 /// expression From, which has the (possibly adjusted) type FromType, can be
10279 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10280 /// If so, returns true and places the converted type (that might differ from
10281 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10282 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10283 bool InOverloadResolution,
10284 QualType &ConvertedType);
10285
10295 /// CheckMemberPointerConversion - Check the member pointer conversion from
10296 /// the expression From to the type ToType. This routine checks for ambiguous
10297 /// or virtual or inaccessible base-to-derived member pointer conversions for
10298 /// which IsMemberPointerConversion has already returned true. It produces a
10299 // diagnostic if there was an error.
10301 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10302 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10303 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10304
10305 /// IsQualificationConversion - Determines whether the conversion from
10306 /// an rvalue of type FromType to ToType is a qualification conversion
10307 /// (C++ 4.4).
10308 ///
10309 /// \param ObjCLifetimeConversion Output parameter that will be set to
10310 /// indicate when the qualification conversion involves a change in the
10311 /// Objective-C object lifetime.
10312 bool IsQualificationConversion(QualType FromType, QualType ToType,
10313 bool CStyle, bool &ObjCLifetimeConversion);
10314
10315 /// Determine whether the conversion from FromType to ToType is a valid
10316 /// conversion of ExtInfo/ExtProtoInfo on the nested function type.
10317 /// More precisely, this method checks whether FromType can be transformed
10318 /// into an exact match for ToType, by transforming its extended function
10319 /// type information in legal manner (e.g. by strictly stripping "noreturn"
10320 /// or "noexcept", or by stripping "noescape" for arguments).
10321 bool IsFunctionConversion(QualType FromType, QualType ToType) const;
10322
10323 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10324 /// `ResultTy` to `ToType`.
10325 bool TryFunctionConversion(QualType FromType, QualType ToType,
10326 QualType &ResultTy) const;
10327
10330 DeclarationName Name,
10331 OverloadCandidateSet &CandidateSet,
10332 FunctionDecl *Fn, MultiExprArg Args,
10333 bool IsMember = false);
10334
10336 FunctionDecl *Fun);
10338 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10340
10341 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10342 /// of the expression From to bool (C++0x [conv]p3).
10344
10345 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10346 /// conversion of the expression From to an Objective-C pointer type.
10347 /// Returns a valid but null ExprResult if no conversion sequence exists.
10349
10351 CCEKind CCE,
10352 NamedDecl *Dest = nullptr);
10353
10355 llvm::APSInt &Value, CCEKind CCE);
10357 APValue &Value, CCEKind CCE,
10358 NamedDecl *Dest = nullptr);
10359
10360 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10361 /// That is a converted constant expression
10362 /// (which was built with BuildConvertedConstantExpression)
10365 CCEKind CCE, bool RequireInt,
10366 const APValue &PreNarrowingValue);
10367
10368 /// Abstract base class used to perform a contextual implicit
10369 /// conversion from an expression to any type passing a filter.
10371 public:
10374
10378
10379 /// Determine whether the specified type is a valid destination type
10380 /// for this conversion.
10381 virtual bool match(QualType T) = 0;
10382
10383 /// Emits a diagnostic complaining that the expression does not have
10384 /// integral or enumeration type.
10386 QualType T) = 0;
10387
10388 /// Emits a diagnostic when the expression has incomplete class type.
10389 virtual SemaDiagnosticBuilder
10391
10392 /// Emits a diagnostic when the only matching conversion function
10393 /// is explicit.
10395 SourceLocation Loc,
10396 QualType T,
10397 QualType ConvTy) = 0;
10398
10399 /// Emits a note for the explicit conversion function.
10400 virtual SemaDiagnosticBuilder
10402
10403 /// Emits a diagnostic when there are multiple possible conversion
10404 /// functions.
10406 QualType T) = 0;
10407
10408 /// Emits a note for one of the candidate conversions.
10409 virtual SemaDiagnosticBuilder
10411
10412 /// Emits a diagnostic when we picked a conversion function
10413 /// (for cases when we are not allowed to pick a conversion function).
10415 SourceLocation Loc,
10416 QualType T,
10417 QualType ConvTy) = 0;
10418
10420 };
10421
10423 bool AllowScopedEnumerations;
10424
10425 public:
10426 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10427 bool SuppressConversion)
10429 AllowScopedEnumerations(AllowScopedEnumerations) {}
10430
10431 /// Match an integral or (possibly scoped) enumeration type.
10432 bool match(QualType T) override;
10433
10435 QualType T) override {
10436 return diagnoseNotInt(S, Loc, T);
10437 }
10438
10439 /// Emits a diagnostic complaining that the expression does not have
10440 /// integral or enumeration type.
10442 QualType T) = 0;
10443 };
10444
10445 /// Perform a contextual implicit conversion.
10448 ContextualImplicitConverter &Converter);
10449
10450 /// ReferenceCompareResult - Expresses the result of comparing two
10451 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10452 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10454 /// Ref_Incompatible - The two types are incompatible, so direct
10455 /// reference binding is not possible.
10457 /// Ref_Related - The two types are reference-related, which means
10458 /// that their unqualified forms (T1 and T2) are either the same
10459 /// or T1 is a base class of T2.
10461 /// Ref_Compatible - The two types are reference-compatible.
10463 };
10464
10465 // Fake up a scoped enumeration that still contextually converts to bool.
10467 /// The conversions that would be performed on an lvalue of type T2 when
10468 /// binding a reference of type T1 to it, as determined when evaluating
10469 /// whether T1 is reference-compatible with T2.
10480 };
10482
10483 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10484 /// determine whether they are reference-compatible,
10485 /// reference-related, or incompatible, for use in C++ initialization by
10486 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10487 /// type, and the first type (T1) is the pointee type of the reference
10488 /// type being initialized.
10491 ReferenceConversions *Conv = nullptr);
10492
10493 /// AddOverloadCandidate - Adds the given function to the set of
10494 /// candidate functions, using the given function call arguments. If
10495 /// @p SuppressUserConversions, then don't allow user-defined
10496 /// conversions via constructors or conversion operators.
10497 ///
10498 /// \param PartialOverloading true if we are performing "partial" overloading
10499 /// based on an incomplete set of function arguments. This feature is used by
10500 /// code completion.
10503 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10504 bool PartialOverloading = false, bool AllowExplicit = true,
10505 bool AllowExplicitConversion = false,
10506 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10507 ConversionSequenceList EarlyConversions = {},
10509 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10510
10511 /// Add all of the function declarations in the given function set to
10512 /// the overload candidate set.
10514 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10515 OverloadCandidateSet &CandidateSet,
10516 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10517 bool SuppressUserConversions = false, bool PartialOverloading = false,
10518 bool FirstArgumentIsBase = false);
10519
10520 /// AddMethodCandidate - Adds a named decl (which is some kind of
10521 /// method) as a method candidate to the given overload set.
10522 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10523 Expr::Classification ObjectClassification,
10524 ArrayRef<Expr *> Args,
10525 OverloadCandidateSet &CandidateSet,
10526 bool SuppressUserConversion = false,
10527 OverloadCandidateParamOrder PO = {});
10528
10529 /// AddMethodCandidate - Adds the given C++ member function to the set
10530 /// of candidate functions, using the given function call arguments
10531 /// and the object argument (@c Object). For example, in a call
10532 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10533 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10534 /// allow user-defined conversions via constructors or conversion
10535 /// operators.
10536 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10537 CXXRecordDecl *ActingContext, QualType ObjectType,
10538 Expr::Classification ObjectClassification,
10539 ArrayRef<Expr *> Args,
10540 OverloadCandidateSet &CandidateSet,
10541 bool SuppressUserConversions = false,
10542 bool PartialOverloading = false,
10543 ConversionSequenceList EarlyConversions = {},
10545 bool StrictPackMatch = false);
10546
10547 /// Add a C++ member function template as a candidate to the candidate
10548 /// set, using template argument deduction to produce an appropriate member
10549 /// function template specialization.
10551 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10552 CXXRecordDecl *ActingContext,
10553 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10554 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10555 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10556 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10557
10558 /// Add a C++ function template specialization as a candidate
10559 /// in the candidate set, using template argument deduction to produce
10560 /// an appropriate function template specialization.
10562 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10563 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10564 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10565 bool PartialOverloading = false, bool AllowExplicit = true,
10566 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10568 bool AggregateCandidateDeduction = false);
10569
10571 /// Do not consider any user-defined conversions when constructing the
10572 /// initializing sequence.
10574
10575 /// Before constructing the initializing sequence, we check whether the
10576 /// parameter type and argument type contain any user defined conversions.
10577 /// If so, do not initialize them. This effectively bypasses some undesired
10578 /// instantiation before checking constaints, which might otherwise result
10579 /// in non-SFINAE errors e.g. recursive constraints.
10581
10588 };
10589
10590 /// Check that implicit conversion sequences can be formed for each argument
10591 /// whose corresponding parameter has a non-dependent type, per DR1391's
10592 /// [temp.deduct.call]p10.
10595 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10597 CheckNonDependentConversionsFlag UserConversionFlag,
10598 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10599 Expr::Classification ObjectClassification = {},
10600 OverloadCandidateParamOrder PO = {});
10601
10602 /// AddConversionCandidate - Add a C++ conversion function as a
10603 /// candidate in the candidate set (C++ [over.match.conv],
10604 /// C++ [over.match.copy]). From is the expression we're converting from,
10605 /// and ToType is the type that we're eventually trying to convert to
10606 /// (which may or may not be the same type as the type that the
10607 /// conversion function produces).
10609 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10610 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10611 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10612 bool AllowExplicit, bool AllowResultConversion = true,
10613 bool StrictPackMatch = false);
10614
10615 /// Adds a conversion function template specialization
10616 /// candidate to the overload set, using template argument deduction
10617 /// to deduce the template arguments of the conversion function
10618 /// template from the type that we are converting to (C++
10619 /// [temp.deduct.conv]).
10621 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10622 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10623 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10624 bool AllowExplicit, bool AllowResultConversion = true);
10625
10626 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10627 /// converts the given @c Object to a function pointer via the
10628 /// conversion function @c Conversion, and then attempts to call it
10629 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10630 /// the type of function that we'll eventually be calling.
10631 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10632 DeclAccessPair FoundDecl,
10633 CXXRecordDecl *ActingContext,
10634 const FunctionProtoType *Proto, Expr *Object,
10635 ArrayRef<Expr *> Args,
10636 OverloadCandidateSet &CandidateSet);
10637
10638 /// Add all of the non-member operator function declarations in the given
10639 /// function set to the overload candidate set.
10641 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10642 OverloadCandidateSet &CandidateSet,
10643 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10644
10645 /// Add overload candidates for overloaded operators that are
10646 /// member functions.
10647 ///
10648 /// Add the overloaded operator candidates that are member functions
10649 /// for the operator Op that was used in an operator expression such
10650 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10651 /// CandidateSet will store the added overload candidates. (C++
10652 /// [over.match.oper]).
10654 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10655 OverloadCandidateSet &CandidateSet,
10657
10658 /// AddBuiltinCandidate - Add a candidate for a built-in
10659 /// operator. ResultTy and ParamTys are the result and parameter types
10660 /// of the built-in candidate, respectively. Args and NumArgs are the
10661 /// arguments being passed to the candidate. IsAssignmentOperator
10662 /// should be true when this built-in candidate is an assignment
10663 /// operator. NumContextualBoolArguments is the number of arguments
10664 /// (at the beginning of the argument list) that will be contextually
10665 /// converted to bool.
10666 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10667 OverloadCandidateSet &CandidateSet,
10668 bool IsAssignmentOperator = false,
10669 unsigned NumContextualBoolArguments = 0);
10670
10671 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10672 /// operator overloads to the candidate set (C++ [over.built]), based
10673 /// on the operator @p Op and the arguments given. For example, if the
10674 /// operator is a binary '+', this routine might add "int
10675 /// operator+(int, int)" to cover integer addition.
10677 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10678 OverloadCandidateSet &CandidateSet);
10679
10680 /// Add function candidates found via argument-dependent lookup
10681 /// to the set of overloading candidates.
10682 ///
10683 /// This routine performs argument-dependent name lookup based on the
10684 /// given function name (which may also be an operator name) and adds
10685 /// all of the overload candidates found by ADL to the overload
10686 /// candidate set (C++ [basic.lookup.argdep]).
10688 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10689 TemplateArgumentListInfo *ExplicitTemplateArgs,
10690 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10691
10692 /// Check the enable_if expressions on the given function. Returns the first
10693 /// failing attribute, or NULL if they were all successful.
10694 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10695 ArrayRef<Expr *> Args,
10696 bool MissingImplicitThis = false);
10697
10698 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10699 /// non-ArgDependent DiagnoseIfAttrs.
10700 ///
10701 /// Argument-dependent diagnose_if attributes should be checked each time a
10702 /// function is used as a direct callee of a function call.
10703 ///
10704 /// Returns true if any errors were emitted.
10705 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10706 const Expr *ThisArg,
10707 ArrayRef<const Expr *> Args,
10708 SourceLocation Loc);
10709
10710 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10711 /// ArgDependent DiagnoseIfAttrs.
10712 ///
10713 /// Argument-independent diagnose_if attributes should be checked on every use
10714 /// of a function.
10715 ///
10716 /// Returns true if any errors were emitted.
10717 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10718 SourceLocation Loc);
10719
10720 /// Determine if \p A and \p B are equivalent internal linkage declarations
10721 /// from different modules, and thus an ambiguity error can be downgraded to
10722 /// an extension warning.
10723 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10724 const NamedDecl *B);
10726 SourceLocation Loc, const NamedDecl *D,
10727 ArrayRef<const NamedDecl *> Equiv);
10728
10729 // Emit as a 'note' the specific overload candidate
10731 const NamedDecl *Found, const FunctionDecl *Fn,
10733 QualType DestType = QualType(), bool TakingAddress = false);
10734
10735 // Emit as a series of 'note's all template and non-templates identified by
10736 // the expression Expr
10737 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10738 bool TakingAddress = false);
10739
10740 /// Returns whether the given function's address can be taken or not,
10741 /// optionally emitting a diagnostic if the address can't be taken.
10742 ///
10743 /// Returns false if taking the address of the function is illegal.
10744 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10745 bool Complain = false,
10746 SourceLocation Loc = SourceLocation());
10747
10748 // [PossiblyAFunctionType] --> [Return]
10749 // NonFunctionType --> NonFunctionType
10750 // R (A) --> R(A)
10751 // R (*)(A) --> R (A)
10752 // R (&)(A) --> R (A)
10753 // R (S::*)(A) --> R (A)
10754 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10755
10756 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10757 /// an overloaded function (C++ [over.over]), where @p From is an
10758 /// expression with overloaded function type and @p ToType is the type
10759 /// we're trying to resolve to. For example:
10760 ///
10761 /// @code
10762 /// int f(double);
10763 /// int f(int);
10764 ///
10765 /// int (*pfd)(double) = f; // selects f(double)
10766 /// @endcode
10767 ///
10768 /// This routine returns the resulting FunctionDecl if it could be
10769 /// resolved, and NULL otherwise. When @p Complain is true, this
10770 /// routine will emit diagnostics if there is an error.
10771 FunctionDecl *
10772 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10773 bool Complain, DeclAccessPair &Found,
10774 bool *pHadMultipleCandidates = nullptr);
10775
10776 /// Given an expression that refers to an overloaded function, try to
10777 /// resolve that function to a single function that can have its address
10778 /// taken. This will modify `Pair` iff it returns non-null.
10779 ///
10780 /// This routine can only succeed if from all of the candidates in the
10781 /// overload set for SrcExpr that can have their addresses taken, there is one
10782 /// candidate that is more constrained than the rest.
10783 FunctionDecl *
10784 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10785
10786 /// Given an overloaded function, tries to turn it into a non-overloaded
10787 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10788 /// will perform access checks, diagnose the use of the resultant decl, and,
10789 /// if requested, potentially perform a function-to-pointer decay.
10790 ///
10791 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10792 /// Otherwise, returns true. This may emit diagnostics and return true.
10794 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10795
10796 /// Given an expression that refers to an overloaded function, try to
10797 /// resolve that overloaded function expression down to a single function.
10798 ///
10799 /// This routine can only resolve template-ids that refer to a single function
10800 /// template, where that template-id refers to a single template whose
10801 /// template arguments are either provided by the template-id or have
10802 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10803 ///
10804 /// If no template-ids are found, no diagnostics are emitted and NULL is
10805 /// returned.
10807 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10808 TemplateSpecCandidateSet *FailedTSC = nullptr,
10809 bool ForTypeDeduction = false);
10810
10811 // Resolve and fix an overloaded expression that can be resolved
10812 // because it identifies a single function template specialization.
10813 //
10814 // Last three arguments should only be supplied if Complain = true
10815 //
10816 // Return true if it was logically possible to so resolve the
10817 // expression, regardless of whether or not it succeeded. Always
10818 // returns true if 'complain' is set.
10820 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10821 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10822 QualType DestTypeForComplaining = QualType(),
10823 unsigned DiagIDForComplaining = 0);
10824
10825 /// Add the overload candidates named by callee and/or found by argument
10826 /// dependent lookup to the given overload set.
10827 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10828 ArrayRef<Expr *> Args,
10829 OverloadCandidateSet &CandidateSet,
10830 bool PartialOverloading = false);
10831
10832 /// Add the call candidates from the given set of lookup results to the given
10833 /// overload set. Non-function lookup results are ignored.
10835 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10836 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10837
10838 // An enum used to represent the different possible results of building a
10839 // range-based for loop.
10845
10846 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10847 /// given LookupResult is non-empty, it is assumed to describe a member which
10848 /// will be invoked. Otherwise, the function will be found via argument
10849 /// dependent lookup.
10850 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10851 /// otherwise CallExpr is set to ExprError() and some non-success value
10852 /// is returned.
10854 SourceLocation RangeLoc,
10855 const DeclarationNameInfo &NameInfo,
10856 LookupResult &MemberLookup,
10857 OverloadCandidateSet *CandidateSet,
10858 Expr *Range, ExprResult *CallExpr);
10859
10860 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10861 /// (which eventually refers to the declaration Func) and the call
10862 /// arguments Args/NumArgs, attempt to resolve the function call down
10863 /// to a specific function. If overload resolution succeeds, returns
10864 /// the call expression produced by overload resolution.
10865 /// Otherwise, emits diagnostics and returns ExprError.
10867 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10868 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10869 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10870
10871 /// Constructs and populates an OverloadedCandidateSet from
10872 /// the given function.
10873 /// \returns true when an the ExprResult output parameter has been set.
10875 MultiExprArg Args, SourceLocation RParenLoc,
10876 OverloadCandidateSet *CandidateSet,
10878
10882 const UnresolvedSetImpl &Fns,
10883 bool PerformADL = true);
10884
10885 /// Create a unary operation that may resolve to an overloaded
10886 /// operator.
10887 ///
10888 /// \param OpLoc The location of the operator itself (e.g., '*').
10889 ///
10890 /// \param Opc The UnaryOperatorKind that describes this operator.
10891 ///
10892 /// \param Fns The set of non-member functions that will be
10893 /// considered by overload resolution. The caller needs to build this
10894 /// set based on the context using, e.g.,
10895 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10896 /// set should not contain any member functions; those will be added
10897 /// by CreateOverloadedUnaryOp().
10898 ///
10899 /// \param Input The input argument.
10902 const UnresolvedSetImpl &Fns, Expr *input,
10903 bool RequiresADL = true);
10904
10905 /// Perform lookup for an overloaded binary operator.
10908 const UnresolvedSetImpl &Fns,
10909 ArrayRef<Expr *> Args, bool RequiresADL = true);
10910
10911 /// Create a binary operation that may resolve to an overloaded
10912 /// operator.
10913 ///
10914 /// \param OpLoc The location of the operator itself (e.g., '+').
10915 ///
10916 /// \param Opc The BinaryOperatorKind that describes this operator.
10917 ///
10918 /// \param Fns The set of non-member functions that will be
10919 /// considered by overload resolution. The caller needs to build this
10920 /// set based on the context using, e.g.,
10921 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10922 /// set should not contain any member functions; those will be added
10923 /// by CreateOverloadedBinOp().
10924 ///
10925 /// \param LHS Left-hand argument.
10926 /// \param RHS Right-hand argument.
10927 /// \param PerformADL Whether to consider operator candidates found by ADL.
10928 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10929 /// C++20 operator rewrites.
10930 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10931 /// the function in question. Such a function is never a candidate in
10932 /// our overload resolution. This also enables synthesizing a three-way
10933 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10935 const UnresolvedSetImpl &Fns, Expr *LHS,
10936 Expr *RHS, bool RequiresADL = true,
10937 bool AllowRewrittenCandidates = true,
10938 FunctionDecl *DefaultedFn = nullptr);
10940 const UnresolvedSetImpl &Fns,
10941 Expr *LHS, Expr *RHS,
10942 FunctionDecl *DefaultedFn);
10943
10945 SourceLocation RLoc, Expr *Base,
10946 MultiExprArg Args);
10947
10948 /// BuildCallToMemberFunction - Build a call to a member
10949 /// function. MemExpr is the expression that refers to the member
10950 /// function (and includes the object parameter), Args/NumArgs are the
10951 /// arguments to the function call (not including the object
10952 /// parameter). The caller needs to validate that the member
10953 /// expression refers to a non-static member function or an overloaded
10954 /// member function.
10956 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10957 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10958 bool IsExecConfig = false, bool AllowRecovery = false);
10959
10960 /// BuildCallToObjectOfClassType - Build a call to an object of class
10961 /// type (C++ [over.call.object]), which can end up invoking an
10962 /// overloaded function call operator (@c operator()) or performing a
10963 /// user-defined conversion on the object argument.
10965 SourceLocation LParenLoc,
10966 MultiExprArg Args,
10967 SourceLocation RParenLoc);
10968
10969 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10970 /// (if one exists), where @c Base is an expression of class type and
10971 /// @c Member is the name of the member we're trying to find.
10973 SourceLocation OpLoc,
10974 bool *NoArrowOperatorFound = nullptr);
10975
10978 bool HadMultipleCandidates);
10979
10980 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10981 /// to a literal operator described by the provided lookup results.
10984 SourceLocation LitEndLoc,
10985 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10986
10987 /// FixOverloadedFunctionReference - E is an expression that refers to
10988 /// a C++ overloaded function (possibly with some parentheses and
10989 /// perhaps a '&' around it). We have resolved the overloaded function
10990 /// to the function declaration Fn, so patch up the expression E to
10991 /// refer (possibly indirectly) to Fn. Returns the new expr.
10993 FunctionDecl *Fn);
10995 DeclAccessPair FoundDecl,
10996 FunctionDecl *Fn);
10997
10998 /// - Returns a selector which best matches given argument list or
10999 /// nullptr if none could be found
11001 bool IsInstance,
11003
11004 ///@}
11005
11006 //
11007 //
11008 // -------------------------------------------------------------------------
11009 //
11010 //
11011
11012 /// \name Statements
11013 /// Implementations are in SemaStmt.cpp
11014 ///@{
11015
11016public:
11017 /// Stack of active SEH __finally scopes. Can be empty.
11019
11020 /// Stack of '_Defer' statements that are currently being parsed, as well
11021 /// as the locations of their '_Defer' keywords. Can be empty.
11023
11024 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
11026
11028 bool HasLeadingEmptyMacro = false);
11029
11031 SourceLocation EndLoc);
11033
11034 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
11035 /// whose result is unused, warn.
11036 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
11037
11038 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
11042 ArrayRef<Stmt *> Elts, bool isStmtExpr);
11043
11045
11048 SourceLocation DotDotDotLoc, ExprResult RHS,
11049 SourceLocation ColonLoc);
11050
11051 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
11052 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
11053
11055 SourceLocation ColonLoc, Stmt *SubStmt,
11056 Scope *CurScope);
11058 SourceLocation ColonLoc, Stmt *SubStmt);
11059
11061 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
11063 Stmt *SubStmt);
11064
11065 /// Check whether the given statement can have musttail applied to it,
11066 /// issuing a diagnostic and returning false if not. In the success case,
11067 /// the statement is rewritten to remove implicit nodes from the return
11068 /// value.
11069 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
11070
11072 SourceLocation LParenLoc, Stmt *InitStmt,
11074 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11076 SourceLocation LParenLoc, Stmt *InitStmt,
11078 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11079
11081
11083 SourceLocation LParenLoc, Stmt *InitStmt,
11085 SourceLocation RParenLoc);
11087 Stmt *Body);
11088
11089 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
11090 /// integer not in the range of enum values.
11091 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
11092 Expr *SrcExpr);
11093
11096 Stmt *Body);
11098 SourceLocation WhileLoc, SourceLocation CondLParen,
11099 Expr *Cond, SourceLocation CondRParen);
11100
11102 Stmt *First, ConditionResult Second,
11103 FullExprArg Third, SourceLocation RParenLoc,
11104 Stmt *Body);
11105
11106 /// In an Objective C collection iteration statement:
11107 /// for (x in y)
11108 /// x can be an arbitrary l-value expression. Bind it up as a
11109 /// full-expression.
11111
11113 /// Initial building of a for-range statement.
11115 /// Instantiation or recovery rebuild of a for-range statement. Don't
11116 /// attempt any typo-correction.
11118 /// Determining whether a for-range statement could be built. Avoid any
11119 /// unnecessary or irreversible actions.
11121 };
11122
11123 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11124 ///
11125 /// C++11 [stmt.ranged]:
11126 /// A range-based for statement is equivalent to
11127 ///
11128 /// {
11129 /// auto && __range = range-init;
11130 /// for ( auto __begin = begin-expr,
11131 /// __end = end-expr;
11132 /// __begin != __end;
11133 /// ++__begin ) {
11134 /// for-range-declaration = *__begin;
11135 /// statement
11136 /// }
11137 /// }
11138 ///
11139 /// The body of the loop is not available yet, since it cannot be analysed
11140 /// until we have determined the type of the for-range-declaration.
11142 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11143 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11144 SourceLocation RParenLoc, BuildForRangeKind Kind,
11145 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11146
11147 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11148 StmtResult BuildCXXForRangeStmt(
11149 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11150 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11151 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11152 BuildForRangeKind Kind,
11153 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11154
11155 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11156 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11157 /// body cannot be performed until after the type of the range variable is
11158 /// determined.
11159 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11160
11161 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11162 LabelDecl *TheDecl);
11163 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11164 SourceLocation StarLoc, Expr *DestExp);
11165 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11166 LabelDecl *Label, SourceLocation LabelLoc);
11167 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11168 LabelDecl *Label, SourceLocation LabelLoc);
11169
11170 void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope);
11171 void ActOnDeferStmtError(Scope *CurScope);
11172 StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope);
11173
11176
11179
11180 bool isMoveEligible() const { return S != None; };
11182 };
11184
11185 /// Determine whether the given expression might be move-eligible or
11186 /// copy-elidable in either a (co_)return statement or throw expression,
11187 /// without considering function return type, if applicable.
11188 ///
11189 /// \param E The expression being returned from the function or block,
11190 /// being thrown, or being co_returned from a coroutine. This expression
11191 /// might be modified by the implementation.
11192 ///
11193 /// \param Mode Overrides detection of current language mode
11194 /// and uses the rules for C++23.
11195 ///
11196 /// \returns An aggregate which contains the Candidate and isMoveEligible
11197 /// and isCopyElidable methods. If Candidate is non-null, it means
11198 /// isMoveEligible() would be true under the most permissive language
11199 /// standard.
11200 NamedReturnInfo getNamedReturnInfo(
11202
11203 /// Determine whether the given NRVO candidate variable is move-eligible or
11204 /// copy-elidable, without considering function return type.
11205 ///
11206 /// \param VD The NRVO candidate variable.
11207 ///
11208 /// \returns An aggregate which contains the Candidate and isMoveEligible
11209 /// and isCopyElidable methods. If Candidate is non-null, it means
11210 /// isMoveEligible() would be true under the most permissive language
11211 /// standard.
11212 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11213
11214 /// Updates given NamedReturnInfo's move-eligible and
11215 /// copy-elidable statuses, considering the function
11216 /// return type criteria as applicable to return statements.
11217 ///
11218 /// \param Info The NamedReturnInfo object to update.
11219 ///
11220 /// \param ReturnType This is the return type of the function.
11221 /// \returns The copy elision candidate, in case the initial return expression
11222 /// was copy elidable, or nullptr otherwise.
11223 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11224 QualType ReturnType);
11225
11226 /// Perform the initialization of a potentially-movable value, which
11227 /// is the result of return value.
11228 ///
11229 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11230 /// treat returned lvalues as rvalues in certain cases (to prefer move
11231 /// construction), then falls back to treating them as lvalues if that failed.
11234 const NamedReturnInfo &NRInfo, Expr *Value,
11235 bool SupressSimplerImplicitMoves = false);
11236
11238
11239 /// Deduce the return type for a function from a returned expression, per
11240 /// C++1y [dcl.spec.auto]p6.
11242 SourceLocation ReturnLoc, Expr *RetExpr,
11243 const AutoType *AT);
11244
11245 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11246 Scope *CurScope);
11247 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11248 bool AllowRecovery = false);
11249
11250 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11251 /// for capturing scopes.
11253 NamedReturnInfo &NRInfo,
11254 bool SupressSimplerImplicitMoves);
11255
11256 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11257 /// and creates a proper catch handler from them.
11259 Stmt *HandlerBlock);
11260
11261 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11262 /// handlers and creates a try statement from them.
11264 ArrayRef<Stmt *> Handlers);
11265
11266 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11267
11268 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11269 SourceLocation TryLoc, Stmt *TryBlock,
11270 Stmt *Handler);
11272 Stmt *Block);
11277
11279 bool IsIfExists,
11280 NestedNameSpecifierLoc QualifierLoc,
11281 DeclarationNameInfo NameInfo,
11282 Stmt *Nested);
11284 bool IsIfExists, CXXScopeSpec &SS,
11285 UnqualifiedId &Name, Stmt *Nested);
11286
11287 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11288 CapturedRegionKind Kind, unsigned NumParams);
11289 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11290 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11291 CapturedRegionKind Kind,
11293 unsigned OpenMPCaptureLevel = 0);
11297 SourceLocation Loc,
11298 unsigned NumParams);
11299
11300private:
11301 /// Check whether the given statement can have musttail applied to it,
11302 /// issuing a diagnostic and returning false if not.
11303 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11304
11305 /// Check if the given expression contains 'break' or 'continue'
11306 /// statement that produces control flow different from GCC.
11307 void CheckBreakContinueBinding(Expr *E);
11308
11309 ///@}
11310
11311 //
11312 //
11313 // -------------------------------------------------------------------------
11314 //
11315 //
11316
11317 /// \name `inline asm` Statement
11318 /// Implementations are in SemaStmtAsm.cpp
11319 ///@{
11320
11321public:
11322 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11323 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11324 bool IsVolatile, unsigned NumOutputs,
11325 unsigned NumInputs, IdentifierInfo **Names,
11326 MultiExprArg Constraints, MultiExprArg Exprs,
11327 Expr *AsmString, MultiExprArg Clobbers,
11328 unsigned NumLabels, SourceLocation RParenLoc);
11329
11331 llvm::InlineAsmIdentifierInfo &Info);
11333 SourceLocation TemplateKWLoc,
11334 UnqualifiedId &Id,
11335 bool IsUnevaluatedContext);
11336 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11337 SourceLocation AsmLoc);
11339 SourceLocation AsmLoc);
11341 ArrayRef<Token> AsmToks, StringRef AsmString,
11342 unsigned NumOutputs, unsigned NumInputs,
11343 ArrayRef<StringRef> Constraints,
11344 ArrayRef<StringRef> Clobbers,
11345 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11346 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11347 SourceLocation Location, bool AlwaysCreate);
11348
11349 ///@}
11350
11351 //
11352 //
11353 // -------------------------------------------------------------------------
11354 //
11355 //
11356
11357 /// \name Statement Attribute Handling
11358 /// Implementations are in SemaStmtAttr.cpp
11359 ///@{
11360
11361public:
11362 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11363 const AttributeCommonInfo &A);
11364 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11365 const AttributeCommonInfo &A);
11366
11367 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11369
11370 /// Process the attributes before creating an attributed statement. Returns
11371 /// the semantic attributes that have been processed.
11372 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11374
11376 SourceRange Range);
11378 const IdentifierInfo *AttrName,
11379 SourceRange Range);
11380
11381 ///@}
11382
11383 //
11384 //
11385 // -------------------------------------------------------------------------
11386 //
11387 //
11388
11389 /// \name C++ Templates
11390 /// Implementations are in SemaTemplate.cpp
11391 ///@{
11392
11393public:
11394 // Saves the current floating-point pragma stack and clear it in this Sema.
11396 public:
11398 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11399 S.FpPragmaStack.Stack.clear();
11400 }
11401 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11404
11405 private:
11406 Sema &S;
11408 };
11409
11411 CurFPFeatures = FPO;
11412 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11413 }
11414
11420
11425
11426 typedef llvm::MapVector<const FunctionDecl *,
11427 std::unique_ptr<LateParsedTemplate>>
11430
11431 /// Determine the number of levels of enclosing template parameters. This is
11432 /// only usable while parsing. Note that this does not include dependent
11433 /// contexts in which no template parameters have yet been declared, such as
11434 /// in a terse function template or generic lambda before the first 'auto' is
11435 /// encountered.
11436 unsigned getTemplateDepth(Scope *S) const;
11437
11439 bool AllowFunctionTemplates = true,
11440 bool AllowDependent = true);
11442 bool AllowFunctionTemplates = true,
11443 bool AllowDependent = true,
11444 bool AllowNonTemplateFunctions = false);
11445 /// Try to interpret the lookup result D as a template-name.
11446 ///
11447 /// \param D A declaration found by name lookup.
11448 /// \param AllowFunctionTemplates Whether function templates should be
11449 /// considered valid results.
11450 /// \param AllowDependent Whether unresolved using declarations (that might
11451 /// name templates) should be considered valid results.
11453 bool AllowFunctionTemplates = true,
11454 bool AllowDependent = true);
11455
11457 /// Whether and why a template name is required in this lookup.
11459 public:
11460 /// Template name is required if TemplateKWLoc is valid.
11462 : TemplateKW(TemplateKWLoc) {}
11463 /// Template name is unconditionally required.
11465
11467 return TemplateKW.value_or(SourceLocation());
11468 }
11469 bool hasTemplateKeyword() const {
11470 return getTemplateKeywordLoc().isValid();
11471 }
11472 bool isRequired() const { return TemplateKW != SourceLocation(); }
11473 explicit operator bool() const { return isRequired(); }
11474
11475 private:
11476 std::optional<SourceLocation> TemplateKW;
11477 };
11478
11480 /// This is not assumed to be a template name.
11482 /// This is assumed to be a template name because lookup found nothing.
11484 /// This is assumed to be a template name because lookup found one or more
11485 /// functions (but no function templates).
11487 };
11488
11489 bool
11491 QualType ObjectType, bool EnteringContext,
11492 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11493 AssumedTemplateKind *ATK = nullptr,
11494 bool AllowTypoCorrection = true);
11495
11497 bool hasTemplateKeyword,
11498 const UnqualifiedId &Name,
11499 ParsedType ObjectType, bool EnteringContext,
11501 bool &MemberOfUnknownSpecialization,
11502 bool Disambiguation = false);
11503
11504 /// Try to resolve an undeclared template name as a type template.
11505 ///
11506 /// Sets II to the identifier corresponding to the template name, and updates
11507 /// Name to a corresponding (typo-corrected) type template name and TNK to
11508 /// the corresponding kind, if possible.
11510 TemplateNameKind &TNK,
11511 SourceLocation NameLoc,
11512 IdentifierInfo *&II);
11513
11514 /// Determine whether a particular identifier might be the name in a C++1z
11515 /// deduction-guide declaration.
11516 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11517 SourceLocation NameLoc, CXXScopeSpec &SS,
11518 ParsedTemplateTy *Template = nullptr);
11519
11521 SourceLocation IILoc, Scope *S,
11522 const CXXScopeSpec *SS,
11523 TemplateTy &SuggestedTemplate,
11524 TemplateNameKind &SuggestedKind);
11525
11526 /// Determine whether we would be unable to instantiate this template (because
11527 /// it either has no definition, or is in the process of being instantiated).
11529 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11530 bool InstantiatedFromMember, const NamedDecl *Pattern,
11531 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11532 bool Complain = true, bool *Unreachable = nullptr);
11533
11534 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11535 /// that the template parameter 'PrevDecl' is being shadowed by a new
11536 /// declaration at location Loc. Returns true to indicate that this is
11537 /// an error, and false otherwise.
11538 ///
11539 /// \param Loc The location of the declaration that shadows a template
11540 /// parameter.
11541 ///
11542 /// \param PrevDecl The template parameter that the declaration shadows.
11543 ///
11544 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11545 /// a warning for compatibility with older versions of clang.
11546 /// Ignored when MSVC compatibility is enabled.
11548 bool SupportedForCompatibility = false);
11549
11550 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11551 /// the parameter D to reference the templated declaration and return a
11552 /// pointer to the template declaration. Otherwise, do nothing to D and return
11553 /// null.
11555
11556 /// ActOnTypeParameter - Called when a C++ template type parameter
11557 /// (e.g., "typename T") has been parsed. Typename specifies whether
11558 /// the keyword "typename" was used to declare the type parameter
11559 /// (otherwise, "class" was used), and KeyLoc is the location of the
11560 /// "class" or "typename" keyword. ParamName is the name of the
11561 /// parameter (NULL indicates an unnamed template parameter) and
11562 /// ParamNameLoc is the location of the parameter name (if any).
11563 /// If the type parameter has a default argument, it will be added
11564 /// later via ActOnTypeParameterDefault.
11566 SourceLocation EllipsisLoc,
11567 SourceLocation KeyLoc,
11568 IdentifierInfo *ParamName,
11569 SourceLocation ParamNameLoc, unsigned Depth,
11570 unsigned Position, SourceLocation EqualLoc,
11571 ParsedType DefaultArg, bool HasTypeConstraint);
11572
11574
11575 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11577 TemplateTypeParmDecl *ConstrainedParameter,
11578 SourceLocation EllipsisLoc);
11579 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11581 TemplateTypeParmDecl *ConstrainedParameter,
11582 SourceLocation EllipsisLoc,
11583 bool AllowUnexpandedPack);
11584
11585 /// Attach a type-constraint to a template parameter.
11586 /// \returns true if an error occurred. This can happen if the
11587 /// immediately-declared constraint could not be formed (e.g. incorrect number
11588 /// of arguments for the named concept).
11590 DeclarationNameInfo NameInfo,
11591 TemplateDecl *NamedConcept, NamedDecl *FoundDecl,
11592 const TemplateArgumentListInfo *TemplateArgs,
11593 TemplateTypeParmDecl *ConstrainedParameter,
11594 SourceLocation EllipsisLoc);
11595
11597 NonTypeTemplateParmDecl *NewConstrainedParm,
11598 NonTypeTemplateParmDecl *OrigConstrainedParm,
11599 SourceLocation EllipsisLoc);
11600
11601 /// Require the given type to be a structural type, and diagnose if it is not.
11602 ///
11603 /// \return \c true if an error was produced.
11605
11606 /// Check that the type of a non-type template parameter is
11607 /// well-formed.
11608 ///
11609 /// \returns the (possibly-promoted) parameter type if valid;
11610 /// otherwise, produces a diagnostic and returns a NULL type.
11612 SourceLocation Loc);
11614
11616 unsigned Depth, unsigned Position,
11617 SourceLocation EqualLoc,
11618 Expr *DefaultArg);
11619
11620 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11621 /// parameter (e.g. T in template <template <typename> class T> class array)
11622 /// has been parsed. S is the current scope.
11624 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11625 bool TypenameKeyword, TemplateParameterList *Params,
11626 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11627 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11628 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11629
11630 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11631 /// constrained by RequiresClause, that contains the template parameters in
11632 /// Params.
11634 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11635 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11636 SourceLocation RAngleLoc, Expr *RequiresClause);
11637
11638 /// The context in which we are checking a template parameter list.
11640 // For this context, Class, Variable, TypeAlias, and non-pack Template
11641 // Template Parameters are treated uniformly.
11643
11650 };
11651
11652 /// Checks the validity of a template parameter list, possibly
11653 /// considering the template parameter list from a previous
11654 /// declaration.
11655 ///
11656 /// If an "old" template parameter list is provided, it must be
11657 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11658 /// template parameter list.
11659 ///
11660 /// \param NewParams Template parameter list for a new template
11661 /// declaration. This template parameter list will be updated with any
11662 /// default arguments that are carried through from the previous
11663 /// template parameter list.
11664 ///
11665 /// \param OldParams If provided, template parameter list from a
11666 /// previous declaration of the same template. Default template
11667 /// arguments will be merged from the old template parameter list to
11668 /// the new template parameter list.
11669 ///
11670 /// \param TPC Describes the context in which we are checking the given
11671 /// template parameter list.
11672 ///
11673 /// \param SkipBody If we might have already made a prior merged definition
11674 /// of this template visible, the corresponding body-skipping information.
11675 /// Default argument redefinition is not an error when skipping such a body,
11676 /// because (under the ODR) we can assume the default arguments are the same
11677 /// as the prior merged definition.
11678 ///
11679 /// \returns true if an error occurred, false otherwise.
11681 TemplateParameterList *OldParams,
11683 SkipBodyInfo *SkipBody = nullptr);
11684
11685 /// Match the given template parameter lists to the given scope
11686 /// specifier, returning the template parameter list that applies to the
11687 /// name.
11688 ///
11689 /// \param DeclStartLoc the start of the declaration that has a scope
11690 /// specifier or a template parameter list.
11691 ///
11692 /// \param DeclLoc The location of the declaration itself.
11693 ///
11694 /// \param SS the scope specifier that will be matched to the given template
11695 /// parameter lists. This scope specifier precedes a qualified name that is
11696 /// being declared.
11697 ///
11698 /// \param TemplateId The template-id following the scope specifier, if there
11699 /// is one. Used to check for a missing 'template<>'.
11700 ///
11701 /// \param ParamLists the template parameter lists, from the outermost to the
11702 /// innermost template parameter lists.
11703 ///
11704 /// \param IsFriend Whether to apply the slightly different rules for
11705 /// matching template parameters to scope specifiers in friend
11706 /// declarations.
11707 ///
11708 /// \param IsMemberSpecialization will be set true if the scope specifier
11709 /// denotes a fully-specialized type, and therefore this is a declaration of
11710 /// a member specialization.
11711 ///
11712 /// \returns the template parameter list, if any, that corresponds to the
11713 /// name that is preceded by the scope specifier @p SS. This template
11714 /// parameter list may have template parameters (if we're declaring a
11715 /// template) or may have no template parameters (if we're declaring a
11716 /// template specialization), or may be NULL (if what we're declaring isn't
11717 /// itself a template).
11719 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11720 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11721 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11722 bool &IsMemberSpecialization, bool &Invalid,
11723 bool SuppressDiagnostic = false);
11724
11725 /// Returns the template parameter list with all default template argument
11726 /// information.
11728
11730 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11731 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11732 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11733 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11734 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11735 TemplateParameterList **OuterTemplateParamLists,
11736 SkipBodyInfo *SkipBody = nullptr);
11737
11738 /// Translates template arguments as provided by the parser
11739 /// into template arguments used by semantic analysis.
11742
11743 /// Convert a parsed type into a parsed template argument. This is mostly
11744 /// trivial, except that we may have parsed a C++17 deduced class template
11745 /// specialization type, in which case we should form a template template
11746 /// argument instead of a type template argument.
11748
11750
11753 SourceLocation TemplateLoc,
11754 TemplateArgumentListInfo &TemplateArgs,
11755 Scope *Scope, bool ForNestedNameSpecifier);
11756
11758 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11759 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11760 SourceLocation TemplateKWLoc, TemplateTy Template,
11761 const IdentifierInfo *TemplateII,
11762 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11763 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11764 bool IsCtorOrDtorName = false, bool IsClassName = false,
11765 ImplicitTypenameContext AllowImplicitTypename =
11767
11768 /// Parsed an elaborated-type-specifier that refers to a template-id,
11769 /// such as \c class T::template apply<U>.
11771 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11772 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11773 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11774 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11775
11778 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11780
11781 /// Get the specialization of the given variable template corresponding to
11782 /// the specified argument list, or a null-but-valid result if the arguments
11783 /// are dependent.
11785 SourceLocation TemplateLoc,
11786 SourceLocation TemplateNameLoc,
11787 const TemplateArgumentListInfo &TemplateArgs,
11788 bool SetWrittenArgs);
11789
11790 /// Form a reference to the specialization of the given variable template
11791 /// corresponding to the specified argument list, or a null-but-valid result
11792 /// if the arguments are dependent.
11794 const DeclarationNameInfo &NameInfo,
11796 SourceLocation TemplateLoc,
11797 const TemplateArgumentListInfo *TemplateArgs);
11798
11800 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
11802 const TemplateArgumentListInfo *TemplateArgs);
11803
11805 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11806 const DeclarationNameInfo &ConceptNameInfo,
11807 NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11808 const TemplateArgumentListInfo *TemplateArgs,
11809 bool DoCheckConstraintSatisfaction = true);
11810
11813 bool TemplateKeyword, TemplateDecl *TD,
11814 SourceLocation Loc);
11815
11817 SourceLocation TemplateKWLoc, LookupResult &R,
11818 bool RequiresADL,
11819 const TemplateArgumentListInfo *TemplateArgs);
11820
11821 // We actually only call this from template instantiation.
11824 const DeclarationNameInfo &NameInfo,
11825 const TemplateArgumentListInfo *TemplateArgs,
11826 bool IsAddressOfOperand);
11827
11829 return Pack.pack_size() - 1 - *ArgPackSubstIndex;
11830 }
11831
11834 Arg = Arg.pack_elements()[*ArgPackSubstIndex];
11835 if (Arg.isPackExpansion())
11836 Arg = Arg.getPackExpansionPattern();
11837 return Arg;
11838 }
11839
11841 Decl *AssociatedDecl, const NonTypeTemplateParmDecl *NTTP,
11842 SourceLocation loc, TemplateArgument Replacement,
11843 UnsignedOrNone PackIndex, bool Final);
11844
11845 /// Form a template name from a name that is syntactically required to name a
11846 /// template, either due to use of the 'template' keyword or because a name in
11847 /// this syntactic context is assumed to name a template (C++
11848 /// [temp.names]p2-4).
11849 ///
11850 /// This action forms a template name given the name of the template and its
11851 /// optional scope specifier. This is used when the 'template' keyword is used
11852 /// or when the parsing context unambiguously treats a following '<' as
11853 /// introducing a template argument list. Note that this may produce a
11854 /// non-dependent template name if we can perform the lookup now and identify
11855 /// the named template.
11856 ///
11857 /// For example, given "x.MetaFun::template apply", the scope specifier
11858 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11859 /// of the "template" keyword, and "apply" is the \p Name.
11861 SourceLocation TemplateKWLoc,
11862 const UnqualifiedId &Name,
11863 ParsedType ObjectType,
11864 bool EnteringContext, TemplateTy &Template,
11865 bool AllowInjectedClassName = false);
11866
11868 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11869 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11871 MultiTemplateParamsArg TemplateParameterLists,
11872 SkipBodyInfo *SkipBody = nullptr);
11873
11874 /// Check the non-type template arguments of a class template
11875 /// partial specialization according to C++ [temp.class.spec]p9.
11876 ///
11877 /// \param TemplateNameLoc the location of the template name.
11878 /// \param PrimaryTemplate the template parameters of the primary class
11879 /// template.
11880 /// \param NumExplicit the number of explicitly-specified template arguments.
11881 /// \param TemplateArgs the template arguments of the class template
11882 /// partial specialization.
11883 ///
11884 /// \returns \c true if there was an error, \c false otherwise.
11886 TemplateDecl *PrimaryTemplate,
11887 unsigned NumExplicitArgs,
11893
11895 MultiTemplateParamsArg TemplateParameterLists,
11896 Declarator &D);
11897
11898 /// Diagnose cases where we have an explicit template specialization
11899 /// before/after an explicit template instantiation, producing diagnostics
11900 /// for those cases where they are required and determining whether the
11901 /// new specialization/instantiation will have any effect.
11902 ///
11903 /// \param NewLoc the location of the new explicit specialization or
11904 /// instantiation.
11905 ///
11906 /// \param NewTSK the kind of the new explicit specialization or
11907 /// instantiation.
11908 ///
11909 /// \param PrevDecl the previous declaration of the entity.
11910 ///
11911 /// \param PrevTSK the kind of the old explicit specialization or
11912 /// instantiatin.
11913 ///
11914 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11915 /// declaration was instantiated (either implicitly or explicitly).
11916 ///
11917 /// \param HasNoEffect will be set to true to indicate that the new
11918 /// specialization or instantiation has no effect and should be ignored.
11919 ///
11920 /// \returns true if there was an error that should prevent the introduction
11921 /// of the new declaration into the AST, false otherwise.
11923 SourceLocation NewLoc,
11924 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11925 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11926 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11927
11928 /// Perform semantic analysis for the given dependent function
11929 /// template specialization.
11930 ///
11931 /// The only possible way to get a dependent function template specialization
11932 /// is with a friend declaration, like so:
11933 ///
11934 /// \code
11935 /// template <class T> void foo(T);
11936 /// template <class T> class A {
11937 /// friend void foo<>(T);
11938 /// };
11939 /// \endcode
11940 ///
11941 /// There really isn't any useful analysis we can do here, so we
11942 /// just store the information.
11944 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11946
11947 /// Perform semantic analysis for the given function template
11948 /// specialization.
11949 ///
11950 /// This routine performs all of the semantic analysis required for an
11951 /// explicit function template specialization. On successful completion,
11952 /// the function declaration \p FD will become a function template
11953 /// specialization.
11954 ///
11955 /// \param FD the function declaration, which will be updated to become a
11956 /// function template specialization.
11957 ///
11958 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11959 /// if any. Note that this may be valid info even when 0 arguments are
11960 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11961 /// as it anyway contains info on the angle brackets locations.
11962 ///
11963 /// \param Previous the set of declarations that may be specialized by
11964 /// this function specialization.
11965 ///
11966 /// \param QualifiedFriend whether this is a lookup for a qualified friend
11967 /// declaration with no explicit template argument list that might be
11968 /// befriending a function template specialization.
11970 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
11971 LookupResult &Previous, bool QualifiedFriend = false);
11972
11973 /// Perform semantic analysis for the given non-template member
11974 /// specialization.
11975 ///
11976 /// This routine performs all of the semantic analysis required for an
11977 /// explicit member function specialization. On successful completion,
11978 /// the function declaration \p FD will become a member function
11979 /// specialization.
11980 ///
11981 /// \param Member the member declaration, which will be updated to become a
11982 /// specialization.
11983 ///
11984 /// \param Previous the set of declarations, one of which may be specialized
11985 /// by this function specialization; the set will be modified to contain the
11986 /// redeclared member.
11989
11990 // Explicit instantiation of a class template specialization
11992 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
11993 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
11994 TemplateTy Template, SourceLocation TemplateNameLoc,
11995 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
11996 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
11997
11998 // Explicit instantiation of a member class of a class template.
12000 SourceLocation TemplateLoc,
12001 unsigned TagSpec, SourceLocation KWLoc,
12002 CXXScopeSpec &SS, IdentifierInfo *Name,
12003 SourceLocation NameLoc,
12004 const ParsedAttributesView &Attr);
12005
12007 SourceLocation TemplateLoc,
12008 Declarator &D);
12009
12010 /// If the given template parameter has a default template
12011 /// argument, substitute into that default template argument and
12012 /// return the corresponding template argument.
12014 TemplateDecl *Template, SourceLocation TemplateKWLoc,
12015 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
12016 ArrayRef<TemplateArgument> SugaredConverted,
12017 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
12018
12019 /// Returns the top most location responsible for the definition of \p N.
12020 /// If \p N is a a template specialization, this is the location
12021 /// of the top of the instantiation stack.
12022 /// Otherwise, the location of \p N is returned.
12024
12025 /// Specifies the context in which a particular template
12026 /// argument is being checked.
12028 /// The template argument was specified in the code or was
12029 /// instantiated with some deduced template arguments.
12031
12032 /// The template argument was deduced via template argument
12033 /// deduction.
12035
12036 /// The template argument was deduced from an array bound
12037 /// via template argument deduction.
12039 };
12040
12048
12049 /// The checked, converted argument will be added to the
12050 /// end of these vectors.
12052
12053 /// The check is being performed in the context of partial ordering.
12055
12056 /// If true, assume these template arguments are
12057 /// the injected template arguments for a template template parameter.
12058 /// This will relax the requirement that all its possible uses are valid:
12059 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
12060 /// during instantiation.
12062
12063 /// Is set to true when, in the context of TTP matching, a pack parameter
12064 /// matches non-pack arguments.
12065 bool StrictPackMatch = false;
12066 };
12067
12068 /// Check that the given template argument corresponds to the given
12069 /// template parameter.
12070 ///
12071 /// \param Param The template parameter against which the argument will be
12072 /// checked.
12073 ///
12074 /// \param Arg The template argument, which may be updated due to conversions.
12075 ///
12076 /// \param Template The template in which the template argument resides.
12077 ///
12078 /// \param TemplateLoc The location of the template name for the template
12079 /// whose argument list we're matching.
12080 ///
12081 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
12082 /// the template argument list.
12083 ///
12084 /// \param ArgumentPackIndex The index into the argument pack where this
12085 /// argument will be placed. Only valid if the parameter is a parameter pack.
12086 ///
12087 /// \param CTAK Describes how we arrived at this particular template argument:
12088 /// explicitly written, deduced, etc.
12089 ///
12090 /// \returns true on error, false otherwise.
12092 NamedDecl *Template, SourceLocation TemplateLoc,
12093 SourceLocation RAngleLoc,
12094 unsigned ArgumentPackIndex,
12097
12098 /// Check that the given template arguments can be provided to
12099 /// the given template, converting the arguments along the way.
12100 ///
12101 /// \param Template The template to which the template arguments are being
12102 /// provided.
12103 ///
12104 /// \param TemplateLoc The location of the template name in the source.
12105 ///
12106 /// \param TemplateArgs The list of template arguments. If the template is
12107 /// a template template parameter, this function may extend the set of
12108 /// template arguments to also include substituted, defaulted template
12109 /// arguments.
12110 ///
12111 /// \param PartialTemplateArgs True if the list of template arguments is
12112 /// intentionally partial, e.g., because we're checking just the initial
12113 /// set of template arguments.
12114 ///
12115 /// \param Converted Will receive the converted, canonicalized template
12116 /// arguments.
12117 ///
12118 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
12119 /// contain the converted forms of the template arguments as written.
12120 /// Otherwise, \p TemplateArgs will not be modified.
12121 ///
12122 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
12123 /// receive true if the cause for the error is the associated constraints of
12124 /// the template not being satisfied by the template arguments.
12125 ///
12126 /// \param DefaultArgs any default arguments from template specialization
12127 /// deduction.
12128 ///
12129 /// \returns true if an error occurred, false otherwise.
12131 SourceLocation TemplateLoc,
12132 TemplateArgumentListInfo &TemplateArgs,
12133 const DefaultArguments &DefaultArgs,
12134 bool PartialTemplateArgs,
12136 bool UpdateArgsWithConversions = true,
12137 bool *ConstraintsNotSatisfied = nullptr);
12138
12141 SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12142 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12143 CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12144 bool *ConstraintsNotSatisfied = nullptr);
12145
12148 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12149 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12150
12151 /// Check a template argument against its corresponding
12152 /// template type parameter.
12153 ///
12154 /// This routine implements the semantics of C++ [temp.arg.type]. It
12155 /// returns true if an error occurred, and false otherwise.
12157
12158 /// Check a template argument against its corresponding
12159 /// non-type template parameter.
12160 ///
12161 /// This routine implements the semantics of C++ [temp.arg.nontype].
12162 /// If an error occurred, it returns ExprError(); otherwise, it
12163 /// returns the converted template argument. \p ParamType is the
12164 /// type of the non-type template parameter after it has been instantiated.
12166 QualType InstantiatedParamType, Expr *Arg,
12167 TemplateArgument &SugaredConverted,
12168 TemplateArgument &CanonicalConverted,
12169 bool StrictCheck,
12171
12172 /// Check a template argument against its corresponding
12173 /// template template parameter.
12174 ///
12175 /// This routine implements the semantics of C++ [temp.arg.template].
12176 /// It returns true if an error occurred, and false otherwise.
12178 TemplateParameterList *Params,
12180 bool PartialOrdering,
12181 bool *StrictPackMatch);
12182
12185 const TemplateArgumentLoc &Arg);
12186
12188 std::optional<SourceRange> ParamRange = {});
12190
12191 /// Given a non-type template argument that refers to a
12192 /// declaration and the type of its corresponding non-type template
12193 /// parameter, produce an expression that properly refers to that
12194 /// declaration.
12195 /// FIXME: This is used in some contexts where the resulting expression
12196 /// doesn't need to live too long. It would be useful if this function
12197 /// could return a temporary expression.
12199 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
12200 NamedDecl *TemplateParam = nullptr);
12203 SourceLocation Loc);
12204
12205 /// Enumeration describing how template parameter lists are compared
12206 /// for equality.
12208 /// We are matching the template parameter lists of two templates
12209 /// that might be redeclarations.
12210 ///
12211 /// \code
12212 /// template<typename T> struct X;
12213 /// template<typename T> struct X;
12214 /// \endcode
12216
12217 /// We are matching the template parameter lists of two template
12218 /// template parameters as part of matching the template parameter lists
12219 /// of two templates that might be redeclarations.
12220 ///
12221 /// \code
12222 /// template<template<int I> class TT> struct X;
12223 /// template<template<int Value> class Other> struct X;
12224 /// \endcode
12226
12227 /// We are determining whether the template-parameters are equivalent
12228 /// according to C++ [temp.over.link]/6. This comparison does not consider
12229 /// constraints.
12230 ///
12231 /// \code
12232 /// template<C1 T> void f(T);
12233 /// template<C2 T> void f(T);
12234 /// \endcode
12236 };
12237
12238 // A struct to represent the 'new' declaration, which is either itself just
12239 // the named decl, or the important information we need about it in order to
12240 // do constraint comparisons.
12242 const NamedDecl *ND = nullptr;
12243 const DeclContext *DC = nullptr;
12244 const DeclContext *LexicalDC = nullptr;
12245 SourceLocation Loc;
12246
12247 public:
12250 const DeclContext *LexicalDeclCtx,
12251 SourceLocation Loc)
12252
12253 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12254 assert(DC && LexicalDC &&
12255 "Constructor only for cases where we have the information to put "
12256 "in here");
12257 }
12258
12259 // If this was constructed with no information, we cannot do substitution
12260 // for constraint comparison, so make sure we can check that.
12261 bool isInvalid() const { return !ND && !DC; }
12262
12263 const NamedDecl *getDecl() const { return ND; }
12264
12265 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12266
12268 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12269 }
12270
12272 return ND ? ND->getDeclContext() : DC;
12273 }
12274
12275 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12276 };
12277
12278 /// Determine whether the given template parameter lists are
12279 /// equivalent.
12280 ///
12281 /// \param New The new template parameter list, typically written in the
12282 /// source code as part of a new template declaration.
12283 ///
12284 /// \param Old The old template parameter list, typically found via
12285 /// name lookup of the template declared with this template parameter
12286 /// list.
12287 ///
12288 /// \param Complain If true, this routine will produce a diagnostic if
12289 /// the template parameter lists are not equivalent.
12290 ///
12291 /// \param Kind describes how we are to match the template parameter lists.
12292 ///
12293 /// \param TemplateArgLoc If this source location is valid, then we
12294 /// are actually checking the template parameter list of a template
12295 /// argument (New) against the template parameter list of its
12296 /// corresponding template template parameter (Old). We produce
12297 /// slightly different diagnostics in this scenario.
12298 ///
12299 /// \returns True if the template parameter lists are equal, false
12300 /// otherwise.
12302 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12303 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12305 SourceLocation TemplateArgLoc = SourceLocation());
12306
12308 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12310 SourceLocation TemplateArgLoc = SourceLocation()) {
12311 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12312 Kind, TemplateArgLoc);
12313 }
12314
12315 /// Check whether a template can be declared within this scope.
12316 ///
12317 /// If the template declaration is valid in this scope, returns
12318 /// false. Otherwise, issues a diagnostic and returns true.
12319 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12320
12321 /// Called when the parser has parsed a C++ typename
12322 /// specifier, e.g., "typename T::type".
12323 ///
12324 /// \param S The scope in which this typename type occurs.
12325 /// \param TypenameLoc the location of the 'typename' keyword
12326 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12327 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12328 /// \param IdLoc the location of the identifier.
12329 /// \param IsImplicitTypename context where T::type refers to a type.
12331 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12332 const IdentifierInfo &II, SourceLocation IdLoc,
12334
12335 /// Called when the parser has parsed a C++ typename
12336 /// specifier that ends in a template-id, e.g.,
12337 /// "typename MetaFun::template apply<T1, T2>".
12338 ///
12339 /// \param S The scope in which this typename type occurs.
12340 /// \param TypenameLoc the location of the 'typename' keyword
12341 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12342 /// \param TemplateLoc the location of the 'template' keyword, if any.
12343 /// \param TemplateName The template name.
12344 /// \param TemplateII The identifier used to name the template.
12345 /// \param TemplateIILoc The location of the template name.
12346 /// \param LAngleLoc The location of the opening angle bracket ('<').
12347 /// \param TemplateArgs The template arguments.
12348 /// \param RAngleLoc The location of the closing angle bracket ('>').
12350 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12351 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12352 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12353 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12354 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12355
12357 SourceLocation KeywordLoc,
12358 NestedNameSpecifierLoc QualifierLoc,
12359 const IdentifierInfo &II, SourceLocation IILoc,
12360 TypeSourceInfo **TSI, bool DeducedTSTContext);
12361
12363 SourceLocation KeywordLoc,
12364 NestedNameSpecifierLoc QualifierLoc,
12365 const IdentifierInfo &II, SourceLocation IILoc,
12366 bool DeducedTSTContext = true);
12367
12368 /// Rebuilds a type within the context of the current instantiation.
12369 ///
12370 /// The type \p T is part of the type of an out-of-line member definition of
12371 /// a class template (or class template partial specialization) that was
12372 /// parsed and constructed before we entered the scope of the class template
12373 /// (or partial specialization thereof). This routine will rebuild that type
12374 /// now that we have entered the declarator's scope, which may produce
12375 /// different canonical types, e.g.,
12376 ///
12377 /// \code
12378 /// template<typename T>
12379 /// struct X {
12380 /// typedef T* pointer;
12381 /// pointer data();
12382 /// };
12383 ///
12384 /// template<typename T>
12385 /// typename X<T>::pointer X<T>::data() { ... }
12386 /// \endcode
12387 ///
12388 /// Here, the type "typename X<T>::pointer" will be created as a
12389 /// DependentNameType, since we do not know that we can look into X<T> when we
12390 /// parsed the type. This function will rebuild the type, performing the
12391 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12392 /// canonical type is the same as the canonical type of T*, allowing the
12393 /// return types of the out-of-line definition and the declaration to match.
12395 SourceLocation Loc,
12396 DeclarationName Name);
12398
12400
12401 /// Rebuild the template parameters now that we know we're in a current
12402 /// instantiation.
12403 bool
12405
12406 /// Produces a formatted string that describes the binding of
12407 /// template parameters to template arguments.
12408 std::string
12410 const TemplateArgumentList &Args);
12411
12412 std::string
12414 const TemplateArgument *Args,
12415 unsigned NumArgs);
12416
12420
12421 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12422 /// was just parsed. This is only possible with an explicit scope
12423 /// specifier naming a dependent type.
12425 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12426 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12427 const TemplateArgumentListInfo *TemplateArgs);
12428
12431 SourceLocation TemplateKWLoc,
12432 const DeclarationNameInfo &NameInfo,
12433 const TemplateArgumentListInfo *TemplateArgs);
12434
12435 // Calculates whether the expression Constraint depends on an enclosing
12436 // template, for the purposes of [temp.friend] p9.
12437 // TemplateDepth is the 'depth' of the friend function, which is used to
12438 // compare whether a declaration reference is referring to a containing
12439 // template, or just the current friend function. A 'lower' TemplateDepth in
12440 // the AST refers to a 'containing' template. As the constraint is
12441 // uninstantiated, this is relative to the 'top' of the TU.
12442 bool
12444 unsigned TemplateDepth,
12445 const Expr *Constraint);
12446
12447 /// Find the failed Boolean condition within a given Boolean
12448 /// constant expression, and describe it with a string.
12449 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12450
12452
12454 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12455 const IdentifierInfo *Name, SourceLocation NameLoc);
12456
12458 Expr *ConstraintExpr,
12459 const ParsedAttributesView &Attrs);
12460
12462 bool &AddToScope);
12464
12465 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12466 const CXXScopeSpec &SS,
12467 const IdentifierInfo *Name,
12468 SourceLocation TagLoc, SourceLocation NameLoc);
12469
12471 CachedTokens &Toks);
12474
12475 /// We've found a use of a templated declaration that would trigger an
12476 /// implicit instantiation. Check that any relevant explicit specializations
12477 /// and partial specializations are visible/reachable, and diagnose if not.
12480
12481 ///@}
12482
12483 //
12484 //
12485 // -------------------------------------------------------------------------
12486 //
12487 //
12488
12489 /// \name C++ Template Argument Deduction
12490 /// Implementations are in SemaTemplateDeduction.cpp
12491 ///@{
12492
12493public:
12494 class SFINAETrap;
12495
12498 : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {}
12499
12500 protected:
12502 ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; }
12505
12506 private:
12507 SFINAETrap *Prev;
12508 };
12509
12513
12514 /// RAII class used to determine whether SFINAE has
12515 /// trapped any errors that occur during template argument
12516 /// deduction.
12517 class SFINAETrap : SFINAEContextBase {
12518 bool HasErrorOcurred = false;
12519 bool WithAccessChecking = false;
12520 bool PrevLastDiagnosticIgnored =
12521 S.getDiagnostics().isLastDiagnosticIgnored();
12522 sema::TemplateDeductionInfo *DeductionInfo = nullptr;
12523
12524 SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info,
12525 bool WithAccessChecking)
12526 : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking),
12527 DeductionInfo(Info) {}
12528
12529 public:
12530 /// \param WithAccessChecking If true, discard all diagnostics (from the
12531 /// immediate context) instead of adding them to the currently active
12532 /// \ref TemplateDeductionInfo.
12533 explicit SFINAETrap(Sema &S, bool WithAccessChecking = false)
12534 : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {}
12535
12537 : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {}
12538
12540 S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored);
12541 }
12542
12543 SFINAETrap(const SFINAETrap &) = delete;
12544 SFINAETrap &operator=(const SFINAETrap &) = delete;
12545
12547 return DeductionInfo;
12548 }
12549
12550 /// Determine whether any SFINAE errors have been trapped.
12551 bool hasErrorOccurred() const { return HasErrorOcurred; }
12552 void setErrorOccurred() { HasErrorOcurred = true; }
12553
12554 bool withAccessChecking() const { return WithAccessChecking; }
12555 };
12556
12557 /// RAII class used to indicate that we are performing provisional
12558 /// semantic analysis to determine the validity of a construct, so
12559 /// typo-correction and diagnostics in the immediate context (not within
12560 /// implicitly-instantiated templates) should be suppressed.
12562 Sema &SemaRef;
12563 // FIXME: Using a SFINAETrap for this is a hack.
12564 SFINAETrap Trap;
12565 bool PrevDisableTypoCorrection;
12566
12567 public:
12568 explicit TentativeAnalysisScope(Sema &SemaRef)
12569 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12570 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12571 SemaRef.DisableTypoCorrection = true;
12572 }
12574 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12575 }
12576
12579 };
12580
12581 /// For each declaration that involved template argument deduction, the
12582 /// set of diagnostics that were suppressed during that template argument
12583 /// deduction.
12584 ///
12585 /// FIXME: Serialize this structure to the AST file.
12586 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12589
12590 /// Compare types for equality with respect to possibly compatible
12591 /// function types (noreturn adjustment, implicit calling conventions). If any
12592 /// of parameter and argument is not a function, just perform type comparison.
12593 ///
12594 /// \param P the template parameter type.
12595 ///
12596 /// \param A the argument type.
12598
12599 /// Allocate a TemplateArgumentLoc where all locations have
12600 /// been initialized to the given location.
12601 ///
12602 /// \param Arg The template argument we are producing template argument
12603 /// location information for.
12604 ///
12605 /// \param NTTPType For a declaration template argument, the type of
12606 /// the non-type template parameter that corresponds to this template
12607 /// argument. Can be null if no type sugar is available to add to the
12608 /// type from the template argument.
12609 ///
12610 /// \param Loc The source location to use for the resulting template
12611 /// argument.
12614 SourceLocation Loc,
12615 NamedDecl *TemplateParam = nullptr);
12616
12617 /// Get a template argument mapping the given template parameter to itself,
12618 /// e.g. for X in \c template<int X>, this would return an expression template
12619 /// argument referencing X.
12621 SourceLocation Location);
12622
12623 /// Adjust the type \p ArgFunctionType to match the calling convention,
12624 /// noreturn, and optionally the exception specification of \p FunctionType.
12625 /// Deduction often wants to ignore these properties when matching function
12626 /// types.
12628 bool AdjustExceptionSpec = false);
12629
12632 ArrayRef<TemplateArgument> TemplateArgs,
12634
12637 ArrayRef<TemplateArgument> TemplateArgs,
12639
12640 /// Deduce the template arguments of the given template from \p FromType.
12641 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12642 /// [over.match.class.deduct]p4.
12643 ///
12644 /// It only supports class or type alias templates.
12648
12653 bool NumberOfArgumentsMustMatch);
12654
12655 /// Substitute the explicitly-provided template arguments into the
12656 /// given function template according to C++ [temp.arg.explicit].
12657 ///
12658 /// \param FunctionTemplate the function template into which the explicit
12659 /// template arguments will be substituted.
12660 ///
12661 /// \param ExplicitTemplateArgs the explicitly-specified template
12662 /// arguments.
12663 ///
12664 /// \param Deduced the deduced template arguments, which will be populated
12665 /// with the converted and checked explicit template arguments.
12666 ///
12667 /// \param ParamTypes will be populated with the instantiated function
12668 /// parameters.
12669 ///
12670 /// \param FunctionType if non-NULL, the result type of the function template
12671 /// will also be instantiated and the pointed-to value will be updated with
12672 /// the instantiated function type.
12673 ///
12674 /// \param Info if substitution fails for any reason, this object will be
12675 /// populated with more information about the failure.
12676 ///
12677 /// \returns TemplateDeductionResult::Success if substitution was successful,
12678 /// or some failure condition.
12681 TemplateArgumentListInfo &ExplicitTemplateArgs,
12685
12686 /// brief A function argument from which we performed template argument
12687 // deduction for a call.
12700
12701 /// Finish template argument deduction for a function template,
12702 /// checking the deduced template arguments for completeness and forming
12703 /// the function template specialization.
12704 ///
12705 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12706 /// which the deduced argument types should be compared.
12707 /// \param CheckNonDependent Callback before substituting into the declaration
12708 /// with the deduced template arguments.
12709 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12710 /// some breakages introduced by CWG2369, where non-user-defined conversions
12711 /// are checked first before the constraints.
12715 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12717 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12718 bool PartialOverloading, bool PartialOrdering,
12719 bool ForOverloadSetAddressResolution,
12720 llvm::function_ref<bool(bool)> CheckNonDependent =
12721 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12722 return false;
12723 });
12724
12725 /// Perform template argument deduction from a function call
12726 /// (C++ [temp.deduct.call]).
12727 ///
12728 /// \param FunctionTemplate the function template for which we are performing
12729 /// template argument deduction.
12730 ///
12731 /// \param ExplicitTemplateArgs the explicit template arguments provided
12732 /// for this call.
12733 ///
12734 /// \param Args the function call arguments
12735 ///
12736 /// \param Specialization if template argument deduction was successful,
12737 /// this will be set to the function template specialization produced by
12738 /// template argument deduction.
12739 ///
12740 /// \param Info the argument will be updated to provide additional information
12741 /// about template argument deduction.
12742 ///
12743 /// \param CheckNonDependent A callback to invoke to check conversions for
12744 /// non-dependent parameters, between deduction and substitution, per DR1391.
12745 /// If this returns true, substitution will be skipped and we return
12746 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12747 /// passed the parameter types (after substituting explicit template
12748 /// arguments).
12749 ///
12750 /// \returns the result of template argument deduction.
12753 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12755 bool PartialOverloading, bool AggregateDeductionCandidate,
12756 bool PartialOrdering, QualType ObjectType,
12757 Expr::Classification ObjectClassification,
12758 bool ForOverloadSetAddressResolution,
12759 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12760
12761 /// Deduce template arguments when taking the address of a function
12762 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12763 /// a template.
12764 ///
12765 /// \param FunctionTemplate the function template for which we are performing
12766 /// template argument deduction.
12767 ///
12768 /// \param ExplicitTemplateArgs the explicitly-specified template
12769 /// arguments.
12770 ///
12771 /// \param ArgFunctionType the function type that will be used as the
12772 /// "argument" type (A) when performing template argument deduction from the
12773 /// function template's function type. This type may be NULL, if there is no
12774 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12775 ///
12776 /// \param Specialization if template argument deduction was successful,
12777 /// this will be set to the function template specialization produced by
12778 /// template argument deduction.
12779 ///
12780 /// \param Info the argument will be updated to provide additional information
12781 /// about template argument deduction.
12782 ///
12783 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12784 /// the address of a function template per [temp.deduct.funcaddr] and
12785 /// [over.over]. If \c false, we are looking up a function template
12786 /// specialization based on its signature, per [temp.deduct.decl].
12787 ///
12788 /// \returns the result of template argument deduction.
12791 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12793 bool IsAddressOfFunction = false);
12794
12795 /// Deduce template arguments for a templated conversion
12796 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12797 /// conversion function template specialization.
12800 Expr::Classification ObjectClassification, QualType ToType,
12802
12803 /// Deduce template arguments for a function template when there is
12804 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12805 ///
12806 /// \param FunctionTemplate the function template for which we are performing
12807 /// template argument deduction.
12808 ///
12809 /// \param ExplicitTemplateArgs the explicitly-specified template
12810 /// arguments.
12811 ///
12812 /// \param Specialization if template argument deduction was successful,
12813 /// this will be set to the function template specialization produced by
12814 /// template argument deduction.
12815 ///
12816 /// \param Info the argument will be updated to provide additional information
12817 /// about template argument deduction.
12818 ///
12819 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12820 /// the address of a function template in a context where we do not have a
12821 /// target type, per [over.over]. If \c false, we are looking up a function
12822 /// template specialization based on its signature, which only happens when
12823 /// deducing a function parameter type from an argument that is a template-id
12824 /// naming a function template specialization.
12825 ///
12826 /// \returns the result of template argument deduction.
12829 TemplateArgumentListInfo *ExplicitTemplateArgs,
12832 bool IsAddressOfFunction = false);
12833
12834 /// Substitute Replacement for \p auto in \p TypeWithAuto
12835 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12836 /// Substitute Replacement for auto in TypeWithAuto
12838 QualType Replacement);
12839
12840 // Substitute auto in TypeWithAuto for a Dependent auto type
12842
12843 // Substitute auto in TypeWithAuto for a Dependent auto type
12846
12847 /// Completely replace the \c auto in \p TypeWithAuto by
12848 /// \p Replacement. This does not retain any \c auto type sugar.
12849 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12851 QualType Replacement);
12852
12853 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12854 ///
12855 /// Note that this is done even if the initializer is dependent. (This is
12856 /// necessary to support partial ordering of templates using 'auto'.)
12857 /// A dependent type will be produced when deducing from a dependent type.
12858 ///
12859 /// \param Type the type pattern using the auto type-specifier.
12860 /// \param Init the initializer for the variable whose type is to be deduced.
12861 /// \param Result if type deduction was successful, this will be set to the
12862 /// deduced type.
12863 /// \param Info the argument will be updated to provide additional information
12864 /// about template argument deduction.
12865 /// \param DependentDeduction Set if we should permit deduction in
12866 /// dependent cases. This is necessary for template partial ordering
12867 /// with 'auto' template parameters. The template parameter depth to be
12868 /// used should be specified in the 'Info' parameter.
12869 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12870 /// does not satisfy the type-constraint in the auto
12871 /// type.
12875 bool DependentDeduction = false,
12876 bool IgnoreConstraints = false,
12877 TemplateSpecCandidateSet *FailedTSC = nullptr);
12878 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12880 bool Diagnose = true);
12881
12883 SourceLocation Loc);
12884
12885 /// Returns the more specialized class template partial specialization
12886 /// according to the rules of partial ordering of class template partial
12887 /// specializations (C++ [temp.class.order]).
12888 ///
12889 /// \param PS1 the first class template partial specialization
12890 ///
12891 /// \param PS2 the second class template partial specialization
12892 ///
12893 /// \returns the more specialized class template partial specialization. If
12894 /// neither partial specialization is more specialized, returns NULL.
12899
12902
12906
12909
12911 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12912 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12913 bool PartialOrdering, bool *StrictPackMatch);
12914
12915 /// Mark which template parameters are used in a given expression.
12916 ///
12917 /// \param E the expression from which template parameters will be deduced.
12918 ///
12919 /// \param Used a bit vector whose elements will be set to \c true
12920 /// to indicate when the corresponding template parameter will be
12921 /// deduced.
12922 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12923 unsigned Depth, llvm::SmallBitVector &Used);
12924
12925 /// Mark which template parameters are named in a given expression.
12926 ///
12927 /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12928 /// are used but not directly named by an expression - i.e. it excludes
12929 /// any template parameter that denotes the type of a referenced NTTP.
12930 ///
12931 /// \param Used a bit vector whose elements will be set to \c true
12932 /// to indicate when the corresponding template parameter will be
12933 /// deduced.
12935 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
12936
12937 /// Mark which template parameters can be deduced from a given
12938 /// template argument list.
12939 ///
12940 /// \param TemplateArgs the template argument list from which template
12941 /// parameters will be deduced.
12942 ///
12943 /// \param Used a bit vector whose elements will be set to \c true
12944 /// to indicate when the corresponding template parameter will be
12945 /// deduced.
12946 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12947 bool OnlyDeduced, unsigned Depth,
12948 llvm::SmallBitVector &Used);
12949
12951 unsigned Depth, llvm::SmallBitVector &Used);
12952
12954 unsigned Depth, llvm::SmallBitVector &Used);
12955
12956 void
12958 llvm::SmallBitVector &Deduced) {
12960 }
12961
12962 /// Marks all of the template parameters that will be deduced by a
12963 /// call to the given function template.
12964 static void
12967 llvm::SmallBitVector &Deduced);
12968
12969 /// Returns the more specialized function template according
12970 /// to the rules of function template partial ordering (C++
12971 /// [temp.func.order]).
12972 ///
12973 /// \param FT1 the first function template
12974 ///
12975 /// \param FT2 the second function template
12976 ///
12977 /// \param TPOC the context in which we are performing partial ordering of
12978 /// function templates.
12979 ///
12980 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
12981 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
12982 /// when calling a member function.
12983 ///
12984 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
12985 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
12986 /// template from a member function
12987 ///
12988 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
12989 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
12990 /// template from a member function
12991 ///
12992 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
12993 /// candidate with a reversed parameter order. In this case, the corresponding
12994 /// P/A pairs between FT1 and FT2 are reversed.
12995 ///
12996 /// \returns the more specialized function template. If neither
12997 /// template is more specialized, returns NULL.
13000 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
13001 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
13002 bool PartialOverloading = false);
13003
13004 /// Retrieve the most specialized of the given function template
13005 /// specializations.
13006 ///
13007 /// \param SpecBegin the start iterator of the function template
13008 /// specializations that we will be comparing.
13009 ///
13010 /// \param SpecEnd the end iterator of the function template
13011 /// specializations, paired with \p SpecBegin.
13012 ///
13013 /// \param Loc the location where the ambiguity or no-specializations
13014 /// diagnostic should occur.
13015 ///
13016 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
13017 /// no matching candidates.
13018 ///
13019 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
13020 /// occurs.
13021 ///
13022 /// \param CandidateDiag partial diagnostic used for each function template
13023 /// specialization that is a candidate in the ambiguous ordering. One
13024 /// parameter in this diagnostic should be unbound, which will correspond to
13025 /// the string describing the template arguments for the function template
13026 /// specialization.
13027 ///
13028 /// \returns the most specialized function template specialization, if
13029 /// found. Otherwise, returns SpecEnd.
13030 UnresolvedSetIterator
13031 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
13032 TemplateSpecCandidateSet &FailedCandidates,
13033 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
13034 const PartialDiagnostic &AmbigDiag,
13035 const PartialDiagnostic &CandidateDiag,
13036 bool Complain = true, QualType TargetType = QualType());
13037
13038 /// Returns the more constrained function according to the rules of
13039 /// partial ordering by constraints (C++ [temp.constr.order]).
13040 ///
13041 /// \param FD1 the first function
13042 ///
13043 /// \param FD2 the second function
13044 ///
13045 /// \returns the more constrained function. If neither function is
13046 /// more constrained, returns NULL.
13047 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
13048 FunctionDecl *FD2);
13049
13050 ///@}
13051
13052 //
13053 //
13054 // -------------------------------------------------------------------------
13055 //
13056 //
13057
13058 /// \name C++ Template Deduction Guide
13059 /// Implementations are in SemaTemplateDeductionGuide.cpp
13060 ///@{
13061
13062 /// Declare implicit deduction guides for a class template if we've
13063 /// not already done so.
13064 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
13065 SourceLocation Loc);
13066
13067 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
13068 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
13069 SourceLocation Loc);
13070
13071 ///@}
13072
13073 //
13074 //
13075 // -------------------------------------------------------------------------
13076 //
13077 //
13078
13079 /// \name C++ Template Instantiation
13080 /// Implementations are in SemaTemplateInstantiate.cpp
13081 ///@{
13082
13083public:
13084 /// A helper class for building up ExtParameterInfos.
13087 bool HasInteresting = false;
13088
13089 public:
13090 /// Set the ExtParameterInfo for the parameter at the given index,
13091 ///
13093 assert(Infos.size() <= index);
13094 Infos.resize(index);
13095 Infos.push_back(info);
13096
13097 if (!HasInteresting)
13098 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
13099 }
13100
13101 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
13102 /// ExtParameterInfo array we've built up.
13104 getPointerOrNull(unsigned numParams) {
13105 if (!HasInteresting)
13106 return nullptr;
13107 Infos.resize(numParams);
13108 return Infos.data();
13109 }
13110 };
13111
13112 /// The current instantiation scope used to store local
13113 /// variables.
13115
13116 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
13118
13119 /// A mapping from parameters with unparsed default arguments to the
13120 /// set of instantiations of each parameter.
13121 ///
13122 /// This mapping is a temporary data structure used when parsing
13123 /// nested class templates or nested classes of class templates,
13124 /// where we might end up instantiating an inner class before the
13125 /// default arguments of its methods have been parsed.
13127
13128 using InstantiatingSpecializationsKey = llvm::PointerIntPair<Decl *, 2>;
13129
13136
13138 : S(S), Key(D->getCanonicalDecl(), unsigned(Kind)) {
13139 auto [_, Created] = S.InstantiatingSpecializations.insert(Key);
13140 if (!Created)
13141 Key = {};
13142 }
13143
13145 if (Key.getOpaqueValue()) {
13146 [[maybe_unused]] bool Erased =
13147 S.InstantiatingSpecializations.erase(Key);
13148 assert(Erased);
13149 }
13150 }
13151
13154
13155 operator bool() const { return Key.getOpaqueValue() == nullptr; }
13156
13157 private:
13158 Sema &S;
13160 };
13161
13162 /// A context in which code is being synthesized (where a source location
13163 /// alone is not sufficient to identify the context). This covers template
13164 /// instantiation and various forms of implicitly-generated functions.
13166 /// The kind of template instantiation we are performing
13168 /// We are instantiating a template declaration. The entity is
13169 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
13171
13172 /// We are instantiating a default argument for a template
13173 /// parameter. The Entity is the template parameter whose argument is
13174 /// being instantiated, the Template is the template, and the
13175 /// TemplateArgs/NumTemplateArguments provide the template arguments as
13176 /// specified.
13178
13179 /// We are instantiating a default argument for a function.
13180 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
13181 /// provides the template arguments as specified.
13183
13184 /// We are substituting explicit template arguments provided for
13185 /// a function template. The entity is a FunctionTemplateDecl.
13187
13188 /// We are substituting template argument determined as part of
13189 /// template argument deduction for either a class template
13190 /// partial specialization or a function template. The
13191 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
13192 /// a TemplateDecl.
13194
13195 /// We are substituting into a lambda expression.
13197
13198 /// We are substituting prior template arguments into a new
13199 /// template parameter. The template parameter itself is either a
13200 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
13202
13203 /// We are checking the validity of a default template argument that
13204 /// has been used when naming a template-id.
13206
13207 /// We are computing the exception specification for a defaulted special
13208 /// member function.
13210
13211 /// We are instantiating the exception specification for a function
13212 /// template which was deferred until it was needed.
13214
13215 /// We are instantiating a requirement of a requires expression.
13217
13218 /// We are checking the satisfaction of a nested requirement of a requires
13219 /// expression.
13221
13222 /// We are declaring an implicit special member function.
13224
13225 /// We are declaring an implicit 'operator==' for a defaulted
13226 /// 'operator<=>'.
13228
13229 /// We are defining a synthesized function (such as a defaulted special
13230 /// member).
13232
13233 // We are checking the constraints associated with a constrained entity or
13234 // the constraint expression of a concept. This includes the checks that
13235 // atomic constraints have the type 'bool' and that they can be constant
13236 // evaluated.
13238
13239 // We are substituting template arguments into a constraint expression.
13241
13242 // We are normalizing a constraint expression.
13244
13245 // Instantiating a Requires Expression parameter clause.
13247
13248 // We are substituting into the parameter mapping of an atomic constraint
13249 // during normalization.
13251
13252 /// We are rewriting a comparison operator in terms of an operator<=>.
13254
13255 /// We are initializing a structured binding.
13257
13258 /// We are marking a class as __dllexport.
13260
13261 /// We are building an implied call from __builtin_dump_struct. The
13262 /// arguments are in CallArgs.
13264
13265 /// Added for Template instantiation observation.
13266 /// Memoization means we are _not_ instantiating a template because
13267 /// it is already instantiated (but we entered a context where we
13268 /// would have had to if it was not already instantiated).
13270
13271 /// We are building deduction guides for a class.
13273
13274 /// We are instantiating a type alias template declaration.
13276
13277 /// We are performing partial ordering for template template parameters.
13279
13280 /// We are performing name lookup for a function template or variable
13281 /// template named 'sycl_kernel_launch'.
13283
13284 /// We are performing overload resolution for a call to a function
13285 /// template or variable template named 'sycl_kernel_launch'.
13287 } Kind;
13288
13289 /// Whether we're substituting into constraints.
13291
13292 /// Whether we're substituting into the parameter mapping of a constraint.
13294
13295 /// The point of instantiation or synthesis within the source code.
13297
13298 /// The entity that is being synthesized.
13300
13301 /// The template (or partial specialization) in which we are
13302 /// performing the instantiation, for substitutions of prior template
13303 /// arguments.
13305
13306 union {
13307 /// The list of template arguments we are substituting, if they
13308 /// are not part of the entity.
13310
13311 /// The list of argument expressions in a synthesized call.
13312 const Expr *const *CallArgs;
13313 };
13314
13315 // FIXME: Wrap this union around more members, or perhaps store the
13316 // kind-specific members in the RAII object owning the context.
13317 union {
13318 /// The number of template arguments in TemplateArgs.
13320
13321 /// The number of expressions in CallArgs.
13322 unsigned NumCallArgs;
13323
13324 /// The special member being declared or defined.
13326 };
13327
13332
13333 /// The source range that covers the construct that cause
13334 /// the instantiation, e.g., the template-id that causes a class
13335 /// template instantiation.
13337
13342
13343 /// Determines whether this template is an actual instantiation
13344 /// that should be counted toward the maximum instantiation depth.
13345 bool isInstantiationRecord() const;
13346 };
13347
13348 /// A stack object to be created when performing template
13349 /// instantiation.
13350 ///
13351 /// Construction of an object of type \c InstantiatingTemplate
13352 /// pushes the current instantiation onto the stack of active
13353 /// instantiations. If the size of this stack exceeds the maximum
13354 /// number of recursive template instantiations, construction
13355 /// produces an error and evaluates true.
13356 ///
13357 /// Destruction of this object will pop the named instantiation off
13358 /// the stack.
13360 /// Note that we are instantiating a class template,
13361 /// function template, variable template, alias template,
13362 /// or a member thereof.
13363 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13364 Decl *Entity,
13365 SourceRange InstantiationRange = SourceRange());
13366
13368 /// Note that we are instantiating an exception specification
13369 /// of a function template.
13370 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13372 SourceRange InstantiationRange = SourceRange());
13373
13374 /// Note that we are instantiating a type alias template declaration.
13375 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13376 TypeAliasTemplateDecl *Entity,
13377 ArrayRef<TemplateArgument> TemplateArgs,
13378 SourceRange InstantiationRange = SourceRange());
13379
13380 /// Note that we are instantiating a default argument in a
13381 /// template-id.
13382 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13384 ArrayRef<TemplateArgument> TemplateArgs,
13385 SourceRange InstantiationRange = SourceRange());
13386
13387 /// Note that we are substituting either explicitly-specified or
13388 /// deduced template arguments during function template argument deduction.
13389 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13391 ArrayRef<TemplateArgument> TemplateArgs,
13393 SourceRange InstantiationRange = SourceRange());
13394
13395 /// Note that we are instantiating as part of template
13396 /// argument deduction for a class template declaration.
13397 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13399 ArrayRef<TemplateArgument> TemplateArgs,
13400 SourceRange InstantiationRange = SourceRange());
13401
13402 /// Note that we are instantiating as part of template
13403 /// argument deduction for a class template partial
13404 /// specialization.
13405 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13407 ArrayRef<TemplateArgument> TemplateArgs,
13408 SourceRange InstantiationRange = SourceRange());
13409
13410 /// Note that we are instantiating as part of template
13411 /// argument deduction for a variable template partial
13412 /// specialization.
13413 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13415 ArrayRef<TemplateArgument> TemplateArgs,
13416 SourceRange InstantiationRange = SourceRange());
13417
13418 /// Note that we are instantiating a default argument for a function
13419 /// parameter.
13420 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13421 ParmVarDecl *Param,
13422 ArrayRef<TemplateArgument> TemplateArgs,
13423 SourceRange InstantiationRange = SourceRange());
13424
13425 /// Note that we are substituting prior template arguments into a
13426 /// non-type parameter.
13427 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13429 ArrayRef<TemplateArgument> TemplateArgs,
13430 SourceRange InstantiationRange);
13431
13432 /// Note that we are substituting prior template arguments into a
13433 /// template template parameter.
13434 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13436 ArrayRef<TemplateArgument> TemplateArgs,
13437 SourceRange InstantiationRange);
13438
13439 /// Note that we are checking the default template argument
13440 /// against the template parameter for a given template-id.
13441 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13443 ArrayRef<TemplateArgument> TemplateArgs,
13444 SourceRange InstantiationRange);
13445
13447 /// \brief Note that we are checking the constraints associated with some
13448 /// constrained entity (a concept declaration or a template with associated
13449 /// constraints).
13450 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13452 ArrayRef<TemplateArgument> TemplateArgs,
13453 SourceRange InstantiationRange);
13454
13456 /// \brief Note that we are checking a constraint expression associated
13457 /// with a template declaration or as part of the satisfaction check of a
13458 /// concept.
13459 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13461 SourceRange InstantiationRange);
13462
13464 /// \brief Note that we are normalizing a constraint expression.
13465 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13467 SourceRange InstantiationRange);
13468
13470 /// \brief Note that we are subtituting into the parameter mapping of an
13471 /// atomic constraint during constraint normalization.
13472 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13474 SourceRange InstantiationRange);
13475
13476 /// \brief Note that we are substituting template arguments into a part of
13477 /// a requirement of a requires expression.
13478 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13480 SourceRange InstantiationRange = SourceRange());
13481
13482 /// \brief Note that we are checking the satisfaction of the constraint
13483 /// expression inside of a nested requirement.
13484 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13486 SourceRange InstantiationRange = SourceRange());
13487
13488 /// \brief Note that we are checking a requires clause.
13489 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13490 const RequiresExpr *E,
13491 SourceRange InstantiationRange);
13492
13494 /// \brief Note that we are building deduction guides.
13495 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13497 SourceRange InstantiationRange = SourceRange());
13498
13500 /// \brief Note that we are partial ordering template template parameters.
13501 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13503 SourceRange InstantiationRange = SourceRange());
13504
13505 /// Note that we have finished instantiating this template.
13506 void Clear();
13507
13509
13510 /// Determines whether we have exceeded the maximum
13511 /// recursive template instantiations.
13512 bool isInvalid() const { return Invalid; }
13513
13514 private:
13515 Sema &SemaRef;
13516 bool Invalid;
13517
13520 SourceLocation PointOfInstantiation,
13521 SourceRange InstantiationRange, Decl *Entity,
13522 NamedDecl *Template = nullptr,
13523 ArrayRef<TemplateArgument> TemplateArgs = {});
13524
13526
13527 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13528 };
13529
13530 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13531 const MultiLevelTemplateArgumentList &TemplateArgs,
13532 TemplateArgumentLoc &Output,
13533 SourceLocation Loc = {},
13534 const DeclarationName &Entity = {});
13535 bool
13536 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13537 const MultiLevelTemplateArgumentList &TemplateArgs,
13538 TemplateArgumentListInfo &Outputs);
13539
13540 /// Substitute concept template arguments in the constraint expression
13541 /// of a concept-id. This is used to implement [temp.constr.normal].
13543 SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE,
13544 const Expr *ConstraintExpr,
13545 const MultiLevelTemplateArgumentList &MLTAL);
13546
13548 ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13549 const MultiLevelTemplateArgumentList &TemplateArgs,
13550 TemplateArgumentListInfo &Out);
13551
13552 /// Retrieve the template argument list(s) that should be used to
13553 /// instantiate the definition of the given declaration.
13554 ///
13555 /// \param ND the declaration for which we are computing template
13556 /// instantiation arguments.
13557 ///
13558 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13559 /// the decl context where it will be created. In this case, the `Innermost`
13560 /// should likely be provided. If ND is non-null, this is ignored.
13561 ///
13562 /// \param Innermost if non-NULL, specifies a template argument list for the
13563 /// template declaration passed as ND.
13564 ///
13565 /// \param RelativeToPrimary true if we should get the template
13566 /// arguments relative to the primary template, even when we're
13567 /// dealing with a specialization. This is only relevant for function
13568 /// template specializations.
13569 ///
13570 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13571 /// instantiating the definition of the given declaration, \p ND. This is
13572 /// used to determine the proper set of template instantiation arguments for
13573 /// friend function template specializations.
13574 ///
13575 /// \param ForConstraintInstantiation when collecting arguments,
13576 /// ForConstraintInstantiation indicates we should continue looking when
13577 /// encountering a lambda generic call operator, and continue looking for
13578 /// arguments on an enclosing class template.
13579 ///
13580 /// \param SkipForSpecialization when specified, any template specializations
13581 /// in a traversal would be ignored.
13582 ///
13583 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13584 /// when encountering a specialized member function template, rather than
13585 /// returning immediately.
13586 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13587 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13588 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13589 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13590 bool ForConstraintInstantiation = false,
13591 bool SkipForSpecialization = false,
13592 bool ForDefaultArgumentSubstitution = false);
13593
13594 /// RAII object to handle the state changes required to synthesize
13595 /// a function body.
13597 Sema &S;
13598 Sema::ContextRAII SavedContext;
13599 bool PushedCodeSynthesisContext = false;
13600
13601 public:
13603 : S(S), SavedContext(S, DC) {
13604 auto *FD = dyn_cast<FunctionDecl>(DC);
13605 S.PushFunctionScope();
13606 S.PushExpressionEvaluationContextForFunction(
13608 if (FD)
13609 FD->setWillHaveBody(true);
13610 else
13611 assert(isa<ObjCMethodDecl>(DC));
13612 }
13613
13615 assert(!PushedCodeSynthesisContext);
13616
13619 Ctx.PointOfInstantiation = UseLoc;
13620 Ctx.Entity = cast<Decl>(S.CurContext);
13621 S.pushCodeSynthesisContext(Ctx);
13622
13623 PushedCodeSynthesisContext = true;
13624 }
13625
13627 if (PushedCodeSynthesisContext)
13628 S.popCodeSynthesisContext();
13629 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13630 FD->setWillHaveBody(false);
13631 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13632 }
13633 S.PopExpressionEvaluationContext();
13634 S.PopFunctionScopeInfo();
13635 }
13636
13640 };
13641
13642 /// RAII object to ensure that a code synthesis context is popped on scope
13643 /// exit.
13645 Sema &S;
13646
13647 public:
13649 : S(S) {
13650 S.pushCodeSynthesisContext(Ctx);
13651 }
13652
13653 ~ScopedCodeSynthesisContext() { S.popCodeSynthesisContext(); }
13654 };
13655
13656 /// List of active code synthesis contexts.
13657 ///
13658 /// This vector is treated as a stack. As synthesis of one entity requires
13659 /// synthesis of another, additional contexts are pushed onto the stack.
13661
13662 /// Specializations whose definitions are currently being instantiated.
13663 llvm::DenseSet<InstantiatingSpecializationsKey> InstantiatingSpecializations;
13664
13665 /// Non-dependent types used in templates that have already been instantiated
13666 /// by some template instantiation.
13667 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13668
13669 /// Extra modules inspected when performing a lookup during a template
13670 /// instantiation. Computed lazily.
13672
13673 /// Cache of additional modules that should be used for name lookup
13674 /// within the current template instantiation. Computed lazily; use
13675 /// getLookupModules() to get a complete set.
13676 llvm::DenseSet<Module *> LookupModulesCache;
13677
13678 /// Map from the most recent declaration of a namespace to the most
13679 /// recent visible declaration of that namespace.
13680 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13681
13683
13684 /// The number of \p CodeSynthesisContexts that are not template
13685 /// instantiations and, therefore, should not be counted as part of the
13686 /// instantiation depth.
13687 ///
13688 /// When the instantiation depth reaches the user-configurable limit
13689 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13690 // FIXME: Should we have a similar limit for other forms of synthesis?
13692
13693 /// The depth of the context stack at the point when the most recent
13694 /// error or warning was produced.
13695 ///
13696 /// This value is used to suppress printing of redundant context stacks
13697 /// when there are multiple errors or warnings in the same instantiation.
13698 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13700
13701 /// The template instantiation callbacks to trace or track
13702 /// instantiations (objects can be chained).
13703 ///
13704 /// This callbacks is used to print, trace or track template
13705 /// instantiations as they are being constructed.
13706 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13708
13709 /// The current index into pack expansion arguments that will be
13710 /// used for substitution of parameter packs.
13711 ///
13712 /// The pack expansion index will be none to indicate that parameter packs
13713 /// should be instantiated as themselves. Otherwise, the index specifies
13714 /// which argument within the parameter pack will be used for substitution.
13716
13717 /// RAII object used to change the argument pack substitution index
13718 /// within a \c Sema object.
13719 ///
13720 /// See \c ArgPackSubstIndex for more information.
13722 Sema &Self;
13723 UnsignedOrNone OldSubstIndex;
13724
13725 public:
13727 : Self(Self),
13728 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13729
13730 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13733 };
13734
13737
13748 /// Prints the current instantiation stack through a series of
13749 /// notes.
13754
13755 /// Returns a pointer to the current SFINAE context, if any.
13756 [[nodiscard]] SFINAETrap *getSFINAEContext() const {
13757 return CurrentSFINAEContext;
13758 }
13759 [[nodiscard]] bool isSFINAEContext() const {
13760 return CurrentSFINAEContext != nullptr;
13761 }
13762
13763 /// Perform substitution on the type T with a given set of template
13764 /// arguments.
13765 ///
13766 /// This routine substitutes the given template arguments into the
13767 /// type T and produces the instantiated type.
13768 ///
13769 /// \param T the type into which the template arguments will be
13770 /// substituted. If this type is not dependent, it will be returned
13771 /// immediately.
13772 ///
13773 /// \param Args the template arguments that will be
13774 /// substituted for the top-level template parameters within T.
13775 ///
13776 /// \param Loc the location in the source code where this substitution
13777 /// is being performed. It will typically be the location of the
13778 /// declarator (if we're instantiating the type of some declaration)
13779 /// or the location of the type in the source code (if, e.g., we're
13780 /// instantiating the type of a cast expression).
13781 ///
13782 /// \param Entity the name of the entity associated with a declaration
13783 /// being instantiated (if any). May be empty to indicate that there
13784 /// is no such entity (if, e.g., this is a type that occurs as part of
13785 /// a cast expression) or that the entity has no name (e.g., an
13786 /// unnamed function parameter).
13787 ///
13788 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13789 /// acceptable as the top level type of the result.
13790 ///
13791 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13792 /// whenever substitution would perform a replacement with a null or
13793 /// non-existent template argument.
13794 ///
13795 /// \returns If the instantiation succeeds, the instantiated
13796 /// type. Otherwise, produces diagnostics and returns a NULL type.
13798 const MultiLevelTemplateArgumentList &TemplateArgs,
13799 SourceLocation Loc, DeclarationName Entity,
13800 bool AllowDeducedTST = false);
13801
13803 const MultiLevelTemplateArgumentList &TemplateArgs,
13804 SourceLocation Loc, DeclarationName Entity,
13805 bool *IsIncompleteSubstitution = nullptr);
13806
13808 const MultiLevelTemplateArgumentList &TemplateArgs,
13809 SourceLocation Loc, DeclarationName Entity);
13810
13811 /// A form of SubstType intended specifically for instantiating the
13812 /// type of a FunctionDecl. Its purpose is solely to force the
13813 /// instantiation of default-argument expressions and to avoid
13814 /// instantiating an exception-specification.
13816 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13817 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13818 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13820 const MultiLevelTemplateArgumentList &Args);
13823 SmallVectorImpl<QualType> &ExceptionStorage,
13824 const MultiLevelTemplateArgumentList &Args);
13825 ParmVarDecl *
13827 const MultiLevelTemplateArgumentList &TemplateArgs,
13828 int indexAdjustment, UnsignedOrNone NumExpansions,
13829 bool ExpectParameterPack, bool EvaluateConstraints = true);
13830
13831 /// Substitute the given template arguments into the given set of
13832 /// parameters, producing the set of parameter types that would be generated
13833 /// from such a substitution.
13835 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13836 const MultiLevelTemplateArgumentList &TemplateArgs,
13837 SmallVectorImpl<QualType> &ParamTypes,
13839 ExtParameterInfoBuilder &ParamInfos);
13840
13841 /// Substitute the given template arguments into the default argument.
13843 const MultiLevelTemplateArgumentList &TemplateArgs,
13844 bool ForCallExpr = false);
13846 const MultiLevelTemplateArgumentList &TemplateArgs);
13847 /// Substitute an expression as if it is a address-of-operand, which makes it
13848 /// act like a CXXIdExpression rather than an attempt to call.
13850 const MultiLevelTemplateArgumentList &TemplateArgs);
13851
13852 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13853 // to disable constraint evaluation, then restore the state.
13854 template <typename InstTy> struct ConstraintEvalRAII {
13855 InstTy &TI;
13857
13859 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13860 TI.setEvaluateConstraints(false);
13861 }
13862 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13865 };
13866
13867 // Must be used instead of SubstExpr at 'constraint checking' time.
13870 const MultiLevelTemplateArgumentList &TemplateArgs);
13871 // Unlike the above, this does not evaluate constraints.
13873 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13874
13875 /// Substitute the given template arguments into a list of
13876 /// expressions, expanding pack expansions if required.
13877 ///
13878 /// \param Exprs The list of expressions to substitute into.
13879 ///
13880 /// \param IsCall Whether this is some form of call, in which case
13881 /// default arguments will be dropped.
13882 ///
13883 /// \param TemplateArgs The set of template arguments to substitute.
13884 ///
13885 /// \param Outputs Will receive all of the substituted arguments.
13886 ///
13887 /// \returns true if an error occurred, false otherwise.
13888 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13889 const MultiLevelTemplateArgumentList &TemplateArgs,
13890 SmallVectorImpl<Expr *> &Outputs);
13891
13893 const MultiLevelTemplateArgumentList &TemplateArgs);
13894
13897 bool CXXDirectInit);
13898
13899 /// Perform substitution on the base class specifiers of the
13900 /// given class template specialization.
13901 ///
13902 /// Produces a diagnostic and returns true on error, returns false and
13903 /// attaches the instantiated base classes to the class template
13904 /// specialization if successful.
13905 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13906 const MultiLevelTemplateArgumentList &TemplateArgs);
13907
13908 /// Instantiate the definition of a class from a given pattern.
13909 ///
13910 /// \param PointOfInstantiation The point of instantiation within the
13911 /// source code.
13912 ///
13913 /// \param Instantiation is the declaration whose definition is being
13914 /// instantiated. This will be either a class template specialization
13915 /// or a member class of a class template specialization.
13916 ///
13917 /// \param Pattern is the pattern from which the instantiation
13918 /// occurs. This will be either the declaration of a class template or
13919 /// the declaration of a member class of a class template.
13920 ///
13921 /// \param TemplateArgs The template arguments to be substituted into
13922 /// the pattern.
13923 ///
13924 /// \param TSK the kind of implicit or explicit instantiation to perform.
13925 ///
13926 /// \param Complain whether to complain if the class cannot be instantiated
13927 /// due to the lack of a definition.
13928 ///
13929 /// \returns true if an error occurred, false otherwise.
13930 bool InstantiateClass(SourceLocation PointOfInstantiation,
13931 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13932 const MultiLevelTemplateArgumentList &TemplateArgs,
13933 TemplateSpecializationKind TSK, bool Complain = true);
13934
13935private:
13936 bool InstantiateClassImpl(SourceLocation PointOfInstantiation,
13937 CXXRecordDecl *Instantiation,
13938 CXXRecordDecl *Pattern,
13939 const MultiLevelTemplateArgumentList &TemplateArgs,
13940 TemplateSpecializationKind TSK, bool Complain);
13941
13942public:
13943 /// Instantiate the definition of an enum from a given pattern.
13944 ///
13945 /// \param PointOfInstantiation The point of instantiation within the
13946 /// source code.
13947 /// \param Instantiation is the declaration whose definition is being
13948 /// instantiated. This will be a member enumeration of a class
13949 /// temploid specialization, or a local enumeration within a
13950 /// function temploid specialization.
13951 /// \param Pattern The templated declaration from which the instantiation
13952 /// occurs.
13953 /// \param TemplateArgs The template arguments to be substituted into
13954 /// the pattern.
13955 /// \param TSK The kind of implicit or explicit instantiation to perform.
13956 ///
13957 /// \return \c true if an error occurred, \c false otherwise.
13958 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13959 EnumDecl *Instantiation, EnumDecl *Pattern,
13960 const MultiLevelTemplateArgumentList &TemplateArgs,
13962
13963 /// Instantiate the definition of a field from the given pattern.
13964 ///
13965 /// \param PointOfInstantiation The point of instantiation within the
13966 /// source code.
13967 /// \param Instantiation is the declaration whose definition is being
13968 /// instantiated. This will be a class of a class temploid
13969 /// specialization, or a local enumeration within a function temploid
13970 /// specialization.
13971 /// \param Pattern The templated declaration from which the instantiation
13972 /// occurs.
13973 /// \param TemplateArgs The template arguments to be substituted into
13974 /// the pattern.
13975 ///
13976 /// \return \c true if an error occurred, \c false otherwise.
13978 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
13979 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
13980
13982 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
13983
13985 SourceLocation PointOfInstantiation,
13986 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13987 TemplateSpecializationKind TSK, bool Complain,
13988 bool PrimaryStrictPackMatch);
13989
13990 /// Instantiates the definitions of all of the member
13991 /// of the given class, which is an instantiation of a class template
13992 /// or a member class of a template.
13993 void
13994 InstantiateClassMembers(SourceLocation PointOfInstantiation,
13995 CXXRecordDecl *Instantiation,
13996 const MultiLevelTemplateArgumentList &TemplateArgs,
13998
13999 /// Instantiate the definitions of all of the members of the
14000 /// given class template specialization, which was named as part of an
14001 /// explicit instantiation.
14003 SourceLocation PointOfInstantiation,
14004 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14006
14009 const MultiLevelTemplateArgumentList &TemplateArgs);
14010
14011 /// Do template substitution on declaration name info.
14014 const MultiLevelTemplateArgumentList &TemplateArgs);
14016 SubstTemplateName(SourceLocation TemplateKWLoc,
14017 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
14018 SourceLocation NameLoc,
14019 const MultiLevelTemplateArgumentList &TemplateArgs);
14020
14022 const MultiLevelTemplateArgumentList &TemplateArgs,
14023 bool EvaluateConstraint);
14024
14025 /// Determine whether we are currently performing template instantiation.
14028 }
14029
14030 /// Determine whether we are currently performing constraint substitution.
14032 return !CodeSynthesisContexts.empty() &&
14033 CodeSynthesisContexts.back().InConstraintSubstitution;
14034 }
14035
14037 return !CodeSynthesisContexts.empty() &&
14038 CodeSynthesisContexts.back().InParameterMappingSubstitution &&
14040 }
14041
14042 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
14043
14044 /// \brief create a Requirement::SubstitutionDiagnostic with only a
14045 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
14048
14049 ///@}
14050
14051 //
14052 //
14053 // -------------------------------------------------------------------------
14054 //
14055 //
14056
14057 /// \name C++ Template Declaration Instantiation
14058 /// Implementations are in SemaTemplateInstantiateDecl.cpp
14059 ///@{
14060
14061public:
14062 /// An entity for which implicit template instantiation is required.
14063 ///
14064 /// The source location associated with the declaration is the first place in
14065 /// the source code where the declaration was "used". It is not necessarily
14066 /// the point of instantiation (which will be either before or after the
14067 /// namespace-scope declaration that triggered this implicit instantiation),
14068 /// However, it is the location that diagnostics should generally refer to,
14069 /// because users will need to know what code triggered the instantiation.
14070 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
14071
14072 /// The queue of implicit template instantiations that are required
14073 /// but have not yet been performed.
14074 std::deque<PendingImplicitInstantiation> PendingInstantiations;
14075
14076 /// Queue of implicit template instantiations that cannot be performed
14077 /// eagerly.
14079
14083
14084 /// The queue of implicit template instantiations that are required
14085 /// and must be performed within the current local scope.
14086 ///
14087 /// This queue is only used for member functions of local classes in
14088 /// templates, which must be instantiated in the same scope as their
14089 /// enclosing function, so that they can reference function-local
14090 /// types, static variables, enumerators, etc.
14091 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
14092
14094 public:
14096 : S(S), AtEndOfTU(AtEndOfTU) {
14097 SavedPendingLocalImplicitInstantiations.swap(
14098 S.PendingLocalImplicitInstantiations);
14099 }
14100
14101 void perform() {
14102 S.PerformPendingInstantiations(/*LocalOnly=*/true,
14103 /*AtEndOfTU=*/AtEndOfTU);
14104 }
14105
14107 assert(S.PendingLocalImplicitInstantiations.empty() &&
14108 "there shouldn't be any pending local implicit instantiations");
14109 SavedPendingLocalImplicitInstantiations.swap(
14110 S.PendingLocalImplicitInstantiations);
14111 }
14112
14116
14117 private:
14118 Sema &S;
14119 bool AtEndOfTU;
14120 std::deque<PendingImplicitInstantiation>
14121 SavedPendingLocalImplicitInstantiations;
14122 };
14123
14124 /// Records and restores the CurFPFeatures state on entry/exit of compound
14125 /// statements.
14127 public:
14130 FPOptionsOverride getOverrides() { return OldOverrides; }
14131
14132 private:
14133 Sema &S;
14134 FPOptions OldFPFeaturesState;
14135 FPOptionsOverride OldOverrides;
14136 LangOptions::FPEvalMethodKind OldEvalMethod;
14137 SourceLocation OldFPPragmaLocation;
14138 };
14139
14141 public:
14142 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
14143 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
14144 if (!Enabled)
14145 return;
14146
14147 S.SavedPendingInstantiations.emplace_back();
14148 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
14149
14150 S.SavedVTableUses.emplace_back();
14151 S.SavedVTableUses.back().swap(S.VTableUses);
14152 }
14153
14154 void perform() {
14155 if (Enabled) {
14156 S.DefineUsedVTables();
14157 S.PerformPendingInstantiations(/*LocalOnly=*/false,
14158 /*AtEndOfTU=*/AtEndOfTU);
14159 }
14160 }
14161
14163 if (!Enabled)
14164 return;
14165
14166 // Restore the set of pending vtables.
14167 assert(S.VTableUses.empty() &&
14168 "VTableUses should be empty before it is discarded.");
14169 S.VTableUses.swap(S.SavedVTableUses.back());
14170 S.SavedVTableUses.pop_back();
14171
14172 // Restore the set of pending implicit instantiations.
14173 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
14174 AtEndOfTU) {
14175 assert(S.PendingInstantiations.empty() &&
14176 "PendingInstantiations should be empty before it is discarded.");
14177 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14178 S.SavedPendingInstantiations.pop_back();
14179 } else {
14180 // Template instantiations in the PCH may be delayed until the TU.
14181 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14182 S.PendingInstantiations.insert(
14183 S.PendingInstantiations.end(),
14184 S.SavedPendingInstantiations.back().begin(),
14185 S.SavedPendingInstantiations.back().end());
14186 S.SavedPendingInstantiations.pop_back();
14187 }
14188 }
14189
14191 delete;
14194
14195 private:
14196 Sema &S;
14197 bool Enabled;
14198 bool AtEndOfTU;
14199 };
14200
14202 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
14203
14214
14215 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
14216 const Decl *Pattern, Decl *Inst,
14217 LateInstantiatedAttrVec *LateAttrs = nullptr,
14218 LocalInstantiationScope *OuterMostScope = nullptr);
14219
14220 /// Update instantiation attributes after template was late parsed.
14221 ///
14222 /// Some attributes are evaluated based on the body of template. If it is
14223 /// late parsed, such attributes cannot be evaluated when declaration is
14224 /// instantiated. This function is used to update instantiation attributes
14225 /// when template definition is ready.
14226 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
14227
14228 void
14230 const Decl *Pattern, Decl *Inst,
14231 LateInstantiatedAttrVec *LateAttrs = nullptr,
14232 LocalInstantiationScope *OuterMostScope = nullptr);
14233
14234 /// In the MS ABI, we need to instantiate default arguments of dllexported
14235 /// default constructors along with the constructor definition. This allows IR
14236 /// gen to emit a constructor closure which calls the default constructor with
14237 /// its default arguments.
14239
14241 ParmVarDecl *Param);
14242 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14244
14245 /// Instantiate (or find existing instantiation of) a function template with a
14246 /// given set of template arguments.
14247 ///
14248 /// Usually this should not be used, and template argument deduction should be
14249 /// used in its place.
14252 SourceLocation Loc,
14255
14256 /// Instantiate the definition of the given function from its
14257 /// template.
14258 ///
14259 /// \param PointOfInstantiation the point at which the instantiation was
14260 /// required. Note that this is not precisely a "point of instantiation"
14261 /// for the function, but it's close.
14262 ///
14263 /// \param Function the already-instantiated declaration of a
14264 /// function template specialization or member function of a class template
14265 /// specialization.
14266 ///
14267 /// \param Recursive if true, recursively instantiates any functions that
14268 /// are required by this instantiation.
14269 ///
14270 /// \param DefinitionRequired if true, then we are performing an explicit
14271 /// instantiation where the body of the function is required. Complain if
14272 /// there is no such body.
14273 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14275 bool Recursive = false,
14276 bool DefinitionRequired = false,
14277 bool AtEndOfTU = false);
14280 const TemplateArgumentList *PartialSpecArgs,
14282 SourceLocation PointOfInstantiation,
14283 LateInstantiatedAttrVec *LateAttrs = nullptr,
14284 LocalInstantiationScope *StartingScope = nullptr);
14285
14286 /// Instantiates a variable template specialization by completing it
14287 /// with appropriate type information and initializer.
14289 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14290 const MultiLevelTemplateArgumentList &TemplateArgs);
14291
14292 /// BuildVariableInstantiation - Used after a new variable has been created.
14293 /// Sets basic variable data and decides whether to postpone the
14294 /// variable instantiation.
14295 void
14297 const MultiLevelTemplateArgumentList &TemplateArgs,
14298 LateInstantiatedAttrVec *LateAttrs,
14299 DeclContext *Owner,
14300 LocalInstantiationScope *StartingScope,
14301 bool InstantiatingVarTemplate = false,
14302 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14303
14304 /// Instantiate the initializer of a variable.
14306 VarDecl *Var, VarDecl *OldVar,
14307 const MultiLevelTemplateArgumentList &TemplateArgs);
14308
14309 /// Instantiate the definition of the given variable from its
14310 /// template.
14311 ///
14312 /// \param PointOfInstantiation the point at which the instantiation was
14313 /// required. Note that this is not precisely a "point of instantiation"
14314 /// for the variable, but it's close.
14315 ///
14316 /// \param Var the already-instantiated declaration of a templated variable.
14317 ///
14318 /// \param Recursive if true, recursively instantiates any functions that
14319 /// are required by this instantiation.
14320 ///
14321 /// \param DefinitionRequired if true, then we are performing an explicit
14322 /// instantiation where a definition of the variable is required. Complain
14323 /// if there is no such definition.
14324 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14325 VarDecl *Var, bool Recursive = false,
14326 bool DefinitionRequired = false,
14327 bool AtEndOfTU = false);
14328
14331 const MultiLevelTemplateArgumentList &TemplateArgs);
14332
14333 /// Find the instantiation of the given declaration within the
14334 /// current instantiation.
14335 ///
14336 /// This routine is intended to be used when \p D is a declaration
14337 /// referenced from within a template, that needs to mapped into the
14338 /// corresponding declaration within an instantiation. For example,
14339 /// given:
14340 ///
14341 /// \code
14342 /// template<typename T>
14343 /// struct X {
14344 /// enum Kind {
14345 /// KnownValue = sizeof(T)
14346 /// };
14347 ///
14348 /// bool getKind() const { return KnownValue; }
14349 /// };
14350 ///
14351 /// template struct X<int>;
14352 /// \endcode
14353 ///
14354 /// In the instantiation of X<int>::getKind(), we need to map the \p
14355 /// EnumConstantDecl for \p KnownValue (which refers to
14356 /// X<T>::<Kind>::KnownValue) to its instantiation
14357 /// (X<int>::<Kind>::KnownValue).
14358 /// \p FindInstantiatedDecl performs this mapping from within the
14359 /// instantiation of X<int>.
14360 NamedDecl *
14362 const MultiLevelTemplateArgumentList &TemplateArgs,
14363 bool FindingInstantiatedContext = false);
14364
14365 /// Finds the instantiation of the given declaration context
14366 /// within the current instantiation.
14367 ///
14368 /// \returns NULL if there was an error
14369 DeclContext *
14371 const MultiLevelTemplateArgumentList &TemplateArgs);
14372
14373 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14374 const MultiLevelTemplateArgumentList &TemplateArgs);
14375
14376 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14377 /// an implicit 'operator=='.
14379 FunctionDecl *Spaceship);
14380
14381 /// Performs template instantiation for all implicit template
14382 /// instantiations we have seen until this point.
14383 void PerformPendingInstantiations(bool LocalOnly = false,
14384 bool AtEndOfTU = true);
14385
14388 const MultiLevelTemplateArgumentList &TemplateArgs,
14389 bool EvaluateConstraints = true);
14390
14392 const DeclContext *Pattern,
14393 const MultiLevelTemplateArgumentList &TemplateArgs);
14394
14395private:
14396 /// Introduce the instantiated local variables into the local
14397 /// instantiation scope.
14398 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14399 const FunctionDecl *PatternDecl,
14401 /// Introduce the instantiated function parameters into the local
14402 /// instantiation scope, and set the parameter names to those used
14403 /// in the template.
14404 bool addInstantiatedParametersToScope(
14405 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14407 const MultiLevelTemplateArgumentList &TemplateArgs);
14408
14409 /// Introduce the instantiated captures of the lambda into the local
14410 /// instantiation scope.
14411 bool addInstantiatedCapturesToScope(
14412 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14414 const MultiLevelTemplateArgumentList &TemplateArgs);
14415
14416 int ParsingClassDepth = 0;
14417
14418 class SavePendingParsedClassStateRAII {
14419 public:
14420 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14421
14422 ~SavePendingParsedClassStateRAII() {
14423 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14424 "there shouldn't be any pending delayed exception spec checks");
14425 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14426 "there shouldn't be any pending delayed exception spec checks");
14427 swapSavedState();
14428 }
14429
14430 SavePendingParsedClassStateRAII(const SavePendingParsedClassStateRAII &) =
14431 delete;
14432 SavePendingParsedClassStateRAII &
14433 operator=(const SavePendingParsedClassStateRAII &) = delete;
14434
14435 private:
14436 Sema &S;
14438 SavedOverridingExceptionSpecChecks;
14440 SavedEquivalentExceptionSpecChecks;
14441
14442 void swapSavedState() {
14443 SavedOverridingExceptionSpecChecks.swap(
14444 S.DelayedOverridingExceptionSpecChecks);
14445 SavedEquivalentExceptionSpecChecks.swap(
14446 S.DelayedEquivalentExceptionSpecChecks);
14447 }
14448 };
14449
14450 ///@}
14451
14452 //
14453 //
14454 // -------------------------------------------------------------------------
14455 //
14456 //
14457
14458 /// \name C++ Variadic Templates
14459 /// Implementations are in SemaTemplateVariadic.cpp
14460 ///@{
14461
14462public:
14463 /// Determine whether an unexpanded parameter pack might be permitted in this
14464 /// location. Useful for error recovery.
14466
14467 /// The context in which an unexpanded parameter pack is
14468 /// being diagnosed.
14469 ///
14470 /// Note that the values of this enumeration line up with the first
14471 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14473 /// An arbitrary expression.
14475
14476 /// The base type of a class type.
14478
14479 /// The type of an arbitrary declaration.
14481
14482 /// The type of a data member.
14484
14485 /// The size of a bit-field.
14487
14488 /// The expression in a static assertion.
14490
14491 /// The fixed underlying type of an enumeration.
14493
14494 /// The enumerator value.
14496
14497 /// A using declaration.
14499
14500 /// A friend declaration.
14502
14503 /// A declaration qualifier.
14505
14506 /// An initializer.
14508
14509 /// A default argument.
14511
14512 /// The type of a non-type template parameter.
14514
14515 /// The type of an exception.
14517
14518 /// Explicit specialization.
14520
14521 /// Partial specialization.
14523
14524 /// Microsoft __if_exists.
14526
14527 /// Microsoft __if_not_exists.
14529
14530 /// Lambda expression.
14532
14533 /// Block expression.
14535
14536 /// A type constraint.
14538
14539 // A requirement in a requires-expression.
14541
14542 // A requires-clause.
14544 };
14545
14546 /// Diagnose unexpanded parameter packs.
14547 ///
14548 /// \param Loc The location at which we should emit the diagnostic.
14549 ///
14550 /// \param UPPC The context in which we are diagnosing unexpanded
14551 /// parameter packs.
14552 ///
14553 /// \param Unexpanded the set of unexpanded parameter packs.
14554 ///
14555 /// \returns true if an error occurred, false otherwise.
14559
14560 /// If the given type contains an unexpanded parameter pack,
14561 /// diagnose the error.
14562 ///
14563 /// \param Loc The source location where a diagnostc should be emitted.
14564 ///
14565 /// \param T The type that is being checked for unexpanded parameter
14566 /// packs.
14567 ///
14568 /// \returns true if an error occurred, false otherwise.
14571
14572 /// If the given expression contains an unexpanded parameter
14573 /// pack, diagnose the error.
14574 ///
14575 /// \param E The expression that is being checked for unexpanded
14576 /// parameter packs.
14577 ///
14578 /// \returns true if an error occurred, false otherwise.
14581
14582 /// If the given requirees-expression contains an unexpanded reference to one
14583 /// of its own parameter packs, diagnose the error.
14584 ///
14585 /// \param RE The requiress-expression that is being checked for unexpanded
14586 /// parameter packs.
14587 ///
14588 /// \returns true if an error occurred, false otherwise.
14590
14591 /// If the given nested-name-specifier contains an unexpanded
14592 /// parameter pack, diagnose the error.
14593 ///
14594 /// \param SS The nested-name-specifier that is being checked for
14595 /// unexpanded parameter packs.
14596 ///
14597 /// \returns true if an error occurred, false otherwise.
14600
14601 /// If the given name contains an unexpanded parameter pack,
14602 /// diagnose the error.
14603 ///
14604 /// \param NameInfo The name (with source location information) that
14605 /// is being checked for unexpanded parameter packs.
14606 ///
14607 /// \returns true if an error occurred, false otherwise.
14610
14611 /// If the given template name contains an unexpanded parameter pack,
14612 /// diagnose the error.
14613 ///
14614 /// \param Loc The location of the template name.
14615 ///
14616 /// \param Template The template name that is being checked for unexpanded
14617 /// parameter packs.
14618 ///
14619 /// \returns true if an error occurred, false otherwise.
14623
14624 /// If the given template argument contains an unexpanded parameter
14625 /// pack, diagnose the error.
14626 ///
14627 /// \param Arg The template argument that is being checked for unexpanded
14628 /// parameter packs.
14629 ///
14630 /// \returns true if an error occurred, false otherwise.
14633
14634 /// Collect the set of unexpanded parameter packs within the given
14635 /// template argument.
14636 ///
14637 /// \param Arg The template argument that will be traversed to find
14638 /// unexpanded parameter packs.
14640 TemplateArgument Arg,
14642
14643 /// Collect the set of unexpanded parameter packs within the given
14644 /// template argument.
14645 ///
14646 /// \param Arg The template argument that will be traversed to find
14647 /// unexpanded parameter packs.
14651
14652 /// Collect the set of unexpanded parameter packs within the given
14653 /// type.
14654 ///
14655 /// \param T The type that will be traversed to find
14656 /// unexpanded parameter packs.
14659
14660 /// Collect the set of unexpanded parameter packs within the given
14661 /// type.
14662 ///
14663 /// \param TL The type that will be traversed to find
14664 /// unexpanded parameter packs.
14667
14668 /// Collect the set of unexpanded parameter packs within the given
14669 /// nested-name-specifier.
14670 ///
14671 /// \param NNS The nested-name-specifier that will be traversed to find
14672 /// unexpanded parameter packs.
14676
14677 /// Collect the set of unexpanded parameter packs within the given
14678 /// name.
14679 ///
14680 /// \param NameInfo The name that will be traversed to find
14681 /// unexpanded parameter packs.
14683 const DeclarationNameInfo &NameInfo,
14685
14686 /// Collect the set of unexpanded parameter packs within the given
14687 /// expression.
14690
14691 /// Invoked when parsing a template argument.
14692 ///
14693 /// \param Arg the template argument, which may already be invalid.
14694 ///
14695 /// If it is followed by ellipsis, this function is called before
14696 /// `ActOnPackExpansion`.
14699
14700 /// Invoked when parsing a template argument followed by an
14701 /// ellipsis, which creates a pack expansion.
14702 ///
14703 /// \param Arg The template argument preceding the ellipsis, which
14704 /// may already be invalid.
14705 ///
14706 /// \param EllipsisLoc The location of the ellipsis.
14708 SourceLocation EllipsisLoc);
14709
14710 /// Invoked when parsing a type followed by an ellipsis, which
14711 /// creates a pack expansion.
14712 ///
14713 /// \param Type The type preceding the ellipsis, which will become
14714 /// the pattern of the pack expansion.
14715 ///
14716 /// \param EllipsisLoc The location of the ellipsis.
14718
14719 /// Construct a pack expansion type from the pattern of the pack
14720 /// expansion.
14722 SourceLocation EllipsisLoc,
14723 UnsignedOrNone NumExpansions);
14724
14725 /// Construct a pack expansion type from the pattern of the pack
14726 /// expansion.
14727 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14728 SourceLocation EllipsisLoc,
14729 UnsignedOrNone NumExpansions);
14730
14731 /// Invoked when parsing an expression followed by an ellipsis, which
14732 /// creates a pack expansion.
14733 ///
14734 /// \param Pattern The expression preceding the ellipsis, which will become
14735 /// the pattern of the pack expansion.
14736 ///
14737 /// \param EllipsisLoc The location of the ellipsis.
14738 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14739
14740 /// Invoked when parsing an expression followed by an ellipsis, which
14741 /// creates a pack expansion.
14742 ///
14743 /// \param Pattern The expression preceding the ellipsis, which will become
14744 /// the pattern of the pack expansion.
14745 ///
14746 /// \param EllipsisLoc The location of the ellipsis.
14747 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14748 UnsignedOrNone NumExpansions);
14749
14750 /// Determine whether we could expand a pack expansion with the
14751 /// given set of parameter packs into separate arguments by repeatedly
14752 /// transforming the pattern.
14753 ///
14754 /// \param EllipsisLoc The location of the ellipsis that identifies the
14755 /// pack expansion.
14756 ///
14757 /// \param PatternRange The source range that covers the entire pattern of
14758 /// the pack expansion.
14759 ///
14760 /// \param Unexpanded The set of unexpanded parameter packs within the
14761 /// pattern.
14762 ///
14763 /// \param ShouldExpand Will be set to \c true if the transformer should
14764 /// expand the corresponding pack expansions into separate arguments. When
14765 /// set, \c NumExpansions must also be set.
14766 ///
14767 /// \param RetainExpansion Whether the caller should add an unexpanded
14768 /// pack expansion after all of the expanded arguments. This is used
14769 /// when extending explicitly-specified template argument packs per
14770 /// C++0x [temp.arg.explicit]p9.
14771 ///
14772 /// \param NumExpansions The number of separate arguments that will be in
14773 /// the expanded form of the corresponding pack expansion. This is both an
14774 /// input and an output parameter, which can be set by the caller if the
14775 /// number of expansions is known a priori (e.g., due to a prior substitution)
14776 /// and will be set by the callee when the number of expansions is known.
14777 /// The callee must set this value when \c ShouldExpand is \c true; it may
14778 /// set this value in other cases.
14779 ///
14780 /// \returns true if an error occurred (e.g., because the parameter packs
14781 /// are to be instantiated with arguments of different lengths), false
14782 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14783 /// must be set.
14785 SourceLocation EllipsisLoc, SourceRange PatternRange,
14787 const MultiLevelTemplateArgumentList &TemplateArgs,
14788 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14789 bool &RetainExpansion, UnsignedOrNone &NumExpansions,
14790 bool Diagnose = true);
14791
14792 /// Determine the number of arguments in the given pack expansion
14793 /// type.
14794 ///
14795 /// This routine assumes that the number of arguments in the expansion is
14796 /// consistent across all of the unexpanded parameter packs in its pattern.
14797 ///
14798 /// Returns an empty Optional if the type can't be expanded.
14800 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14801
14804 const MultiLevelTemplateArgumentList &TemplateArgs);
14805
14806 /// Determine whether the given declarator contains any unexpanded
14807 /// parameter packs.
14808 ///
14809 /// This routine is used by the parser to disambiguate function declarators
14810 /// with an ellipsis prior to the ')', e.g.,
14811 ///
14812 /// \code
14813 /// void f(T...);
14814 /// \endcode
14815 ///
14816 /// To determine whether we have an (unnamed) function parameter pack or
14817 /// a variadic function.
14818 ///
14819 /// \returns true if the declarator contains any unexpanded parameter packs,
14820 /// false otherwise.
14822
14823 /// Returns the pattern of the pack expansion for a template argument.
14824 ///
14825 /// \param OrigLoc The template argument to expand.
14826 ///
14827 /// \param Ellipsis Will be set to the location of the ellipsis.
14828 ///
14829 /// \param NumExpansions Will be set to the number of expansions that will
14830 /// be generated from this pack expansion, if known a priori.
14833 SourceLocation &Ellipsis,
14834 UnsignedOrNone &NumExpansions) const;
14835
14836 /// Given a template argument that contains an unexpanded parameter pack, but
14837 /// which has already been substituted, attempt to determine the number of
14838 /// elements that will be produced once this argument is fully-expanded.
14839 ///
14840 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14841 /// avoid actually expanding the pack where possible.
14843
14844 /// Called when an expression computing the size of a parameter pack
14845 /// is parsed.
14846 ///
14847 /// \code
14848 /// template<typename ...Types> struct count {
14849 /// static const unsigned value = sizeof...(Types);
14850 /// };
14851 /// \endcode
14852 ///
14853 //
14854 /// \param OpLoc The location of the "sizeof" keyword.
14855 /// \param Name The name of the parameter pack whose size will be determined.
14856 /// \param NameLoc The source location of the name of the parameter pack.
14857 /// \param RParenLoc The location of the closing parentheses.
14859 IdentifierInfo &Name,
14860 SourceLocation NameLoc,
14861 SourceLocation RParenLoc);
14862
14863 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14864 SourceLocation EllipsisLoc,
14865 SourceLocation LSquareLoc, Expr *IndexExpr,
14866 SourceLocation RSquareLoc);
14867
14868 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14869 SourceLocation EllipsisLoc, Expr *IndexExpr,
14870 SourceLocation RSquareLoc,
14871 ArrayRef<Expr *> ExpandedExprs = {},
14872 bool FullySubstituted = false);
14873
14874 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14875 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14876 tok::TokenKind Operator,
14877 SourceLocation EllipsisLoc, Expr *RHS,
14878 SourceLocation RParenLoc);
14879 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14880 SourceLocation LParenLoc, Expr *LHS,
14881 BinaryOperatorKind Operator,
14882 SourceLocation EllipsisLoc, Expr *RHS,
14883 SourceLocation RParenLoc,
14884 UnsignedOrNone NumExpansions);
14885 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14886 BinaryOperatorKind Operator);
14887
14888 ///@}
14889
14890 //
14891 //
14892 // -------------------------------------------------------------------------
14893 //
14894 //
14895
14896 /// \name Constraints and Concepts
14897 /// Implementations are in SemaConcept.cpp
14898 ///@{
14899
14900public:
14901 ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI);
14902
14903 ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc,
14904 TypeSourceInfo *TSI);
14905
14906public:
14908 const llvm::FoldingSetNodeID &ID) {
14909 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14910 SatisfactionStack.emplace_back(Can, ID);
14911 }
14912
14913 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14914
14916 const llvm::FoldingSetNodeID &ID) const {
14917 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14918 return llvm::is_contained(SatisfactionStack,
14919 SatisfactionStackEntryTy{Can, ID});
14920 }
14921
14923 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14924
14925 // Resets the current SatisfactionStack for cases where we are instantiating
14926 // constraints as a 'side effect' of normal instantiation in a way that is not
14927 // indicative of recursive definition.
14930 Sema &SemaRef;
14931
14932 public:
14934 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14935 }
14936
14938 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14939 }
14940
14944 };
14945
14948 SatisfactionStack.swap(NewSS);
14949 }
14950
14952 llvm::PointerUnion<const NamedDecl *,
14954
14955 /// Check whether the given expression is a valid constraint expression.
14956 /// A diagnostic is emitted if it is not, false is returned, and
14957 /// PossibleNonPrimary will be set to true if the failure might be due to a
14958 /// non-primary expression being used as an atomic constraint.
14959 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14960 bool *PossibleNonPrimary = nullptr,
14961 bool IsTrailingRequiresClause = false);
14962
14963 /// \brief Check whether the given list of constraint expressions are
14964 /// satisfied (as if in a 'conjunction') given template arguments.
14965 /// \param Template the template-like entity that triggered the constraints
14966 /// check (either a concept or a constrained entity).
14967 /// \param ConstraintExprs a list of constraint expressions, treated as if
14968 /// they were 'AND'ed together.
14969 /// \param TemplateArgLists the list of template arguments to substitute into
14970 /// the constraint expression.
14971 /// \param TemplateIDRange The source range of the template id that
14972 /// caused the constraints check.
14973 /// \param Satisfaction if true is returned, will contain details of the
14974 /// satisfaction, with enough information to diagnose an unsatisfied
14975 /// expression.
14976 /// \returns true if an error occurred and satisfaction could not be checked,
14977 /// false otherwise.
14980 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14981 const MultiLevelTemplateArgumentList &TemplateArgLists,
14982 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
14983 const ConceptReference *TopLevelConceptId = nullptr,
14984 Expr **ConvertedExpr = nullptr);
14985
14986 /// Check whether the given function decl's trailing requires clause is
14987 /// satisfied, if any. Returns false and updates Satisfaction with the
14988 /// satisfaction verdict if successful, emits a diagnostic and returns true if
14989 /// an error occurred and satisfaction could not be determined.
14990 ///
14991 /// \returns true if an error occurred, false otherwise.
14993 ConstraintSatisfaction &Satisfaction,
14994 SourceLocation UsageLoc = SourceLocation(),
14995 bool ForOverloadResolution = false);
14996
14997 // Calculates whether two constraint expressions are equal irrespective of a
14998 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
14999 // 'New', which are the "source" of the constraint, since this is necessary
15000 // for figuring out the relative 'depth' of the constraint. The depth of the
15001 // 'primary template' and the 'instantiated from' templates aren't necessarily
15002 // the same, such as a case when one is a 'friend' defined in a class.
15004 const Expr *OldConstr,
15006 const Expr *NewConstr);
15007
15008 // Calculates whether the friend function depends on an enclosing template for
15009 // the purposes of [temp.friend] p9.
15011
15012 /// \brief Ensure that the given template arguments satisfy the constraints
15013 /// associated with the given template, emitting a diagnostic if they do not.
15014 ///
15015 /// \param Template The template to which the template arguments are being
15016 /// provided.
15017 ///
15018 /// \param TemplateArgs The converted, canonicalized template arguments.
15019 ///
15020 /// \param TemplateIDRange The source range of the template id that
15021 /// caused the constraints check.
15022 ///
15023 /// \returns true if the constrains are not satisfied or could not be checked
15024 /// for satisfaction, false if the constraints are satisfied.
15027 const MultiLevelTemplateArgumentList &TemplateArgs,
15028 SourceRange TemplateIDRange);
15029
15030 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
15032 ArrayRef<TemplateArgument> TemplateArgs,
15033 ConstraintSatisfaction &Satisfaction);
15034
15035 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15036 /// unsatisfied.
15037 /// \param First whether this is the first time an unsatisfied constraint is
15038 /// diagnosed for this error.
15040 SourceLocation Loc = {},
15041 bool First = true);
15042
15043 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15044 /// unsatisfied.
15045 void
15047 bool First = true);
15048
15051 ArrayRef<AssociatedConstraint> AssociatedConstraints);
15052
15053 /// \brief Check whether the given declaration's associated constraints are
15054 /// at least as constrained than another declaration's according to the
15055 /// partial ordering of constraints.
15056 ///
15057 /// \param Result If no error occurred, receives the result of true if D1 is
15058 /// at least constrained than D2, and false otherwise.
15059 ///
15060 /// \returns true if an error occurred, false otherwise.
15061 bool IsAtLeastAsConstrained(const NamedDecl *D1,
15063 const NamedDecl *D2,
15065 bool &Result);
15066
15067 /// If D1 was not at least as constrained as D2, but would've been if a pair
15068 /// of atomic constraints involved had been declared in a concept and not
15069 /// repeated in two separate places in code.
15070 /// \returns true if such a diagnostic was emitted, false otherwise.
15074
15075 /// Cache the satisfaction of an atomic constraint.
15076 /// The key is based on the unsubstituted expression and the parameter
15077 /// mapping. This lets us not substituting the mapping more than once,
15078 /// which is (very!) expensive.
15079 /// FIXME: this should be private.
15080 llvm::DenseMap<llvm::FoldingSetNodeID,
15083
15084private:
15085 /// Caches pairs of template-like decls whose associated constraints were
15086 /// checked for subsumption and whether or not the first's constraints did in
15087 /// fact subsume the second's.
15088 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
15089 SubsumptionCache;
15090 /// Caches the normalized associated constraints of declarations (concepts or
15091 /// constrained declarations). If an error occurred while normalizing the
15092 /// associated constraints of the template or concept, nullptr will be cached
15093 /// here.
15094 llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
15095 NormalizationCache;
15096
15097 /// Cache whether the associated constraint of a declaration
15098 /// is satisfied.
15099 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
15100 SatisfactionCache;
15101
15102 // The current stack of constraint satisfactions, so we can exit-early.
15104
15105 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
15106 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
15107 /// use LambdaScopeForCallOperatorInstantiationRAII.
15108 bool
15109 SetupConstraintScope(FunctionDecl *FD,
15110 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15111 const MultiLevelTemplateArgumentList &MLTAL,
15113
15114 /// Used during constraint checking, sets up the constraint template argument
15115 /// lists, and calls SetupConstraintScope to set up the
15116 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
15117 std::optional<MultiLevelTemplateArgumentList>
15118 SetupConstraintCheckingTemplateArgumentsAndScope(
15119 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15121
15122 ///@}
15123
15124 //
15125 //
15126 // -------------------------------------------------------------------------
15127 //
15128 //
15129
15130 /// \name Types
15131 /// Implementations are in SemaType.cpp
15132 ///@{
15133
15134public:
15135 /// A mapping that describes the nullability we've seen in each header file.
15137
15138 static int getPrintable(int I) { return I; }
15139 static unsigned getPrintable(unsigned I) { return I; }
15140 static bool getPrintable(bool B) { return B; }
15141 static const char *getPrintable(const char *S) { return S; }
15142 static StringRef getPrintable(StringRef S) { return S; }
15143 static const std::string &getPrintable(const std::string &S) { return S; }
15144 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
15145 return II;
15146 }
15148 static QualType getPrintable(QualType T) { return T; }
15149 static SourceRange getPrintable(SourceRange R) { return R; }
15151 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
15153
15154 enum class CompleteTypeKind {
15155 /// Apply the normal rules for complete types. In particular,
15156 /// treat all sizeless types as incomplete.
15158
15159 /// Relax the normal rules for complete types so that they include
15160 /// sizeless built-in types.
15162
15163 // FIXME: Eventually we should flip the default to Normal and opt in
15164 // to AcceptSizeless rather than opt out of it.
15166 };
15167
15169 const DeclSpec *DS = nullptr);
15170 QualType BuildQualifiedType(QualType T, SourceLocation Loc, unsigned CVRA,
15171 const DeclSpec *DS = nullptr);
15172
15173 /// Build a pointer type.
15174 ///
15175 /// \param T The type to which we'll be building a pointer.
15176 ///
15177 /// \param Loc The location of the entity whose type involves this
15178 /// pointer type or, if there is no such entity, the location of the
15179 /// type that will have pointer type.
15180 ///
15181 /// \param Entity The name of the entity that involves the pointer
15182 /// type, if known.
15183 ///
15184 /// \returns A suitable pointer type, if there are no
15185 /// errors. Otherwise, returns a NULL type.
15187 DeclarationName Entity);
15188
15189 /// Build a reference type.
15190 ///
15191 /// \param T The type to which we'll be building a reference.
15192 ///
15193 /// \param Loc The location of the entity whose type involves this
15194 /// reference type or, if there is no such entity, the location of the
15195 /// type that will have reference type.
15196 ///
15197 /// \param Entity The name of the entity that involves the reference
15198 /// type, if known.
15199 ///
15200 /// \returns A suitable reference type, if there are no
15201 /// errors. Otherwise, returns a NULL type.
15202 QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc,
15203 DeclarationName Entity);
15204
15205 /// Build an array type.
15206 ///
15207 /// \param T The type of each element in the array.
15208 ///
15209 /// \param ASM C99 array size modifier (e.g., '*', 'static').
15210 ///
15211 /// \param ArraySize Expression describing the size of the array.
15212 ///
15213 /// \param Brackets The range from the opening '[' to the closing ']'.
15214 ///
15215 /// \param Entity The name of the entity that involves the array
15216 /// type, if known.
15217 ///
15218 /// \returns A suitable array type, if there are no errors. Otherwise,
15219 /// returns a NULL type.
15221 unsigned Quals, SourceRange Brackets,
15222 DeclarationName Entity);
15223 QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc);
15224
15225 /// Build an ext-vector type.
15226 ///
15227 /// Run the required checks for the extended vector type.
15229 SourceLocation AttrLoc);
15230 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
15231 SourceLocation AttrLoc);
15232
15234 Expr *CountExpr,
15235 bool CountInBytes,
15236 bool OrNull);
15237
15238 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15239 /// expression is uninstantiated. If instantiated it will apply the
15240 /// appropriate address space to the type. This function allows dependent
15241 /// template variables to be used in conjunction with the address_space
15242 /// attribute
15243 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15244 SourceLocation AttrLoc);
15245
15246 /// Same as above, but constructs the AddressSpace index if not provided.
15248 SourceLocation AttrLoc);
15249
15251
15253
15254 /// Build a function type.
15255 ///
15256 /// This routine checks the function type according to C++ rules and
15257 /// under the assumption that the result type and parameter types have
15258 /// just been instantiated from a template. It therefore duplicates
15259 /// some of the behavior of GetTypeForDeclarator, but in a much
15260 /// simpler form that is only suitable for this narrow use case.
15261 ///
15262 /// \param T The return type of the function.
15263 ///
15264 /// \param ParamTypes The parameter types of the function. This array
15265 /// will be modified to account for adjustments to the types of the
15266 /// function parameters.
15267 ///
15268 /// \param Loc The location of the entity whose type involves this
15269 /// function type or, if there is no such entity, the location of the
15270 /// type that will have function type.
15271 ///
15272 /// \param Entity The name of the entity that involves the function
15273 /// type, if known.
15274 ///
15275 /// \param EPI Extra information about the function type. Usually this will
15276 /// be taken from an existing function with the same prototype.
15277 ///
15278 /// \returns A suitable function type, if there are no errors. The
15279 /// unqualified type will always be a FunctionProtoType.
15280 /// Otherwise, returns a NULL type.
15282 SourceLocation Loc, DeclarationName Entity,
15284
15285 /// Build a member pointer type \c T Class::*.
15286 ///
15287 /// \param T the type to which the member pointer refers.
15288 /// \param Class the class type into which the member pointer points.
15289 /// \param Loc the location where this type begins
15290 /// \param Entity the name of the entity that will have this member pointer
15291 /// type
15292 ///
15293 /// \returns a member pointer type, if successful, or a NULL type if there was
15294 /// an error.
15296 CXXRecordDecl *Cls, SourceLocation Loc,
15297 DeclarationName Entity);
15298
15299 /// Build a block pointer type.
15300 ///
15301 /// \param T The type to which we'll be building a block pointer.
15302 ///
15303 /// \param Loc The source location, used for diagnostics.
15304 ///
15305 /// \param Entity The name of the entity that involves the block pointer
15306 /// type, if known.
15307 ///
15308 /// \returns A suitable block pointer type, if there are no
15309 /// errors. Otherwise, returns a NULL type.
15311 DeclarationName Entity);
15312
15313 /// Build a paren type including \p T.
15316
15317 /// Build a Read-only Pipe type.
15318 ///
15319 /// \param T The type to which we'll be building a Pipe.
15320 ///
15321 /// \param Loc We do not use it for now.
15322 ///
15323 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15324 /// a NULL type.
15326
15327 /// Build a Write-only Pipe type.
15328 ///
15329 /// \param T The type to which we'll be building a Pipe.
15330 ///
15331 /// \param Loc We do not use it for now.
15332 ///
15333 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15334 /// a NULL type.
15336
15337 /// Build a bit-precise integer type.
15338 ///
15339 /// \param IsUnsigned Boolean representing the signedness of the type.
15340 ///
15341 /// \param BitWidth Size of this int type in bits, or an expression
15342 /// representing that.
15343 ///
15344 /// \param Loc Location of the keyword.
15345 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15346
15347 /// GetTypeForDeclarator - Convert the type for the specified
15348 /// declarator to Type instances.
15349 ///
15350 /// The result of this call will never be null, but the associated
15351 /// type may be a null type if there's an unrecoverable error.
15354
15355 /// Package the given type and TSI into a ParsedType.
15358 TypeSourceInfo **TInfo = nullptr);
15359
15361
15362 // Check whether the size of array element of type \p EltTy is a multiple of
15363 // its alignment and return false if it isn't.
15365
15366 void
15367 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15368 SourceLocation FallbackLoc,
15369 SourceLocation ConstQualLoc = SourceLocation(),
15370 SourceLocation VolatileQualLoc = SourceLocation(),
15371 SourceLocation RestrictQualLoc = SourceLocation(),
15372 SourceLocation AtomicQualLoc = SourceLocation(),
15373 SourceLocation UnalignedQualLoc = SourceLocation());
15374
15375 /// Retrieve the keyword associated
15377
15378 /// Adjust the calling convention of a method to be the ABI default if it
15379 /// wasn't specified explicitly. This handles method types formed from
15380 /// function type typedefs and typename template arguments.
15381 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15382 bool IsCtorOrDtor, SourceLocation Loc);
15383
15384 // Check if there is an explicit attribute, but only look through parens.
15385 // The intent is to look for an attribute on the current declarator, but not
15386 // one that came from a typedef.
15388
15389 /// Check whether a nullability type specifier can be added to the given
15390 /// type through some means not written in source (e.g. API notes).
15391 ///
15392 /// \param Type The type to which the nullability specifier will be
15393 /// added. On success, this type will be updated appropriately.
15394 ///
15395 /// \param Nullability The nullability specifier to add.
15396 ///
15397 /// \param DiagLoc The location to use for diagnostics.
15398 ///
15399 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15400 /// array type (e.g., because it will decay to a pointer).
15401 ///
15402 /// \param OverrideExisting Whether to override an existing, locally-specified
15403 /// nullability specifier rather than complaining about the conflict.
15404 ///
15405 /// \returns true if nullability cannot be applied, false otherwise.
15407 NullabilityKind Nullability,
15408 SourceLocation DiagLoc,
15409 bool AllowArrayTypes,
15410 bool OverrideExisting);
15411
15412 /// Check whether the given variable declaration has a size that fits within
15413 /// the address space it is declared in. This issues a diagnostic if not.
15414 ///
15415 /// \param VD The variable declaration to check the size of.
15416 ///
15417 /// \param AS The address space to check the size of \p VD against.
15418 ///
15419 /// \returns true if the variable's size fits within the address space, false
15420 /// otherwise.
15421 bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS);
15422
15423 /// Get the type of expression E, triggering instantiation to complete the
15424 /// type if necessary -- that is, if the expression refers to a templated
15425 /// static data member of incomplete array type.
15426 ///
15427 /// May still return an incomplete type if instantiation was not possible or
15428 /// if the type is incomplete for a different reason. Use
15429 /// RequireCompleteExprType instead if a diagnostic is expected for an
15430 /// incomplete expression type.
15432
15434
15435 /// Ensure that the type of the given expression is complete.
15436 ///
15437 /// This routine checks whether the expression \p E has a complete type. If
15438 /// the expression refers to an instantiable construct, that instantiation is
15439 /// performed as needed to complete its type. Furthermore
15440 /// Sema::RequireCompleteType is called for the expression's type (or in the
15441 /// case of a reference type, the referred-to type).
15442 ///
15443 /// \param E The expression whose type is required to be complete.
15444 /// \param Kind Selects which completeness rules should be applied.
15445 /// \param Diagnoser The object that will emit a diagnostic if the type is
15446 /// incomplete.
15447 ///
15448 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15449 /// otherwise.
15451 TypeDiagnoser &Diagnoser);
15452 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15453
15454 template <typename... Ts>
15455 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15456 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15458 }
15459
15460 // Returns the underlying type of a decltype with the given expression.
15462
15464 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15465 /// context, such as when building a type for decltype(auto).
15466 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15467
15468 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15469 SourceLocation Loc,
15470 SourceLocation EllipsisLoc);
15471 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15472 SourceLocation Loc, SourceLocation EllipsisLoc,
15473 bool FullySubstituted = false,
15474 ArrayRef<QualType> Expansions = {});
15475
15476 using UTTKind = UnaryTransformType::UTTKind;
15478 SourceLocation Loc);
15484 SourceLocation Loc);
15486 SourceLocation Loc);
15488 SourceLocation Loc);
15489
15491 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15492 }
15493
15495 SourceLocation Loc);
15497 SourceLocation Loc);
15498
15499 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15500
15501 /// Ensure that the type T is a literal type.
15502 ///
15503 /// This routine checks whether the type @p T is a literal type. If @p T is an
15504 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15505 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15506 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15507 /// it the type @p T), along with notes explaining why the type is not a
15508 /// literal type, and returns true.
15509 ///
15510 /// @param Loc The location in the source that the non-literal type
15511 /// diagnostic should refer to.
15512 ///
15513 /// @param T The type that this routine is examining for literalness.
15514 ///
15515 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15516 ///
15517 /// @returns @c true if @p T is not a literal type and a diagnostic was
15518 /// emitted, @c false otherwise.
15520 TypeDiagnoser &Diagnoser);
15521 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15522
15523 template <typename... Ts>
15524 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15525 const Ts &...Args) {
15526 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15527 return RequireLiteralType(Loc, T, Diagnoser);
15528 }
15529
15532 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15533 }
15534
15535 /// Ensure that the type T is a complete type.
15536 ///
15537 /// This routine checks whether the type @p T is complete in any
15538 /// context where a complete type is required. If @p T is a complete
15539 /// type, returns false. If @p T is a class template specialization,
15540 /// this routine then attempts to perform class template
15541 /// instantiation. If instantiation fails, or if @p T is incomplete
15542 /// and cannot be completed, issues the diagnostic @p diag (giving it
15543 /// the type @p T) and returns true.
15544 ///
15545 /// @param Loc The location in the source that the incomplete type
15546 /// diagnostic should refer to.
15547 ///
15548 /// @param T The type that this routine is examining for completeness.
15549 ///
15550 /// @param Kind Selects which completeness rules should be applied.
15551 ///
15552 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15553 /// @c false otherwise.
15555 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15557 CompleteTypeKind Kind, unsigned DiagID);
15558
15560 TypeDiagnoser &Diagnoser) {
15561 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15562 }
15563 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15564 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15565 }
15566
15567 template <typename... Ts>
15568 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15569 const Ts &...Args) {
15570 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15571 return RequireCompleteType(Loc, T, Diagnoser);
15572 }
15573
15574 /// Determine whether a declaration is visible to name lookup.
15575 bool isVisible(const NamedDecl *D) {
15576 return D->isUnconditionallyVisible() ||
15577 isAcceptableSlow(D, AcceptableKind::Visible);
15578 }
15579
15580 /// Determine whether a declaration is reachable.
15581 bool isReachable(const NamedDecl *D) {
15582 // All visible declarations are reachable.
15583 return D->isUnconditionallyVisible() ||
15584 isAcceptableSlow(D, AcceptableKind::Reachable);
15585 }
15586
15587 /// Determine whether a declaration is acceptable (visible/reachable).
15589 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15590 }
15591
15592 /// Determine if \p D and \p Suggested have a structurally compatible
15593 /// layout as described in C11 6.2.7/1.
15594 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15595
15596 /// Determine if \p D has a visible definition. If not, suggest a declaration
15597 /// that should be made visible to expose the definition.
15598 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15599 bool OnlyNeedComplete = false);
15601 NamedDecl *Hidden;
15602 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15603 }
15604 /// Determine if \p D has a definition which allows we redefine it in current
15605 /// TU. \p Suggested is the definition that should be made visible to expose
15606 /// the definition.
15607 bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested,
15608 bool &Visible);
15610 NamedDecl *Hidden;
15611 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), &Hidden,
15612 Visible);
15613 }
15614
15615 /// Determine if \p D has a reachable definition. If not, suggest a
15616 /// declaration that should be made reachable to expose the definition.
15617 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15618 bool OnlyNeedComplete = false);
15620 NamedDecl *Hidden;
15621 return hasReachableDefinition(D, &Hidden);
15622 }
15623
15624 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15625 AcceptableKind Kind,
15626 bool OnlyNeedComplete = false);
15628 NamedDecl *Hidden;
15629 return hasAcceptableDefinition(D, &Hidden, Kind);
15630 }
15631
15632 /// Try to parse the conditional expression attached to an effect attribute
15633 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15634 /// optional on error.
15635 std::optional<FunctionEffectMode>
15636 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15637
15638 void ActOnCleanupAttr(Decl *D, const Attr *A);
15639 void ActOnInitPriorityAttr(Decl *D, const Attr *A);
15640
15641private:
15642 /// The implementation of RequireCompleteType
15643 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15644 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15645
15646 /// Nullability type specifiers.
15647 IdentifierInfo *Ident__Nonnull = nullptr;
15648 IdentifierInfo *Ident__Nullable = nullptr;
15649 IdentifierInfo *Ident__Nullable_result = nullptr;
15650 IdentifierInfo *Ident__Null_unspecified = nullptr;
15651
15652 ///@}
15653
15654 //
15655 //
15656 // -------------------------------------------------------------------------
15657 //
15658 //
15659
15660 /// \name FixIt Helpers
15661 /// Implementations are in SemaFixItUtils.cpp
15662 ///@{
15663
15664public:
15665 /// Get a string to suggest for zero-initialization of a type.
15667 SourceLocation Loc) const;
15668 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15669
15670 ///@}
15671
15672 //
15673 //
15674 // -------------------------------------------------------------------------
15675 //
15676 //
15677
15678 /// \name Function Effects
15679 /// Implementations are in SemaFunctionEffects.cpp
15680 ///@{
15681public:
15684
15687 std::optional<FunctionEffectWithCondition>
15688 Old; // Invalid when 'Kind' is 'Added'.
15689 std::optional<FunctionEffectWithCondition>
15690 New; // Invalid when 'Kind' is 'Removed'.
15691
15692 StringRef effectName() const {
15693 if (Old)
15694 return Old.value().Effect.name();
15695 return New.value().Effect.name();
15696 }
15697
15698 /// Describes the result of effects differing between a base class's virtual
15699 /// method and an overriding method in a subclass.
15700 enum class OverrideResult {
15703 Merge // Merge missing effect from base to derived.
15704 };
15705
15706 /// Return true if adding or removing the effect as part of a type
15707 /// conversion should generate a diagnostic.
15709 const FunctionEffectsRef &SrcFX,
15710 QualType DstType,
15711 const FunctionEffectsRef &DstFX) const;
15712
15713 /// Return true if adding or removing the effect in a redeclaration should
15714 /// generate a diagnostic.
15715 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15716 const FunctionEffectsRef &OldFX,
15717 const FunctionDecl &NewFunction,
15718 const FunctionEffectsRef &NewFX) const;
15719
15720 /// Return true if adding or removing the effect in a C++ virtual method
15721 /// override should generate a diagnostic.
15723 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15724 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15725 };
15726
15727 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15728 /// Caller should short-circuit by checking for equality first.
15730 const FunctionEffectsRef &New);
15731 };
15732
15733 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15734 /// FunctionEffectsRef to be verified.
15736
15737 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15738 /// are all null.
15740
15741public:
15742 /// Warn and return true if adding a function effect to a set would create a
15743 /// conflict.
15746 SourceLocation NewAttrLoc);
15747
15748 // Report a failure to merge function effects between declarations due to a
15749 // conflict.
15750 void
15752 SourceLocation NewLoc,
15753 SourceLocation OldLoc);
15754
15755 /// Inline checks from the start of maybeAddDeclWithEffects, to
15756 /// minimize performance impact on code not using effects.
15757 template <class FuncOrBlockDecl>
15758 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15759 if (Context.hasAnyFunctionEffects())
15760 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15762 }
15763
15764 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15765 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15766
15767 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15768 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15769
15771
15772 ///@}
15773};
15774
15775DeductionFailureInfo
15777 sema::TemplateDeductionInfo &Info);
15778
15779/// Contains a late templated function.
15780/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15783 /// The template function declaration to be late parsed.
15785 /// Floating-point options in the point of definition.
15787};
15788
15789template <>
15791 PragmaMsStackAction Action,
15792 llvm::StringRef StackSlotLabel,
15794
15795} // end namespace clang
15796
15797#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.
static const Decl * getCanonicalDecl(const Decl *D)
#define X(type, name)
Definition Value.h:97
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
This file declares semantic analysis functions specific to RISC-V.
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:4860
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:226
Represents a member of a struct/union/class.
Definition Decl.h:3160
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:35
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
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:2724
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3730
Attr - This represents one attribute.
Definition Attr.h:46
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3499
A binding in a decomposition declaration.
Definition DeclCXX.h:4188
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4674
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:2611
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2946
Represents a C++ base or member initializer.
Definition DeclCXX.h:2376
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2627
Represents a C++ destructor within a class.
Definition DeclCXX.h:2876
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:2136
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:74
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:2946
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4946
CaseStmt - Represent a case statement.
Definition Stmt.h:1912
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3679
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.
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
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:47
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3680
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:1273
Captures information about "declaration specifiers".
Definition DeclSpec.h:218
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:780
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1921
A decomposition declaration.
Definition DeclCXX.h:4252
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:334
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:232
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
Represents an enum.
Definition Decl.h:4013
Store information needed for an explicit specifier.
Definition DeclCXX.h:1931
The return type of classify().
Definition Expr.h:339
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:805
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:277
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:3160
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:260
FileNullability & operator[](FileID file)
Definition Sema.h:271
FileNullability Nullability
Definition Sema.h:267
Represents a function declaration or definition.
Definition Decl.h:2000
A mutable set of FunctionEffect::Kind.
Definition TypeBase.h:5169
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5283
Kind
Identifies the particular effect.
Definition TypeBase.h:4931
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5115
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition ExprCXX.h:4842
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5315
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4537
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4511
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:622
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
Describes an C or C++ initializer list.
Definition Expr.h:5302
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:524
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:372
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4401
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4347
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:4921
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3367
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3661
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:274
Represent a C++ namespace.
Definition Decl.h:592
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:8006
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:1160
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:277
static constexpr unsigned IdxBitWidth
Definition Attr.h:279
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2185
Represents a parameter to a function.
Definition Decl.h:1790
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:294
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:330
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:2695
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:4327
Represents the body of a requires-expression.
Definition DeclCXX.h:2105
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
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
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
Definition Sema.h:1865
bool operator==(const AlignPackInfo &Info) const
Definition Sema.h:1925
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1897
unsigned getPackNumber() const
Definition Sema.h:1915
bool IsXLStack() const
Definition Sema.h:1923
bool IsPackSet() const
Definition Sema.h:1917
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition Sema.h:1871
bool IsAlignAttr() const
Definition Sema.h:1911
bool IsPackAttr() const
Definition Sema.h:1909
bool operator!=(const AlignPackInfo &Info) const
Definition Sema.h:1931
AlignPackInfo(bool IsXL)
Definition Sema.h:1875
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition Sema.h:1882
Mode getAlignMode() const
Definition Sema.h:1913
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition Sema.h:13726
ArgPackSubstIndexRAII & operator=(const ArgPackSubstIndexRAII &)=delete
ArgPackSubstIndexRAII(const ArgPackSubstIndexRAII &)=delete
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8330
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8335
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8322
std::tuple< const Ts &... > Args
Definition Sema.h:8319
CXXThisScopeRAII(const CXXThisScopeRAII &)=delete
CXXThisScopeRAII & operator=(const CXXThisScopeRAII &)=delete
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 & operator=(const CompoundScopeRAII &)=delete
CompoundScopeRAII(Sema &S, bool IsStmtExpr=false)
Definition Sema.h:1309
CompoundScopeRAII(const CompoundScopeRAII &)=delete
std::pair< VarDecl *, Expr * > get() const
Definition Sema.h:7869
std::optional< bool > getKnownValue() const
Definition Sema.h:7873
A RAII object to temporarily push a declaration context.
Definition Sema.h:3518
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3528
ContextRAII & operator=(const ContextRAII &)=delete
ContextRAII(const ContextRAII &)=delete
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
Definition Sema.h:10370
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:10375
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:6437
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition Sema.h:6414
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition Sema.h:6442
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition Sema.h:6417
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6434
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition Sema.h:10098
DeferDiagsRAII & operator=(const DeferDiagsRAII &)=delete
DeferDiagsRAII(const DeferDiagsRAII &)=delete
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition Sema.h:1378
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition Sema.h:1397
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition Sema.h:1421
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition Sema.h:1390
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1393
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:1407
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition Sema.h:1413
A helper class for building up ExtParameterInfos.
Definition Sema.h:13085
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:13104
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:13092
FPOptionsOverride getOverrides()
Definition Sema.h:14130
FpPragmaStackSaveRAII(const FpPragmaStackSaveRAII &)=delete
FpPragmaStackSaveRAII & operator=(const FpPragmaStackSaveRAII &)=delete
FullExprArg(Sema &actions)
Definition Sema.h:7813
ExprResult release()
Definition Sema.h:7815
friend class Sema
Definition Sema.h:7824
Expr * get() const
Definition Sema.h:7817
GlobalEagerInstantiationScope(const GlobalEagerInstantiationScope &)=delete
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:14142
GlobalEagerInstantiationScope & operator=(const GlobalEagerInstantiationScope &)=delete
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:10434
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:10426
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5536
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5529
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5539
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:5545
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5552
LambdaScopeForCallOperatorInstantiationRAII(Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL, LocalInstantiationScope &Scope, bool ShouldAddDeclsFromParentScope=true)
LocalEagerInstantiationScope & operator=(const LocalEagerInstantiationScope &)=delete
LocalEagerInstantiationScope(Sema &S, bool AtEndOfTU)
Definition Sema.h:14095
LocalEagerInstantiationScope(const LocalEagerInstantiationScope &)=delete
static NameClassification DependentNonType()
Definition Sema.h:3738
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3748
ExprResult getExpression() const
Definition Sema.h:3774
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3711
static NameClassification Unknown()
Definition Sema.h:3718
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3722
NameClassificationKind getKind() const
Definition Sema.h:3772
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3766
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3754
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3784
NameClassification(ParsedType Type)
Definition Sema.h:3708
TemplateName getTemplateName() const
Definition Sema.h:3789
ParsedType getType() const
Definition Sema.h:3779
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3798
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3728
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3760
static NameClassification UndeclaredNonType()
Definition Sema.h:3734
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3742
static NameClassification Error()
Definition Sema.h:3714
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2487
PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct)
Definition SemaAttr.cpp:29
PragmaStackSentinelRAII(const PragmaStackSentinelRAII &)=delete
PragmaStackSentinelRAII & operator=(const PragmaStackSentinelRAII &)=delete
RequiredTemplateKind(TemplateNameIsRequiredTag)
Template name is unconditionally required.
Definition Sema.h:11464
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11466
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11461
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12517
SFINAETrap & operator=(const SFINAETrap &)=delete
SFINAETrap(const SFINAETrap &)=delete
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12551
SFINAETrap(Sema &S, bool WithAccessChecking=false)
Definition Sema.h:12533
bool withAccessChecking() const
Definition Sema.h:12554
sema::TemplateDeductionInfo * getDeductionInfo() const
Definition Sema.h:12546
SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info)
Definition Sema.h:12536
SatisfactionStackResetRAII(const SatisfactionStackResetRAII &)=delete
SatisfactionStackResetRAII & operator=(const SatisfactionStackResetRAII &)=delete
ScopedCodeSynthesisContext(Sema &S, const CodeSynthesisContext &Ctx)
Definition Sema.h:13648
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition Sema.h:8347
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8352
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8349
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition Sema.h:9362
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9349
CXXMethodDecl * getMethod() const
Definition Sema.h:9352
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9353
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13614
SynthesizedFunctionScope(const SynthesizedFunctionScope &)=delete
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13602
SynthesizedFunctionScope & operator=(const SynthesizedFunctionScope &)=delete
SourceLocation getLocation() const
Definition Sema.h:12275
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12265
const DeclContext * getDeclContext() const
Definition Sema.h:12271
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12249
const NamedDecl * getDecl() const
Definition Sema.h:12263
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12248
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12267
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12568
TentativeAnalysisScope & operator=(const TentativeAnalysisScope &)=delete
TentativeAnalysisScope(const TentativeAnalysisScope &)=delete
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7772
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:868
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)
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:1440
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:3616
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:13676
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:8252
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:507
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13660
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:11018
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13114
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2560
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:1133
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:1583
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:14080
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6605
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:10111
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1075
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:6594
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)
void ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation ExportNameLoc, Scope *curScope)
ActonPragmaExport - called on well-formed '#pragma export'.
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:8302
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:8220
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:949
bool isAttrContext() const
Definition Sema.h:7001
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:8295
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2660
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6356
LookupNameKind
Describes the kind of name lookup to perform.
Definition Sema.h:9378
@ LookupLabel
Label name lookup.
Definition Sema.h:9387
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9382
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9409
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9401
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9423
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9417
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9419
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9414
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9394
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9421
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9405
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9390
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9397
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9385
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9425
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9427
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:415
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition Sema.h:9328
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition Sema.h:4932
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15476
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.
ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx, SourceLocation RBLoc)
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:632
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:6293
SemaM68k & M68k()
Definition Sema.h:1490
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:13738
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.
ExprResult SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE, const Expr *ConstraintExpr, const MultiLevelTemplateArgumentList &MLTAL)
Substitute concept template arguments in the constraint expression of a concept-id.
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:1373
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)
void deduceOpenCLAddressSpace(VarDecl *decl)
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:2133
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:9816
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:4877
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:5091
OpaquePtr< QualType > TypeTy
Definition Sema.h:1293
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:170
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:365
void PrintContextStack()
Definition Sema.h:13747
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:1525
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition Sema.h:9327
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:2308
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6331
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9692
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:1361
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.
llvm::DenseMap< const EnumDecl *, llvm::SmallVector< llvm::APSInt > > AssignEnumCache
A cache of enumerator values for enums checked by -Wassign-enum.
Definition Sema.h:3573
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:15144
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:1254
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:4788
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:3598
PragmaClangSection PragmaClangRodataSection
Definition Sema.h:1837
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:15600
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:6567
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:5190
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1166
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:6548
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:1243
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:1465
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:371
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7889
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7891
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7890
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition Sema.h:1342
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:15559
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:15150
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)
ExprResult BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, const NonTypeTemplateParmDecl *NTTP, SourceLocation loc, TemplateArgument Replacement, UnsignedOrNone PackIndex, bool Final)
bool needsRebuildOfDefaultArgOrInit() const
Definition Sema.h:8240
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:9929
@ Interface
'export module X;'
Definition Sema.h:9926
@ Implementation
'module X;'
Definition Sema.h:9927
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9928
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8382
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1236
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:9639
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10453
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10456
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10462
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10460
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
Definition SemaAttr.cpp:281
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:1795
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
@ AR_dependent
Definition Sema.h:1680
@ AR_accessible
Definition Sema.h:1678
@ AR_inaccessible
Definition Sema.h:1679
@ AR_delayed
Definition Sema.h:1681
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:15157
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:15161
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:938
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:6979
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2332
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
QualType GetSignedSizelessVectorType(QualType V)
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:8371
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2068
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:8283
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition Sema.h:15151
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2062
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:15739
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2513
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:4937
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:2142
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:6808
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:624
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:2057
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:11183
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:2612
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:4189
@ Default
= default ;
Definition Sema.h:4191
@ Delete
deleted-function-body
Definition Sema.h:4197
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)
bool CheckOverflowBehaviorTypeConversion(Expr *E, QualType T, SourceLocation CC)
Check for overflow behavior type related implicit conversion diagnostics.
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition Sema.h:14042
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.
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
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:1245
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:2069
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:1480
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:851
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.
llvm::DenseMap< llvm::FoldingSetNodeID, UnsubstitutedConstraintSatisfactionCacheResult > UnsubstitutedConstraintSatisfactionCache
Cache the satisfaction of an atomic constraint.
Definition Sema.h:15082
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:172
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
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:1550
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:2887
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:6991
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:1674
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:667
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition SemaExpr.cpp:837
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11429
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:12027
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:12038
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:12030
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:12034
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:686
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:721
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:9322
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:1570
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:13680
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:1300
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:8207
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.
void MarkUsedTemplateParametersForSubsumptionParameterMapping(const Expr *E, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are named in a given expression.
IdentifierSourceLocations TypoCorrectionFailures
A cache containing identifiers for which typo correction failed and their locations,...
Definition Sema.h:9333
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7834
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:225
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:939
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.
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
Definition Sema.h:2350
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:936
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:4415
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15524
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
void resetFPOptions(FPOptions FPO)
Definition Sema.h:11410
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15627
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose=true)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
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:9913
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:15140
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
SemaObjC & ObjC()
Definition Sema.h:1510
bool InOverflowBehaviorAssignmentContext
Track if we're currently analyzing overflow behavior types in assignment context.
Definition Sema.h:1365
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:2842
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:1435
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:79
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:903
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3191
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition Sema.h:1661
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
PragmaStack< bool > StrictGuardStackCheckStack
Definition Sema.h:2065
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition Sema.h:13751
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:3606
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:758
bool isImmediateFunctionContext() const
Definition Sema.h:8232
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:939
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1073
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:655
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition SemaExpr.cpp:768
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:6574
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)
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
ParsingDeclState PushParsingDeclaration(sema::DelayedDiagnosticPool &pool)
Definition Sema.h:1427
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:6658
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:2061
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:338
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:887
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:710
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition Sema.h:2629
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs, bool DoCheckConstraintSatisfaction=true)
ParsingClassState PushParsingClass()
Definition Sema.h:6601
@ FRS_Success
Definition Sema.h:10841
@ FRS_DiagnosticIssued
Definition Sema.h:10843
@ FRS_NoViableFunction
Definition Sema.h:10842
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:14213
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:981
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition Sema.h:9375
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:9325
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:6126
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
Definition Sema.h:6140
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
Definition Sema.h:6137
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
Definition Sema.h:6134
@ None
This is not a defaultable comparison operator.
Definition Sema.h:6128
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
Definition Sema.h:6131
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:9064
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:15735
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10162
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10164
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:1226
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6589
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:1204
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.
llvm::PointerUnion< const NamedDecl *, const concepts::NestedRequirement * > ConstrainedDeclOrNestedRequirement
Definition Sema.h:14951
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)
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
Definition SemaAttr.cpp:640
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition Sema.h:3629
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:1679
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:2603
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition Sema.h:3515
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 CheckAttributesOnDeducedType(Decl *D)
CheckAttributesOnDeducedType - Calls Sema functions for attributes that requires the type to be deduc...
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)
void setFunctionHasIndirectGoto()
Definition Sema.cpp:2523
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...
bool CheckConstraintSatisfaction(ConstrainedDeclOrNestedRequirement Entity, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction, const ConceptReference *TopLevelConceptId=nullptr, Expr **ConvertedExpr=nullptr)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
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:12207
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12225
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12215
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12235
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:4928
EnumDecl * getStdAlignValT() const
const NormalizedConstraint * getNormalizedAssociatedConstraints(ConstrainedDeclOrNestedRequirement Entity, ArrayRef< AssociatedConstraint > AssociatedConstraints)
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1693
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:8413
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition SemaAttr.cpp:393
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:11479
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11486
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11483
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:799
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:2736
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2351
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:510
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:11415
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition SemaAttr.cpp:170
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:3602
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8267
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:15147
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4626
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:1581
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
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:934
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8365
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
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:2369
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:2502
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15568
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:14472
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14492
@ UPPC_RequiresClause
Definition Sema.h:14543
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14498
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14525
@ UPPC_Requirement
Definition Sema.h:14540
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14516
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14495
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14531
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14528
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14522
@ UPPC_Initializer
An initializer.
Definition Sema.h:14507
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14477
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14501
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14510
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14480
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14474
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14519
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14504
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14483
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14489
@ UPPC_Block
Block expression.
Definition Sema.h:14534
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14486
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14513
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14537
api_notes::APINotesManager APINotes
Definition Sema.h:1304
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:12587
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:932
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?
llvm::PointerIntPair< Decl *, 2 > InstantiatingSpecializationsKey
Definition Sema.h:13128
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:5905
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2463
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:2104
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:728
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1460
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
Definition SemaAttr.cpp:224
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
Definition Sema.h:3623
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:1515
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition Sema.h:14946
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:7067
@ ReuseLambdaContextDecl
Definition Sema.h:7067
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:940
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:1455
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:1344
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:1299
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:2151
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool SubstTemplateArgumentsInParameterMapping(ArrayRef< TemplateArgumentLoc > Args, SourceLocation BaseLoc, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Out)
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:1339
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition Sema.h:2129
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:2141
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:3610
SemaDirectX & DirectX()
Definition Sema.h:1470
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition Sema.h:6550
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:1500
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:1582
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:1298
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:1232
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2578
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:1227
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition Sema.h:9067
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:956
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:416
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15581
CUDAClusterDimsAttr * createClusterDimsAttr(const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
Add a cluster_dims attribute to a particular declaration.
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:6552
SemaHLSL & HLSL()
Definition Sema.h:1475
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:11428
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1230
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9374
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:1185
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:6985
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:1838
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition Sema.h:1495
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:1540
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:15758
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition Sema.h:1827
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:5911
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....
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition SemaExpr.cpp:214
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:5285
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5288
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5292
MemberPointerConversionDirection
Definition Sema.h:10294
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14078
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6545
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc, TypeSourceInfo *TSI)
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:76
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:2802
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:15142
SemaSwift & Swift()
Definition Sema.h:1555
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:2050
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:6650
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7012
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition Sema.h:13707
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6582
StmtResult ActOnExprStmtError()
Definition SemaStmt.cpp:65
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2060
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:1137
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition Sema.h:1353
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:2107
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:1686
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:909
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition SemaStmt.cpp:70
OpenCLOptions OpenCLFeatures
Definition Sema.h:1295
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
TemplateArgument getPackSubstitutedTemplateArgument(TemplateArgument Arg) const
Definition Sema.h:11833
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:14082
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:2154
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:863
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:4803
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:10481
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:15136
ProcessingContextState ParsingClassState
Definition Sema.h:6600
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:1333
NamedDecl * lookupExternCFunctionOrVariable(IdentifierInfo *IdentId, SourceLocation NameLoc, Scope *curScope)
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:2497
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.
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition Sema.cpp:2931
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:3875
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition Sema.h:2709
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:15490
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:7009
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...
bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypeConversion - Determines whether the conversion from FromType to ToType necessar...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope)
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
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)
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:2315
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::*.
UnsignedOrNone getPackIndex(TemplateArgument Pack) const
Definition Sema.h:11828
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:13126
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:4888
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.
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:5901
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:643
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:15575
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8236
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2103
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9908
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:2564
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...
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:8103
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:2533
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:7024
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:6559
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:1438
auto getDefaultDiagFunc()
Definition Sema.h:2310
void ActOnInitPriorityAttr(Decl *D, const Attr *A)
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.
bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypePromotion - Determines whether the conversion from FromType to ToType involves ...
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:12588
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6578
SemaOpenCL & OpenCL()
Definition Sema.h:1520
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:14091
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
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:620
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition Sema.h:2234
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:894
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:15152
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...
void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope)
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:2639
@ FAPK_Elsewhere
Definition Sema.h:2643
@ FAPK_Fixed
Definition Sema.h:2640
@ FAPK_Variadic
Definition Sema.h:2641
@ FAPK_VAList
Definition Sema.h:2642
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:8228
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:13117
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1654
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)
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:15588
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:14922
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:8424
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:3620
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6811
bool MSStructPragmaOn
Definition Sema.h:1824
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:13691
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:14026
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15563
SourceManager & getSourceManager() const
Definition Sema.h:937
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
void ActOnCleanupAttr(Decl *D, const Attr *A)
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition Sema.h:8495
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:4866
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:630
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:3569
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:960
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:12307
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 ?
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:2322
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:9368
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:554
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:14031
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,...
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:6021
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:1839
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:7522
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:4128
@ NTCUK_Destruct
Definition Sema.h:4130
@ NTCUK_Init
Definition Sema.h:4129
@ NTCUK_Copy
Definition Sema.h:4131
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
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:1374
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:8381
PragmaClangSection PragmaClangDataSection
Definition Sema.h:1836
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:9163
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:2363
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:2049
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:6809
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition Sema.h:942
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:1240
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2110
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool isSFINAEContext() const
Definition Sema.h:13759
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8848
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...
static SourceRange getPrintable(SourceRange R)
Definition Sema.h:15149
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:13715
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:14907
ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI)
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:15530
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition Sema.h:1143
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:2893
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)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void emitDeferredDiags()
Definition Sema.cpp:2034
void setFunctionHasMustTail()
Definition Sema.cpp:2528
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:8420
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:14913
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:2518
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition Sema.h:15619
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:2631
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6570
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:638
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:1179
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:1579
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:11289
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:3594
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:274
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:1576
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
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:1301
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:4689
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition Sema.h:2212
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:7016
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:124
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1338
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:1800
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:14074
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:9935
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9942
@ ImportFinished
after any non-import decl.
Definition Sema.h:9939
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9940
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9936
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9937
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9944
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9938
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:15148
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:1261
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 addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
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:6753
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6775
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6765
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6780
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6770
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6790
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6759
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6785
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6800
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:13699
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:4851
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4857
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4861
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4854
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:980
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....
bool inParameterMappingSubstitution() const
Definition Sema.h:14036
SemaPPC & PPC()
Definition Sema.h:1530
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:2376
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:4925
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:1259
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:14915
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...
ASTContext::CXXRecordDeclRelocationInfo CheckCXX2CRelocatable(const clang::CXXRecordDecl *D)
LateTemplateParserCB * LateTemplateParser
Definition Sema.h:1343
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:8431
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:3613
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 FormatStringI...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool DeferDiags
Whether deferrable diagnostics should be deferred.
Definition Sema.h:10090
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:8218
SemaSystemZ & SystemZ()
Definition Sema.h:1560
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:123
bool isRedefinitionAllowedFor(const NamedDecl *D, bool &Visible)
Definition Sema.h:15609
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:2915
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:8368
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:10286
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:9921
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:1303
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:11456
@ TemplateNameIsRequired
Definition Sema.h:11456
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:787
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:442
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:6563
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:1302
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:593
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7838
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:933
FPOptions CurFPFeatures
Definition Sema.h:1296
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
void SetLateTemplateParser(LateTemplateParserCB *LTP, void *P)
Definition Sema.h:1346
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6554
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 addLifetimeBoundToImplicitThis(CXXMethodDecl *MD)
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:519
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2059
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
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:2954
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:11639
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11649
@ TPC_FriendFunctionTemplate
Definition Sema.h:11647
@ TPC_ClassTemplateMember
Definition Sema.h:11645
@ TPC_FunctionTemplate
Definition Sema.h:11644
@ TPC_FriendClassTemplate
Definition Sema.h:11646
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11648
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:1450
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:1580
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:2138
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:7797
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.
void ActOnDeferStmtError(Scope *CurScope)
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:6586
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13671
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:670
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:15139
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:1822
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:1245
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:11112
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11120
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11114
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11117
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
SemaNVPTX & NVPTX()
Definition Sema.h:1505
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:878
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().
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:2079
@ PSK_ConstSeg
Definition Sema.h:2082
@ PSK_DataSeg
Definition Sema.h:2080
@ PSK_CodeSeg
Definition Sema.h:2083
@ PSK_BSSSeg
Definition Sema.h:2081
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:625
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
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:6330
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,...
CodeAlignAttr * BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E)
ExprResult ActOnStmtExprResult(ExprResult E)
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:3588
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2124
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:1835
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:1357
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition Sema.h:6276
@ AbstractSynthesizedIvarType
Definition Sema.h:6283
@ AbstractVariableType
Definition Sema.h:6280
@ AbstractReturnType
Definition Sema.h:6278
@ AbstractNone
Definition Sema.h:6277
@ AbstractFieldType
Definition Sema.h:6281
@ AbstractArrayType
Definition Sema.h:6284
@ AbstractParamType
Definition Sema.h:6279
@ AbstractIvarType
Definition Sema.h:6282
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 ...
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
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:1545
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:8417
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 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:8026
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:9431
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9435
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9441
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9433
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9438
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9449
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9445
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:2548
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition Sema.h:6997
SemaLoongArch & LoongArch()
Definition Sema.h:1485
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:6465
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6470
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6467
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:14070
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:2907
OpaquePtr< TemplateName > TemplateTy
Definition Sema.h:1292
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:3565
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:1699
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:15455
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:7875
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:1565
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)
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
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:3511
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:13667
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:1535
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:2509
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition SemaStmt.cpp:588
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition Sema.h:11421
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:7831
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:729
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:147
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:8376
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1291
static int getPrintable(int I)
Definition Sema.h:15138
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:889
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition Sema.h:9701
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:12957
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:3861
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:15143
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:8244
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
SFINAETrap * CurrentSFINAEContext
Definition Sema.h:13682
SemaARM & ARM()
Definition Sema.h:1445
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.
llvm::DenseSet< InstantiatingSpecializationsKey > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition Sema.h:13663
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition SemaAttr.cpp:326
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.
static const char * getPrintable(const char *S)
Definition Sema.h:15141
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.
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment)
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
Definition Sema.h:11022
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:651
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
PragmaMsStackAction
Definition Sema.h:1841
@ PSK_Push_Set
Definition Sema.h:1847
@ PSK_Reset
Definition Sema.h:1842
@ PSK_Pop_Set
Definition Sema.h:1848
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:8710
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.
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
Definition Sema.h:13756
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:298
Stmt - This represents one statement.
Definition Stmt.h:86
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
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.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
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:4637
The top declaration context.
Definition Decl.h:105
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
Represents a declaration of a type.
Definition Decl.h:3513
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:8359
The base class of the type hierarchy.
Definition TypeBase.h:1839
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3667
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
Simple class containing the result of Sema::CorrectTypo.
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:1033
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3391
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition ExprCXX.h:4127
A set of unresolved declarations.
The iterator over UnresolvedSets.
Represents a C++ using-declaration.
Definition DeclCXX.h:3594
Represents C++ using-directive.
Definition DeclCXX.h:3099
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3402
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
Represents a variable declaration or definition.
Definition Decl.h:926
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:4183
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2801
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:794
Retains information about a captured region.
Definition ScopeInfo.h:820
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:854
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
bool operator==(const ValueType &a, const ValueType &b)
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:476
TypeSpecifierType
Specifies the kind of type.
Definition Specifiers.h:55
ImplicitTypenameContext
Definition DeclSpec.h:1904
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OverloadKind
Definition Sema.h:823
@ NonFunction
This is not an overload because the lookup results contain a non-function.
Definition Sema.h:834
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:830
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition Sema.h:826
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:513
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition Sema.h:459
CUDAFunctionTarget
Definition Cuda.h:61
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:791
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:799
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:653
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition Specifiers.h:39
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition Sema.h:661
@ BitwiseOp
A bitwise operation.
Definition Sema.h:665
@ Arithmetic
An arithmetic operation.
Definition Sema.h:663
@ Conditional
A conditional (?:) operator.
Definition Sema.h:669
@ CompAssign
A compound assignment expression.
Definition Sema.h:671
@ Comparison
A comparison.
Definition Sema.h:667
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:594
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition Sema.h:604
@ TemplateTemplateArgument
Definition Sema.h:613
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition Overload.h:84
NonTrivialCUnionContext
Definition Sema.h:532
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition Sema.h:628
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:636
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition Sema.h:642
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:633
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition Sema.h:639
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:238
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
TypeOfKind
The kind of 'typeof' expression we're after.
Definition TypeBase.h:918
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
void inferNoReturnAttr(Sema &S, Decl *D)
Expr * Cond
};
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
Definition Overload.h:929
@ 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:2845
@ CopyInit
[a = b], [a = {b}]
Definition DeclSpec.h:2847
@ 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:478
@ Result
The result type of a method or function.
Definition TypeBase.h:905
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
OffsetOfKind
Definition Sema.h:616
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition TypeBase.h:3727
CorrectTypoKind
Definition Sema.h:818
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
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:689
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
Definition Sema.h:712
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition Sema.h:787
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
Definition Sema.h:704
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
Definition Sema.h:759
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
Definition Sema.h:749
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
Definition Sema.h:776
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
Definition Sema.h:763
@ CompatibleOBTDiscards
CompatibleOBTDiscards - Assignment discards overflow behavior.
Definition Sema.h:783
@ IncompatibleOBTKinds
IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType kinds, e....
Definition Sema.h:780
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
Definition Sema.h:696
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
Definition Sema.h:738
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
Definition Sema.h:733
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
Definition Sema.h:772
@ Compatible
Compatible - the types are compatible according to the standard.
Definition Sema.h:691
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
Definition Sema.h:723
@ IncompatiblePointerDiscardsOverflowBehavior
IncompatiblePointerDiscardsOverflowBehavior - The assignment discards overflow behavior annotations b...
Definition Sema.h:743
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
Definition Sema.h:700
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
Definition Sema.h:708
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
Definition Sema.h:755
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
Definition Sema.h:717
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
Definition Sema.h:729
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
Definition Sema.h:767
TagUseKind
Definition Sema.h:451
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition LangOptions.h:38
PragmaClangSectionKind
pragma clang section kind
Definition Sema.h:467
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5939
TUFragmentKind
Definition Sema.h:487
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:555
@ FunctionTemplate
The name was classified as a function template name.
Definition Sema.h:587
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:562
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
Definition Sema.h:576
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
Definition Sema.h:589
@ NonType
The name was classified as a specific non-type, non-template declaration.
Definition Sema.h:568
@ Unknown
This name is not a type or template in this context, but might be something else.
Definition Sema.h:558
@ Error
Classification failed; an error has been produced.
Definition Sema.h:560
@ Type
The name was classified as a type.
Definition Sema.h:564
@ TypeTemplate
The name was classified as a template whose specializations are types.
Definition Sema.h:583
@ Concept
The name was classified as a concept name.
Definition Sema.h:591
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:581
@ UndeclaredNonType
The name was classified as an ADL-only function name.
Definition Sema.h:572
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:585
LangAS
Defines the address space values used by the address space qualifier of QualType.
FormatStringType
Definition Sema.h:499
CastKind
CastKind - The kind of operation required for a conversion.
AllowFoldKind
Definition Sema.h:655
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:676
PragmaMSStructKind
Definition PragmaKinds.h:23
AssignmentAction
Definition Sema.h:216
CXXSpecialMemberKind
Kinds of C++ special members.
Definition Sema.h:427
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:521
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
Definition Attr.h:126
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:150
TypeAwareAllocationMode
Definition ExprCXX.h:2252
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition Sema.h:803
@ Exists
The symbol exists.
Definition Sema.h:805
@ DoesNotExist
The symbol does not exist.
Definition Sema.h:808
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:305
TrivialABIHandling
Definition Sema.h:645
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition Sema.h:650
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition Sema.h:647
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:369
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
Definition Sema.h:419
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
Definition Sema.h:414
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
Definition Sema.h:417
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
Definition Sema.h:390
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
Definition Sema.h:376
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
Definition Sema.h:412
@ CUDATargetMismatch
CUDA Target attributes do not match.
Definition Sema.h:421
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
Definition Sema.h:409
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:379
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
Definition Sema.h:393
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
Definition Sema.h:382
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
Definition Sema.h:396
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:385
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
Definition Sema.h:406
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:423
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
Definition Sema.h:400
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
Definition Sema.h:403
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:1250
@ None
The alignment was not explicit in code.
Definition ASTContext.h:179
CCEKind
Contexts in which a converted constant expression is required.
Definition Sema.h:838
@ CaseValue
Expression in a case label.
Definition Sema.h:839
@ StaticAssertMessageData
Call to data() in a static assert message.
Definition Sema.h:849
@ Enumerator
Enumerator value with fixed underlying type.
Definition Sema.h:840
@ StaticAssertMessageSize
Call to size() in a static assert message.
Definition Sema.h:847
@ Noexcept
Condition in a noexcept(bool) specifier.
Definition Sema.h:846
@ ArrayBound
Array bound in array declarator or new-expression.
Definition Sema.h:844
@ TempArgStrict
As above, but applies strict template checking rules.
Definition Sema.h:842
@ ExplicitBool
Condition in an explicit(bool) specifier.
Definition Sema.h:845
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
SourceLocIdentKind
Definition Expr.h:5007
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5914
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5925
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5928
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:5932
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:2246
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:1992
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:438
@ Implicit
An implicit conversion.
Definition Sema.h:440
@ CStyleCast
A C-style cast.
Definition Sema.h:442
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
Definition Sema.h:448
@ OtherCast
A cast other than a C-style cast.
Definition Sema.h:446
@ FunctionalCast
A functional-style cast.
Definition Sema.h:444
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:242
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition Sema.h:249
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition Sema.h:245
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition Sema.h:255
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition Sema.h:252
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition TypeBase.h:5052
Holds information about the various types of exception specification.
Definition TypeBase.h:5372
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5374
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5377
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5380
Extra information about a function prototype.
Definition TypeBase.h:5400
Represents a complete lambda introducer.
Definition DeclSpec.h:2853
Contains a late templated function.
Definition Sema.h:15781
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15786
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15784
A normalized constraint, as defined in C++ [temp.constr.normal], is either an atomic constraint,...
Definition SemaConcept.h:36
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Definition Overload.h:933
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Definition Sema.h:2054
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition Sema.h:10573
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10580
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10582
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:12065
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:12061
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:12042
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:12054
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:12051
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:12051
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:13165
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13336
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool InParameterMappingSubstitution
Whether we're substituting into the parameter mapping of a constraint.
Definition Sema.h:13293
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13309
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13328
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13304
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13296
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13322
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13290
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13312
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13319
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13167
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13259
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13177
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13186
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13205
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13256
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13213
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13220
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13263
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13231
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13269
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13196
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13275
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13272
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13278
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13193
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13201
@ SYCLKernelLaunchOverloadResolution
We are performing overload resolution for a call to a function template or variable template named 's...
Definition Sema.h:13286
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13209
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13170
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13223
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13227
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13182
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13253
@ SYCLKernelLaunchLookup
We are performing name lookup for a function template or variable template named 'sycl_kernel_launch'...
Definition Sema.h:13282
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13216
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13299
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13325
bool isInstantiationRecord() const
Determines whether this template is an actual instantiation that should be counted toward the maximum...
ConstraintEvalRAII & operator=(const ConstraintEvalRAII &)=delete
ConstraintEvalRAII(const ConstraintEvalRAII &)=delete
InitializationContext(SourceLocation Loc, ValueDecl *Decl, DeclContext *Context)
Definition Sema.h:6914
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6815
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:6848
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6850
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6901
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6835
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:6844
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6855
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:6863
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6859
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6904
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6869
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:6830
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6877
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6907
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6873
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6820
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
Definition Sema.h:6840
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6924
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6926
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6817
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6824
FormatArgumentPassingKind ArgPassingKind
Definition Sema.h:2651
FunctionEffectDiffVector(const FunctionEffectsRef &Old, const FunctionEffectsRef &New)
Caller should short-circuit by checking for equality first.
std::optional< FunctionEffectWithCondition > Old
Definition Sema.h:15688
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:15692
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:15700
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15690
FunctionEffect::Kind EffectKind
Definition Sema.h:15685
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13512
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.
LocalInstantiationScope * Scope
Definition Sema.h:14206
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:14209
bool isMoveEligible() const
Definition Sema.h:11180
bool isCopyElidable() const
Definition Sema.h:11181
const VarDecl * Candidate
Definition Sema.h:11175
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3324
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3333
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3327
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3330
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3321
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3339
SourceLocation LocStart
Definition Sema.h:7609
IdentifierInfo * IdentInfo
Definition Sema.h:7612
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12689
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.
Definition Sema.h:2345
This an attribute introduced by #pragma clang attribute.
Definition Sema.h:2113
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition Sema.h:2116
A push'd group of PragmaAttributeEntries.
Definition Sema.h:2121
SourceLocation Loc
The location of the push attribute.
Definition Sema.h:2123
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition Sema.h:2126
const IdentifierInfo * Namespace
The namespace of this push group.
Definition Sema.h:2125
SourceLocation PragmaLocation
Definition Sema.h:1832
PragmaMsStackAction Action
Definition Sema.h:1852
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition Sema.h:1965
llvm::StringRef StackSlotLabel
Definition Sema.h:1961
SourceLocation PragmaLocation
Definition Sema.h:1963
SourceLocation PragmaPushLocation
Definition Sema.h:1964
ValueType CurrentValue
Definition Sema.h:2035
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition Sema.h:2021
bool hasValue() const
Definition Sema.h:2031
SmallVector< Slot, 2 > Stack
Definition Sema.h:2033
ValueType DefaultValue
Definition Sema.h:2034
SourceLocation CurrentPragmaLocation
Definition Sema.h:2036
PragmaStack(const ValueType &Default)
Definition Sema.h:2028
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition Sema.h:1972
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition Sema.h:5125
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5119
RecursiveInstGuard(Sema &S, Decl *D, Kind Kind)
Definition Sema.h:13137
RecursiveInstGuard(const RecursiveInstGuard &)=delete
RecursiveInstGuard & operator=(const RecursiveInstGuard &)=delete
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Definition Sema.h:10470
SFINAEContextBase & operator=(const SFINAEContextBase &)=delete
SFINAEContextBase(Sema &S, SFINAETrap *Cur)
Definition Sema.h:12497
SFINAEContextBase(const SFINAEContextBase &)=delete
Abstract class used to diagnose incomplete types.
Definition Sema.h:8309
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition Sema.h:2693
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition Sema.h:2702
bool CheckSameAsPrevious
Definition Sema.h:355
NamedDecl * Previous
Definition Sema.h:356
SkipBodyInfo()=default
NamedDecl * New
Definition Sema.h:357
Information about a template-id annotation token.