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 /// Load #pragma redefine_extname'd undeclared identifiers from the external
972 /// source.
974
975 /// Determine if VD, which must be a variable or function, is an external
976 /// symbol that nonetheless can't be referenced from outside this translation
977 /// unit because its type has no linkage and it's not extern "C".
978 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
979
980 /// Determines whether the given source location is in the main file
981 /// and we're in a context where we should warn about unused entities.
982 bool isMainFileLoc(SourceLocation Loc) const;
983
984 /// Obtain a sorted list of functions that are undefined but ODR-used.
986 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
987
988 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
990 /// Retrieves list of suspicious delete-expressions that will be checked at
991 /// the end of translation unit.
992 const llvm::MapVector<FieldDecl *, DeleteLocs> &
994
995 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
996 /// This is closely coupled to the SemaDiagnosticBuilder class and
997 /// should not be used elsewhere.
998 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
999
1000 void addImplicitTypedef(StringRef Name, QualType T);
1001
1002 /// Whether uncompilable error has occurred. This includes error happens
1003 /// in deferred diagnostics.
1004 bool hasUncompilableErrorOccurred() const;
1005
1006 /// Looks through the macro-expansion chain for the given
1007 /// location, looking for a macro expansion with the given name.
1008 /// If one is found, returns true and sets the location to that
1009 /// expansion loc.
1010 bool findMacroSpelling(SourceLocation &loc, StringRef name);
1011
1012 /// Calls \c Lexer::getLocForEndOfToken()
1013 SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
1014
1015 /// Calls \c Lexer::findNextToken() to find the next token, and if the
1016 /// locations of both ends of the token can be resolved it return that
1017 /// range; Otherwise it returns an invalid SourceRange.
1019 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
1020 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
1021
1022 /// Retrieve the module loader associated with the preprocessor.
1024
1025 /// Invent a new identifier for parameters of abbreviated templates.
1028 unsigned Index);
1029
1031
1032 // Emit all deferred diagnostics.
1033 void emitDeferredDiags();
1034
1035 /// This is called before the very first declaration in the translation unit
1036 /// is parsed. Note that the ASTContext may have already injected some
1037 /// declarations.
1039 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1040 /// translation unit when EOF is reached and all but the top-level scope is
1041 /// popped.
1044
1045 /// Determines the active Scope associated with the given declaration
1046 /// context.
1047 ///
1048 /// This routine maps a declaration context to the active Scope object that
1049 /// represents that declaration context in the parser. It is typically used
1050 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1051 /// declarations) that injects a name for name-lookup purposes and, therefore,
1052 /// must update the Scope.
1053 ///
1054 /// \returns The scope corresponding to the given declaraion context, or NULL
1055 /// if no such scope is open.
1057
1058 void PushFunctionScope();
1059 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1061
1062 /// This is used to inform Sema what the current TemplateParameterDepth
1063 /// is during Parsing. Currently it is used to pass on the depth
1064 /// when parsing generic lambda 'auto' parameters.
1065 void RecordParsingTemplateParameterDepth(unsigned Depth);
1066
1067 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1069 unsigned OpenMPCaptureLevel = 0);
1070
1071 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1072 /// time after they've been popped.
1074 Sema *Self;
1075
1076 public:
1077 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1079 };
1080
1082 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1083
1084 /// Pop a function (or block or lambda or captured region) scope from the
1085 /// stack.
1086 ///
1087 /// \param WP The warning policy to use for CFG-based warnings, or null if
1088 /// such warnings should not be produced.
1089 /// \param D The declaration corresponding to this function scope, if
1090 /// producing CFG-based warnings.
1091 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1094 Decl *D = nullptr, QualType BlockType = QualType());
1095
1097
1102
1103 void PushCompoundScope(bool IsStmtExpr);
1104 void PopCompoundScope();
1105
1106 /// Determine whether any errors occurred within this function/method/
1107 /// block.
1109
1110 /// Retrieve the current block, if any.
1112
1113 /// Get the innermost lambda or block enclosing the current location, if any.
1114 /// This looks through intervening non-lambda, non-block scopes such as local
1115 /// functions.
1117
1118 /// Retrieve the current lambda scope info, if any.
1119 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1120 /// lambda scope info ignoring all inner capturing scopes that are not
1121 /// lambda scopes.
1123 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1124
1125 /// Retrieve the current generic lambda info, if any.
1127
1128 /// Retrieve the current captured region, if any.
1130
1131 void ActOnComment(SourceRange Comment);
1132
1133 /// Retrieve the parser's current scope.
1134 ///
1135 /// This routine must only be used when it is certain that semantic analysis
1136 /// and the parser are in precisely the same context, which is not the case
1137 /// when, e.g., we are performing any kind of template instantiation.
1138 /// Therefore, the only safe places to use this scope are in the parser
1139 /// itself and in routines directly invoked from the parser and *never* from
1140 /// template substitution or instantiation.
1141 Scope *getCurScope() const { return CurScope; }
1142
1144
1148
1149 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1150 const FunctionDecl *FD = nullptr);
1152 const PartialDiagnostic &PD,
1153 const FunctionDecl *FD = nullptr) {
1154 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1155 }
1156
1157 /// Check if the type is allowed to be used for the current target.
1159 ValueDecl *D = nullptr);
1160
1161 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1162 /// cast. If there is already an implicit cast, merge into the existing one.
1163 /// If isLvalue, the result of the cast is an lvalue.
1166 const CXXCastPath *BasePath = nullptr,
1168
1169 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1170 /// to the conversion from scalar type ScalarTy to the Boolean type.
1172
1173 /// If \p AllowLambda is true, treat lambda as function.
1174 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1175
1176 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1177 /// current context is not inside a function. If \p AllowLambda is true,
1178 /// this can return the call operator of an enclosing lambda, otherwise
1179 /// lambdas are skipped when looking for an enclosing function.
1180 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1181
1182 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1183 /// the method decl for the method being parsed. If we're currently
1184 /// in a 'block', this returns the containing context.
1186
1187 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1188 /// or C function we're in, otherwise return null. If we're currently
1189 /// in a 'block', this returns the containing context.
1191
1192 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1193 /// _Nonnull one.
1195 SourceLocation Loc);
1196
1197 /// Warn when implicitly casting 0 to nullptr.
1198 void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
1199
1200 /// Warn when implicitly changing function effects.
1202 SourceLocation Loc);
1203
1204 /// makeUnavailableInSystemHeader - There is an error in the current
1205 /// context. If we're still in a system header, and we can plausibly
1206 /// make the relevant declaration unavailable instead of erroring, do
1207 /// so and return true.
1209 UnavailableAttr::ImplicitReason reason);
1210
1211 /// Retrieve a suitable printing policy for diagnostics.
1215
1216 /// Retrieve a suitable printing policy for diagnostics.
1218 const Preprocessor &PP);
1219
1220 /// Scope actions.
1222
1223 /// Determine whether \param D is function like (function or function
1224 /// template) for parsing.
1226
1227 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1228 /// because that allows us not to duplicate the constants in clang code,
1229 /// which we must to since we can't directly use the llvm constants.
1230 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1231 ///
1232 /// This is the greatest alignment value supported by load, store, and alloca
1233 /// instructions, and global values.
1234 static const unsigned MaxAlignmentExponent = 32;
1235 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1236
1237 /// Flag indicating whether or not to collect detailed statistics.
1239
1240 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1241
1242 /// Stack containing information about each of the nested
1243 /// function, block, and method scopes that are currently active.
1245
1246 /// The index of the first FunctionScope that corresponds to the current
1247 /// context.
1249
1250 /// Track the number of currently active capturing scopes.
1252
1253 llvm::BumpPtrAllocator BumpAlloc;
1254
1255 /// The kind of translation unit we are processing.
1256 ///
1257 /// When we're processing a complete translation unit, Sema will perform
1258 /// end-of-translation-unit semantic tasks (such as creating
1259 /// initializers for tentative definitions in C) once parsing has
1260 /// completed. Modules and precompiled headers perform different kinds of
1261 /// checks.
1263
1264 /// Translation Unit Scope - useful to Objective-C actions that need
1265 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1266 /// For example, user-defined classes, built-in "id" type, etc.
1268
1270 return CurScope->incrementMSManglingNumber();
1271 }
1272
1273 /// Try to recover by turning the given expression into a
1274 /// call. Returns true if recovery was attempted or an error was
1275 /// emitted; this may also leave the ExprResult invalid.
1277 bool ForceComplain = false,
1278 bool (*IsPlausibleResult)(QualType) = nullptr);
1279
1280 // Adds implicit lifetime bound attribute for implicit this to its
1281 // TypeSourceInfo.
1283
1284 /// Figure out if an expression could be turned into a call.
1285 ///
1286 /// Use this when trying to recover from an error where the programmer may
1287 /// have written just the name of a function instead of actually calling it.
1288 ///
1289 /// \param E - The expression to examine.
1290 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1291 /// with no arguments, this parameter is set to the type returned by such a
1292 /// call; otherwise, it is set to an empty QualType.
1293 /// \param OverloadSet - If the expression is an overloaded function
1294 /// name, this parameter is populated with the decls of the various
1295 /// overloads.
1296 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1297 UnresolvedSetImpl &NonTemplateOverloads);
1298
1302
1305
1313
1314 /// A RAII object to enter scope of a compound statement.
1316 public:
1317 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1318 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1319 }
1320
1321 ~CompoundScopeRAII() { S.ActOnFinishOfCompoundStmt(); }
1324
1325 private:
1326 Sema &S;
1327 };
1328
1329 /// An RAII helper that pops function a function scope on exit.
1335 if (Active)
1336 S.PopFunctionScopeInfo();
1337 }
1338 void disable() { Active = false; }
1339 };
1340
1342 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1343 }
1344
1345 /// Worker object for performing CFG-based warnings.
1348
1349 /// Callback to the parser to parse templated functions when needed.
1350 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1353
1355 LateTemplateParser = LTP;
1356 OpaqueParser = P;
1357 }
1358
1359 /// Callback to the parser to parse a type expressed as a string.
1360 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1362
1363 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1364 /// This is used as part of a hack to omit that class from ADL results.
1366
1367 /// Is the last error level diagnostic immediate. This is used to determined
1368 /// whether the next info diagnostic should be immediate.
1370
1371 /// Track if we're currently analyzing overflow behavior types in assignment
1372 /// context.
1374
1375 class DelayedDiagnostics;
1376
1378 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1380 };
1383
1384 /// A class which encapsulates the logic for delaying diagnostics
1385 /// during parsing and other processing.
1387 /// The current pool of diagnostics into which delayed
1388 /// diagnostics should go.
1389 sema::DelayedDiagnosticPool *CurPool = nullptr;
1390
1391 public:
1393
1394 /// Adds a delayed diagnostic.
1395 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1396
1397 /// Determines whether diagnostics should be delayed.
1398 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1399
1400 /// Returns the current delayed-diagnostics pool.
1401 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1402
1403 /// Enter a new scope. Access and deprecation diagnostics will be
1404 /// collected in this pool.
1407 state.SavedPool = CurPool;
1408 CurPool = &pool;
1409 return state;
1410 }
1411
1412 /// Leave a delayed-diagnostic state that was previously pushed.
1413 /// Do not emit any of the diagnostics. This is performed as part
1414 /// of the bookkeeping of popping a pool "properly".
1416 CurPool = state.SavedPool;
1417 }
1418
1419 /// Enter a new scope where access and deprecation diagnostics are
1420 /// not delayed.
1423 state.SavedPool = CurPool;
1424 CurPool = nullptr;
1425 return state;
1426 }
1427
1428 /// Undo a previous pushUndelayed().
1430 assert(CurPool == nullptr);
1431 CurPool = state.SavedPool;
1432 }
1434
1438
1439 /// Diagnostics that are emitted only if we discover that the given function
1440 /// must be codegen'ed. Because handling these correctly adds overhead to
1441 /// compilation, this is currently only used for offload languages like CUDA,
1442 /// OpenMP, and SYCL.
1443 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1444
1445 /// CurContext - This is the current declaration context of parsing.
1447
1449 assert(AMDGPUPtr);
1450 return *AMDGPUPtr;
1451 }
1452
1454 assert(ARMPtr);
1455 return *ARMPtr;
1456 }
1457
1459 assert(AVRPtr);
1460 return *AVRPtr;
1461 }
1462
1464 assert(BPFPtr);
1465 return *BPFPtr;
1466 }
1467
1469 assert(CodeCompletionPtr);
1470 return *CodeCompletionPtr;
1471 }
1472
1474 assert(CUDAPtr);
1475 return *CUDAPtr;
1476 }
1477
1479 assert(DirectXPtr);
1480 return *DirectXPtr;
1481 }
1482
1484 assert(HLSLPtr);
1485 return *HLSLPtr;
1486 }
1487
1489 assert(HexagonPtr);
1490 return *HexagonPtr;
1491 }
1492
1494 assert(LoongArchPtr);
1495 return *LoongArchPtr;
1496 }
1497
1499 assert(M68kPtr);
1500 return *M68kPtr;
1501 }
1502
1504 assert(MIPSPtr);
1505 return *MIPSPtr;
1506 }
1507
1509 assert(MSP430Ptr);
1510 return *MSP430Ptr;
1511 }
1512
1514 assert(NVPTXPtr);
1515 return *NVPTXPtr;
1516 }
1517
1519 assert(ObjCPtr);
1520 return *ObjCPtr;
1521 }
1522
1524 assert(OpenACCPtr);
1525 return *OpenACCPtr;
1526 }
1527
1529 assert(OpenCLPtr);
1530 return *OpenCLPtr;
1531 }
1532
1534 assert(OpenMPPtr && "SemaOpenMP is dead");
1535 return *OpenMPPtr;
1536 }
1537
1539 assert(PPCPtr);
1540 return *PPCPtr;
1541 }
1542
1544 assert(PseudoObjectPtr);
1545 return *PseudoObjectPtr;
1546 }
1547
1549 assert(RISCVPtr);
1550 return *RISCVPtr;
1551 }
1552
1554 assert(SPIRVPtr);
1555 return *SPIRVPtr;
1556 }
1557
1559 assert(SYCLPtr);
1560 return *SYCLPtr;
1561 }
1562
1564 assert(SwiftPtr);
1565 return *SwiftPtr;
1566 }
1567
1569 assert(SystemZPtr);
1570 return *SystemZPtr;
1571 }
1572
1574 assert(WasmPtr);
1575 return *WasmPtr;
1576 }
1577
1579 assert(X86Ptr);
1580 return *X86Ptr;
1581 }
1582
1583 /// Source of additional semantic information.
1585
1586protected:
1587 friend class Parser;
1589 friend class ASTReader;
1590 friend class ASTDeclReader;
1591 friend class ASTWriter;
1592
1593private:
1594 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1595 bool WarnedDarwinSDKInfoMissing = false;
1596
1597 StackExhaustionHandler StackHandler;
1598
1599 Sema(const Sema &) = delete;
1600 void operator=(const Sema &) = delete;
1601
1602 /// The handler for the FileChanged preprocessor events.
1603 ///
1604 /// Used for diagnostics that implement custom semantic analysis for #include
1605 /// directives, like -Wpragma-pack.
1606 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1607
1608 /// The parser's current scope.
1609 ///
1610 /// The parser maintains this state here.
1611 Scope *CurScope;
1612
1613 mutable IdentifierInfo *Ident_super;
1614
1615 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1616 std::unique_ptr<SemaARM> ARMPtr;
1617 std::unique_ptr<SemaAVR> AVRPtr;
1618 std::unique_ptr<SemaBPF> BPFPtr;
1619 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1620 std::unique_ptr<SemaCUDA> CUDAPtr;
1621 std::unique_ptr<SemaDirectX> DirectXPtr;
1622 std::unique_ptr<SemaHLSL> HLSLPtr;
1623 std::unique_ptr<SemaHexagon> HexagonPtr;
1624 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1625 std::unique_ptr<SemaM68k> M68kPtr;
1626 std::unique_ptr<SemaMIPS> MIPSPtr;
1627 std::unique_ptr<SemaMSP430> MSP430Ptr;
1628 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1629 std::unique_ptr<SemaObjC> ObjCPtr;
1630 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1631 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1632 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1633 std::unique_ptr<SemaPPC> PPCPtr;
1634 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1635 std::unique_ptr<SemaRISCV> RISCVPtr;
1636 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1637 std::unique_ptr<SemaSYCL> SYCLPtr;
1638 std::unique_ptr<SemaSwift> SwiftPtr;
1639 std::unique_ptr<SemaSystemZ> SystemZPtr;
1640 std::unique_ptr<SemaWasm> WasmPtr;
1641 std::unique_ptr<SemaX86> X86Ptr;
1642
1643 ///@}
1644
1645 //
1646 //
1647 // -------------------------------------------------------------------------
1648 //
1649 //
1650
1651 /// \name API Notes
1652 /// Implementations are in SemaAPINotes.cpp
1653 ///@{
1654
1655public:
1656 /// Map any API notes provided for this declaration to attributes on the
1657 /// declaration.
1658 ///
1659 /// Triggered by declaration-attribute processing.
1660 void ProcessAPINotes(Decl *D);
1661 /// Apply the 'Nullability:' annotation to the specified declaration
1662 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1663 /// Apply the 'Type:' annotation to the specified declaration
1664 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1665
1666 /// Whether APINotes should be gathered for all applicable Swift language
1667 /// versions, without being applied. Leaving clients of the current module
1668 /// to select and apply the correct version.
1670 return APINotes.captureVersionIndependentSwift();
1671 }
1672 ///@}
1673
1674 //
1675 //
1676 // -------------------------------------------------------------------------
1677 //
1678 //
1679
1680 /// \name C++ Access Control
1681 /// Implementations are in SemaAccess.cpp
1682 ///@{
1683
1684public:
1691
1692 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1693 /// Returns true on error (when the previous member decl access specifier
1694 /// is different from the new member decl access specifier).
1695 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1696 NamedDecl *PrevMemberDecl,
1697 AccessSpecifier LexicalAS);
1698
1699 /// Perform access-control checking on a previously-unresolved member
1700 /// access which has now been resolved to a member.
1702 DeclAccessPair FoundDecl);
1704 DeclAccessPair FoundDecl);
1705
1706 /// Checks access to an overloaded operator new or delete.
1708 SourceRange PlacementRange,
1709 CXXRecordDecl *NamingClass,
1710 DeclAccessPair FoundDecl,
1711 bool Diagnose = true);
1712
1713 /// Checks access to a constructor.
1715 DeclAccessPair FoundDecl,
1716 const InitializedEntity &Entity,
1717 bool IsCopyBindingRefToTemp = false);
1718
1719 /// Checks access to a constructor.
1721 DeclAccessPair FoundDecl,
1722 const InitializedEntity &Entity,
1723 const PartialDiagnostic &PDiag);
1725 CXXDestructorDecl *Dtor,
1726 const PartialDiagnostic &PDiag,
1727 QualType objectType = QualType());
1728
1729 /// Checks access to the target of a friend declaration.
1731
1732 /// Checks access to a member.
1734 CXXRecordDecl *NamingClass,
1736
1737 /// Checks implicit access to a member in a structured binding.
1740 CXXRecordDecl *DecomposedClass,
1741 DeclAccessPair Field);
1743 const SourceRange &,
1744 DeclAccessPair FoundDecl);
1745
1746 /// Checks access to an overloaded member operator, including
1747 /// conversion operators.
1749 Expr *ArgExpr,
1750 DeclAccessPair FoundDecl);
1752 ArrayRef<Expr *> ArgExprs,
1753 DeclAccessPair FoundDecl);
1755 DeclAccessPair FoundDecl);
1756
1757 /// Checks access for a hierarchy conversion.
1758 ///
1759 /// \param ForceCheck true if this check should be performed even if access
1760 /// control is disabled; some things rely on this for semantics
1761 /// \param ForceUnprivileged true if this check should proceed as if the
1762 /// context had no special privileges
1764 QualType Derived, const CXXBasePath &Path,
1765 unsigned DiagID, bool ForceCheck = false,
1766 bool ForceUnprivileged = false);
1767
1769 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1770 const CXXBasePath &Path, unsigned DiagID,
1771 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1772 bool ForceCheck = false, bool ForceUnprivileged = false);
1773
1774 /// Checks access to all the declarations in the given result set.
1775 void CheckLookupAccess(const LookupResult &R);
1776
1777 /// Checks access to Target from the given class. The check will take access
1778 /// specifiers into account, but no member access expressions and such.
1779 ///
1780 /// \param Target the declaration to check if it can be accessed
1781 /// \param NamingClass the class in which the lookup was started.
1782 /// \param BaseType type of the left side of member access expression.
1783 /// \p BaseType and \p NamingClass are used for C++ access control.
1784 /// Depending on the lookup case, they should be set to the following:
1785 /// - lhs.target (member access without a qualifier):
1786 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1787 /// - lhs.X::target (member access with a qualifier):
1788 /// BaseType is the type of 'lhs', NamingClass is 'X'
1789 /// - X::target (qualified lookup without member access):
1790 /// BaseType is null, NamingClass is 'X'.
1791 /// - target (unqualified lookup).
1792 /// BaseType is null, NamingClass is the parent class of 'target'.
1793 /// \return true if the Target is accessible from the Class, false otherwise.
1794 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1795 QualType BaseType);
1796
1797 /// Is the given member accessible for the purposes of deciding whether to
1798 /// define a special member function as deleted?
1800 DeclAccessPair Found, QualType ObjectType,
1801 SourceLocation Loc,
1802 const PartialDiagnostic &Diag);
1805 QualType ObjectType) {
1806 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1807 SourceLocation(), PDiag());
1808 }
1809
1811 const DependentDiagnostic &DD,
1812 const MultiLevelTemplateArgumentList &TemplateArgs);
1814
1815 ///@}
1816
1817 //
1818 //
1819 // -------------------------------------------------------------------------
1820 //
1821 //
1822
1823 /// \name Attributes
1824 /// Implementations are in SemaAttr.cpp
1825 ///@{
1826
1827public:
1828 /// Controls member pointer representation format under the MS ABI.
1831
1832 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1833
1834 /// Source location for newly created implicit MSInheritanceAttrs
1836
1842
1848
1850 PSK_Reset = 0x0, // #pragma ()
1851 PSK_Set = 0x1, // #pragma (value)
1852 PSK_Push = 0x2, // #pragma (push[, id])
1853 PSK_Pop = 0x4, // #pragma (pop[, id])
1854 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1855 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1856 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1857 };
1858
1864
1865 // #pragma pack and align.
1867 public:
1868 // `Native` represents default align mode, which may vary based on the
1869 // platform.
1870 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1871
1872 // #pragma pack info constructor
1873 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1874 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1875 assert(Num == PackNumber && "The pack number has been truncated.");
1876 }
1877
1878 // #pragma align info constructor
1880 : PackAttr(false), AlignMode(M),
1881 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1882
1883 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1884
1886
1887 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1888 // integer encoding for it. This should only be passed to
1889 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1890 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1891 std::uint32_t Encoding{};
1892 if (Info.IsXLStack())
1893 Encoding |= IsXLMask;
1894
1895 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1896
1897 if (Info.IsPackAttr())
1898 Encoding |= PackAttrMask;
1899
1900 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1901
1902 return Encoding;
1903 }
1904
1905 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1906 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1908 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1909 int PackNumber = (Encoding & PackNumMask) >> 4;
1910
1911 if (Encoding & PackAttrMask)
1912 return AlignPackInfo(M, PackNumber, IsXL);
1913
1914 return AlignPackInfo(M, IsXL);
1915 }
1916
1917 bool IsPackAttr() const { return PackAttr; }
1918
1919 bool IsAlignAttr() const { return !PackAttr; }
1920
1921 Mode getAlignMode() const { return AlignMode; }
1922
1923 unsigned getPackNumber() const { return PackNumber; }
1924
1925 bool IsPackSet() const {
1926 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1927 // attriute on a decl.
1928 return PackNumber != UninitPackVal && PackNumber != 0;
1929 }
1930
1931 bool IsXLStack() const { return XLStack; }
1932
1933 bool operator==(const AlignPackInfo &Info) const {
1934 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1935 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1936 Info.XLStack);
1937 }
1938
1939 bool operator!=(const AlignPackInfo &Info) const {
1940 return !(*this == Info);
1941 }
1942
1943 private:
1944 /// \brief True if this is a pragma pack attribute,
1945 /// not a pragma align attribute.
1946 bool PackAttr;
1947
1948 /// \brief The alignment mode that is in effect.
1949 Mode AlignMode;
1950
1951 /// \brief The pack number of the stack.
1952 unsigned char PackNumber;
1953
1954 /// \brief True if it is a XL #pragma align/pack stack.
1955 bool XLStack;
1956
1957 /// \brief Uninitialized pack value.
1958 static constexpr unsigned char UninitPackVal = -1;
1959
1960 // Masks to encode and decode an AlignPackInfo.
1961 static constexpr uint32_t IsXLMask{0x0000'0001};
1962 static constexpr uint32_t AlignModeMask{0x0000'0006};
1963 static constexpr uint32_t PackAttrMask{0x00000'0008};
1964 static constexpr uint32_t PackNumMask{0x0000'01F0};
1965 };
1966
1967 template <typename ValueType> struct PragmaStack {
1979
1980 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1981 llvm::StringRef StackSlotLabel, ValueType Value) {
1982 if (Action == PSK_Reset) {
1984 CurrentPragmaLocation = PragmaLocation;
1985 return;
1986 }
1987 if (Action & PSK_Push)
1988 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1989 PragmaLocation);
1990 else if (Action & PSK_Pop) {
1991 if (!StackSlotLabel.empty()) {
1992 // If we've got a label, try to find it and jump there.
1993 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1994 return x.StackSlotLabel == StackSlotLabel;
1995 });
1996 // If we found the label so pop from there.
1997 if (I != Stack.rend()) {
1998 CurrentValue = I->Value;
1999 CurrentPragmaLocation = I->PragmaLocation;
2000 Stack.erase(std::prev(I.base()), Stack.end());
2001 }
2002 } else if (!Stack.empty()) {
2003 // We do not have a label, just pop the last entry.
2004 CurrentValue = Stack.back().Value;
2005 CurrentPragmaLocation = Stack.back().PragmaLocation;
2006 Stack.pop_back();
2007 }
2008 }
2009 if (Action & PSK_Set) {
2011 CurrentPragmaLocation = PragmaLocation;
2012 }
2013 }
2014
2015 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
2016 // method body to restore the stacks on exit, so it works like this:
2017 //
2018 // struct S {
2019 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
2020 // void Method {}
2021 // #pragma <name>(pop, InternalPragmaSlot)
2022 // };
2023 //
2024 // It works even with #pragma vtordisp, although MSVC doesn't support
2025 // #pragma vtordisp(push [, id], n)
2026 // syntax.
2027 //
2028 // Push / pop a named sentinel slot.
2029 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
2030 assert((Action == PSK_Push || Action == PSK_Pop) &&
2031 "Can only push / pop #pragma stack sentinels!");
2032 Act(CurrentPragmaLocation, Action, Label, CurrentValue);
2033 }
2034
2035 // Constructors.
2036 explicit PragmaStack(const ValueType &Default)
2038
2039 bool hasValue() const { return CurrentValue != DefaultValue; }
2040
2042 ValueType DefaultValue; // Value used for PSK_Reset action.
2043 ValueType CurrentValue;
2045 };
2046 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2047 // we shouldn't do so if they're in a module).
2048
2049 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2050 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2051 ///
2052 /// 0: Suppress all vtordisps
2053 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2054 /// structors
2055 /// 2: Always insert vtordisps to support RTTI on partially constructed
2056 /// objects
2059 // The current #pragma align/pack values and locations at each #include.
2066 // Segment #pragmas.
2071
2072 // #pragma strict_gs_check.
2074
2075 // This stack tracks the current state of Sema.CurFPFeatures.
2078 FPOptionsOverride result;
2079 if (!FpPragmaStack.hasValue()) {
2080 result = FPOptionsOverride();
2081 } else {
2082 result = FpPragmaStack.CurrentValue;
2083 }
2084 return result;
2085 }
2086
2093
2094 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2095 // Actions should be performed only if we enter / exit a C++ method body.
2097 public:
2098 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2103
2104 private:
2105 Sema &S;
2106 StringRef SlotLabel;
2107 bool ShouldAct;
2108 };
2109
2110 /// Last section used with #pragma init_seg.
2113
2114 /// Sections used with #pragma alloc_text.
2115 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2116
2117 /// VisContext - Manages the stack for \#pragma GCC visibility.
2118 void *VisContext; // Really a "PragmaVisStack*"
2119
2120 /// This an attribute introduced by \#pragma clang attribute.
2127
2128 /// A push'd group of PragmaAttributeEntries.
2130 /// The location of the push attribute.
2132 /// The namespace of this push group.
2135 };
2136
2138
2139 /// The declaration that is currently receiving an attribute from the
2140 /// #pragma attribute stack.
2142
2143 /// This represents the last location of a "#pragma clang optimize off"
2144 /// directive if such a directive has not been closed by an "on" yet. If
2145 /// optimizations are currently "on", this is set to an invalid location.
2147
2148 /// Get the location for the currently active "\#pragma clang optimize
2149 /// off". If this location is invalid, then the state of the pragma is "on".
2153
2154 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2155 /// whether the optimizations in the list passed to the pragma should be
2156 /// turned off or on. This boolean is true by default because command line
2157 /// options are honored when `#pragma optimize("", on)`.
2158 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2160
2161 /// Set of no-builtin functions listed by \#pragma function.
2163
2164 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2165 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2167
2168 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2170
2171 /// Add gsl::Pointer attribute to std::container::iterator
2172 /// \param ND The declaration that introduces the name
2173 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2174 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2175
2176 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2178
2179 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2181
2182 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2184
2185 /// Add [[gsl::Pointer]] attributes for std:: types.
2187
2188 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2189 StringRef ParamName);
2190 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2191 // can be the name of a function parameter, we need to parse the function
2192 // declaration and rest of the parameters before processesing 'X'. Therefore
2193 // do this lazily instead of processing while parsing the annotation itself.
2195
2196 /// Add _Nullable attributes for std:: types.
2198
2199 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2202 PragmaClangSectionKind SecKind,
2203 StringRef SecName);
2204
2205 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2207 SourceLocation PragmaLoc);
2208
2209 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2210 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2211 StringRef SlotLabel, Expr *Alignment);
2212
2213 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2214 /// (unless they are value dependent or type dependent). Returns false
2215 /// and emits a diagnostic if one or more of the arguments could not be
2216 /// folded into a constant.
2219
2224
2226 SourceLocation IncludeLoc);
2228
2229 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2231
2232 /// ActOnPragmaMSComment - Called on well formed
2233 /// \#pragma comment(kind, "arg").
2235 StringRef Arg);
2236
2237 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2238 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2239 StringRef Value);
2240
2241 /// Are precise floating point semantics currently enabled?
2243 return !CurFPFeatures.getAllowFPReassociate() &&
2244 !CurFPFeatures.getNoSignedZero() &&
2245 !CurFPFeatures.getAllowReciprocal() &&
2246 !CurFPFeatures.getAllowApproxFunc();
2247 }
2248
2251
2252 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2253 void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
2255
2256 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2257 /// pointers_to_members(representation method[, general purpose
2258 /// representation]).
2261 SourceLocation PragmaLoc);
2262
2263 /// Called on well formed \#pragma vtordisp().
2264 void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
2266
2267 bool UnifySection(StringRef SectionName, int SectionFlags,
2268 NamedDecl *TheDecl);
2269 bool UnifySection(StringRef SectionName, int SectionFlags,
2270 SourceLocation PragmaSectionLocation);
2271
2272 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2273 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2274 PragmaMsStackAction Action,
2275 llvm::StringRef StackSlotLabel,
2276 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2277
2278 /// Called on well formed \#pragma section().
2279 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2280 StringLiteral *SegmentName);
2281
2282 /// Called on well-formed \#pragma init_seg().
2283 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2284 StringLiteral *SegmentName);
2285
2286 /// Called on well-formed \#pragma alloc_text().
2288 SourceLocation PragmaLocation, StringRef Section,
2289 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2290 &Functions);
2291
2292 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2293 /// strict_gs_check.
2295 PragmaMsStackAction Action,
2296 bool Value);
2297
2298 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2299 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2300 SourceLocation PragmaLoc);
2301
2303 SourceLocation PragmaLoc,
2306 const IdentifierInfo *Namespace);
2307
2308 /// Called on well-formed '\#pragma clang attribute pop'.
2310 const IdentifierInfo *Namespace);
2311
2312 /// Adds the attributes that have been specified using the
2313 /// '\#pragma clang attribute push' directives to the given declaration.
2314 void AddPragmaAttributes(Scope *S, Decl *D);
2315
2317 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2319 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2320 // This bypasses a lot of the filters in the diag engine, as it's
2321 // to be used to attach notes to diagnostics which have already
2322 // been filtered through.
2323 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2324 PD.Emit(Builder);
2325 };
2326 }
2327
2333
2335
2336 /// Called on well formed \#pragma clang optimize.
2337 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2338
2339 /// #pragma optimize("[optimization-list]", on | off).
2340 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2341
2342 /// Call on well formed \#pragma function.
2343 void
2345 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2346
2348 SourceLocation NameLoc,
2349 Scope *curScope);
2350
2351 /// Information from a C++ #pragma export, for a symbol that we
2352 /// haven't seen the declaration for yet.
2357
2358 llvm::DenseMap<IdentifierInfo *, PendingPragmaInfo> PendingExportedNames;
2359
2360 /// ActonPragmaExport - called on well-formed '\#pragma export'.
2361 void ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation ExportNameLoc,
2362 Scope *curScope);
2363
2364 /// Only called on function definitions; if there is a pragma in scope
2365 /// with the effect of a range-based optnone, consider marking the function
2366 /// with attribute optnone.
2368
2369 /// Only called on function definitions; if there is a `#pragma alloc_text`
2370 /// that decides which code section the function should be in, add
2371 /// attribute section to the function.
2373
2374 /// Adds the 'optnone' attribute to the function declaration if there
2375 /// are no conflicts; Loc represents the location causing the 'optnone'
2376 /// attribute to be added (usually because of a pragma).
2378
2379 /// Only called on function definitions; if there is a MSVC #pragma optimize
2380 /// in scope, consider changing the function's attributes based on the
2381 /// optimization list passed to the pragma.
2383
2384 /// Only called on function definitions; if there is a pragma in scope
2385 /// with the effect of a range-based no_builtin, consider marking the function
2386 /// with attribute no_builtin.
2388
2389 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2390 /// add an appropriate visibility attribute.
2392
2393 /// FreeVisContext - Deallocate and null out VisContext.
2394 void FreeVisContext();
2395
2396 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2397 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2398 SourceLocation PragmaLoc);
2399
2400 /// ActOnPragmaFPContract - Called on well formed
2401 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2402 /// \#pragma clang fp contract
2404
2405 /// Called on well formed
2406 /// \#pragma clang fp reassociate
2407 /// or
2408 /// \#pragma clang fp reciprocal
2410 bool IsEnabled);
2411
2412 /// ActOnPragmaFenvAccess - Called on well formed
2413 /// \#pragma STDC FENV_ACCESS
2414 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2415
2416 /// ActOnPragmaCXLimitedRange - Called on well formed
2417 /// \#pragma STDC CX_LIMITED_RANGE
2420
2421 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2424
2425 /// Called to set constant rounding mode for floating point operations.
2426 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2427
2428 /// Called to set exception behavior for floating point operations.
2430
2431 /// PushNamespaceVisibilityAttr - Note that we've entered a
2432 /// namespace with a visibility attribute.
2433 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2434 SourceLocation Loc);
2435
2436 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2437 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2438 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2439
2440 /// Handles semantic checking for features that are common to all attributes,
2441 /// such as checking whether a parameter was properly specified, or the
2442 /// correct number of arguments were passed, etc. Returns true if the
2443 /// attribute has been diagnosed.
2444 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2445 bool SkipArgCountCheck = false);
2446 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2447 bool SkipArgCountCheck = false);
2448
2449 ///@}
2450
2451 //
2452 //
2453 // -------------------------------------------------------------------------
2454 //
2455 //
2456
2457 /// \name Availability Attribute Handling
2458 /// Implementations are in SemaAvailability.cpp
2459 ///@{
2460
2461public:
2462 /// Issue any -Wunguarded-availability warnings in \c FD
2464
2466
2467 /// Retrieve the current function, if any, that should be analyzed for
2468 /// potential availability violations.
2470
2472 const ObjCInterfaceDecl *UnknownObjCClass,
2473 bool ObjCPropertyAccess,
2474 bool AvoidPartialAvailabilityChecks,
2475 ObjCInterfaceDecl *ClassReceiver);
2476
2478
2479 std::pair<AvailabilityResult, const NamedDecl *>
2480 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2481 ObjCInterfaceDecl *ClassReceiver);
2482 ///@}
2483
2484 //
2485 //
2486 // -------------------------------------------------------------------------
2487 //
2488 //
2489
2490 /// \name Bounds Safety
2491 /// Implementations are in SemaBoundsSafety.cpp
2492 ///@{
2493public:
2494 /// Check if applying the specified attribute variant from the "counted by"
2495 /// family of attributes to FieldDecl \p FD is semantically valid. If
2496 /// semantically invalid diagnostics will be emitted explaining the problems.
2497 ///
2498 /// \param FD The FieldDecl to apply the attribute to
2499 /// \param E The count expression on the attribute
2500 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2501 /// attributes. If the false the attribute is from
2502 /// "counted_by" family of attributes.
2503 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2504 /// of attributes. If false the attribute does not have the
2505 /// suffix.
2506 ///
2507 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2508 /// \p CountInBytes and \p OrNull both being true indicates the
2509 /// `counted_by_or_null` attribute.
2510 ///
2511 /// \returns false iff semantically valid.
2512 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2513 bool OrNull);
2514
2515 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2516 /// `__counted_by_or_null` pointer type \param LHSTy.
2517 ///
2518 /// \param LHSTy The type being assigned to. Checks will only be performed if
2519 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2520 /// \param RHSExpr The expression being assigned from.
2521 /// \param Action The type assignment being performed
2522 /// \param Loc The SourceLocation to use for error diagnostics
2523 /// \param Assignee The ValueDecl being assigned. This is used to compute
2524 /// the name of the assignee. If the assignee isn't known this can
2525 /// be set to nullptr.
2526 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2527 /// Assignee to compute the name of the assignee use the fully
2528 /// qualified name, otherwise use the unqualified name.
2529 ///
2530 /// \returns True iff no diagnostic where emitted, false otherwise.
2532 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2533 SourceLocation Loc, const ValueDecl *Assignee,
2534 bool ShowFullyQualifiedAssigneeName);
2535
2536 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2537 /// pointer.
2538 ///
2539 /// \param Entity The entity being initialized
2540 /// \param Kind The kind of initialization being performed
2541 /// \param Action The type assignment being performed
2542 /// \param LHSTy The type being assigned to. Checks will only be performed if
2543 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2544 /// \param RHSExpr The expression being used for initialization.
2545 ///
2546 /// \returns True iff no diagnostic where emitted, false otherwise.
2548 const InitializationKind &Kind,
2549 AssignmentAction Action,
2550 QualType LHSType, Expr *RHSExpr);
2551
2552 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2553 /// or counted_by_or_null pointers in \param E.
2554 ///
2555 /// \param E the expression to check
2556 ///
2557 /// \returns True iff no diagnostic where emitted, false otherwise.
2559 ///@}
2560
2561 //
2562 //
2563 // -------------------------------------------------------------------------
2564 //
2565 //
2566
2567 /// \name Casts
2568 /// Implementations are in SemaCast.cpp
2569 ///@{
2570
2571public:
2577
2578 /// ActOnCXXNamedCast - Parse
2579 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2581 SourceLocation LAngleBracketLoc, Declarator &D,
2582 SourceLocation RAngleBracketLoc,
2583 SourceLocation LParenLoc, Expr *E,
2584 SourceLocation RParenLoc);
2585
2587 TypeSourceInfo *Ty, Expr *E,
2588 SourceRange AngleBrackets, SourceRange Parens);
2589
2591 ExprResult Operand,
2592 SourceLocation RParenLoc);
2593
2595 Expr *Operand, SourceLocation RParenLoc);
2596
2597 // Checks that reinterpret casts don't have undefined behavior.
2598 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2599 bool IsDereference, SourceRange Range);
2600
2601 // Checks that the vector type should be initialized from a scalar
2602 // by splatting the value rather than populating a single element.
2603 // This is the case for AltiVecVector types as well as with
2604 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2605 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2606
2607 // Checks if the -faltivec-src-compat=gcc option is specified.
2608 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2609 // treated the same way as they are when trying to initialize
2610 // these vectors on gcc (an error is emitted).
2612 QualType SrcTy);
2613
2615 SourceLocation RParenLoc, Expr *Op);
2616
2618 SourceLocation LParenLoc,
2619 Expr *CastExpr,
2620 SourceLocation RParenLoc);
2621
2622 ///@}
2623
2624 //
2625 //
2626 // -------------------------------------------------------------------------
2627 //
2628 //
2629
2630 /// \name Extra Semantic Checking
2631 /// Implementations are in SemaChecking.cpp
2632 ///@{
2633
2634public:
2635 /// Used to change context to isConstantEvaluated without pushing a heavy
2636 /// ExpressionEvaluationContextRecord object.
2638
2643
2645 unsigned ByteNo) const;
2646
2648 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2649 FAPK_Variadic, // values to format are passed as variadic arguments
2650 FAPK_VAList, // values to format are passed in a va_list
2651 FAPK_Elsewhere, // values to format are not passed to this function
2652 };
2653
2654 // Used to grab the relevant information from a FormatAttr and a
2655 // FunctionDeclaration.
2661
2662 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2663 /// populate the FormatStringInfo parameter with the attribute's correct
2664 /// format_idx and firstDataArg. Returns true when the format fits the
2665 /// function and the FormatStringInfo has been populated.
2666 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2667 unsigned FirstArg, FormatStringInfo *FSI);
2668 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2669 bool HasImplicitThisParam, bool IsVariadic,
2670 FormatStringInfo *FSI);
2671
2672 // Used by C++ template instantiation.
2674
2675 /// ConvertVectorExpr - Handle __builtin_convertvector
2677 SourceLocation BuiltinLoc,
2678 SourceLocation RParenLoc);
2679
2680 static StringRef GetFormatStringTypeName(FormatStringType FST);
2681 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2682 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2683 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2684
2685 bool FormatStringHasSArg(const StringLiteral *FExpr);
2686
2687 /// Check for comparisons of floating-point values using == and !=. Issue a
2688 /// warning if the comparison is not likely to do what the programmer
2689 /// intended.
2690 void CheckFloatComparison(SourceLocation Loc, const Expr *LHS,
2691 const Expr *RHS, BinaryOperatorKind Opcode);
2692
2693 /// Register a magic integral constant to be used as a type tag.
2694 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2695 uint64_t MagicValue, QualType Type,
2696 bool LayoutCompatible, bool MustBeNull);
2697
2700
2704
2706
2707 /// If true, \c Type should be compared with other expression's types for
2708 /// layout-compatibility.
2709 LLVM_PREFERRED_TYPE(bool)
2711 LLVM_PREFERRED_TYPE(bool)
2712 unsigned MustBeNull : 1;
2713 };
2714
2715 /// A pair of ArgumentKind identifier and magic value. This uniquely
2716 /// identifies the magic value.
2717 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2718
2719 /// Diagnoses the current set of gathered accesses. This happens at the end of
2720 /// each expression evaluation context. Diagnostics are emitted only for
2721 /// accesses gathered in the current evaluation context.
2723
2724 /// This function checks if the expression is in the sef of potentially
2725 /// misaligned members and it is converted to some pointer type T with lower
2726 /// or equal alignment requirements. If so it removes it. This is used when
2727 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2728 /// void*).
2729 void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
2730
2731 /// Returns true if `From` is a function or pointer to a function with the
2732 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2733 /// function without this attribute.
2734 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2735
2736 /// This function calls Action when it determines that E designates a
2737 /// misaligned member due to the packed attribute. This is used to emit
2738 /// local diagnostics like in reference binding.
2740 Expr *E,
2741 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2742 Action);
2743
2744 enum class AtomicArgumentOrder { API, AST };
2746 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2747 SourceLocation RParenLoc, MultiExprArg Args,
2750
2751 /// Check to see if a given expression could have '.c_str()' called on it.
2752 bool hasCStrMethod(const Expr *E);
2753
2754 /// Diagnose pointers that are always non-null.
2755 /// \param E the expression containing the pointer
2756 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2757 /// compared to a null pointer
2758 /// \param IsEqual True when the comparison is equal to a null pointer
2759 /// \param Range Extra SourceRange to highlight in the diagnostic
2762 bool IsEqual, SourceRange Range);
2763
2764 /// CheckParmsForFunctionDef - Check that the parameters of the given
2765 /// function are appropriate for the definition of a function. This
2766 /// takes care of any checks that cannot be performed on the
2767 /// declaration itself, e.g., that the types of each of the function
2768 /// parameters are complete.
2770 bool CheckParameterNames);
2771
2772 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2773 /// pointer cast increases the alignment requirements.
2774 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2775
2776 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2777 /// to weak/__unsafe_unretained type.
2778 bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
2779
2780 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2781 /// to weak/__unsafe_unretained expression.
2782 void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
2783
2784 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2785 /// statement as a \p Body, and it is located on the same line.
2786 ///
2787 /// This helps prevent bugs due to typos, such as:
2788 /// if (condition);
2789 /// do_stuff();
2790 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2791 unsigned DiagID);
2792
2793 /// Warn if a for/while loop statement \p S, which is followed by
2794 /// \p PossibleBody, has a suspicious null statement as a body.
2795 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2796
2797 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2798 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2799 SourceLocation OpLoc);
2800
2801 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2803 const TypeSourceInfo *Derived);
2804
2805 /// CheckFunctionCall - Check a direct function call for various correctness
2806 /// and safety properties not strictly enforced by the C type system.
2807 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2808 const FunctionProtoType *Proto);
2809
2816
2817 /// \param FPOnly restricts the arguments to floating-point types.
2818 std::optional<QualType>
2819 BuiltinVectorMath(CallExpr *TheCall,
2822 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2823
2824 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2825 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2826
2827 /// Handles the checks for format strings, non-POD arguments to vararg
2828 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2829 /// attributes and AArch64 SME attributes.
2830 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2831 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2832 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2833 VariadicCallType CallType);
2834
2835 /// Verify that two format strings (as understood by attribute(format) and
2836 /// attribute(format_matches) are compatible. If they are incompatible,
2837 /// diagnostics are emitted with the assumption that \c
2838 /// AuthoritativeFormatString is correct and
2839 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2840 /// diagnostics will point to it and a note will refer to \c
2841 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2842 bool
2844 const StringLiteral *AuthoritativeFormatString,
2845 const StringLiteral *TestedFormatString,
2846 const Expr *FunctionCallArg = nullptr);
2847
2848 /// Verify that one format string (as understood by attribute(format)) is
2849 /// self-consistent; for instance, that it doesn't have multiple positional
2850 /// arguments referring to the same argument in incompatible ways. Diagnose
2851 /// if it isn't.
2853
2854 /// \brief Enforce the bounds of a TCB
2855 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2856 /// directly calls other functions in the same TCB as marked by the
2857 /// enforce_tcb and enforce_tcb_leaf attributes.
2858 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2859 const NamedDecl *Callee);
2860
2861 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2862
2863 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2864 /// TheCall is a constant expression.
2865 bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum,
2866 llvm::APSInt &Result);
2867
2868 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2869 /// TheCall is a constant expression in the range [Low, High].
2870 bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low,
2871 int High, bool RangeIsError = true);
2872
2873 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2874 /// TheCall is a constant expression is a multiple of Num..
2875 bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum,
2876 unsigned Multiple);
2877
2878 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2879 /// constant expression representing a power of 2.
2880 bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum);
2881
2882 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2883 /// a constant expression representing an arbitrary byte value shifted left by
2884 /// a multiple of 8 bits.
2885 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum,
2886 unsigned ArgBits);
2887
2888 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2889 /// TheCall is a constant expression representing either a shifted byte value,
2890 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2891 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2892 /// Arm MVE intrinsics.
2893 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum,
2894 unsigned ArgBits);
2895
2896 /// Checks that a call expression's argument count is at least the desired
2897 /// number. This is useful when doing custom type-checking on a variadic
2898 /// function. Returns true on error.
2899 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2900
2901 /// Checks that a call expression's argument count is at most the desired
2902 /// number. This is useful when doing custom type-checking on a variadic
2903 /// function. Returns true on error.
2904 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2905
2906 /// Checks that a call expression's argument count is in the desired range.
2907 /// This is useful when doing custom type-checking on a variadic function.
2908 /// Returns true on error.
2909 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2910 unsigned MaxArgCount);
2911
2912 /// Checks that a call expression's argument count is the desired number.
2913 /// This is useful when doing custom type-checking. Returns true on error.
2914 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2915
2916 /// Returns true if the argument consists of one contiguous run of 1s with any
2917 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2918 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2919 /// since all 1s are not contiguous.
2920 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2921
2923 bool *ICContext = nullptr,
2924 bool IsListInit = false);
2925
2926 /// Check for overflow behavior type related implicit conversion diagnostics.
2927 /// Returns true if OBT-related diagnostic was issued, false otherwise.
2929 SourceLocation CC);
2930
2931 bool
2936 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2938
2939private:
2940 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2941 const ArraySubscriptExpr *ASE = nullptr,
2942 bool AllowOnePastEnd = true, bool IndexNegated = false);
2943 void CheckArrayAccess(const Expr *E);
2944
2945 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2946 const FunctionProtoType *Proto);
2947
2948 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2949 /// such as function pointers returned from functions.
2950 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2951
2952 /// CheckConstructorCall - Check a constructor call for correctness and safety
2953 /// properties not enforced by the C type system.
2954 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2956 const FunctionProtoType *Proto, SourceLocation Loc);
2957
2958 /// Warn if a pointer or reference argument passed to a function points to an
2959 /// object that is less aligned than the parameter. This can happen when
2960 /// creating a typedef with a lower alignment than the original type and then
2961 /// calling functions defined in terms of the original type.
2962 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2963 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2964
2965 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2966
2967 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2968 CallExpr *TheCall);
2969
2970 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2971 CallExpr *TheCall);
2972
2973 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2974
2975 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2976 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2977 /// on failure; return false on success.
2978 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2979 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2980
2981 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2982 /// friends. This is declared to take (...), so we have to check everything.
2983 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2984
2985 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2986 /// __builtin_isnan and friends. This is declared to take (...), so we have
2987 /// to check everything.
2988 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2989 unsigned BuiltinID);
2990
2991 /// Perform semantic analysis for a call to __builtin_complex.
2992 bool BuiltinComplex(CallExpr *TheCall);
2993 bool BuiltinOSLogFormat(CallExpr *TheCall);
2994
2995 /// BuiltinPrefetch - Handle __builtin_prefetch.
2996 /// This is declared to take (const void*, ...) and can take two
2997 /// optional constant int args.
2998 bool BuiltinPrefetch(CallExpr *TheCall);
2999
3000 /// Handle __builtin_alloca_with_align. This is declared
3001 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
3002 /// than 8.
3003 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
3004
3005 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
3006 bool BuiltinArithmeticFence(CallExpr *TheCall);
3007
3008 /// BuiltinAssume - Handle __assume (MS Extension).
3009 /// __assume does not evaluate its arguments, and should warn if its argument
3010 /// has side effects.
3011 bool BuiltinAssume(CallExpr *TheCall);
3012
3013 /// Handle __builtin_assume_aligned. This is declared
3014 /// as (const void*, size_t, ...) and can take one optional constant int arg.
3015 bool BuiltinAssumeAligned(CallExpr *TheCall);
3016
3017 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
3018 /// This checks that the target supports __builtin_longjmp and
3019 /// that val is a constant 1.
3020 bool BuiltinLongjmp(CallExpr *TheCall);
3021
3022 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
3023 /// This checks that the target supports __builtin_setjmp.
3024 bool BuiltinSetjmp(CallExpr *TheCall);
3025
3026 /// We have a call to a function like __sync_fetch_and_add, which is an
3027 /// overloaded function based on the pointer type of its first argument.
3028 /// The main BuildCallExpr routines have already promoted the types of
3029 /// arguments because all of these calls are prototyped as void(...).
3030 ///
3031 /// This function goes through and does final semantic checking for these
3032 /// builtins, as well as generating any warnings.
3033 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
3034
3035 /// BuiltinNontemporalOverloaded - We have a call to
3036 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
3037 /// overloaded function based on the pointer type of its last argument.
3038 ///
3039 /// This function goes through and does final semantic checking for these
3040 /// builtins.
3041 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
3042 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
3044
3045 /// \param FPOnly restricts the arguments to floating-point types.
3046 bool BuiltinElementwiseMath(CallExpr *TheCall,
3049 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
3050
3051 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3052
3053 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3055 bool BuiltinCountedByRef(CallExpr *TheCall);
3056
3057 // Matrix builtin handling.
3058 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3059 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3060 ExprResult CallResult);
3061 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3062 ExprResult CallResult);
3063
3064 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3065 /// functions) for correct use of format strings.
3066 /// Returns true if a format string has been fully checked.
3067 bool CheckFormatArguments(const FormatAttr *Format,
3068 ArrayRef<const Expr *> Args, bool IsCXXMember,
3069 VariadicCallType CallType, SourceLocation Loc,
3070 SourceRange Range,
3071 llvm::SmallBitVector &CheckedVarArgs);
3072 bool CheckFormatString(const FormatMatchesAttr *Format,
3073 ArrayRef<const Expr *> Args, bool IsCXXMember,
3074 VariadicCallType CallType, SourceLocation Loc,
3075 SourceRange Range,
3076 llvm::SmallBitVector &CheckedVarArgs);
3077 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3078 FormatArgumentPassingKind FAPK,
3079 StringLiteral *ReferenceFormatString,
3080 unsigned format_idx, unsigned firstDataArg,
3082 SourceLocation Loc, SourceRange range,
3083 llvm::SmallBitVector &CheckedVarArgs);
3084
3085 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3086
3087 /// Warn when using the wrong abs() function.
3088 void CheckAbsoluteValueFunction(const CallExpr *Call,
3089 const FunctionDecl *FDecl);
3090
3091 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3092
3093 /// Check for dangerous or invalid arguments to memset().
3094 ///
3095 /// This issues warnings on known problematic, dangerous or unspecified
3096 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3097 /// function calls.
3098 ///
3099 /// \param Call The call expression to diagnose.
3100 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3101 IdentifierInfo *FnName);
3102
3103 bool CheckSizeofMemaccessArgument(const Expr *SizeOfArg, const Expr *Dest,
3104 IdentifierInfo *FnName);
3105 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3106 // be the size of the source, instead of the destination.
3107 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3108
3109 // Warn on anti-patterns as the 'size' argument to strncat.
3110 // The correct size argument should look like following:
3111 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3112 void CheckStrncatArguments(const CallExpr *Call,
3113 const IdentifierInfo *FnName);
3114
3115 /// Alerts the user that they are attempting to free a non-malloc'd object.
3116 void CheckFreeArguments(const CallExpr *E);
3117
3118 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3119 SourceLocation ReturnLoc, bool isObjCMethod = false,
3120 const AttrVec *Attrs = nullptr,
3121 const FunctionDecl *FD = nullptr);
3122
3123 /// Diagnoses "dangerous" implicit conversions within the given
3124 /// expression (which is a full expression). Implements -Wconversion
3125 /// and -Wsign-compare.
3126 ///
3127 /// \param CC the "context" location of the implicit conversion, i.e.
3128 /// the most location of the syntactic entity requiring the implicit
3129 /// conversion
3130 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3131
3132 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3133 /// Input argument E is a logical expression.
3135
3136 /// Diagnose when expression is an integer constant expression and its
3137 /// evaluation results in integer overflow
3138 void CheckForIntOverflow(const Expr *E);
3139 void CheckUnsequencedOperations(const Expr *E);
3140
3141 /// Perform semantic checks on a completed expression. This will either
3142 /// be a full-expression or a default argument expression.
3143 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3144 bool IsConstexpr = false);
3145
3146 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3147 Expr *Init);
3148
3149 /// A map from magic value to type information.
3150 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3151 TypeTagForDatatypeMagicValues;
3152
3153 /// Peform checks on a call of a function with argument_with_type_tag
3154 /// or pointer_with_type_tag attributes.
3155 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3156 const ArrayRef<const Expr *> ExprArgs,
3157 SourceLocation CallSiteLoc);
3158
3159 /// Check if we are taking the address of a packed field
3160 /// as this may be a problem if the pointer value is dereferenced.
3161 void CheckAddressOfPackedMember(Expr *rhs);
3162
3163 /// Helper class that collects misaligned member designations and
3164 /// their location info for delayed diagnostics.
3165 struct MisalignedMember {
3166 Expr *E;
3167 RecordDecl *RD;
3168 ValueDecl *MD;
3169 CharUnits Alignment;
3170
3171 MisalignedMember() : E(), RD(), MD() {}
3172 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3173 CharUnits Alignment)
3174 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3175 explicit MisalignedMember(Expr *E)
3176 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3177
3178 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3179 };
3180
3181 /// Adds an expression to the set of gathered misaligned members.
3182 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3183 CharUnits Alignment);
3184 ///@}
3185
3186 //
3187 //
3188 // -------------------------------------------------------------------------
3189 //
3190 //
3191
3192 /// \name C++ Coroutines
3193 /// Implementations are in SemaCoroutine.cpp
3194 ///@{
3195
3196public:
3197 /// The C++ "std::coroutine_traits" template, which is defined in
3198 /// <coroutine_traits>
3200
3202 StringRef Keyword);
3206
3209 UnresolvedLookupExpr *Lookup);
3211 Expr *Awaiter, bool IsImplicit = false);
3213 UnresolvedLookupExpr *Lookup);
3216 bool IsImplicit = false);
3221
3222 // As a clang extension, enforces that a non-coroutine function must be marked
3223 // with [[clang::coro_wrapper]] if it returns a type marked with
3224 // [[clang::coro_return_type]].
3225 // Expects that FD is not a coroutine.
3227 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3228 /// namespace. The namespace found is recorded in Namespace.
3230 SourceLocation FuncLoc);
3231 /// Check that the expression co_await promise.final_suspend() shall not be
3232 /// potentially-throwing.
3233 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3234
3235 ///@}
3236
3237 //
3238 //
3239 // -------------------------------------------------------------------------
3240 //
3241 //
3242
3243 /// \name C++ Scope Specifiers
3244 /// Implementations are in SemaCXXScopeSpec.cpp
3245 ///@{
3246
3247public:
3248 // Marks SS invalid if it represents an incomplete type.
3250 // Complete an enum decl, maybe without a scope spec.
3252 CXXScopeSpec *SS = nullptr);
3253
3254 /// Compute the DeclContext that is associated with the given type.
3255 ///
3256 /// \param T the type for which we are attempting to find a DeclContext.
3257 ///
3258 /// \returns the declaration context represented by the type T,
3259 /// or NULL if the declaration context cannot be computed (e.g., because it is
3260 /// dependent and not the current instantiation).
3262
3263 /// Compute the DeclContext that is associated with the given
3264 /// scope specifier.
3265 ///
3266 /// \param SS the C++ scope specifier as it appears in the source
3267 ///
3268 /// \param EnteringContext when true, we will be entering the context of
3269 /// this scope specifier, so we can retrieve the declaration context of a
3270 /// class template or class template partial specialization even if it is
3271 /// not the current instantiation.
3272 ///
3273 /// \returns the declaration context represented by the scope specifier @p SS,
3274 /// or NULL if the declaration context cannot be computed (e.g., because it is
3275 /// dependent and not the current instantiation).
3277 bool EnteringContext = false);
3279
3280 /// If the given nested name specifier refers to the current
3281 /// instantiation, return the declaration that corresponds to that
3282 /// current instantiation (C++0x [temp.dep.type]p1).
3283 ///
3284 /// \param NNS a dependent nested name specifier.
3286
3287 /// The parser has parsed a global nested-name-specifier '::'.
3288 ///
3289 /// \param CCLoc The location of the '::'.
3290 ///
3291 /// \param SS The nested-name-specifier, which will be updated in-place
3292 /// to reflect the parsed nested-name-specifier.
3293 ///
3294 /// \returns true if an error occurred, false otherwise.
3296
3297 /// The parser has parsed a '__super' nested-name-specifier.
3298 ///
3299 /// \param SuperLoc The location of the '__super' keyword.
3300 ///
3301 /// \param ColonColonLoc The location of the '::'.
3302 ///
3303 /// \param SS The nested-name-specifier, which will be updated in-place
3304 /// to reflect the parsed nested-name-specifier.
3305 ///
3306 /// \returns true if an error occurred, false otherwise.
3308 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3309
3310 /// Determines whether the given declaration is an valid acceptable
3311 /// result for name lookup of a nested-name-specifier.
3312 /// \param SD Declaration checked for nested-name-specifier.
3313 /// \param IsExtension If not null and the declaration is accepted as an
3314 /// extension, the pointed variable is assigned true.
3316 bool *CanCorrect = nullptr);
3317
3318 /// If the given nested-name-specifier begins with a bare identifier
3319 /// (e.g., Base::), perform name lookup for that identifier as a
3320 /// nested-name-specifier within the given scope, and return the result of
3321 /// that name lookup.
3323
3324 /// Keeps information about an identifier in a nested-name-spec.
3325 ///
3327 /// The type of the object, if we're parsing nested-name-specifier in
3328 /// a member access expression.
3330
3331 /// The identifier preceding the '::'.
3333
3334 /// The location of the identifier.
3336
3337 /// The location of the '::'.
3339
3340 /// Creates info object for the most typical case.
3342 SourceLocation ColonColonLoc,
3345 CCLoc(ColonColonLoc) {}
3346
3348 SourceLocation ColonColonLoc, QualType ObjectType)
3350 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3351 };
3352
3353 /// Build a new nested-name-specifier for "identifier::", as described
3354 /// by ActOnCXXNestedNameSpecifier.
3355 ///
3356 /// \param S Scope in which the nested-name-specifier occurs.
3357 /// \param IdInfo Parser information about an identifier in the
3358 /// nested-name-spec.
3359 /// \param EnteringContext If true, enter the context specified by the
3360 /// nested-name-specifier.
3361 /// \param SS Optional nested name specifier preceding the identifier.
3362 /// \param ScopeLookupResult Provides the result of name lookup within the
3363 /// scope of the nested-name-specifier that was computed at template
3364 /// definition time.
3365 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3366 /// error recovery and what kind of recovery is performed.
3367 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3368 /// are allowed. The bool value pointed by this parameter is set to
3369 /// 'true' if the identifier is treated as if it was followed by ':',
3370 /// not '::'.
3371 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3372 ///
3373 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3374 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3375 /// the result of name lookup within the scope of the nested-name-specifier
3376 /// that was computed at template definition time.
3377 ///
3378 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3379 /// recovery. This means that it should not emit diagnostics, it should
3380 /// just return true on failure. It also means it should only return a valid
3381 /// scope if it *knows* that the result is correct. It should not return in a
3382 /// dependent context, for example. Nor will it extend \p SS with the scope
3383 /// specifier.
3384 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3385 bool EnteringContext, CXXScopeSpec &SS,
3386 NamedDecl *ScopeLookupResult,
3387 bool ErrorRecoveryLookup,
3388 bool *IsCorrectedToColon = nullptr,
3389 bool OnlyNamespace = false);
3390
3391 /// The parser has parsed a nested-name-specifier 'identifier::'.
3392 ///
3393 /// \param S The scope in which this nested-name-specifier occurs.
3394 ///
3395 /// \param IdInfo Parser information about an identifier in the
3396 /// nested-name-spec.
3397 ///
3398 /// \param EnteringContext Whether we're entering the context nominated by
3399 /// this nested-name-specifier.
3400 ///
3401 /// \param SS The nested-name-specifier, which is both an input
3402 /// parameter (the nested-name-specifier before this type) and an
3403 /// output parameter (containing the full nested-name-specifier,
3404 /// including this new type).
3405 ///
3406 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3407 /// are allowed. The bool value pointed by this parameter is set to 'true'
3408 /// if the identifier is treated as if it was followed by ':', not '::'.
3409 ///
3410 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3411 ///
3412 /// \returns true if an error occurred, false otherwise.
3413 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3414 bool EnteringContext, CXXScopeSpec &SS,
3415 bool *IsCorrectedToColon = nullptr,
3416 bool OnlyNamespace = false);
3417
3418 /// The parser has parsed a nested-name-specifier
3419 /// 'template[opt] template-name < template-args >::'.
3420 ///
3421 /// \param S The scope in which this nested-name-specifier occurs.
3422 ///
3423 /// \param SS The nested-name-specifier, which is both an input
3424 /// parameter (the nested-name-specifier before this type) and an
3425 /// output parameter (containing the full nested-name-specifier,
3426 /// including this new type).
3427 ///
3428 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3429 /// \param TemplateName the template name.
3430 /// \param TemplateNameLoc The location of the template name.
3431 /// \param LAngleLoc The location of the opening angle bracket ('<').
3432 /// \param TemplateArgs The template arguments.
3433 /// \param RAngleLoc The location of the closing angle bracket ('>').
3434 /// \param CCLoc The location of the '::'.
3435 ///
3436 /// \param EnteringContext Whether we're entering the context of the
3437 /// nested-name-specifier.
3438 ///
3439 ///
3440 /// \returns true if an error occurred, false otherwise.
3442 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3443 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3444 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3445 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3446
3448 SourceLocation ColonColonLoc);
3449
3451 const DeclSpec &DS,
3452 SourceLocation ColonColonLoc,
3453 QualType Type);
3454
3455 /// IsInvalidUnlessNestedName - This method is used for error recovery
3456 /// purposes to determine whether the specified identifier is only valid as
3457 /// a nested name specifier, for example a namespace name. It is
3458 /// conservatively correct to always return false from this method.
3459 ///
3460 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3462 NestedNameSpecInfo &IdInfo,
3463 bool EnteringContext);
3464
3465 /// Given a C++ nested-name-specifier, produce an annotation value
3466 /// that the parser can use later to reconstruct the given
3467 /// nested-name-specifier.
3468 ///
3469 /// \param SS A nested-name-specifier.
3470 ///
3471 /// \returns A pointer containing all of the information in the
3472 /// nested-name-specifier \p SS.
3474
3475 /// Given an annotation pointer for a nested-name-specifier, restore
3476 /// the nested-name-specifier structure.
3477 ///
3478 /// \param Annotation The annotation pointer, produced by
3479 /// \c SaveNestedNameSpecifierAnnotation().
3480 ///
3481 /// \param AnnotationRange The source range corresponding to the annotation.
3482 ///
3483 /// \param SS The nested-name-specifier that will be updated with the contents
3484 /// of the annotation pointer.
3485 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3486 SourceRange AnnotationRange,
3487 CXXScopeSpec &SS);
3488
3489 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3490
3491 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3492 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3493 /// After this method is called, according to [C++ 3.4.3p3], names should be
3494 /// looked up in the declarator-id's scope, until the declarator is parsed and
3495 /// ActOnCXXExitDeclaratorScope is called.
3496 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3498
3499 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3500 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3501 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3502 /// Used to indicate that names should revert to being looked up in the
3503 /// defining scope.
3505
3506 ///@}
3507
3508 //
3509 //
3510 // -------------------------------------------------------------------------
3511 //
3512 //
3513
3514 /// \name Declarations
3515 /// Implementations are in SemaDecl.cpp
3516 ///@{
3517
3518public:
3520
3521 /// The index of the first InventedParameterInfo that refers to the current
3522 /// context.
3524
3525 /// A RAII object to temporarily push a declaration context.
3527 private:
3528 Sema &S;
3529 DeclContext *SavedContext;
3530 ProcessingContextState SavedContextState;
3531 QualType SavedCXXThisTypeOverride;
3532 unsigned SavedFunctionScopesStart;
3533 unsigned SavedInventedParameterInfosStart;
3534
3535 public:
3536 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3537 : S(S), SavedContext(S.CurContext),
3538 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3539 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3540 SavedFunctionScopesStart(S.FunctionScopesStart),
3541 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3542 assert(ContextToPush && "pushing null context");
3543 S.CurContext = ContextToPush;
3544 if (NewThisContext)
3545 S.CXXThisTypeOverride = QualType();
3546 // Any saved FunctionScopes do not refer to this context.
3547 S.FunctionScopesStart = S.FunctionScopes.size();
3548 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3549 }
3550
3551 void pop() {
3552 if (!SavedContext)
3553 return;
3554 S.CurContext = SavedContext;
3555 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3556 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3557 S.FunctionScopesStart = SavedFunctionScopesStart;
3558 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3559 SavedContext = nullptr;
3560 }
3561
3563 ContextRAII(const ContextRAII &) = delete;
3565 };
3566
3567 void DiagnoseInvalidJumps(Stmt *Body);
3568
3569 /// The function definitions which were renamed as part of typo-correction
3570 /// to match their respective declarations. We want to keep track of them
3571 /// to ensure that we don't emit a "redefinition" error if we encounter a
3572 /// correctly named definition after the renamed definition.
3574
3575 /// A cache of the flags available in enumerations with the flag_bits
3576 /// attribute.
3577 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3578
3579 /// A cache of enumerator values for enums checked by -Wassign-enum.
3580 llvm::DenseMap<const EnumDecl *, llvm::SmallVector<llvm::APSInt>>
3582
3583 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3584 /// declared. Rare. May alias another identifier, declared or undeclared.
3585 ///
3586 /// For aliases, the target identifier is used as a key for eventual
3587 /// processing when the target is declared. For the single-identifier form,
3588 /// the sole identifier is used as the key. Each entry is a `SetVector`
3589 /// (ordered by parse order) of aliases (identified by the alias name) in case
3590 /// of multiple aliases to the same undeclared identifier.
3591 llvm::MapVector<
3593 llvm::SetVector<
3595 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3597
3598 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3599 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3600 /// to define functions that occur in multiple standards to call the version
3601 /// in the currently selected standard.
3602 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3603
3604 /// Set containing all typedefs that are likely unused.
3607
3611
3612 /// The set of file scoped decls seen so far that have not been used
3613 /// and must warn if not used. Only contains the first declaration.
3615
3619
3620 /// All the tentative definitions encountered in the TU.
3622
3623 /// All the external declarations encoutered and used in the TU.
3625
3626 /// Generally null except when we temporarily switch decl contexts,
3627 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3629
3630 /// Is the module scope we are in a C++ Header Unit?
3632 return ModuleScopes.empty() ? false
3633 : ModuleScopes.back().Module->isHeaderUnit();
3634 }
3635
3636 /// Get the module owning an entity.
3637 Module *getOwningModule(const Decl *Entity) {
3638 return Entity->getOwningModule();
3639 }
3640
3641 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3642
3644 /// Returns the TypeDeclType for the given type declaration,
3645 /// as ASTContext::getTypeDeclType would, but
3646 /// performs the required semantic checks for name lookup of said entity.
3647 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3648 SourceLocation NameLoc);
3649
3650 /// If the identifier refers to a type name within this scope,
3651 /// return the declaration of that type.
3652 ///
3653 /// This routine performs ordinary name lookup of the identifier II
3654 /// within the given scope, with optional C++ scope specifier SS, to
3655 /// determine whether the name refers to a type. If so, returns an
3656 /// opaque pointer (actually a QualType) corresponding to that
3657 /// type. Otherwise, returns NULL.
3659 Scope *S, CXXScopeSpec *SS = nullptr,
3660 bool isClassName = false, bool HasTrailingDot = false,
3661 ParsedType ObjectType = nullptr,
3662 bool IsCtorOrDtorName = false,
3663 bool WantNontrivialTypeSourceInfo = false,
3664 bool IsClassTemplateDeductionContext = true,
3665 ImplicitTypenameContext AllowImplicitTypename =
3667 IdentifierInfo **CorrectedII = nullptr);
3668
3669 /// isTagName() - This method is called *for error recovery purposes only*
3670 /// to determine if the specified name is a valid tag name ("struct foo"). If
3671 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3672 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3673 /// diagnose cases in C where the user forgot to specify the tag.
3675
3676 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3677 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3678 /// then downgrade the missing typename error to a warning.
3679 /// This is needed for MSVC compatibility; Example:
3680 /// @code
3681 /// template<class T> class A {
3682 /// public:
3683 /// typedef int TYPE;
3684 /// };
3685 /// template<class T> class B : public A<T> {
3686 /// public:
3687 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3688 /// };
3689 /// @endcode
3690 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3692 Scope *S, CXXScopeSpec *SS,
3693 ParsedType &SuggestedType,
3694 bool IsTemplateName = false);
3695
3696 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3697 /// type name has failed in a dependent context. In these situations, we
3698 /// automatically form a DependentTypeName that will retry lookup in a related
3699 /// scope during instantiation.
3701 SourceLocation NameLoc,
3702 bool IsTemplateTypeArg);
3703
3704 class NameClassification {
3706 union {
3711 };
3712
3713 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3714
3715 public:
3718
3721
3722 static NameClassification Error() {
3723 return NameClassification(NameClassificationKind::Error);
3724 }
3725
3726 static NameClassification Unknown() {
3727 return NameClassification(NameClassificationKind::Unknown);
3728 }
3729
3730 static NameClassification OverloadSet(ExprResult E) {
3731 NameClassification Result(NameClassificationKind::OverloadSet);
3732 Result.Expr = E;
3733 return Result;
3734 }
3735
3736 static NameClassification NonType(NamedDecl *D) {
3737 NameClassification Result(NameClassificationKind::NonType);
3738 Result.NonTypeDecl = D;
3739 return Result;
3740 }
3741
3742 static NameClassification UndeclaredNonType() {
3743 return NameClassification(NameClassificationKind::UndeclaredNonType);
3744 }
3745
3746 static NameClassification DependentNonType() {
3747 return NameClassification(NameClassificationKind::DependentNonType);
3748 }
3749
3750 static NameClassification TypeTemplate(TemplateName Name) {
3751 NameClassification Result(NameClassificationKind::TypeTemplate);
3752 Result.Template = Name;
3753 return Result;
3754 }
3755
3756 static NameClassification VarTemplate(TemplateName Name) {
3757 NameClassification Result(NameClassificationKind::VarTemplate);
3758 Result.Template = Name;
3759 return Result;
3760 }
3761
3762 static NameClassification FunctionTemplate(TemplateName Name) {
3764 Result.Template = Name;
3765 return Result;
3766 }
3767
3768 static NameClassification Concept(TemplateName Name) {
3769 NameClassification Result(NameClassificationKind::Concept);
3770 Result.Template = Name;
3771 return Result;
3772 }
3773
3774 static NameClassification UndeclaredTemplate(TemplateName Name) {
3776 Result.Template = Name;
3777 return Result;
3778 }
3779
3780 NameClassificationKind getKind() const { return Kind; }
3781
3784 return Expr;
3785 }
3786
3788 assert(Kind == NameClassificationKind::Type);
3789 return Type;
3790 }
3791
3793 assert(Kind == NameClassificationKind::NonType);
3794 return NonTypeDecl;
3795 }
3796
3805
3807 switch (Kind) {
3809 return TNK_Type_template;
3811 return TNK_Function_template;
3813 return TNK_Var_template;
3815 return TNK_Concept_template;
3818 default:
3819 llvm_unreachable("unsupported name classification.");
3820 }
3821 }
3822 };
3823
3824 /// Perform name lookup on the given name, classifying it based on
3825 /// the results of name lookup and the following token.
3826 ///
3827 /// This routine is used by the parser to resolve identifiers and help direct
3828 /// parsing. When the identifier cannot be found, this routine will attempt
3829 /// to correct the typo and classify based on the resulting name.
3830 ///
3831 /// \param S The scope in which we're performing name lookup.
3832 ///
3833 /// \param SS The nested-name-specifier that precedes the name.
3834 ///
3835 /// \param Name The identifier. If typo correction finds an alternative name,
3836 /// this pointer parameter will be updated accordingly.
3837 ///
3838 /// \param NameLoc The location of the identifier.
3839 ///
3840 /// \param NextToken The token following the identifier. Used to help
3841 /// disambiguate the name.
3842 ///
3843 /// \param CCC The correction callback, if typo correction is desired.
3844 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3845 IdentifierInfo *&Name, SourceLocation NameLoc,
3846 const Token &NextToken,
3847 CorrectionCandidateCallback *CCC = nullptr);
3848
3849 /// Act on the result of classifying a name as an undeclared (ADL-only)
3850 /// non-type declaration.
3852 SourceLocation NameLoc);
3853 /// Act on the result of classifying a name as an undeclared member of a
3854 /// dependent base class.
3856 IdentifierInfo *Name,
3857 SourceLocation NameLoc,
3858 bool IsAddressOfOperand);
3859 /// Act on the result of classifying a name as a specific non-type
3860 /// declaration.
3863 SourceLocation NameLoc,
3864 const Token &NextToken);
3865 /// Act on the result of classifying a name as an overload set.
3867
3868 /// Describes the detailed kind of a template name. Used in diagnostics.
3880
3881 /// Determine whether it's plausible that E was intended to be a
3882 /// template-name.
3884 if (!getLangOpts().CPlusPlus || E.isInvalid())
3885 return false;
3886 Dependent = false;
3887 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3888 return !DRE->hasExplicitTemplateArgs();
3889 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3890 return !ME->hasExplicitTemplateArgs();
3891 Dependent = true;
3892 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3893 return !DSDRE->hasExplicitTemplateArgs();
3894 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3895 return !DSME->hasExplicitTemplateArgs();
3896 // Any additional cases recognized here should also be handled by
3897 // diagnoseExprIntendedAsTemplateName.
3898 return false;
3899 }
3900
3901 void warnOnReservedIdentifier(const NamedDecl *D);
3903
3904 void ProcessPragmaExport(DeclaratorDecl *newDecl);
3905
3907
3909 MultiTemplateParamsArg TemplateParameterLists);
3910
3911 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3912 /// true if we were successful.
3914 SourceLocation Loc,
3915 unsigned FailedFoldDiagID);
3916
3917 /// Register the given locally-scoped extern "C" declaration so
3918 /// that it can be found later for redeclarations. We include any extern "C"
3919 /// declaration that is not visible in the translation unit here, not just
3920 /// function-scope declarations.
3922
3923 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3924 /// If T is the name of a class, then each of the following shall have a
3925 /// name different from T:
3926 /// - every static data member of class T;
3927 /// - every member function of class T
3928 /// - every member of class T that is itself a type;
3929 /// \returns true if the declaration name violates these rules.
3931
3932 /// Diagnose a declaration whose declarator-id has the given
3933 /// nested-name-specifier.
3934 ///
3935 /// \param SS The nested-name-specifier of the declarator-id.
3936 ///
3937 /// \param DC The declaration context to which the nested-name-specifier
3938 /// resolves.
3939 ///
3940 /// \param Name The name of the entity being declared.
3941 ///
3942 /// \param Loc The location of the name of the entity being declared.
3943 ///
3944 /// \param IsMemberSpecialization Whether we are declaring a member
3945 /// specialization.
3946 ///
3947 /// \param TemplateId The template-id, if any.
3948 ///
3949 /// \returns true if we cannot safely recover from this error, false
3950 /// otherwise.
3953 TemplateIdAnnotation *TemplateId,
3954 bool IsMemberSpecialization);
3955
3957
3958 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3959
3961 unsigned &IntVal);
3962
3963 /// Diagnose function specifiers on a declaration of an identifier that
3964 /// does not identify a function.
3965 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3966
3967 /// Return the declaration shadowed by the given typedef \p D, or null
3968 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3970 const LookupResult &R);
3971
3972 /// Return the declaration shadowed by the given variable \p D, or null
3973 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3975
3976 /// Return the declaration shadowed by the given variable \p D, or null
3977 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3979 const LookupResult &R);
3980 /// Diagnose variable or built-in function shadowing. Implements
3981 /// -Wshadow.
3982 ///
3983 /// This method is called whenever a VarDecl is added to a "useful"
3984 /// scope.
3985 ///
3986 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3987 /// \param R the lookup of the name
3988 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3989 const LookupResult &R);
3990
3991 /// Check -Wshadow without the advantage of a previous lookup.
3992 void CheckShadow(Scope *S, VarDecl *D);
3993
3994 /// Warn if 'E', which is an expression that is about to be modified, refers
3995 /// to a shadowing declaration.
3997
3998 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3999 /// when these variables are captured by the lambda.
4001
4002 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
4003 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
4004 TypedefNameDecl *NewTD);
4007 TypeSourceInfo *TInfo,
4009
4010 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
4011 /// declares a typedef-name, either using the 'typedef' type specifier or via
4012 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
4016 TypeSourceInfo *TInfo,
4018 MultiTemplateParamsArg TemplateParamLists,
4019 bool &AddToScope,
4021
4022private:
4023 // Perform a check on an AsmLabel to verify its consistency and emit
4024 // diagnostics in case of an error.
4025 void CheckAsmLabel(Scope *S, Expr *AsmLabelExpr, StorageClass SC,
4026 TypeSourceInfo *TInfo, VarDecl *);
4027
4028public:
4029 /// Perform semantic checking on a newly-created variable
4030 /// declaration.
4031 ///
4032 /// This routine performs all of the type-checking required for a
4033 /// variable declaration once it has been built. It is used both to
4034 /// check variables after they have been parsed and their declarators
4035 /// have been translated into a declaration, and to check variables
4036 /// that have been instantiated from a template.
4037 ///
4038 /// Sets NewVD->isInvalidDecl() if an error was encountered.
4039 ///
4040 /// Returns true if the variable declaration is a redeclaration.
4041 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
4042 void CheckVariableDeclarationType(VarDecl *NewVD);
4043 void CheckCompleteVariableDeclaration(VarDecl *VD);
4044
4045 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
4046 TypeSourceInfo *TInfo,
4047 LookupResult &Previous,
4048 MultiTemplateParamsArg TemplateParamLists,
4049 bool &AddToScope);
4050
4051 /// AddOverriddenMethods - See if a method overrides any in the base classes,
4052 /// and if so, check that it's a valid override and remember it.
4053 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
4054
4055 /// Perform semantic checking of a new function declaration.
4056 ///
4057 /// Performs semantic analysis of the new function declaration
4058 /// NewFD. This routine performs all semantic checking that does not
4059 /// require the actual declarator involved in the declaration, and is
4060 /// used both for the declaration of functions as they are parsed
4061 /// (called via ActOnDeclarator) and for the declaration of functions
4062 /// that have been instantiated via C++ template instantiation (called
4063 /// via InstantiateDecl).
4064 ///
4065 /// \param IsMemberSpecialization whether this new function declaration is
4066 /// a member specialization (that replaces any definition provided by the
4067 /// previous declaration).
4068 ///
4069 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4070 ///
4071 /// \returns true if the function declaration is a redeclaration.
4072 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4073 LookupResult &Previous,
4074 bool IsMemberSpecialization, bool DeclIsDefn);
4075
4076 /// Checks if the new declaration declared in dependent context must be
4077 /// put in the same redeclaration chain as the specified declaration.
4078 ///
4079 /// \param D Declaration that is checked.
4080 /// \param PrevDecl Previous declaration found with proper lookup method for
4081 /// the same declaration name.
4082 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4083 /// belongs to.
4084 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4085
4086 /// Determines if we can perform a correct type check for \p D as a
4087 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4088 /// best-effort check.
4089 ///
4090 /// \param NewD The new declaration.
4091 /// \param OldD The old declaration.
4092 /// \param NewT The portion of the type of the new declaration to check.
4093 /// \param OldT The portion of the type of the old declaration to check.
4094 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4095 QualType NewT, QualType OldT);
4096 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4097 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4098
4099 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4100 /// containing class. Otherwise it will return implicit SectionAttr if the
4101 /// function is a definition and there is an active value on CodeSegStack
4102 /// (from the current #pragma code-seg value).
4103 ///
4104 /// \param FD Function being declared.
4105 /// \param IsDefinition Whether it is a definition or just a declaration.
4106 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4107 /// nullptr if no attribute should be added.
4108 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4109 bool IsDefinition);
4110
4111 /// Common checks for a parameter-declaration that should apply to both
4112 /// function parameters and non-type template parameters.
4113 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4114
4115 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4116 /// to introduce parameters into function prototype scope.
4117 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4118 SourceLocation ExplicitThisLoc = {});
4119
4120 /// Synthesizes a variable for a parameter arising from a
4121 /// typedef.
4122 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4123 QualType T);
4124 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4125 SourceLocation NameLoc,
4126 const IdentifierInfo *Name, QualType T,
4127 TypeSourceInfo *TSInfo, StorageClass SC);
4128
4129 /// Emit diagnostics if the initializer or any of its explicit or
4130 /// implicitly-generated subexpressions require copying or
4131 /// default-initializing a type that is or contains a C union type that is
4132 /// non-trivial to copy or default-initialize.
4133 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4134
4135 // These flags are passed to checkNonTrivialCUnion.
4141
4142 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4143 /// a non-trivial C union is used in an invalid context.
4145 NonTrivialCUnionContext UseContext,
4146 unsigned NonTrivialKind);
4147
4148 /// Certain globally-unique variables might be accidentally duplicated if
4149 /// built into multiple shared libraries with hidden visibility. This can
4150 /// cause problems if the variable is mutable, its initialization is
4151 /// effectful, or its address is taken.
4154
4155 /// AddInitializerToDecl - Adds the initializer Init to the
4156 /// declaration dcl. If DirectInit is true, this is C++ direct
4157 /// initialization rather than copy initialization.
4158 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4159 void ActOnUninitializedDecl(Decl *dcl);
4160
4161 /// ActOnInitializerError - Given that there was an error parsing an
4162 /// initializer for the given declaration, try to at least re-establish
4163 /// invariants such as whether a variable's type is either dependent or
4164 /// complete.
4165 void ActOnInitializerError(Decl *Dcl);
4166
4167 void ActOnCXXForRangeDecl(Decl *D);
4169 IdentifierInfo *Ident,
4170 ParsedAttributes &Attrs);
4171
4172 /// Check if VD needs to be dllexport/dllimport due to being in a
4173 /// dllexport/import function.
4176
4177 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4178 /// any semantic actions necessary after any initializer has been attached.
4179 void FinalizeDeclaration(Decl *D);
4181 ArrayRef<Decl *> Group);
4182
4183 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4184 /// group, performing any necessary semantic checking.
4186
4187 /// Should be called on all declarations that might have attached
4188 /// documentation comments.
4189 void ActOnDocumentableDecl(Decl *D);
4191
4192 enum class FnBodyKind {
4193 /// C++26 [dcl.fct.def.general]p1
4194 /// function-body:
4195 /// ctor-initializer[opt] compound-statement
4196 /// function-try-block
4198 /// = default ;
4200 /// deleted-function-body
4201 ///
4202 /// deleted-function-body:
4203 /// = delete ;
4204 /// = delete ( unevaluated-string ) ;
4206 };
4207
4209 SourceLocation LocAfterDecls);
4211 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4212 SkipBodyInfo *SkipBody = nullptr);
4214 MultiTemplateParamsArg TemplateParamLists,
4215 SkipBodyInfo *SkipBody = nullptr,
4216 FnBodyKind BodyKind = FnBodyKind::Other);
4218 SkipBodyInfo *SkipBody = nullptr,
4219 FnBodyKind BodyKind = FnBodyKind::Other);
4221
4222 /// Determine whether we can delay parsing the body of a function or
4223 /// function template until it is used, assuming we don't care about emitting
4224 /// code for that function.
4225 ///
4226 /// This will be \c false if we may need the body of the function in the
4227 /// middle of parsing an expression (where it's impractical to switch to
4228 /// parsing a different function), for instance, if it's constexpr in C++11
4229 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4230 bool canDelayFunctionBody(const Declarator &D);
4231
4232 /// Determine whether we can skip parsing the body of a function
4233 /// definition, assuming we don't care about analyzing its body or emitting
4234 /// code for that function.
4235 ///
4236 /// This will be \c false only if we may need the body of the function in
4237 /// order to parse the rest of the program (for instance, if it is
4238 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4239 bool canSkipFunctionBody(Decl *D);
4240
4241 /// Given the set of return statements within a function body,
4242 /// compute the variables that are subject to the named return value
4243 /// optimization.
4244 ///
4245 /// Each of the variables that is subject to the named return value
4246 /// optimization will be marked as NRVO variables in the AST, and any
4247 /// return statement that has a marked NRVO variable as its NRVO candidate can
4248 /// use the named return value optimization.
4249 ///
4250 /// This function applies a very simplistic algorithm for NRVO: if every
4251 /// return statement in the scope of a variable has the same NRVO candidate,
4252 /// that candidate is an NRVO variable.
4254
4255 /// Performs semantic analysis at the end of a function body.
4256 ///
4257 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4258 /// releasing the associated \p FunctionScopeInfo. This is useful when
4259 /// building e.g. LambdaExprs.
4261 bool IsInstantiation = false,
4262 bool RetainFunctionScopeInfo = false);
4265
4266 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4267 /// attribute for which parsing is delayed.
4269
4270 /// Diagnose any unused parameters in the given sequence of
4271 /// ParmVarDecl pointers.
4273
4274 /// Diagnose whether the size of parameters or return value of a
4275 /// function or obj-c method definition is pass-by-value and larger than a
4276 /// specified threshold.
4277 void
4279 QualType ReturnTy, NamedDecl *D);
4280
4282 SourceLocation RParenLoc);
4283
4286
4287 void ActOnPopScope(SourceLocation Loc, Scope *S);
4288
4289 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4290 /// no declarator (e.g. "struct foo;") is parsed.
4292 const ParsedAttributesView &DeclAttrs,
4293 RecordDecl *&AnonRecord);
4294
4295 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4296 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4297 /// parameters to cope with template friend declarations.
4299 const ParsedAttributesView &DeclAttrs,
4300 MultiTemplateParamsArg TemplateParams,
4301 bool IsExplicitInstantiation,
4302 RecordDecl *&AnonRecord,
4303 SourceLocation EllipsisLoc = {});
4304
4305 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4306 /// anonymous structure or union. Anonymous unions are a C++ feature
4307 /// (C++ [class.union]) and a C11 feature; anonymous structures
4308 /// are a C11 feature and GNU C++ extension.
4309 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4310 RecordDecl *Record,
4311 const PrintingPolicy &Policy);
4312
4313 /// Called once it is known whether
4314 /// a tag declaration is an anonymous union or struct.
4316
4317 /// Emit diagnostic warnings for placeholder members.
4318 /// We can only do that after the class is fully constructed,
4319 /// as anonymous union/structs can insert placeholders
4320 /// in their parent scope (which might be a Record).
4322
4323 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4324 /// Microsoft C anonymous structure.
4325 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4326 /// Example:
4327 ///
4328 /// struct A { int a; };
4329 /// struct B { struct A; int b; };
4330 ///
4331 /// void foo() {
4332 /// B var;
4333 /// var.a = 3;
4334 /// }
4335 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4336 RecordDecl *Record);
4337
4338 /// Given a non-tag type declaration, returns an enum useful for indicating
4339 /// what kind of non-tag type this is.
4340 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4341
4342 /// Determine whether a tag with a given kind is acceptable
4343 /// as a redeclaration of the given tag declaration.
4344 ///
4345 /// \returns true if the new tag kind is acceptable, false otherwise.
4347 bool isDefinition, SourceLocation NewTagLoc,
4348 const IdentifierInfo *Name);
4349
4350 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4351 /// former case, Name will be non-null. In the later case, Name will be null.
4352 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4353 /// a reference/declaration/definition of a tag.
4354 ///
4355 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4356 /// trailing-type-specifier) other than one in an alias-declaration.
4357 ///
4358 /// \param SkipBody If non-null, will be set to indicate if the caller should
4359 /// skip the definition of this tag and treat it as if it were a declaration.
4360 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4361 SourceLocation KWLoc, CXXScopeSpec &SS,
4362 IdentifierInfo *Name, SourceLocation NameLoc,
4363 const ParsedAttributesView &Attr, AccessSpecifier AS,
4364 SourceLocation ModulePrivateLoc,
4365 MultiTemplateParamsArg TemplateParameterLists,
4366 bool &OwnedDecl, bool &IsDependent,
4367 SourceLocation ScopedEnumKWLoc,
4368 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4369 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4370 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4371
4372 /// ActOnField - Each field of a C struct/union is passed into this in order
4373 /// to create a FieldDecl object for it.
4374 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4375 Declarator &D, Expr *BitfieldWidth);
4376
4377 /// HandleField - Analyze a field of a C struct or a C++ data member.
4378 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4379 Declarator &D, Expr *BitfieldWidth,
4380 InClassInitStyle InitStyle, AccessSpecifier AS);
4381
4382 /// Build a new FieldDecl and check its well-formedness.
4383 ///
4384 /// This routine builds a new FieldDecl given the fields name, type,
4385 /// record, etc. \p PrevDecl should refer to any previous declaration
4386 /// with the same name and in the same scope as the field to be
4387 /// created.
4388 ///
4389 /// \returns a new FieldDecl.
4390 ///
4391 /// \todo The Declarator argument is a hack. It will be removed once
4392 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4393 TypeSourceInfo *TInfo, RecordDecl *Record,
4394 SourceLocation Loc, bool Mutable,
4395 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4396 SourceLocation TSSL, AccessSpecifier AS,
4397 NamedDecl *PrevDecl, Declarator *D = nullptr);
4398
4400
4401 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4402 /// class and class extensions. For every class \@interface and class
4403 /// extension \@interface, if the last ivar is a bitfield of any type,
4404 /// then add an implicit `char :0` ivar to the end of that interface.
4405 void ActOnLastBitfield(SourceLocation DeclStart,
4406 SmallVectorImpl<Decl *> &AllIvarDecls);
4407
4408 // This is used for both record definitions and ObjC interface declarations.
4409 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4410 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4411 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4412
4413 /// ActOnTagStartDefinition - Invoked when we have entered the
4414 /// scope of a tag's definition (e.g., for an enumeration, class,
4415 /// struct, or union).
4416 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4417
4418 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4419 /// Differently from C++, actually parse the body and reject / error out
4420 /// in case of a structural mismatch.
4421 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4422
4424
4425 /// Invoked when we enter a tag definition that we're skipping.
4427
4428 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4429 /// C++ record definition's base-specifiers clause and are starting its
4430 /// member declarations.
4432 SourceLocation FinalLoc,
4433 bool IsFinalSpelledSealed,
4434 bool IsAbstract,
4435 SourceLocation LBraceLoc);
4436
4437 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4438 /// the definition of a tag (enumeration, class, struct, or union).
4440 SourceRange BraceRange);
4441
4444
4446
4447 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4448 /// error parsing the definition of a tag.
4450
4452 EnumConstantDecl *LastEnumConst,
4453 SourceLocation IdLoc, IdentifierInfo *Id,
4454 Expr *val);
4455
4456 /// Check that this is a valid underlying type for an enum declaration.
4458
4459 /// Check whether this is a valid redeclaration of a previous enumeration.
4460 /// \return true if the redeclaration was invalid.
4461 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4462 QualType EnumUnderlyingTy, bool IsFixed,
4463 const EnumDecl *Prev);
4464
4465 /// Determine whether the body of an anonymous enumeration should be skipped.
4466 /// \param II The name of the first enumerator.
4468 SourceLocation IILoc);
4469
4470 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4471 SourceLocation IdLoc, IdentifierInfo *Id,
4472 const ParsedAttributesView &Attrs,
4473 SourceLocation EqualLoc, Expr *Val,
4474 SkipBodyInfo *SkipBody = nullptr);
4475 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4476 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4477 const ParsedAttributesView &Attr);
4478
4479 /// Set the current declaration context until it gets popped.
4480 void PushDeclContext(Scope *S, DeclContext *DC);
4481 void PopDeclContext();
4482
4483 /// EnterDeclaratorContext - Used when we must lookup names in the context
4484 /// of a declarator's nested name specifier.
4487
4488 /// Enter a template parameter scope, after it's been associated with a
4489 /// particular DeclContext. Causes lookup within the scope to chain through
4490 /// enclosing contexts in the correct order.
4492
4493 /// Push the parameters of D, which must be a function, into scope.
4496
4497 /// Add this decl to the scope shadowed decl chains.
4498 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4499
4500 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4501 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4502 /// true if 'D' belongs to the given declaration context.
4503 ///
4504 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4505 /// enclosing namespace set of the context, rather than contained
4506 /// directly within it.
4507 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4508 bool AllowInlineNamespace = false) const;
4509
4510 /// Finds the scope corresponding to the given decl context, if it
4511 /// happens to be an enclosing scope. Otherwise return NULL.
4513
4514 /// Subroutines of ActOnDeclarator().
4516 TypeSourceInfo *TInfo);
4518
4519 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4521 NamedDecl *New, Decl *Old,
4523
4524 /// CheckAttributesOnDeducedType - Calls Sema functions for attributes that
4525 /// requires the type to be deduced.
4527
4528 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4529 /// same name and scope as a previous declaration 'Old'. Figure out
4530 /// how to resolve this situation, merging decls or emitting
4531 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4533 LookupResult &OldDecls);
4534
4535 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4536 /// definition visible.
4537 /// This method performs any necessary cleanup on the parser state to discard
4538 /// child nodes from newly parsed decl we are retiring.
4539 void CleanupMergedEnum(Scope *S, Decl *New);
4540
4541 /// MergeFunctionDecl - We just parsed a function 'New' from
4542 /// declarator D which has the same name and scope as a previous
4543 /// declaration 'Old'. Figure out how to resolve this situation,
4544 /// merging decls or emitting diagnostics as appropriate.
4545 ///
4546 /// In C++, New and Old must be declarations that are not
4547 /// overloaded. Use IsOverload to determine whether New and Old are
4548 /// overloaded, and to select the Old declaration that New should be
4549 /// merged with.
4550 ///
4551 /// Returns true if there was an error, false otherwise.
4553 bool MergeTypeWithOld, bool NewDeclIsDefn);
4554
4555 /// Completes the merge of two function declarations that are
4556 /// known to be compatible.
4557 ///
4558 /// This routine handles the merging of attributes and other
4559 /// properties of function declarations from the old declaration to
4560 /// the new declaration, once we know that New is in fact a
4561 /// redeclaration of Old.
4562 ///
4563 /// \returns false
4565 Scope *S, bool MergeTypeWithOld);
4567
4568 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4569 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4570 /// situation, merging decls or emitting diagnostics as appropriate.
4571 ///
4572 /// Tentative definition rules (C99 6.9.2p2) are checked by
4573 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4574 /// definitions here, since the initializer hasn't been attached.
4576
4577 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4578 /// scope as a previous declaration 'Old'. Figure out how to merge their
4579 /// types, emitting diagnostics as appropriate.
4580 ///
4581 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4582 /// back to here in AddInitializerToDecl. We can't check them before the
4583 /// initializer is attached.
4584 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4585
4586 /// We've just determined that \p Old and \p New both appear to be definitions
4587 /// of the same variable. Either diagnose or fix the problem.
4588 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4590
4591 /// Filters out lookup results that don't fall within the given scope
4592 /// as determined by isDeclInScope.
4594 bool ConsiderLinkage, bool AllowInlineNamespace);
4595
4596 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4597 /// have compatible owning modules.
4599
4600 /// [module.interface]p6:
4601 /// A redeclaration of an entity X is implicitly exported if X was introduced
4602 /// by an exported declaration; otherwise it shall not be exported.
4604
4605 /// A wrapper function for checking the semantic restrictions of
4606 /// a redeclaration within a module.
4608
4609 /// Check the redefinition in C++20 Modules.
4610 ///
4611 /// [basic.def.odr]p14:
4612 /// For any definable item D with definitions in multiple translation units,
4613 /// - if D is a non-inline non-templated function or variable, or
4614 /// - if the definitions in different translation units do not satisfy the
4615 /// following requirements,
4616 /// the program is ill-formed; a diagnostic is required only if the
4617 /// definable item is attached to a named module and a prior definition is
4618 /// reachable at the point where a later definition occurs.
4619 /// - Each such definition shall not be attached to a named module
4620 /// ([module.unit]).
4621 /// - Each such definition shall consist of the same sequence of tokens, ...
4622 /// ...
4623 ///
4624 /// Return true if the redefinition is not allowed. Return false otherwise.
4625 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4626
4628
4629 /// If it's a file scoped decl that must warn if not used, keep track
4630 /// of it.
4632
4633 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4635
4638 DiagReceiverTy DiagReceiver);
4639 void DiagnoseUnusedDecl(const NamedDecl *ND);
4640
4641 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4642 /// unless they are marked attr(unused).
4643 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4644
4645 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4646 /// variable.
4647 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4648
4649 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4650 /// from S, where a non-field would be declared. This routine copes
4651 /// with the difference between C and C++ scoping rules in structs and
4652 /// unions. For example, the following code is well-formed in C but
4653 /// ill-formed in C++:
4654 /// @code
4655 /// struct S6 {
4656 /// enum { BAR } e;
4657 /// };
4658 ///
4659 /// void test_S6() {
4660 /// struct S6 a;
4661 /// a.e = BAR;
4662 /// }
4663 /// @endcode
4664 /// For the declaration of BAR, this routine will return a different
4665 /// scope. The scope S will be the scope of the unnamed enumeration
4666 /// within S6. In C++, this routine will return the scope associated
4667 /// with S6, because the enumeration's scope is a transparent
4668 /// context but structures can contain non-field names. In C, this
4669 /// routine will return the translation unit scope, since the
4670 /// enumeration's scope is a transparent context and structures cannot
4671 /// contain non-field names.
4673
4675 SourceLocation Loc);
4676
4677 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4678 /// file scope. lazily create a decl for it. ForRedeclaration is true
4679 /// if we're creating this built-in in anticipation of redeclaring the
4680 /// built-in.
4681 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4682 bool ForRedeclaration, SourceLocation Loc);
4683
4684 /// Get the outermost AttributedType node that sets a calling convention.
4685 /// Valid types should not have multiple attributes with different CCs.
4686 const AttributedType *getCallingConvAttributedType(QualType T) const;
4687
4688 /// GetNameForDeclarator - Determine the full declaration name for the
4689 /// given Declarator.
4691
4692 /// Retrieves the declaration name from a parsed unqualified-id.
4694
4695 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4696 /// we are currently parsing the initializer.
4698
4699 /// Look for a locally scoped extern "C" declaration by the given name.
4701
4704
4705 /// Adjust the \c DeclContext for a function or variable that might be a
4706 /// function-local external declaration.
4708
4710
4711 /// Checks if the variant/multiversion functions are compatible.
4713 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4714 const PartialDiagnostic &NoProtoDiagID,
4715 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4716 const PartialDiagnosticAt &NoSupportDiagIDAt,
4717 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4718 bool ConstexprSupported, bool CLinkageMayDiffer);
4719
4720 /// type checking declaration initializers (C99 6.7.8)
4722 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4723
4726 SourceRange Range, bool DirectInit,
4727 Expr *Init);
4728
4730 Expr *Init);
4731
4733
4734 // Heuristically tells if the function is `get_return_object` member of a
4735 // coroutine promise_type by matching the function name.
4736 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4737 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4738
4739 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4740 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4742 Scope *S);
4743
4744 /// If this function is a C++ replaceable global allocation function
4745 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4746 /// adds any function attributes that we know a priori based on the standard.
4747 ///
4748 /// We need to check for duplicate attributes both here and where user-written
4749 /// attributes are applied to declarations.
4751 FunctionDecl *FD);
4752
4753 /// Adds any function attributes that we know a priori based on
4754 /// the declaration of this function.
4755 ///
4756 /// These attributes can apply both to implicitly-declared builtins
4757 /// (like __builtin___printf_chk) or to library-declared functions
4758 /// like NSLog or printf.
4759 ///
4760 /// We need to check for duplicate attributes both here and where user-written
4761 /// attributes are applied to declarations.
4763
4764 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4765 /// the correct width, and that the field type is valid.
4766 /// Returns false on success.
4768 const IdentifierInfo *FieldName, QualType FieldTy,
4769 bool IsMsStruct, Expr *BitWidth);
4770
4771 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4772 /// enum. If AllowMask is true, then we also allow the complement of a valid
4773 /// value, to be used as a mask.
4774 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4775 bool AllowMask) const;
4776
4777 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4778 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4779 SourceLocation WeakNameLoc);
4780
4781 /// ActOnPragmaRedefineExtname - Called on well formed
4782 /// \#pragma redefine_extname oldname newname.
4784 IdentifierInfo *AliasName,
4785 SourceLocation PragmaLoc,
4786 SourceLocation WeakNameLoc,
4787 SourceLocation AliasNameLoc);
4788
4789 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4790 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4791 SourceLocation PragmaLoc,
4792 SourceLocation WeakNameLoc,
4793 SourceLocation AliasNameLoc);
4794
4795 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4798 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4799 OMPDiscarded, // Discarded due to OpenMP hostness
4800 TemplateDiscarded, // Discarded due to uninstantiated templates
4802 };
4803 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4804 bool Final = false);
4805
4806 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4808
4809 /// Function or variable declarations to be checked for whether the deferred
4810 /// diagnostics should be emitted.
4812
4813private:
4814 /// Map of current shadowing declarations to shadowed declarations. Warn if
4815 /// it looks like the user is trying to modify the shadowing declaration.
4816 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4817
4818 // We need this to handle
4819 //
4820 // typedef struct {
4821 // void *foo() { return 0; }
4822 // } A;
4823 //
4824 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4825 // for example. If 'A', foo will have external linkage. If we have '*A',
4826 // foo will have no linkage. Since we can't know until we get to the end
4827 // of the typedef, this function finds out if D might have non-external
4828 // linkage. Callers should verify at the end of the TU if it D has external
4829 // linkage or not.
4830 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4831
4832#include "clang/Sema/AttrIsTypeDependent.inc"
4833
4834 ///@}
4835
4836 //
4837 //
4838 // -------------------------------------------------------------------------
4839 //
4840 //
4841
4842 /// \name Declaration Attribute Handling
4843 /// Implementations are in SemaDeclAttr.cpp
4844 ///@{
4845
4846public:
4847 /// Describes the kind of priority given to an availability attribute.
4848 ///
4849 /// The sum of priorities deteremines the final priority of the attribute.
4850 /// The final priority determines how the attribute will be merged.
4851 /// An attribute with a lower priority will always remove higher priority
4852 /// attributes for the specified platform when it is being applied. An
4853 /// attribute with a higher priority will not be applied if the declaration
4854 /// already has an availability attribute with a lower priority for the
4855 /// specified platform. The final prirority values are not expected to match
4856 /// the values in this enumeration, but instead should be treated as a plain
4857 /// integer value. This enumeration just names the priority weights that are
4858 /// used to calculate that final vaue.
4860 /// The availability attribute was specified explicitly next to the
4861 /// declaration.
4863
4864 /// The availability attribute was applied using '#pragma clang attribute'.
4866
4867 /// The availability attribute for a specific platform was inferred from
4868 /// an availability attribute for another platform.
4870
4871 /// The availability attribute was inferred from an 'anyAppleOS'
4872 /// availability attribute.
4874
4875 /// The availability attribute was inferred from an 'anyAppleOS'
4876 /// availability attribute that was applied using '#pragma clang attribute'.
4877 /// This has the lowest priority.
4879 };
4880
4881 /// Describes the reason a calling convention specification was ignored, used
4882 /// for diagnostics.
4889
4890 /// A helper function to provide Attribute Location for the Attr types
4891 /// AND the ParsedAttr.
4892 template <typename AttrInfo>
4893 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4894 getAttrLoc(const AttrInfo &AL) {
4895 return AL.getLocation();
4896 }
4898
4899 /// If Expr is a valid integer constant, get the value of the integer
4900 /// expression and return success or failure. May output an error.
4901 ///
4902 /// Negative argument is implicitly converted to unsigned, unless
4903 /// \p StrictlyUnsigned is true.
4904 template <typename AttrInfo>
4905 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4906 unsigned Idx = UINT_MAX,
4907 bool StrictlyUnsigned = false) {
4908 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4909 if (Expr->isTypeDependent() ||
4911 if (Idx != UINT_MAX)
4912 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4913 << &AI << Idx << AANT_ArgumentIntegerConstant
4914 << Expr->getSourceRange();
4915 else
4916 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4918 return false;
4919 }
4920
4921 if (!I->isIntN(32)) {
4922 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4923 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4924 return false;
4925 }
4926
4927 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4928 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4929 << &AI << /*non-negative*/ 1;
4930 return false;
4931 }
4932
4933 Val = (uint32_t)I->getZExtValue();
4934 return true;
4935 }
4936
4937 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4938 /// \#pragma weak during processing of other Decls.
4939 /// I couldn't figure out a clean way to generate these in-line, so
4940 /// we store them here and handle separately -- which is a hack.
4941 /// It would be best to refactor this.
4943
4944 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4946
4950
4951 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4952 /// us to associate a raw vector type with one of the ext_vector type names.
4953 /// This is only necessary for issuing pretty diagnostics.
4955
4956 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4957 /// and return false, otherwise set \p Str to the value of the string literal
4958 /// and return true.
4960 const Expr *E, StringRef &Str,
4961 SourceLocation *ArgLocation = nullptr);
4962
4963 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4964 /// If not emit an error and return false. If the argument is an identifier it
4965 /// will emit an error with a fixit hint and treat it as if it was a string
4966 /// literal.
4967 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4968 StringRef &Str,
4969 SourceLocation *ArgLocation = nullptr);
4970
4971 /// Determine if type T is a valid subject for a nonnull and similar
4972 /// attributes. Dependent types are considered valid so they can be checked
4973 /// during instantiation time. By default, we look through references (the
4974 /// behavior used by nonnull), but if the second parameter is true, then we
4975 /// treat a reference type as valid.
4976 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4977
4978 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4979 /// declaration.
4980 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4981 Expr *OE);
4982
4983 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4984 /// declaration.
4985 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
4986 Expr *ParamExpr);
4987
4988 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4989 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4990
4991 AvailabilityAttr *
4993 const IdentifierInfo *Platform, bool Implicit,
4994 VersionTuple Introduced, VersionTuple Deprecated,
4995 VersionTuple Obsoleted, bool IsUnavailable,
4996 StringRef Message, bool IsStrict, StringRef Replacement,
4997 AvailabilityMergeKind AMK, int Priority,
4998 const IdentifierInfo *IIEnvironment,
4999 const IdentifierInfo *InferredPlatformII = nullptr);
5000
5001 AvailabilityAttr *mergeAndInferAvailabilityAttr(
5002 NamedDecl *D, const AttributeCommonInfo &CI,
5003 const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced,
5004 VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable,
5005 StringRef Message, bool IsStrict, StringRef Replacement,
5006 AvailabilityMergeKind AMK, int Priority,
5007 const IdentifierInfo *IIEnvironment,
5008 const IdentifierInfo *InferredPlatformII);
5009
5010 TypeVisibilityAttr *
5012 TypeVisibilityAttr::VisibilityType Vis);
5013 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
5014 VisibilityAttr::VisibilityType Vis);
5016 VisibilityAttr::VisibilityType Type);
5017 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
5018 StringRef Name);
5019
5020 /// Used to implement to perform semantic checking on
5021 /// attribute((section("foo"))) specifiers.
5022 ///
5023 /// In this case, "foo" is passed in to be checked. If the section
5024 /// specifier is invalid, return an Error that indicates the problem.
5025 ///
5026 /// This is a simple quality of implementation feature to catch errors
5027 /// and give good diagnostics in cases when the assembler or code generator
5028 /// would otherwise reject the section specifier.
5029 llvm::Error isValidSectionSpecifier(StringRef Str);
5030 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
5031 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
5032 StringRef Name);
5033
5034 // Check for things we'd like to warn about. Multiversioning issues are
5035 // handled later in the process, once we know how many exist.
5036 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
5037
5038 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
5039 StringRef NewUserDiagnostic);
5040 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
5041 const IdentifierInfo *Format, int FormatIdx,
5042 int FirstArg);
5043 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
5044 const AttributeCommonInfo &CI,
5045 const IdentifierInfo *Format,
5046 int FormatIdx,
5047 StringLiteral *FormatStr);
5048 ModularFormatAttr *mergeModularFormatAttr(Decl *D,
5049 const AttributeCommonInfo &CI,
5050 const IdentifierInfo *ModularImplFn,
5051 StringRef ImplName,
5053
5054 PersonalityAttr *mergePersonalityAttr(Decl *D, FunctionDecl *Routine,
5055 const AttributeCommonInfo &CI);
5056
5057 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
5058 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5059 bool IsPackExpansion);
5061 bool IsPackExpansion);
5062
5063 /// AddAlignValueAttr - Adds an align_value attribute to a particular
5064 /// declaration.
5065 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
5066
5067 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
5068 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
5071
5073 bool BestCase,
5074 MSInheritanceModel SemanticSpelling);
5075
5077
5078 /// AddModeAttr - Adds a mode attribute to a particular declaration.
5079 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
5080 const IdentifierInfo *Name, bool InInstantiation = false);
5081 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
5082 const AttributeCommonInfo &CI,
5083 const IdentifierInfo *Ident);
5084 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
5085 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
5086 const AttributeCommonInfo &CI);
5087 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
5088 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
5089 const InternalLinkageAttr &AL);
5090
5091 /// Check validaty of calling convention attribute \p attr. If \p FD
5092 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
5093 /// target. Otherwise, it is specified by \p CFT.
5095 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
5097
5098 /// Checks a regparm attribute, returning true if it is ill-formed and
5099 /// otherwise setting numParams to the appropriate value.
5100 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5101
5102 /// Create an CUDALaunchBoundsAttr attribute.
5103 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5104 Expr *MaxThreads,
5105 Expr *MinBlocks,
5106 Expr *MaxBlocks);
5107
5108 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5109 /// declaration.
5110 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5111 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5112
5113 /// Add a cluster_dims attribute to a particular declaration.
5114 CUDAClusterDimsAttr *createClusterDimsAttr(const AttributeCommonInfo &CI,
5115 Expr *X, Expr *Y, Expr *Z);
5116 void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X,
5117 Expr *Y, Expr *Z);
5118 /// Add a no_cluster attribute to a particular declaration.
5119 void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI);
5120
5121 enum class RetainOwnershipKind { NS, CF, OS };
5122
5123 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5124 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5125
5126 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5127
5128 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5129 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5130 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5131 const AttributeCommonInfo &CI,
5132 bool BestCase,
5133 MSInheritanceModel Model);
5134
5135 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5136 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5137 const EnforceTCBLeafAttr &AL);
5138
5139 /// Helper for delayed processing TransparentUnion or
5140 /// BPFPreserveAccessIndexAttr attribute.
5142 const ParsedAttributesView &AttrList);
5143
5144 // Options for ProcessDeclAttributeList().
5148
5151 Result.IncludeCXX11Attributes = Val;
5152 return Result;
5153 }
5154
5157 Result.IgnoreTypeAttributes = Val;
5158 return Result;
5159 }
5160
5161 // Should C++11 attributes be processed?
5163
5164 // Should any type attributes encountered be ignored?
5165 // If this option is false, a diagnostic will be emitted for any type
5166 // attributes of a kind that does not "slide" from the declaration to
5167 // the decl-specifier-seq.
5169 };
5170
5171 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5172 /// attribute list to the specified decl, ignoring any type attributes.
5174 const ParsedAttributesView &AttrList,
5175 const ProcessDeclAttributeOptions &Options =
5177
5178 /// Annotation attributes are the only attributes allowed after an access
5179 /// specifier.
5181 const ParsedAttributesView &AttrList);
5182
5183 /// checkUnusedDeclAttributes - Given a declarator which is not being
5184 /// used to build a declaration, complain about any decl attributes
5185 /// which might be lying around on it.
5187
5188 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5189
5190 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5191 /// \#pragma weak needs a non-definition decl and source may not have one.
5193 SourceLocation Loc);
5194
5195 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5196 /// applied to it, possibly with an alias.
5197 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5198
5199 void ProcessPragmaWeak(Scope *S, Decl *D);
5200 // Decl attributes - this routine is the top level dispatcher.
5201 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5202
5204
5205 /// Given a set of delayed diagnostics, re-emit them as if they had
5206 /// been delayed in the current context instead of in the given pool.
5207 /// Essentially, this just moves them to the current pool.
5209
5210 /// Check that the type is a plain record with one field being a pointer
5211 /// type and the other field being an integer. This matches the common
5212 /// implementation of std::span or sized_allocation_t in P0901R11.
5213 bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty);
5214
5215 /// Check if IdxExpr is a valid parameter index for a function or
5216 /// instance method D. May output an error.
5217 ///
5218 /// \returns true if IdxExpr is a valid index.
5219 template <typename AttrInfo>
5221 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5222 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5223 bool CanIndexVariadicArguments = false) {
5225
5226 // In C++ the implicit 'this' function parameter also counts.
5227 // Parameters are counted from one.
5228 bool HP = hasFunctionProto(D);
5229 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
5230 bool IV = HP && isFunctionOrMethodVariadic(D);
5231 unsigned NumParams =
5232 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5233
5234 std::optional<llvm::APSInt> IdxInt;
5235 if (IdxExpr->isTypeDependent() ||
5236 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5237 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5238 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5239 << IdxExpr->getSourceRange();
5240 return false;
5241 }
5242
5243 constexpr unsigned Limit = 1 << ParamIdx::IdxBitWidth;
5244 unsigned IdxSource = IdxInt->getLimitedValue(Limit);
5245 if (IdxSource < 1 || IdxSource == Limit ||
5246 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5247 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5248 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5249 return false;
5250 }
5251 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5252 if (IdxSource == 1) {
5253 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5254 << &AI << IdxExpr->getSourceRange();
5255 return false;
5256 }
5257 }
5258
5259 Idx = ParamIdx(IdxSource, D);
5260 return true;
5261 }
5262
5263 ///@}
5264
5265 //
5266 //
5267 // -------------------------------------------------------------------------
5268 //
5269 //
5270
5271 /// \name C++ Declarations
5272 /// Implementations are in SemaDeclCXX.cpp
5273 ///@{
5274
5275public:
5277
5278 /// Called before parsing a function declarator belonging to a function
5279 /// declaration.
5281 unsigned TemplateParameterDepth);
5282
5283 /// Called after parsing a function declarator belonging to a function
5284 /// declaration.
5286
5287 // Act on C++ namespaces
5289 SourceLocation NamespaceLoc,
5290 SourceLocation IdentLoc, IdentifierInfo *Ident,
5291 SourceLocation LBrace,
5292 const ParsedAttributesView &AttrList,
5293 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5294
5295 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5296 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5297 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5298
5300
5301 /// Retrieve the special "std" namespace, which may require us to
5302 /// implicitly define the namespace.
5304
5306 EnumDecl *getStdAlignValT() const;
5307
5310 QualType AllocType, SourceLocation);
5311
5313 const IdentifierInfo *MemberOrBase);
5314
5316 /// The '<=>' operator was used in an expression and a builtin operator
5317 /// was selected.
5319 /// A defaulted 'operator<=>' needed the comparison category. This
5320 /// typically only applies to 'std::strong_ordering', due to the implicit
5321 /// fallback return value.
5323 };
5324
5325 /// Lookup the specified comparison category types in the standard
5326 /// library, an check the VarDecls possibly returned by the operator<=>
5327 /// builtins for that type.
5328 ///
5329 /// \return The type of the comparison category type corresponding to the
5330 /// specified Kind, or a null type if an error occurs
5332 SourceLocation Loc,
5334
5335 /// Tests whether Ty is an instance of std::initializer_list and, if
5336 /// it is and Element is not NULL, assigns the element type to Element.
5337 bool isStdInitializerList(QualType Ty, QualType *Element);
5338
5339 /// Tests whether Ty is an instance of std::type_identity and, if
5340 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5341 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5342 /// incorrectly structured despite having the correct name, the faulty Decl
5343 /// will be assigned to MalformedDecl.
5344 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5345 const Decl **MalformedDecl = nullptr);
5346
5347 /// Looks for the std::initializer_list template and instantiates it
5348 /// with Element, or emits an error if it's not found.
5349 ///
5350 /// \returns The instantiated template, or null on error.
5352
5353 /// Looks for the std::type_identity template and instantiates it
5354 /// with Type, or returns a null type if type_identity has not been declared
5355 ///
5356 /// \returns The instantiated template, or null if std::type_identity is not
5357 /// declared
5359
5360 /// Determine whether Ctor is an initializer-list constructor, as
5361 /// defined in [dcl.init.list]p2.
5362 bool isInitListConstructor(const FunctionDecl *Ctor);
5363
5364 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5365 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5366 SourceLocation IdentLoc,
5367 IdentifierInfo *NamespcName,
5368 const ParsedAttributesView &AttrList);
5369
5371
5372 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5373 SourceLocation AliasLoc, IdentifierInfo *Alias,
5374 CXXScopeSpec &SS, SourceLocation IdentLoc,
5375 IdentifierInfo *Ident);
5376
5377 /// Remove decls we can't actually see from a lookup being used to declare
5378 /// shadow using decls.
5379 ///
5380 /// \param S - The scope of the potential shadow decl
5381 /// \param Previous - The lookup of a potential shadow decl's name.
5382 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5383
5384 /// Hides a using shadow declaration. This is required by the current
5385 /// using-decl implementation when a resolvable using declaration in a
5386 /// class is followed by a declaration which would hide or override
5387 /// one or more of the using decl's targets; for example:
5388 ///
5389 /// struct Base { void foo(int); };
5390 /// struct Derived : Base {
5391 /// using Base::foo;
5392 /// void foo(int);
5393 /// };
5394 ///
5395 /// The governing language is C++03 [namespace.udecl]p12:
5396 ///
5397 /// When a using-declaration brings names from a base class into a
5398 /// derived class scope, member functions in the derived class
5399 /// override and/or hide member functions with the same name and
5400 /// parameter types in a base class (rather than conflicting).
5401 ///
5402 /// There are two ways to implement this:
5403 /// (1) optimistically create shadow decls when they're not hidden
5404 /// by existing declarations, or
5405 /// (2) don't create any shadow decls (or at least don't make them
5406 /// visible) until we've fully parsed/instantiated the class.
5407 /// The problem with (1) is that we might have to retroactively remove
5408 /// a shadow decl, which requires several O(n) operations because the
5409 /// decl structures are (very reasonably) not designed for removal.
5410 /// (2) avoids this but is very fiddly and phase-dependent.
5411 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5412
5413 /// Determines whether to create a using shadow decl for a particular
5414 /// decl, given the set of decls existing prior to this using lookup.
5416 const LookupResult &PreviousDecls,
5417 UsingShadowDecl *&PrevShadow);
5418
5419 /// Builds a shadow declaration corresponding to a 'using' declaration.
5422 UsingShadowDecl *PrevDecl);
5423
5424 /// Checks that the given using declaration is not an invalid
5425 /// redeclaration. Note that this is checking only for the using decl
5426 /// itself, not for any ill-formedness among the UsingShadowDecls.
5428 bool HasTypenameKeyword,
5429 const CXXScopeSpec &SS,
5430 SourceLocation NameLoc,
5431 const LookupResult &Previous);
5432
5433 /// Checks that the given nested-name qualifier used in a using decl
5434 /// in the current context is appropriately related to the current
5435 /// scope. If an error is found, diagnoses it and returns true.
5436 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5437 /// the result of that lookup. UD is likewise nullptr, except when we have an
5438 /// already-populated UsingDecl whose shadow decls contain the same
5439 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5440 /// scope).
5441 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5442 const CXXScopeSpec &SS,
5443 const DeclarationNameInfo &NameInfo,
5444 SourceLocation NameLoc,
5445 const LookupResult *R = nullptr,
5446 const UsingDecl *UD = nullptr);
5447
5448 /// Builds a using declaration.
5449 ///
5450 /// \param IsInstantiation - Whether this call arises from an
5451 /// instantiation of an unresolved using declaration. We treat
5452 /// the lookup differently for these declarations.
5454 SourceLocation UsingLoc,
5455 bool HasTypenameKeyword,
5456 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5457 DeclarationNameInfo NameInfo,
5458 SourceLocation EllipsisLoc,
5459 const ParsedAttributesView &AttrList,
5460 bool IsInstantiation, bool IsUsingIfExists);
5462 SourceLocation UsingLoc,
5463 SourceLocation EnumLoc,
5464 SourceLocation NameLoc,
5465 TypeSourceInfo *EnumType, EnumDecl *ED);
5466 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5467 ArrayRef<NamedDecl *> Expansions);
5468
5469 /// Additional checks for a using declaration referring to a constructor name.
5471
5472 /// Given a derived-class using shadow declaration for a constructor and the
5473 /// correspnding base class constructor, find or create the implicit
5474 /// synthesized derived class constructor to use for this initialization.
5477 ConstructorUsingShadowDecl *DerivedShadow);
5478
5480 SourceLocation UsingLoc,
5481 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5482 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5483 const ParsedAttributesView &AttrList);
5485 SourceLocation UsingLoc,
5486 SourceLocation EnumLoc, SourceRange TyLoc,
5487 const IdentifierInfo &II, ParsedType Ty,
5488 const CXXScopeSpec &SS);
5490 MultiTemplateParamsArg TemplateParams,
5491 SourceLocation UsingLoc, UnqualifiedId &Name,
5492 const ParsedAttributesView &AttrList,
5493 TypeResult Type, Decl *DeclFromDeclSpec);
5494
5495 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5496 /// including handling of its default argument expressions.
5497 ///
5498 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5500 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5502 bool HadMultipleCandidates, bool IsListInitialization,
5503 bool IsStdInitListInitialization, bool RequiresZeroInit,
5504 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5505
5506 /// Build a CXXConstructExpr whose constructor has already been resolved if
5507 /// it denotes an inherited constructor.
5509 SourceLocation ConstructLoc, QualType DeclInitType,
5510 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5511 bool HadMultipleCandidates, bool IsListInitialization,
5512 bool IsStdInitListInitialization, bool RequiresZeroInit,
5513 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5514
5515 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5516 // the constructor can be elidable?
5518 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5519 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5520 bool HadMultipleCandidates, bool IsListInitialization,
5521 bool IsStdInitListInitialization, bool RequiresZeroInit,
5522 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5523
5525 SourceLocation InitLoc);
5526
5527 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5528 /// constructed variable.
5529 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5530
5531 /// Helper class that collects exception specifications for
5532 /// implicitly-declared special member functions.
5534 // Pointer to allow copying
5535 Sema *Self;
5536 // We order exception specifications thus:
5537 // noexcept is the most restrictive, but is only used in C++11.
5538 // throw() comes next.
5539 // Then a throw(collected exceptions)
5540 // Finally no specification, which is expressed as noexcept(false).
5541 // throw(...) is used instead if any called function uses it.
5542 ExceptionSpecificationType ComputedEST;
5543 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5544 SmallVector<QualType, 4> Exceptions;
5545
5546 void ClearExceptions() {
5547 ExceptionsSeen.clear();
5548 Exceptions.clear();
5549 }
5550
5551 public:
5553 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5554 if (!Self.getLangOpts().CPlusPlus11)
5555 ComputedEST = EST_DynamicNone;
5556 }
5557
5558 /// Get the computed exception specification type.
5560 assert(!isComputedNoexcept(ComputedEST) &&
5561 "noexcept(expr) should not be a possible result");
5562 return ComputedEST;
5563 }
5564
5565 /// The number of exceptions in the exception specification.
5566 unsigned size() const { return Exceptions.size(); }
5567
5568 /// The set of exceptions in the exception specification.
5569 const QualType *data() const { return Exceptions.data(); }
5570
5571 /// Integrate another called method into the collected data.
5572 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5573
5574 /// Integrate an invoked expression into the collected data.
5575 void CalledExpr(Expr *E) { CalledStmt(E); }
5576
5577 /// Integrate an invoked statement into the collected data.
5578 void CalledStmt(Stmt *S);
5579
5580 /// Overwrite an EPI's exception specification with this
5581 /// computed exception specification.
5584 ESI.Type = getExceptionSpecType();
5585 if (ESI.Type == EST_Dynamic) {
5586 ESI.Exceptions = Exceptions;
5587 } else if (ESI.Type == EST_None) {
5588 /// C++11 [except.spec]p14:
5589 /// The exception-specification is noexcept(false) if the set of
5590 /// potential exceptions of the special member function contains "any"
5591 ESI.Type = EST_NoexceptFalse;
5592 ESI.NoexceptExpr =
5593 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5594 }
5595 return ESI;
5596 }
5597 };
5598
5599 /// Evaluate the implicit exception specification for a defaulted
5600 /// special member function.
5602
5603 /// Check the given exception-specification and update the
5604 /// exception specification information with the results.
5605 void checkExceptionSpecification(bool IsTopLevel,
5607 ArrayRef<ParsedType> DynamicExceptions,
5608 ArrayRef<SourceRange> DynamicExceptionRanges,
5609 Expr *NoexceptExpr,
5610 SmallVectorImpl<QualType> &Exceptions,
5612
5613 /// Add an exception-specification to the given member or friend function
5614 /// (or function template). The exception-specification was parsed
5615 /// after the function itself was declared.
5617 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5618 ArrayRef<ParsedType> DynamicExceptions,
5619 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5620
5621 class InheritedConstructorInfo;
5622
5623 /// Determine if a special member function should have a deleted
5624 /// definition when it is defaulted.
5626 InheritedConstructorInfo *ICI = nullptr,
5627 bool Diagnose = false);
5628
5629 /// Produce notes explaining why a defaulted function was defined as deleted.
5631
5632 /// Declare the implicit default constructor for the given class.
5633 ///
5634 /// \param ClassDecl The class declaration into which the implicit
5635 /// default constructor will be added.
5636 ///
5637 /// \returns The implicitly-declared default constructor.
5640
5641 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5642 /// defining this constructor as the default constructor.
5645
5646 /// Declare the implicit destructor for the given class.
5647 ///
5648 /// \param ClassDecl The class declaration into which the implicit
5649 /// destructor will be added.
5650 ///
5651 /// \returns The implicitly-declared destructor.
5653
5654 /// DefineImplicitDestructor - Checks for feasibility of
5655 /// defining this destructor as the default destructor.
5656 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5658
5659 /// Build an exception spec for destructors that don't have one.
5660 ///
5661 /// C++11 says that user-defined destructors with no exception spec get one
5662 /// that looks as if the destructor was implicitly declared.
5664
5665 /// Define the specified inheriting constructor.
5668
5669 /// Declare the implicit copy constructor for the given class.
5670 ///
5671 /// \param ClassDecl The class declaration into which the implicit
5672 /// copy constructor will be added.
5673 ///
5674 /// \returns The implicitly-declared copy constructor.
5676
5677 /// DefineImplicitCopyConstructor - Checks for feasibility of
5678 /// defining this constructor as the copy constructor.
5679 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5681
5682 /// Declare the implicit move constructor for the given class.
5683 ///
5684 /// \param ClassDecl The Class declaration into which the implicit
5685 /// move constructor will be added.
5686 ///
5687 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5688 /// declared.
5690
5691 /// DefineImplicitMoveConstructor - Checks for feasibility of
5692 /// defining this constructor as the move constructor.
5693 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5695
5696 /// Declare the implicit copy assignment operator for the given class.
5697 ///
5698 /// \param ClassDecl The class declaration into which the implicit
5699 /// copy assignment operator will be added.
5700 ///
5701 /// \returns The implicitly-declared copy assignment operator.
5703
5704 /// Defines an implicitly-declared copy assignment operator.
5705 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5706 CXXMethodDecl *MethodDecl);
5707
5708 /// Declare the implicit move assignment operator for the given class.
5709 ///
5710 /// \param ClassDecl The Class declaration into which the implicit
5711 /// move assignment operator will be added.
5712 ///
5713 /// \returns The implicitly-declared move assignment operator, or NULL if it
5714 /// wasn't declared.
5716
5717 /// Defines an implicitly-declared move assignment operator.
5718 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5719 CXXMethodDecl *MethodDecl);
5720
5721 /// Check a completed declaration of an implicit special member.
5723
5724 /// Determine whether the given function is an implicitly-deleted
5725 /// special member function.
5727
5728 /// Check whether 'this' shows up in the type of a static member
5729 /// function after the (naturally empty) cv-qualifier-seq would be.
5730 ///
5731 /// \returns true if an error occurred.
5733
5734 /// Whether this' shows up in the exception specification of a static
5735 /// member function.
5737
5738 /// Check whether 'this' shows up in the attributes of the given
5739 /// static member function.
5740 ///
5741 /// \returns true if an error occurred.
5743
5745 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5746
5748
5749 /// Given a constructor and the set of arguments provided for the
5750 /// constructor, convert the arguments and add any required default arguments
5751 /// to form a proper call to this constructor.
5752 ///
5753 /// \returns true if an error occurred, false otherwise.
5755 QualType DeclInitType, MultiExprArg ArgsPtr,
5756 SourceLocation Loc,
5757 SmallVectorImpl<Expr *> &ConvertedArgs,
5758 bool AllowExplicit = false,
5759 bool IsListInitialization = false);
5760
5761 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5762 /// initializer for the declaration 'Dcl'.
5763 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5764 /// static data member of class X, names should be looked up in the scope of
5765 /// class X.
5767
5768 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5769 /// initializer for the declaration 'Dcl'.
5770 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5771
5772 /// Define the "body" of the conversion from a lambda object to a
5773 /// function pointer.
5774 ///
5775 /// This routine doesn't actually define a sensible body; rather, it fills
5776 /// in the initialization expression needed to copy the lambda object into
5777 /// the block, and IR generation actually generates the real body of the
5778 /// block pointer conversion.
5779 void
5781 CXXConversionDecl *Conv);
5782
5783 /// Define the "body" of the conversion from a lambda object to a
5784 /// block pointer.
5785 ///
5786 /// This routine doesn't actually define a sensible body; rather, it fills
5787 /// in the initialization expression needed to copy the lambda object into
5788 /// the block, and IR generation actually generates the real body of the
5789 /// block pointer conversion.
5791 CXXConversionDecl *Conv);
5792
5793 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5794 /// linkage specification, including the language and (if present)
5795 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5796 /// language string literal. LBraceLoc, if valid, provides the location of
5797 /// the '{' brace. Otherwise, this linkage specification does not
5798 /// have any braces.
5800 Expr *LangStr, SourceLocation LBraceLoc);
5801
5802 /// ActOnFinishLinkageSpecification - Complete the definition of
5803 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5804 /// valid, it's the position of the closing '}' brace in a linkage
5805 /// specification that uses braces.
5807 SourceLocation RBraceLoc);
5808
5809 //===--------------------------------------------------------------------===//
5810 // C++ Classes
5811 //
5812
5813 /// Get the class that is directly named by the current context. This is the
5814 /// class for which an unqualified-id in this scope could name a constructor
5815 /// or destructor.
5816 ///
5817 /// If the scope specifier denotes a class, this will be that class.
5818 /// If the scope specifier is empty, this will be the class whose
5819 /// member-specification we are currently within. Otherwise, there
5820 /// is no such class.
5822
5823 /// isCurrentClassName - Determine whether the identifier II is the
5824 /// name of the class type currently being defined. In the case of
5825 /// nested classes, this will only return true if II is the name of
5826 /// the innermost class.
5827 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5828 const CXXScopeSpec *SS = nullptr);
5829
5830 /// Determine whether the identifier II is a typo for the name of
5831 /// the class type currently being defined. If so, update it to the identifier
5832 /// that should have been used.
5834
5835 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5837 SourceLocation ColonLoc,
5838 const ParsedAttributesView &Attrs);
5839
5840 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5841 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5842 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5843 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5844 /// present (but parsing it has been deferred).
5845 NamedDecl *
5847 MultiTemplateParamsArg TemplateParameterLists,
5848 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5849 InClassInitStyle InitStyle);
5850
5851 /// Enter a new C++ default initializer scope. After calling this, the
5852 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5853 /// parsing or instantiating the initializer failed.
5855
5856 /// This is invoked after parsing an in-class initializer for a
5857 /// non-static C++ class member, and after instantiating an in-class
5858 /// initializer in a class template. Such actions are deferred until the class
5859 /// is complete.
5861 SourceLocation EqualLoc,
5863
5864 /// Handle a C++ member initializer using parentheses syntax.
5866 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5867 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5868 const DeclSpec &DS, SourceLocation IdLoc,
5869 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5870 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5871
5872 /// Handle a C++ member initializer using braced-init-list syntax.
5873 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5874 CXXScopeSpec &SS,
5875 IdentifierInfo *MemberOrBase,
5876 ParsedType TemplateTypeTy,
5877 const DeclSpec &DS, SourceLocation IdLoc,
5878 Expr *InitList, SourceLocation EllipsisLoc);
5879
5880 /// Handle a C++ member initializer.
5881 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5882 CXXScopeSpec &SS,
5883 IdentifierInfo *MemberOrBase,
5884 ParsedType TemplateTypeTy,
5885 const DeclSpec &DS, SourceLocation IdLoc,
5886 Expr *Init, SourceLocation EllipsisLoc);
5887
5889 SourceLocation IdLoc);
5890
5892 TypeSourceInfo *BaseTInfo, Expr *Init,
5893 CXXRecordDecl *ClassDecl,
5894 SourceLocation EllipsisLoc);
5895
5897 CXXRecordDecl *ClassDecl);
5898
5901
5903 ArrayRef<CXXCtorInitializer *> Initializers = {});
5904
5905 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5906 /// mark all the non-trivial destructors of its members and bases as
5907 /// referenced.
5908 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5909 CXXRecordDecl *Record);
5910
5911 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5912 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5913 /// class. In the Microsoft C++ ABI, this is done any time a class's
5914 /// destructor is referenced.
5916 SourceLocation Location, CXXRecordDecl *ClassDecl,
5917 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5918 nullptr);
5919
5920 /// Do semantic checks to allow the complete destructor variant to be emitted
5921 /// when the destructor is defined in another translation unit. In the Itanium
5922 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5923 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5924 /// of the checks performed when emitting a regular destructor.
5925 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5926 CXXDestructorDecl *Dtor);
5927
5928 /// The list of classes whose vtables have been used within
5929 /// this translation unit, and the source locations at which the
5930 /// first use occurred.
5931 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5932
5933 /// The list of vtables that are required but have not yet been
5934 /// materialized.
5936
5937 /// The set of classes whose vtables have been used within
5938 /// this translation unit, and a bit that will be true if the vtable is
5939 /// required to be emitted (otherwise, it should be emitted only if needed
5940 /// by code generation).
5941 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5942
5943 /// Load any externally-stored vtable uses.
5945
5946 /// Note that the vtable for the given class was used at the
5947 /// given location.
5949 bool DefinitionRequired = false);
5950
5951 /// Mark the exception specifications of all virtual member functions
5952 /// in the given class as needed.
5954 const CXXRecordDecl *RD);
5955
5956 /// MarkVirtualMembersReferenced - Will mark all members of the given
5957 /// CXXRecordDecl referenced.
5959 bool ConstexprOnly = false);
5960
5961 /// Define all of the vtables that have been used in this
5962 /// translation unit and reference any virtual members used by those
5963 /// vtables.
5964 ///
5965 /// \returns true if any work was done, false otherwise.
5966 bool DefineUsedVTables();
5967
5968 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5969 /// special functions, such as the default constructor, copy
5970 /// constructor, or destructor, to the given C++ class (C++
5971 /// [special]p1). This routine can only be executed just before the
5972 /// definition of the class is complete.
5974
5975 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5976 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5978 bool AnyErrors);
5979
5980 /// Check class-level dllimport/dllexport attribute. The caller must
5981 /// ensure that referenceDLLExportedClassMethods is called some point later
5982 /// when all outer classes of Class are complete.
5985
5987
5988 /// Perform propagation of DLL attributes from a derived class to a
5989 /// templated base class for MS compatibility.
5991 CXXRecordDecl *Class, Attr *ClassAttr,
5992 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5993 SourceLocation BaseLoc);
5994
5995 /// Perform semantic checks on a class definition that has been
5996 /// completing, introducing implicitly-declared members, checking for
5997 /// abstract types, etc.
5998 ///
5999 /// \param S The scope in which the class was parsed. Null if we didn't just
6000 /// parse a class definition.
6001 /// \param Record The completed class.
6003
6004 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
6005 /// conditions that are needed for the attribute to have an effect.
6007
6008 /// Check that VTable Pointer authentication is only being set on the first
6009 /// first instantiation of the vtable
6011
6013 Decl *TagDecl, SourceLocation LBrac,
6014 SourceLocation RBrac,
6015 const ParsedAttributesView &AttrList);
6016
6017 /// Perform any semantic analysis which needs to be delayed until all
6018 /// pending class member declarations have been parsed.
6021
6022 /// This is used to implement the constant expression evaluation part of the
6023 /// attribute enable_if extension. There is nothing in standard C++ which
6024 /// would require reentering parameters.
6027 llvm::function_ref<Scope *()> EnterScope);
6029
6030 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
6031 /// parsing a top-level (non-nested) C++ class, and we are now
6032 /// parsing those parts of the given Method declaration that could
6033 /// not be parsed earlier (C++ [class.mem]p2), such as default
6034 /// arguments. This action should enter the scope of the given
6035 /// Method declaration as if we had just parsed the qualified method
6036 /// name. However, it should not bring the parameters into scope;
6037 /// that will be performed by ActOnDelayedCXXMethodParameter.
6039 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
6041
6042 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
6043 /// processing the delayed method declaration for Method. The method
6044 /// declaration is now considered finished. There may be a separate
6045 /// ActOnStartOfFunctionDef action later (not necessarily
6046 /// immediately!) for this method, if it was also defined inside the
6047 /// class body.
6050
6052
6053 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
6054 StringEvaluationContext EvalContext,
6055 bool ErrorOnInvalidMessage);
6056 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
6057 StringEvaluationContext EvalContext,
6058 bool ErrorOnInvalidMessage);
6059
6061 Expr *AssertExpr, Expr *AssertMessageExpr,
6062 SourceLocation RParenLoc);
6064 Expr *AssertExpr, Expr *AssertMessageExpr,
6065 SourceLocation RParenLoc, bool Failed);
6066
6067 /// Try to print more useful information about a failed static_assert
6068 /// with expression \E
6069 void DiagnoseStaticAssertDetails(const Expr *E);
6070
6071 /// If E represents a built-in type trait, or a known standard type trait,
6072 /// try to print more information about why the type type-trait failed.
6073 /// This assumes we already evaluated the expression to a false boolean value.
6074 void DiagnoseTypeTraitDetails(const Expr *E);
6075
6076 /// Handle a friend type declaration. This works in tandem with
6077 /// ActOnTag.
6078 ///
6079 /// Notes on friend class templates:
6080 ///
6081 /// We generally treat friend class declarations as if they were
6082 /// declaring a class. So, for example, the elaborated type specifier
6083 /// in a friend declaration is required to obey the restrictions of a
6084 /// class-head (i.e. no typedefs in the scope chain), template
6085 /// parameters are required to match up with simple template-ids, &c.
6086 /// However, unlike when declaring a template specialization, it's
6087 /// okay to refer to a template specialization without an empty
6088 /// template parameter declaration, e.g.
6089 /// friend class A<T>::B<unsigned>;
6090 /// We permit this as a special case; if there are any template
6091 /// parameters present at all, require proper matching, i.e.
6092 /// template <> template <class T> friend class A<int>::B;
6093 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
6094 MultiTemplateParamsArg TemplateParams,
6095 SourceLocation EllipsisLoc);
6097 MultiTemplateParamsArg TemplateParams);
6098
6099 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
6100 /// the well-formedness of the constructor declarator @p D with type @p
6101 /// R. If there are any errors in the declarator, this routine will
6102 /// emit diagnostics and set the invalid bit to true. In any case, the type
6103 /// will be updated to reflect a well-formed type for the constructor and
6104 /// returned.
6106 StorageClass &SC);
6107
6108 /// CheckConstructor - Checks a fully-formed constructor for
6109 /// well-formedness, issuing any diagnostics required. Returns true if
6110 /// the constructor declarator is invalid.
6112
6113 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6114 /// the well-formednes of the destructor declarator @p D with type @p
6115 /// R. If there are any errors in the declarator, this routine will
6116 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6117 /// will be updated to reflect a well-formed type for the destructor and
6118 /// returned.
6120 StorageClass &SC);
6121
6122 /// CheckDestructor - Checks a fully-formed destructor definition for
6123 /// well-formedness, issuing any diagnostics required. Returns true
6124 /// on error.
6126
6127 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6128 /// well-formednes of the conversion function declarator @p D with
6129 /// type @p R. If there are any errors in the declarator, this routine
6130 /// will emit diagnostics and return true. Otherwise, it will return
6131 /// false. Either way, the type @p R will be updated to reflect a
6132 /// well-formed type for the conversion operator.
6134
6135 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6136 /// the declaration of the given C++ conversion function. This routine
6137 /// is responsible for recording the conversion function in the C++
6138 /// class, if possible.
6140
6141 /// Check the validity of a declarator that we parsed for a deduction-guide.
6142 /// These aren't actually declarators in the grammar, so we need to check that
6143 /// the user didn't specify any pieces that are not part of the
6144 /// deduction-guide grammar. Return true on invalid deduction-guide.
6146 StorageClass &SC);
6147
6149
6152 SourceLocation DefaultLoc);
6154
6155 /// Kinds of defaulted comparison operator functions.
6156 enum class DefaultedComparisonKind : unsigned char {
6157 /// This is not a defaultable comparison operator.
6159 /// This is an operator== that should be implemented as a series of
6160 /// subobject comparisons.
6162 /// This is an operator<=> that should be implemented as a series of
6163 /// subobject comparisons.
6165 /// This is an operator!= that should be implemented as a rewrite in terms
6166 /// of a == comparison.
6168 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
6169 /// terms of a <=> comparison.
6171 };
6172
6176 FunctionDecl *Spaceship);
6179
6181 QualType R, bool IsLambda,
6182 DeclContext *DC = nullptr);
6184 DeclarationName Name, QualType R);
6186
6187 //===--------------------------------------------------------------------===//
6188 // C++ Derived Classes
6189 //
6190
6191 /// Check the validity of a C++ base class specifier.
6192 ///
6193 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6194 /// and returns NULL otherwise.
6196 SourceRange SpecifierRange, bool Virtual,
6197 AccessSpecifier Access,
6198 TypeSourceInfo *TInfo,
6199 SourceLocation EllipsisLoc);
6200
6201 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6202 /// one entry in the base class list of a class specifier, for
6203 /// example:
6204 /// class foo : public bar, virtual private baz {
6205 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6206 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6207 const ParsedAttributesView &Attrs, bool Virtual,
6208 AccessSpecifier Access, ParsedType basetype,
6209 SourceLocation BaseLoc,
6210 SourceLocation EllipsisLoc);
6211
6212 /// Performs the actual work of attaching the given base class
6213 /// specifiers to a C++ class.
6216
6217 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6218 /// class, after checking whether there are any duplicate base
6219 /// classes.
6220 void ActOnBaseSpecifiers(Decl *ClassDecl,
6222
6223 /// Determine whether the type \p Derived is a C++ class that is
6224 /// derived from the type \p Base.
6225 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6227 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6231 CXXBasePaths &Paths);
6232
6233 // FIXME: I don't like this name.
6234 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6235
6237 SourceLocation Loc, SourceRange Range,
6238 CXXCastPath *BasePath = nullptr,
6239 bool IgnoreAccess = false);
6240
6241 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6242 /// conversion (where Derived and Base are class types) is
6243 /// well-formed, meaning that the conversion is unambiguous (and
6244 /// that all of the base classes are accessible). Returns true
6245 /// and emits a diagnostic if the code is ill-formed, returns false
6246 /// otherwise. Loc is the location where this routine should point to
6247 /// if there is an error, and Range is the source range to highlight
6248 /// if there is an error.
6249 ///
6250 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6251 /// diagnostic for the respective type of error will be suppressed, but the
6252 /// check for ill-formed code will still be performed.
6254 unsigned InaccessibleBaseID,
6255 unsigned AmbiguousBaseConvID,
6256 SourceLocation Loc, SourceRange Range,
6257 DeclarationName Name, CXXCastPath *BasePath,
6258 bool IgnoreAccess = false);
6259
6260 /// Builds a string representing ambiguous paths from a
6261 /// specific derived class to different subobjects of the same base
6262 /// class.
6263 ///
6264 /// This function builds a string that can be used in error messages
6265 /// to show the different paths that one can take through the
6266 /// inheritance hierarchy to go from the derived class to different
6267 /// subobjects of a base class. The result looks something like this:
6268 /// @code
6269 /// struct D -> struct B -> struct A
6270 /// struct D -> struct C -> struct A
6271 /// @endcode
6272 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6273
6275 const CXXMethodDecl *Old);
6276
6277 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6278 /// covariant, according to C++ [class.virtual]p5.
6280 const CXXMethodDecl *Old);
6281
6282 // Check that the overriding method has no explicit object parameter.
6284 const CXXMethodDecl *Old);
6285
6286 /// Mark the given method pure.
6287 ///
6288 /// \param Method the method to be marked pure.
6289 ///
6290 /// \param InitRange the source range that covers the "0" initializer.
6292
6293 /// CheckOverrideControl - Check C++11 override control semantics.
6295
6296 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6297 /// not used in the declaration of an overriding method.
6299
6300 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6301 /// function overrides a virtual member function marked 'final', according to
6302 /// C++11 [class.virtual]p4.
6304 const CXXMethodDecl *Old);
6305
6316
6317 struct TypeDiagnoser;
6318
6321 TypeDiagnoser &Diagnoser);
6322 template <typename... Ts>
6323 bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID,
6324 const Ts &...Args) {
6325 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6326 return RequireNonAbstractType(Loc, T, Diagnoser);
6327 }
6328
6329 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6330
6331 //===--------------------------------------------------------------------===//
6332 // C++ Overloaded Operators [C++ 13.5]
6333 //
6334
6335 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6336 /// of this overloaded operator is well-formed. If so, returns false;
6337 /// otherwise, emits appropriate diagnostics and returns true.
6339
6340 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6341 /// of this literal operator function is well-formed. If so, returns
6342 /// false; otherwise, emits appropriate diagnostics and returns true.
6344
6345 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6346 /// found in an explicit(bool) specifier.
6348
6349 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6350 /// Returns true if the explicit specifier is now resolved.
6352
6353 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6354 /// C++ if/switch/while/for statement.
6355 /// e.g: "if (int x = f()) {...}"
6357
6358 // Emitting members of dllexported classes is delayed until the class
6359 // (including field initializers) is fully parsed.
6362
6363 /// Merge the exception specifications of two variable declarations.
6364 ///
6365 /// This is called when there's a redeclaration of a VarDecl. The function
6366 /// checks if the redeclaration might have an exception specification and
6367 /// validates compatibility and merges the specs if necessary.
6369
6370 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6371 /// function, once we already know that they have the same
6372 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6373 /// error, false otherwise.
6375
6376 /// Helpers for dealing with blocks and functions.
6378
6379 /// CheckExtraCXXDefaultArguments - Check for any extra default
6380 /// arguments in the declarator, which is not a function declaration
6381 /// or definition and therefore is not permitted to have default
6382 /// arguments. This routine should be invoked for every declarator
6383 /// that is not a function declaration or definition.
6385
6389
6390 /// Perform semantic analysis for the variable declaration that
6391 /// occurs within a C++ catch clause, returning the newly-created
6392 /// variable.
6394 SourceLocation StartLoc,
6395 SourceLocation IdLoc,
6396 const IdentifierInfo *Id);
6397
6398 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6399 /// handler.
6401
6403
6404 /// Handle a friend tag declaration where the scope specifier was
6405 /// templated.
6407 unsigned TagSpec, SourceLocation TagLoc,
6408 CXXScopeSpec &SS, IdentifierInfo *Name,
6409 SourceLocation NameLoc,
6410 SourceLocation EllipsisLoc,
6412 MultiTemplateParamsArg TempParamLists);
6413
6415 SourceLocation DeclStart, Declarator &D,
6416 Expr *BitfieldWidth,
6417 InClassInitStyle InitStyle,
6418 AccessSpecifier AS,
6419 const ParsedAttr &MSPropertyAttr);
6420
6421 /// Diagnose why the specified class does not have a trivial special member of
6422 /// the given kind.
6425
6426 /// Determine whether a defaulted or deleted special member function is
6427 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6428 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6432 bool Diagnose = false);
6433
6434 /// For a defaulted function, the kind of defaulted function that it is.
6436 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
6437 unsigned SpecialMember : 8;
6438 unsigned Comparison : 8;
6439
6440 public:
6442 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6443 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6445 : SpecialMember(llvm::to_underlying(CSM)),
6446 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6448 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6449 Comparison(llvm::to_underlying(Comp)) {}
6450
6451 bool isSpecialMember() const {
6452 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
6454 }
6455 bool isComparison() const {
6456 return static_cast<DefaultedComparisonKind>(Comparison) !=
6458 }
6459
6460 explicit operator bool() const {
6461 return isSpecialMember() || isComparison();
6462 }
6463
6465 return static_cast<CXXSpecialMemberKind>(SpecialMember);
6466 }
6468 return static_cast<DefaultedComparisonKind>(Comparison);
6469 }
6470
6471 /// Get the index of this function kind for use in diagnostics.
6472 unsigned getDiagnosticIndex() const {
6473 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
6474 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
6475 "invalid should have highest index");
6476 static_assert((unsigned)DefaultedComparisonKind::None == 0,
6477 "none should be equal to zero");
6478 return SpecialMember + Comparison;
6479 }
6480 };
6481
6482 /// Determine the kind of defaulting that would be done for a given function.
6483 ///
6484 /// If the function is both a default constructor and a copy / move
6485 /// constructor (due to having a default argument for the first parameter),
6486 /// this picks CXXSpecialMemberKind::DefaultConstructor.
6487 ///
6488 /// FIXME: Check that case is properly handled by all callers.
6489 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
6490
6491 /// Handle a C++11 empty-declaration and attribute-declaration.
6493 SourceLocation SemiLoc);
6494
6496 /// Diagnose issues that are non-constant or that are extensions.
6498 /// Identify whether this function satisfies the formal rules for constexpr
6499 /// functions in the current lanugage mode (with no extensions).
6501 };
6502
6503 // Check whether a function declaration satisfies the requirements of a
6504 // constexpr function definition or a constexpr constructor definition. If so,
6505 // return true. If not, produce appropriate diagnostics (unless asked not to
6506 // by Kind) and return false.
6507 //
6508 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6510 CheckConstexprKind Kind);
6511
6512 /// Diagnose methods which overload virtual methods in a base class
6513 /// without overriding any.
6515
6516 /// Check if a method overloads virtual methods in a base class without
6517 /// overriding any.
6518 void
6520 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6521 void
6523 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6524
6525 /// ActOnParamDefaultArgument - Check whether the default argument
6526 /// provided for a function parameter is well-formed. If so, attach it
6527 /// to the parameter declaration.
6528 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6529 Expr *defarg);
6530
6531 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6532 /// argument for a function parameter, but we can't parse it yet
6533 /// because we're inside a class definition. Note that this default
6534 /// argument will be parsed later.
6536 SourceLocation ArgLoc);
6537
6538 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6539 /// the default argument for the parameter param failed.
6541 Expr *DefaultArg);
6543 SourceLocation EqualLoc);
6544 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6545 SourceLocation EqualLoc);
6546
6547 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6548 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6549 StringLiteral *Message = nullptr);
6550 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6551
6552 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6553 StringLiteral *DeletedMessage = nullptr);
6557
6558 NamedDecl *
6560 MultiTemplateParamsArg TemplateParamLists);
6563 RecordDecl *ClassDecl,
6564 const IdentifierInfo *Name);
6565
6567 SourceLocation Loc);
6569
6570 /// Stack containing information needed when in C++2a an 'auto' is encountered
6571 /// in a function declaration parameter type specifier in order to invent a
6572 /// corresponding template parameter in the enclosing abbreviated function
6573 /// template. This information is also present in LambdaScopeInfo, stored in
6574 /// the FunctionScopes stack.
6576
6577 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6578 std::unique_ptr<CXXFieldCollector> FieldCollector;
6579
6581 /// Set containing all declared private fields that are not used.
6583
6585
6586 /// PureVirtualClassDiagSet - a set of class declarations which we have
6587 /// emitted a list of pure virtual functions. Used to prevent emitting the
6588 /// same list more than once.
6589 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6590
6594
6595 /// All the delegating constructors seen so far in the file, used for
6596 /// cycle detection at the end of the TU.
6598
6599 /// The C++ "std" namespace, where the standard library resides.
6601
6602 /// The C++ "std::initializer_list" template, which is defined in
6603 /// <initializer_list>.
6605
6606 /// The C++ "std::type_identity" template, which is defined in
6607 /// <type_traits>.
6609
6610 // Contains the locations of the beginning of unparsed default
6611 // argument locations.
6612 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6613
6614 /// UndefinedInternals - all the used, undefined objects which require a
6615 /// definition in this translation unit.
6616 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6617
6618 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6620
6621 /// The C++ special members which we are currently in the process of
6622 /// declaring. If this process recursively triggers the declaration of the
6623 /// same special member, we should act as if it is not yet declared.
6625
6627
6628 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6629
6632 ParsingClassDepth++;
6634 }
6636 ParsingClassDepth--;
6638 }
6639
6641 CXXScopeSpec &SS,
6642 ParsedType TemplateTypeTy,
6643 IdentifierInfo *MemberOrBase);
6644
6645private:
6646 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6647 QualType ResultTy,
6648 ArrayRef<QualType> Args);
6649 // Helper for ActOnFields to check for all function pointer members.
6650 bool EntirelyFunctionPointers(const RecordDecl *Record);
6651
6652 // A cache representing if we've fully checked the various comparison category
6653 // types stored in ASTContext. The bit-index corresponds to the integer value
6654 // of a ComparisonCategoryType enumerator.
6655 llvm::SmallBitVector FullyCheckedComparisonCategories;
6656
6657 /// Check if there is a field shadowing.
6658 void CheckShadowInheritedFields(const SourceLocation &Loc,
6659 DeclarationName FieldName,
6660 const CXXRecordDecl *RD,
6661 bool DeclIsField = true);
6662
6663 ///@}
6664
6665 //
6666 //
6667 // -------------------------------------------------------------------------
6668 //
6669 //
6670
6671 /// \name C++ Exception Specifications
6672 /// Implementations are in SemaExceptionSpec.cpp
6673 ///@{
6674
6675public:
6676 /// All the overriding functions seen during a class definition
6677 /// that had their exception spec checks delayed, plus the overridden
6678 /// function.
6681
6682 /// All the function redeclarations seen during a class definition that had
6683 /// their exception spec checks delayed, plus the prior declaration they
6684 /// should be checked against. Except during error recovery, the new decl
6685 /// should always be a friend declaration, as that's the only valid way to
6686 /// redeclare a special member before its class is complete.
6689
6690 /// Determine if we're in a case where we need to (incorrectly) eagerly
6691 /// parse an exception specification to work around a libstdc++ bug.
6693
6694 /// Check the given noexcept-specifier, convert its expression, and compute
6695 /// the appropriate ExceptionSpecificationType.
6696 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6698
6699 CanThrowResult canThrow(const Stmt *E);
6700 /// Determine whether the callee of a particular function call can throw.
6701 /// E, D and Loc are all optional.
6702 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6705 const FunctionProtoType *FPT);
6708
6709 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6710 /// exception specification. Incomplete types, or pointers to incomplete types
6711 /// other than void are not allowed.
6712 ///
6713 /// \param[in,out] T The exception type. This will be decayed to a pointer
6714 /// type
6715 /// when the input is an array or a function type.
6717
6718 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6719 /// pointer to member to a function with an exception specification. This
6720 /// means that it is invalid to add another level of indirection.
6723
6724 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6725 /// exception specifications. Exception specifications are equivalent if
6726 /// they allow exactly the same set of exception types. It does not matter how
6727 /// that is achieved. See C++ [except.spec]p2.
6729 SourceLocation OldLoc,
6730 const FunctionProtoType *New,
6731 SourceLocation NewLoc);
6733 const PartialDiagnostic &NoteID,
6734 const FunctionProtoType *Old,
6735 SourceLocation OldLoc,
6736 const FunctionProtoType *New,
6737 SourceLocation NewLoc);
6738 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6739
6740 /// CheckExceptionSpecSubset - Check whether the second function type's
6741 /// exception specification is a subset (or equivalent) of the first function
6742 /// type. This is used by override and pointer assignment checks.
6744 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6745 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6746 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6747 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6748 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6749
6750 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6751 /// two functions have equivalent exception specs. This is part of the
6752 /// assignment and override compatibility check. We do not check the
6753 /// parameters of parameter function pointers recursively, as no sane
6754 /// programmer would even be able to write such a function type.
6756 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6757 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6758 SourceLocation TargetLoc, const FunctionProtoType *Source,
6759 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6760
6761 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6762
6763 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6764 /// spec is a subset of base spec.
6766 const CXXMethodDecl *Old);
6767
6768 ///@}
6769
6770 //
6771 //
6772 // -------------------------------------------------------------------------
6773 //
6774 //
6775
6776 /// \name Expressions
6777 /// Implementations are in SemaExpr.cpp
6778 ///@{
6779
6780public:
6781 /// Describes how the expressions currently being parsed are
6782 /// evaluated at run-time, if at all.
6784 /// The current expression and its subexpressions occur within an
6785 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6786 /// \c sizeof, where the type of the expression may be significant but
6787 /// no code will be generated to evaluate the value of the expression at
6788 /// run time.
6790
6791 /// The current expression occurs within a braced-init-list within
6792 /// an unevaluated operand. This is mostly like a regular unevaluated
6793 /// context, except that we still instantiate constexpr functions that are
6794 /// referenced here so that we can perform narrowing checks correctly.
6796
6797 /// The current expression occurs within a discarded statement.
6798 /// This behaves largely similarly to an unevaluated operand in preventing
6799 /// definitions from being required, but not in other ways.
6801
6802 /// The current expression occurs within an unevaluated
6803 /// operand that unconditionally permits abstract references to
6804 /// fields, such as a SIZE operator in MS-style inline assembly.
6806
6807 /// The current context is "potentially evaluated" in C++11 terms,
6808 /// but the expression is evaluated at compile-time (like the values of
6809 /// cases in a switch statement).
6811
6812 /// In addition of being constant evaluated, the current expression
6813 /// occurs in an immediate function context - either a consteval function
6814 /// or a consteval if statement.
6816
6817 /// The current expression is potentially evaluated at run time,
6818 /// which means that code may be generated to evaluate the value of the
6819 /// expression at run time.
6821
6822 /// The current expression is potentially evaluated, but any
6823 /// declarations referenced inside that expression are only used if
6824 /// in fact the current expression is used.
6825 ///
6826 /// This value is used when parsing default function arguments, for which
6827 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6828 /// through varargs) but do not want to mark declarations as "referenced"
6829 /// until the default argument is used.
6831 };
6832
6833 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6834 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6835 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6836 /// have been applied to all subexpressions of the enclosing full expression.
6837 /// This is cleared at the end of each full expression.
6840
6841 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6842
6843 /// Data structure used to record current or nested
6844 /// expression evaluation contexts.
6846 /// The expression evaluation context.
6848
6849 /// Whether the enclosing context needed a cleanup.
6851
6852 /// The number of active cleanup objects when we entered
6853 /// this expression evaluation context.
6855
6857
6858 /// The lambdas that are present within this context, if it
6859 /// is indeed an unevaluated context.
6861
6862 /// The declaration that provides context for lambda expressions
6863 /// and block literals if the normal declaration context does not
6864 /// suffice, e.g., in a default function argument.
6866
6867 /// Declaration for initializer if one is currently being
6868 /// parsed. Used when an expression has a possibly unreachable
6869 /// diagnostic to reference the declaration as a whole.
6871
6872 /// If we are processing a decltype type, a set of call expressions
6873 /// for which we have deferred checking the completeness of the return type.
6875
6876 /// If we are processing a decltype type, a set of temporary binding
6877 /// expressions for which we have deferred checking the destructor.
6879
6881
6882 /// Expressions appearing as the LHS of a volatile assignment in this
6883 /// context. We produce a warning for these when popping the context if
6884 /// they are not discarded-value expressions nor unevaluated operands.
6886
6887 /// Set of candidates for starting an immediate invocation.
6890
6891 /// Set of DeclRefExprs referencing a consteval function when used in a
6892 /// context not already known to be immediately invoked.
6894
6895 /// P2718R0 - Lifetime extension in range-based for loops.
6896 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6897 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6898 /// InLifetimeExtendingContext is true.
6900
6901 /// Small set of gathered accesses to potentially misaligned members
6902 /// due to the packed attribute.
6904
6905 /// \brief Describes whether we are in an expression constext which we have
6906 /// to handle differently.
6914
6915 // A context can be nested in both a discarded statement context and
6916 // an immediate function context, so they need to be tracked independently.
6920
6922
6923 // We are in a constant context, but we also allow
6924 // non constant expressions, for example for array bounds (which may be
6925 // VLAs).
6927
6928 /// Whether we are currently in a context in which all temporaries must be
6929 /// lifetime-extended, even if they're not bound to a reference (for
6930 /// example, in a for-range initializer).
6932
6933 /// Whether evaluating an expression for a switch case label.
6934 bool IsCaseExpr = false;
6935
6936 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6938
6939 // When evaluating immediate functions in the initializer of a default
6940 // argument or default member initializer, this is the declaration whose
6941 // default initializer is being evaluated and the location of the call
6942 // or constructor definition.
6946 : Loc(Loc), Decl(Decl), Context(Context) {
6947 assert(Decl && Context && "invalid initialization context");
6948 }
6949
6951 ValueDecl *Decl = nullptr;
6953 };
6954 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6955
6966
6972
6979
6984
6989 // C++23 [expr.const]p14:
6990 // An expression or conversion is in an immediate function
6991 // context if it is potentially evaluated and either:
6992 // * its innermost enclosing non-block scope is a function
6993 // parameter scope of an immediate function, or
6994 // * its enclosing statement is enclosed by the compound-
6995 // statement of a consteval if statement.
6998 }
6999
7007 };
7008
7010 assert(!ExprEvalContexts.empty() &&
7011 "Must be in an expression evaluation context");
7012 return ExprEvalContexts.back();
7013 }
7014
7016 assert(!ExprEvalContexts.empty() &&
7017 "Must be in an expression evaluation context");
7018 return ExprEvalContexts.back();
7019 }
7020
7022 assert(ExprEvalContexts.size() >= 2 &&
7023 "Must be in an expression evaluation context");
7024 return ExprEvalContexts[ExprEvalContexts.size() - 2];
7025 }
7026
7028 return const_cast<Sema *>(this)->parentEvaluationContext();
7029 }
7030
7035
7036 /// Increment when we find a reference; decrement when we find an ignored
7037 /// assignment. Ultimately the value is 0 if every reference is an ignored
7038 /// assignment.
7039 ///
7040 /// Uses canonical VarDecl as key so in-class decls and out-of-class defs of
7041 /// static data members get tracked as a single entry.
7042 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
7043
7044 /// Used to control the generation of ExprWithCleanups.
7046
7047 /// ExprCleanupObjects - This is the stack of objects requiring
7048 /// cleanup that are created by the current full expression.
7050
7051 /// Determine whether the use of this declaration is valid, without
7052 /// emitting diagnostics.
7053 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
7054 // A version of DiagnoseUseOfDecl that should be used if overload resolution
7055 // has been used to find this declaration, which means we don't have to bother
7056 // checking the trailing requires clause.
7058 return DiagnoseUseOfDecl(
7059 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
7060 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
7061 /*SkipTrailingRequiresClause=*/true);
7062 }
7063
7064 /// Determine whether the use of this declaration is valid, and
7065 /// emit any corresponding diagnostics.
7066 ///
7067 /// This routine diagnoses various problems with referencing
7068 /// declarations that can occur when using a declaration. For example,
7069 /// it might warn if a deprecated or unavailable declaration is being
7070 /// used, or produce an error (and return true) if a C++0x deleted
7071 /// function is being used.
7072 ///
7073 /// \returns true if there was an error (this declaration cannot be
7074 /// referenced), false otherwise.
7076 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
7077 bool ObjCPropertyAccess = false,
7078 bool AvoidPartialAvailabilityChecks = false,
7079 ObjCInterfaceDecl *ClassReceiver = nullptr,
7080 bool SkipTrailingRequiresClause = false);
7081
7082 /// Emit a note explaining that this function is deleted.
7084
7085 /// DiagnoseSentinelCalls - This routine checks whether a call or
7086 /// message-send is to a declaration with the sentinel attribute, and
7087 /// if so, it checks that the requirements of the sentinel are
7088 /// satisfied.
7090 ArrayRef<Expr *> Args);
7091
7093 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
7096
7098 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
7099
7102 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
7106
7108
7112
7113 /// Check whether E, which is either a discarded-value expression or an
7114 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
7115 /// lvalue, and if so, remove it from the list of volatile-qualified
7116 /// assignments that we are going to warn are deprecated.
7118
7120
7121 // Functions for marking a declaration referenced. These functions also
7122 // contain the relevant logic for marking if a reference to a function or
7123 // variable is an odr-use (in the C++11 sense). There are separate variants
7124 // for expressions referring to a decl; these exist because odr-use marking
7125 // needs to be delayed for some constant variables when we build one of the
7126 // named expressions.
7127 //
7128 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7129 // should usually be true. This only needs to be set to false if the lack of
7130 // odr-use cannot be determined from the current context (for instance,
7131 // because the name denotes a virtual function and was written without an
7132 // explicit nested-name-specifier).
7133 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7134
7135 /// Mark a function referenced, and check whether it is odr-used
7136 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7138 bool MightBeOdrUse = true);
7139
7140 /// Mark a variable referenced, and check whether it is odr-used
7141 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7142 /// used directly for normal expressions referring to VarDecl.
7144
7145 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7146 ///
7147 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7148 /// be handled with care if the DeclRefExpr is not newly-created.
7149 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7150
7151 /// Perform reference-marking and odr-use handling for a MemberExpr.
7153
7154 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7157 unsigned CapturingScopeIndex);
7158
7160 void CleanupVarDeclMarking();
7161
7162 /// Try to capture the given variable.
7163 ///
7164 /// \param Var The variable to capture.
7165 ///
7166 /// \param Loc The location at which the capture occurs.
7167 ///
7168 /// \param Kind The kind of capture, which may be implicit (for either a
7169 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7170 ///
7171 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7172 /// an explicit lambda capture.
7173 ///
7174 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7175 /// captures or diagnose errors. If false, this routine merely check whether
7176 /// the capture can occur without performing the capture itself or complaining
7177 /// if the variable cannot be captured.
7178 ///
7179 /// \param CaptureType Will be set to the type of the field used to capture
7180 /// this variable in the innermost block or lambda. Only valid when the
7181 /// variable can be captured.
7182 ///
7183 /// \param DeclRefType Will be set to the type of a reference to the capture
7184 /// from within the current scope. Only valid when the variable can be
7185 /// captured.
7186 ///
7187 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7188 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7189 /// This is useful when enclosing lambdas must speculatively capture
7190 /// variables that may or may not be used in certain specializations of
7191 /// a nested generic lambda.
7192 ///
7193 /// \returns true if an error occurred (i.e., the variable cannot be
7194 /// captured) and false if the capture succeeded.
7196 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7197 bool BuildAndDiagnose, QualType &CaptureType,
7198 QualType &DeclRefType,
7199 const unsigned *const FunctionScopeIndexToStopAt);
7200
7201 /// Try to capture the given variable.
7204 SourceLocation EllipsisLoc = SourceLocation());
7205
7206 /// Checks if the variable must be captured.
7208
7209 /// Given a variable, determine the type that a reference to that
7210 /// variable will have in the given scope.
7212
7213 /// Mark all of the declarations referenced within a particular AST node as
7214 /// referenced. Used when template instantiation instantiates a non-dependent
7215 /// type -- entities referenced by the type are now referenced.
7217
7218 /// Mark any declarations that appear within this expression or any
7219 /// potentially-evaluated subexpressions as "referenced".
7220 ///
7221 /// \param SkipLocalVariables If true, don't mark local variables as
7222 /// 'referenced'.
7223 /// \param StopAt Subexpressions that we shouldn't recurse into.
7225 bool SkipLocalVariables = false,
7226 ArrayRef<const Expr *> StopAt = {});
7227
7228 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7229 /// conversion.
7230 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7231
7232 /// Conditionally issue a diagnostic based on the statements's reachability
7233 /// analysis.
7234 ///
7235 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7236 /// the function body is parsed, and then do a basic reachability analysis to
7237 /// determine if the statement is reachable. If it is unreachable, the
7238 /// diagnostic will not be emitted.
7239 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7240 const PartialDiagnostic &PD);
7241
7242 /// Conditionally issue a diagnostic based on the current
7243 /// evaluation context.
7244 ///
7245 /// \param Statement If Statement is non-null, delay reporting the
7246 /// diagnostic until the function body is parsed, and then do a basic
7247 /// reachability analysis to determine if the statement is reachable.
7248 /// If it is unreachable, the diagnostic will not be emitted.
7249 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7250 const PartialDiagnostic &PD);
7251 /// Similar, but diagnostic is only produced if all the specified statements
7252 /// are reachable.
7253 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7254 const PartialDiagnostic &PD);
7255
7256 // Primary Expressions.
7257 SourceRange getExprRange(Expr *E) const;
7258
7259 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7260 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7261 bool HasTrailingLParen, bool IsAddressOfOperand,
7262 CorrectionCandidateCallback *CCC = nullptr,
7263 bool IsInlineAsmIdentifier = false,
7264 Token *KeywordReplacement = nullptr);
7265
7266 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7267 /// possibly a list of template arguments.
7268 ///
7269 /// If this produces template arguments, it is permitted to call
7270 /// DecomposeTemplateName.
7271 ///
7272 /// This actually loses a lot of source location information for
7273 /// non-standard name kinds; we should consider preserving that in
7274 /// some way.
7275 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7276 TemplateArgumentListInfo &Buffer,
7277 DeclarationNameInfo &NameInfo,
7278 const TemplateArgumentListInfo *&TemplateArgs);
7279
7280 /// Diagnose a lookup that found results in an enclosing class during error
7281 /// recovery. This usually indicates that the results were found in a
7282 /// dependent base class that could not be searched as part of a template
7283 /// definition. Always issues a diagnostic (though this may be only a warning
7284 /// in MS compatibility mode).
7285 ///
7286 /// Return \c true if the error is unrecoverable, or \c false if the caller
7287 /// should attempt to recover using these lookup results.
7288 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7289
7290 /// Diagnose an empty lookup.
7291 ///
7292 /// \return false if new lookup candidates were found
7293 bool
7294 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7295 CorrectionCandidateCallback &CCC,
7296 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7297 ArrayRef<Expr *> Args = {},
7298 DeclContext *LookupCtx = nullptr);
7299
7300 /// If \p D cannot be odr-used in the current expression evaluation context,
7301 /// return a reason explaining why. Otherwise, return NOUR_None.
7303
7304 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7305 SourceLocation Loc,
7306 const CXXScopeSpec *SS = nullptr);
7307 DeclRefExpr *
7308 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7309 const DeclarationNameInfo &NameInfo,
7310 const CXXScopeSpec *SS = nullptr,
7311 NamedDecl *FoundD = nullptr,
7312 SourceLocation TemplateKWLoc = SourceLocation(),
7313 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7314
7315 /// BuildDeclRefExpr - Build an expression that references a
7316 /// declaration that does not require a closure capture.
7317 DeclRefExpr *
7318 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7319 const DeclarationNameInfo &NameInfo,
7320 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7321 SourceLocation TemplateKWLoc = SourceLocation(),
7322 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7323
7324 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7325 bool HasTrailingLParen);
7326
7327 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7328 /// declaration name, generally during template instantiation.
7329 /// There's a large number of things which don't need to be done along
7330 /// this path.
7332 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7333 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7334
7335 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7336 bool NeedsADL,
7337 bool AcceptInvalidDecl = false);
7338
7339 /// Complete semantic analysis for a reference to the given declaration.
7341 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7342 NamedDecl *FoundD = nullptr,
7343 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7344 bool AcceptInvalidDecl = false);
7345
7346 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7347 // where Tokens representing function local predefined macros (such as
7348 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7349 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7350
7351 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7352 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7353 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7354
7355 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7356
7357 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7359 Scope *UDLScope = nullptr);
7360 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7361 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7362 MultiExprArg Val);
7363 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7364 unsigned NumUserSpecifiedExprs,
7365 SourceLocation InitLoc,
7366 SourceLocation LParenLoc,
7367 SourceLocation RParenLoc);
7368
7369 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7370 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7371 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7372 /// from multiple tokens. However, the common case is that StringToks points
7373 /// to one string.
7374 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7375 Scope *UDLScope = nullptr);
7376
7377 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7378
7379 /// ControllingExprOrType is either an opaque pointer coming out of a
7380 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7381 /// into two so we don't take a void *, but that's awkward because one of
7382 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7383 /// itself to generic code very well.
7384 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7385 SourceLocation DefaultLoc,
7386 SourceLocation RParenLoc,
7387 bool PredicateIsExpr,
7388 void *ControllingExprOrType,
7389 ArrayRef<ParsedType> ArgTypes,
7390 ArrayRef<Expr *> ArgExprs);
7391 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7392 /// it'd be better to split this interface into two so we don't take a
7393 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7394 /// isn't a trivial change.
7395 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7396 SourceLocation DefaultLoc,
7397 SourceLocation RParenLoc,
7398 bool PredicateIsExpr,
7399 void *ControllingExprOrType,
7400 ArrayRef<TypeSourceInfo *> Types,
7401 ArrayRef<Expr *> Exprs);
7402
7403 // Binary/Unary Operators. 'Tok' is the token for the operator.
7404 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7405 Expr *InputExpr, bool IsAfterAmp = false);
7406 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7407 Expr *Input, bool IsAfterAmp = false);
7408
7409 /// Unary Operators. 'Tok' is the token for the operator.
7410 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7411 Expr *Input, bool IsAfterAmp = false);
7412
7413 /// Determine whether the given expression is a qualified member
7414 /// access expression, of a form that could be turned into a pointer to member
7415 /// with the address-of operator.
7416 bool isQualifiedMemberAccess(Expr *E);
7417 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7418 const Expr *Op,
7419 const CXXMethodDecl *MD);
7420
7421 /// CheckAddressOfOperand - The operand of & must be either a function
7422 /// designator or an lvalue designating an object. If it is an lvalue, the
7423 /// object cannot be declared with storage class register or be a bit field.
7424 /// Note: The usual conversions are *not* applied to the operand of the &
7425 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7426 /// In C++, the operand might be an overloaded function name, in which case
7427 /// we allow the '&' but retain the overloaded-function type.
7428 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7429
7430 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7431 /// _Alignas(type-name) .
7432 /// [dcl.align] An alignment-specifier of the form
7433 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7434 ///
7435 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7436 /// _Alignas(_Alignof(type-name)).
7437 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7438 SourceLocation OpLoc, SourceRange R);
7439 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7440 SourceLocation OpLoc, SourceRange R);
7441
7442 /// Build a sizeof or alignof expression given a type operand.
7443 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7444 SourceLocation OpLoc,
7445 UnaryExprOrTypeTrait ExprKind,
7446 SourceRange R);
7447
7448 /// Build a sizeof or alignof expression given an expression
7449 /// operand.
7450 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7451 UnaryExprOrTypeTrait ExprKind);
7452
7453 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7454 /// expr and the same for @c alignof and @c __alignof
7455 /// Note that the ArgRange is invalid if isType is false.
7456 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7457 UnaryExprOrTypeTrait ExprKind,
7458 bool IsType, void *TyOrEx,
7459 SourceRange ArgRange);
7460
7461 /// Check for operands with placeholder types and complain if found.
7462 /// Returns ExprError() if there was an error and no recovery was possible.
7464 bool CheckVecStepExpr(Expr *E);
7465
7466 /// Check the constraints on expression operands to unary type expression
7467 /// and type traits.
7468 ///
7469 /// Completes any types necessary and validates the constraints on the operand
7470 /// expression. The logic mostly mirrors the type-based overload, but may
7471 /// modify the expression as it completes the type for that expression through
7472 /// template instantiation, etc.
7474
7475 /// Check the constraints on operands to unary expression and type
7476 /// traits.
7477 ///
7478 /// This will complete any types necessary, and validate the various
7479 /// constraints on those operands.
7480 ///
7481 /// The UsualUnaryConversions() function is *not* called by this routine.
7482 /// C99 6.3.2.1p[2-4] all state:
7483 /// Except when it is the operand of the sizeof operator ...
7484 ///
7485 /// C++ [expr.sizeof]p4
7486 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7487 /// standard conversions are not applied to the operand of sizeof.
7488 ///
7489 /// This policy is followed for all of the unary trait expressions.
7490 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7491 SourceRange ExprRange,
7492 UnaryExprOrTypeTrait ExprKind,
7493 StringRef KWName);
7494
7495 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7496 tok::TokenKind Kind, Expr *Input);
7497
7498 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7499 MultiExprArg ArgExprs,
7500 SourceLocation RLoc);
7501 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7502 Expr *Idx, SourceLocation RLoc);
7503
7504 ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx,
7505 SourceLocation RBLoc);
7506
7507 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7508 Expr *ColumnIdx,
7509 SourceLocation RBLoc);
7510
7511 /// ConvertArgumentsForCall - Converts the arguments specified in
7512 /// Args/NumArgs to the parameter types of the function FDecl with
7513 /// function prototype Proto. Call is the call expression itself, and
7514 /// Fn is the function expression. For a C++ member function, this
7515 /// routine does not attempt to convert the object argument. Returns
7516 /// true if the call is ill-formed.
7517 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7518 const FunctionProtoType *Proto,
7519 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7520 bool ExecConfig = false);
7521
7522 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7523 /// array parameter, check that it is non-null, and that if it is formed by
7524 /// array-to-pointer decay, the underlying array is sufficiently large.
7525 ///
7526 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7527 /// the array type derivation, then for each call to the function, the value
7528 /// of the corresponding actual argument shall provide access to the first
7529 /// element of an array with at least as many elements as specified by the
7530 /// size expression.
7531 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7532 const Expr *ArgExpr);
7533
7534 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7535 /// This provides the location of the left/right parens and a list of comma
7536 /// locations.
7537 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7538 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7539 Expr *ExecConfig = nullptr);
7540
7541 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7542 /// This provides the location of the left/right parens and a list of comma
7543 /// locations.
7544 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7545 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7546 Expr *ExecConfig = nullptr,
7547 bool IsExecConfig = false,
7548 bool AllowRecovery = false);
7549
7550 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7551 // with the specified CallArgs
7552 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7553 MultiExprArg CallArgs);
7554
7556
7557 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7558 /// i.e. an expression not of \p OverloadTy. The expression should
7559 /// unary-convert to an expression of function-pointer or
7560 /// block-pointer type.
7561 ///
7562 /// \param NDecl the declaration being called, if available
7564 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7565 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7566 Expr *Config = nullptr, bool IsExecConfig = false,
7567 ADLCallKind UsesADL = ADLCallKind::NotADL);
7568
7570 ParsedType &Ty, SourceLocation RParenLoc,
7571 Expr *CastExpr);
7572
7573 /// Prepares for a scalar cast, performing all the necessary stages
7574 /// except the final cast and returning the kind required.
7576
7577 /// Build an altivec or OpenCL literal.
7579 SourceLocation RParenLoc, Expr *E,
7580 TypeSourceInfo *TInfo);
7581
7582 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7583 /// the ParenListExpr into a sequence of comma binary operators.
7585
7587 SourceLocation RParenLoc, Expr *InitExpr);
7588
7590 TypeSourceInfo *TInfo,
7591 SourceLocation RParenLoc,
7592 Expr *LiteralExpr);
7593
7594 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7595 SourceLocation RBraceLoc);
7596
7597 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7598 SourceLocation RBraceLoc);
7599
7600 /// Binary Operators. 'Tok' is the token for the operator.
7602 Expr *LHSExpr, Expr *RHSExpr);
7604 Expr *LHSExpr, Expr *RHSExpr,
7605 bool ForFoldExpression = false);
7606
7607 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7608 /// operator @p Opc at location @c TokLoc. This routine only supports
7609 /// built-in operations; ActOnBinOp handles overloaded operators.
7611 Expr *LHSExpr, Expr *RHSExpr,
7612 bool ForFoldExpression = false);
7614 UnresolvedSetImpl &Functions);
7615
7616 /// Look for instances where it is likely the comma operator is confused with
7617 /// another operator. There is an explicit list of acceptable expressions for
7618 /// the left hand side of the comma operator, otherwise emit a warning.
7619 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7620
7621 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7622 /// in the case of a the GNU conditional expr extension.
7624 SourceLocation ColonLoc, Expr *CondExpr,
7625 Expr *LHSExpr, Expr *RHSExpr);
7626
7627 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7629 LabelDecl *TheDecl);
7630
7631 void ActOnStartStmtExpr();
7632 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7633 SourceLocation RPLoc);
7635 SourceLocation RPLoc, unsigned TemplateDepth);
7636 // Handle the final expression in a statement expression.
7638 void ActOnStmtExprError();
7639
7640 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7643 bool isBrackets; // true if [expr], false if .ident
7644 union {
7647 } U;
7648 };
7649
7650 /// __builtin_offsetof(type, a.b[123][456].c)
7652 TypeSourceInfo *TInfo,
7653 ArrayRef<OffsetOfComponent> Components,
7654 SourceLocation RParenLoc);
7657 ParsedType ParsedArgTy,
7658 ArrayRef<OffsetOfComponent> Components,
7659 SourceLocation RParenLoc);
7660
7661 // __builtin_choose_expr(constExpr, expr1, expr2)
7662 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7663 Expr *LHSExpr, Expr *RHSExpr,
7664 SourceLocation RPLoc);
7665
7666 // __builtin_va_arg(expr, type)
7668 SourceLocation RPLoc);
7670 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7671
7672 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7673 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7675 SourceLocation BuiltinLoc,
7676 SourceLocation RPLoc);
7677
7678 // #embed
7680 StringLiteral *BinaryData, StringRef FileName);
7681
7682 // Build a potentially resolved SourceLocExpr.
7684 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7685 DeclContext *ParentContext);
7686
7687 // __null
7689
7690 bool CheckCaseExpression(Expr *E);
7691
7692 //===------------------------- "Block" Extension ------------------------===//
7693
7694 /// ActOnBlockStart - This callback is invoked when a block literal is
7695 /// started.
7696 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7697
7698 /// ActOnBlockArguments - This callback allows processing of block arguments.
7699 /// If there are no arguments, this is still invoked.
7700 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7701 Scope *CurScope);
7702
7703 /// ActOnBlockError - If there is an error parsing a block, this callback
7704 /// is invoked to pop the information about the block from the action impl.
7705 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7706
7707 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7708 /// literal was successfully completed. ^(int x){...}
7710 Scope *CurScope);
7711
7712 //===---------------------------- Clang Extensions ----------------------===//
7713
7714 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7715 /// provided arguments.
7716 ///
7717 /// __builtin_convertvector( value, dst type )
7718 ///
7720 SourceLocation BuiltinLoc,
7721 SourceLocation RParenLoc);
7722
7723 //===---------------------------- OpenCL Features -----------------------===//
7724
7725 /// Parse a __builtin_astype expression.
7726 ///
7727 /// __builtin_astype( value, dst type )
7728 ///
7729 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7730 SourceLocation BuiltinLoc,
7731 SourceLocation RParenLoc);
7732
7733 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7735 SourceLocation BuiltinLoc,
7736 SourceLocation RParenLoc);
7737
7738 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7740 ArrayRef<Expr *> SubExprs,
7741 QualType T = QualType());
7742
7743 /// Cast a base object to a member's actual type.
7744 ///
7745 /// There are two relevant checks:
7746 ///
7747 /// C++ [class.access.base]p7:
7748 ///
7749 /// If a class member access operator [...] is used to access a non-static
7750 /// data member or non-static member function, the reference is ill-formed
7751 /// if the left operand [...] cannot be implicitly converted to a pointer to
7752 /// the naming class of the right operand.
7753 ///
7754 /// C++ [expr.ref]p7:
7755 ///
7756 /// If E2 is a non-static data member or a non-static member function, the
7757 /// program is ill-formed if the class of which E2 is directly a member is
7758 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7759 ///
7760 /// Note that the latter check does not consider access; the access of the
7761 /// "real" base class is checked as appropriate when checking the access of
7762 /// the member name.
7764 NestedNameSpecifier Qualifier,
7765 NamedDecl *FoundDecl,
7766 NamedDecl *Member);
7767
7768 /// CheckCallReturnType - Checks that a call expression's return type is
7769 /// complete. Returns true on failure. The location passed in is the location
7770 /// that best represents the call.
7771 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7772 CallExpr *CE, FunctionDecl *FD);
7773
7774 /// Emit a warning for all pending noderef expressions that we recorded.
7775 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7776
7778
7779 /// Instantiate or parse a C++ default argument expression as necessary.
7780 /// Return true on error.
7782 ParmVarDecl *Param, Expr *Init = nullptr,
7783 bool SkipImmediateInvocations = true);
7784
7785 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7786 /// the default expr if needed.
7788 ParmVarDecl *Param, Expr *Init = nullptr);
7789
7790 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7791 /// invocation.
7793
7795
7796 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7797 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7798
7799 /// Abstract base class used for diagnosing integer constant
7800 /// expression violations.
7802 public:
7804
7806
7807 virtual SemaDiagnosticBuilder
7808 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7810 SourceLocation Loc) = 0;
7813 };
7814
7815 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7816 /// and reports the appropriate diagnostics. Returns false on success.
7817 /// Can optionally return the value of the expression.
7820 VerifyICEDiagnoser &Diagnoser,
7824 unsigned DiagID,
7827 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7831 AllowFoldKind CanFold = AllowFoldKind::No) {
7832 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7833 }
7834
7835 /// DiagnoseAssignmentAsCondition - Given that an expression is
7836 /// being used as a boolean condition, warn if it's an assignment.
7838
7839 /// Redundant parentheses over an equality comparison can indicate
7840 /// that the user intended an assignment used as condition.
7842
7844 public:
7846 FullExprArg(Sema &actions) : E(nullptr) {}
7847
7848 ExprResult release() { return E; }
7849
7850 Expr *get() const { return E; }
7851
7852 Expr *operator->() { return E; }
7853
7854 private:
7855 // FIXME: No need to make the entire Sema class a friend when it's just
7856 // Sema::MakeFullExpr that needs access to the constructor below.
7857 friend class Sema;
7858
7859 explicit FullExprArg(Expr *expr) : E(expr) {}
7860
7861 Expr *E;
7862 };
7863
7865 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7866 }
7868 return FullExprArg(
7869 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7870 }
7872 ExprResult FE =
7873 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7874 /*DiscardedValue*/ true);
7875 return FullExprArg(FE.get());
7876 }
7877
7878 class ConditionResult {
7879 Decl *ConditionVar;
7880 ExprResult Condition;
7881 bool Invalid;
7882 std::optional<bool> KnownValue;
7883
7884 friend class Sema;
7885 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7886 bool IsConstexpr)
7887 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7888 if (IsConstexpr && Condition.get()) {
7889 if (std::optional<llvm::APSInt> Val =
7890 Condition.get()->getIntegerConstantExpr(S.Context)) {
7891 KnownValue = !!(*Val);
7892 }
7893 }
7894 }
7895 explicit ConditionResult(bool Invalid)
7896 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7897 KnownValue(std::nullopt) {}
7898
7899 public:
7900 ConditionResult() : ConditionResult(false) {}
7901 bool isInvalid() const { return Invalid; }
7902 std::pair<VarDecl *, Expr *> get() const {
7903 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7904 Condition.get());
7905 }
7906 std::optional<bool> getKnownValue() const { return KnownValue; }
7907 };
7909
7910 /// CheckBooleanCondition - Diagnose problems involving the use of
7911 /// the given expression as a boolean condition (e.g. in an if
7912 /// statement). Also performs the standard function and array
7913 /// decays, possibly changing the input variable.
7914 ///
7915 /// \param Loc - A location associated with the condition, e.g. the
7916 /// 'if' keyword.
7917 /// \return true iff there were any errors
7919 bool IsConstexpr = false);
7920
7921 enum class ConditionKind {
7922 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7923 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7924 Switch ///< An integral condition for a 'switch' statement.
7925 };
7926
7927 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7928 ConditionKind CK, bool MissingOK = false);
7929
7930 QualType CheckConditionalOperands( // C99 6.5.15
7932 ExprObjectKind &OK, SourceLocation QuestionLoc);
7933
7934 /// Emit a specialized diagnostic when one expression is a null pointer
7935 /// constant and the other is not a pointer. Returns true if a diagnostic is
7936 /// emitted.
7937 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7938 SourceLocation QuestionLoc);
7939
7940 /// type checking for vector binary operators.
7942 SourceLocation Loc, bool IsCompAssign,
7943 bool AllowBothBool, bool AllowBoolConversion,
7944 bool AllowBoolOperation, bool ReportInvalid);
7945
7946 /// Return a signed ext_vector_type that is of identical size and number of
7947 /// elements. For floating point vectors, return an integer type of identical
7948 /// size and number of elements. In the non ext_vector_type case, search from
7949 /// the largest type to the smallest type to avoid cases where long long ==
7950 /// long, where long gets picked over long long.
7953
7954 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7955 /// operates on extended vector types. Instead of producing an IntTy result,
7956 /// like a scalar comparison, a vector comparison produces a vector of integer
7957 /// types.
7959 SourceLocation Loc,
7960 BinaryOperatorKind Opc);
7962 SourceLocation Loc,
7963 BinaryOperatorKind Opc);
7965 SourceLocation Loc,
7966 BinaryOperatorKind Opc);
7968 SourceLocation Loc,
7969 BinaryOperatorKind Opc);
7970 // type checking for sizeless vector binary operators.
7972 SourceLocation Loc, bool IsCompAssign,
7973 ArithConvKind OperationKind);
7974
7975 /// Type checking for matrix binary operators.
7977 SourceLocation Loc,
7978 bool IsCompAssign);
7980 SourceLocation Loc, bool IsCompAssign);
7981
7982 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7983 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7984 /// VLST) allowed?
7985 ///
7986 /// This will also return false if the two given types do not make sense from
7987 /// the perspective of SVE bitcasts.
7988 bool isValidSveBitcast(QualType srcType, QualType destType);
7989
7990 /// Are the two types matrix types and do they have the same dimensions i.e.
7991 /// do they have the same number of rows and the same number of columns?
7993
7994 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7995
7996 /// Are the two types lax-compatible vector types? That is, given
7997 /// that one of them is a vector, do they have equal storage sizes,
7998 /// where the storage size is the number of elements times the element
7999 /// size?
8000 ///
8001 /// This will also return false if either of the types is neither a
8002 /// vector nor a real type.
8003 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
8004
8005 /// Is this a legal conversion between two types, one of which is
8006 /// known to be a vector type?
8007 bool isLaxVectorConversion(QualType srcType, QualType destType);
8008
8009 // This returns true if at least one of the types is an altivec vector.
8010 bool anyAltivecTypes(QualType srcType, QualType destType);
8011
8012 // type checking C++ declaration initializers (C++ [dcl.init]).
8013
8014 /// Check a cast of an unknown-any type. We intentionally only
8015 /// trigger this for C-style casts.
8018 ExprValueKind &VK, CXXCastPath &Path);
8019
8020 /// Force an expression with unknown-type to an expression of the
8021 /// given type.
8023
8024 /// Type-check an expression that's being passed to an
8025 /// __unknown_anytype parameter.
8027 QualType &paramType);
8028
8029 // CheckMatrixCast - Check type constraints for matrix casts.
8030 // We allow casting between matrixes of the same dimensions i.e. when they
8031 // have the same number of rows and column. Returns true if the cast is
8032 // invalid.
8033 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
8034 CastKind &Kind);
8035
8036 // CheckVectorCast - check type constraints for vectors.
8037 // Since vectors are an extension, there are no C standard reference for this.
8038 // We allow casting between vectors and integer datatypes of the same size.
8039 // returns true if the cast is invalid
8040 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
8041 CastKind &Kind);
8042
8043 /// Prepare `SplattedExpr` for a vector splat operation, adding
8044 /// implicit casts if necessary.
8045 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
8046
8047 /// Prepare `SplattedExpr` for a matrix splat operation, adding
8048 /// implicit casts if necessary.
8049 ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr);
8050
8051 // CheckExtVectorCast - check type constraints for extended vectors.
8052 // Since vectors are an extension, there are no C standard reference for this.
8053 // We allow casting between vectors and integer datatypes of the same size,
8054 // or vectors and the element type of that vector.
8055 // returns the cast expr
8057 CastKind &Kind);
8058
8060 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
8061 }
8062
8063 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
8064 // functions and arrays to their respective pointers (C99 6.3.2.1), and
8065 // promotes floating-piont types according to the language semantics.
8067
8068 // UsualUnaryFPConversions - promotes floating-point types according to the
8069 // current language semantics.
8071
8072 /// CallExprUnaryConversions - a special case of an unary conversion
8073 /// performed on a function designator of a call expression.
8075
8076 // DefaultFunctionArrayConversion - converts functions and arrays
8077 // to their respective pointers (C99 6.3.2.1).
8079
8080 // DefaultFunctionArrayLvalueConversion - converts functions and
8081 // arrays to their respective pointers and performs the
8082 // lvalue-to-rvalue conversion.
8084 bool Diagnose = true);
8085
8086 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
8087 // the operand. This function is a no-op if the operand has a function type
8088 // or an array type.
8090
8091 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
8092 // do not have a prototype. Integer promotions are performed on each
8093 // argument, and arguments that have type float are promoted to double.
8095
8097 const FunctionProtoType *Proto,
8098 Expr *Fn);
8099
8100 /// Determine the degree of POD-ness for an expression.
8101 /// Incomplete types are considered POD, since this check can be performed
8102 /// when we're in an unevaluated context.
8104
8105 /// Check to see if the given expression is a valid argument to a variadic
8106 /// function, issuing a diagnostic if not.
8107 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
8108
8109 /// GatherArgumentsForCall - Collector argument expressions for various
8110 /// form of call prototypes.
8112 SourceLocation CallLoc, FunctionDecl *FDecl,
8113 const FunctionProtoType *Proto, unsigned FirstParam,
8116 bool AllowExplicit = false, bool IsListInitialization = false);
8117
8118 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
8119 // will create a runtime trap if the resulting type is not a POD type.
8121 FunctionDecl *FDecl);
8122
8123 // Check that the usual arithmetic conversions can be performed on this pair
8124 // of expressions that might be of enumeration type.
8126 ArithConvKind ACK);
8127
8128 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
8129 // operands and then handles various conversions that are common to binary
8130 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8131 // routine returns the first non-arithmetic type found. The client is
8132 // responsible for emitting appropriate error diagnostics.
8134 SourceLocation Loc, ArithConvKind ACK);
8135
8137 switch (ConvTy) {
8138 default:
8139 return false;
8143 return true;
8144 }
8145 llvm_unreachable("impossible");
8146 }
8147
8148 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8149 /// assignment conversion type specified by ConvTy. This returns true if the
8150 /// conversion was invalid or false if the conversion was accepted.
8152 QualType DstType, QualType SrcType,
8153 Expr *SrcExpr, AssignmentAction Action,
8154 bool *Complained = nullptr);
8155
8156 /// CheckAssignmentConstraints - Perform type checking for assignment,
8157 /// argument passing, variable initialization, and function return values.
8158 /// C99 6.5.16.
8160 QualType LHSType,
8161 QualType RHSType);
8162
8163 /// Check assignment constraints and optionally prepare for a conversion of
8164 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8165 /// is true.
8167 ExprResult &RHS, CastKind &Kind,
8168 bool ConvertRHS = true);
8169
8170 /// Check assignment constraints for an assignment of RHS to LHSType.
8171 ///
8172 /// \param LHSType The destination type for the assignment.
8173 /// \param RHS The source expression for the assignment.
8174 /// \param Diagnose If \c true, diagnostics may be produced when checking
8175 /// for assignability. If a diagnostic is produced, \p RHS will be
8176 /// set to ExprError(). Note that this function may still return
8177 /// without producing a diagnostic, even for an invalid assignment.
8178 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8179 /// in an audited Core Foundation API and does not need to be checked
8180 /// for ARC retain issues.
8181 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8182 /// conversions necessary to perform the assignment. If \c false,
8183 /// \p Diagnose must also be \c false.
8185 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8186 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8187
8188 // If the lhs type is a transparent union, check whether we
8189 // can initialize the transparent union with the given expression.
8191 ExprResult &RHS);
8192
8193 /// the following "Check" methods will return a valid/converted QualType
8194 /// or a null QualType (indicating an error diagnostic was issued).
8195
8196 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8198 ExprResult &RHS);
8199
8200 /// Diagnose cases where a scalar was implicitly converted to a vector and
8201 /// diagnose the underlying types. Otherwise, diagnose the error
8202 /// as invalid vector logical operands for non-C++ cases.
8204 ExprResult &RHS);
8205
8207 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8208 BinaryOperatorKind Opc);
8209 QualType CheckRemainderOperands( // C99 6.5.5
8210 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8211 bool IsCompAssign = false);
8212 QualType CheckAdditionOperands( // C99 6.5.6
8213 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8214 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8216 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8217 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8218 QualType CheckShiftOperands( // C99 6.5.7
8219 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8220 BinaryOperatorKind Opc, bool IsCompAssign = false);
8222 QualType CheckCompareOperands( // C99 6.5.8/9
8223 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8224 BinaryOperatorKind Opc);
8225 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8226 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8227 BinaryOperatorKind Opc);
8228 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8229 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8230 BinaryOperatorKind Opc);
8231 // CheckAssignmentOperands is used for both simple and compound assignment.
8232 // For simple assignment, pass both expressions and a null converted type.
8233 // For compound assignment, pass both expressions and the converted type.
8234 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8235 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8236 BinaryOperatorKind Opc);
8237
8238 /// To be used for checking whether the arguments being passed to
8239 /// function exceeds the number of parameters expected for it.
8240 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8241 bool PartialOverloading = false) {
8242 // We check whether we're just after a comma in code-completion.
8243 if (NumArgs > 0 && PartialOverloading)
8244 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8245 return NumArgs > NumParams;
8246 }
8247
8248 /// Whether the AST is currently being rebuilt to correct immediate
8249 /// invocations. Immediate invocation candidates and references to consteval
8250 /// functions aren't tracked when this is set.
8252
8258
8259 /// Determines whether we are currently in a context that
8260 /// is not evaluated as per C++ [expr] p5.
8263 }
8264
8268
8272
8276
8283
8284 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8286 assert(!ExprEvalContexts.empty() &&
8287 "Must be in an expression evaluation context");
8288 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8290 Ctx.DelayedDefaultInitializationContext)
8291 return Ctx.DelayedDefaultInitializationContext;
8292 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8293 Ctx.isUnevaluated())
8294 break;
8295 }
8296 return std::nullopt;
8297 }
8298
8299 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8301 assert(!ExprEvalContexts.empty() &&
8302 "Must be in an expression evaluation context");
8303 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8304 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8306 !Ctx.DelayedDefaultInitializationContext && Res)
8307 break;
8308 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8309 Ctx.isUnevaluated())
8310 break;
8311 Res = Ctx.DelayedDefaultInitializationContext;
8312 }
8313 return Res;
8314 }
8315
8319
8320 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8321 /// SelfAssigned when inside a CXXMethodDecl.
8322 const FieldDecl *
8324
8326
8327 template <typename... Ts>
8329 const Ts &...Args) {
8330 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8331 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8332 }
8333
8334 template <typename... Ts>
8335 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8336 const Ts &...Args) {
8337 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8339 }
8340
8341 /// Abstract class used to diagnose incomplete types.
8344
8345 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8346 virtual ~TypeDiagnoser() {}
8347 };
8348
8349 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8350 protected:
8351 unsigned DiagID;
8352 std::tuple<const Ts &...> Args;
8353
8354 template <std::size_t... Is>
8356 std::index_sequence<Is...>) const {
8357 // Apply all tuple elements to the builder in order.
8358 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8359 (void)Dummy;
8360 }
8361
8362 public:
8363 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8364 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8365 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8366 }
8367
8368 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8369 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8370 emit(DB, std::index_sequence_for<Ts...>());
8371 DB << T;
8372 }
8373 };
8374
8375 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8376 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8377 /// For example, a diagnostic with no other parameters would generally have
8378 /// the form "...%select{incomplete|sizeless}0 type %1...".
8379 template <typename... Ts>
8381 public:
8382 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8383 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8384
8385 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8386 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8387 this->emit(DB, std::index_sequence_for<Ts...>());
8388 DB << T->isSizelessType() << T;
8389 }
8390 };
8391
8392 /// Check an argument list for placeholders that we won't try to
8393 /// handle later.
8395
8396 /// The C++ "std::source_location::__impl" struct, defined in
8397 /// <source_location>.
8399
8400 /// A stack of expression evaluation contexts.
8402
8403 // Set of failed immediate invocations to avoid double diagnosing.
8405
8406 /// List of SourceLocations where 'self' is implicitly retained inside a
8407 /// block.
8410
8411 /// Do an explicit extend of the given block pointer if we're in ARC.
8413
8414 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8417
8418private:
8419 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8420
8421 /// Methods for marking which expressions involve dereferencing a pointer
8422 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8423 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8424 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8425 /// `*p`, but need to check that `address of` is called on it. This requires
8426 /// keeping a container of all pending expressions and checking if the address
8427 /// of them are eventually taken.
8428 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8429 void CheckAddressOfNoDeref(const Expr *E);
8430
8431 ///@}
8432
8433 //
8434 //
8435 // -------------------------------------------------------------------------
8436 //
8437 //
8438
8439 /// \name C++ Expressions
8440 /// Implementations are in SemaExprCXX.cpp
8441 ///@{
8442
8443public:
8444 /// The C++ "std::bad_alloc" class, which is defined by the C++
8445 /// standard library.
8447
8448 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8449 /// standard library.
8451
8452 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8454
8455 /// A flag to remember whether the implicit forms of operator new and delete
8456 /// have been declared.
8458
8459 /// Delete-expressions to be analyzed at the end of translation unit
8460 ///
8461 /// This list contains class members, and locations of delete-expressions
8462 /// that could not be proven as to whether they mismatch with new-expression
8463 /// used in initializer of the field.
8464 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8465
8466 /// Handle the result of the special case name lookup for inheriting
8467 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8468 /// constructor names in member using declarations, even if 'X' is not the
8469 /// name of the corresponding type.
8471 SourceLocation NameLoc,
8472 const IdentifierInfo &Name);
8473
8475 SourceLocation NameLoc, Scope *S,
8476 CXXScopeSpec &SS, bool EnteringContext);
8478 Scope *S, CXXScopeSpec &SS,
8479 ParsedType ObjectType, bool EnteringContext);
8480
8482 ParsedType ObjectType);
8483
8484 /// Build a C++ typeid expression with a type operand.
8485 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8486 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8487
8488 /// Build a C++ typeid expression with an expression operand.
8489 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8490 Expr *Operand, SourceLocation RParenLoc);
8491
8492 /// ActOnCXXTypeid - Parse typeid( something ).
8494 bool isType, void *TyOrExpr,
8495 SourceLocation RParenLoc);
8496
8497 /// Build a Microsoft __uuidof expression with a type operand.
8498 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8499 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8500
8501 /// Build a Microsoft __uuidof expression with an expression operand.
8502 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8503 Expr *Operand, SourceLocation RParenLoc);
8504
8505 /// ActOnCXXUuidof - Parse __uuidof( something ).
8507 bool isType, void *TyOrExpr,
8508 SourceLocation RParenLoc);
8509
8510 //// ActOnCXXThis - Parse 'this' pointer.
8512
8513 /// Check whether the type of 'this' is valid in the current context.
8515
8516 /// Build a CXXThisExpr and mark it referenced in the current context.
8517 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8519
8520 /// Try to retrieve the type of the 'this' pointer.
8521 ///
8522 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8524
8525 /// When non-NULL, the C++ 'this' expression is allowed despite the
8526 /// current context not being a non-static member function. In such cases,
8527 /// this provides the type used for 'this'.
8529
8530 /// RAII object used to temporarily allow the C++ 'this' expression
8531 /// to be used, with the given qualifiers on the current class type.
8533 Sema &S;
8534 QualType OldCXXThisTypeOverride;
8535 bool Enabled;
8536
8537 public:
8538 /// Introduce a new scope where 'this' may be allowed (when enabled),
8539 /// using the given declaration (which is either a class template or a
8540 /// class) along with the given qualifiers.
8541 /// along with the qualifiers placed on '*this'.
8542 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8543 bool Enabled = true);
8544
8548 };
8549
8550 /// Make sure the value of 'this' is actually available in the current
8551 /// context, if it is a potentially evaluated context.
8552 ///
8553 /// \param Loc The location at which the capture of 'this' occurs.
8554 ///
8555 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8556 /// capture list.
8557 ///
8558 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8559 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8560 /// This is useful when enclosing lambdas must speculatively capture
8561 /// 'this' that may or may not be used in certain specializations of
8562 /// a nested generic lambda (depending on whether the name resolves to
8563 /// a non-static member function or a static function).
8564 /// \return returns 'true' if failed, 'false' if success.
8566 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8567 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8568 bool ByCopy = false);
8569
8570 /// Determine whether the given type is the type of *this that is used
8571 /// outside of the body of a member function for a type that is currently
8572 /// being defined.
8574
8575 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8577
8578 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8580
8581 //// ActOnCXXThrow - Parse throw expressions.
8584 bool IsThrownVarInScope);
8585
8586 /// CheckCXXThrowOperand - Validate the operand of a throw.
8587 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8588
8589 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8590 /// Can be interpreted either as function-style casting ("int(x)")
8591 /// or class type construction ("ClassType(x,y,z)")
8592 /// or creation of a value-initialized type ("int()").
8594 SourceLocation LParenOrBraceLoc,
8595 MultiExprArg Exprs,
8596 SourceLocation RParenOrBraceLoc,
8597 bool ListInitialization);
8598
8600 SourceLocation LParenLoc,
8601 MultiExprArg Exprs,
8602 SourceLocation RParenLoc,
8603 bool ListInitialization);
8604
8605 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8606 ///
8607 /// E.g.:
8608 /// @code new (memory) int[size][4] @endcode
8609 /// or
8610 /// @code ::new Foo(23, "hello") @endcode
8611 ///
8612 /// \param StartLoc The first location of the expression.
8613 /// \param UseGlobal True if 'new' was prefixed with '::'.
8614 /// \param PlacementLParen Opening paren of the placement arguments.
8615 /// \param PlacementArgs Placement new arguments.
8616 /// \param PlacementRParen Closing paren of the placement arguments.
8617 /// \param TypeIdParens If the type is in parens, the source range.
8618 /// \param D The type to be allocated, as well as array dimensions.
8619 /// \param Initializer The initializing expression or initializer-list, or
8620 /// null if there is none.
8621 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8622 SourceLocation PlacementLParen,
8623 MultiExprArg PlacementArgs,
8624 SourceLocation PlacementRParen,
8625 SourceRange TypeIdParens, Declarator &D,
8626 Expr *Initializer);
8628 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8629 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8630 SourceRange TypeIdParens, QualType AllocType,
8631 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8632 SourceRange DirectInitRange, Expr *Initializer);
8633
8634 /// Determine whether \p FD is an aligned allocation or deallocation
8635 /// function that is unavailable.
8637
8638 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8639 /// function that is unavailable.
8641 SourceLocation Loc);
8642
8643 /// Checks that a type is suitable as the allocated type
8644 /// in a new-expression.
8645 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8646 SourceRange R);
8647
8648 /// Finds the overloads of operator new and delete that are appropriate
8649 /// for the allocation.
8651 SourceLocation StartLoc, SourceRange Range,
8653 QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
8654 MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
8655 FunctionDecl *&OperatorDelete, bool Diagnose = true);
8656
8657 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8658 /// delete. These are:
8659 /// @code
8660 /// // C++03:
8661 /// void* operator new(std::size_t) throw(std::bad_alloc);
8662 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8663 /// void operator delete(void *) throw();
8664 /// void operator delete[](void *) throw();
8665 /// // C++11:
8666 /// void* operator new(std::size_t);
8667 /// void* operator new[](std::size_t);
8668 /// void operator delete(void *) noexcept;
8669 /// void operator delete[](void *) noexcept;
8670 /// // C++1y:
8671 /// void* operator new(std::size_t);
8672 /// void* operator new[](std::size_t);
8673 /// void operator delete(void *) noexcept;
8674 /// void operator delete[](void *) noexcept;
8675 /// void operator delete(void *, std::size_t) noexcept;
8676 /// void operator delete[](void *, std::size_t) noexcept;
8677 /// @endcode
8678 /// Note that the placement and nothrow forms of new are *not* implicitly
8679 /// declared. Their use requires including <new>.
8682 ArrayRef<QualType> Params);
8683
8685 DeclarationName Name, FunctionDecl *&Operator,
8687 bool Diagnose = true);
8690 DeclarationName Name,
8691 bool Diagnose = true);
8693 CXXRecordDecl *RD,
8694 bool Diagnose,
8695 bool LookForGlobal,
8696 DeclarationName Name);
8697
8698 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8699 /// @code ::delete ptr; @endcode
8700 /// or
8701 /// @code delete [] ptr; @endcode
8702 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8703 bool ArrayForm, Expr *Operand);
8705 bool IsDelete, bool CallCanBeVirtual,
8706 bool WarnOnNonAbstractTypes,
8707 SourceLocation DtorLoc);
8708
8710 Expr *Operand, SourceLocation RParen);
8712 SourceLocation RParen);
8713
8715 SourceLocation OpLoc,
8716 tok::TokenKind OpKind,
8717 ParsedType &ObjectType,
8718 bool &MayBePseudoDestructor);
8719
8721 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8722 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8723 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8724
8726 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8727 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8728 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8729
8731 SourceLocation OpLoc,
8732 tok::TokenKind OpKind,
8733 SourceLocation TildeLoc,
8734 const DeclSpec &DS);
8735
8736 /// MaybeCreateExprWithCleanups - If the current full-expression
8737 /// requires any cleanups, surround it with a ExprWithCleanups node.
8738 /// Otherwise, just returns the passed-in expression.
8742
8743 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8744 return ActOnFinishFullExpr(
8745 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8746 }
8748 bool DiscardedValue, bool IsConstexpr = false,
8749 bool IsTemplateArgument = false);
8751
8752 /// Process the expression contained within a decltype. For such expressions,
8753 /// certain semantic checks on temporaries are delayed until this point, and
8754 /// are omitted for the 'topmost' call in the decltype expression. If the
8755 /// topmost call bound a temporary, strip that temporary off the expression.
8757
8758 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8759 bool IsUDSuffix);
8760
8762
8763 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8764 SourceLocation StmtLoc,
8765 ConditionKind CK);
8766
8767 /// Check the use of the given variable as a C++ condition in an if,
8768 /// while, do-while, or switch statement.
8770 SourceLocation StmtLoc, ConditionKind CK);
8771
8772 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8773 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8774
8775 /// Helper function to determine whether this is the (deprecated) C++
8776 /// conversion from a string literal to a pointer to non-const char or
8777 /// non-const wchar_t (for narrow and wide string literals,
8778 /// respectively).
8780
8781 /// PerformImplicitConversion - Perform an implicit conversion of the
8782 /// expression From to the type ToType using the pre-computed implicit
8783 /// conversion sequence ICS. Returns the converted
8784 /// expression. Action is the kind of conversion we're performing,
8785 /// used in the error message.
8787 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8788 AssignmentAction Action,
8790
8791 /// PerformImplicitConversion - Perform an implicit conversion of the
8792 /// expression From to the type ToType by following the standard
8793 /// conversion sequence SCS. Returns the converted
8794 /// expression. Flavor is the context in which we're performing this
8795 /// conversion, for use in error messages.
8797 const StandardConversionSequence &SCS,
8798 AssignmentAction Action,
8800
8801 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8802
8803 /// Parsed one of the type trait support pseudo-functions.
8806 SourceLocation RParenLoc);
8809 SourceLocation RParenLoc);
8810
8811 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8812 /// pseudo-functions.
8814 ParsedType LhsTy, Expr *DimExpr,
8815 SourceLocation RParen);
8816
8818 TypeSourceInfo *TSInfo, Expr *DimExpr,
8819 SourceLocation RParen);
8820
8821 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8822 /// pseudo-functions.
8824 Expr *Queried, SourceLocation RParen);
8825
8827 Expr *Queried, SourceLocation RParen);
8828
8831 bool isIndirect);
8833 ExprResult &RHS,
8834 SourceLocation QuestionLoc);
8835
8836 //// Determines if a type is trivially relocatable
8837 /// according to the C++26 rules.
8838 // FIXME: This is in Sema because it requires
8839 // overload resolution, can we move to ASTContext?
8842
8843 /// Check the operands of ?: under C++ semantics.
8844 ///
8845 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8846 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8847 ///
8848 /// This function also implements GCC's vector extension and the
8849 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8850 /// permit the use of a?b:c where the type of a is that of a integer vector
8851 /// with the same number of elements and size as the vectors of b and c. If
8852 /// one of either b or c is a scalar it is implicitly converted to match the
8853 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8854 /// c are scalars, then b and c are checked and converted to the type of a if
8855 /// possible.
8856 ///
8857 /// The expressions are evaluated differently for GCC's and OpenCL's
8858 /// extensions. For the GCC extension, the ?: operator is evaluated as
8859 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8860 /// For the OpenCL extensions, the ?: operator is evaluated as
8861 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8862 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8864 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8865 ExprObjectKind &OK, SourceLocation questionLoc);
8866
8867 /// Find a merged pointer type and convert the two expressions to it.
8868 ///
8869 /// This finds the composite pointer type for \p E1 and \p E2 according to
8870 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8871 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8872 /// ConvertArgs is \c true).
8873 ///
8874 /// \param Loc The location of the operator requiring these two expressions to
8875 /// be converted to the composite pointer type.
8876 ///
8877 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8878 /// type.
8880 bool ConvertArgs = true);
8882 ExprResult &E2, bool ConvertArgs = true) {
8883 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8884 QualType Composite =
8885 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8886 E1 = E1Tmp;
8887 E2 = E2Tmp;
8888 return Composite;
8889 }
8890
8891 /// MaybeBindToTemporary - If the passed in expression has a record type with
8892 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8893 /// it simply returns the passed in expression.
8895
8896 /// IgnoredValueConversions - Given that an expression's result is
8897 /// syntactically ignored, perform any conversions that are
8898 /// required.
8900
8902
8905 const DeclarationNameInfo &TargetNameInfo);
8906
8908 SourceLocation KeywordLoc,
8909 bool IsIfExists, CXXScopeSpec &SS,
8910 UnqualifiedId &Name);
8911
8914 ArrayRef<ParmVarDecl *> LocalParameters,
8915 Scope *BodyScope);
8919 CXXScopeSpec &SS,
8920 SourceLocation NameLoc,
8921 const IdentifierInfo *TypeName,
8922 TemplateIdAnnotation *TemplateId);
8924 SourceLocation NoexceptLoc);
8926 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8927 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8930 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8934 bool IsSatisfied, SourceLocation NoexceptLoc,
8941 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8942 const ASTConstraintSatisfaction &Satisfaction);
8945 SourceLocation LParenLoc,
8946 ArrayRef<ParmVarDecl *> LocalParameters,
8947 SourceLocation RParenLoc,
8949 SourceLocation ClosingBraceLoc);
8950
8951private:
8952 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8953 bool IsDelete);
8954
8955 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8956 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8957 bool DeleteWasArrayForm);
8958
8959 ///@}
8960
8961 //
8962 //
8963 // -------------------------------------------------------------------------
8964 //
8965 //
8966
8967 /// \name Member Access Expressions
8968 /// Implementations are in SemaExprMember.cpp
8969 ///@{
8970
8971public:
8972 /// Check whether an expression might be an implicit class member access.
8974 bool IsAddressOfOperand);
8975
8976 /// Builds an expression which might be an implicit member expression.
8978 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8979 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8980
8981 /// Builds an implicit member access expression. The current context
8982 /// is known to be an instance method, and the given unqualified lookup
8983 /// set is known to contain only instance members, at least one of which
8984 /// is from an appropriate type.
8986 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8987 LookupResult &R,
8988 const TemplateArgumentListInfo *TemplateArgs,
8989 bool IsDefiniteInstance, const Scope *S);
8990
8992 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8993 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8994 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8995 const TemplateArgumentListInfo *TemplateArgs);
8996
8997 /// The main callback when the parser finds something like
8998 /// expression . [nested-name-specifier] identifier
8999 /// expression -> [nested-name-specifier] identifier
9000 /// where 'identifier' encompasses a fairly broad spectrum of
9001 /// possibilities, including destructor and operator references.
9002 ///
9003 /// \param OpKind either tok::arrow or tok::period
9004 /// \param ObjCImpDecl the current Objective-C \@implementation
9005 /// decl; this is an ugly hack around the fact that Objective-C
9006 /// \@implementations aren't properly put in the context chain
9008 tok::TokenKind OpKind, CXXScopeSpec &SS,
9009 SourceLocation TemplateKWLoc,
9010 UnqualifiedId &Member, Decl *ObjCImpDecl);
9011
9012 MemberExpr *
9013 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
9014 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
9015 ValueDecl *Member, DeclAccessPair FoundDecl,
9016 bool HadMultipleCandidates,
9017 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
9019 const TemplateArgumentListInfo *TemplateArgs = nullptr);
9020
9021 // Check whether the declarations we found through a nested-name
9022 // specifier in a member expression are actually members of the base
9023 // type. The restriction here is:
9024 //
9025 // C++ [expr.ref]p2:
9026 // ... In these cases, the id-expression shall name a
9027 // member of the class or of one of its base classes.
9028 //
9029 // So it's perfectly legitimate for the nested-name specifier to name
9030 // an unrelated class, and for us to find an overload set including
9031 // decls from classes which are not superclasses, as long as the decl
9032 // we actually pick through overload resolution is from a superclass.
9033 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
9034 const CXXScopeSpec &SS,
9035 const LookupResult &R);
9036
9037 // This struct is for use by ActOnMemberAccess to allow
9038 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
9039 // changing the access operator from a '.' to a '->' (to see if that is the
9040 // change needed to fix an error about an unknown member, e.g. when the class
9041 // defines a custom operator->).
9047
9049 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
9050 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
9051 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
9052 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
9053 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9054
9057 bool IsArrow, const CXXScopeSpec &SS,
9058 SourceLocation TemplateKWLoc,
9059 NamedDecl *FirstQualifierInScope, LookupResult &R,
9060 const TemplateArgumentListInfo *TemplateArgs,
9061 const Scope *S, bool SuppressQualifierCheck = false,
9062 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9063
9064 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
9065 SourceLocation OpLoc,
9066 const CXXScopeSpec &SS, FieldDecl *Field,
9067 DeclAccessPair FoundDecl,
9068 const DeclarationNameInfo &MemberNameInfo);
9069
9070 /// Perform conversions on the LHS of a member access expression.
9072
9074 const CXXScopeSpec &SS, SourceLocation nameLoc,
9075 IndirectFieldDecl *indirectField,
9076 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
9077 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
9078
9079private:
9080 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
9081
9082 ///@}
9083
9084 //
9085 //
9086 // -------------------------------------------------------------------------
9087 //
9088 //
9089
9090 /// \name Initializers
9091 /// Implementations are in SemaInit.cpp
9092 ///@{
9093
9094public:
9095 /// Stack of types that correspond to the parameter entities that are
9096 /// currently being copy-initialized. Can be empty.
9098
9099 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9101
9102 bool IsStringInit(Expr *Init, const ArrayType *AT);
9103
9104 /// Determine whether we can perform aggregate initialization for the purposes
9105 /// of overload resolution.
9107 const InitializedEntity &Entity, InitListExpr *From);
9108
9110 SourceLocation EqualOrColonLoc,
9111 bool GNUSyntax, ExprResult Init);
9112
9113 /// Check that the lifetime of the initializer (and its subobjects) is
9114 /// sufficient for initializing the entity, and perform lifetime extension
9115 /// (when permitted) if not.
9117
9120 bool BoundToLvalueReference);
9121
9122 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
9123 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9124 /// we don't have xvalues there.
9126
9130
9134 SourceLocation EqualLoc, ExprResult Init,
9135 bool TopLevelOfInitList = false,
9136 bool AllowExplicit = false);
9137
9139 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9140 const InitializationKind &Kind, MultiExprArg Init);
9141
9142 ///@}
9143
9144 //
9145 //
9146 // -------------------------------------------------------------------------
9147 //
9148 //
9149
9150 /// \name C++ Lambda Expressions
9151 /// Implementations are in SemaLambda.cpp
9152 ///@{
9153
9154public:
9155 /// Create a new lambda closure type.
9157 TypeSourceInfo *Info,
9158 unsigned LambdaDependencyKind,
9159 LambdaCaptureDefault CaptureDefault);
9160
9161 /// Number lambda for linkage purposes if necessary.
9163 std::optional<CXXRecordDecl::LambdaNumbering>
9164 NumberingOverride = std::nullopt);
9165
9166 /// Endow the lambda scope info with the relevant properties.
9167 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9168 SourceRange IntroducerRange,
9169 LambdaCaptureDefault CaptureDefault,
9170 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9171 bool Mutable);
9172
9175
9177 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9178 TemplateParameterList *TemplateParams);
9179
9180 void
9182 SourceLocation CallOperatorLoc,
9183 const AssociatedConstraint &TrailingRequiresClause,
9184 TypeSourceInfo *MethodTyInfo,
9185 ConstexprSpecKind ConstexprKind, StorageClass SC,
9187 bool HasExplicitResultType);
9188
9189 /// Returns true if the explicit object parameter was invalid.
9191 SourceLocation CallLoc);
9192
9193 /// Perform initialization analysis of the init-capture and perform
9194 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9195 /// not being used to initialize a reference.
9197 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9198 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9200 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9202 }
9204 SourceLocation EllipsisLoc,
9205 UnsignedOrNone NumExpansions,
9206 IdentifierInfo *Id,
9207 bool DirectInit, Expr *&Init);
9208
9209 /// Create a dummy variable within the declcontext of the lambda's
9210 /// call operator, for name lookup purposes for a lambda init capture.
9211 ///
9212 /// CodeGen handles emission of lambda captures, ignoring these dummy
9213 /// variables appropriately.
9215 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9216 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9217
9218 /// Add an init-capture to a lambda scope.
9219 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9220
9221 /// Note that we have finished the explicit captures for the
9222 /// given lambda.
9224
9225 /// Deduce a block or lambda's return type based on the return
9226 /// statements present in the body.
9228
9229 /// Once the Lambdas capture are known, we can start to create the closure,
9230 /// call operator method, and keep track of the captures.
9231 /// We do the capture lookup here, but they are not actually captured until
9232 /// after we know what the qualifiers of the call operator are.
9234 Scope *CurContext);
9235
9236 /// This is called after parsing the explicit template parameter list
9237 /// on a lambda (if it exists) in C++2a.
9239 SourceLocation LAngleLoc,
9240 ArrayRef<NamedDecl *> TParams,
9241 SourceLocation RAngleLoc,
9242 ExprResult RequiresClause);
9243
9245 SourceLocation MutableLoc);
9246
9248 Scope *LambdaScope,
9250
9251 /// ActOnStartOfLambdaDefinition - This is called just before we start
9252 /// parsing the body of a lambda; it analyzes the explicit captures and
9253 /// arguments, and sets up various data-structures for the body of the
9254 /// lambda.
9256 Declarator &ParamInfo, const DeclSpec &DS);
9257
9258 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9259 /// is invoked to pop the information about the lambda.
9260 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9261 bool IsInstantiation = false);
9262
9263 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9264 /// was successfully completed.
9266
9267 /// Does copying/destroying the captured variable have side effects?
9268 bool CaptureHasSideEffects(const sema::Capture &From);
9269
9270 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9271 /// diagnostic is emitted.
9272 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9273 SourceRange FixItRange,
9274 const sema::Capture &From);
9275
9276 /// Build a FieldDecl suitable to hold the given capture.
9278
9279 /// Initialize the given capture with a suitable expression.
9281 SourceLocation ImplicitCaptureLoc,
9282 bool IsOpenMPMapping = false);
9283
9284 /// Complete a lambda-expression having processed and attached the
9285 /// lambda body.
9287
9288 /// Get the return type to use for a lambda's conversion function(s) to
9289 /// function pointer type, given the type of the call operator.
9290 QualType
9292 CallingConv CC);
9293
9295 SourceLocation ConvLocation,
9296 CXXConversionDecl *Conv, Expr *Src);
9297
9299 : private FunctionScopeRAII {
9300 public:
9302 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9304 bool ShouldAddDeclsFromParentScope = true);
9305 };
9306
9307 /// Compute the mangling number context for a lambda expression or
9308 /// block literal. Also return the extra mangling decl if any.
9309 ///
9310 /// \param DC - The DeclContext containing the lambda expression or
9311 /// block literal.
9312 std::tuple<MangleNumberingContext *, Decl *>
9314
9315 ///@}
9316
9317 //
9318 //
9319 // -------------------------------------------------------------------------
9320 //
9321 //
9322
9323 /// \name Name Lookup
9324 ///
9325 /// These routines provide name lookup that is used during semantic
9326 /// analysis to resolve the various kinds of names (identifiers,
9327 /// overloaded operator names, constructor names, etc.) into zero or
9328 /// more declarations within a particular scope. The major entry
9329 /// points are LookupName, which performs unqualified name lookup,
9330 /// and LookupQualifiedName, which performs qualified name lookup.
9331 ///
9332 /// All name lookup is performed based on some specific criteria,
9333 /// which specify what names will be visible to name lookup and how
9334 /// far name lookup should work. These criteria are important both
9335 /// for capturing language semantics (certain lookups will ignore
9336 /// certain names, for example) and for performance, since name
9337 /// lookup is often a bottleneck in the compilation of C++. Name
9338 /// lookup criteria is specified via the LookupCriteria enumeration.
9339 ///
9340 /// The results of name lookup can vary based on the kind of name
9341 /// lookup performed, the current language, and the translation
9342 /// unit. In C, for example, name lookup will either return nothing
9343 /// (no entity found) or a single declaration. In C++, name lookup
9344 /// can additionally refer to a set of overloaded functions or
9345 /// result in an ambiguity. All of the possible results of name
9346 /// lookup are captured by the LookupResult class, which provides
9347 /// the ability to distinguish among them.
9348 ///
9349 /// Implementations are in SemaLookup.cpp
9350 ///@{
9351
9352public:
9353 /// Tracks whether we are in a context where typo correction is
9354 /// disabled.
9356
9357 /// The number of typos corrected by CorrectTypo.
9359
9360 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9361 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9362
9363 /// A cache containing identifiers for which typo correction failed and
9364 /// their locations, so that repeated attempts to correct an identifier in a
9365 /// given location are ignored if typo correction already failed for it.
9367
9368 /// SpecialMemberOverloadResult - The overloading result for a special member
9369 /// function.
9370 ///
9371 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9372 /// integer are used to determine whether overload resolution succeeded.
9374 public:
9376
9377 private:
9378 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9379
9380 public:
9383 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9384
9385 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9386 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9387
9388 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9389 void setKind(Kind K) { Pair.setInt(K); }
9390 };
9391
9392 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
9394 public:
9395 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
9396 : FastFoldingSetNode(ID) {}
9397 };
9398
9399 /// A cache of special member function overload resolution results
9400 /// for C++ records.
9401 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
9402
9404
9405 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9406 // TODO: make this is a typesafe union.
9409
9410 /// Describes the kind of name lookup to perform.
9412 /// Ordinary name lookup, which finds ordinary names (functions,
9413 /// variables, typedefs, etc.) in C and most kinds of names
9414 /// (functions, variables, members, types, etc.) in C++.
9416 /// Tag name lookup, which finds the names of enums, classes,
9417 /// structs, and unions.
9419 /// Label name lookup.
9421 /// Member name lookup, which finds the names of
9422 /// class/struct/union members.
9424 /// Look up of an operator name (e.g., operator+) for use with
9425 /// operator overloading. This lookup is similar to ordinary name
9426 /// lookup, but will ignore any declarations that are class members.
9428 /// Look up a name following ~ in a destructor name. This is an ordinary
9429 /// lookup, but prefers tags to typedefs.
9431 /// Look up of a name that precedes the '::' scope resolution
9432 /// operator in C++. This lookup completely ignores operator, object,
9433 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9435 /// Look up a namespace name within a C++ using directive or
9436 /// namespace alias definition, ignoring non-namespace names (C++
9437 /// [basic.lookup.udir]p1).
9439 /// Look up all declarations in a scope with the given name,
9440 /// including resolved using declarations. This is appropriate
9441 /// for checking redeclarations for a using declaration.
9443 /// Look up an ordinary name that is going to be redeclared as a
9444 /// name with linkage. This lookup ignores any declarations that
9445 /// are outside of the current scope unless they have linkage. See
9446 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9448 /// Look up a friend of a local class. This lookup does not look
9449 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9451 /// Look up the name of an Objective-C protocol.
9453 /// Look up implicit 'self' parameter of an objective-c method.
9455 /// Look up the name of an OpenMP user-defined reduction operation.
9457 /// Look up the name of an OpenMP user-defined mapper.
9459 /// Look up any declaration with any name.
9461 };
9462
9463 /// The possible outcomes of name lookup for a literal operator.
9465 /// The lookup resulted in an error.
9467 /// The lookup found no match but no diagnostic was issued.
9469 /// The lookup found a single 'cooked' literal operator, which
9470 /// expects a normal literal to be built and passed to it.
9472 /// The lookup found a single 'raw' literal operator, which expects
9473 /// a string literal containing the spelling of the literal token.
9475 /// The lookup found an overload set of literal operator templates,
9476 /// which expect the characters of the spelling of the literal token to be
9477 /// passed as a non-type template argument pack.
9479 /// The lookup found an overload set of literal operator templates,
9480 /// which expect the character type and characters of the spelling of the
9481 /// string literal token to be passed as template arguments.
9483 };
9484
9485 SpecialMemberOverloadResult
9487 bool VolatileArg, bool RValueThis, bool ConstThis,
9488 bool VolatileThis);
9489
9491
9492 /// Look up a name, looking for a single declaration. Return
9493 /// null if the results were absent, ambiguous, or overloaded.
9494 ///
9495 /// It is preferable to use the elaborated form and explicitly handle
9496 /// ambiguity and overloaded.
9498 Scope *S, DeclarationName Name, SourceLocation Loc,
9499 LookupNameKind NameKind,
9501
9502 /// Lookup a builtin function, when name lookup would otherwise
9503 /// fail.
9504 bool LookupBuiltin(LookupResult &R);
9505 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9506
9507 /// Perform unqualified name lookup starting from a given
9508 /// scope.
9509 ///
9510 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9511 /// used to find names within the current scope. For example, 'x' in
9512 /// @code
9513 /// int x;
9514 /// int f() {
9515 /// return x; // unqualified name look finds 'x' in the global scope
9516 /// }
9517 /// @endcode
9518 ///
9519 /// Different lookup criteria can find different names. For example, a
9520 /// particular scope can have both a struct and a function of the same
9521 /// name, and each can be found by certain lookup criteria. For more
9522 /// information about lookup criteria, see the documentation for the
9523 /// class LookupCriteria.
9524 ///
9525 /// @param S The scope from which unqualified name lookup will
9526 /// begin. If the lookup criteria permits, name lookup may also search
9527 /// in the parent scopes.
9528 ///
9529 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9530 /// look up and the lookup kind), and is updated with the results of lookup
9531 /// including zero or more declarations and possibly additional information
9532 /// used to diagnose ambiguities.
9533 ///
9534 /// @returns \c true if lookup succeeded and false otherwise.
9535 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9536 bool ForceNoCPlusPlus = false);
9537
9538 /// Perform qualified name lookup into a given context.
9539 ///
9540 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9541 /// names when the context of those names is explicit specified, e.g.,
9542 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9543 ///
9544 /// Different lookup criteria can find different names. For example, a
9545 /// particular scope can have both a struct and a function of the same
9546 /// name, and each can be found by certain lookup criteria. For more
9547 /// information about lookup criteria, see the documentation for the
9548 /// class LookupCriteria.
9549 ///
9550 /// \param R captures both the lookup criteria and any lookup results found.
9551 ///
9552 /// \param LookupCtx The context in which qualified name lookup will
9553 /// search. If the lookup criteria permits, name lookup may also search
9554 /// in the parent contexts or (for C++ classes) base classes.
9555 ///
9556 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9557 /// occurs as part of unqualified name lookup.
9558 ///
9559 /// \returns true if lookup succeeded, false if it failed.
9560 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9561 bool InUnqualifiedLookup = false);
9562
9563 /// Performs qualified name lookup or special type of lookup for
9564 /// "__super::" scope specifier.
9565 ///
9566 /// This routine is a convenience overload meant to be called from contexts
9567 /// that need to perform a qualified name lookup with an optional C++ scope
9568 /// specifier that might require special kind of lookup.
9569 ///
9570 /// \param R captures both the lookup criteria and any lookup results found.
9571 ///
9572 /// \param LookupCtx The context in which qualified name lookup will
9573 /// search.
9574 ///
9575 /// \param SS An optional C++ scope-specifier.
9576 ///
9577 /// \returns true if lookup succeeded, false if it failed.
9578 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9579 CXXScopeSpec &SS);
9580
9581 /// Performs name lookup for a name that was parsed in the
9582 /// source code, and may contain a C++ scope specifier.
9583 ///
9584 /// This routine is a convenience routine meant to be called from
9585 /// contexts that receive a name and an optional C++ scope specifier
9586 /// (e.g., "N::M::x"). It will then perform either qualified or
9587 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9588 /// respectively) on the given name and return those results. It will
9589 /// perform a special type of lookup for "__super::" scope specifier.
9590 ///
9591 /// @param S The scope from which unqualified name lookup will
9592 /// begin.
9593 ///
9594 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9595 ///
9596 /// @param EnteringContext Indicates whether we are going to enter the
9597 /// context of the scope-specifier SS (if present).
9598 ///
9599 /// @returns True if any decls were found (but possibly ambiguous)
9601 QualType ObjectType, bool AllowBuiltinCreation = false,
9602 bool EnteringContext = false);
9603
9604 /// Perform qualified name lookup into all base classes of the given
9605 /// class.
9606 ///
9607 /// \param R captures both the lookup criteria and any lookup results found.
9608 ///
9609 /// \param Class The context in which qualified name lookup will
9610 /// search. Name lookup will search in all base classes merging the results.
9611 ///
9612 /// @returns True if any decls were found (but possibly ambiguous)
9614
9616 UnresolvedSetImpl &Functions);
9617
9618 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9619 /// If GnuLabelLoc is a valid source location, then this is a definition
9620 /// of an __label__ label name, otherwise it is a normal label definition
9621 /// or use.
9623 SourceLocation GnuLabelLoc = SourceLocation());
9624
9625 /// Perform a name lookup for a label with the specified name; this does not
9626 /// create a new label if the lookup fails.
9628
9629 /// Look up the constructors for the given class.
9631
9632 /// Look up the default constructor for the given class.
9634
9635 /// Look up the copying constructor for the given class.
9637 unsigned Quals);
9638
9639 /// Look up the copying assignment operator for the given class.
9641 bool RValueThis, unsigned ThisQuals);
9642
9643 /// Look up the moving constructor for the given class.
9645 unsigned Quals);
9646
9647 /// Look up the moving assignment operator for the given class.
9649 bool RValueThis, unsigned ThisQuals);
9650
9651 /// Look for the destructor of the given class.
9652 ///
9653 /// During semantic analysis, this routine should be used in lieu of
9654 /// CXXRecordDecl::getDestructor().
9655 ///
9656 /// \returns The destructor for this class.
9658
9659 /// Force the declaration of any implicitly-declared members of this
9660 /// class.
9662
9663 /// Make a merged definition of an existing hidden definition \p ND
9664 /// visible at the specified location.
9666
9667 /// Check ODR hashes for C/ObjC when merging types from modules.
9668 /// Differently from C++, actually parse the body and reject in case
9669 /// of a mismatch.
9670 template <typename T,
9671 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9673 if (Duplicate->getODRHash() != Previous->getODRHash())
9674 return false;
9675
9676 // Make the previous decl visible.
9678 return true;
9679 }
9680
9681 /// Get the set of additional modules that should be checked during
9682 /// name lookup. A module and its imports become visible when instanting a
9683 /// template defined within it.
9684 llvm::DenseSet<Module *> &getLookupModules();
9685
9686 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9688
9689 /// Determine if the template parameter \p D has a visible default argument.
9690 bool
9692 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9693 /// Determine if the template parameter \p D has a reachable default argument.
9695 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9696 /// Determine if the template parameter \p D has a reachable default argument.
9700
9701 /// Determine if there is a visible declaration of \p D that is an explicit
9702 /// specialization declaration for a specialization of a template. (For a
9703 /// member specialization, use hasVisibleMemberSpecialization.)
9705 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9706 /// Determine if there is a reachable declaration of \p D that is an explicit
9707 /// specialization declaration for a specialization of a template. (For a
9708 /// member specialization, use hasReachableMemberSpecialization.)
9710 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9711
9712 /// Determine if there is a visible declaration of \p D that is a member
9713 /// specialization declaration (as opposed to an instantiated declaration).
9715 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9716 /// Determine if there is a reachable declaration of \p D that is a member
9717 /// specialization declaration (as opposed to an instantiated declaration).
9719 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9720
9721 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9722
9723 /// Determine whether any declaration of an entity is visible.
9724 bool
9726 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9727 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9728 }
9729
9732 /// Determine whether any declaration of an entity is reachable.
9733 bool
9735 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9736 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9737 }
9739 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9740
9741 void diagnoseTypo(const TypoCorrection &Correction,
9742 const PartialDiagnostic &TypoDiag,
9743 bool ErrorRecovery = true);
9744
9745 /// Diagnose a successfully-corrected typo. Separated from the correction
9746 /// itself to allow external validation of the result, etc.
9747 ///
9748 /// \param Correction The result of performing typo correction.
9749 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9750 /// string added to it (and usually also a fixit).
9751 /// \param PrevNote A note to use when indicating the location of the entity
9752 /// to which we are correcting. Will have the correction string added
9753 /// to it.
9754 /// \param ErrorRecovery If \c true (the default), the caller is going to
9755 /// recover from the typo as if the corrected string had been typed.
9756 /// In this case, \c PDiag must be an error, and we will attach a fixit
9757 /// to it.
9758 void diagnoseTypo(const TypoCorrection &Correction,
9759 const PartialDiagnostic &TypoDiag,
9760 const PartialDiagnostic &PrevNote,
9761 bool ErrorRecovery = true);
9762
9763 /// Find the associated classes and namespaces for
9764 /// argument-dependent lookup for a call with the given set of
9765 /// arguments.
9766 ///
9767 /// This routine computes the sets of associated classes and associated
9768 /// namespaces searched by argument-dependent lookup
9769 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9771 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9772 AssociatedNamespaceSet &AssociatedNamespaces,
9773 AssociatedClassSet &AssociatedClasses);
9774
9775 /// Produce a diagnostic describing the ambiguity that resulted
9776 /// from name lookup.
9777 ///
9778 /// \param Result The result of the ambiguous lookup to be diagnosed.
9780
9781 /// LookupLiteralOperator - Determine which literal operator should be used
9782 /// for a user-defined literal, per C++11 [lex.ext].
9783 ///
9784 /// Normal overload resolution is not used to select which literal operator to
9785 /// call for a user-defined literal. Look up the provided literal operator
9786 /// name, and filter the results to the appropriate set for the given argument
9787 /// types.
9790 bool AllowRaw, bool AllowTemplate,
9791 bool AllowStringTemplate, bool DiagnoseMissing,
9792 StringLiteral *StringLit = nullptr);
9793
9795 ArrayRef<Expr *> Args, ADLResult &Functions);
9796
9797 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9799 bool IncludeGlobalScope = true,
9800 bool LoadExternal = true);
9801 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9803 bool IncludeGlobalScope = true,
9804 bool IncludeDependentBases = false,
9805 bool LoadExternal = true);
9806
9807 /// Try to "correct" a typo in the source code by finding
9808 /// visible declarations whose names are similar to the name that was
9809 /// present in the source code.
9810 ///
9811 /// \param TypoName the \c DeclarationNameInfo structure that contains
9812 /// the name that was present in the source code along with its location.
9813 ///
9814 /// \param LookupKind the name-lookup criteria used to search for the name.
9815 ///
9816 /// \param S the scope in which name lookup occurs.
9817 ///
9818 /// \param SS the nested-name-specifier that precedes the name we're
9819 /// looking for, if present.
9820 ///
9821 /// \param CCC A CorrectionCandidateCallback object that provides further
9822 /// validation of typo correction candidates. It also provides flags for
9823 /// determining the set of keywords permitted.
9824 ///
9825 /// \param MemberContext if non-NULL, the context in which to look for
9826 /// a member access expression.
9827 ///
9828 /// \param EnteringContext whether we're entering the context described by
9829 /// the nested-name-specifier SS.
9830 ///
9831 /// \param OPT when non-NULL, the search for visible declarations will
9832 /// also walk the protocols in the qualified interfaces of \p OPT.
9833 ///
9834 /// \returns a \c TypoCorrection containing the corrected name if the typo
9835 /// along with information such as the \c NamedDecl where the corrected name
9836 /// was declared, and any additional \c NestedNameSpecifier needed to access
9837 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9839 Sema::LookupNameKind LookupKind, Scope *S,
9841 CorrectTypoKind Mode,
9842 DeclContext *MemberContext = nullptr,
9843 bool EnteringContext = false,
9844 const ObjCObjectPointerType *OPT = nullptr,
9845 bool RecordFailure = true);
9846
9847 /// Kinds of missing import. Note, the values of these enumerators correspond
9848 /// to %select values in diagnostics.
9856
9857 /// Diagnose that the specified declaration needs to be visible but
9858 /// isn't, and suggest a module import that would resolve the problem.
9860 MissingImportKind MIK, bool Recover = true);
9862 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9863 MissingImportKind MIK, bool Recover);
9864
9865 /// Called on #pragma clang __debug dump II
9867
9868 /// Called on #pragma clang __debug dump E
9869 void ActOnPragmaDump(Expr *E);
9870
9871private:
9872 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9873 //
9874 // The boolean value will be true to indicate that the namespace was loaded
9875 // from an AST/PCH file, or false otherwise.
9876 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9877
9878 /// Whether we have already loaded known namespaces from an extenal
9879 /// source.
9880 bool LoadedExternalKnownNamespaces;
9881
9882 bool CppLookupName(LookupResult &R, Scope *S);
9883
9884 /// Determine if we could use all the declarations in the module.
9885 bool isUsableModule(const Module *M);
9886
9887 /// Helper for CorrectTypo used to create and populate a new
9888 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9889 /// skipped entirely.
9890 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9891 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9893 DeclContext *MemberContext, bool EnteringContext,
9894 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9895
9896 /// Cache for module units which is usable for current module.
9897 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9898
9899 /// Record the typo correction failure and return an empty correction.
9900 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9901 bool RecordFailure = true) {
9902 if (RecordFailure)
9903 TypoCorrectionFailures[Typo].insert(TypoLoc);
9904 return TypoCorrection();
9905 }
9906
9907 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9908
9909 /// Determine whether two declarations should be linked together, given that
9910 /// the old declaration might not be visible and the new declaration might
9911 /// not have external linkage.
9912 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9913 const NamedDecl *New) {
9914 if (isVisible(Old))
9915 return true;
9916 // See comment in below overload for why it's safe to compute the linkage
9917 // of the new declaration here.
9918 if (New->isExternallyDeclarable()) {
9919 assert(Old->isExternallyDeclarable() &&
9920 "should not have found a non-externally-declarable previous decl");
9921 return true;
9922 }
9923 return false;
9924 }
9925 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9926
9927 ///@}
9928
9929 //
9930 //
9931 // -------------------------------------------------------------------------
9932 //
9933 //
9934
9935 /// \name Modules
9936 /// Implementations are in SemaModule.cpp
9937 ///@{
9938
9939public:
9940 /// Get the module unit whose scope we are currently within.
9942 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9943 }
9944
9945 /// Is the module scope we are an implementation unit?
9947 if (ModuleScopes.empty())
9948 return false;
9949 const Module *M = ModuleScopes.back().Module;
9951 }
9952
9953 // When loading a non-modular PCH files, this is used to restore module
9954 // visibility.
9956 VisibleModules.setVisible(Mod, ImportLoc);
9957 }
9958
9959 enum class ModuleDeclKind {
9960 Interface, ///< 'export module X;'
9961 Implementation, ///< 'module X;'
9962 PartitionInterface, ///< 'export module X:Y;'
9963 PartitionImplementation, ///< 'module X:Y;'
9964 };
9965
9966 /// An enumeration to represent the transition of states in parsing module
9967 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9968 /// an error in state transition, the state is set to NotACXX20Module.
9970 FirstDecl, ///< Parsing the first decl in a TU.
9971 GlobalFragment, ///< after 'module;' but before 'module X;'
9972 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9973 ImportFinished, ///< after any non-import decl.
9974 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9975 ///< non-import decl.
9976 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9977 ///< non-import decl has already been seen.
9978 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9979 };
9980
9981 /// The parser has processed a module-declaration that begins the definition
9982 /// of a module interface or implementation.
9984 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9985 ModuleIdPath Path, ModuleIdPath Partition,
9986 ModuleImportState &ImportState,
9987 bool SeenNoTrivialPPDirective);
9988
9989 /// The parser has processed a global-module-fragment declaration that begins
9990 /// the definition of the global module fragment of the current module unit.
9991 /// \param ModuleLoc The location of the 'module' keyword.
9993
9994 /// The parser has processed a private-module-fragment declaration that begins
9995 /// the definition of the private module fragment of the current module unit.
9996 /// \param ModuleLoc The location of the 'module' keyword.
9997 /// \param PrivateLoc The location of the 'private' keyword.
9999 SourceLocation PrivateLoc);
10000
10001 /// The parser has processed a module import declaration.
10002 ///
10003 /// \param StartLoc The location of the first token in the declaration. This
10004 /// could be the location of an '@', 'export', or 'import'.
10005 /// \param ExportLoc The location of the 'export' keyword, if any.
10006 /// \param ImportLoc The location of the 'import' keyword.
10007 /// \param Path The module toplevel name as an access path.
10008 /// \param IsPartition If the name is for a partition.
10010 SourceLocation ExportLoc,
10011 SourceLocation ImportLoc, ModuleIdPath Path,
10012 bool IsPartition = false);
10014 SourceLocation ExportLoc,
10015 SourceLocation ImportLoc, Module *M,
10016 ModuleIdPath Path = {});
10017
10018 /// The parser has processed a module import translated from a
10019 /// #include or similar preprocessing directive.
10020 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
10021 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
10022
10023 /// The parsed has entered a submodule.
10024 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
10025 /// The parser has left a submodule.
10026 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
10027
10028 /// Create an implicit import of the given module at the given
10029 /// source location, for error recovery, if possible.
10030 ///
10031 /// This routine is typically used when an entity found by name lookup
10032 /// is actually hidden within a module that we know about but the user
10033 /// has forgotten to import.
10034 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
10035 Module *Mod);
10036
10037 /// We have parsed the start of an export declaration, including the '{'
10038 /// (if present).
10039 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
10040 SourceLocation LBraceLoc);
10041
10042 /// Complete the definition of an export declaration.
10043 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
10044 SourceLocation RBraceLoc);
10045
10046private:
10047 /// The parser has begun a translation unit to be compiled as a C++20
10048 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
10049 void HandleStartOfHeaderUnit();
10050
10051 struct ModuleScope {
10052 SourceLocation BeginLoc;
10053 clang::Module *Module = nullptr;
10054 VisibleModuleSet OuterVisibleModules;
10055 };
10056 /// The modules we're currently parsing.
10057 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
10058
10059 /// For an interface unit, this is the implicitly imported interface unit.
10060 clang::Module *ThePrimaryInterface = nullptr;
10061
10062 /// The explicit global module fragment of the current translation unit.
10063 /// The explicit Global Module Fragment, as specified in C++
10064 /// [module.global.frag].
10065 clang::Module *TheGlobalModuleFragment = nullptr;
10066
10067 /// The implicit global module fragments of the current translation unit.
10068 ///
10069 /// The contents in the implicit global module fragment can't be discarded.
10070 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
10071
10072 /// Namespace definitions that we will export when they finish.
10073 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
10074
10075 /// In a C++ standard module, inline declarations require a definition to be
10076 /// present at the end of a definition domain. This set holds the decls to
10077 /// be checked at the end of the TU.
10078 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
10079
10080 /// Helper function to judge if we are in module purview.
10081 /// Return false if we are not in a module.
10082 bool isCurrentModulePurview() const;
10083
10084 /// Enter the scope of the explicit global module fragment.
10085 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
10086 /// Leave the scope of the explicit global module fragment.
10087 void PopGlobalModuleFragment();
10088
10089 /// Enter the scope of an implicit global module fragment.
10090 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
10091 /// Leave the scope of an implicit global module fragment.
10092 void PopImplicitGlobalModuleFragment();
10093
10094 VisibleModuleSet VisibleModules;
10095
10096 /// Whether we had imported any named modules.
10097 bool HadImportedNamedModules = false;
10098 /// The set of instantiations we need to check if they references TU-local
10099 /// entity from TUs. This only makes sense if we imported any named modules.
10100 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
10101 PendingCheckReferenceForTULocal;
10102 /// Implement [basic.link]p18, which requires that we can't use TU-local
10103 /// entities from other TUs (ignoring header units).
10104 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
10105 SourceLocation PointOfInstantiation);
10106 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
10107 /// module interface or module partition.
10108 void checkExposure(const TranslationUnitDecl *TU);
10109
10110 ///@}
10111
10112 //
10113 //
10114 // -------------------------------------------------------------------------
10115 //
10116 //
10117
10118 /// \name C++ Overloading
10119 /// Implementations are in SemaOverload.cpp
10120 ///@{
10121
10122public:
10123 /// Whether deferrable diagnostics should be deferred.
10124 bool DeferDiags = false;
10125
10126 /// RAII class to control scope of DeferDiags.
10128 Sema &S;
10129 bool SavedDeferDiags = false;
10130
10131 public:
10133 : S(S), SavedDeferDiags(S.DeferDiags) {
10134 S.DeferDiags = SavedDeferDiags || DeferDiags;
10135 }
10136 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10139 };
10140
10141 /// Flag indicating if Sema is building a recovery call expression.
10142 ///
10143 /// This flag is used to avoid building recovery call expressions
10144 /// if Sema is already doing so, which would cause infinite recursions.
10146
10147 /// Determine whether the given New declaration is an overload of the
10148 /// declarations in Old. This routine returns OverloadKind::Match or
10149 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10150 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10151 /// Old declarations aren't functions (or function templates) at all. When it
10152 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10153 /// will point to the decl that New cannot be overloaded with. This decl may
10154 /// be a UsingShadowDecl on top of the underlying declaration.
10155 ///
10156 /// Example: Given the following input:
10157 ///
10158 /// void f(int, float); // #1
10159 /// void f(int, int); // #2
10160 /// int f(int, int); // #3
10161 ///
10162 /// When we process #1, there is no previous declaration of "f", so IsOverload
10163 /// will not be used.
10164 ///
10165 /// When we process #2, Old contains only the FunctionDecl for #1. By
10166 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10167 /// they have different signatures), so this routine returns
10168 /// OverloadKind::Overload; MatchedDecl is unchanged.
10169 ///
10170 /// When we process #3, Old is an overload set containing #1 and #2. We
10171 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10172 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10173 /// types of functions are not part of the signature), IsOverload returns
10174 /// OverloadKind::Match and MatchedDecl will be set to point to the
10175 /// FunctionDecl for #2.
10176 ///
10177 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10178 /// class by a using declaration. The rules for whether to hide shadow
10179 /// declarations ignore some properties which otherwise figure into a function
10180 /// template's signature.
10182 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10183 bool UseMemberUsingDeclRules);
10185 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10186
10187 // Checks whether MD constitutes an override the base class method BaseMD.
10188 // When checking for overrides, the object object members are ignored.
10189 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10190 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10191
10192 enum class AllowedExplicit {
10193 /// Allow no explicit functions to be used.
10195 /// Allow explicit conversion functions but not explicit constructors.
10197 /// Allow both explicit conversion functions and explicit constructors.
10199 };
10200
10202 Expr *From, QualType ToType, bool SuppressUserConversions,
10203 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10204 bool AllowObjCWritebackConversion);
10205
10206 /// PerformImplicitConversion - Perform an implicit conversion of the
10207 /// expression From to the type ToType. Returns the
10208 /// converted expression. Flavor is the kind of conversion we're
10209 /// performing, used in the error message. If @p AllowExplicit,
10210 /// explicit user-defined conversions are permitted.
10212 AssignmentAction Action,
10213 bool AllowExplicit = false);
10214
10215 /// IsIntegralPromotion - Determines whether the conversion from the
10216 /// expression From (whose potentially-adjusted type is FromType) to
10217 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10218 /// sets PromotedType to the promoted type.
10219 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10220
10221 /// IsFloatingPointPromotion - Determines whether the conversion from
10222 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10223 /// returns true and sets PromotedType to the promoted type.
10224 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10225
10226 /// Determine if a conversion is a complex promotion.
10227 ///
10228 /// A complex promotion is defined as a complex -> complex conversion
10229 /// where the conversion between the underlying real types is a
10230 /// floating-point or integral promotion.
10231 bool IsComplexPromotion(QualType FromType, QualType ToType);
10232
10233 /// IsOverflowBehaviorTypePromotion - Determines whether the conversion from
10234 /// FromType to ToType involves an OverflowBehaviorType FromType being
10235 /// promoted to an OverflowBehaviorType ToType which has a larger bitwidth.
10236 /// If so, returns true and sets FromType to ToType.
10237 bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType);
10238
10239 /// IsOverflowBehaviorTypeConversion - Determines whether the conversion from
10240 /// FromType to ToType necessarily involves both an OverflowBehaviorType and
10241 /// a non-OverflowBehaviorType. If so, returns true and sets FromType to
10242 /// ToType.
10243 bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType);
10244
10245 /// IsPointerConversion - Determines whether the conversion of the
10246 /// expression From, which has the (possibly adjusted) type FromType,
10247 /// can be converted to the type ToType via a pointer conversion (C++
10248 /// 4.10). If so, returns true and places the converted type (that
10249 /// might differ from ToType in its cv-qualifiers at some level) into
10250 /// ConvertedType.
10251 ///
10252 /// This routine also supports conversions to and from block pointers
10253 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10254 /// pointers to interfaces. FIXME: Once we've determined the
10255 /// appropriate overloading rules for Objective-C, we may want to
10256 /// split the Objective-C checks into a different routine; however,
10257 /// GCC seems to consider all of these conversions to be pointer
10258 /// conversions, so for now they live here. IncompatibleObjC will be
10259 /// set if the conversion is an allowed Objective-C conversion that
10260 /// should result in a warning.
10261 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10262 bool InOverloadResolution, QualType &ConvertedType,
10263 bool &IncompatibleObjC);
10264
10265 /// isObjCPointerConversion - Determines whether this is an
10266 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10267 /// with the same arguments and return values.
10268 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10269 QualType &ConvertedType, bool &IncompatibleObjC);
10270 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10271 QualType &ConvertedType);
10272
10273 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10274 /// for equality of their parameter types. Caller has already checked that
10275 /// they have same number of parameters. If the parameters are different,
10276 /// ArgPos will have the parameter index of the first different parameter.
10277 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10278 /// reverse order. That's useful if one of the functions is being used as a
10279 /// C++20 synthesized operator overload with a reversed parameter order.
10282 unsigned *ArgPos = nullptr,
10283 bool Reversed = false);
10284
10286 const FunctionProtoType *NewType,
10287 unsigned *ArgPos = nullptr,
10288 bool Reversed = false);
10289
10290 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10291 const FunctionDecl *NewFunction,
10292 unsigned *ArgPos = nullptr,
10293 bool Reversed = false);
10294
10295 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10296 /// function types. Catches different number of parameter, mismatch in
10297 /// parameter types, and different return types.
10299 QualType ToType);
10300
10301 /// CheckPointerConversion - Check the pointer conversion from the
10302 /// expression From to the type ToType. This routine checks for
10303 /// ambiguous or inaccessible derived-to-base pointer
10304 /// conversions for which IsPointerConversion has already returned
10305 /// true. It returns true and produces a diagnostic if there was an
10306 /// error, or returns false otherwise.
10307 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10308 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10309 bool Diagnose = true);
10310
10311 /// IsMemberPointerConversion - Determines whether the conversion of the
10312 /// expression From, which has the (possibly adjusted) type FromType, can be
10313 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10314 /// If so, returns true and places the converted type (that might differ from
10315 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10316 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10317 bool InOverloadResolution,
10318 QualType &ConvertedType);
10319
10329 /// CheckMemberPointerConversion - Check the member pointer conversion from
10330 /// the expression From to the type ToType. This routine checks for ambiguous
10331 /// or virtual or inaccessible base-to-derived member pointer conversions for
10332 /// which IsMemberPointerConversion has already returned true. It produces a
10333 // diagnostic if there was an error.
10335 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10336 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10337 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10338
10339 /// IsQualificationConversion - Determines whether the conversion from
10340 /// an rvalue of type FromType to ToType is a qualification conversion
10341 /// (C++ 4.4).
10342 ///
10343 /// \param ObjCLifetimeConversion Output parameter that will be set to
10344 /// indicate when the qualification conversion involves a change in the
10345 /// Objective-C object lifetime.
10346 bool IsQualificationConversion(QualType FromType, QualType ToType,
10347 bool CStyle, bool &ObjCLifetimeConversion);
10348
10349 /// Determine whether the conversion from FromType to ToType is a valid
10350 /// conversion of ExtInfo/ExtProtoInfo on the nested function type.
10351 /// More precisely, this method checks whether FromType can be transformed
10352 /// into an exact match for ToType, by transforming its extended function
10353 /// type information in legal manner (e.g. by strictly stripping "noreturn"
10354 /// or "noexcept", or by stripping "noescape" for arguments).
10355 bool IsFunctionConversion(QualType FromType, QualType ToType) const;
10356
10357 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10358 /// `ResultTy` to `ToType`.
10359 bool TryFunctionConversion(QualType FromType, QualType ToType,
10360 QualType &ResultTy) const;
10361
10364 DeclarationName Name,
10365 OverloadCandidateSet &CandidateSet,
10366 FunctionDecl *Fn, MultiExprArg Args,
10367 bool IsMember = false);
10368
10370 FunctionDecl *Fun);
10372 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10374
10375 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10376 /// of the expression From to bool (C++0x [conv]p3).
10378
10379 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10380 /// conversion of the expression From to an Objective-C pointer type.
10381 /// Returns a valid but null ExprResult if no conversion sequence exists.
10383
10385 CCEKind CCE,
10386 NamedDecl *Dest = nullptr);
10387
10389 llvm::APSInt &Value, CCEKind CCE);
10391 APValue &Value, CCEKind CCE,
10392 NamedDecl *Dest = nullptr);
10393
10394 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10395 /// That is a converted constant expression
10396 /// (which was built with BuildConvertedConstantExpression)
10399 CCEKind CCE, bool RequireInt,
10400 const APValue &PreNarrowingValue);
10401
10402 /// Abstract base class used to perform a contextual implicit
10403 /// conversion from an expression to any type passing a filter.
10405 public:
10408
10412
10413 /// Determine whether the specified type is a valid destination type
10414 /// for this conversion.
10415 virtual bool match(QualType T) = 0;
10416
10417 /// Emits a diagnostic complaining that the expression does not have
10418 /// integral or enumeration type.
10420 QualType T) = 0;
10421
10422 /// Emits a diagnostic when the expression has incomplete class type.
10423 virtual SemaDiagnosticBuilder
10425
10426 /// Emits a diagnostic when the only matching conversion function
10427 /// is explicit.
10429 SourceLocation Loc,
10430 QualType T,
10431 QualType ConvTy) = 0;
10432
10433 /// Emits a note for the explicit conversion function.
10434 virtual SemaDiagnosticBuilder
10436
10437 /// Emits a diagnostic when there are multiple possible conversion
10438 /// functions.
10440 QualType T) = 0;
10441
10442 /// Emits a note for one of the candidate conversions.
10443 virtual SemaDiagnosticBuilder
10445
10446 /// Emits a diagnostic when we picked a conversion function
10447 /// (for cases when we are not allowed to pick a conversion function).
10449 SourceLocation Loc,
10450 QualType T,
10451 QualType ConvTy) = 0;
10452
10454 };
10455
10457 bool AllowScopedEnumerations;
10458
10459 public:
10460 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10461 bool SuppressConversion)
10463 AllowScopedEnumerations(AllowScopedEnumerations) {}
10464
10465 /// Match an integral or (possibly scoped) enumeration type.
10466 bool match(QualType T) override;
10467
10469 QualType T) override {
10470 return diagnoseNotInt(S, Loc, T);
10471 }
10472
10473 /// Emits a diagnostic complaining that the expression does not have
10474 /// integral or enumeration type.
10476 QualType T) = 0;
10477 };
10478
10479 /// Perform a contextual implicit conversion.
10482 ContextualImplicitConverter &Converter);
10483
10484 /// ReferenceCompareResult - Expresses the result of comparing two
10485 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10486 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10488 /// Ref_Incompatible - The two types are incompatible, so direct
10489 /// reference binding is not possible.
10491 /// Ref_Related - The two types are reference-related, which means
10492 /// that their unqualified forms (T1 and T2) are either the same
10493 /// or T1 is a base class of T2.
10495 /// Ref_Compatible - The two types are reference-compatible.
10497 };
10498
10499 // Fake up a scoped enumeration that still contextually converts to bool.
10501 /// The conversions that would be performed on an lvalue of type T2 when
10502 /// binding a reference of type T1 to it, as determined when evaluating
10503 /// whether T1 is reference-compatible with T2.
10514 };
10516
10517 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10518 /// determine whether they are reference-compatible,
10519 /// reference-related, or incompatible, for use in C++ initialization by
10520 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10521 /// type, and the first type (T1) is the pointee type of the reference
10522 /// type being initialized.
10525 ReferenceConversions *Conv = nullptr);
10526
10527 /// AddOverloadCandidate - Adds the given function to the set of
10528 /// candidate functions, using the given function call arguments. If
10529 /// @p SuppressUserConversions, then don't allow user-defined
10530 /// conversions via constructors or conversion operators.
10531 ///
10532 /// \param PartialOverloading true if we are performing "partial" overloading
10533 /// based on an incomplete set of function arguments. This feature is used by
10534 /// code completion.
10537 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10538 bool PartialOverloading = false, bool AllowExplicit = true,
10539 bool AllowExplicitConversion = false,
10540 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10541 ConversionSequenceList EarlyConversions = {},
10543 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10544
10545 /// Add all of the function declarations in the given function set to
10546 /// the overload candidate set.
10548 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10549 OverloadCandidateSet &CandidateSet,
10550 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10551 bool SuppressUserConversions = false, bool PartialOverloading = false,
10552 bool FirstArgumentIsBase = false);
10553
10554 /// AddMethodCandidate - Adds a named decl (which is some kind of
10555 /// method) as a method candidate to the given overload set.
10556 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10557 Expr::Classification ObjectClassification,
10558 ArrayRef<Expr *> Args,
10559 OverloadCandidateSet &CandidateSet,
10560 bool SuppressUserConversion = false,
10561 OverloadCandidateParamOrder PO = {});
10562
10563 /// AddMethodCandidate - Adds the given C++ member function to the set
10564 /// of candidate functions, using the given function call arguments
10565 /// and the object argument (@c Object). For example, in a call
10566 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10567 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10568 /// allow user-defined conversions via constructors or conversion
10569 /// operators.
10570 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10571 CXXRecordDecl *ActingContext, QualType ObjectType,
10572 Expr::Classification ObjectClassification,
10573 ArrayRef<Expr *> Args,
10574 OverloadCandidateSet &CandidateSet,
10575 bool SuppressUserConversions = false,
10576 bool PartialOverloading = false,
10577 ConversionSequenceList EarlyConversions = {},
10579 bool StrictPackMatch = false);
10580
10581 /// Add a C++ member function template as a candidate to the candidate
10582 /// set, using template argument deduction to produce an appropriate member
10583 /// function template specialization.
10585 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10586 CXXRecordDecl *ActingContext,
10587 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10588 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10589 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10590 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10591
10592 /// Add a C++ function template specialization as a candidate
10593 /// in the candidate set, using template argument deduction to produce
10594 /// an appropriate function template specialization.
10596 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10597 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10598 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10599 bool PartialOverloading = false, bool AllowExplicit = true,
10600 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10602 bool AggregateCandidateDeduction = false);
10603
10605 /// Do not consider any user-defined conversions when constructing the
10606 /// initializing sequence.
10608
10609 /// Before constructing the initializing sequence, we check whether the
10610 /// parameter type and argument type contain any user defined conversions.
10611 /// If so, do not initialize them. This effectively bypasses some undesired
10612 /// instantiation before checking constaints, which might otherwise result
10613 /// in non-SFINAE errors e.g. recursive constraints.
10615
10622 };
10623
10624 /// Check that implicit conversion sequences can be formed for each argument
10625 /// whose corresponding parameter has a non-dependent type, per DR1391's
10626 /// [temp.deduct.call]p10.
10629 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10631 CheckNonDependentConversionsFlag UserConversionFlag,
10632 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10633 Expr::Classification ObjectClassification = {},
10634 OverloadCandidateParamOrder PO = {});
10635
10636 /// AddConversionCandidate - Add a C++ conversion function as a
10637 /// candidate in the candidate set (C++ [over.match.conv],
10638 /// C++ [over.match.copy]). From is the expression we're converting from,
10639 /// and ToType is the type that we're eventually trying to convert to
10640 /// (which may or may not be the same type as the type that the
10641 /// conversion function produces).
10643 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10644 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10645 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10646 bool AllowExplicit, bool AllowResultConversion = true,
10647 bool StrictPackMatch = false);
10648
10649 /// Adds a conversion function template specialization
10650 /// candidate to the overload set, using template argument deduction
10651 /// to deduce the template arguments of the conversion function
10652 /// template from the type that we are converting to (C++
10653 /// [temp.deduct.conv]).
10655 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10656 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10657 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10658 bool AllowExplicit, bool AllowResultConversion = true);
10659
10660 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10661 /// converts the given @c Object to a function pointer via the
10662 /// conversion function @c Conversion, and then attempts to call it
10663 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10664 /// the type of function that we'll eventually be calling.
10665 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10666 DeclAccessPair FoundDecl,
10667 CXXRecordDecl *ActingContext,
10668 const FunctionProtoType *Proto, Expr *Object,
10669 ArrayRef<Expr *> Args,
10670 OverloadCandidateSet &CandidateSet);
10671
10672 /// Add all of the non-member operator function declarations in the given
10673 /// function set to the overload candidate set.
10675 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10676 OverloadCandidateSet &CandidateSet,
10677 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10678
10679 /// Add overload candidates for overloaded operators that are
10680 /// member functions.
10681 ///
10682 /// Add the overloaded operator candidates that are member functions
10683 /// for the operator Op that was used in an operator expression such
10684 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10685 /// CandidateSet will store the added overload candidates. (C++
10686 /// [over.match.oper]).
10688 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10689 OverloadCandidateSet &CandidateSet,
10691
10692 /// AddBuiltinCandidate - Add a candidate for a built-in
10693 /// operator. ResultTy and ParamTys are the result and parameter types
10694 /// of the built-in candidate, respectively. Args and NumArgs are the
10695 /// arguments being passed to the candidate. IsAssignmentOperator
10696 /// should be true when this built-in candidate is an assignment
10697 /// operator. NumContextualBoolArguments is the number of arguments
10698 /// (at the beginning of the argument list) that will be contextually
10699 /// converted to bool.
10700 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10701 OverloadCandidateSet &CandidateSet,
10702 bool IsAssignmentOperator = false,
10703 unsigned NumContextualBoolArguments = 0);
10704
10705 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10706 /// operator overloads to the candidate set (C++ [over.built]), based
10707 /// on the operator @p Op and the arguments given. For example, if the
10708 /// operator is a binary '+', this routine might add "int
10709 /// operator+(int, int)" to cover integer addition.
10711 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10712 OverloadCandidateSet &CandidateSet);
10713
10714 /// Add function candidates found via argument-dependent lookup
10715 /// to the set of overloading candidates.
10716 ///
10717 /// This routine performs argument-dependent name lookup based on the
10718 /// given function name (which may also be an operator name) and adds
10719 /// all of the overload candidates found by ADL to the overload
10720 /// candidate set (C++ [basic.lookup.argdep]).
10722 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10723 TemplateArgumentListInfo *ExplicitTemplateArgs,
10724 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10725
10726 /// Check the enable_if expressions on the given function. Returns the first
10727 /// failing attribute, or NULL if they were all successful.
10728 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10729 ArrayRef<Expr *> Args,
10730 bool MissingImplicitThis = false);
10731
10732 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10733 /// non-ArgDependent DiagnoseIfAttrs.
10734 ///
10735 /// Argument-dependent diagnose_if attributes should be checked each time a
10736 /// function is used as a direct callee of a function call.
10737 ///
10738 /// Returns true if any errors were emitted.
10739 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10740 const Expr *ThisArg,
10741 ArrayRef<const Expr *> Args,
10742 SourceLocation Loc);
10743
10744 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10745 /// ArgDependent DiagnoseIfAttrs.
10746 ///
10747 /// Argument-independent diagnose_if attributes should be checked on every use
10748 /// of a function.
10749 ///
10750 /// Returns true if any errors were emitted.
10751 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10752 SourceLocation Loc);
10753
10754 /// Determine if \p A and \p B are equivalent internal linkage declarations
10755 /// from different modules, and thus an ambiguity error can be downgraded to
10756 /// an extension warning.
10757 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10758 const NamedDecl *B);
10760 SourceLocation Loc, const NamedDecl *D,
10761 ArrayRef<const NamedDecl *> Equiv);
10762
10763 // Emit as a 'note' the specific overload candidate
10765 const NamedDecl *Found, const FunctionDecl *Fn,
10767 QualType DestType = QualType(), bool TakingAddress = false);
10768
10769 // Emit as a series of 'note's all template and non-templates identified by
10770 // the expression Expr
10771 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10772 bool TakingAddress = false);
10773
10774 /// Returns whether the given function's address can be taken or not,
10775 /// optionally emitting a diagnostic if the address can't be taken.
10776 ///
10777 /// Returns false if taking the address of the function is illegal.
10778 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10779 bool Complain = false,
10780 SourceLocation Loc = SourceLocation());
10781
10782 // [PossiblyAFunctionType] --> [Return]
10783 // NonFunctionType --> NonFunctionType
10784 // R (A) --> R(A)
10785 // R (*)(A) --> R (A)
10786 // R (&)(A) --> R (A)
10787 // R (S::*)(A) --> R (A)
10788 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10789
10790 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10791 /// an overloaded function (C++ [over.over]), where @p From is an
10792 /// expression with overloaded function type and @p ToType is the type
10793 /// we're trying to resolve to. For example:
10794 ///
10795 /// @code
10796 /// int f(double);
10797 /// int f(int);
10798 ///
10799 /// int (*pfd)(double) = f; // selects f(double)
10800 /// @endcode
10801 ///
10802 /// This routine returns the resulting FunctionDecl if it could be
10803 /// resolved, and NULL otherwise. When @p Complain is true, this
10804 /// routine will emit diagnostics if there is an error.
10805 FunctionDecl *
10806 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10807 bool Complain, DeclAccessPair &Found,
10808 bool *pHadMultipleCandidates = nullptr);
10809
10810 /// Given an expression that refers to an overloaded function, try to
10811 /// resolve that function to a single function that can have its address
10812 /// taken. This will modify `Pair` iff it returns non-null.
10813 ///
10814 /// This routine can only succeed if from all of the candidates in the
10815 /// overload set for SrcExpr that can have their addresses taken, there is one
10816 /// candidate that is more constrained than the rest.
10817 FunctionDecl *
10818 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10819
10820 /// Given an overloaded function, tries to turn it into a non-overloaded
10821 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10822 /// will perform access checks, diagnose the use of the resultant decl, and,
10823 /// if requested, potentially perform a function-to-pointer decay.
10824 ///
10825 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10826 /// Otherwise, returns true. This may emit diagnostics and return true.
10828 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10829
10830 /// Given an expression that refers to an overloaded function, try to
10831 /// resolve that overloaded function expression down to a single function.
10832 ///
10833 /// This routine can only resolve template-ids that refer to a single function
10834 /// template, where that template-id refers to a single template whose
10835 /// template arguments are either provided by the template-id or have
10836 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10837 ///
10838 /// If no template-ids are found, no diagnostics are emitted and NULL is
10839 /// returned.
10841 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10842 TemplateSpecCandidateSet *FailedTSC = nullptr,
10843 bool ForTypeDeduction = false);
10844
10845 // Resolve and fix an overloaded expression that can be resolved
10846 // because it identifies a single function template specialization.
10847 //
10848 // Last three arguments should only be supplied if Complain = true
10849 //
10850 // Return true if it was logically possible to so resolve the
10851 // expression, regardless of whether or not it succeeded. Always
10852 // returns true if 'complain' is set.
10854 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10855 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10856 QualType DestTypeForComplaining = QualType(),
10857 unsigned DiagIDForComplaining = 0);
10858
10859 /// Add the overload candidates named by callee and/or found by argument
10860 /// dependent lookup to the given overload set.
10861 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10862 ArrayRef<Expr *> Args,
10863 OverloadCandidateSet &CandidateSet,
10864 bool PartialOverloading = false);
10865
10866 /// Add the call candidates from the given set of lookup results to the given
10867 /// overload set. Non-function lookup results are ignored.
10869 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10870 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10871
10872 // An enum used to represent the different possible results of building a
10873 // range-based for loop.
10879
10880 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10881 /// given LookupResult is non-empty, it is assumed to describe a member which
10882 /// will be invoked. Otherwise, the function will be found via argument
10883 /// dependent lookup.
10884 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10885 /// otherwise CallExpr is set to ExprError() and some non-success value
10886 /// is returned.
10888 SourceLocation RangeLoc,
10889 const DeclarationNameInfo &NameInfo,
10890 LookupResult &MemberLookup,
10891 OverloadCandidateSet *CandidateSet,
10892 Expr *Range, ExprResult *CallExpr);
10893
10894 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10895 /// (which eventually refers to the declaration Func) and the call
10896 /// arguments Args/NumArgs, attempt to resolve the function call down
10897 /// to a specific function. If overload resolution succeeds, returns
10898 /// the call expression produced by overload resolution.
10899 /// Otherwise, emits diagnostics and returns ExprError.
10901 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10902 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10903 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10904
10905 /// Constructs and populates an OverloadedCandidateSet from
10906 /// the given function.
10907 /// \returns true when an the ExprResult output parameter has been set.
10909 MultiExprArg Args, SourceLocation RParenLoc,
10910 OverloadCandidateSet *CandidateSet,
10912
10916 const UnresolvedSetImpl &Fns,
10917 bool PerformADL = true);
10918
10919 /// Create a unary operation that may resolve to an overloaded
10920 /// operator.
10921 ///
10922 /// \param OpLoc The location of the operator itself (e.g., '*').
10923 ///
10924 /// \param Opc The UnaryOperatorKind that describes this operator.
10925 ///
10926 /// \param Fns The set of non-member functions that will be
10927 /// considered by overload resolution. The caller needs to build this
10928 /// set based on the context using, e.g.,
10929 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10930 /// set should not contain any member functions; those will be added
10931 /// by CreateOverloadedUnaryOp().
10932 ///
10933 /// \param Input The input argument.
10936 const UnresolvedSetImpl &Fns, Expr *input,
10937 bool RequiresADL = true);
10938
10939 /// Perform lookup for an overloaded binary operator.
10942 const UnresolvedSetImpl &Fns,
10943 ArrayRef<Expr *> Args, bool RequiresADL = true);
10944
10945 /// Create a binary operation that may resolve to an overloaded
10946 /// operator.
10947 ///
10948 /// \param OpLoc The location of the operator itself (e.g., '+').
10949 ///
10950 /// \param Opc The BinaryOperatorKind that describes this operator.
10951 ///
10952 /// \param Fns The set of non-member functions that will be
10953 /// considered by overload resolution. The caller needs to build this
10954 /// set based on the context using, e.g.,
10955 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10956 /// set should not contain any member functions; those will be added
10957 /// by CreateOverloadedBinOp().
10958 ///
10959 /// \param LHS Left-hand argument.
10960 /// \param RHS Right-hand argument.
10961 /// \param PerformADL Whether to consider operator candidates found by ADL.
10962 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10963 /// C++20 operator rewrites.
10964 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10965 /// the function in question. Such a function is never a candidate in
10966 /// our overload resolution. This also enables synthesizing a three-way
10967 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10969 const UnresolvedSetImpl &Fns, Expr *LHS,
10970 Expr *RHS, bool RequiresADL = true,
10971 bool AllowRewrittenCandidates = true,
10972 FunctionDecl *DefaultedFn = nullptr);
10974 const UnresolvedSetImpl &Fns,
10975 Expr *LHS, Expr *RHS,
10976 FunctionDecl *DefaultedFn);
10977
10979 SourceLocation RLoc, Expr *Base,
10980 MultiExprArg Args);
10981
10982 /// BuildCallToMemberFunction - Build a call to a member
10983 /// function. MemExpr is the expression that refers to the member
10984 /// function (and includes the object parameter), Args/NumArgs are the
10985 /// arguments to the function call (not including the object
10986 /// parameter). The caller needs to validate that the member
10987 /// expression refers to a non-static member function or an overloaded
10988 /// member function.
10990 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10991 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10992 bool IsExecConfig = false, bool AllowRecovery = false);
10993
10994 /// BuildCallToObjectOfClassType - Build a call to an object of class
10995 /// type (C++ [over.call.object]), which can end up invoking an
10996 /// overloaded function call operator (@c operator()) or performing a
10997 /// user-defined conversion on the object argument.
10999 SourceLocation LParenLoc,
11000 MultiExprArg Args,
11001 SourceLocation RParenLoc);
11002
11003 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
11004 /// (if one exists), where @c Base is an expression of class type and
11005 /// @c Member is the name of the member we're trying to find.
11007 SourceLocation OpLoc,
11008 bool *NoArrowOperatorFound = nullptr);
11009
11012 bool HadMultipleCandidates);
11013
11014 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
11015 /// to a literal operator described by the provided lookup results.
11018 SourceLocation LitEndLoc,
11019 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
11020
11021 /// FixOverloadedFunctionReference - E is an expression that refers to
11022 /// a C++ overloaded function (possibly with some parentheses and
11023 /// perhaps a '&' around it). We have resolved the overloaded function
11024 /// to the function declaration Fn, so patch up the expression E to
11025 /// refer (possibly indirectly) to Fn. Returns the new expr.
11027 FunctionDecl *Fn);
11029 DeclAccessPair FoundDecl,
11030 FunctionDecl *Fn);
11031
11032 /// - Returns a selector which best matches given argument list or
11033 /// nullptr if none could be found
11035 bool IsInstance,
11037
11038 ///@}
11039
11040 //
11041 //
11042 // -------------------------------------------------------------------------
11043 //
11044 //
11045
11046 /// \name Statements
11047 /// Implementations are in SemaStmt.cpp
11048 ///@{
11049
11050public:
11051 /// Stack of active SEH __finally scopes. Can be empty.
11053
11054 /// Stack of '_Defer' statements that are currently being parsed, as well
11055 /// as the locations of their '_Defer' keywords. Can be empty.
11057
11058 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
11060
11062 bool HasLeadingEmptyMacro = false);
11063
11065 SourceLocation EndLoc);
11067
11068 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
11069 /// whose result is unused, warn.
11070 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
11071
11072 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
11076 ArrayRef<Stmt *> Elts, bool isStmtExpr);
11077
11079
11082 SourceLocation DotDotDotLoc, ExprResult RHS,
11083 SourceLocation ColonLoc);
11084
11085 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
11086 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
11087
11089 SourceLocation ColonLoc, Stmt *SubStmt,
11090 Scope *CurScope);
11092 SourceLocation ColonLoc, Stmt *SubStmt);
11093
11095 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
11097 Stmt *SubStmt);
11098
11099 /// Check whether the given statement can have musttail applied to it,
11100 /// issuing a diagnostic and returning false if not. In the success case,
11101 /// the statement is rewritten to remove implicit nodes from the return
11102 /// value.
11103 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
11104
11106 SourceLocation LParenLoc, Stmt *InitStmt,
11108 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11110 SourceLocation LParenLoc, Stmt *InitStmt,
11112 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11113
11115
11117 SourceLocation LParenLoc, Stmt *InitStmt,
11119 SourceLocation RParenLoc);
11121 Stmt *Body);
11122
11123 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
11124 /// integer not in the range of enum values.
11125 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
11126 Expr *SrcExpr);
11127
11130 Stmt *Body);
11132 SourceLocation WhileLoc, SourceLocation CondLParen,
11133 Expr *Cond, SourceLocation CondRParen);
11134
11136 Stmt *First, ConditionResult Second,
11137 FullExprArg Third, SourceLocation RParenLoc,
11138 Stmt *Body);
11139
11140 /// In an Objective C collection iteration statement:
11141 /// for (x in y)
11142 /// x can be an arbitrary l-value expression. Bind it up as a
11143 /// full-expression.
11145
11147 /// Initial building of a for-range statement.
11149 /// Instantiation or recovery rebuild of a for-range statement. Don't
11150 /// attempt any typo-correction.
11152 /// Determining whether a for-range statement could be built. Avoid any
11153 /// unnecessary or irreversible actions.
11155 };
11156
11157 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11158 ///
11159 /// C++11 [stmt.ranged]:
11160 /// A range-based for statement is equivalent to
11161 ///
11162 /// {
11163 /// auto && __range = range-init;
11164 /// for ( auto __begin = begin-expr,
11165 /// __end = end-expr;
11166 /// __begin != __end;
11167 /// ++__begin ) {
11168 /// for-range-declaration = *__begin;
11169 /// statement
11170 /// }
11171 /// }
11172 ///
11173 /// The body of the loop is not available yet, since it cannot be analysed
11174 /// until we have determined the type of the for-range-declaration.
11176 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11177 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11178 SourceLocation RParenLoc, BuildForRangeKind Kind,
11179 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11180
11181 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11182 StmtResult BuildCXXForRangeStmt(
11183 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11184 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11185 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11186 BuildForRangeKind Kind,
11187 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11188
11189 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11190 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11191 /// body cannot be performed until after the type of the range variable is
11192 /// determined.
11193 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11194
11195 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11196 LabelDecl *TheDecl);
11197 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11198 SourceLocation StarLoc, Expr *DestExp);
11199 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11200 LabelDecl *Label, SourceLocation LabelLoc);
11201 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11202 LabelDecl *Label, SourceLocation LabelLoc);
11203
11204 void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope);
11205 void ActOnDeferStmtError(Scope *CurScope);
11206 StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope);
11207
11210
11213
11214 bool isMoveEligible() const { return S != None; };
11216 };
11218
11219 /// Determine whether the given expression might be move-eligible or
11220 /// copy-elidable in either a (co_)return statement or throw expression,
11221 /// without considering function return type, if applicable.
11222 ///
11223 /// \param E The expression being returned from the function or block,
11224 /// being thrown, or being co_returned from a coroutine. This expression
11225 /// might be modified by the implementation.
11226 ///
11227 /// \param Mode Overrides detection of current language mode
11228 /// and uses the rules for C++23.
11229 ///
11230 /// \returns An aggregate which contains the Candidate and isMoveEligible
11231 /// and isCopyElidable methods. If Candidate is non-null, it means
11232 /// isMoveEligible() would be true under the most permissive language
11233 /// standard.
11234 NamedReturnInfo getNamedReturnInfo(
11236
11237 /// Determine whether the given NRVO candidate variable is move-eligible or
11238 /// copy-elidable, without considering function return type.
11239 ///
11240 /// \param VD The NRVO candidate variable.
11241 ///
11242 /// \returns An aggregate which contains the Candidate and isMoveEligible
11243 /// and isCopyElidable methods. If Candidate is non-null, it means
11244 /// isMoveEligible() would be true under the most permissive language
11245 /// standard.
11246 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11247
11248 /// Updates given NamedReturnInfo's move-eligible and
11249 /// copy-elidable statuses, considering the function
11250 /// return type criteria as applicable to return statements.
11251 ///
11252 /// \param Info The NamedReturnInfo object to update.
11253 ///
11254 /// \param ReturnType This is the return type of the function.
11255 /// \returns The copy elision candidate, in case the initial return expression
11256 /// was copy elidable, or nullptr otherwise.
11257 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11258 QualType ReturnType);
11259
11260 /// Perform the initialization of a potentially-movable value, which
11261 /// is the result of return value.
11262 ///
11263 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11264 /// treat returned lvalues as rvalues in certain cases (to prefer move
11265 /// construction), then falls back to treating them as lvalues if that failed.
11268 const NamedReturnInfo &NRInfo, Expr *Value,
11269 bool SupressSimplerImplicitMoves = false);
11270
11272
11273 /// Deduce the return type for a function from a returned expression, per
11274 /// C++1y [dcl.spec.auto]p6.
11276 SourceLocation ReturnLoc, Expr *RetExpr,
11277 const AutoType *AT);
11278
11279 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11280 Scope *CurScope);
11281 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11282 bool AllowRecovery = false);
11283
11284 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11285 /// for capturing scopes.
11287 NamedReturnInfo &NRInfo,
11288 bool SupressSimplerImplicitMoves);
11289
11290 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11291 /// and creates a proper catch handler from them.
11293 Stmt *HandlerBlock);
11294
11295 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11296 /// handlers and creates a try statement from them.
11298 ArrayRef<Stmt *> Handlers);
11299
11300 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11301
11302 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11303 SourceLocation TryLoc, Stmt *TryBlock,
11304 Stmt *Handler);
11306 Stmt *Block);
11311
11313 bool IsIfExists,
11314 NestedNameSpecifierLoc QualifierLoc,
11315 DeclarationNameInfo NameInfo,
11316 Stmt *Nested);
11318 bool IsIfExists, CXXScopeSpec &SS,
11319 UnqualifiedId &Name, Stmt *Nested);
11320
11321 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11322 CapturedRegionKind Kind, unsigned NumParams);
11323 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11324 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11325 CapturedRegionKind Kind,
11327 unsigned OpenMPCaptureLevel = 0);
11331 SourceLocation Loc,
11332 unsigned NumParams);
11333
11334private:
11335 /// Check whether the given statement can have musttail applied to it,
11336 /// issuing a diagnostic and returning false if not.
11337 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11338
11339 /// Check if the given expression contains 'break' or 'continue'
11340 /// statement that produces control flow different from GCC.
11341 void CheckBreakContinueBinding(Expr *E);
11342
11343 ///@}
11344
11345 //
11346 //
11347 // -------------------------------------------------------------------------
11348 //
11349 //
11350
11351 /// \name `inline asm` Statement
11352 /// Implementations are in SemaStmtAsm.cpp
11353 ///@{
11354
11355public:
11356 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11357 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11358 bool IsVolatile, unsigned NumOutputs,
11359 unsigned NumInputs, IdentifierInfo **Names,
11360 MultiExprArg Constraints, MultiExprArg Exprs,
11361 Expr *AsmString, MultiExprArg Clobbers,
11362 unsigned NumLabels, SourceLocation RParenLoc);
11363
11365 llvm::InlineAsmIdentifierInfo &Info);
11367 SourceLocation TemplateKWLoc,
11368 UnqualifiedId &Id,
11369 bool IsUnevaluatedContext);
11370 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11371 SourceLocation AsmLoc);
11373 SourceLocation AsmLoc);
11375 ArrayRef<Token> AsmToks, StringRef AsmString,
11376 unsigned NumOutputs, unsigned NumInputs,
11377 ArrayRef<StringRef> Constraints,
11378 ArrayRef<StringRef> Clobbers,
11379 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11380 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11381 SourceLocation Location, bool AlwaysCreate);
11382
11383 ///@}
11384
11385 //
11386 //
11387 // -------------------------------------------------------------------------
11388 //
11389 //
11390
11391 /// \name Statement Attribute Handling
11392 /// Implementations are in SemaStmtAttr.cpp
11393 ///@{
11394
11395public:
11396 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11397 const AttributeCommonInfo &A);
11398 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11399 const AttributeCommonInfo &A);
11400
11401 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11403
11404 /// Process the attributes before creating an attributed statement. Returns
11405 /// the semantic attributes that have been processed.
11406 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11408
11410 SourceRange Range);
11412 const IdentifierInfo *AttrName,
11413 SourceRange Range);
11414
11415 ///@}
11416
11417 //
11418 //
11419 // -------------------------------------------------------------------------
11420 //
11421 //
11422
11423 /// \name C++ Templates
11424 /// Implementations are in SemaTemplate.cpp
11425 ///@{
11426
11427public:
11428 // Saves the current floating-point pragma stack and clear it in this Sema.
11430 public:
11432 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11433 S.FpPragmaStack.Stack.clear();
11434 }
11435 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11438
11439 private:
11440 Sema &S;
11442 };
11443
11445 CurFPFeatures = FPO;
11446 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11447 }
11448
11454
11459
11460 typedef llvm::MapVector<const FunctionDecl *,
11461 std::unique_ptr<LateParsedTemplate>>
11464
11465 /// Determine the number of levels of enclosing template parameters. This is
11466 /// only usable while parsing. Note that this does not include dependent
11467 /// contexts in which no template parameters have yet been declared, such as
11468 /// in a terse function template or generic lambda before the first 'auto' is
11469 /// encountered.
11470 unsigned getTemplateDepth(Scope *S) const;
11471
11473 bool AllowFunctionTemplates = true,
11474 bool AllowDependent = true);
11476 bool AllowFunctionTemplates = true,
11477 bool AllowDependent = true,
11478 bool AllowNonTemplateFunctions = false);
11479 /// Try to interpret the lookup result D as a template-name.
11480 ///
11481 /// \param D A declaration found by name lookup.
11482 /// \param AllowFunctionTemplates Whether function templates should be
11483 /// considered valid results.
11484 /// \param AllowDependent Whether unresolved using declarations (that might
11485 /// name templates) should be considered valid results.
11487 bool AllowFunctionTemplates = true,
11488 bool AllowDependent = true);
11489
11491 /// Whether and why a template name is required in this lookup.
11493 public:
11494 /// Template name is required if TemplateKWLoc is valid.
11496 : TemplateKW(TemplateKWLoc) {}
11497 /// Template name is unconditionally required.
11499
11501 return TemplateKW.value_or(SourceLocation());
11502 }
11503 bool hasTemplateKeyword() const {
11504 return getTemplateKeywordLoc().isValid();
11505 }
11506 bool isRequired() const { return TemplateKW != SourceLocation(); }
11507 explicit operator bool() const { return isRequired(); }
11508
11509 private:
11510 std::optional<SourceLocation> TemplateKW;
11511 };
11512
11514 /// This is not assumed to be a template name.
11516 /// This is assumed to be a template name because lookup found nothing.
11518 /// This is assumed to be a template name because lookup found one or more
11519 /// functions (but no function templates).
11521 };
11522
11523 bool
11525 QualType ObjectType, bool EnteringContext,
11526 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11527 AssumedTemplateKind *ATK = nullptr,
11528 bool AllowTypoCorrection = true);
11529
11531 bool hasTemplateKeyword,
11532 const UnqualifiedId &Name,
11533 ParsedType ObjectType, bool EnteringContext,
11535 bool &MemberOfUnknownSpecialization,
11536 bool Disambiguation = false);
11537
11538 /// Try to resolve an undeclared template name as a type template.
11539 ///
11540 /// Sets II to the identifier corresponding to the template name, and updates
11541 /// Name to a corresponding (typo-corrected) type template name and TNK to
11542 /// the corresponding kind, if possible.
11544 TemplateNameKind &TNK,
11545 SourceLocation NameLoc,
11546 IdentifierInfo *&II);
11547
11548 /// Determine whether a particular identifier might be the name in a C++1z
11549 /// deduction-guide declaration.
11550 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11551 SourceLocation NameLoc, CXXScopeSpec &SS,
11552 ParsedTemplateTy *Template = nullptr);
11553
11555 SourceLocation IILoc, Scope *S,
11556 const CXXScopeSpec *SS,
11557 TemplateTy &SuggestedTemplate,
11558 TemplateNameKind &SuggestedKind);
11559
11560 /// Determine whether we would be unable to instantiate this template (because
11561 /// it either has no definition, or is in the process of being instantiated).
11563 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11564 bool InstantiatedFromMember, const NamedDecl *Pattern,
11565 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11566 bool Complain = true, bool *Unreachable = nullptr);
11567
11568 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11569 /// that the template parameter 'PrevDecl' is being shadowed by a new
11570 /// declaration at location Loc. Returns true to indicate that this is
11571 /// an error, and false otherwise.
11572 ///
11573 /// \param Loc The location of the declaration that shadows a template
11574 /// parameter.
11575 ///
11576 /// \param PrevDecl The template parameter that the declaration shadows.
11577 ///
11578 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11579 /// a warning for compatibility with older versions of clang.
11580 /// Ignored when MSVC compatibility is enabled.
11582 bool SupportedForCompatibility = false);
11583
11584 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11585 /// the parameter D to reference the templated declaration and return a
11586 /// pointer to the template declaration. Otherwise, do nothing to D and return
11587 /// null.
11589
11590 /// ActOnTypeParameter - Called when a C++ template type parameter
11591 /// (e.g., "typename T") has been parsed. Typename specifies whether
11592 /// the keyword "typename" was used to declare the type parameter
11593 /// (otherwise, "class" was used), and KeyLoc is the location of the
11594 /// "class" or "typename" keyword. ParamName is the name of the
11595 /// parameter (NULL indicates an unnamed template parameter) and
11596 /// ParamNameLoc is the location of the parameter name (if any).
11597 /// If the type parameter has a default argument, it will be added
11598 /// later via ActOnTypeParameterDefault.
11600 SourceLocation EllipsisLoc,
11601 SourceLocation KeyLoc,
11602 IdentifierInfo *ParamName,
11603 SourceLocation ParamNameLoc, unsigned Depth,
11604 unsigned Position, SourceLocation EqualLoc,
11605 ParsedType DefaultArg, bool HasTypeConstraint);
11606
11608
11609 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11611 TemplateTypeParmDecl *ConstrainedParameter,
11612 SourceLocation EllipsisLoc);
11613 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11615 TemplateTypeParmDecl *ConstrainedParameter,
11616 SourceLocation EllipsisLoc,
11617 bool AllowUnexpandedPack);
11618
11619 /// Attach a type-constraint to a template parameter.
11620 /// \returns true if an error occurred. This can happen if the
11621 /// immediately-declared constraint could not be formed (e.g. incorrect number
11622 /// of arguments for the named concept).
11624 DeclarationNameInfo NameInfo,
11625 TemplateDecl *NamedConcept, NamedDecl *FoundDecl,
11626 const TemplateArgumentListInfo *TemplateArgs,
11627 TemplateTypeParmDecl *ConstrainedParameter,
11628 SourceLocation EllipsisLoc);
11629
11631 NonTypeTemplateParmDecl *NewConstrainedParm,
11632 NonTypeTemplateParmDecl *OrigConstrainedParm,
11633 SourceLocation EllipsisLoc);
11634
11635 /// Require the given type to be a structural type, and diagnose if it is not.
11636 ///
11637 /// \return \c true if an error was produced.
11639
11640 /// Check that the type of a non-type template parameter is
11641 /// well-formed.
11642 ///
11643 /// \returns the (possibly-promoted) parameter type if valid;
11644 /// otherwise, produces a diagnostic and returns a NULL type.
11646 SourceLocation Loc);
11648
11650 unsigned Depth, unsigned Position,
11651 SourceLocation EqualLoc,
11652 Expr *DefaultArg);
11653
11654 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11655 /// parameter (e.g. T in template <template <typename> class T> class array)
11656 /// has been parsed. S is the current scope.
11658 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11659 bool TypenameKeyword, TemplateParameterList *Params,
11660 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11661 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11662 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11663
11664 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11665 /// constrained by RequiresClause, that contains the template parameters in
11666 /// Params.
11668 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11669 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11670 SourceLocation RAngleLoc, Expr *RequiresClause);
11671
11672 /// The context in which we are checking a template parameter list.
11674 // For this context, Class, Variable, TypeAlias, and non-pack Template
11675 // Template Parameters are treated uniformly.
11677
11684 };
11685
11686 /// Checks the validity of a template parameter list, possibly
11687 /// considering the template parameter list from a previous
11688 /// declaration.
11689 ///
11690 /// If an "old" template parameter list is provided, it must be
11691 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11692 /// template parameter list.
11693 ///
11694 /// \param NewParams Template parameter list for a new template
11695 /// declaration. This template parameter list will be updated with any
11696 /// default arguments that are carried through from the previous
11697 /// template parameter list.
11698 ///
11699 /// \param OldParams If provided, template parameter list from a
11700 /// previous declaration of the same template. Default template
11701 /// arguments will be merged from the old template parameter list to
11702 /// the new template parameter list.
11703 ///
11704 /// \param TPC Describes the context in which we are checking the given
11705 /// template parameter list.
11706 ///
11707 /// \param SkipBody If we might have already made a prior merged definition
11708 /// of this template visible, the corresponding body-skipping information.
11709 /// Default argument redefinition is not an error when skipping such a body,
11710 /// because (under the ODR) we can assume the default arguments are the same
11711 /// as the prior merged definition.
11712 ///
11713 /// \returns true if an error occurred, false otherwise.
11715 TemplateParameterList *OldParams,
11717 SkipBodyInfo *SkipBody = nullptr);
11718
11719 /// Match the given template parameter lists to the given scope
11720 /// specifier, returning the template parameter list that applies to the
11721 /// name.
11722 ///
11723 /// \param DeclStartLoc the start of the declaration that has a scope
11724 /// specifier or a template parameter list.
11725 ///
11726 /// \param DeclLoc The location of the declaration itself.
11727 ///
11728 /// \param SS the scope specifier that will be matched to the given template
11729 /// parameter lists. This scope specifier precedes a qualified name that is
11730 /// being declared.
11731 ///
11732 /// \param TemplateId The template-id following the scope specifier, if there
11733 /// is one. Used to check for a missing 'template<>'.
11734 ///
11735 /// \param ParamLists the template parameter lists, from the outermost to the
11736 /// innermost template parameter lists.
11737 ///
11738 /// \param IsFriend Whether to apply the slightly different rules for
11739 /// matching template parameters to scope specifiers in friend
11740 /// declarations.
11741 ///
11742 /// \param IsMemberSpecialization will be set true if the scope specifier
11743 /// denotes a fully-specialized type, and therefore this is a declaration of
11744 /// a member specialization.
11745 ///
11746 /// \returns the template parameter list, if any, that corresponds to the
11747 /// name that is preceded by the scope specifier @p SS. This template
11748 /// parameter list may have template parameters (if we're declaring a
11749 /// template) or may have no template parameters (if we're declaring a
11750 /// template specialization), or may be NULL (if what we're declaring isn't
11751 /// itself a template).
11753 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11754 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11755 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11756 bool &IsMemberSpecialization, bool &Invalid,
11757 bool SuppressDiagnostic = false);
11758
11759 /// Returns the template parameter list with all default template argument
11760 /// information.
11762
11764 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11765 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11766 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11767 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11768 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11769 TemplateParameterList **OuterTemplateParamLists,
11770 SkipBodyInfo *SkipBody = nullptr);
11771
11772 /// Translates template arguments as provided by the parser
11773 /// into template arguments used by semantic analysis.
11776
11777 /// Convert a parsed type into a parsed template argument. This is mostly
11778 /// trivial, except that we may have parsed a C++17 deduced class template
11779 /// specialization type, in which case we should form a template template
11780 /// argument instead of a type template argument.
11782
11784
11787 SourceLocation TemplateLoc,
11788 TemplateArgumentListInfo &TemplateArgs,
11789 Scope *Scope, bool ForNestedNameSpecifier);
11790
11792 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11793 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11794 SourceLocation TemplateKWLoc, TemplateTy Template,
11795 const IdentifierInfo *TemplateII,
11796 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11797 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11798 bool IsCtorOrDtorName = false, bool IsClassName = false,
11799 ImplicitTypenameContext AllowImplicitTypename =
11801
11802 /// Parsed an elaborated-type-specifier that refers to a template-id,
11803 /// such as \c class T::template apply<U>.
11805 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11806 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11807 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11808 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11809
11812 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11814
11815 /// Get the specialization of the given variable template corresponding to
11816 /// the specified argument list, or a null-but-valid result if the arguments
11817 /// are dependent.
11819 SourceLocation TemplateLoc,
11820 SourceLocation TemplateNameLoc,
11821 const TemplateArgumentListInfo &TemplateArgs,
11822 bool SetWrittenArgs);
11823
11824 /// Form a reference to the specialization of the given variable template
11825 /// corresponding to the specified argument list, or a null-but-valid result
11826 /// if the arguments are dependent.
11828 const DeclarationNameInfo &NameInfo,
11830 SourceLocation TemplateLoc,
11831 const TemplateArgumentListInfo *TemplateArgs);
11832
11834 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
11836 const TemplateArgumentListInfo *TemplateArgs);
11837
11839 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11840 const DeclarationNameInfo &ConceptNameInfo,
11841 NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11842 const TemplateArgumentListInfo *TemplateArgs,
11843 bool DoCheckConstraintSatisfaction = true);
11844
11847 bool TemplateKeyword, TemplateDecl *TD,
11848 SourceLocation Loc);
11849
11851 SourceLocation TemplateKWLoc, LookupResult &R,
11852 bool RequiresADL,
11853 const TemplateArgumentListInfo *TemplateArgs);
11854
11855 // We actually only call this from template instantiation.
11858 const DeclarationNameInfo &NameInfo,
11859 const TemplateArgumentListInfo *TemplateArgs,
11860 bool IsAddressOfOperand);
11861
11863 return Pack.pack_size() - 1 - *ArgPackSubstIndex;
11864 }
11865
11868 Arg = Arg.pack_elements()[*ArgPackSubstIndex];
11869 if (Arg.isPackExpansion())
11870 Arg = Arg.getPackExpansionPattern();
11871 return Arg;
11872 }
11873
11875 Decl *AssociatedDecl, const NonTypeTemplateParmDecl *NTTP,
11876 SourceLocation loc, TemplateArgument Replacement,
11877 UnsignedOrNone PackIndex, bool Final);
11878
11879 /// Form a template name from a name that is syntactically required to name a
11880 /// template, either due to use of the 'template' keyword or because a name in
11881 /// this syntactic context is assumed to name a template (C++
11882 /// [temp.names]p2-4).
11883 ///
11884 /// This action forms a template name given the name of the template and its
11885 /// optional scope specifier. This is used when the 'template' keyword is used
11886 /// or when the parsing context unambiguously treats a following '<' as
11887 /// introducing a template argument list. Note that this may produce a
11888 /// non-dependent template name if we can perform the lookup now and identify
11889 /// the named template.
11890 ///
11891 /// For example, given "x.MetaFun::template apply", the scope specifier
11892 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11893 /// of the "template" keyword, and "apply" is the \p Name.
11895 SourceLocation TemplateKWLoc,
11896 const UnqualifiedId &Name,
11897 ParsedType ObjectType,
11898 bool EnteringContext, TemplateTy &Template,
11899 bool AllowInjectedClassName = false);
11900
11902 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11903 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11905 MultiTemplateParamsArg TemplateParameterLists,
11906 SkipBodyInfo *SkipBody = nullptr);
11907
11908 /// Check the non-type template arguments of a class template
11909 /// partial specialization according to C++ [temp.class.spec]p9.
11910 ///
11911 /// \param TemplateNameLoc the location of the template name.
11912 /// \param PrimaryTemplate the template parameters of the primary class
11913 /// template.
11914 /// \param NumExplicit the number of explicitly-specified template arguments.
11915 /// \param TemplateArgs the template arguments of the class template
11916 /// partial specialization.
11917 ///
11918 /// \returns \c true if there was an error, \c false otherwise.
11920 TemplateDecl *PrimaryTemplate,
11921 unsigned NumExplicitArgs,
11927
11929 MultiTemplateParamsArg TemplateParameterLists,
11930 Declarator &D);
11931
11932 /// Diagnose cases where we have an explicit template specialization
11933 /// before/after an explicit template instantiation, producing diagnostics
11934 /// for those cases where they are required and determining whether the
11935 /// new specialization/instantiation will have any effect.
11936 ///
11937 /// \param NewLoc the location of the new explicit specialization or
11938 /// instantiation.
11939 ///
11940 /// \param NewTSK the kind of the new explicit specialization or
11941 /// instantiation.
11942 ///
11943 /// \param PrevDecl the previous declaration of the entity.
11944 ///
11945 /// \param PrevTSK the kind of the old explicit specialization or
11946 /// instantiatin.
11947 ///
11948 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11949 /// declaration was instantiated (either implicitly or explicitly).
11950 ///
11951 /// \param HasNoEffect will be set to true to indicate that the new
11952 /// specialization or instantiation has no effect and should be ignored.
11953 ///
11954 /// \returns true if there was an error that should prevent the introduction
11955 /// of the new declaration into the AST, false otherwise.
11957 SourceLocation NewLoc,
11958 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11959 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11960 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11961
11962 /// Perform semantic analysis for the given dependent function
11963 /// template specialization.
11964 ///
11965 /// The only possible way to get a dependent function template specialization
11966 /// is with a friend declaration, like so:
11967 ///
11968 /// \code
11969 /// template <class T> void foo(T);
11970 /// template <class T> class A {
11971 /// friend void foo<>(T);
11972 /// };
11973 /// \endcode
11974 ///
11975 /// There really isn't any useful analysis we can do here, so we
11976 /// just store the information.
11978 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11980
11981 /// Perform semantic analysis for the given function template
11982 /// specialization.
11983 ///
11984 /// This routine performs all of the semantic analysis required for an
11985 /// explicit function template specialization. On successful completion,
11986 /// the function declaration \p FD will become a function template
11987 /// specialization.
11988 ///
11989 /// \param FD the function declaration, which will be updated to become a
11990 /// function template specialization.
11991 ///
11992 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11993 /// if any. Note that this may be valid info even when 0 arguments are
11994 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11995 /// as it anyway contains info on the angle brackets locations.
11996 ///
11997 /// \param Previous the set of declarations that may be specialized by
11998 /// this function specialization.
11999 ///
12000 /// \param QualifiedFriend whether this is a lookup for a qualified friend
12001 /// declaration with no explicit template argument list that might be
12002 /// befriending a function template specialization.
12004 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
12005 LookupResult &Previous, bool QualifiedFriend = false);
12006
12007 /// Perform semantic analysis for the given non-template member
12008 /// specialization.
12009 ///
12010 /// This routine performs all of the semantic analysis required for an
12011 /// explicit member function specialization. On successful completion,
12012 /// the function declaration \p FD will become a member function
12013 /// specialization.
12014 ///
12015 /// \param Member the member declaration, which will be updated to become a
12016 /// specialization.
12017 ///
12018 /// \param Previous the set of declarations, one of which may be specialized
12019 /// by this function specialization; the set will be modified to contain the
12020 /// redeclared member.
12023
12024 // Explicit instantiation of a class template specialization
12026 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
12027 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
12028 TemplateTy Template, SourceLocation TemplateNameLoc,
12029 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
12030 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
12031
12032 // Explicit instantiation of a member class of a class template.
12034 SourceLocation TemplateLoc,
12035 unsigned TagSpec, SourceLocation KWLoc,
12036 CXXScopeSpec &SS, IdentifierInfo *Name,
12037 SourceLocation NameLoc,
12038 const ParsedAttributesView &Attr);
12039
12041 SourceLocation TemplateLoc,
12042 Declarator &D);
12043
12044 /// If the given template parameter has a default template
12045 /// argument, substitute into that default template argument and
12046 /// return the corresponding template argument.
12048 TemplateDecl *Template, SourceLocation TemplateKWLoc,
12049 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
12050 ArrayRef<TemplateArgument> SugaredConverted,
12051 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
12052
12053 /// Returns the top most location responsible for the definition of \p N.
12054 /// If \p N is a a template specialization, this is the location
12055 /// of the top of the instantiation stack.
12056 /// Otherwise, the location of \p N is returned.
12058
12059 /// Specifies the context in which a particular template
12060 /// argument is being checked.
12062 /// The template argument was specified in the code or was
12063 /// instantiated with some deduced template arguments.
12065
12066 /// The template argument was deduced via template argument
12067 /// deduction.
12069
12070 /// The template argument was deduced from an array bound
12071 /// via template argument deduction.
12073 };
12074
12082
12083 /// The checked, converted argument will be added to the
12084 /// end of these vectors.
12086
12087 /// The check is being performed in the context of partial ordering.
12089
12090 /// If true, assume these template arguments are
12091 /// the injected template arguments for a template template parameter.
12092 /// This will relax the requirement that all its possible uses are valid:
12093 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
12094 /// during instantiation.
12096
12097 /// Is set to true when, in the context of TTP matching, a pack parameter
12098 /// matches non-pack arguments.
12099 bool StrictPackMatch = false;
12100 };
12101
12102 /// Check that the given template argument corresponds to the given
12103 /// template parameter.
12104 ///
12105 /// \param Param The template parameter against which the argument will be
12106 /// checked.
12107 ///
12108 /// \param Arg The template argument, which may be updated due to conversions.
12109 ///
12110 /// \param Template The template in which the template argument resides.
12111 ///
12112 /// \param TemplateLoc The location of the template name for the template
12113 /// whose argument list we're matching.
12114 ///
12115 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
12116 /// the template argument list.
12117 ///
12118 /// \param ArgumentPackIndex The index into the argument pack where this
12119 /// argument will be placed. Only valid if the parameter is a parameter pack.
12120 ///
12121 /// \param CTAK Describes how we arrived at this particular template argument:
12122 /// explicitly written, deduced, etc.
12123 ///
12124 /// \returns true on error, false otherwise.
12126 NamedDecl *Template, SourceLocation TemplateLoc,
12127 SourceLocation RAngleLoc,
12128 unsigned ArgumentPackIndex,
12131
12132 /// Check that the given template arguments can be provided to
12133 /// the given template, converting the arguments along the way.
12134 ///
12135 /// \param Template The template to which the template arguments are being
12136 /// provided.
12137 ///
12138 /// \param TemplateLoc The location of the template name in the source.
12139 ///
12140 /// \param TemplateArgs The list of template arguments. If the template is
12141 /// a template template parameter, this function may extend the set of
12142 /// template arguments to also include substituted, defaulted template
12143 /// arguments.
12144 ///
12145 /// \param PartialTemplateArgs True if the list of template arguments is
12146 /// intentionally partial, e.g., because we're checking just the initial
12147 /// set of template arguments.
12148 ///
12149 /// \param Converted Will receive the converted, canonicalized template
12150 /// arguments.
12151 ///
12152 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
12153 /// contain the converted forms of the template arguments as written.
12154 /// Otherwise, \p TemplateArgs will not be modified.
12155 ///
12156 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
12157 /// receive true if the cause for the error is the associated constraints of
12158 /// the template not being satisfied by the template arguments.
12159 ///
12160 /// \param DefaultArgs any default arguments from template specialization
12161 /// deduction.
12162 ///
12163 /// \returns true if an error occurred, false otherwise.
12165 SourceLocation TemplateLoc,
12166 TemplateArgumentListInfo &TemplateArgs,
12167 const DefaultArguments &DefaultArgs,
12168 bool PartialTemplateArgs,
12170 bool UpdateArgsWithConversions = true,
12171 bool *ConstraintsNotSatisfied = nullptr);
12172
12175 SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12176 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12177 CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12178 bool *ConstraintsNotSatisfied = nullptr);
12179
12182 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12183 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12184
12185 /// Check a template argument against its corresponding
12186 /// template type parameter.
12187 ///
12188 /// This routine implements the semantics of C++ [temp.arg.type]. It
12189 /// returns true if an error occurred, and false otherwise.
12191
12192 /// Check a template argument against its corresponding
12193 /// non-type template parameter.
12194 ///
12195 /// This routine implements the semantics of C++ [temp.arg.nontype].
12196 /// If an error occurred, it returns ExprError(); otherwise, it
12197 /// returns the converted template argument. \p ParamType is the
12198 /// type of the non-type template parameter after it has been instantiated.
12200 QualType InstantiatedParamType, Expr *Arg,
12201 TemplateArgument &SugaredConverted,
12202 TemplateArgument &CanonicalConverted,
12203 bool StrictCheck,
12205
12206 /// Check a template argument against its corresponding
12207 /// template template parameter.
12208 ///
12209 /// This routine implements the semantics of C++ [temp.arg.template].
12210 /// It returns true if an error occurred, and false otherwise.
12212 TemplateParameterList *Params,
12214 bool PartialOrdering,
12215 bool *StrictPackMatch);
12216
12219 const TemplateArgumentLoc &Arg);
12220
12222 std::optional<SourceRange> ParamRange = {});
12224
12225 /// Given a non-type template argument that refers to a
12226 /// declaration and the type of its corresponding non-type template
12227 /// parameter, produce an expression that properly refers to that
12228 /// declaration.
12229 /// FIXME: This is used in some contexts where the resulting expression
12230 /// doesn't need to live too long. It would be useful if this function
12231 /// could return a temporary expression.
12233 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
12234 NamedDecl *TemplateParam = nullptr);
12237 SourceLocation Loc);
12238
12239 /// Enumeration describing how template parameter lists are compared
12240 /// for equality.
12242 /// We are matching the template parameter lists of two templates
12243 /// that might be redeclarations.
12244 ///
12245 /// \code
12246 /// template<typename T> struct X;
12247 /// template<typename T> struct X;
12248 /// \endcode
12250
12251 /// We are matching the template parameter lists of two template
12252 /// template parameters as part of matching the template parameter lists
12253 /// of two templates that might be redeclarations.
12254 ///
12255 /// \code
12256 /// template<template<int I> class TT> struct X;
12257 /// template<template<int Value> class Other> struct X;
12258 /// \endcode
12260
12261 /// We are determining whether the template-parameters are equivalent
12262 /// according to C++ [temp.over.link]/6. This comparison does not consider
12263 /// constraints.
12264 ///
12265 /// \code
12266 /// template<C1 T> void f(T);
12267 /// template<C2 T> void f(T);
12268 /// \endcode
12270 };
12271
12272 // A struct to represent the 'new' declaration, which is either itself just
12273 // the named decl, or the important information we need about it in order to
12274 // do constraint comparisons.
12276 const NamedDecl *ND = nullptr;
12277 const DeclContext *DC = nullptr;
12278 const DeclContext *LexicalDC = nullptr;
12279 SourceLocation Loc;
12280
12281 public:
12284 const DeclContext *LexicalDeclCtx,
12285 SourceLocation Loc)
12286
12287 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12288 assert(DC && LexicalDC &&
12289 "Constructor only for cases where we have the information to put "
12290 "in here");
12291 }
12292
12293 // If this was constructed with no information, we cannot do substitution
12294 // for constraint comparison, so make sure we can check that.
12295 bool isInvalid() const { return !ND && !DC; }
12296
12297 const NamedDecl *getDecl() const { return ND; }
12298
12299 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12300
12302 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12303 }
12304
12306 return ND ? ND->getDeclContext() : DC;
12307 }
12308
12309 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12310 };
12311
12312 /// Determine whether the given template parameter lists are
12313 /// equivalent.
12314 ///
12315 /// \param New The new template parameter list, typically written in the
12316 /// source code as part of a new template declaration.
12317 ///
12318 /// \param Old The old template parameter list, typically found via
12319 /// name lookup of the template declared with this template parameter
12320 /// list.
12321 ///
12322 /// \param Complain If true, this routine will produce a diagnostic if
12323 /// the template parameter lists are not equivalent.
12324 ///
12325 /// \param Kind describes how we are to match the template parameter lists.
12326 ///
12327 /// \param TemplateArgLoc If this source location is valid, then we
12328 /// are actually checking the template parameter list of a template
12329 /// argument (New) against the template parameter list of its
12330 /// corresponding template template parameter (Old). We produce
12331 /// slightly different diagnostics in this scenario.
12332 ///
12333 /// \returns True if the template parameter lists are equal, false
12334 /// otherwise.
12336 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12337 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12339 SourceLocation TemplateArgLoc = SourceLocation());
12340
12342 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12344 SourceLocation TemplateArgLoc = SourceLocation()) {
12345 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12346 Kind, TemplateArgLoc);
12347 }
12348
12349 /// Check whether a template can be declared within this scope.
12350 ///
12351 /// If the template declaration is valid in this scope, returns
12352 /// false. Otherwise, issues a diagnostic and returns true.
12353 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12354
12355 /// Called when the parser has parsed a C++ typename
12356 /// specifier, e.g., "typename T::type".
12357 ///
12358 /// \param S The scope in which this typename type occurs.
12359 /// \param TypenameLoc the location of the 'typename' keyword
12360 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12361 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12362 /// \param IdLoc the location of the identifier.
12363 /// \param IsImplicitTypename context where T::type refers to a type.
12365 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12366 const IdentifierInfo &II, SourceLocation IdLoc,
12368
12369 /// Called when the parser has parsed a C++ typename
12370 /// specifier that ends in a template-id, e.g.,
12371 /// "typename MetaFun::template apply<T1, T2>".
12372 ///
12373 /// \param S The scope in which this typename type occurs.
12374 /// \param TypenameLoc the location of the 'typename' keyword
12375 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12376 /// \param TemplateLoc the location of the 'template' keyword, if any.
12377 /// \param TemplateName The template name.
12378 /// \param TemplateII The identifier used to name the template.
12379 /// \param TemplateIILoc The location of the template name.
12380 /// \param LAngleLoc The location of the opening angle bracket ('<').
12381 /// \param TemplateArgs The template arguments.
12382 /// \param RAngleLoc The location of the closing angle bracket ('>').
12384 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12385 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12386 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12387 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12388 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12389
12391 SourceLocation KeywordLoc,
12392 NestedNameSpecifierLoc QualifierLoc,
12393 const IdentifierInfo &II, SourceLocation IILoc,
12394 TypeSourceInfo **TSI, bool DeducedTSTContext);
12395
12397 SourceLocation KeywordLoc,
12398 NestedNameSpecifierLoc QualifierLoc,
12399 const IdentifierInfo &II, SourceLocation IILoc,
12400 bool DeducedTSTContext = true);
12401
12402 /// Rebuilds a type within the context of the current instantiation.
12403 ///
12404 /// The type \p T is part of the type of an out-of-line member definition of
12405 /// a class template (or class template partial specialization) that was
12406 /// parsed and constructed before we entered the scope of the class template
12407 /// (or partial specialization thereof). This routine will rebuild that type
12408 /// now that we have entered the declarator's scope, which may produce
12409 /// different canonical types, e.g.,
12410 ///
12411 /// \code
12412 /// template<typename T>
12413 /// struct X {
12414 /// typedef T* pointer;
12415 /// pointer data();
12416 /// };
12417 ///
12418 /// template<typename T>
12419 /// typename X<T>::pointer X<T>::data() { ... }
12420 /// \endcode
12421 ///
12422 /// Here, the type "typename X<T>::pointer" will be created as a
12423 /// DependentNameType, since we do not know that we can look into X<T> when we
12424 /// parsed the type. This function will rebuild the type, performing the
12425 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12426 /// canonical type is the same as the canonical type of T*, allowing the
12427 /// return types of the out-of-line definition and the declaration to match.
12429 SourceLocation Loc,
12430 DeclarationName Name);
12432
12434
12435 /// Rebuild the template parameters now that we know we're in a current
12436 /// instantiation.
12437 bool
12439
12440 /// Produces a formatted string that describes the binding of
12441 /// template parameters to template arguments.
12442 std::string
12444 const TemplateArgumentList &Args);
12445
12446 std::string
12448 const TemplateArgument *Args,
12449 unsigned NumArgs);
12450
12454
12455 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12456 /// was just parsed. This is only possible with an explicit scope
12457 /// specifier naming a dependent type.
12459 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12460 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12461 const TemplateArgumentListInfo *TemplateArgs);
12462
12465 SourceLocation TemplateKWLoc,
12466 const DeclarationNameInfo &NameInfo,
12467 const TemplateArgumentListInfo *TemplateArgs);
12468
12469 // Calculates whether the expression Constraint depends on an enclosing
12470 // template, for the purposes of [temp.friend] p9.
12471 // TemplateDepth is the 'depth' of the friend function, which is used to
12472 // compare whether a declaration reference is referring to a containing
12473 // template, or just the current friend function. A 'lower' TemplateDepth in
12474 // the AST refers to a 'containing' template. As the constraint is
12475 // uninstantiated, this is relative to the 'top' of the TU.
12476 bool
12478 unsigned TemplateDepth,
12479 const Expr *Constraint);
12480
12481 /// Find the failed Boolean condition within a given Boolean
12482 /// constant expression, and describe it with a string.
12483 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12484
12486
12488 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12489 const IdentifierInfo *Name, SourceLocation NameLoc);
12490
12492 Expr *ConstraintExpr,
12493 const ParsedAttributesView &Attrs);
12494
12496 bool &AddToScope);
12498
12499 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12500 const CXXScopeSpec &SS,
12501 const IdentifierInfo *Name,
12502 SourceLocation TagLoc, SourceLocation NameLoc);
12503
12505 CachedTokens &Toks);
12508
12509 /// We've found a use of a templated declaration that would trigger an
12510 /// implicit instantiation. Check that any relevant explicit specializations
12511 /// and partial specializations are visible/reachable, and diagnose if not.
12514
12515 ///@}
12516
12517 //
12518 //
12519 // -------------------------------------------------------------------------
12520 //
12521 //
12522
12523 /// \name C++ Template Argument Deduction
12524 /// Implementations are in SemaTemplateDeduction.cpp
12525 ///@{
12526
12527public:
12528 class SFINAETrap;
12529
12532 : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {}
12533
12534 protected:
12536 ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; }
12539
12540 private:
12541 SFINAETrap *Prev;
12542 };
12543
12547
12548 /// RAII class used to determine whether SFINAE has
12549 /// trapped any errors that occur during template argument
12550 /// deduction.
12551 class SFINAETrap : SFINAEContextBase {
12552 bool HasErrorOcurred = false;
12553 bool WithAccessChecking = false;
12554 bool PrevLastDiagnosticIgnored =
12555 S.getDiagnostics().isLastDiagnosticIgnored();
12556 sema::TemplateDeductionInfo *DeductionInfo = nullptr;
12557
12558 SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info,
12559 bool WithAccessChecking)
12560 : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking),
12561 DeductionInfo(Info) {}
12562
12563 public:
12564 /// \param WithAccessChecking If true, discard all diagnostics (from the
12565 /// immediate context) instead of adding them to the currently active
12566 /// \ref TemplateDeductionInfo.
12567 explicit SFINAETrap(Sema &S, bool WithAccessChecking = false)
12568 : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {}
12569
12571 : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {}
12572
12574 S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored);
12575 }
12576
12577 SFINAETrap(const SFINAETrap &) = delete;
12578 SFINAETrap &operator=(const SFINAETrap &) = delete;
12579
12581 return DeductionInfo;
12582 }
12583
12584 /// Determine whether any SFINAE errors have been trapped.
12585 bool hasErrorOccurred() const { return HasErrorOcurred; }
12586 void setErrorOccurred() { HasErrorOcurred = true; }
12587
12588 bool withAccessChecking() const { return WithAccessChecking; }
12589 };
12590
12591 /// RAII class used to indicate that we are performing provisional
12592 /// semantic analysis to determine the validity of a construct, so
12593 /// typo-correction and diagnostics in the immediate context (not within
12594 /// implicitly-instantiated templates) should be suppressed.
12596 Sema &SemaRef;
12597 // FIXME: Using a SFINAETrap for this is a hack.
12598 SFINAETrap Trap;
12599 bool PrevDisableTypoCorrection;
12600
12601 public:
12602 explicit TentativeAnalysisScope(Sema &SemaRef)
12603 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12604 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12605 SemaRef.DisableTypoCorrection = true;
12606 }
12608 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12609 }
12610
12613 };
12614
12615 /// For each declaration that involved template argument deduction, the
12616 /// set of diagnostics that were suppressed during that template argument
12617 /// deduction.
12618 ///
12619 /// FIXME: Serialize this structure to the AST file.
12620 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12623
12624 /// Compare types for equality with respect to possibly compatible
12625 /// function types (noreturn adjustment, implicit calling conventions). If any
12626 /// of parameter and argument is not a function, just perform type comparison.
12627 ///
12628 /// \param P the template parameter type.
12629 ///
12630 /// \param A the argument type.
12632
12633 /// Allocate a TemplateArgumentLoc where all locations have
12634 /// been initialized to the given location.
12635 ///
12636 /// \param Arg The template argument we are producing template argument
12637 /// location information for.
12638 ///
12639 /// \param NTTPType For a declaration template argument, the type of
12640 /// the non-type template parameter that corresponds to this template
12641 /// argument. Can be null if no type sugar is available to add to the
12642 /// type from the template argument.
12643 ///
12644 /// \param Loc The source location to use for the resulting template
12645 /// argument.
12648 SourceLocation Loc,
12649 NamedDecl *TemplateParam = nullptr);
12650
12651 /// Get a template argument mapping the given template parameter to itself,
12652 /// e.g. for X in \c template<int X>, this would return an expression template
12653 /// argument referencing X.
12655 SourceLocation Location);
12656
12657 /// Adjust the type \p ArgFunctionType to match the calling convention,
12658 /// noreturn, and optionally the exception specification of \p FunctionType.
12659 /// Deduction often wants to ignore these properties when matching function
12660 /// types.
12662 bool AdjustExceptionSpec = false);
12663
12666 ArrayRef<TemplateArgument> TemplateArgs,
12668
12671 ArrayRef<TemplateArgument> TemplateArgs,
12673
12674 /// Deduce the template arguments of the given template from \p FromType.
12675 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12676 /// [over.match.class.deduct]p4.
12677 ///
12678 /// It only supports class or type alias templates.
12682
12687 bool NumberOfArgumentsMustMatch);
12688
12689 /// Substitute the explicitly-provided template arguments into the
12690 /// given function template according to C++ [temp.arg.explicit].
12691 ///
12692 /// \param FunctionTemplate the function template into which the explicit
12693 /// template arguments will be substituted.
12694 ///
12695 /// \param ExplicitTemplateArgs the explicitly-specified template
12696 /// arguments.
12697 ///
12698 /// \param Deduced the deduced template arguments, which will be populated
12699 /// with the converted and checked explicit template arguments.
12700 ///
12701 /// \param ParamTypes will be populated with the instantiated function
12702 /// parameters.
12703 ///
12704 /// \param FunctionType if non-NULL, the result type of the function template
12705 /// will also be instantiated and the pointed-to value will be updated with
12706 /// the instantiated function type.
12707 ///
12708 /// \param Info if substitution fails for any reason, this object will be
12709 /// populated with more information about the failure.
12710 ///
12711 /// \returns TemplateDeductionResult::Success if substitution was successful,
12712 /// or some failure condition.
12715 TemplateArgumentListInfo &ExplicitTemplateArgs,
12719
12720 /// brief A function argument from which we performed template argument
12721 // deduction for a call.
12734
12735 /// Finish template argument deduction for a function template,
12736 /// checking the deduced template arguments for completeness and forming
12737 /// the function template specialization.
12738 ///
12739 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12740 /// which the deduced argument types should be compared.
12741 /// \param CheckNonDependent Callback before substituting into the declaration
12742 /// with the deduced template arguments.
12743 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12744 /// some breakages introduced by CWG2369, where non-user-defined conversions
12745 /// are checked first before the constraints.
12749 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12751 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12752 bool PartialOverloading, bool PartialOrdering,
12753 bool ForOverloadSetAddressResolution,
12754 llvm::function_ref<bool(bool)> CheckNonDependent =
12755 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12756 return false;
12757 });
12758
12759 /// Perform template argument deduction from a function call
12760 /// (C++ [temp.deduct.call]).
12761 ///
12762 /// \param FunctionTemplate the function template for which we are performing
12763 /// template argument deduction.
12764 ///
12765 /// \param ExplicitTemplateArgs the explicit template arguments provided
12766 /// for this call.
12767 ///
12768 /// \param Args the function call arguments
12769 ///
12770 /// \param Specialization if template argument deduction was successful,
12771 /// this will be set to the function template specialization produced by
12772 /// template argument deduction.
12773 ///
12774 /// \param Info the argument will be updated to provide additional information
12775 /// about template argument deduction.
12776 ///
12777 /// \param CheckNonDependent A callback to invoke to check conversions for
12778 /// non-dependent parameters, between deduction and substitution, per DR1391.
12779 /// If this returns true, substitution will be skipped and we return
12780 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12781 /// passed the parameter types (after substituting explicit template
12782 /// arguments).
12783 ///
12784 /// \returns the result of template argument deduction.
12787 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12789 bool PartialOverloading, bool AggregateDeductionCandidate,
12790 bool PartialOrdering, QualType ObjectType,
12791 Expr::Classification ObjectClassification,
12792 bool ForOverloadSetAddressResolution,
12793 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12794
12795 /// Deduce template arguments when taking the address of a function
12796 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12797 /// a template.
12798 ///
12799 /// \param FunctionTemplate the function template for which we are performing
12800 /// template argument deduction.
12801 ///
12802 /// \param ExplicitTemplateArgs the explicitly-specified template
12803 /// arguments.
12804 ///
12805 /// \param ArgFunctionType the function type that will be used as the
12806 /// "argument" type (A) when performing template argument deduction from the
12807 /// function template's function type. This type may be NULL, if there is no
12808 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12809 ///
12810 /// \param Specialization if template argument deduction was successful,
12811 /// this will be set to the function template specialization produced by
12812 /// template argument deduction.
12813 ///
12814 /// \param Info the argument will be updated to provide additional information
12815 /// about template argument deduction.
12816 ///
12817 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12818 /// the address of a function template per [temp.deduct.funcaddr] and
12819 /// [over.over]. If \c false, we are looking up a function template
12820 /// specialization based on its signature, per [temp.deduct.decl].
12821 ///
12822 /// \returns the result of template argument deduction.
12825 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12827 bool IsAddressOfFunction = false);
12828
12829 /// Deduce template arguments for a templated conversion
12830 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12831 /// conversion function template specialization.
12834 Expr::Classification ObjectClassification, QualType ToType,
12836
12837 /// Deduce template arguments for a function template when there is
12838 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12839 ///
12840 /// \param FunctionTemplate the function template for which we are performing
12841 /// template argument deduction.
12842 ///
12843 /// \param ExplicitTemplateArgs the explicitly-specified template
12844 /// arguments.
12845 ///
12846 /// \param Specialization if template argument deduction was successful,
12847 /// this will be set to the function template specialization produced by
12848 /// template argument deduction.
12849 ///
12850 /// \param Info the argument will be updated to provide additional information
12851 /// about template argument deduction.
12852 ///
12853 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12854 /// the address of a function template in a context where we do not have a
12855 /// target type, per [over.over]. If \c false, we are looking up a function
12856 /// template specialization based on its signature, which only happens when
12857 /// deducing a function parameter type from an argument that is a template-id
12858 /// naming a function template specialization.
12859 ///
12860 /// \returns the result of template argument deduction.
12863 TemplateArgumentListInfo *ExplicitTemplateArgs,
12866 bool IsAddressOfFunction = false);
12867
12868 /// Substitute Replacement for \p auto in \p TypeWithAuto
12869 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12870 /// Substitute Replacement for auto in TypeWithAuto
12872 QualType Replacement);
12873
12874 // Substitute auto in TypeWithAuto for a Dependent auto type
12876
12877 // Substitute auto in TypeWithAuto for a Dependent auto type
12880
12881 /// Completely replace the \c auto in \p TypeWithAuto by
12882 /// \p Replacement. This does not retain any \c auto type sugar.
12883 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12885 QualType Replacement);
12886
12887 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12888 ///
12889 /// Note that this is done even if the initializer is dependent. (This is
12890 /// necessary to support partial ordering of templates using 'auto'.)
12891 /// A dependent type will be produced when deducing from a dependent type.
12892 ///
12893 /// \param Type the type pattern using the auto type-specifier.
12894 /// \param Init the initializer for the variable whose type is to be deduced.
12895 /// \param Result if type deduction was successful, this will be set to the
12896 /// deduced type.
12897 /// \param Info the argument will be updated to provide additional information
12898 /// about template argument deduction.
12899 /// \param DependentDeduction Set if we should permit deduction in
12900 /// dependent cases. This is necessary for template partial ordering
12901 /// with 'auto' template parameters. The template parameter depth to be
12902 /// used should be specified in the 'Info' parameter.
12903 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12904 /// does not satisfy the type-constraint in the auto
12905 /// type.
12909 bool DependentDeduction = false,
12910 bool IgnoreConstraints = false,
12911 TemplateSpecCandidateSet *FailedTSC = nullptr);
12912 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12914 bool Diagnose = true);
12915
12917 SourceLocation Loc);
12918
12919 /// Returns the more specialized class template partial specialization
12920 /// according to the rules of partial ordering of class template partial
12921 /// specializations (C++ [temp.class.order]).
12922 ///
12923 /// \param PS1 the first class template partial specialization
12924 ///
12925 /// \param PS2 the second class template partial specialization
12926 ///
12927 /// \returns the more specialized class template partial specialization. If
12928 /// neither partial specialization is more specialized, returns NULL.
12933
12936
12940
12943
12945 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12946 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12947 bool PartialOrdering, bool *StrictPackMatch);
12948
12949 /// Mark which template parameters are used in a given expression.
12950 ///
12951 /// \param E the expression from which template parameters will be deduced.
12952 ///
12953 /// \param Used a bit vector whose elements will be set to \c true
12954 /// to indicate when the corresponding template parameter will be
12955 /// deduced.
12956 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12957 unsigned Depth, llvm::SmallBitVector &Used);
12958
12959 /// Mark which template parameters are named in a given expression.
12960 ///
12961 /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12962 /// are used but not directly named by an expression - i.e. it excludes
12963 /// any template parameter that denotes the type of a referenced NTTP.
12964 ///
12965 /// \param Used a bit vector whose elements will be set to \c true
12966 /// to indicate when the corresponding template parameter will be
12967 /// deduced.
12969 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
12970
12971 /// Mark which template parameters can be deduced from a given
12972 /// template argument list.
12973 ///
12974 /// \param TemplateArgs the template argument list from which template
12975 /// parameters will be deduced.
12976 ///
12977 /// \param Used a bit vector whose elements will be set to \c true
12978 /// to indicate when the corresponding template parameter will be
12979 /// deduced.
12980 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12981 bool OnlyDeduced, unsigned Depth,
12982 llvm::SmallBitVector &Used);
12983
12985 unsigned Depth, llvm::SmallBitVector &Used);
12986
12988 unsigned Depth, llvm::SmallBitVector &Used);
12989
12990 void
12995
12996 /// Marks all of the template parameters that will be deduced by a
12997 /// call to the given function template.
12998 static void
13001 llvm::SmallBitVector &Deduced);
13002
13003 /// Returns the more specialized function template according
13004 /// to the rules of function template partial ordering (C++
13005 /// [temp.func.order]).
13006 ///
13007 /// \param FT1 the first function template
13008 ///
13009 /// \param FT2 the second function template
13010 ///
13011 /// \param TPOC the context in which we are performing partial ordering of
13012 /// function templates.
13013 ///
13014 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
13015 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
13016 /// when calling a member function.
13017 ///
13018 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
13019 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
13020 /// template from a member function
13021 ///
13022 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
13023 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
13024 /// template from a member function
13025 ///
13026 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
13027 /// candidate with a reversed parameter order. In this case, the corresponding
13028 /// P/A pairs between FT1 and FT2 are reversed.
13029 ///
13030 /// \returns the more specialized function template. If neither
13031 /// template is more specialized, returns NULL.
13034 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
13035 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
13036 bool PartialOverloading = false);
13037
13038 /// Retrieve the most specialized of the given function template
13039 /// specializations.
13040 ///
13041 /// \param SpecBegin the start iterator of the function template
13042 /// specializations that we will be comparing.
13043 ///
13044 /// \param SpecEnd the end iterator of the function template
13045 /// specializations, paired with \p SpecBegin.
13046 ///
13047 /// \param Loc the location where the ambiguity or no-specializations
13048 /// diagnostic should occur.
13049 ///
13050 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
13051 /// no matching candidates.
13052 ///
13053 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
13054 /// occurs.
13055 ///
13056 /// \param CandidateDiag partial diagnostic used for each function template
13057 /// specialization that is a candidate in the ambiguous ordering. One
13058 /// parameter in this diagnostic should be unbound, which will correspond to
13059 /// the string describing the template arguments for the function template
13060 /// specialization.
13061 ///
13062 /// \returns the most specialized function template specialization, if
13063 /// found. Otherwise, returns SpecEnd.
13064 UnresolvedSetIterator
13065 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
13066 TemplateSpecCandidateSet &FailedCandidates,
13067 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
13068 const PartialDiagnostic &AmbigDiag,
13069 const PartialDiagnostic &CandidateDiag,
13070 bool Complain = true, QualType TargetType = QualType());
13071
13072 /// Returns the more constrained function according to the rules of
13073 /// partial ordering by constraints (C++ [temp.constr.order]).
13074 ///
13075 /// \param FD1 the first function
13076 ///
13077 /// \param FD2 the second function
13078 ///
13079 /// \returns the more constrained function. If neither function is
13080 /// more constrained, returns NULL.
13081 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
13082 FunctionDecl *FD2);
13083
13084 ///@}
13085
13086 //
13087 //
13088 // -------------------------------------------------------------------------
13089 //
13090 //
13091
13092 /// \name C++ Template Deduction Guide
13093 /// Implementations are in SemaTemplateDeductionGuide.cpp
13094 ///@{
13095
13096 /// Declare implicit deduction guides for a class template if we've
13097 /// not already done so.
13098 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
13099 SourceLocation Loc);
13100
13101 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
13102 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
13103 SourceLocation Loc);
13104
13105 ///@}
13106
13107 //
13108 //
13109 // -------------------------------------------------------------------------
13110 //
13111 //
13112
13113 /// \name C++ Template Instantiation
13114 /// Implementations are in SemaTemplateInstantiate.cpp
13115 ///@{
13116
13117public:
13118 /// A helper class for building up ExtParameterInfos.
13121 bool HasInteresting = false;
13122
13123 public:
13124 /// Set the ExtParameterInfo for the parameter at the given index,
13125 ///
13127 assert(Infos.size() <= index);
13128 Infos.resize(index);
13129 Infos.push_back(info);
13130
13131 if (!HasInteresting)
13132 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
13133 }
13134
13135 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
13136 /// ExtParameterInfo array we've built up.
13138 getPointerOrNull(unsigned numParams) {
13139 if (!HasInteresting)
13140 return nullptr;
13141 Infos.resize(numParams);
13142 return Infos.data();
13143 }
13144 };
13145
13146 /// The current instantiation scope used to store local
13147 /// variables.
13149
13150 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
13152
13153 /// A mapping from parameters with unparsed default arguments to the
13154 /// set of instantiations of each parameter.
13155 ///
13156 /// This mapping is a temporary data structure used when parsing
13157 /// nested class templates or nested classes of class templates,
13158 /// where we might end up instantiating an inner class before the
13159 /// default arguments of its methods have been parsed.
13161
13162 using InstantiatingSpecializationsKey = llvm::PointerIntPair<Decl *, 2>;
13163
13170
13172 : S(S), Key(D->getCanonicalDecl(), unsigned(Kind)) {
13173 auto [_, Created] = S.InstantiatingSpecializations.insert(Key);
13174 if (!Created)
13175 Key = {};
13176 }
13177
13179 if (Key.getOpaqueValue()) {
13180 [[maybe_unused]] bool Erased =
13181 S.InstantiatingSpecializations.erase(Key);
13182 assert(Erased);
13183 }
13184 }
13185
13188
13189 operator bool() const { return Key.getOpaqueValue() == nullptr; }
13190
13191 private:
13192 Sema &S;
13194 };
13195
13196 /// A context in which code is being synthesized (where a source location
13197 /// alone is not sufficient to identify the context). This covers template
13198 /// instantiation and various forms of implicitly-generated functions.
13200 /// The kind of template instantiation we are performing
13202 /// We are instantiating a template declaration. The entity is
13203 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
13205
13206 /// We are instantiating a default argument for a template
13207 /// parameter. The Entity is the template parameter whose argument is
13208 /// being instantiated, the Template is the template, and the
13209 /// TemplateArgs/NumTemplateArguments provide the template arguments as
13210 /// specified.
13212
13213 /// We are instantiating a default argument for a function.
13214 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
13215 /// provides the template arguments as specified.
13217
13218 /// We are substituting explicit template arguments provided for
13219 /// a function template. The entity is a FunctionTemplateDecl.
13221
13222 /// We are substituting template argument determined as part of
13223 /// template argument deduction for either a class template
13224 /// partial specialization or a function template. The
13225 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
13226 /// a TemplateDecl.
13228
13229 /// We are substituting into a lambda expression.
13231
13232 /// We are substituting prior template arguments into a new
13233 /// template parameter. The template parameter itself is either a
13234 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
13236
13237 /// We are checking the validity of a default template argument that
13238 /// has been used when naming a template-id.
13240
13241 /// We are computing the exception specification for a defaulted special
13242 /// member function.
13244
13245 /// We are instantiating the exception specification for a function
13246 /// template which was deferred until it was needed.
13248
13249 /// We are instantiating a requirement of a requires expression.
13251
13252 /// We are checking the satisfaction of a nested requirement of a requires
13253 /// expression.
13255
13256 /// We are declaring an implicit special member function.
13258
13259 /// We are declaring an implicit 'operator==' for a defaulted
13260 /// 'operator<=>'.
13262
13263 /// We are defining a synthesized function (such as a defaulted special
13264 /// member).
13266
13267 // We are checking the constraints associated with a constrained entity or
13268 // the constraint expression of a concept. This includes the checks that
13269 // atomic constraints have the type 'bool' and that they can be constant
13270 // evaluated.
13272
13273 // We are substituting template arguments into a constraint expression.
13275
13276 // We are normalizing a constraint expression.
13278
13279 // Instantiating a Requires Expression parameter clause.
13281
13282 // We are substituting into the parameter mapping of an atomic constraint
13283 // during normalization.
13285
13286 /// We are rewriting a comparison operator in terms of an operator<=>.
13288
13289 /// We are initializing a structured binding.
13291
13292 /// We are marking a class as __dllexport.
13294
13295 /// We are building an implied call from __builtin_dump_struct. The
13296 /// arguments are in CallArgs.
13298
13299 /// Added for Template instantiation observation.
13300 /// Memoization means we are _not_ instantiating a template because
13301 /// it is already instantiated (but we entered a context where we
13302 /// would have had to if it was not already instantiated).
13304
13305 /// We are building deduction guides for a class.
13307
13308 /// We are instantiating a type alias template declaration.
13310
13311 /// We are performing partial ordering for template template parameters.
13313
13314 /// We are performing name lookup for a function template or variable
13315 /// template named 'sycl_kernel_launch'.
13317
13318 /// We are performing overload resolution for a call to a function
13319 /// template or variable template named 'sycl_kernel_launch'.
13321 } Kind;
13322
13323 /// Whether we're substituting into constraints.
13325
13326 /// Whether we're substituting into the parameter mapping of a constraint.
13328
13329 /// The point of instantiation or synthesis within the source code.
13331
13332 /// The entity that is being synthesized.
13334
13335 /// The template (or partial specialization) in which we are
13336 /// performing the instantiation, for substitutions of prior template
13337 /// arguments.
13339
13340 union {
13341 /// The list of template arguments we are substituting, if they
13342 /// are not part of the entity.
13344
13345 /// The list of argument expressions in a synthesized call.
13346 const Expr *const *CallArgs;
13347 };
13348
13349 // FIXME: Wrap this union around more members, or perhaps store the
13350 // kind-specific members in the RAII object owning the context.
13351 union {
13352 /// The number of template arguments in TemplateArgs.
13354
13355 /// The number of expressions in CallArgs.
13356 unsigned NumCallArgs;
13357
13358 /// The special member being declared or defined.
13360 };
13361
13366
13367 /// The source range that covers the construct that cause
13368 /// the instantiation, e.g., the template-id that causes a class
13369 /// template instantiation.
13371
13376
13377 /// Determines whether this template is an actual instantiation
13378 /// that should be counted toward the maximum instantiation depth.
13379 bool isInstantiationRecord() const;
13380 };
13381
13382 /// A stack object to be created when performing template
13383 /// instantiation.
13384 ///
13385 /// Construction of an object of type \c InstantiatingTemplate
13386 /// pushes the current instantiation onto the stack of active
13387 /// instantiations. If the size of this stack exceeds the maximum
13388 /// number of recursive template instantiations, construction
13389 /// produces an error and evaluates true.
13390 ///
13391 /// Destruction of this object will pop the named instantiation off
13392 /// the stack.
13394 /// Note that we are instantiating a class template,
13395 /// function template, variable template, alias template,
13396 /// or a member thereof.
13397 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13398 Decl *Entity,
13399 SourceRange InstantiationRange = SourceRange());
13400
13402 /// Note that we are instantiating an exception specification
13403 /// of a function template.
13404 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13406 SourceRange InstantiationRange = SourceRange());
13407
13408 /// Note that we are instantiating a type alias template declaration.
13409 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13410 TypeAliasTemplateDecl *Entity,
13411 ArrayRef<TemplateArgument> TemplateArgs,
13412 SourceRange InstantiationRange = SourceRange());
13413
13414 /// Note that we are instantiating a default argument in a
13415 /// template-id.
13416 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13418 ArrayRef<TemplateArgument> TemplateArgs,
13419 SourceRange InstantiationRange = SourceRange());
13420
13421 /// Note that we are substituting either explicitly-specified or
13422 /// deduced template arguments during function template argument deduction.
13423 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13425 ArrayRef<TemplateArgument> TemplateArgs,
13427 SourceRange InstantiationRange = SourceRange());
13428
13429 /// Note that we are instantiating as part of template
13430 /// argument deduction for a class template declaration.
13431 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13433 ArrayRef<TemplateArgument> TemplateArgs,
13434 SourceRange InstantiationRange = SourceRange());
13435
13436 /// Note that we are instantiating as part of template
13437 /// argument deduction for a class template partial
13438 /// specialization.
13439 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13441 ArrayRef<TemplateArgument> TemplateArgs,
13442 SourceRange InstantiationRange = SourceRange());
13443
13444 /// Note that we are instantiating as part of template
13445 /// argument deduction for a variable template partial
13446 /// specialization.
13447 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13449 ArrayRef<TemplateArgument> TemplateArgs,
13450 SourceRange InstantiationRange = SourceRange());
13451
13452 /// Note that we are instantiating a default argument for a function
13453 /// parameter.
13454 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13455 ParmVarDecl *Param,
13456 ArrayRef<TemplateArgument> TemplateArgs,
13457 SourceRange InstantiationRange = SourceRange());
13458
13459 /// Note that we are substituting prior template arguments into a
13460 /// non-type parameter.
13461 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13463 ArrayRef<TemplateArgument> TemplateArgs,
13464 SourceRange InstantiationRange);
13465
13466 /// Note that we are substituting prior template arguments into a
13467 /// template template parameter.
13468 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13470 ArrayRef<TemplateArgument> TemplateArgs,
13471 SourceRange InstantiationRange);
13472
13473 /// Note that we are checking the default template argument
13474 /// against the template parameter for a given template-id.
13475 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13477 ArrayRef<TemplateArgument> TemplateArgs,
13478 SourceRange InstantiationRange);
13479
13481 /// \brief Note that we are checking the constraints associated with some
13482 /// constrained entity (a concept declaration or a template with associated
13483 /// constraints).
13484 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13486 ArrayRef<TemplateArgument> TemplateArgs,
13487 SourceRange InstantiationRange);
13488
13490 /// \brief Note that we are checking a constraint expression associated
13491 /// with a template declaration or as part of the satisfaction check of a
13492 /// concept.
13493 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13495 SourceRange InstantiationRange);
13496
13498 /// \brief Note that we are normalizing a constraint expression.
13499 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13501 SourceRange InstantiationRange);
13502
13504 /// \brief Note that we are subtituting into the parameter mapping of an
13505 /// atomic constraint during constraint normalization.
13506 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13508 SourceRange InstantiationRange);
13509
13510 /// \brief Note that we are substituting template arguments into a part of
13511 /// a requirement of a requires expression.
13512 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13514 SourceRange InstantiationRange = SourceRange());
13515
13516 /// \brief Note that we are checking the satisfaction of the constraint
13517 /// expression inside of a nested requirement.
13518 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13520 SourceRange InstantiationRange = SourceRange());
13521
13522 /// \brief Note that we are checking a requires clause.
13523 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13524 const RequiresExpr *E,
13525 SourceRange InstantiationRange);
13526
13528 /// \brief Note that we are building deduction guides.
13529 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13531 SourceRange InstantiationRange = SourceRange());
13532
13534 /// \brief Note that we are partial ordering template template parameters.
13535 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13537 SourceRange InstantiationRange = SourceRange());
13538
13539 /// Note that we have finished instantiating this template.
13540 void Clear();
13541
13543
13544 /// Determines whether we have exceeded the maximum
13545 /// recursive template instantiations.
13546 bool isInvalid() const { return Invalid; }
13547
13548 private:
13549 Sema &SemaRef;
13550 bool Invalid;
13551
13554 SourceLocation PointOfInstantiation,
13555 SourceRange InstantiationRange, Decl *Entity,
13556 NamedDecl *Template = nullptr,
13557 ArrayRef<TemplateArgument> TemplateArgs = {});
13558
13560
13561 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13562 };
13563
13564 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13565 const MultiLevelTemplateArgumentList &TemplateArgs,
13566 TemplateArgumentLoc &Output,
13567 SourceLocation Loc = {},
13568 const DeclarationName &Entity = {});
13569 bool
13570 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13571 const MultiLevelTemplateArgumentList &TemplateArgs,
13572 TemplateArgumentListInfo &Outputs);
13573
13574 /// Substitute concept template arguments in the constraint expression
13575 /// of a concept-id. This is used to implement [temp.constr.normal].
13577 SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE,
13578 const Expr *ConstraintExpr,
13579 const MultiLevelTemplateArgumentList &MLTAL);
13580
13582 ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13583 const MultiLevelTemplateArgumentList &TemplateArgs,
13584 TemplateArgumentListInfo &Out);
13585
13586 /// Retrieve the template argument list(s) that should be used to
13587 /// instantiate the definition of the given declaration.
13588 ///
13589 /// \param ND the declaration for which we are computing template
13590 /// instantiation arguments.
13591 ///
13592 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13593 /// the decl context where it will be created. In this case, the `Innermost`
13594 /// should likely be provided. If ND is non-null, this is ignored.
13595 ///
13596 /// \param Innermost if non-NULL, specifies a template argument list for the
13597 /// template declaration passed as ND.
13598 ///
13599 /// \param RelativeToPrimary true if we should get the template
13600 /// arguments relative to the primary template, even when we're
13601 /// dealing with a specialization. This is only relevant for function
13602 /// template specializations.
13603 ///
13604 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13605 /// instantiating the definition of the given declaration, \p ND. This is
13606 /// used to determine the proper set of template instantiation arguments for
13607 /// friend function template specializations.
13608 ///
13609 /// \param ForConstraintInstantiation when collecting arguments,
13610 /// ForConstraintInstantiation indicates we should continue looking when
13611 /// encountering a lambda generic call operator, and continue looking for
13612 /// arguments on an enclosing class template.
13613 ///
13614 /// \param SkipForSpecialization when specified, any template specializations
13615 /// in a traversal would be ignored.
13616 ///
13617 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13618 /// when encountering a specialized member function template, rather than
13619 /// returning immediately.
13620 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13621 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13622 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13623 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13624 bool ForConstraintInstantiation = false,
13625 bool SkipForSpecialization = false,
13626 bool ForDefaultArgumentSubstitution = false);
13627
13628 /// RAII object to handle the state changes required to synthesize
13629 /// a function body.
13631 Sema &S;
13632 Sema::ContextRAII SavedContext;
13633 bool PushedCodeSynthesisContext = false;
13634
13635 public:
13637 : S(S), SavedContext(S, DC) {
13638 auto *FD = dyn_cast<FunctionDecl>(DC);
13639 S.PushFunctionScope();
13640 S.PushExpressionEvaluationContextForFunction(
13642 if (FD)
13643 FD->setWillHaveBody(true);
13644 else
13645 assert(isa<ObjCMethodDecl>(DC));
13646 }
13647
13649 assert(!PushedCodeSynthesisContext);
13650
13653 Ctx.PointOfInstantiation = UseLoc;
13654 Ctx.Entity = cast<Decl>(S.CurContext);
13655 S.pushCodeSynthesisContext(Ctx);
13656
13657 PushedCodeSynthesisContext = true;
13658 }
13659
13661 if (PushedCodeSynthesisContext)
13662 S.popCodeSynthesisContext();
13663 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13664 FD->setWillHaveBody(false);
13665 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13666 }
13667 S.PopExpressionEvaluationContext();
13668 S.PopFunctionScopeInfo();
13669 }
13670
13674 };
13675
13676 /// RAII object to ensure that a code synthesis context is popped on scope
13677 /// exit.
13679 Sema &S;
13680
13681 public:
13683 : S(S) {
13684 S.pushCodeSynthesisContext(Ctx);
13685 }
13686
13687 ~ScopedCodeSynthesisContext() { S.popCodeSynthesisContext(); }
13688 };
13689
13690 /// List of active code synthesis contexts.
13691 ///
13692 /// This vector is treated as a stack. As synthesis of one entity requires
13693 /// synthesis of another, additional contexts are pushed onto the stack.
13695
13696 /// Specializations whose definitions are currently being instantiated.
13697 llvm::DenseSet<InstantiatingSpecializationsKey> InstantiatingSpecializations;
13698
13699 /// Non-dependent types used in templates that have already been instantiated
13700 /// by some template instantiation.
13701 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13702
13703 /// Extra modules inspected when performing a lookup during a template
13704 /// instantiation. Computed lazily.
13706
13707 /// Cache of additional modules that should be used for name lookup
13708 /// within the current template instantiation. Computed lazily; use
13709 /// getLookupModules() to get a complete set.
13710 llvm::DenseSet<Module *> LookupModulesCache;
13711
13712 /// Map from the most recent declaration of a namespace to the most
13713 /// recent visible declaration of that namespace.
13714 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13715
13717
13718 /// The number of \p CodeSynthesisContexts that are not template
13719 /// instantiations and, therefore, should not be counted as part of the
13720 /// instantiation depth.
13721 ///
13722 /// When the instantiation depth reaches the user-configurable limit
13723 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13724 // FIXME: Should we have a similar limit for other forms of synthesis?
13726
13727 /// The depth of the context stack at the point when the most recent
13728 /// error or warning was produced.
13729 ///
13730 /// This value is used to suppress printing of redundant context stacks
13731 /// when there are multiple errors or warnings in the same instantiation.
13732 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13734
13735 /// The template instantiation callbacks to trace or track
13736 /// instantiations (objects can be chained).
13737 ///
13738 /// This callbacks is used to print, trace or track template
13739 /// instantiations as they are being constructed.
13740 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13742
13743 /// The current index into pack expansion arguments that will be
13744 /// used for substitution of parameter packs.
13745 ///
13746 /// The pack expansion index will be none to indicate that parameter packs
13747 /// should be instantiated as themselves. Otherwise, the index specifies
13748 /// which argument within the parameter pack will be used for substitution.
13750
13751 /// RAII object used to change the argument pack substitution index
13752 /// within a \c Sema object.
13753 ///
13754 /// See \c ArgPackSubstIndex for more information.
13756 Sema &Self;
13757 UnsignedOrNone OldSubstIndex;
13758
13759 public:
13761 : Self(Self),
13762 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13763
13764 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13767 };
13768
13771
13782 /// Prints the current instantiation stack through a series of
13783 /// notes.
13788
13789 /// Returns a pointer to the current SFINAE context, if any.
13790 [[nodiscard]] SFINAETrap *getSFINAEContext() const {
13791 return CurrentSFINAEContext;
13792 }
13793 [[nodiscard]] bool isSFINAEContext() const {
13794 return CurrentSFINAEContext != nullptr;
13795 }
13796
13797 /// Perform substitution on the type T with a given set of template
13798 /// arguments.
13799 ///
13800 /// This routine substitutes the given template arguments into the
13801 /// type T and produces the instantiated type.
13802 ///
13803 /// \param T the type into which the template arguments will be
13804 /// substituted. If this type is not dependent, it will be returned
13805 /// immediately.
13806 ///
13807 /// \param Args the template arguments that will be
13808 /// substituted for the top-level template parameters within T.
13809 ///
13810 /// \param Loc the location in the source code where this substitution
13811 /// is being performed. It will typically be the location of the
13812 /// declarator (if we're instantiating the type of some declaration)
13813 /// or the location of the type in the source code (if, e.g., we're
13814 /// instantiating the type of a cast expression).
13815 ///
13816 /// \param Entity the name of the entity associated with a declaration
13817 /// being instantiated (if any). May be empty to indicate that there
13818 /// is no such entity (if, e.g., this is a type that occurs as part of
13819 /// a cast expression) or that the entity has no name (e.g., an
13820 /// unnamed function parameter).
13821 ///
13822 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13823 /// acceptable as the top level type of the result.
13824 ///
13825 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13826 /// whenever substitution would perform a replacement with a null or
13827 /// non-existent template argument.
13828 ///
13829 /// \returns If the instantiation succeeds, the instantiated
13830 /// type. Otherwise, produces diagnostics and returns a NULL type.
13832 const MultiLevelTemplateArgumentList &TemplateArgs,
13833 SourceLocation Loc, DeclarationName Entity,
13834 bool AllowDeducedTST = false);
13835
13837 const MultiLevelTemplateArgumentList &TemplateArgs,
13838 SourceLocation Loc, DeclarationName Entity,
13839 bool *IsIncompleteSubstitution = nullptr);
13840
13842 const MultiLevelTemplateArgumentList &TemplateArgs,
13843 SourceLocation Loc, DeclarationName Entity);
13844
13845 /// A form of SubstType intended specifically for instantiating the
13846 /// type of a FunctionDecl. Its purpose is solely to force the
13847 /// instantiation of default-argument expressions and to avoid
13848 /// instantiating an exception-specification.
13850 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13851 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13852 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13854 const MultiLevelTemplateArgumentList &Args);
13857 SmallVectorImpl<QualType> &ExceptionStorage,
13858 const MultiLevelTemplateArgumentList &Args);
13859 ParmVarDecl *
13861 const MultiLevelTemplateArgumentList &TemplateArgs,
13862 int indexAdjustment, UnsignedOrNone NumExpansions,
13863 bool ExpectParameterPack, bool EvaluateConstraints = true);
13864
13865 /// Substitute the given template arguments into the given set of
13866 /// parameters, producing the set of parameter types that would be generated
13867 /// from such a substitution.
13869 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13870 const MultiLevelTemplateArgumentList &TemplateArgs,
13871 SmallVectorImpl<QualType> &ParamTypes,
13873 ExtParameterInfoBuilder &ParamInfos);
13874
13875 /// Substitute the given template arguments into the default argument.
13877 const MultiLevelTemplateArgumentList &TemplateArgs,
13878 bool ForCallExpr = false);
13880 const MultiLevelTemplateArgumentList &TemplateArgs);
13881 /// Substitute an expression as if it is a address-of-operand, which makes it
13882 /// act like a CXXIdExpression rather than an attempt to call.
13884 const MultiLevelTemplateArgumentList &TemplateArgs);
13885
13886 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13887 // to disable constraint evaluation, then restore the state.
13888 template <typename InstTy> struct ConstraintEvalRAII {
13889 InstTy &TI;
13891
13893 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13894 TI.setEvaluateConstraints(false);
13895 }
13896 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13899 };
13900
13901 // Must be used instead of SubstExpr at 'constraint checking' time.
13904 const MultiLevelTemplateArgumentList &TemplateArgs);
13905 // Unlike the above, this does not evaluate constraints.
13907 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13908
13909 /// Substitute the given template arguments into a list of
13910 /// expressions, expanding pack expansions if required.
13911 ///
13912 /// \param Exprs The list of expressions to substitute into.
13913 ///
13914 /// \param IsCall Whether this is some form of call, in which case
13915 /// default arguments will be dropped.
13916 ///
13917 /// \param TemplateArgs The set of template arguments to substitute.
13918 ///
13919 /// \param Outputs Will receive all of the substituted arguments.
13920 ///
13921 /// \returns true if an error occurred, false otherwise.
13922 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13923 const MultiLevelTemplateArgumentList &TemplateArgs,
13924 SmallVectorImpl<Expr *> &Outputs);
13925
13927 const MultiLevelTemplateArgumentList &TemplateArgs);
13928
13931 bool CXXDirectInit);
13932
13933 /// Perform substitution on the base class specifiers of the
13934 /// given class template specialization.
13935 ///
13936 /// Produces a diagnostic and returns true on error, returns false and
13937 /// attaches the instantiated base classes to the class template
13938 /// specialization if successful.
13939 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13940 const MultiLevelTemplateArgumentList &TemplateArgs);
13941
13942 /// Instantiate the definition of a class from a given pattern.
13943 ///
13944 /// \param PointOfInstantiation The point of instantiation within the
13945 /// source code.
13946 ///
13947 /// \param Instantiation is the declaration whose definition is being
13948 /// instantiated. This will be either a class template specialization
13949 /// or a member class of a class template specialization.
13950 ///
13951 /// \param Pattern is the pattern from which the instantiation
13952 /// occurs. This will be either the declaration of a class template or
13953 /// the declaration of a member class of a class template.
13954 ///
13955 /// \param TemplateArgs The template arguments to be substituted into
13956 /// the pattern.
13957 ///
13958 /// \param TSK the kind of implicit or explicit instantiation to perform.
13959 ///
13960 /// \param Complain whether to complain if the class cannot be instantiated
13961 /// due to the lack of a definition.
13962 ///
13963 /// \returns true if an error occurred, false otherwise.
13964 bool InstantiateClass(SourceLocation PointOfInstantiation,
13965 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13966 const MultiLevelTemplateArgumentList &TemplateArgs,
13967 TemplateSpecializationKind TSK, bool Complain = true);
13968
13969private:
13970 bool InstantiateClassImpl(SourceLocation PointOfInstantiation,
13971 CXXRecordDecl *Instantiation,
13972 CXXRecordDecl *Pattern,
13973 const MultiLevelTemplateArgumentList &TemplateArgs,
13974 TemplateSpecializationKind TSK, bool Complain);
13975
13976public:
13977 /// Instantiate the definition of an enum from a given pattern.
13978 ///
13979 /// \param PointOfInstantiation The point of instantiation within the
13980 /// source code.
13981 /// \param Instantiation is the declaration whose definition is being
13982 /// instantiated. This will be a member enumeration of a class
13983 /// temploid specialization, or a local enumeration within a
13984 /// function temploid specialization.
13985 /// \param Pattern The templated declaration from which the instantiation
13986 /// occurs.
13987 /// \param TemplateArgs The template arguments to be substituted into
13988 /// the pattern.
13989 /// \param TSK The kind of implicit or explicit instantiation to perform.
13990 ///
13991 /// \return \c true if an error occurred, \c false otherwise.
13992 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13993 EnumDecl *Instantiation, EnumDecl *Pattern,
13994 const MultiLevelTemplateArgumentList &TemplateArgs,
13996
13997 /// Instantiate the definition of a field from the given pattern.
13998 ///
13999 /// \param PointOfInstantiation The point of instantiation within the
14000 /// source code.
14001 /// \param Instantiation is the declaration whose definition is being
14002 /// instantiated. This will be a class of a class temploid
14003 /// specialization, or a local enumeration within a function temploid
14004 /// specialization.
14005 /// \param Pattern The templated declaration from which the instantiation
14006 /// occurs.
14007 /// \param TemplateArgs The template arguments to be substituted into
14008 /// the pattern.
14009 ///
14010 /// \return \c true if an error occurred, \c false otherwise.
14012 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
14013 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
14014
14016 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
14017
14019 SourceLocation PointOfInstantiation,
14020 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14021 TemplateSpecializationKind TSK, bool Complain,
14022 bool PrimaryStrictPackMatch);
14023
14024 /// Instantiates the definitions of all of the member
14025 /// of the given class, which is an instantiation of a class template
14026 /// or a member class of a template.
14027 void
14028 InstantiateClassMembers(SourceLocation PointOfInstantiation,
14029 CXXRecordDecl *Instantiation,
14030 const MultiLevelTemplateArgumentList &TemplateArgs,
14032
14033 /// Instantiate the definitions of all of the members of the
14034 /// given class template specialization, which was named as part of an
14035 /// explicit instantiation.
14037 SourceLocation PointOfInstantiation,
14038 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14040
14043 const MultiLevelTemplateArgumentList &TemplateArgs);
14044
14045 /// Do template substitution on declaration name info.
14048 const MultiLevelTemplateArgumentList &TemplateArgs);
14050 SubstTemplateName(SourceLocation TemplateKWLoc,
14051 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
14052 SourceLocation NameLoc,
14053 const MultiLevelTemplateArgumentList &TemplateArgs);
14054
14056 const MultiLevelTemplateArgumentList &TemplateArgs,
14057 bool EvaluateConstraint);
14058
14059 /// Determine whether we are currently performing template instantiation.
14062 }
14063
14064 /// Determine whether we are currently performing constraint substitution.
14066 return !CodeSynthesisContexts.empty() &&
14067 CodeSynthesisContexts.back().InConstraintSubstitution;
14068 }
14069
14071 return !CodeSynthesisContexts.empty() &&
14072 CodeSynthesisContexts.back().InParameterMappingSubstitution &&
14074 }
14075
14076 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
14077
14078 /// \brief create a Requirement::SubstitutionDiagnostic with only a
14079 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
14082
14083 ///@}
14084
14085 //
14086 //
14087 // -------------------------------------------------------------------------
14088 //
14089 //
14090
14091 /// \name C++ Template Declaration Instantiation
14092 /// Implementations are in SemaTemplateInstantiateDecl.cpp
14093 ///@{
14094
14095public:
14096 /// An entity for which implicit template instantiation is required.
14097 ///
14098 /// The source location associated with the declaration is the first place in
14099 /// the source code where the declaration was "used". It is not necessarily
14100 /// the point of instantiation (which will be either before or after the
14101 /// namespace-scope declaration that triggered this implicit instantiation),
14102 /// However, it is the location that diagnostics should generally refer to,
14103 /// because users will need to know what code triggered the instantiation.
14104 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
14105
14106 /// The queue of implicit template instantiations that are required
14107 /// but have not yet been performed.
14108 std::deque<PendingImplicitInstantiation> PendingInstantiations;
14109
14110 /// Queue of implicit template instantiations that cannot be performed
14111 /// eagerly.
14113
14117
14118 /// The queue of implicit template instantiations that are required
14119 /// and must be performed within the current local scope.
14120 ///
14121 /// This queue is only used for member functions of local classes in
14122 /// templates, which must be instantiated in the same scope as their
14123 /// enclosing function, so that they can reference function-local
14124 /// types, static variables, enumerators, etc.
14125 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
14126
14128 public:
14130 : S(S), AtEndOfTU(AtEndOfTU) {
14131 SavedPendingLocalImplicitInstantiations.swap(
14132 S.PendingLocalImplicitInstantiations);
14133 }
14134
14135 void perform() {
14136 S.PerformPendingInstantiations(/*LocalOnly=*/true,
14137 /*AtEndOfTU=*/AtEndOfTU);
14138 }
14139
14141 assert(S.PendingLocalImplicitInstantiations.empty() &&
14142 "there shouldn't be any pending local implicit instantiations");
14143 SavedPendingLocalImplicitInstantiations.swap(
14144 S.PendingLocalImplicitInstantiations);
14145 }
14146
14150
14151 private:
14152 Sema &S;
14153 bool AtEndOfTU;
14154 std::deque<PendingImplicitInstantiation>
14155 SavedPendingLocalImplicitInstantiations;
14156 };
14157
14158 /// Records and restores the CurFPFeatures state on entry/exit of compound
14159 /// statements.
14161 public:
14164 FPOptionsOverride getOverrides() { return OldOverrides; }
14165
14166 private:
14167 Sema &S;
14168 FPOptions OldFPFeaturesState;
14169 FPOptionsOverride OldOverrides;
14170 LangOptions::FPEvalMethodKind OldEvalMethod;
14171 SourceLocation OldFPPragmaLocation;
14172 };
14173
14175 public:
14176 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
14177 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
14178 if (!Enabled)
14179 return;
14180
14181 S.SavedPendingInstantiations.emplace_back();
14182 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
14183
14184 S.SavedVTableUses.emplace_back();
14185 S.SavedVTableUses.back().swap(S.VTableUses);
14186 }
14187
14188 void perform() {
14189 if (Enabled) {
14190 S.DefineUsedVTables();
14191 S.PerformPendingInstantiations(/*LocalOnly=*/false,
14192 /*AtEndOfTU=*/AtEndOfTU);
14193 }
14194 }
14195
14197 if (!Enabled)
14198 return;
14199
14200 // Restore the set of pending vtables.
14201 assert(S.VTableUses.empty() &&
14202 "VTableUses should be empty before it is discarded.");
14203 S.VTableUses.swap(S.SavedVTableUses.back());
14204 S.SavedVTableUses.pop_back();
14205
14206 // Restore the set of pending implicit instantiations.
14207 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
14208 AtEndOfTU) {
14209 assert(S.PendingInstantiations.empty() &&
14210 "PendingInstantiations should be empty before it is discarded.");
14211 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14212 S.SavedPendingInstantiations.pop_back();
14213 } else {
14214 // Template instantiations in the PCH may be delayed until the TU.
14215 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14216 S.PendingInstantiations.insert(
14217 S.PendingInstantiations.end(),
14218 S.SavedPendingInstantiations.back().begin(),
14219 S.SavedPendingInstantiations.back().end());
14220 S.SavedPendingInstantiations.pop_back();
14221 }
14222 }
14223
14225 delete;
14228
14229 private:
14230 Sema &S;
14231 bool Enabled;
14232 bool AtEndOfTU;
14233 };
14234
14236 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
14237
14248
14249 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
14250 const Decl *Pattern, Decl *Inst,
14251 LateInstantiatedAttrVec *LateAttrs = nullptr,
14252 LocalInstantiationScope *OuterMostScope = nullptr);
14253
14254 /// Update instantiation attributes after template was late parsed.
14255 ///
14256 /// Some attributes are evaluated based on the body of template. If it is
14257 /// late parsed, such attributes cannot be evaluated when declaration is
14258 /// instantiated. This function is used to update instantiation attributes
14259 /// when template definition is ready.
14260 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
14261
14262 void
14264 const Decl *Pattern, Decl *Inst,
14265 LateInstantiatedAttrVec *LateAttrs = nullptr,
14266 LocalInstantiationScope *OuterMostScope = nullptr);
14267
14268 /// In the MS ABI, we need to instantiate default arguments of dllexported
14269 /// default constructors along with the constructor definition. This allows IR
14270 /// gen to emit a constructor closure which calls the default constructor with
14271 /// its default arguments.
14273
14275 ParmVarDecl *Param);
14276 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14278
14279 /// Instantiate (or find existing instantiation of) a function template with a
14280 /// given set of template arguments.
14281 ///
14282 /// Usually this should not be used, and template argument deduction should be
14283 /// used in its place.
14286 SourceLocation Loc,
14289
14290 /// Instantiate the definition of the given function from its
14291 /// template.
14292 ///
14293 /// \param PointOfInstantiation the point at which the instantiation was
14294 /// required. Note that this is not precisely a "point of instantiation"
14295 /// for the function, but it's close.
14296 ///
14297 /// \param Function the already-instantiated declaration of a
14298 /// function template specialization or member function of a class template
14299 /// specialization.
14300 ///
14301 /// \param Recursive if true, recursively instantiates any functions that
14302 /// are required by this instantiation.
14303 ///
14304 /// \param DefinitionRequired if true, then we are performing an explicit
14305 /// instantiation where the body of the function is required. Complain if
14306 /// there is no such body.
14307 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14309 bool Recursive = false,
14310 bool DefinitionRequired = false,
14311 bool AtEndOfTU = false);
14314 const TemplateArgumentList *PartialSpecArgs,
14316 SourceLocation PointOfInstantiation,
14317 LateInstantiatedAttrVec *LateAttrs = nullptr,
14318 LocalInstantiationScope *StartingScope = nullptr);
14319
14320 /// Instantiates a variable template specialization by completing it
14321 /// with appropriate type information and initializer.
14323 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14324 const MultiLevelTemplateArgumentList &TemplateArgs);
14325
14326 /// BuildVariableInstantiation - Used after a new variable has been created.
14327 /// Sets basic variable data and decides whether to postpone the
14328 /// variable instantiation.
14329 void
14331 const MultiLevelTemplateArgumentList &TemplateArgs,
14332 LateInstantiatedAttrVec *LateAttrs,
14333 DeclContext *Owner,
14334 LocalInstantiationScope *StartingScope,
14335 bool InstantiatingVarTemplate = false,
14336 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14337
14338 /// Instantiate the initializer of a variable.
14340 VarDecl *Var, VarDecl *OldVar,
14341 const MultiLevelTemplateArgumentList &TemplateArgs);
14342
14343 /// Instantiate the definition of the given variable from its
14344 /// template.
14345 ///
14346 /// \param PointOfInstantiation the point at which the instantiation was
14347 /// required. Note that this is not precisely a "point of instantiation"
14348 /// for the variable, but it's close.
14349 ///
14350 /// \param Var the already-instantiated declaration of a templated variable.
14351 ///
14352 /// \param Recursive if true, recursively instantiates any functions that
14353 /// are required by this instantiation.
14354 ///
14355 /// \param DefinitionRequired if true, then we are performing an explicit
14356 /// instantiation where a definition of the variable is required. Complain
14357 /// if there is no such definition.
14358 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14359 VarDecl *Var, bool Recursive = false,
14360 bool DefinitionRequired = false,
14361 bool AtEndOfTU = false);
14362
14365 const MultiLevelTemplateArgumentList &TemplateArgs);
14366
14367 /// Find the instantiation of the given declaration within the
14368 /// current instantiation.
14369 ///
14370 /// This routine is intended to be used when \p D is a declaration
14371 /// referenced from within a template, that needs to mapped into the
14372 /// corresponding declaration within an instantiation. For example,
14373 /// given:
14374 ///
14375 /// \code
14376 /// template<typename T>
14377 /// struct X {
14378 /// enum Kind {
14379 /// KnownValue = sizeof(T)
14380 /// };
14381 ///
14382 /// bool getKind() const { return KnownValue; }
14383 /// };
14384 ///
14385 /// template struct X<int>;
14386 /// \endcode
14387 ///
14388 /// In the instantiation of X<int>::getKind(), we need to map the \p
14389 /// EnumConstantDecl for \p KnownValue (which refers to
14390 /// X<T>::<Kind>::KnownValue) to its instantiation
14391 /// (X<int>::<Kind>::KnownValue).
14392 /// \p FindInstantiatedDecl performs this mapping from within the
14393 /// instantiation of X<int>.
14394 NamedDecl *
14396 const MultiLevelTemplateArgumentList &TemplateArgs,
14397 bool FindingInstantiatedContext = false);
14398
14399 /// Finds the instantiation of the given declaration context
14400 /// within the current instantiation.
14401 ///
14402 /// \returns NULL if there was an error
14403 DeclContext *
14405 const MultiLevelTemplateArgumentList &TemplateArgs);
14406
14407 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14408 const MultiLevelTemplateArgumentList &TemplateArgs);
14409
14410 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14411 /// an implicit 'operator=='.
14413 FunctionDecl *Spaceship);
14414
14415 /// Performs template instantiation for all implicit template
14416 /// instantiations we have seen until this point.
14417 void PerformPendingInstantiations(bool LocalOnly = false,
14418 bool AtEndOfTU = true);
14419
14422 const MultiLevelTemplateArgumentList &TemplateArgs,
14423 bool EvaluateConstraints = true);
14424
14426 const DeclContext *Pattern,
14427 const MultiLevelTemplateArgumentList &TemplateArgs);
14428
14429private:
14430 /// Introduce the instantiated local variables into the local
14431 /// instantiation scope.
14432 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14433 const FunctionDecl *PatternDecl,
14435 /// Introduce the instantiated function parameters into the local
14436 /// instantiation scope, and set the parameter names to those used
14437 /// in the template.
14438 bool addInstantiatedParametersToScope(
14439 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14441 const MultiLevelTemplateArgumentList &TemplateArgs);
14442
14443 /// Introduce the instantiated captures of the lambda into the local
14444 /// instantiation scope.
14445 bool addInstantiatedCapturesToScope(
14446 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14448 const MultiLevelTemplateArgumentList &TemplateArgs);
14449
14450 int ParsingClassDepth = 0;
14451
14452 class SavePendingParsedClassStateRAII {
14453 public:
14454 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14455
14456 ~SavePendingParsedClassStateRAII() {
14457 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14458 "there shouldn't be any pending delayed exception spec checks");
14459 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14460 "there shouldn't be any pending delayed exception spec checks");
14461 swapSavedState();
14462 }
14463
14464 SavePendingParsedClassStateRAII(const SavePendingParsedClassStateRAII &) =
14465 delete;
14466 SavePendingParsedClassStateRAII &
14467 operator=(const SavePendingParsedClassStateRAII &) = delete;
14468
14469 private:
14470 Sema &S;
14472 SavedOverridingExceptionSpecChecks;
14474 SavedEquivalentExceptionSpecChecks;
14475
14476 void swapSavedState() {
14477 SavedOverridingExceptionSpecChecks.swap(
14478 S.DelayedOverridingExceptionSpecChecks);
14479 SavedEquivalentExceptionSpecChecks.swap(
14480 S.DelayedEquivalentExceptionSpecChecks);
14481 }
14482 };
14483
14484 ///@}
14485
14486 //
14487 //
14488 // -------------------------------------------------------------------------
14489 //
14490 //
14491
14492 /// \name C++ Variadic Templates
14493 /// Implementations are in SemaTemplateVariadic.cpp
14494 ///@{
14495
14496public:
14497 /// Determine whether an unexpanded parameter pack might be permitted in this
14498 /// location. Useful for error recovery.
14500
14501 /// The context in which an unexpanded parameter pack is
14502 /// being diagnosed.
14503 ///
14504 /// Note that the values of this enumeration line up with the first
14505 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14507 /// An arbitrary expression.
14509
14510 /// The base type of a class type.
14512
14513 /// The type of an arbitrary declaration.
14515
14516 /// The type of a data member.
14518
14519 /// The size of a bit-field.
14521
14522 /// The expression in a static assertion.
14524
14525 /// The fixed underlying type of an enumeration.
14527
14528 /// The enumerator value.
14530
14531 /// A using declaration.
14533
14534 /// A friend declaration.
14536
14537 /// A declaration qualifier.
14539
14540 /// An initializer.
14542
14543 /// A default argument.
14545
14546 /// The type of a non-type template parameter.
14548
14549 /// The type of an exception.
14551
14552 /// Explicit specialization.
14554
14555 /// Partial specialization.
14557
14558 /// Microsoft __if_exists.
14560
14561 /// Microsoft __if_not_exists.
14563
14564 /// Lambda expression.
14566
14567 /// Block expression.
14569
14570 /// A type constraint.
14572
14573 // A requirement in a requires-expression.
14575
14576 // A requires-clause.
14578 };
14579
14580 /// Diagnose unexpanded parameter packs.
14581 ///
14582 /// \param Loc The location at which we should emit the diagnostic.
14583 ///
14584 /// \param UPPC The context in which we are diagnosing unexpanded
14585 /// parameter packs.
14586 ///
14587 /// \param Unexpanded the set of unexpanded parameter packs.
14588 ///
14589 /// \returns true if an error occurred, false otherwise.
14593
14594 /// If the given type contains an unexpanded parameter pack,
14595 /// diagnose the error.
14596 ///
14597 /// \param Loc The source location where a diagnostc should be emitted.
14598 ///
14599 /// \param T The type that is being checked for unexpanded parameter
14600 /// packs.
14601 ///
14602 /// \returns true if an error occurred, false otherwise.
14605
14606 /// If the given expression contains an unexpanded parameter
14607 /// pack, diagnose the error.
14608 ///
14609 /// \param E The expression that is being checked for unexpanded
14610 /// parameter packs.
14611 ///
14612 /// \returns true if an error occurred, false otherwise.
14615
14616 /// If the given requirees-expression contains an unexpanded reference to one
14617 /// of its own parameter packs, diagnose the error.
14618 ///
14619 /// \param RE The requiress-expression that is being checked for unexpanded
14620 /// parameter packs.
14621 ///
14622 /// \returns true if an error occurred, false otherwise.
14624
14625 /// If the given nested-name-specifier contains an unexpanded
14626 /// parameter pack, diagnose the error.
14627 ///
14628 /// \param SS The nested-name-specifier that is being checked for
14629 /// unexpanded parameter packs.
14630 ///
14631 /// \returns true if an error occurred, false otherwise.
14634
14635 /// If the given name contains an unexpanded parameter pack,
14636 /// diagnose the error.
14637 ///
14638 /// \param NameInfo The name (with source location information) that
14639 /// is being checked for unexpanded parameter packs.
14640 ///
14641 /// \returns true if an error occurred, false otherwise.
14644
14645 /// If the given template name contains an unexpanded parameter pack,
14646 /// diagnose the error.
14647 ///
14648 /// \param Loc The location of the template name.
14649 ///
14650 /// \param Template The template name that is being checked for unexpanded
14651 /// parameter packs.
14652 ///
14653 /// \returns true if an error occurred, false otherwise.
14657
14658 /// If the given template argument contains an unexpanded parameter
14659 /// pack, diagnose the error.
14660 ///
14661 /// \param Arg The template argument that is being checked for unexpanded
14662 /// parameter packs.
14663 ///
14664 /// \returns true if an error occurred, false otherwise.
14667
14668 /// Collect the set of unexpanded parameter packs within the given
14669 /// template argument.
14670 ///
14671 /// \param Arg The template argument that will be traversed to find
14672 /// unexpanded parameter packs.
14674 TemplateArgument Arg,
14676
14677 /// Collect the set of unexpanded parameter packs within the given
14678 /// template argument.
14679 ///
14680 /// \param Arg The template argument that will be traversed to find
14681 /// unexpanded parameter packs.
14685
14686 /// Collect the set of unexpanded parameter packs within the given
14687 /// type.
14688 ///
14689 /// \param T The type that will be traversed to find
14690 /// unexpanded parameter packs.
14693
14694 /// Collect the set of unexpanded parameter packs within the given
14695 /// type.
14696 ///
14697 /// \param TL The type that will be traversed to find
14698 /// unexpanded parameter packs.
14701
14702 /// Collect the set of unexpanded parameter packs within the given
14703 /// nested-name-specifier.
14704 ///
14705 /// \param NNS The nested-name-specifier that will be traversed to find
14706 /// unexpanded parameter packs.
14710
14711 /// Collect the set of unexpanded parameter packs within the given
14712 /// name.
14713 ///
14714 /// \param NameInfo The name that will be traversed to find
14715 /// unexpanded parameter packs.
14717 const DeclarationNameInfo &NameInfo,
14719
14720 /// Collect the set of unexpanded parameter packs within the given
14721 /// expression.
14724
14725 /// Invoked when parsing a template argument.
14726 ///
14727 /// \param Arg the template argument, which may already be invalid.
14728 ///
14729 /// If it is followed by ellipsis, this function is called before
14730 /// `ActOnPackExpansion`.
14733
14734 /// Invoked when parsing a template argument followed by an
14735 /// ellipsis, which creates a pack expansion.
14736 ///
14737 /// \param Arg The template argument preceding the ellipsis, which
14738 /// may already be invalid.
14739 ///
14740 /// \param EllipsisLoc The location of the ellipsis.
14742 SourceLocation EllipsisLoc);
14743
14744 /// Invoked when parsing a type followed by an ellipsis, which
14745 /// creates a pack expansion.
14746 ///
14747 /// \param Type The type preceding the ellipsis, which will become
14748 /// the pattern of the pack expansion.
14749 ///
14750 /// \param EllipsisLoc The location of the ellipsis.
14752
14753 /// Construct a pack expansion type from the pattern of the pack
14754 /// expansion.
14756 SourceLocation EllipsisLoc,
14757 UnsignedOrNone NumExpansions);
14758
14759 /// Construct a pack expansion type from the pattern of the pack
14760 /// expansion.
14761 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14762 SourceLocation EllipsisLoc,
14763 UnsignedOrNone NumExpansions);
14764
14765 /// Invoked when parsing an expression followed by an ellipsis, which
14766 /// creates a pack expansion.
14767 ///
14768 /// \param Pattern The expression preceding the ellipsis, which will become
14769 /// the pattern of the pack expansion.
14770 ///
14771 /// \param EllipsisLoc The location of the ellipsis.
14772 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14773
14774 /// Invoked when parsing an expression followed by an ellipsis, which
14775 /// creates a pack expansion.
14776 ///
14777 /// \param Pattern The expression preceding the ellipsis, which will become
14778 /// the pattern of the pack expansion.
14779 ///
14780 /// \param EllipsisLoc The location of the ellipsis.
14781 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14782 UnsignedOrNone NumExpansions);
14783
14784 /// Determine whether we could expand a pack expansion with the
14785 /// given set of parameter packs into separate arguments by repeatedly
14786 /// transforming the pattern.
14787 ///
14788 /// \param EllipsisLoc The location of the ellipsis that identifies the
14789 /// pack expansion.
14790 ///
14791 /// \param PatternRange The source range that covers the entire pattern of
14792 /// the pack expansion.
14793 ///
14794 /// \param Unexpanded The set of unexpanded parameter packs within the
14795 /// pattern.
14796 ///
14797 /// \param ShouldExpand Will be set to \c true if the transformer should
14798 /// expand the corresponding pack expansions into separate arguments. When
14799 /// set, \c NumExpansions must also be set.
14800 ///
14801 /// \param RetainExpansion Whether the caller should add an unexpanded
14802 /// pack expansion after all of the expanded arguments. This is used
14803 /// when extending explicitly-specified template argument packs per
14804 /// C++0x [temp.arg.explicit]p9.
14805 ///
14806 /// \param NumExpansions The number of separate arguments that will be in
14807 /// the expanded form of the corresponding pack expansion. This is both an
14808 /// input and an output parameter, which can be set by the caller if the
14809 /// number of expansions is known a priori (e.g., due to a prior substitution)
14810 /// and will be set by the callee when the number of expansions is known.
14811 /// The callee must set this value when \c ShouldExpand is \c true; it may
14812 /// set this value in other cases.
14813 ///
14814 /// \returns true if an error occurred (e.g., because the parameter packs
14815 /// are to be instantiated with arguments of different lengths), false
14816 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14817 /// must be set.
14819 SourceLocation EllipsisLoc, SourceRange PatternRange,
14821 const MultiLevelTemplateArgumentList &TemplateArgs,
14822 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14823 bool &RetainExpansion, UnsignedOrNone &NumExpansions,
14824 bool Diagnose = true);
14825
14826 /// Determine the number of arguments in the given pack expansion
14827 /// type.
14828 ///
14829 /// This routine assumes that the number of arguments in the expansion is
14830 /// consistent across all of the unexpanded parameter packs in its pattern.
14831 ///
14832 /// Returns an empty Optional if the type can't be expanded.
14834 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14835
14838 const MultiLevelTemplateArgumentList &TemplateArgs);
14839
14840 /// Determine whether the given declarator contains any unexpanded
14841 /// parameter packs.
14842 ///
14843 /// This routine is used by the parser to disambiguate function declarators
14844 /// with an ellipsis prior to the ')', e.g.,
14845 ///
14846 /// \code
14847 /// void f(T...);
14848 /// \endcode
14849 ///
14850 /// To determine whether we have an (unnamed) function parameter pack or
14851 /// a variadic function.
14852 ///
14853 /// \returns true if the declarator contains any unexpanded parameter packs,
14854 /// false otherwise.
14856
14857 /// Returns the pattern of the pack expansion for a template argument.
14858 ///
14859 /// \param OrigLoc The template argument to expand.
14860 ///
14861 /// \param Ellipsis Will be set to the location of the ellipsis.
14862 ///
14863 /// \param NumExpansions Will be set to the number of expansions that will
14864 /// be generated from this pack expansion, if known a priori.
14867 SourceLocation &Ellipsis,
14868 UnsignedOrNone &NumExpansions) const;
14869
14870 /// Given a template argument that contains an unexpanded parameter pack, but
14871 /// which has already been substituted, attempt to determine the number of
14872 /// elements that will be produced once this argument is fully-expanded.
14873 ///
14874 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14875 /// avoid actually expanding the pack where possible.
14877
14878 /// Called when an expression computing the size of a parameter pack
14879 /// is parsed.
14880 ///
14881 /// \code
14882 /// template<typename ...Types> struct count {
14883 /// static const unsigned value = sizeof...(Types);
14884 /// };
14885 /// \endcode
14886 ///
14887 //
14888 /// \param OpLoc The location of the "sizeof" keyword.
14889 /// \param Name The name of the parameter pack whose size will be determined.
14890 /// \param NameLoc The source location of the name of the parameter pack.
14891 /// \param RParenLoc The location of the closing parentheses.
14893 IdentifierInfo &Name,
14894 SourceLocation NameLoc,
14895 SourceLocation RParenLoc);
14896
14897 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14898 SourceLocation EllipsisLoc,
14899 SourceLocation LSquareLoc, Expr *IndexExpr,
14900 SourceLocation RSquareLoc);
14901
14902 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14903 SourceLocation EllipsisLoc, Expr *IndexExpr,
14904 SourceLocation RSquareLoc,
14905 ArrayRef<Expr *> ExpandedExprs = {},
14906 bool FullySubstituted = false);
14907
14908 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14909 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14910 tok::TokenKind Operator,
14911 SourceLocation EllipsisLoc, Expr *RHS,
14912 SourceLocation RParenLoc);
14913 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14914 SourceLocation LParenLoc, Expr *LHS,
14915 BinaryOperatorKind Operator,
14916 SourceLocation EllipsisLoc, Expr *RHS,
14917 SourceLocation RParenLoc,
14918 UnsignedOrNone NumExpansions);
14919 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14920 BinaryOperatorKind Operator);
14921
14922 ///@}
14923
14924 //
14925 //
14926 // -------------------------------------------------------------------------
14927 //
14928 //
14929
14930 /// \name Constraints and Concepts
14931 /// Implementations are in SemaConcept.cpp
14932 ///@{
14933
14934public:
14935 ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI);
14936
14937 ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc,
14938 TypeSourceInfo *TSI);
14939
14940public:
14942 const llvm::FoldingSetNodeID &ID) {
14943 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14944 SatisfactionStack.emplace_back(Can, ID);
14945 }
14946
14947 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14948
14950 const llvm::FoldingSetNodeID &ID) const {
14951 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14952 return llvm::is_contained(SatisfactionStack,
14953 SatisfactionStackEntryTy{Can, ID});
14954 }
14955
14957 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14958
14959 // Resets the current SatisfactionStack for cases where we are instantiating
14960 // constraints as a 'side effect' of normal instantiation in a way that is not
14961 // indicative of recursive definition.
14964 Sema &SemaRef;
14965
14966 public:
14968 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14969 }
14970
14972 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14973 }
14974
14978 };
14979
14982 SatisfactionStack.swap(NewSS);
14983 }
14984
14986 llvm::PointerUnion<const NamedDecl *,
14988
14989 /// Check whether the given expression is a valid constraint expression.
14990 /// A diagnostic is emitted if it is not, false is returned, and
14991 /// PossibleNonPrimary will be set to true if the failure might be due to a
14992 /// non-primary expression being used as an atomic constraint.
14993 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14994 bool *PossibleNonPrimary = nullptr,
14995 bool IsTrailingRequiresClause = false);
14996
14997 /// \brief Check whether the given list of constraint expressions are
14998 /// satisfied (as if in a 'conjunction') given template arguments.
14999 /// \param Template the template-like entity that triggered the constraints
15000 /// check (either a concept or a constrained entity).
15001 /// \param ConstraintExprs a list of constraint expressions, treated as if
15002 /// they were 'AND'ed together.
15003 /// \param TemplateArgLists the list of template arguments to substitute into
15004 /// the constraint expression.
15005 /// \param TemplateIDRange The source range of the template id that
15006 /// caused the constraints check.
15007 /// \param Satisfaction if true is returned, will contain details of the
15008 /// satisfaction, with enough information to diagnose an unsatisfied
15009 /// expression.
15010 /// \returns true if an error occurred and satisfaction could not be checked,
15011 /// false otherwise.
15014 ArrayRef<AssociatedConstraint> AssociatedConstraints,
15015 const MultiLevelTemplateArgumentList &TemplateArgLists,
15016 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
15017 const ConceptReference *TopLevelConceptId = nullptr,
15018 Expr **ConvertedExpr = nullptr);
15019
15020 /// Check whether the given function decl's trailing requires clause is
15021 /// satisfied, if any. Returns false and updates Satisfaction with the
15022 /// satisfaction verdict if successful, emits a diagnostic and returns true if
15023 /// an error occurred and satisfaction could not be determined.
15024 ///
15025 /// \returns true if an error occurred, false otherwise.
15027 ConstraintSatisfaction &Satisfaction,
15028 SourceLocation UsageLoc = SourceLocation(),
15029 bool ForOverloadResolution = false);
15030
15031 // Calculates whether two constraint expressions are equal irrespective of a
15032 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
15033 // 'New', which are the "source" of the constraint, since this is necessary
15034 // for figuring out the relative 'depth' of the constraint. The depth of the
15035 // 'primary template' and the 'instantiated from' templates aren't necessarily
15036 // the same, such as a case when one is a 'friend' defined in a class.
15038 const Expr *OldConstr,
15040 const Expr *NewConstr);
15041
15042 // Calculates whether the friend function depends on an enclosing template for
15043 // the purposes of [temp.friend] p9.
15045
15046 /// \brief Ensure that the given template arguments satisfy the constraints
15047 /// associated with the given template, emitting a diagnostic if they do not.
15048 ///
15049 /// \param Template The template to which the template arguments are being
15050 /// provided.
15051 ///
15052 /// \param TemplateArgs The converted, canonicalized template arguments.
15053 ///
15054 /// \param TemplateIDRange The source range of the template id that
15055 /// caused the constraints check.
15056 ///
15057 /// \returns true if the constrains are not satisfied or could not be checked
15058 /// for satisfaction, false if the constraints are satisfied.
15061 const MultiLevelTemplateArgumentList &TemplateArgs,
15062 SourceRange TemplateIDRange);
15063
15064 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
15066 ArrayRef<TemplateArgument> TemplateArgs,
15067 ConstraintSatisfaction &Satisfaction);
15068
15069 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15070 /// unsatisfied.
15071 /// \param First whether this is the first time an unsatisfied constraint is
15072 /// diagnosed for this error.
15074 SourceLocation Loc = {},
15075 bool First = true);
15076
15077 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15078 /// unsatisfied.
15079 void
15081 bool First = true);
15082
15085 ArrayRef<AssociatedConstraint> AssociatedConstraints);
15086
15087 /// \brief Check whether the given declaration's associated constraints are
15088 /// at least as constrained than another declaration's according to the
15089 /// partial ordering of constraints.
15090 ///
15091 /// \param Result If no error occurred, receives the result of true if D1 is
15092 /// at least constrained than D2, and false otherwise.
15093 ///
15094 /// \returns true if an error occurred, false otherwise.
15095 bool IsAtLeastAsConstrained(const NamedDecl *D1,
15097 const NamedDecl *D2,
15099 bool &Result);
15100
15101 /// If D1 was not at least as constrained as D2, but would've been if a pair
15102 /// of atomic constraints involved had been declared in a concept and not
15103 /// repeated in two separate places in code.
15104 /// \returns true if such a diagnostic was emitted, false otherwise.
15108
15109 /// Cache the satisfaction of an atomic constraint.
15110 /// The key is based on the unsubstituted expression and the parameter
15111 /// mapping. This lets us not substituting the mapping more than once,
15112 /// which is (very!) expensive.
15113 /// FIXME: this should be private.
15114 llvm::DenseMap<llvm::FoldingSetNodeID,
15117
15118 /// Cache the instantiation results of template parameter mappings within
15119 /// concepts. Substituting into normalized concepts can be extremely expensive
15120 /// due to the redundancy of template parameters. This cache is intended for
15121 /// use by TemplateInstantiator to avoid redundant semantic checking.
15122 llvm::DenseMap<llvm::FoldingSetNodeID, TemplateArgumentLoc>
15124
15125private:
15126 /// Caches pairs of template-like decls whose associated constraints were
15127 /// checked for subsumption and whether or not the first's constraints did in
15128 /// fact subsume the second's.
15129 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
15130 SubsumptionCache;
15131 /// Caches the normalized associated constraints of declarations (concepts or
15132 /// constrained declarations). If an error occurred while normalizing the
15133 /// associated constraints of the template or concept, nullptr will be cached
15134 /// here.
15135 llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
15136 NormalizationCache;
15137
15138 /// Cache whether the associated constraint of a declaration
15139 /// is satisfied.
15140 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
15141 SatisfactionCache;
15142
15143 // The current stack of constraint satisfactions, so we can exit-early.
15145
15146 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
15147 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
15148 /// use LambdaScopeForCallOperatorInstantiationRAII.
15149 bool
15150 SetupConstraintScope(FunctionDecl *FD,
15151 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15152 const MultiLevelTemplateArgumentList &MLTAL,
15154
15155 /// Used during constraint checking, sets up the constraint template argument
15156 /// lists, and calls SetupConstraintScope to set up the
15157 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
15158 std::optional<MultiLevelTemplateArgumentList>
15159 SetupConstraintCheckingTemplateArgumentsAndScope(
15160 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15162
15163 ///@}
15164
15165 //
15166 //
15167 // -------------------------------------------------------------------------
15168 //
15169 //
15170
15171 /// \name Types
15172 /// Implementations are in SemaType.cpp
15173 ///@{
15174
15175public:
15176 /// A mapping that describes the nullability we've seen in each header file.
15178
15179 static int getPrintable(int I) { return I; }
15180 static unsigned getPrintable(unsigned I) { return I; }
15181 static bool getPrintable(bool B) { return B; }
15182 static const char *getPrintable(const char *S) { return S; }
15183 static StringRef getPrintable(StringRef S) { return S; }
15184 static const std::string &getPrintable(const std::string &S) { return S; }
15185 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
15186 return II;
15187 }
15189 static QualType getPrintable(QualType T) { return T; }
15190 static SourceRange getPrintable(SourceRange R) { return R; }
15192 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
15194
15195 enum class CompleteTypeKind {
15196 /// Apply the normal rules for complete types. In particular,
15197 /// treat all sizeless types as incomplete.
15199
15200 /// Relax the normal rules for complete types so that they include
15201 /// sizeless built-in types.
15203
15204 // FIXME: Eventually we should flip the default to Normal and opt in
15205 // to AcceptSizeless rather than opt out of it.
15207 };
15208
15210 const DeclSpec *DS = nullptr);
15211 QualType BuildQualifiedType(QualType T, SourceLocation Loc, unsigned CVRA,
15212 const DeclSpec *DS = nullptr);
15213
15214 /// Build a pointer type.
15215 ///
15216 /// \param T The type to which we'll be building a pointer.
15217 ///
15218 /// \param Loc The location of the entity whose type involves this
15219 /// pointer type or, if there is no such entity, the location of the
15220 /// type that will have pointer type.
15221 ///
15222 /// \param Entity The name of the entity that involves the pointer
15223 /// type, if known.
15224 ///
15225 /// \returns A suitable pointer type, if there are no
15226 /// errors. Otherwise, returns a NULL type.
15228 DeclarationName Entity);
15229
15230 /// Build a reference type.
15231 ///
15232 /// \param T The type to which we'll be building a reference.
15233 ///
15234 /// \param Loc The location of the entity whose type involves this
15235 /// reference type or, if there is no such entity, the location of the
15236 /// type that will have reference type.
15237 ///
15238 /// \param Entity The name of the entity that involves the reference
15239 /// type, if known.
15240 ///
15241 /// \returns A suitable reference type, if there are no
15242 /// errors. Otherwise, returns a NULL type.
15243 QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc,
15244 DeclarationName Entity);
15245
15246 /// Build an array type.
15247 ///
15248 /// \param T The type of each element in the array.
15249 ///
15250 /// \param ASM C99 array size modifier (e.g., '*', 'static').
15251 ///
15252 /// \param ArraySize Expression describing the size of the array.
15253 ///
15254 /// \param Brackets The range from the opening '[' to the closing ']'.
15255 ///
15256 /// \param Entity The name of the entity that involves the array
15257 /// type, if known.
15258 ///
15259 /// \returns A suitable array type, if there are no errors. Otherwise,
15260 /// returns a NULL type.
15262 unsigned Quals, SourceRange Brackets,
15263 DeclarationName Entity);
15264 QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc);
15265
15266 /// Build an ext-vector type.
15267 ///
15268 /// Run the required checks for the extended vector type.
15270 SourceLocation AttrLoc);
15271 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
15272 SourceLocation AttrLoc);
15273
15275 Expr *CountExpr,
15276 bool CountInBytes,
15277 bool OrNull);
15278
15279 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15280 /// expression is uninstantiated. If instantiated it will apply the
15281 /// appropriate address space to the type. This function allows dependent
15282 /// template variables to be used in conjunction with the address_space
15283 /// attribute
15284 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15285 SourceLocation AttrLoc);
15286
15287 /// Same as above, but constructs the AddressSpace index if not provided.
15289 SourceLocation AttrLoc);
15290
15292
15294
15295 /// Build a function type.
15296 ///
15297 /// This routine checks the function type according to C++ rules and
15298 /// under the assumption that the result type and parameter types have
15299 /// just been instantiated from a template. It therefore duplicates
15300 /// some of the behavior of GetTypeForDeclarator, but in a much
15301 /// simpler form that is only suitable for this narrow use case.
15302 ///
15303 /// \param T The return type of the function.
15304 ///
15305 /// \param ParamTypes The parameter types of the function. This array
15306 /// will be modified to account for adjustments to the types of the
15307 /// function parameters.
15308 ///
15309 /// \param Loc The location of the entity whose type involves this
15310 /// function type or, if there is no such entity, the location of the
15311 /// type that will have function type.
15312 ///
15313 /// \param Entity The name of the entity that involves the function
15314 /// type, if known.
15315 ///
15316 /// \param EPI Extra information about the function type. Usually this will
15317 /// be taken from an existing function with the same prototype.
15318 ///
15319 /// \returns A suitable function type, if there are no errors. The
15320 /// unqualified type will always be a FunctionProtoType.
15321 /// Otherwise, returns a NULL type.
15323 SourceLocation Loc, DeclarationName Entity,
15325
15326 /// Build a member pointer type \c T Class::*.
15327 ///
15328 /// \param T the type to which the member pointer refers.
15329 /// \param Class the class type into which the member pointer points.
15330 /// \param Loc the location where this type begins
15331 /// \param Entity the name of the entity that will have this member pointer
15332 /// type
15333 ///
15334 /// \returns a member pointer type, if successful, or a NULL type if there was
15335 /// an error.
15337 CXXRecordDecl *Cls, SourceLocation Loc,
15338 DeclarationName Entity);
15339
15340 /// Build a block pointer type.
15341 ///
15342 /// \param T The type to which we'll be building a block pointer.
15343 ///
15344 /// \param Loc The source location, used for diagnostics.
15345 ///
15346 /// \param Entity The name of the entity that involves the block pointer
15347 /// type, if known.
15348 ///
15349 /// \returns A suitable block pointer type, if there are no
15350 /// errors. Otherwise, returns a NULL type.
15352 DeclarationName Entity);
15353
15354 /// Build a paren type including \p T.
15357
15358 /// Build a Read-only Pipe type.
15359 ///
15360 /// \param T The type to which we'll be building a Pipe.
15361 ///
15362 /// \param Loc We do not use it for now.
15363 ///
15364 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15365 /// a NULL type.
15367
15368 /// Build a Write-only Pipe type.
15369 ///
15370 /// \param T The type to which we'll be building a Pipe.
15371 ///
15372 /// \param Loc We do not use it for now.
15373 ///
15374 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15375 /// a NULL type.
15377
15378 /// Build a bit-precise integer type.
15379 ///
15380 /// \param IsUnsigned Boolean representing the signedness of the type.
15381 ///
15382 /// \param BitWidth Size of this int type in bits, or an expression
15383 /// representing that.
15384 ///
15385 /// \param Loc Location of the keyword.
15386 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15387
15388 /// GetTypeForDeclarator - Convert the type for the specified
15389 /// declarator to Type instances.
15390 ///
15391 /// The result of this call will never be null, but the associated
15392 /// type may be a null type if there's an unrecoverable error.
15395
15396 /// Package the given type and TSI into a ParsedType.
15399 TypeSourceInfo **TInfo = nullptr);
15400
15402
15403 // Check whether the size of array element of type \p EltTy is a multiple of
15404 // its alignment and return false if it isn't.
15406
15407 void
15408 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15409 SourceLocation FallbackLoc,
15410 SourceLocation ConstQualLoc = SourceLocation(),
15411 SourceLocation VolatileQualLoc = SourceLocation(),
15412 SourceLocation RestrictQualLoc = SourceLocation(),
15413 SourceLocation AtomicQualLoc = SourceLocation(),
15414 SourceLocation UnalignedQualLoc = SourceLocation());
15415
15416 /// Retrieve the keyword associated
15418
15419 /// Adjust the calling convention of a method to be the ABI default if it
15420 /// wasn't specified explicitly. This handles method types formed from
15421 /// function type typedefs and typename template arguments.
15422 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15423 bool IsCtorOrDtor, SourceLocation Loc);
15424
15425 // Check if there is an explicit attribute, but only look through parens.
15426 // The intent is to look for an attribute on the current declarator, but not
15427 // one that came from a typedef.
15429
15430 /// Check whether a nullability type specifier can be added to the given
15431 /// type through some means not written in source (e.g. API notes).
15432 ///
15433 /// \param Type The type to which the nullability specifier will be
15434 /// added. On success, this type will be updated appropriately.
15435 ///
15436 /// \param Nullability The nullability specifier to add.
15437 ///
15438 /// \param DiagLoc The location to use for diagnostics.
15439 ///
15440 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15441 /// array type (e.g., because it will decay to a pointer).
15442 ///
15443 /// \param OverrideExisting Whether to override an existing, locally-specified
15444 /// nullability specifier rather than complaining about the conflict.
15445 ///
15446 /// \returns true if nullability cannot be applied, false otherwise.
15448 NullabilityKind Nullability,
15449 SourceLocation DiagLoc,
15450 bool AllowArrayTypes,
15451 bool OverrideExisting);
15452
15453 /// Check whether the given variable declaration has a size that fits within
15454 /// the address space it is declared in. This issues a diagnostic if not.
15455 ///
15456 /// \param VD The variable declaration to check the size of.
15457 ///
15458 /// \param AS The address space to check the size of \p VD against.
15459 ///
15460 /// \returns true if the variable's size fits within the address space, false
15461 /// otherwise.
15462 bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS);
15463
15464 /// Get the type of expression E, triggering instantiation to complete the
15465 /// type if necessary -- that is, if the expression refers to a templated
15466 /// static data member of incomplete array type.
15467 ///
15468 /// May still return an incomplete type if instantiation was not possible or
15469 /// if the type is incomplete for a different reason. Use
15470 /// RequireCompleteExprType instead if a diagnostic is expected for an
15471 /// incomplete expression type.
15473
15475
15476 /// Ensure that the type of the given expression is complete.
15477 ///
15478 /// This routine checks whether the expression \p E has a complete type. If
15479 /// the expression refers to an instantiable construct, that instantiation is
15480 /// performed as needed to complete its type. Furthermore
15481 /// Sema::RequireCompleteType is called for the expression's type (or in the
15482 /// case of a reference type, the referred-to type).
15483 ///
15484 /// \param E The expression whose type is required to be complete.
15485 /// \param Kind Selects which completeness rules should be applied.
15486 /// \param Diagnoser The object that will emit a diagnostic if the type is
15487 /// incomplete.
15488 ///
15489 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15490 /// otherwise.
15492 TypeDiagnoser &Diagnoser);
15493 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15494
15495 template <typename... Ts>
15496 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15497 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15499 }
15500
15501 // Returns the underlying type of a decltype with the given expression.
15503
15505 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15506 /// context, such as when building a type for decltype(auto).
15507 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15508
15509 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15510 SourceLocation Loc,
15511 SourceLocation EllipsisLoc);
15512 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15513 SourceLocation Loc, SourceLocation EllipsisLoc,
15514 bool FullySubstituted = false,
15515 ArrayRef<QualType> Expansions = {});
15516
15517 using UTTKind = UnaryTransformType::UTTKind;
15519 SourceLocation Loc);
15525 SourceLocation Loc);
15527 SourceLocation Loc);
15529 SourceLocation Loc);
15530
15532 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15533 }
15534
15536 SourceLocation Loc);
15538 SourceLocation Loc);
15539
15540 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15541
15542 /// Ensure that the type T is a literal type.
15543 ///
15544 /// This routine checks whether the type @p T is a literal type. If @p T is an
15545 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15546 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15547 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15548 /// it the type @p T), along with notes explaining why the type is not a
15549 /// literal type, and returns true.
15550 ///
15551 /// @param Loc The location in the source that the non-literal type
15552 /// diagnostic should refer to.
15553 ///
15554 /// @param T The type that this routine is examining for literalness.
15555 ///
15556 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15557 ///
15558 /// @returns @c true if @p T is not a literal type and a diagnostic was
15559 /// emitted, @c false otherwise.
15561 TypeDiagnoser &Diagnoser);
15562 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15563
15564 template <typename... Ts>
15565 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15566 const Ts &...Args) {
15567 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15568 return RequireLiteralType(Loc, T, Diagnoser);
15569 }
15570
15573 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15574 }
15575
15576 /// Ensure that the type T is a complete type.
15577 ///
15578 /// This routine checks whether the type @p T is complete in any
15579 /// context where a complete type is required. If @p T is a complete
15580 /// type, returns false. If @p T is a class template specialization,
15581 /// this routine then attempts to perform class template
15582 /// instantiation. If instantiation fails, or if @p T is incomplete
15583 /// and cannot be completed, issues the diagnostic @p diag (giving it
15584 /// the type @p T) and returns true.
15585 ///
15586 /// @param Loc The location in the source that the incomplete type
15587 /// diagnostic should refer to.
15588 ///
15589 /// @param T The type that this routine is examining for completeness.
15590 ///
15591 /// @param Kind Selects which completeness rules should be applied.
15592 ///
15593 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15594 /// @c false otherwise.
15596 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15598 CompleteTypeKind Kind, unsigned DiagID);
15599
15601 TypeDiagnoser &Diagnoser) {
15602 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15603 }
15604 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15605 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15606 }
15607
15608 template <typename... Ts>
15609 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15610 const Ts &...Args) {
15611 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15612 return RequireCompleteType(Loc, T, Diagnoser);
15613 }
15614
15615 /// Determine whether a declaration is visible to name lookup.
15616 bool isVisible(const NamedDecl *D) {
15617 return D->isUnconditionallyVisible() ||
15618 isAcceptableSlow(D, AcceptableKind::Visible);
15619 }
15620
15621 /// Determine whether a declaration is reachable.
15622 bool isReachable(const NamedDecl *D) {
15623 // All visible declarations are reachable.
15624 return D->isUnconditionallyVisible() ||
15625 isAcceptableSlow(D, AcceptableKind::Reachable);
15626 }
15627
15628 /// Determine whether a declaration is acceptable (visible/reachable).
15630 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15631 }
15632
15633 /// Determine if \p D and \p Suggested have a structurally compatible
15634 /// layout as described in C11 6.2.7/1.
15635 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15636
15637 /// Determine if \p D has a visible definition. If not, suggest a declaration
15638 /// that should be made visible to expose the definition.
15639 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15640 bool OnlyNeedComplete = false);
15642 NamedDecl *Hidden;
15643 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15644 }
15645 /// Determine if \p D has a definition which allows we redefine it in current
15646 /// TU. \p Suggested is the definition that should be made visible to expose
15647 /// the definition.
15648 bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested,
15649 bool &Visible);
15651 NamedDecl *Hidden;
15652 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), &Hidden,
15653 Visible);
15654 }
15655
15656 /// Determine if \p D has a reachable definition. If not, suggest a
15657 /// declaration that should be made reachable to expose the definition.
15658 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15659 bool OnlyNeedComplete = false);
15661 NamedDecl *Hidden;
15662 return hasReachableDefinition(D, &Hidden);
15663 }
15664
15665 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15666 AcceptableKind Kind,
15667 bool OnlyNeedComplete = false);
15669 NamedDecl *Hidden;
15670 return hasAcceptableDefinition(D, &Hidden, Kind);
15671 }
15672
15673 /// Try to parse the conditional expression attached to an effect attribute
15674 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15675 /// optional on error.
15676 std::optional<FunctionEffectMode>
15677 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15678
15679 void ActOnCleanupAttr(Decl *D, const Attr *A);
15680 void ActOnInitPriorityAttr(Decl *D, const Attr *A);
15681
15682private:
15683 /// The implementation of RequireCompleteType
15684 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15685 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15686
15687 /// Nullability type specifiers.
15688 IdentifierInfo *Ident__Nonnull = nullptr;
15689 IdentifierInfo *Ident__Nullable = nullptr;
15690 IdentifierInfo *Ident__Nullable_result = nullptr;
15691 IdentifierInfo *Ident__Null_unspecified = nullptr;
15692
15693 ///@}
15694
15695 //
15696 //
15697 // -------------------------------------------------------------------------
15698 //
15699 //
15700
15701 /// \name FixIt Helpers
15702 /// Implementations are in SemaFixItUtils.cpp
15703 ///@{
15704
15705public:
15706 /// Get a string to suggest for zero-initialization of a type.
15708 SourceLocation Loc) const;
15709 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15710
15711 ///@}
15712
15713 //
15714 //
15715 // -------------------------------------------------------------------------
15716 //
15717 //
15718
15719 /// \name Function Effects
15720 /// Implementations are in SemaFunctionEffects.cpp
15721 ///@{
15722public:
15725
15728 std::optional<FunctionEffectWithCondition>
15729 Old; // Invalid when 'Kind' is 'Added'.
15730 std::optional<FunctionEffectWithCondition>
15731 New; // Invalid when 'Kind' is 'Removed'.
15732
15733 StringRef effectName() const {
15734 if (Old)
15735 return Old.value().Effect.name();
15736 return New.value().Effect.name();
15737 }
15738
15739 /// Describes the result of effects differing between a base class's virtual
15740 /// method and an overriding method in a subclass.
15741 enum class OverrideResult {
15744 Merge // Merge missing effect from base to derived.
15745 };
15746
15747 /// Return true if adding or removing the effect as part of a type
15748 /// conversion should generate a diagnostic.
15750 const FunctionEffectsRef &SrcFX,
15751 QualType DstType,
15752 const FunctionEffectsRef &DstFX) const;
15753
15754 /// Return true if adding or removing the effect in a redeclaration should
15755 /// generate a diagnostic.
15756 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15757 const FunctionEffectsRef &OldFX,
15758 const FunctionDecl &NewFunction,
15759 const FunctionEffectsRef &NewFX) const;
15760
15761 /// Return true if adding or removing the effect in a C++ virtual method
15762 /// override should generate a diagnostic.
15764 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15765 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15766 };
15767
15768 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15769 /// Caller should short-circuit by checking for equality first.
15771 const FunctionEffectsRef &New);
15772 };
15773
15774 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15775 /// FunctionEffectsRef to be verified.
15777
15778 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15779 /// are all null.
15781
15782public:
15783 /// Warn and return true if adding a function effect to a set would create a
15784 /// conflict.
15787 SourceLocation NewAttrLoc);
15788
15789 // Report a failure to merge function effects between declarations due to a
15790 // conflict.
15791 void
15793 SourceLocation NewLoc,
15794 SourceLocation OldLoc);
15795
15796 /// Inline checks from the start of maybeAddDeclWithEffects, to
15797 /// minimize performance impact on code not using effects.
15798 template <class FuncOrBlockDecl>
15799 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15800 if (Context.hasAnyFunctionEffects())
15801 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15803 }
15804
15805 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15806 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15807
15808 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15809 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15810
15812
15813 ///@}
15814};
15815
15816DeductionFailureInfo
15818 sema::TemplateDeductionInfo &Info);
15819
15820/// Contains a late templated function.
15821/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15824 /// The template function declaration to be late parsed.
15826 /// Floating-point options in the point of definition.
15828};
15829
15830template <>
15832 PragmaMsStackAction Action,
15833 llvm::StringRef StackSlotLabel,
15835
15836} // end namespace clang
15837
15838#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.
llvm::json::Object Object
AccessResult
A copy of Sema's enum without AR_delayed.
CastType
Definition SemaCast.cpp:50
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:4866
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:3175
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:428
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:3772
Attr - This represents one attribute.
Definition Attr.h:46
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3512
A binding in a decomposition declaration.
Definition DeclCXX.h:4201
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4689
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:2624
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2959
Represents a C++ base or member initializer.
Definition DeclCXX.h:2389
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2630
Represents a C++ destructor within a class.
Definition DeclCXX.h:2889
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:1158
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:4961
CaseStmt - Represent a case statement.
Definition Stmt.h:1926
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:3693
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:1395
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1462
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:867
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:850
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:991
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:4265
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:333
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:233
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3438
Represents an enum.
Definition Decl.h:4028
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:3175
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:2015
A mutable set of FunctionEffect::Kind.
Definition TypeBase.h:5211
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5325
Kind
Identifies the particular effect.
Definition TypeBase.h:4973
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5157
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition ExprCXX.h:4841
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5357
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4579
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4553
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:3482
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:371
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4414
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4360
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:4920
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:3703
Abstract interface for a module loader.
Describes a module or submodule.
Definition Module.h:246
bool isModulePartitionImplementation() const
Is this a module partition implementation unit.
Definition Module.h:765
Module(ModuleConstructorTag, StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit, unsigned VisibilityID)
Construct a new module or submodule.
Definition Module.cpp:56
bool isModuleImplementation() const
Is this a module implementation.
Definition Module.h:770
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:8049
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:1805
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:2698
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:4342
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:1873
bool operator==(const AlignPackInfo &Info) const
Definition Sema.h:1933
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1905
unsigned getPackNumber() const
Definition Sema.h:1923
bool IsXLStack() const
Definition Sema.h:1931
bool IsPackSet() const
Definition Sema.h:1925
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition Sema.h:1879
bool IsAlignAttr() const
Definition Sema.h:1919
bool IsPackAttr() const
Definition Sema.h:1917
bool operator!=(const AlignPackInfo &Info) const
Definition Sema.h:1939
AlignPackInfo(bool IsXL)
Definition Sema.h:1883
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition Sema.h:1890
Mode getAlignMode() const
Definition Sema.h:1921
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition Sema.h:13760
ArgPackSubstIndexRAII & operator=(const ArgPackSubstIndexRAII &)=delete
ArgPackSubstIndexRAII(const ArgPackSubstIndexRAII &)=delete
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8363
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8368
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8355
std::tuple< const Ts &... > Args
Definition Sema.h:8352
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:1317
CompoundScopeRAII(const CompoundScopeRAII &)=delete
std::pair< VarDecl *, Expr * > get() const
Definition Sema.h:7902
std::optional< bool > getKnownValue() const
Definition Sema.h:7906
A RAII object to temporarily push a declaration context.
Definition Sema.h:3526
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3536
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:10404
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:10409
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:6467
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition Sema.h:6444
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition Sema.h:6472
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition Sema.h:6447
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6464
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition Sema.h:10132
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:1386
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition Sema.h:1405
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition Sema.h:1429
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition Sema.h:1398
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1401
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:1415
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition Sema.h:1421
A helper class for building up ExtParameterInfos.
Definition Sema.h:13119
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:13138
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:13126
FPOptionsOverride getOverrides()
Definition Sema.h:14164
FpPragmaStackSaveRAII(const FpPragmaStackSaveRAII &)=delete
FpPragmaStackSaveRAII & operator=(const FpPragmaStackSaveRAII &)=delete
FullExprArg(Sema &actions)
Definition Sema.h:7846
ExprResult release()
Definition Sema.h:7848
friend class Sema
Definition Sema.h:7857
Expr * get() const
Definition Sema.h:7850
GlobalEagerInstantiationScope(const GlobalEagerInstantiationScope &)=delete
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:14176
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:10468
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:10460
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5566
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5559
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5569
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:5575
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5582
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:14129
LocalEagerInstantiationScope(const LocalEagerInstantiationScope &)=delete
static NameClassification DependentNonType()
Definition Sema.h:3746
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3756
ExprResult getExpression() const
Definition Sema.h:3782
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3719
static NameClassification Unknown()
Definition Sema.h:3726
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3730
NameClassificationKind getKind() const
Definition Sema.h:3780
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3774
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3762
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3792
NameClassification(ParsedType Type)
Definition Sema.h:3716
TemplateName getTemplateName() const
Definition Sema.h:3797
ParsedType getType() const
Definition Sema.h:3787
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3806
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3736
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3768
static NameClassification UndeclaredNonType()
Definition Sema.h:3742
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3750
static NameClassification Error()
Definition Sema.h:3722
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2555
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:11498
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11500
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11495
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12551
SFINAETrap & operator=(const SFINAETrap &)=delete
SFINAETrap(const SFINAETrap &)=delete
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12585
SFINAETrap(Sema &S, bool WithAccessChecking=false)
Definition Sema.h:12567
bool withAccessChecking() const
Definition Sema.h:12588
sema::TemplateDeductionInfo * getDeductionInfo() const
Definition Sema.h:12580
SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info)
Definition Sema.h:12570
SatisfactionStackResetRAII(const SatisfactionStackResetRAII &)=delete
SatisfactionStackResetRAII & operator=(const SatisfactionStackResetRAII &)=delete
ScopedCodeSynthesisContext(Sema &S, const CodeSynthesisContext &Ctx)
Definition Sema.h:13682
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition Sema.h:8380
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8385
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8382
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition Sema.h:9395
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9382
CXXMethodDecl * getMethod() const
Definition Sema.h:9385
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9386
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13648
SynthesizedFunctionScope(const SynthesizedFunctionScope &)=delete
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13636
SynthesizedFunctionScope & operator=(const SynthesizedFunctionScope &)=delete
SourceLocation getLocation() const
Definition Sema.h:12309
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12299
const DeclContext * getDeclContext() const
Definition Sema.h:12305
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12283
const NamedDecl * getDecl() const
Definition Sema.h:12297
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12282
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12301
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12602
TentativeAnalysisScope & operator=(const TentativeAnalysisScope &)=delete
TentativeAnalysisScope(const TentativeAnalysisScope &)=delete
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7805
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:1448
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:3624
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:13710
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:8285
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:546
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13694
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:11052
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13148
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2628
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:1141
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:1591
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:14114
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6635
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:10145
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1087
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:6624
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:8335
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:8253
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:955
bool isAttrContext() const
Definition Sema.h:7031
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:8328
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2728
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6386
LookupNameKind
Describes the kind of name lookup to perform.
Definition Sema.h:9411
@ LookupLabel
Label name lookup.
Definition Sema.h:9420
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9415
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9442
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9434
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9456
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9450
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9452
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9447
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9427
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9454
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9438
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9423
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9430
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9418
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9458
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9460
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:416
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition Sema.h:9361
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition Sema.h:4949
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15517
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:671
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:6323
SemaM68k & M68k()
Definition Sema.h:1498
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:13772
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:1381
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:2141
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:9849
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:4894
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:5121
OpaquePtr< QualType > TypeTy
Definition Sema.h:1301
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:366
void PrintContextStack()
Definition Sema.h:13781
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:1533
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition Sema.h:9360
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:2316
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6361
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9725
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:1369
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:3581
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:15185
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:1262
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:4796
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:3606
PragmaClangSection PragmaClangRodataSection
Definition Sema.h:1845
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:15641
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, const IdentifierInfo *InferredPlatformII=nullptr)
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:6597
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:5220
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1187
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:6578
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:1251
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:1473
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:372
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7922
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7924
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7923
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition Sema.h:1350
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:15600
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:15191
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:8273
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:9963
@ Interface
'export module X;'
Definition Sema.h:9960
@ Implementation
'module X;'
Definition Sema.h:9961
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9962
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8415
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1244
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:9672
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10487
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10490
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10496
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10494
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
Definition SemaAttr.cpp:318
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:1803
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
@ AR_dependent
Definition Sema.h:1688
@ AR_accessible
Definition Sema.h:1686
@ AR_inaccessible
Definition Sema.h:1687
@ AR_delayed
Definition Sema.h:1689
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:15198
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:15202
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:7009
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2400
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:439
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:8404
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2076
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:8316
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition Sema.h:15192
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2070
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:15780
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2581
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:4954
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:2150
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:6838
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:663
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:2065
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:11217
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:2680
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:4197
@ Default
= default ;
Definition Sema.h:4199
@ Delete
deleted-function-body
Definition Sema.h:4205
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:14076
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:1266
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:2077
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:1488
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:890
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...
PersonalityAttr * mergePersonalityAttr(Decl *D, FunctionDecl *Routine, const AttributeCommonInfo &CI)
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:15116
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:173
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:1558
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:2955
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:7021
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:1725
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:706
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition SemaExpr.cpp:838
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11463
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:12061
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:12072
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:12064
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:12068
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:689
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:760
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:9355
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:
AvailabilityAttr * mergeAndInferAvailabilityAttr(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, const IdentifierInfo *InferredPlatformII)
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition Sema.h:1578
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:13714
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:1308
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:8240
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:686
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:9366
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7867
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:226
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:978
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:2358
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:4423
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15565
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
void resetFPOptions(FPOptions FPO)
Definition Sema.h:11444
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15668
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:9946
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:15181
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
SemaObjC & ObjC()
Definition Sema.h:1518
bool InOverflowBehaviorAssignmentContext
Track if we're currently analyzing overflow behavior types in assignment context.
Definition Sema.h:1373
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:2910
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:1443
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:81
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:942
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3199
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition Sema.h:1669
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:2073
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition Sema.h:13785
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:3614
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:759
bool isImmediateFunctionContext() const
Definition Sema.h:8265
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:1081
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:661
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition SemaExpr.cpp:769
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:6604
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:1435
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:6688
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:2069
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:762
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition SemaAttr.cpp:377
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:888
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:713
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition Sema.h:2637
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:6631
@ FRS_Success
Definition Sema.h:10875
@ FRS_DiagnosticIssued
Definition Sema.h:10877
@ FRS_NoViableFunction
Definition Sema.h:10876
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:14247
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:989
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition Sema.h:9408
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:9358
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:6156
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
Definition Sema.h:6170
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
Definition Sema.h:6167
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
Definition Sema.h:6164
@ None
This is not a defaultable comparison operator.
Definition Sema.h:6158
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
Definition Sema.h:6161
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:9097
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:15776
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10196
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10198
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:1234
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6619
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:1212
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:14985
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:679
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition Sema.h:3637
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:1730
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:2671
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition Sema.h:3523
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:2591
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:12241
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12259
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12249
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12269
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:4945
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:1744
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:8446
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition SemaAttr.cpp:432
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:11513
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11520
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11517
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:838
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:2744
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2419
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:427
SourceRange getExprRange(Expr *E) const
Definition SemaExpr.cpp:511
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:11449
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:3610
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8300
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:15188
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4634
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:1589
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:8398
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:273
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:84
sema::LambdaScopeInfo * PushLambdaScope()
Definition Sema.cpp:2437
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:2570
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15609
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:14506
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14526
@ UPPC_RequiresClause
Definition Sema.h:14577
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14532
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14559
@ UPPC_Requirement
Definition Sema.h:14574
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14550
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14529
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14565
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14562
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14556
@ UPPC_Initializer
An initializer.
Definition Sema.h:14541
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14511
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14535
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14544
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14514
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14508
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14553
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14538
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14517
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14523
@ UPPC_Block
Block expression.
Definition Sema.h:14568
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14520
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14547
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14571
api_notes::APINotesManager APINotes
Definition Sema.h:1312
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:12621
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:13162
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:5935
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:2531
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:2112
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:767
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1468
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
Definition SemaAttr.cpp:238
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:3631
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:1523
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition Sema.h:14980
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:7100
@ ReuseLambdaContextDecl
Definition Sema.h:7100
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:1463
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:1352
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:1307
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:2159
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:1347
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition Sema.h:2137
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:2209
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:3618
SemaDirectX & DirectX()
Definition Sema.h:1478
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition Sema.h:6580
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:1508
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:1590
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:1306
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:1240
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2646
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:1235
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition Sema.h:9100
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:957
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:416
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15622
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:6582
SemaHLSL & HLSL()
Definition Sema.h:1483
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:11462
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1238
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9407
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:1206
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:7015
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:1846
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition Sema.h:1503
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition Sema.cpp:140
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:1548
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:15799
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition Sema.h:1835
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:5941
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:215
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:5315
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5318
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5322
MemberPointerConversionDirection
Definition Sema.h:10328
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14112
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6575
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:77
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:2810
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:15183
SemaSwift & Swift()
Definition Sema.h:1563
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:2058
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:6680
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7045
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition Sema.h:13741
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6612
StmtResult ActOnExprStmtError()
Definition SemaStmt.cpp:65
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2068
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:1145
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition Sema.h:1361
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:2115
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:1737
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:912
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:1303
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:11867
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:14116
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:2162
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:869
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:4811
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:10515
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:15177
ProcessingContextState ParsingClassState
Definition Sema.h:6630
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:1341
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:2565
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:2999
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:3883
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition Sema.h:2717
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:15531
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
llvm::DenseMap< llvm::FoldingSetNodeID, TemplateArgumentLoc > * CurrentCachedTemplateArgs
Cache the instantiation results of template parameter mappings within concepts.
Definition Sema.h:15123
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:7042
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:2383
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:11862
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:13160
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:4905
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:5931
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:644
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:15616
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8269
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2111
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9941
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:2572
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:8136
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:2601
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:7057
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:6589
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:1446
auto getDefaultDiagFunc()
Definition Sema.h:2318
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:315
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:12622
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6608
SemaOpenCL & OpenCL()
Definition Sema.h:1528
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:14125
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:659
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition Sema.h:2242
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:933
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:15193
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:2647
@ FAPK_Elsewhere
Definition Sema.h:2651
@ FAPK_Fixed
Definition Sema.h:2648
@ FAPK_Variadic
Definition Sema.h:2649
@ FAPK_VAList
Definition Sema.h:2650
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:8261
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:13151
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1705
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:15629
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:14956
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:8457
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:3628
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6841
bool MSStructPragmaOn
Definition Sema.h:1832
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:13725
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:14060
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15604
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:8528
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:4883
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:636
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:3577
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:972
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:702
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:12341
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:2330
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:9401
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:593
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:14065
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:6051
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:1847
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:7555
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:4136
@ NTCUK_Destruct
Definition Sema.h:4138
@ NTCUK_Init
Definition Sema.h:4137
@ NTCUK_Copy
Definition Sema.h:4139
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:1382
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:8414
PragmaClangSection PragmaClangDataSection
Definition Sema.h:1844
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:9196
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:2431
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:2057
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:6839
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:1248
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2118
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool isSFINAEContext() const
Definition Sema.h:13793
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8881
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:15190
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:13749
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:14941
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:15571
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition Sema.h:1151
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:2961
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:2101
void setFunctionHasMustTail()
Definition Sema.cpp:2596
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:8453
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:14947
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:2586
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition Sema.h:15660
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:2639
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6600
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:641
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:1200
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:1587
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:11323
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:3602
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:276
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:1584
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:1309
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:4697
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition Sema.h:2220
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:7049
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:125
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1346
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:1851
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:14108
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:9969
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9976
@ ImportFinished
after any non-import decl.
Definition Sema.h:9973
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9974
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9970
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9971
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9978
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9972
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:15189
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:110
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition Sema.h:1269
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:6783
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6805
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6795
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6810
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6800
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6820
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6789
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6815
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6830
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:13733
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:4859
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
Definition Sema.h:4873
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4865
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4869
@ AP_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
Definition Sema.h:4878
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4862
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:988
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:14070
SemaPPC & PPC()
Definition Sema.h:1538
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:2444
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:4942
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:1267
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:14949
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:1351
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:8464
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:3621
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:10124
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:8251
SemaSystemZ & SystemZ()
Definition Sema.h:1568
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:124
bool isRedefinitionAllowedFor(const NamedDecl *D, bool &Visible)
Definition Sema.h:15650
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:2983
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:8401
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:10320
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:9955
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:1311
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:11490
@ TemplateNameIsRequired
Definition Sema.h:11490
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:788
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:481
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:6593
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:1310
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:632
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7871
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:933
FPOptions CurFPFeatures
Definition Sema.h:1304
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:1354
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6584
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)
void LoadExternalExtnameUndeclaredIdentifiers()
Load pragma redefine_extname'd undeclared identifiers from the external source.
Definition Sema.cpp:1097
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:520
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2067
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:3022
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:11673
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11683
@ TPC_FriendFunctionTemplate
Definition Sema.h:11681
@ TPC_ClassTemplateMember
Definition Sema.h:11679
@ TPC_FunctionTemplate
Definition Sema.h:11678
@ TPC_FriendClassTemplate
Definition Sema.h:11680
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11682
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:1458
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:1588
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:2146
bool isMainFileLoc(SourceLocation Loc) const
Determines whether the given source location is in the main file and we're in a context where we shou...
Definition Sema.cpp:964
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:7830
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:6616
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13705
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:676
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:15180
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:1830
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:1253
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:89
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:11146
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11154
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11148
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11151
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
SemaNVPTX & NVPTX()
Definition Sema.h:1513
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:917
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:2087
@ PSK_ConstSeg
Definition Sema.h:2090
@ PSK_DataSeg
Definition Sema.h:2088
@ PSK_CodeSeg
Definition Sema.h:2091
@ PSK_BSSSeg
Definition Sema.h:2089
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:631
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:338
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:6360
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:3596
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2192
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:1843
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:1365
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition Sema.h:6306
@ AbstractSynthesizedIvarType
Definition Sema.h:6313
@ AbstractVariableType
Definition Sema.h:6310
@ AbstractReturnType
Definition Sema.h:6308
@ AbstractNone
Definition Sema.h:6307
@ AbstractFieldType
Definition Sema.h:6311
@ AbstractArrayType
Definition Sema.h:6314
@ AbstractParamType
Definition Sema.h:6309
@ AbstractIvarType
Definition Sema.h:6312
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:1553
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:8450
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:8059
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:9464
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9468
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9474
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9466
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9471
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9482
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9478
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:2616
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition Sema.h:7027
SemaLoongArch & LoongArch()
Definition Sema.h:1493
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:6495
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6500
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6497
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:14104
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:2975
OpaquePtr< TemplateName > TemplateTy
Definition Sema.h:1300
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:714
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:3573
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:1750
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:15496
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:7908
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:1573
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:3519
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:13701
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:1543
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:2577
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition SemaStmt.cpp:588
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition Sema.h:11455
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:7864
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:732
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:149
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:8409
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1299
static int getPrintable(int I)
Definition Sema.h:15179
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:928
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition Sema.h:9734
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:12991
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:3869
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:15184
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:8277
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:13716
SemaARM & ARM()
Definition Sema.h:1453
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:13697
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition SemaAttr.cpp:365
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:15182
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
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:11056
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:657
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
PragmaMsStackAction
Definition Sema.h:1849
@ PSK_Push_Set
Definition Sema.h:1855
@ PSK_Reset
Definition Sema.h:1850
@ PSK_Pop_Set
Definition Sema.h:1856
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:8743
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:13790
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:3732
Exposes information about the current target.
Definition TargetInfo.h:227
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:4652
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:3528
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:8402
The base class of the type hierarchy.
Definition TypeBase.h:1866
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3682
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3577
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:3390
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition ExprCXX.h:4126
A set of unresolved declarations.
The iterator over UnresolvedSets.
Represents a C++ using-declaration.
Definition DeclCXX.h:3607
Represents C++ using-directive.
Definition DeclCXX.h:3112
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3415
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:4225
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 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:56
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:36
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:40
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:349
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:272
@ Success
Annotation was successful.
Definition Parser.h:65
CXXConstructionKind
Definition ExprCXX.h:1544
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:150
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:124
@ AS_none
Definition Specifiers.h:128
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:249
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:3769
CorrectTypoKind
Definition Sema.h:818
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
OptionalUnsigned< unsigned > UnsignedOrNone
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:5981
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
@ Deduced
The normal deduced case.
Definition TypeBase.h:1805
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:133
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:136
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:150
TypeAwareAllocationMode
Definition ExprCXX.h:2255
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:413
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:304
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:189
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:279
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:5956
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5967
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5970
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:5974
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:2249
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:174
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:5094
Holds information about the various types of exception specification.
Definition TypeBase.h:5414
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5416
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5419
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5422
Extra information about a function prototype.
Definition TypeBase.h:5442
Represents a complete lambda introducer.
Definition DeclSpec.h:2853
Contains a late templated function.
Definition Sema.h:15822
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15827
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15825
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:2062
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition Sema.h:10607
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10614
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10616
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:12099
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:12095
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:12076
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:12088
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:12085
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:12085
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:13199
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13370
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool InParameterMappingSubstitution
Whether we're substituting into the parameter mapping of a constraint.
Definition Sema.h:13327
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13343
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13362
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13338
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13330
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13356
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13324
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13346
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13353
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13201
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13293
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13211
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13220
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13239
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13290
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13247
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13254
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13297
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13265
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13303
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13230
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13309
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13306
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13312
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13227
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13235
@ SYCLKernelLaunchOverloadResolution
We are performing overload resolution for a call to a function template or variable template named 's...
Definition Sema.h:13320
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13243
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13204
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13257
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13261
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13216
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13287
@ SYCLKernelLaunchLookup
We are performing name lookup for a function template or variable template named 'sycl_kernel_launch'...
Definition Sema.h:13316
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13250
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13333
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13359
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:6944
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6845
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:6878
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6880
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6931
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6865
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:6874
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6885
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:6893
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6889
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6934
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6899
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:6860
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6907
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6937
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6903
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6850
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
Definition Sema.h:6870
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6954
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6956
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6847
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6854
FormatArgumentPassingKind ArgPassingKind
Definition Sema.h:2659
FunctionEffectDiffVector(const FunctionEffectsRef &Old, const FunctionEffectsRef &New)
Caller should short-circuit by checking for equality first.
std::optional< FunctionEffectWithCondition > Old
Definition Sema.h:15729
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:15733
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:15741
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15731
FunctionEffect::Kind EffectKind
Definition Sema.h:15726
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13546
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:14240
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:14243
bool isMoveEligible() const
Definition Sema.h:11214
bool isCopyElidable() const
Definition Sema.h:11215
const VarDecl * Candidate
Definition Sema.h:11209
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3332
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3341
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3335
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3338
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3329
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3347
SourceLocation LocStart
Definition Sema.h:7642
IdentifierInfo * IdentInfo
Definition Sema.h:7645
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12723
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.
Definition Sema.h:2353
This an attribute introduced by #pragma clang attribute.
Definition Sema.h:2121
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition Sema.h:2124
A push'd group of PragmaAttributeEntries.
Definition Sema.h:2129
SourceLocation Loc
The location of the push attribute.
Definition Sema.h:2131
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition Sema.h:2134
const IdentifierInfo * Namespace
The namespace of this push group.
Definition Sema.h:2133
SourceLocation PragmaLocation
Definition Sema.h:1840
PragmaMsStackAction Action
Definition Sema.h:1860
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition Sema.h:1973
llvm::StringRef StackSlotLabel
Definition Sema.h:1969
SourceLocation PragmaLocation
Definition Sema.h:1971
SourceLocation PragmaPushLocation
Definition Sema.h:1972
ValueType CurrentValue
Definition Sema.h:2043
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition Sema.h:2029
bool hasValue() const
Definition Sema.h:2039
SmallVector< Slot, 2 > Stack
Definition Sema.h:2041
ValueType DefaultValue
Definition Sema.h:2042
SourceLocation CurrentPragmaLocation
Definition Sema.h:2044
PragmaStack(const ValueType &Default)
Definition Sema.h:2036
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition Sema.h:1980
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition Sema.h:5155
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5149
RecursiveInstGuard(Sema &S, Decl *D, Kind Kind)
Definition Sema.h:13171
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:10504
SFINAEContextBase & operator=(const SFINAEContextBase &)=delete
SFINAEContextBase(Sema &S, SFINAETrap *Cur)
Definition Sema.h:12531
SFINAEContextBase(const SFINAEContextBase &)=delete
Abstract class used to diagnose incomplete types.
Definition Sema.h:8342
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition Sema.h:2701
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition Sema.h:2710
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.